From e832b64f002540c23d370cd33ba5f5a481c27d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20=C5=81ukasik?= Date: Fri, 15 May 2020 17:25:01 +0200 Subject: [PATCH] Zmiana na pythona --- .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 1 + .idea/modules.xml | 2 +- .idea/workspace.xml | 111 + .idea/wozek.iml | 13 + {.idea => Archiwum/.idea}/.gitignore | 0 {.idea => Archiwum/.idea}/AL-2020.iml | 0 .../.idea}/dictionaries/Pawe_ukaszewicz.xml | 0 Archiwum/.idea/misc.xml | 6 + Archiwum/.idea/modules.xml | 8 + {.idea => Archiwum/.idea}/vcs.xml | 0 README.md => Archiwum/README.md | 0 environment.md => Archiwum/environment.md | 0 {frontend => Archiwum/frontend}/img/Down.png | Bin {frontend => Archiwum/frontend}/img/Left.png | Bin {frontend => Archiwum/frontend}/img/Right.png | Bin {frontend => Archiwum/frontend}/img/Up.png | Bin {frontend => Archiwum/frontend}/index.html | 0 .../frontend/js/Archiwum2}/Agent.js | 0 .../frontend/js/Archiwum2}/Board.js | 0 .../frontend/js/Archiwum2}/Field.js | 0 .../frontend/js/Archiwum2}/script.js | 0 {frontend => Archiwum/frontend}/js/main.js | 0 {frontend => Archiwum/frontend}/styles.css | 0 __pycache__/agent.cpython-37.pyc | Bin 0 -> 1960 bytes __pycache__/board.cpython-37.pyc | Bin 0 -> 1475 bytes __pycache__/field.cpython-37.pyc | Bin 0 -> 1367 bytes __pycache__/functions.cpython-37.pyc | Bin 0 -> 2995 bytes __pycache__/settings.cpython-37.pyc | Bin 0 -> 563 bytes agent.py | 63 + board.py | 48 + field.py | 44 + functions.py | 136 + img/Down.png | Bin 0 -> 1829 bytes img/Left.png | Bin 0 -> 1775 bytes img/Right.png | Bin 0 -> 1828 bytes img/Up.png | Bin 0 -> 1815 bytes img/field.png | Bin 0 -> 685 bytes img/green.png | Bin 0 -> 2762 bytes img/path.png | Bin 0 -> 2568 bytes img/red.png | Bin 0 -> 2537 bytes img/shelf.png | Bin 0 -> 691 bytes main.py | 61 + settings.py | 9 + venv/Include/site/python3.7/pygame/_camera.h | 27 + venv/Include/site/python3.7/pygame/_pygame.h | 864 ++ venv/Include/site/python3.7/pygame/_surface.h | 31 + venv/Include/site/python3.7/pygame/bitmask.h | 146 + venv/Include/site/python3.7/pygame/camera.h | 201 + .../site/python3.7/pygame/fastevents.h | 48 + venv/Include/site/python3.7/pygame/font.h | 57 + venv/Include/site/python3.7/pygame/freetype.h | 137 + venv/Include/site/python3.7/pygame/mask.h | 25 + venv/Include/site/python3.7/pygame/mixer.h | 65 + venv/Include/site/python3.7/pygame/palette.h | 123 + .../site/python3.7/pygame/pgarrinter.h | 26 + .../site/python3.7/pygame/pgbufferproxy.h | 52 + venv/Include/site/python3.7/pygame/pgcompat.h | 195 + venv/Include/site/python3.7/pygame/pgopengl.h | 16 + venv/Include/site/python3.7/pygame/pygame.h | 34 + venv/Include/site/python3.7/pygame/scrap.h | 143 + venv/Include/site/python3.7/pygame/surface.h | 383 + venv/Lib/site-packages/easy-install.pth | 2 + .../pip-19.0.3-py3.7.egg/EGG-INFO/PKG-INFO | 73 + .../pip-19.0.3-py3.7.egg/EGG-INFO/SOURCES.txt | 391 + .../EGG-INFO/dependency_links.txt | 1 + .../EGG-INFO/entry_points.txt | 5 + .../EGG-INFO/not-zip-safe | 1 + .../EGG-INFO/top_level.txt | 1 + .../pip-19.0.3-py3.7.egg/pip/__init__.py | 1 + .../pip-19.0.3-py3.7.egg/pip/__main__.py | 19 + .../pip/_internal/__init__.py | 78 + .../pip/_internal/build_env.py | 215 + .../pip/_internal/cache.py | 224 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 341 + .../pip/_internal/cli/cmdoptions.py | 809 ++ .../pip/_internal/cli/main_parser.py | 104 + .../pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 176 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 566 ++ .../pip/_internal/commands/list.py | 301 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 186 + .../pip/_internal/configuration.py | 387 + .../pip/_internal/download.py | 971 ++ .../pip/_internal/exceptions.py | 274 + .../pip/_internal/index.py | 990 ++ .../pip/_internal/locations.py | 211 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 31 + .../pip/_internal/models/format_control.py | 73 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 163 + .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/check.py | 155 + .../pip/_internal/operations/freeze.py | 247 + .../pip/_internal/operations/prepare.py | 413 + .../pip/_internal/pep425tags.py | 381 + .../pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 77 + .../pip/_internal/req/constructors.py | 339 + .../pip/_internal/req/req_file.py | 382 + .../pip/_internal/req/req_install.py | 1021 ++ .../pip/_internal/req/req_set.py | 197 + .../pip/_internal/req/req_tracker.py | 88 + .../pip/_internal/req/req_uninstall.py | 596 ++ .../pip/_internal/resolve.py | 393 + .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/appdirs.py | 270 + .../pip/_internal/utils/compat.py | 264 + .../pip/_internal/utils/deprecation.py | 90 + .../pip/_internal/utils/encoding.py | 39 + .../pip/_internal/utils/filesystem.py | 30 + .../pip/_internal/utils/glibc.py | 93 + .../pip/_internal/utils/hashes.py | 115 + .../pip/_internal/utils/logging.py | 318 + .../pip/_internal/utils/misc.py | 1040 +++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 164 + .../pip/_internal/utils/packaging.py | 85 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 155 + .../pip/_internal/utils/typing.py | 29 + .../pip/_internal/utils/ui.py | 441 + .../pip/_internal/vcs/__init__.py | 534 ++ .../pip/_internal/vcs/bazaar.py | 114 + .../pip/_internal/vcs/git.py | 369 + .../pip/_internal/vcs/mercurial.py | 103 + .../pip/_internal/vcs/subversion.py | 200 + .../pip/_internal/wheel.py | 1095 +++ .../pip/_vendor/__init__.py | 111 + .../pip/_vendor/appdirs.py | 604 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_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 + .../pip/_vendor/certifi/cacert.pem | 4512 +++++++++ .../pip/_vendor/certifi/core.py | 20 + .../pip/_vendor/chardet/__init__.py | 39 + .../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 + .../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 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 ++ .../pip/_vendor/distlib/locators.py | 1295 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1094 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 417 + .../pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../pip/_vendor/distlib/util.py | 1756 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 988 ++ .../pip/_vendor/distro.py | 1197 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../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 + .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../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 + .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../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 + .../pip/_vendor/idna/codec.py | 118 + .../pip/_vendor/idna/compat.py | 12 + .../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 +++++++++++++++++ .../pip/_vendor/ipaddress.py | 2419 +++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../pip/_vendor/packaging/_compat.py | 31 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 296 + .../pip/_vendor/packaging/requirements.py | 138 + .../pip/_vendor/packaging/specifiers.py | 749 ++ .../pip/_vendor/packaging/utils.py | 57 + .../pip/_vendor/packaging/version.py | 420 + .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/_in_process.py | 207 + .../pip/_vendor/pep517/build.py | 108 + .../pip/_vendor/pep517/check.py | 202 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 158 + .../pip/_vendor/pep517/wrappers.py | 163 + .../pip/_vendor/pkg_resources/__init__.py | 3171 +++++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 127 + .../pip/_vendor/progress/bar.py | 94 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../pip/_vendor/pyparsing.py | 6452 +++++++++++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 341 + .../pip/_vendor/pytoml/test.py | 30 + .../pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 106 + .../pip/_vendor/requests/__init__.py | 133 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../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 ++ .../pip/_vendor/retrying.py | 267 + .../pip-19.0.3-py3.7.egg/pip/_vendor/six.py | 952 ++ .../pip/_vendor/urllib3/__init__.py | 92 + .../pip/_vendor/urllib3/_collections.py | 329 + .../pip/_vendor/urllib3/connection.py | 391 + .../pip/_vendor/urllib3/connectionpool.py | 896 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 289 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 ++ .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 156 + .../pip/_vendor/urllib3/poolmanager.py | 450 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 705 ++ .../pip/_vendor/urllib3/util/__init__.py | 54 + .../pip/_vendor/urllib3/util/connection.py | 134 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 87 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 381 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 150 + .../pip/_vendor/webencodings/__init__.py | 342 + .../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 + .../pygame-1.9.6.dist-info/INSTALLER | 1 + .../pygame-1.9.6.dist-info/METADATA | 15 + .../pygame-1.9.6.dist-info/RECORD | 496 + .../pygame-1.9.6.dist-info/WHEEL | 5 + .../pygame-1.9.6.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pygame/SDL.dll | Bin 0 -> 388096 bytes venv/Lib/site-packages/pygame/SDL_image.dll | Bin 0 -> 58880 bytes venv/Lib/site-packages/pygame/SDL_mixer.dll | Bin 0 -> 644608 bytes venv/Lib/site-packages/pygame/SDL_ttf.dll | Bin 0 -> 31232 bytes venv/Lib/site-packages/pygame/__init__.py | 402 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 8255 bytes .../_camera_opencv_highgui.cpython-37.pyc | Bin 0 -> 2607 bytes .../_camera_vidcapture.cpython-37.pyc | Bin 0 -> 4318 bytes .../__pycache__/_dummybackend.cpython-37.pyc | Bin 0 -> 1324 bytes .../__pycache__/_numpysndarray.cpython-37.pyc | Bin 0 -> 2080 bytes .../_numpysurfarray.cpython-37.pyc | Bin 0 -> 12416 bytes .../pygame/__pycache__/camera.cpython-37.pyc | Bin 0 -> 2797 bytes .../__pycache__/colordict.cpython-37.pyc | Bin 0 -> 21343 bytes .../pygame/__pycache__/compat.cpython-37.pyc | Bin 0 -> 2255 bytes .../pygame/__pycache__/cursors.cpython-37.pyc | Bin 0 -> 7904 bytes .../pygame/__pycache__/draw_py.cpython-37.pyc | Bin 0 -> 11869 bytes .../__pycache__/freetype.cpython-37.pyc | Bin 0 -> 2187 bytes .../pygame/__pycache__/ftfont.cpython-37.pyc | Bin 0 -> 6652 bytes .../pygame/__pycache__/locals.cpython-37.pyc | Bin 0 -> 393 bytes .../pygame/__pycache__/macosx.cpython-37.pyc | Bin 0 -> 872 bytes .../pygame/__pycache__/midi.cpython-37.pyc | Bin 0 -> 22834 bytes .../pygame/__pycache__/pkgdata.cpython-37.pyc | Bin 0 -> 2416 bytes .../__pycache__/sndarray.cpython-37.pyc | Bin 0 -> 3007 bytes .../pygame/__pycache__/sprite.cpython-37.pyc | Bin 0 -> 46067 bytes .../__pycache__/surfarray.cpython-37.pyc | Bin 0 -> 10213 bytes .../pygame/__pycache__/sysfont.cpython-37.pyc | Bin 0 -> 8757 bytes .../pygame/__pycache__/version.cpython-37.pyc | Bin 0 -> 1899 bytes .../pygame/_camera_opencv_highgui.py | 98 + .../pygame/_camera_vidcapture.py | 133 + .../Lib/site-packages/pygame/_dummybackend.py | 30 + .../pygame/_freetype.cp37-win32.pyd | Bin 0 -> 67072 bytes .../site-packages/pygame/_numpysndarray.py | 76 + .../site-packages/pygame/_numpysurfarray.py | 356 + .../site-packages/pygame/base.cp37-win32.pyd | Bin 0 -> 25600 bytes .../pygame/bufferproxy.cp37-win32.pyd | Bin 0 -> 15360 bytes venv/Lib/site-packages/pygame/camera.py | 146 + .../site-packages/pygame/cdrom.cp37-win32.pyd | Bin 0 -> 18432 bytes .../site-packages/pygame/color.cp37-win32.pyd | Bin 0 -> 26112 bytes venv/Lib/site-packages/pygame/colordict.py | 684 ++ venv/Lib/site-packages/pygame/compat.py | 103 + .../pygame/constants.cp37-win32.pyd | Bin 0 -> 18944 bytes venv/Lib/site-packages/pygame/cursors.py | 309 + .../pygame/display.cp37-win32.pyd | Bin 0 -> 25088 bytes .../Lib/site-packages/pygame/docs/__init__.py | 12 + .../Lib/site-packages/pygame/docs/__main__.py | 28 + .../docs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 356 bytes .../docs/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 885 bytes venv/Lib/site-packages/pygame/docs/logos.html | 44 + .../site-packages/pygame/docs/pygame_logo.gif | Bin 0 -> 25116 bytes .../pygame/docs/pygame_powered.gif | Bin 0 -> 10171 bytes .../pygame/docs/pygame_small.gif | Bin 0 -> 10286 bytes .../site-packages/pygame/docs/pygame_tiny.gif | Bin 0 -> 5485 bytes .../pygame/docs/ref/docscomments.json | 1 + .../site-packages/pygame/draw.cp37-win32.pyd | Bin 0 -> 32256 bytes venv/Lib/site-packages/pygame/draw_py.py | 539 ++ .../site-packages/pygame/event.cp37-win32.pyd | Bin 0 -> 22528 bytes .../site-packages/pygame/examples/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 174 bytes .../__pycache__/aacircle.cpython-37.pyc | Bin 0 -> 991 bytes .../__pycache__/aliens.cpython-37.pyc | Bin 0 -> 8683 bytes .../__pycache__/arraydemo.cpython-37.pyc | Bin 0 -> 2770 bytes .../__pycache__/audiocapture.cpython-37.pyc | Bin 0 -> 1455 bytes .../__pycache__/blend_fill.cpython-37.pyc | Bin 0 -> 2153 bytes .../__pycache__/blit_blends.cpython-37.pyc | Bin 0 -> 3344 bytes .../__pycache__/camera.cpython-37.pyc | Bin 0 -> 2087 bytes .../examples/__pycache__/chimp.cpython-37.pyc | Bin 0 -> 5867 bytes .../__pycache__/cursors.cpython-37.pyc | Bin 0 -> 2630 bytes .../__pycache__/dropevent.cpython-37.pyc | Bin 0 -> 1477 bytes .../__pycache__/eventlist.cpython-37.pyc | Bin 0 -> 3259 bytes .../__pycache__/fastevents.cpython-37.pyc | Bin 0 -> 2256 bytes .../examples/__pycache__/fonty.cpython-37.pyc | Bin 0 -> 2000 bytes .../__pycache__/freetype_misc.cpython-37.pyc | Bin 0 -> 2578 bytes .../__pycache__/glcube.cpython-37.pyc | Bin 0 -> 3029 bytes .../headless_no_windows_needed.cpython-37.pyc | Bin 0 -> 1404 bytes .../__pycache__/liquid.cpython-37.pyc | Bin 0 -> 1812 bytes .../examples/__pycache__/mask.cpython-37.pyc | Bin 0 -> 5376 bytes .../examples/__pycache__/midi.cpython-37.pyc | Bin 0 -> 19921 bytes .../__pycache__/moveit.cpython-37.pyc | Bin 0 -> 1991 bytes .../__pycache__/oldalien.cpython-37.pyc | Bin 0 -> 6538 bytes .../__pycache__/overlay.cpython-37.pyc | Bin 0 -> 1522 bytes .../__pycache__/pixelarray.cpython-37.pyc | Bin 0 -> 2190 bytes .../__pycache__/playmus.cpython-37.pyc | Bin 0 -> 3818 bytes .../prevent_display_stretching.cpython-37.pyc | Bin 0 -> 2162 bytes .../__pycache__/scaletest.cpython-37.pyc | Bin 0 -> 3197 bytes .../scrap_clipboard.cpython-37.pyc | Bin 0 -> 2368 bytes .../__pycache__/scroll.cpython-37.pyc | Bin 0 -> 4444 bytes .../examples/__pycache__/sound.cpython-37.pyc | Bin 0 -> 1358 bytes .../sound_array_demos.cpython-37.pyc | Bin 0 -> 4881 bytes .../examples/__pycache__/stars.cpython-37.pyc | Bin 0 -> 2569 bytes .../__pycache__/testsprite.cpython-37.pyc | Bin 0 -> 4623 bytes .../__pycache__/textinput.cpython-37.pyc | Bin 0 -> 2966 bytes .../__pycache__/vgrade.cpython-37.pyc | Bin 0 -> 3282 bytes .../examples/__pycache__/video.cpython-37.pyc | Bin 0 -> 2396 bytes .../site-packages/pygame/examples/aacircle.py | 35 + .../site-packages/pygame/examples/aliens.py | 350 + .../pygame/examples/arraydemo.py | 131 + .../pygame/examples/audiocapture.py | 58 + .../pygame/examples/blend_fill.py | 102 + .../pygame/examples/blit_blends.py | 193 + .../site-packages/pygame/examples/camera.py | 92 + .../site-packages/pygame/examples/chimp.py | 196 + .../site-packages/pygame/examples/cursors.py | 99 + .../pygame/examples/data/alien1.gif | Bin 0 -> 3826 bytes .../pygame/examples/data/alien1.jpg | Bin 0 -> 3103 bytes .../pygame/examples/data/alien1.png | Bin 0 -> 3522 bytes .../pygame/examples/data/alien2.gif | Bin 0 -> 3834 bytes .../pygame/examples/data/alien2.png | Bin 0 -> 3526 bytes .../pygame/examples/data/alien3.gif | Bin 0 -> 3829 bytes .../pygame/examples/data/alien3.png | Bin 0 -> 3518 bytes .../pygame/examples/data/arraydemo.bmp | Bin 0 -> 76854 bytes .../pygame/examples/data/asprite.bmp | Bin 0 -> 578 bytes .../pygame/examples/data/background.gif | Bin 0 -> 9133 bytes .../pygame/examples/data/blue.mpg | Bin 0 -> 6144 bytes .../pygame/examples/data/bomb.gif | Bin 0 -> 1162 bytes .../pygame/examples/data/boom.wav | Bin 0 -> 12562 bytes .../pygame/examples/data/brick.png | Bin 0 -> 170 bytes .../pygame/examples/data/car_door.wav | Bin 0 -> 3910 bytes .../pygame/examples/data/chimp.bmp | Bin 0 -> 5498 bytes .../pygame/examples/data/city.png | Bin 0 -> 143 bytes .../pygame/examples/data/danger.gif | Bin 0 -> 2761 bytes .../pygame/examples/data/explosion1.gif | Bin 0 -> 6513 bytes .../pygame/examples/data/fist.bmp | Bin 0 -> 4378 bytes .../pygame/examples/data/house_lo.mp3 | Bin 0 -> 116320 bytes .../pygame/examples/data/house_lo.ogg | Bin 0 -> 31334 bytes .../pygame/examples/data/house_lo.wav | Bin 0 -> 78464 bytes .../pygame/examples/data/liquid.bmp | Bin 0 -> 11734 bytes .../pygame/examples/data/midikeys.png | Bin 0 -> 19666 bytes .../pygame/examples/data/oldplayer.gif | Bin 0 -> 1075 bytes .../pygame/examples/data/player1.gif | Bin 0 -> 3470 bytes .../pygame/examples/data/punch.wav | Bin 0 -> 4176 bytes .../pygame/examples/data/sans.ttf | Bin 0 -> 133088 bytes .../pygame/examples/data/secosmic_lo.wav | Bin 0 -> 18700 bytes .../pygame/examples/data/shot.gif | Bin 0 -> 129 bytes .../pygame/examples/data/static.png | Bin 0 -> 1202 bytes .../pygame/examples/data/whiff.wav | Bin 0 -> 5850 bytes .../pygame/examples/data/yuv_1.pgm | 6 + .../pygame/examples/dropevent.py | 62 + .../pygame/examples/eventlist.py | 123 + .../pygame/examples/fastevents.py | 130 + .../site-packages/pygame/examples/fonty.py | 101 + .../pygame/examples/freetype_misc.py | 103 + .../site-packages/pygame/examples/glcube.py | 129 + .../examples/headless_no_windows_needed.py | 55 + .../site-packages/pygame/examples/liquid.py | 85 + .../macosx/__pycache__/macfont.cpython-37.pyc | Bin 0 -> 5225 bytes .../MainMenu.nib/JavaCompiling.plist | 8 + .../_MainMenu_EOArchive_English.java | 68 + .../English.lproj/MainMenu.nib/classes.nib | 13 + .../English.lproj/MainMenu.nib/info.nib | 21 + .../MainMenu.nib/keyedobjects.nib | Bin 0 -> 9442 bytes .../English.lproj/aliens.icns | Bin 0 -> 7236 bytes .../macosx/aliens_app_example/README.txt | 17 + .../__pycache__/aliens.cpython-37.pyc | Bin 0 -> 8283 bytes .../__pycache__/setup.cpython-37.pyc | Bin 0 -> 708 bytes .../macosx/aliens_app_example/aliens.py | 325 + .../macosx/aliens_app_example/setup.py | 28 + .../pygame/examples/macosx/macfont.py | 136 + .../Lib/site-packages/pygame/examples/mask.py | 176 + .../Lib/site-packages/pygame/examples/midi.py | 822 ++ .../site-packages/pygame/examples/moveit.py | 73 + .../site-packages/pygame/examples/oldalien.py | 237 + .../site-packages/pygame/examples/overlay.py | 62 + .../pygame/examples/pixelarray.py | 123 + .../site-packages/pygame/examples/playmus.py | 140 + .../examples/prevent_display_stretching.py | 89 + .../pygame/examples/scaletest.py | 140 + .../pygame/examples/scrap_clipboard.py | 87 + .../site-packages/pygame/examples/scroll.py | 195 + .../site-packages/pygame/examples/sound.py | 57 + .../pygame/examples/sound_array_demos.py | 262 + .../site-packages/pygame/examples/stars.py | 95 + .../pygame/examples/testsprite.py | 267 + .../pygame/examples/textinput.py | 151 + .../site-packages/pygame/examples/vgrade.py | 103 + .../site-packages/pygame/examples/video.py | 100 + .../pygame/fastevent.cp37-win32.pyd | Bin 0 -> 15872 bytes .../site-packages/pygame/font.cp37-win32.pyd | Bin 0 -> 19456 bytes .../Lib/site-packages/pygame/freesansbold.ttf | Bin 0 -> 98600 bytes venv/Lib/site-packages/pygame/freetype.py | 45 + venv/Lib/site-packages/pygame/ftfont.py | 187 + .../pygame/gfxdraw.cp37-win32.pyd | Bin 0 -> 50176 bytes .../site-packages/pygame/image.cp37-win32.pyd | Bin 0 -> 24576 bytes .../pygame/imageext.cp37-win32.pyd | Bin 0 -> 16384 bytes .../pygame/joystick.cp37-win32.pyd | Bin 0 -> 15872 bytes .../site-packages/pygame/key.cp37-win32.pyd | Bin 0 -> 12288 bytes .../site-packages/pygame/libfreetype-6.dll | Bin 0 -> 604160 bytes .../site-packages/pygame/libgcc_s_sjlj-1.dll | Bin 0 -> 99840 bytes venv/Lib/site-packages/pygame/libjpeg-8.dll | Bin 0 -> 250368 bytes venv/Lib/site-packages/pygame/libmpg123-0.dll | Bin 0 -> 322560 bytes venv/Lib/site-packages/pygame/libogg-0.dll | Bin 0 -> 32768 bytes venv/Lib/site-packages/pygame/libpng16-16.dll | Bin 0 -> 239104 bytes venv/Lib/site-packages/pygame/libstdc++-6.dll | Bin 0 -> 937472 bytes venv/Lib/site-packages/pygame/libtiff-5.dll | Bin 0 -> 489472 bytes venv/Lib/site-packages/pygame/libvorbis-0.dll | Bin 0 -> 174592 bytes .../site-packages/pygame/libvorbisfile-3.dll | Bin 0 -> 40448 bytes venv/Lib/site-packages/pygame/libwebp-5.dll | Bin 0 -> 452096 bytes venv/Lib/site-packages/pygame/locals.py | 30 + venv/Lib/site-packages/pygame/macosx.py | 22 + .../site-packages/pygame/mask.cp37-win32.pyd | Bin 0 -> 38400 bytes .../site-packages/pygame/math.cp37-win32.pyd | Bin 0 -> 53248 bytes venv/Lib/site-packages/pygame/midi.py | 728 ++ .../site-packages/pygame/mixer.cp37-win32.pyd | Bin 0 -> 29696 bytes .../pygame/mixer_music.cp37-win32.pyd | Bin 0 -> 15872 bytes .../site-packages/pygame/mouse.cp37-win32.pyd | Bin 0 -> 12800 bytes .../pygame/newbuffer.cp37-win32.pyd | Bin 0 -> 17408 bytes .../pygame/overlay.cp37-win32.pyd | Bin 0 -> 11264 bytes .../pygame/pixelarray.cp37-win32.pyd | Bin 0 -> 34304 bytes .../pygame/pixelcopy.cp37-win32.pyd | Bin 0 -> 23040 bytes venv/Lib/site-packages/pygame/pkgdata.py | 67 + venv/Lib/site-packages/pygame/portmidi.dll | Bin 0 -> 33280 bytes venv/Lib/site-packages/pygame/pygame.ico | Bin 0 -> 145516 bytes venv/Lib/site-packages/pygame/pygame_icon.bmp | Bin 0 -> 630 bytes .../Lib/site-packages/pygame/pygame_icon.icns | Bin 0 -> 53627 bytes venv/Lib/site-packages/pygame/pygame_icon.svg | 259 + .../Lib/site-packages/pygame/pygame_icon.tiff | Bin 0 -> 61604 bytes .../site-packages/pygame/pypm.cp37-win32.pyd | Bin 0 -> 70144 bytes .../site-packages/pygame/rect.cp37-win32.pyd | Bin 0 -> 27648 bytes .../pygame/rwobject.cp37-win32.pyd | Bin 0 -> 14848 bytes .../site-packages/pygame/scrap.cp37-win32.pyd | Bin 0 -> 15872 bytes venv/Lib/site-packages/pygame/sndarray.py | 103 + venv/Lib/site-packages/pygame/sprite.py | 1601 ++++ .../pygame/surface.cp37-win32.pyd | Bin 0 -> 233472 bytes venv/Lib/site-packages/pygame/surfarray.py | 290 + .../pygame/surflock.cp37-win32.pyd | Bin 0 -> 10752 bytes venv/Lib/site-packages/pygame/sysfont.py | 411 + .../site-packages/pygame/tests/__init__.py | 40 + .../site-packages/pygame/tests/__main__.py | 133 + .../tests/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1351 bytes .../tests/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 2733 bytes .../__pycache__/base_test.cpython-37.pyc | Bin 0 -> 16961 bytes .../__pycache__/blit_test.cpython-37.pyc | Bin 0 -> 4204 bytes .../bufferproxy_test.cpython-37.pyc | Bin 0 -> 12868 bytes .../__pycache__/camera_test.cpython-37.pyc | Bin 0 -> 444 bytes .../__pycache__/cdrom_tags.cpython-37.pyc | Bin 0 -> 214 bytes .../__pycache__/cdrom_test.cpython-37.pyc | Bin 0 -> 6910 bytes .../__pycache__/color_test.cpython-37.pyc | Bin 0 -> 31632 bytes .../__pycache__/compat_test.cpython-37.pyc | Bin 0 -> 4206 bytes .../__pycache__/constants_test.cpython-37.pyc | Bin 0 -> 1833 bytes .../__pycache__/cursors_test.cpython-37.pyc | Bin 0 -> 1268 bytes .../__pycache__/display_test.cpython-37.pyc | Bin 0 -> 6505 bytes .../__pycache__/draw_test.cpython-37.pyc | Bin 0 -> 41041 bytes .../__pycache__/event_test.cpython-37.pyc | Bin 0 -> 11082 bytes .../__pycache__/fastevent_tags.cpython-37.pyc | Bin 0 -> 188 bytes .../__pycache__/fastevent_test.cpython-37.pyc | Bin 0 -> 3426 bytes .../__pycache__/font_tags.cpython-37.pyc | Bin 0 -> 183 bytes .../__pycache__/font_test.cpython-37.pyc | Bin 0 -> 15949 bytes .../__pycache__/freetype_tags.cpython-37.pyc | Bin 0 -> 365 bytes .../__pycache__/freetype_test.cpython-37.pyc | Bin 0 -> 35392 bytes .../__pycache__/ftfont_tags.cpython-37.pyc | Bin 0 -> 361 bytes .../__pycache__/ftfont_test.cpython-37.pyc | Bin 0 -> 575 bytes .../__pycache__/gfxdraw_test.cpython-37.pyc | Bin 0 -> 22828 bytes ...image__save_gl_surface_test.cpython-37.pyc | Bin 0 -> 1326 bytes .../__pycache__/image_tags.cpython-37.pyc | Bin 0 -> 306 bytes .../__pycache__/image_test.cpython-37.pyc | Bin 0 -> 14430 bytes .../__pycache__/imageext_tags.cpython-37.pyc | Bin 0 -> 312 bytes .../__pycache__/imageext_test.cpython-37.pyc | Bin 0 -> 4006 bytes .../__pycache__/joystick_test.cpython-37.pyc | Bin 0 -> 1306 bytes .../tests/__pycache__/key_test.cpython-37.pyc | Bin 0 -> 2318 bytes .../__pycache__/mask_test.cpython-37.pyc | Bin 0 -> 57839 bytes .../__pycache__/math_test.cpython-37.pyc | Bin 0 -> 64416 bytes .../__pycache__/midi_tags.cpython-37.pyc | Bin 0 -> 198 bytes .../__pycache__/midi_test.cpython-37.pyc | Bin 0 -> 11515 bytes .../mixer_music_tags.cpython-37.pyc | Bin 0 -> 318 bytes .../mixer_music_test.cpython-37.pyc | Bin 0 -> 4907 bytes .../__pycache__/mixer_tags.cpython-37.pyc | Bin 0 -> 306 bytes .../__pycache__/mixer_test.cpython-37.pyc | Bin 0 -> 25255 bytes .../__pycache__/mouse_test.cpython-37.pyc | Bin 0 -> 1644 bytes .../__pycache__/overlay_tags.cpython-37.pyc | Bin 0 -> 201 bytes .../__pycache__/overlay_test.cpython-37.pyc | Bin 0 -> 878 bytes .../pixelarray_test.cpython-37.pyc | Bin 0 -> 36578 bytes .../__pycache__/pixelcopy_test.cpython-37.pyc | Bin 0 -> 18891 bytes .../__pycache__/rect_test.cpython-37.pyc | Bin 0 -> 24764 bytes .../__pycache__/rwobject_test.cpython-37.pyc | Bin 0 -> 4634 bytes .../__pycache__/scrap_tags.cpython-37.pyc | Bin 0 -> 469 bytes .../__pycache__/scrap_test.cpython-37.pyc | Bin 0 -> 9352 bytes .../__pycache__/sndarray_tags.cpython-37.pyc | Bin 0 -> 371 bytes .../__pycache__/sndarray_test.cpython-37.pyc | Bin 0 -> 5781 bytes .../__pycache__/sprite_test.cpython-37.pyc | Bin 0 -> 33782 bytes .../__pycache__/surface_test.cpython-37.pyc | Bin 0 -> 66765 bytes .../__pycache__/surfarray_tags.cpython-37.pyc | Bin 0 -> 412 bytes .../__pycache__/surfarray_test.cpython-37.pyc | Bin 0 -> 18171 bytes .../__pycache__/surflock_test.cpython-37.pyc | Bin 0 -> 2840 bytes .../__pycache__/sysfont_test.cpython-37.pyc | Bin 0 -> 1654 bytes .../__pycache__/test_test_.cpython-37.pyc | Bin 0 -> 181 bytes .../__pycache__/threads_test.cpython-37.pyc | Bin 0 -> 5621 bytes .../__pycache__/time_test.cpython-37.pyc | Bin 0 -> 2178 bytes .../__pycache__/touch_tags.cpython-37.pyc | Bin 0 -> 199 bytes .../__pycache__/touch_test.cpython-37.pyc | Bin 0 -> 1971 bytes .../__pycache__/transform_test.cpython-37.pyc | Bin 0 -> 22142 bytes .../__pycache__/version_test.cpython-37.pyc | Bin 0 -> 1368 bytes .../site-packages/pygame/tests/base_test.py | 638 ++ .../site-packages/pygame/tests/blit_test.py | 159 + .../pygame/tests/bufferproxy_test.py | 483 + .../site-packages/pygame/tests/camera_test.py | 9 + .../site-packages/pygame/tests/cdrom_tags.py | 1 + .../site-packages/pygame/tests/cdrom_test.py | 318 + .../site-packages/pygame/tests/color_test.py | 1027 +++ .../site-packages/pygame/tests/compat_test.py | 87 + .../pygame/tests/constants_test.py | 51 + .../pygame/tests/cursors_test.py | 63 + .../pygame/tests/display_test.py | 440 + .../site-packages/pygame/tests/draw_test.py | 1294 +++ .../site-packages/pygame/tests/event_test.py | 340 + .../pygame/tests/fastevent_tags.py | 1 + .../pygame/tests/fastevent_test.py | 150 + .../tests/fixtures/fonts/A_PyGameMono-8.png | Bin 0 -> 92 bytes .../fixtures/fonts/PyGameMono-18-100dpi.bdf | 165 + .../fixtures/fonts/PyGameMono-18-75dpi.bdf | 143 + .../tests/fixtures/fonts/PyGameMono-8.bdf | 103 + .../tests/fixtures/fonts/PyGameMono.otf | Bin 0 -> 3128 bytes .../tests/fixtures/fonts/test_fixed.otf | Bin 0 -> 58464 bytes .../pygame/tests/fixtures/fonts/test_sans.ttf | Bin 0 -> 133088 bytes .../fixtures/fonts/u13079_PyGameMono-8.png | Bin 0 -> 89 bytes .../fixtures/xbm_cursors/white_sizing.xbm | 8 + .../xbm_cursors/white_sizing_mask.xbm | 8 + .../site-packages/pygame/tests/font_tags.py | 1 + .../site-packages/pygame/tests/font_test.py | 546 ++ .../pygame/tests/freetype_tags.py | 12 + .../pygame/tests/freetype_test.py | 1554 ++++ .../site-packages/pygame/tests/ftfont_tags.py | 12 + .../site-packages/pygame/tests/ftfont_test.py | 20 + .../pygame/tests/gfxdraw_test.py | 817 ++ .../tests/image__save_gl_surface_test.py | 44 + .../site-packages/pygame/tests/image_tags.py | 7 + .../site-packages/pygame/tests/image_test.py | 527 ++ .../pygame/tests/imageext_tags.py | 8 + .../pygame/tests/imageext_test.py | 90 + .../pygame/tests/joystick_test.py | 91 + .../site-packages/pygame/tests/key_test.py | 68 + .../site-packages/pygame/tests/mask_test.py | 2050 ++++ .../site-packages/pygame/tests/math_test.py | 1612 ++++ .../site-packages/pygame/tests/midi_tags.py | 1 + .../site-packages/pygame/tests/midi_test.py | 385 + .../pygame/tests/mixer_music_tags.py | 7 + .../pygame/tests/mixer_music_test.py | 259 + .../site-packages/pygame/tests/mixer_tags.py | 7 + .../site-packages/pygame/tests/mixer_test.py | 1029 +++ .../site-packages/pygame/tests/mouse_test.py | 150 + .../pygame/tests/overlay_tags.py | 2 + .../pygame/tests/overlay_test.py | 36 + .../pygame/tests/pixelarray_test.py | 1420 +++ .../pygame/tests/pixelcopy_test.py | 653 ++ .../site-packages/pygame/tests/rect_test.py | 784 ++ .../pygame/tests/run_tests__tests/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 188 bytes .../run_tests__test.cpython-37.pyc | Bin 0 -> 3351 bytes .../tests/run_tests__tests/all_ok/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 195 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1615 bytes .../__pycache__/fake_3_test.cpython-37.pyc | Bin 0 -> 1615 bytes .../__pycache__/fake_4_test.cpython-37.pyc | Bin 0 -> 1615 bytes .../__pycache__/fake_5_test.cpython-37.pyc | Bin 0 -> 1615 bytes .../__pycache__/fake_6_test.cpython-37.pyc | Bin 0 -> 1615 bytes ...rtions__ret_code_of_1__test.cpython-37.pyc | Bin 0 -> 1553 bytes .../zero_tests_test.cpython-37.pyc | Bin 0 -> 747 bytes .../run_tests__tests/all_ok/fake_2_test.py | 39 + .../run_tests__tests/all_ok/fake_3_test.py | 39 + .../run_tests__tests/all_ok/fake_4_test.py | 39 + .../run_tests__tests/all_ok/fake_5_test.py | 39 + .../run_tests__tests/all_ok/fake_6_test.py | 39 + .../no_assertions__ret_code_of_1__test.py | 38 + .../all_ok/zero_tests_test.py | 22 + .../run_tests__tests/everything/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 199 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1619 bytes .../incomplete_todo_test.cpython-37.pyc | Bin 0 -> 1648 bytes .../__pycache__/magic_tag_test.cpython-37.pyc | Bin 0 -> 1500 bytes .../__pycache__/sleep_test.cpython-37.pyc | Bin 0 -> 1000 bytes .../everything/fake_2_test.py | 39 + .../everything/incomplete_todo_test.py | 39 + .../everything/magic_tag_test.py | 38 + .../run_tests__tests/everything/sleep_test.py | 29 + .../run_tests__tests/exclude/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 196 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1616 bytes .../invisible_tag_test.cpython-37.pyc | Bin 0 -> 1652 bytes .../__pycache__/magic_tag_test.cpython-37.pyc | Bin 0 -> 1497 bytes .../run_tests__tests/exclude/fake_2_test.py | 39 + .../exclude/invisible_tag_test.py | 41 + .../exclude/magic_tag_test.py | 38 + .../run_tests__tests/failures1/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 198 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1618 bytes .../__pycache__/fake_3_test.cpython-37.pyc | Bin 0 -> 1618 bytes .../__pycache__/fake_4_test.cpython-37.pyc | Bin 0 -> 1645 bytes .../run_tests__tests/failures1/fake_2_test.py | 39 + .../run_tests__tests/failures1/fake_3_test.py | 39 + .../run_tests__tests/failures1/fake_4_test.py | 41 + .../run_tests__tests/incomplete/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 199 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1634 bytes .../__pycache__/fake_3_test.cpython-37.pyc | Bin 0 -> 1619 bytes .../incomplete/fake_2_test.py | 39 + .../incomplete/fake_3_test.py | 39 + .../incomplete_todo/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1644 bytes .../__pycache__/fake_3_test.cpython-37.pyc | Bin 0 -> 1624 bytes .../incomplete_todo/fake_2_test.py | 39 + .../incomplete_todo/fake_3_test.py | 39 + .../infinite_loop/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 202 bytes .../__pycache__/fake_1_test.cpython-37.pyc | Bin 0 -> 1617 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1622 bytes .../infinite_loop/fake_1_test.py | 40 + .../infinite_loop/fake_2_test.py | 39 + .../run_tests__tests/print_stderr/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 201 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/fake_3_test.cpython-37.pyc | Bin 0 -> 1684 bytes .../__pycache__/fake_4_test.cpython-37.pyc | Bin 0 -> 1648 bytes .../print_stderr/fake_2_test.py | 39 + .../print_stderr/fake_3_test.py | 40 + .../print_stderr/fake_4_test.py | 41 + .../run_tests__tests/print_stdout/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 201 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/fake_3_test.cpython-37.pyc | Bin 0 -> 1743 bytes .../__pycache__/fake_4_test.cpython-37.pyc | Bin 0 -> 1648 bytes .../print_stdout/fake_2_test.py | 39 + .../print_stdout/fake_3_test.py | 41 + .../print_stdout/fake_4_test.py | 41 + .../tests/run_tests__tests/run_tests__test.py | 131 + .../run_tests__tests/timeout/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 196 bytes .../__pycache__/fake_2_test.cpython-37.pyc | Bin 0 -> 1616 bytes .../__pycache__/sleep_test.cpython-37.pyc | Bin 0 -> 997 bytes .../run_tests__tests/timeout/fake_2_test.py | 39 + .../run_tests__tests/timeout/sleep_test.py | 30 + .../pygame/tests/rwobject_test.py | 117 + .../site-packages/pygame/tests/scrap_tags.py | 24 + .../site-packages/pygame/tests/scrap_test.py | 290 + .../pygame/tests/sndarray_tags.py | 12 + .../pygame/tests/sndarray_test.py | 174 + .../site-packages/pygame/tests/sprite_test.py | 1248 +++ .../pygame/tests/surface_test.py | 2538 +++++ .../pygame/tests/surfarray_tags.py | 16 + .../pygame/tests/surfarray_test.py | 667 ++ .../pygame/tests/surflock_test.py | 143 + .../pygame/tests/sysfont_test.py | 30 + .../site-packages/pygame/tests/test_test_.py | 3 + .../pygame/tests/test_utils/__init__.py | 209 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 6650 bytes .../__pycache__/arrinter.cpython-37.pyc | Bin 0 -> 13240 bytes .../__pycache__/async_sub.cpython-37.pyc | Bin 0 -> 7254 bytes .../__pycache__/buftools.cpython-37.pyc | Bin 0 -> 17275 bytes .../__pycache__/endian.cpython-37.pyc | Bin 0 -> 668 bytes .../test_utils/__pycache__/png.cpython-37.pyc | Bin 0 -> 123307 bytes .../__pycache__/run_tests.cpython-37.pyc | Bin 0 -> 8913 bytes .../__pycache__/test_machinery.cpython-37.pyc | Bin 0 -> 2802 bytes .../__pycache__/test_runner.cpython-37.pyc | Bin 0 -> 5433 bytes .../pygame/tests/test_utils/arrinter.py | 398 + .../pygame/tests/test_utils/async_sub.py | 272 + .../pygame/tests/test_utils/buftools.py | 555 ++ .../pygame/tests/test_utils/endian.py | 18 + .../pygame/tests/test_utils/png.py | 3671 ++++++++ .../pygame/tests/test_utils/run_tests.py | 344 + .../pygame/tests/test_utils/test_machinery.py | 80 + .../pygame/tests/test_utils/test_runner.py | 234 + .../pygame/tests/threads_test.py | 176 + .../site-packages/pygame/tests/time_test.py | 204 + .../site-packages/pygame/tests/touch_tags.py | 2 + .../site-packages/pygame/tests/touch_test.py | 44 + .../pygame/tests/transform_test.py | 1096 +++ .../pygame/tests/version_test.py | 36 + .../site-packages/pygame/threads/Py25Queue.py | 216 + .../site-packages/pygame/threads/__init__.py | 310 + .../__pycache__/Py25Queue.cpython-37.pyc | Bin 0 -> 6875 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 6735 bytes .../site-packages/pygame/time.cp37-win32.pyd | Bin 0 -> 13824 bytes .../pygame/transform.cp37-win32.pyd | Bin 0 -> 43520 bytes venv/Lib/site-packages/pygame/version.py | 45 + venv/Lib/site-packages/pygame/zlib1.dll | Bin 0 -> 99328 bytes .../site-packages/setuptools-40.8.0-py3.7.egg | Bin 0 -> 571910 bytes venv/Lib/site-packages/setuptools.pth | 1 + venv/Scripts/Activate.ps1 | 51 + venv/Scripts/activate | 76 + venv/Scripts/activate.bat | 45 + venv/Scripts/deactivate.bat | 21 + venv/Scripts/easy_install-3.7-script.py | 12 + venv/Scripts/easy_install-3.7.exe | Bin 0 -> 65536 bytes venv/Scripts/easy_install-3.7.exe.manifest | 15 + venv/Scripts/easy_install-script.py | 12 + venv/Scripts/easy_install.exe | Bin 0 -> 65536 bytes venv/Scripts/easy_install.exe.manifest | 15 + venv/Scripts/pip-script.py | 12 + venv/Scripts/pip.exe | Bin 0 -> 65536 bytes venv/Scripts/pip.exe.manifest | 15 + venv/Scripts/pip3-script.py | 12 + venv/Scripts/pip3.7-script.py | 12 + venv/Scripts/pip3.7.exe | Bin 0 -> 65536 bytes venv/Scripts/pip3.7.exe.manifest | 15 + venv/Scripts/pip3.exe | Bin 0 -> 65536 bytes venv/Scripts/pip3.exe.manifest | 15 + venv/Scripts/python.exe | Bin 0 -> 415248 bytes venv/Scripts/pythonw.exe | Bin 0 -> 414736 bytes venv/pyvenv.cfg | 3 + 879 files changed, 155033 insertions(+), 1 deletion(-) create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/workspace.xml create mode 100644 .idea/wozek.iml rename {.idea => Archiwum/.idea}/.gitignore (100%) rename {.idea => Archiwum/.idea}/AL-2020.iml (100%) rename {.idea => Archiwum/.idea}/dictionaries/Pawe_ukaszewicz.xml (100%) create mode 100644 Archiwum/.idea/misc.xml create mode 100644 Archiwum/.idea/modules.xml rename {.idea => Archiwum/.idea}/vcs.xml (100%) rename README.md => Archiwum/README.md (100%) rename environment.md => Archiwum/environment.md (100%) rename {frontend => Archiwum/frontend}/img/Down.png (100%) rename {frontend => Archiwum/frontend}/img/Left.png (100%) rename {frontend => Archiwum/frontend}/img/Right.png (100%) rename {frontend => Archiwum/frontend}/img/Up.png (100%) rename {frontend => Archiwum/frontend}/index.html (100%) rename {frontend/js/Archiwum => Archiwum/frontend/js/Archiwum2}/Agent.js (100%) rename {frontend/js/Archiwum => Archiwum/frontend/js/Archiwum2}/Board.js (100%) rename {frontend/js/Archiwum => Archiwum/frontend/js/Archiwum2}/Field.js (100%) rename {frontend/js/Archiwum => Archiwum/frontend/js/Archiwum2}/script.js (100%) rename {frontend => Archiwum/frontend}/js/main.js (100%) rename {frontend => Archiwum/frontend}/styles.css (100%) create mode 100644 __pycache__/agent.cpython-37.pyc create mode 100644 __pycache__/board.cpython-37.pyc create mode 100644 __pycache__/field.cpython-37.pyc create mode 100644 __pycache__/functions.cpython-37.pyc create mode 100644 __pycache__/settings.cpython-37.pyc create mode 100644 agent.py create mode 100644 board.py create mode 100644 field.py create mode 100644 functions.py create mode 100644 img/Down.png create mode 100644 img/Left.png create mode 100644 img/Right.png create mode 100644 img/Up.png create mode 100644 img/field.png create mode 100644 img/green.png create mode 100644 img/path.png create mode 100644 img/red.png create mode 100644 img/shelf.png create mode 100644 main.py create mode 100644 settings.py create mode 100644 venv/Include/site/python3.7/pygame/_camera.h create mode 100644 venv/Include/site/python3.7/pygame/_pygame.h create mode 100644 venv/Include/site/python3.7/pygame/_surface.h create mode 100644 venv/Include/site/python3.7/pygame/bitmask.h create mode 100644 venv/Include/site/python3.7/pygame/camera.h create mode 100644 venv/Include/site/python3.7/pygame/fastevents.h create mode 100644 venv/Include/site/python3.7/pygame/font.h create mode 100644 venv/Include/site/python3.7/pygame/freetype.h create mode 100644 venv/Include/site/python3.7/pygame/mask.h create mode 100644 venv/Include/site/python3.7/pygame/mixer.h create mode 100644 venv/Include/site/python3.7/pygame/palette.h create mode 100644 venv/Include/site/python3.7/pygame/pgarrinter.h create mode 100644 venv/Include/site/python3.7/pygame/pgbufferproxy.h create mode 100644 venv/Include/site/python3.7/pygame/pgcompat.h create mode 100644 venv/Include/site/python3.7/pygame/pgopengl.h create mode 100644 venv/Include/site/python3.7/pygame/pygame.h create mode 100644 venv/Include/site/python3.7/pygame/scrap.h create mode 100644 venv/Include/site/python3.7/pygame/surface.h create mode 100644 venv/Lib/site-packages/easy-install.pth create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/PKG-INFO create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/SOURCES.txt create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/dependency_links.txt create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/entry_points.txt create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/not-zip-safe create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/top_level.txt create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__main__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/build_env.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cache.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/autocompletion.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/base_command.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/cmdoptions.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/main_parser.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/parser.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/status_codes.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/check.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/completion.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/configuration.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/download.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/freeze.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/hash.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/help.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/install.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/list.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/search.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/show.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/uninstall.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/wheel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/configuration.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/download.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/exceptions.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/index.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/locations.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/candidate.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/format_control.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/index.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/link.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/check.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/freeze.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/prepare.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pep425tags.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pyproject.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/constructors.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_file.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_install.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_set.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_tracker.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_uninstall.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/resolve.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/appdirs.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/deprecation.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/encoding.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/filesystem.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/glibc.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/hashes.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/logging.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/misc.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/models.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/outdated.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/packaging.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/setuptools_build.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/temp_dir.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/typing.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/ui.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/bazaar.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/git.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/mercurial.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/subversion.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/wheel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/appdirs.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__main__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/cacert.pem create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/core.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5freq.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5prober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/chardistribution.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/chardetect.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/codingstatemachine.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cp949prober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/enums.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escsm.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/eucjpprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrfreq.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwfreq.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312freq.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312prober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/hebrewprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jisfreq.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jpcntx.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langgreekmodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langthaimodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langturkishmodel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/latin1prober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcssm.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sjisprober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/universaldetector.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/utf8prober.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/version.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansi.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansitowin32.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/initialise.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/win32.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/winterm.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/misc.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/shutil.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/database.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/index.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/locators.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/manifest.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/markers.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/metadata.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/resources.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/scripts.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/t32.exe create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/t64.exe create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/util.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/version.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/w32.exe create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/w64.exe create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/wheel.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distro.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_ihatexml.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_inputstream.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_tokenizer.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/py.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_utils.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/constants.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/base.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/lint.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/html5parser.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/serializer.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/codec.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/core.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/idnadata.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/intranges.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/package_data.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/uts46data.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/ipaddress.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/linklockfile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/pidlockfile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/_version.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/exceptions.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/fallback.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/_in_process.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/build.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/check.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/colorlog.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/envbuild.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/wrappers.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/py31compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/bar.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/counter.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/helpers.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/spinner.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/core.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/parser.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/test.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/utils.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/writer.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__version__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/_internal_utils.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/adapters.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/api.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/auth.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/certs.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/compat.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/cookies.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/exceptions.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/help.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/hooks.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/models.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/packages.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/sessions.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/status_codes.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/structures.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/utils.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/retrying.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/six.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/_collections.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connection.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connectionpool.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/socks.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/exceptions.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/fields.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/filepost.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/six.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/poolmanager.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/request.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/response.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/connection.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/queue.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/request.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/response.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/retry.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/ssl_.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/timeout.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/url.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/wait.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/__init__.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/labels.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/mklabels.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/tests.py create mode 100644 venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/x_user_defined.py create mode 100644 venv/Lib/site-packages/pygame-1.9.6.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pygame-1.9.6.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pygame-1.9.6.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pygame-1.9.6.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pygame-1.9.6.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pygame/SDL.dll create mode 100644 venv/Lib/site-packages/pygame/SDL_image.dll create mode 100644 venv/Lib/site-packages/pygame/SDL_mixer.dll create mode 100644 venv/Lib/site-packages/pygame/SDL_ttf.dll create mode 100644 venv/Lib/site-packages/pygame/__init__.py create mode 100644 venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/_camera_opencv_highgui.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/_dummybackend.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/_numpysndarray.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/_numpysurfarray.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/camera.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/locals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/midi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/_camera_opencv_highgui.py create mode 100644 venv/Lib/site-packages/pygame/_camera_vidcapture.py create mode 100644 venv/Lib/site-packages/pygame/_dummybackend.py create mode 100644 venv/Lib/site-packages/pygame/_freetype.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/_numpysndarray.py create mode 100644 venv/Lib/site-packages/pygame/_numpysurfarray.py create mode 100644 venv/Lib/site-packages/pygame/base.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/bufferproxy.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/camera.py create mode 100644 venv/Lib/site-packages/pygame/cdrom.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/color.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/colordict.py create mode 100644 venv/Lib/site-packages/pygame/compat.py create mode 100644 venv/Lib/site-packages/pygame/constants.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/cursors.py create mode 100644 venv/Lib/site-packages/pygame/display.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/docs/__init__.py create mode 100644 venv/Lib/site-packages/pygame/docs/__main__.py create mode 100644 venv/Lib/site-packages/pygame/docs/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/docs/logos.html create mode 100644 venv/Lib/site-packages/pygame/docs/pygame_logo.gif create mode 100644 venv/Lib/site-packages/pygame/docs/pygame_powered.gif create mode 100644 venv/Lib/site-packages/pygame/docs/pygame_small.gif create mode 100644 venv/Lib/site-packages/pygame/docs/pygame_tiny.gif create mode 100644 venv/Lib/site-packages/pygame/docs/ref/docscomments.json create mode 100644 venv/Lib/site-packages/pygame/draw.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/draw_py.py create mode 100644 venv/Lib/site-packages/pygame/event.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/examples/__init__.py create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/aacircle.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/aliens.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/arraydemo.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/audiocapture.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/blend_fill.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/blit_blends.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/camera.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/chimp.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/cursors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/dropevent.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/eventlist.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/fastevents.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/fonty.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/freetype_misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/glcube.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/headless_no_windows_needed.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/liquid.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/mask.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/midi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/moveit.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/oldalien.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/overlay.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/pixelarray.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/playmus.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/prevent_display_stretching.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/scaletest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/scrap_clipboard.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/scroll.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/sound.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/sound_array_demos.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/stars.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/testsprite.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/textinput.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/vgrade.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/video.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/aacircle.py create mode 100644 venv/Lib/site-packages/pygame/examples/aliens.py create mode 100644 venv/Lib/site-packages/pygame/examples/arraydemo.py create mode 100644 venv/Lib/site-packages/pygame/examples/audiocapture.py create mode 100644 venv/Lib/site-packages/pygame/examples/blend_fill.py create mode 100644 venv/Lib/site-packages/pygame/examples/blit_blends.py create mode 100644 venv/Lib/site-packages/pygame/examples/camera.py create mode 100644 venv/Lib/site-packages/pygame/examples/chimp.py create mode 100644 venv/Lib/site-packages/pygame/examples/cursors.py create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien1.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien1.jpg create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien1.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien2.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien2.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien3.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/alien3.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/arraydemo.bmp create mode 100644 venv/Lib/site-packages/pygame/examples/data/asprite.bmp create mode 100644 venv/Lib/site-packages/pygame/examples/data/background.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/blue.mpg create mode 100644 venv/Lib/site-packages/pygame/examples/data/bomb.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/boom.wav create mode 100644 venv/Lib/site-packages/pygame/examples/data/brick.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/car_door.wav create mode 100644 venv/Lib/site-packages/pygame/examples/data/chimp.bmp create mode 100644 venv/Lib/site-packages/pygame/examples/data/city.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/danger.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/explosion1.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/fist.bmp create mode 100644 venv/Lib/site-packages/pygame/examples/data/house_lo.mp3 create mode 100644 venv/Lib/site-packages/pygame/examples/data/house_lo.ogg create mode 100644 venv/Lib/site-packages/pygame/examples/data/house_lo.wav create mode 100644 venv/Lib/site-packages/pygame/examples/data/liquid.bmp create mode 100644 venv/Lib/site-packages/pygame/examples/data/midikeys.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/oldplayer.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/player1.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/punch.wav create mode 100644 venv/Lib/site-packages/pygame/examples/data/sans.ttf create mode 100644 venv/Lib/site-packages/pygame/examples/data/secosmic_lo.wav create mode 100644 venv/Lib/site-packages/pygame/examples/data/shot.gif create mode 100644 venv/Lib/site-packages/pygame/examples/data/static.png create mode 100644 venv/Lib/site-packages/pygame/examples/data/whiff.wav create mode 100644 venv/Lib/site-packages/pygame/examples/data/yuv_1.pgm create mode 100644 venv/Lib/site-packages/pygame/examples/dropevent.py create mode 100644 venv/Lib/site-packages/pygame/examples/eventlist.py create mode 100644 venv/Lib/site-packages/pygame/examples/fastevents.py create mode 100644 venv/Lib/site-packages/pygame/examples/fonty.py create mode 100644 venv/Lib/site-packages/pygame/examples/freetype_misc.py create mode 100644 venv/Lib/site-packages/pygame/examples/glcube.py create mode 100644 venv/Lib/site-packages/pygame/examples/headless_no_windows_needed.py create mode 100644 venv/Lib/site-packages/pygame/examples/liquid.py create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/__pycache__/macfont.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/keyedobjects.nib create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/aliens.icns create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/README.txt create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/__pycache__/aliens.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/__pycache__/setup.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/aliens.py create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/setup.py create mode 100644 venv/Lib/site-packages/pygame/examples/macosx/macfont.py create mode 100644 venv/Lib/site-packages/pygame/examples/mask.py create mode 100644 venv/Lib/site-packages/pygame/examples/midi.py create mode 100644 venv/Lib/site-packages/pygame/examples/moveit.py create mode 100644 venv/Lib/site-packages/pygame/examples/oldalien.py create mode 100644 venv/Lib/site-packages/pygame/examples/overlay.py create mode 100644 venv/Lib/site-packages/pygame/examples/pixelarray.py create mode 100644 venv/Lib/site-packages/pygame/examples/playmus.py create mode 100644 venv/Lib/site-packages/pygame/examples/prevent_display_stretching.py create mode 100644 venv/Lib/site-packages/pygame/examples/scaletest.py create mode 100644 venv/Lib/site-packages/pygame/examples/scrap_clipboard.py create mode 100644 venv/Lib/site-packages/pygame/examples/scroll.py create mode 100644 venv/Lib/site-packages/pygame/examples/sound.py create mode 100644 venv/Lib/site-packages/pygame/examples/sound_array_demos.py create mode 100644 venv/Lib/site-packages/pygame/examples/stars.py create mode 100644 venv/Lib/site-packages/pygame/examples/testsprite.py create mode 100644 venv/Lib/site-packages/pygame/examples/textinput.py create mode 100644 venv/Lib/site-packages/pygame/examples/vgrade.py create mode 100644 venv/Lib/site-packages/pygame/examples/video.py create mode 100644 venv/Lib/site-packages/pygame/fastevent.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/font.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/freesansbold.ttf create mode 100644 venv/Lib/site-packages/pygame/freetype.py create mode 100644 venv/Lib/site-packages/pygame/ftfont.py create mode 100644 venv/Lib/site-packages/pygame/gfxdraw.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/image.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/imageext.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/joystick.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/key.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/libfreetype-6.dll create mode 100644 venv/Lib/site-packages/pygame/libgcc_s_sjlj-1.dll create mode 100644 venv/Lib/site-packages/pygame/libjpeg-8.dll create mode 100644 venv/Lib/site-packages/pygame/libmpg123-0.dll create mode 100644 venv/Lib/site-packages/pygame/libogg-0.dll create mode 100644 venv/Lib/site-packages/pygame/libpng16-16.dll create mode 100644 venv/Lib/site-packages/pygame/libstdc++-6.dll create mode 100644 venv/Lib/site-packages/pygame/libtiff-5.dll create mode 100644 venv/Lib/site-packages/pygame/libvorbis-0.dll create mode 100644 venv/Lib/site-packages/pygame/libvorbisfile-3.dll create mode 100644 venv/Lib/site-packages/pygame/libwebp-5.dll create mode 100644 venv/Lib/site-packages/pygame/locals.py create mode 100644 venv/Lib/site-packages/pygame/macosx.py create mode 100644 venv/Lib/site-packages/pygame/mask.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/math.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/midi.py create mode 100644 venv/Lib/site-packages/pygame/mixer.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/mixer_music.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/mouse.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/newbuffer.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/overlay.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/pixelarray.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/pixelcopy.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/pkgdata.py create mode 100644 venv/Lib/site-packages/pygame/portmidi.dll create mode 100644 venv/Lib/site-packages/pygame/pygame.ico create mode 100644 venv/Lib/site-packages/pygame/pygame_icon.bmp create mode 100644 venv/Lib/site-packages/pygame/pygame_icon.icns create mode 100644 venv/Lib/site-packages/pygame/pygame_icon.svg create mode 100644 venv/Lib/site-packages/pygame/pygame_icon.tiff create mode 100644 venv/Lib/site-packages/pygame/pypm.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/rect.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/rwobject.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/scrap.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/sndarray.py create mode 100644 venv/Lib/site-packages/pygame/sprite.py create mode 100644 venv/Lib/site-packages/pygame/surface.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/surfarray.py create mode 100644 venv/Lib/site-packages/pygame/surflock.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/sysfont.py create mode 100644 venv/Lib/site-packages/pygame/tests/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/__main__.py create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/base_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/blit_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/bufferproxy_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/camera_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/cdrom_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/cdrom_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/color_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/compat_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/constants_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/cursors_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/display_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/draw_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/event_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/fastevent_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/fastevent_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/font_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/font_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/freetype_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/freetype_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/ftfont_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/ftfont_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/gfxdraw_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/image__save_gl_surface_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/image_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/image_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/imageext_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/imageext_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/joystick_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/key_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mask_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/math_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/midi_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/midi_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_music_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_music_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mouse_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/overlay_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/overlay_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/pixelarray_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/pixelcopy_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/rect_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/rwobject_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/scrap_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/scrap_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sndarray_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sndarray_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sprite_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surface_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surfarray_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surfarray_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surflock_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sysfont_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/test_test_.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/threads_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/time_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/touch_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/touch_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/transform_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/version_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/base_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/blit_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/bufferproxy_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/camera_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/cdrom_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/cdrom_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/color_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/compat_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/constants_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/cursors_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/display_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/draw_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/event_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/fastevent_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/fastevent_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/A_PyGameMono-8.png create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono-18-100dpi.bdf create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono-18-75dpi.bdf create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono-8.bdf create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono.otf create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/test_fixed.otf create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/test_sans.ttf create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/u13079_PyGameMono-8.png create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing.xbm create mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm create mode 100644 venv/Lib/site-packages/pygame/tests/font_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/font_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/freetype_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/freetype_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/ftfont_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/ftfont_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/gfxdraw_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/image__save_gl_surface_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/image_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/image_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/imageext_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/imageext_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/joystick_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/key_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/mask_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/math_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/midi_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/midi_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/mixer_music_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/mixer_music_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/mixer_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/mixer_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/mouse_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/overlay_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/overlay_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/pixelarray_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/pixelcopy_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/rect_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/run_tests__test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_3_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_4_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_5_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_6_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/no_assertions__ret_code_of_1__test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/zero_tests_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_3_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_4_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_5_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_6_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/no_assertions__ret_code_of_1__test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/zero_tests_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/incomplete_todo_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/magic_tag_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/sleep_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/incomplete_todo_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/magic_tag_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/sleep_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/invisible_tag_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/magic_tag_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/invisible_tag_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/magic_tag_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_3_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_4_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_3_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_4_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/fake_3_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_3_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_3_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_1_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/fake_1_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_3_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_4_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_3_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_4_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_3_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_4_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/fake_3_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/fake_4_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/run_tests__test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/fake_2_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/sleep_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/fake_2_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/sleep_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/rwobject_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/scrap_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/scrap_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/sndarray_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/sndarray_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/sprite_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/surface_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/surfarray_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/surfarray_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/surflock_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/sysfont_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_test_.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__init__.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/arrinter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/async_sub.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/buftools.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/endian.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/png.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/run_tests.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/test_machinery.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/test_runner.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/arrinter.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/async_sub.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/buftools.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/endian.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/png.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/run_tests.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/test_machinery.py create mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/test_runner.py create mode 100644 venv/Lib/site-packages/pygame/tests/threads_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/time_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/touch_tags.py create mode 100644 venv/Lib/site-packages/pygame/tests/touch_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/transform_test.py create mode 100644 venv/Lib/site-packages/pygame/tests/version_test.py create mode 100644 venv/Lib/site-packages/pygame/threads/Py25Queue.py create mode 100644 venv/Lib/site-packages/pygame/threads/__init__.py create mode 100644 venv/Lib/site-packages/pygame/threads/__pycache__/Py25Queue.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/threads/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pygame/time.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/transform.cp37-win32.pyd create mode 100644 venv/Lib/site-packages/pygame/version.py create mode 100644 venv/Lib/site-packages/pygame/zlib1.dll create mode 100644 venv/Lib/site-packages/setuptools-40.8.0-py3.7.egg create mode 100644 venv/Lib/site-packages/setuptools.pth create mode 100644 venv/Scripts/Activate.ps1 create mode 100644 venv/Scripts/activate create mode 100644 venv/Scripts/activate.bat create mode 100644 venv/Scripts/deactivate.bat create mode 100644 venv/Scripts/easy_install-3.7-script.py create mode 100644 venv/Scripts/easy_install-3.7.exe create mode 100644 venv/Scripts/easy_install-3.7.exe.manifest create mode 100644 venv/Scripts/easy_install-script.py create mode 100644 venv/Scripts/easy_install.exe create mode 100644 venv/Scripts/easy_install.exe.manifest create mode 100644 venv/Scripts/pip-script.py create mode 100644 venv/Scripts/pip.exe create mode 100644 venv/Scripts/pip.exe.manifest create mode 100644 venv/Scripts/pip3-script.py create mode 100644 venv/Scripts/pip3.7-script.py create mode 100644 venv/Scripts/pip3.7.exe create mode 100644 venv/Scripts/pip3.7.exe.manifest create mode 100644 venv/Scripts/pip3.exe create mode 100644 venv/Scripts/pip3.exe.manifest create mode 100644 venv/Scripts/python.exe create mode 100644 venv/Scripts/pythonw.exe create mode 100644 venv/pyvenv.cfg diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 28a804d..52c15d7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,4 +3,5 @@ + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 2e98bb9..6314ef4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..c7dcbe6 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1589206421672 + + + + + + + + + + \ No newline at end of file diff --git a/.idea/wozek.iml b/.idea/wozek.iml new file mode 100644 index 0000000..85c7612 --- /dev/null +++ b/.idea/wozek.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.gitignore b/Archiwum/.idea/.gitignore similarity index 100% rename from .idea/.gitignore rename to Archiwum/.idea/.gitignore diff --git a/.idea/AL-2020.iml b/Archiwum/.idea/AL-2020.iml similarity index 100% rename from .idea/AL-2020.iml rename to Archiwum/.idea/AL-2020.iml diff --git a/.idea/dictionaries/Pawe_ukaszewicz.xml b/Archiwum/.idea/dictionaries/Pawe_ukaszewicz.xml similarity index 100% rename from .idea/dictionaries/Pawe_ukaszewicz.xml rename to Archiwum/.idea/dictionaries/Pawe_ukaszewicz.xml diff --git a/Archiwum/.idea/misc.xml b/Archiwum/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/Archiwum/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Archiwum/.idea/modules.xml b/Archiwum/.idea/modules.xml new file mode 100644 index 0000000..2e98bb9 --- /dev/null +++ b/Archiwum/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/Archiwum/.idea/vcs.xml similarity index 100% rename from .idea/vcs.xml rename to Archiwum/.idea/vcs.xml diff --git a/README.md b/Archiwum/README.md similarity index 100% rename from README.md rename to Archiwum/README.md diff --git a/environment.md b/Archiwum/environment.md similarity index 100% rename from environment.md rename to Archiwum/environment.md diff --git a/frontend/img/Down.png b/Archiwum/frontend/img/Down.png similarity index 100% rename from frontend/img/Down.png rename to Archiwum/frontend/img/Down.png diff --git a/frontend/img/Left.png b/Archiwum/frontend/img/Left.png similarity index 100% rename from frontend/img/Left.png rename to Archiwum/frontend/img/Left.png diff --git a/frontend/img/Right.png b/Archiwum/frontend/img/Right.png similarity index 100% rename from frontend/img/Right.png rename to Archiwum/frontend/img/Right.png diff --git a/frontend/img/Up.png b/Archiwum/frontend/img/Up.png similarity index 100% rename from frontend/img/Up.png rename to Archiwum/frontend/img/Up.png diff --git a/frontend/index.html b/Archiwum/frontend/index.html similarity index 100% rename from frontend/index.html rename to Archiwum/frontend/index.html diff --git a/frontend/js/Archiwum/Agent.js b/Archiwum/frontend/js/Archiwum2/Agent.js similarity index 100% rename from frontend/js/Archiwum/Agent.js rename to Archiwum/frontend/js/Archiwum2/Agent.js diff --git a/frontend/js/Archiwum/Board.js b/Archiwum/frontend/js/Archiwum2/Board.js similarity index 100% rename from frontend/js/Archiwum/Board.js rename to Archiwum/frontend/js/Archiwum2/Board.js diff --git a/frontend/js/Archiwum/Field.js b/Archiwum/frontend/js/Archiwum2/Field.js similarity index 100% rename from frontend/js/Archiwum/Field.js rename to Archiwum/frontend/js/Archiwum2/Field.js diff --git a/frontend/js/Archiwum/script.js b/Archiwum/frontend/js/Archiwum2/script.js similarity index 100% rename from frontend/js/Archiwum/script.js rename to Archiwum/frontend/js/Archiwum2/script.js diff --git a/frontend/js/main.js b/Archiwum/frontend/js/main.js similarity index 100% rename from frontend/js/main.js rename to Archiwum/frontend/js/main.js diff --git a/frontend/styles.css b/Archiwum/frontend/styles.css similarity index 100% rename from frontend/styles.css rename to Archiwum/frontend/styles.css diff --git a/__pycache__/agent.cpython-37.pyc b/__pycache__/agent.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff5fefdee584f627e4f1677380611d63b7ffa562 GIT binary patch literal 1960 zcmbVN&u<$=6rP!#U9Z

IUeKKqaVp@qrYfs33$;fht^(Re?arin?+<8)w({u9@AC z+VYJ`T>B>^M=B(49Qi}$$|?T>2gLVg)=r92Ay{kPd-L|~H*em&`TW_&M#S*^^y}|W z?lc+ugC?uTgYgif+=ft0@d@j*FPIX_d&ZRaqv&(Rzh+%|j`yrLB)NJ7jE5NIE=0l* z$@)TZC7!Xqr#vO0rSeq(?W=|gp##-a5p+YffZ8_xr=ujVhCUGJAuTaJ$0#d^C10|b zEd?ZBdXQo%Az@`m>=qK;W|+g5Vd?eUuY#;`8Y*uoZ!(2(MmP;bHBOsn^hLDfwbcT; zcZe0TC~hl;wEW)r`&j#2K`dlC9o=8ZomoEWZkV7P>LkfcG%L!qN{c*xddZ#}Ssm-# z@TZ2)O)#5}2Ghj&>2xqkjGPn$Wx`QX#X1>QMq1f&fX)>RQH(@)eIv_ca;T{sIv~*? z5kmaT^lMOmzVqm#{m1j+(Lhfh>mmbSxqnhDlJP#)%B!8(+=OwQ=4lnjgiyW?!FW*r zI=mxp@HUUcV$&YM&MJ7wDG(3o^;z7&1QlYZsAER8^3DWD!=PHc*OfL?BM&BNrP~PA z*C4uFZ;?&;Izc&@fTE@e*(J3QkzXcWFv(yqgFrsUnO=JiIglzPRQpu#WxDMW8L;a~rISKwExL zm&Fx<3bp6T@-Icuw~(cNlf-Qj#18+v0+HR7rYhbA&Z|n$xl{rhJha_`FGv$nSysr< zm-a}h5x#{5!Wm0g)R|m)-~ex%-KH3j7+D#p$i+$<@gV@gCTQ*q^kir9InNzxfXEm2 zTS9%YLcKs-;n%2$1rAoSIA}}E{2JBIe*qFx4PgFdvkS)zR-GxD@9Inu>oWb|rA+Ni z=HFS&=2$%EcK<>F)!H@gMXswAT&^zOWoxn4+1eRh2zWAXxiE+u_CiEG*9%mCO?0q# zPQ-B07U^$zWm}~ix@%#%ia4hqre$0n5tGqBkj9^nV+MU4Ru}ge%J>JxK&yYUM0;BN zki>_DKEca(5m!?0F#aA0Y?E)*y0g~1xKW$4PON}(leOK3ulVQB&ev5nCB&3fgPEqkPP zIFq_ zV{tkpxp}^s^9xGJVh=rvo~gavA<3@gs=6Jl>`HDTY8O1`=gpkzh<}G?bk#A=7))_MY ze@46B<7t%vT3spCdpvzhMzx2t&QR*FWjJqUJfRC`h&3&U`fac|-n;Lz)pPvQS3je1 znKW_I#%19j*ayJuW`j|IW2&>k5F@s|3jTMR`E5i;+1e+ zPpAUxdi3UNT=Ob)&1+oqTC>s#HCFuUQ#`~9(A-<8?w86ueB27Bm z>X}g-K*@voT+G001pxj`gyW-wSSBUSO1doDqc}fqd-pgWIPe0G}%9iAB*FCt#xC* zESo4Eq{7#PdJU2<&=6|U4z+2Qbu{{zI&_C}dWp4Z8?l2(*=y*%8rw|nVD8JuMg2gk z74G0jK0%Xxm=nBy+Xc V?;`P)YL!I2*fwp_CgX-L zMx8wQQ`8+eu`$nTiU`;N6eK~Xq`Hc^E%L3sDcJ>@V z5J3~tCZC94!nz{Dx@2uC=x5^Fw_qo&5bvObh6m%gyh5MZ@yn``1w)-U7Yc(CzGz;0x1o{$vBpRccwguz*{%N zG|PF~<+%#ZWTLAh8ArWNsxnO@O?#SlwKrDsEKVnxcE{5w7)tHLLkQP)k_JM1k<7W0 zVXke1YbB{t<(8cMs9=$y2d7=^+Tj@9kn?yH=bYnR*-HSzT>9W=EuO6=tVbEd zk~`%`aEmQEzQsxLos~&4^Rot8?FQqq90{M9PH3l-21-0^NFxw}FJ~S9F0yq1LJ#QP za=)Up&9Y1Pyj#ADQ#XPyfpcBse3*(!f^wbnuah7tEeij@)E)x%eT9J;4x9^x?Z$b_ faCklDz3?of1M*16$d3hT?`@g%9hSq4lxO_~_+cv_ literal 0 HcmV?d00001 diff --git a/__pycache__/functions.cpython-37.pyc b/__pycache__/functions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6677df74e218eabb3ca1bf9a8f5ae43f2a713473 GIT binary patch literal 2995 zcmZuzTW=dh6rS0e*Xwl>qN+DgRY6;1RB@@0fVPxg($cC`2sBlMRoJ?ojpMbw>&$Kv zr&{+V{D3}HJRw)&p*(>20faHjW7kycjg@@h~72%_=h^m-E?~7?MgT5;GT~>SJ6?S9uHLl#dVV1SyRtny} z(hB1Yj3;DcBY2oJq-c_X^qFWj+BLNFXOO{98H@PHc*f?~cTa{!ZbT*|R>zQMGJE7a zW1Ow}V`&Le;$3Kz!Qaf;$lK8%X$8{nA@%o2tB|fkI+gQhe7qiMPt$tYOwI*A2B#fk z;0$nRTL$SZ!C^S4IWIYEeMOen-cU||v(@N@$`03YQf0QnOj+4xKUCJ&_iimJGu=#; z6%N{&D&4;R?c7&O^UCamn-~S(-1_q7qVlpe83(f6TFI1iJGgWG#-b`~SvOq9Vz+~P z3(D^$>tV2*$PIXquy+@(T)VEEMv!I=Su>U0AWth>yI7WB+%HTXL-+dh-1++po6VJm z>@CP73Y%Gae$@5ij4w zT$65)KI-XK^-Z1tld+s_!MnLJ;^h4dH#xG1(>~<$HCtNHQ_jO~JL`qgp+QNs(|)(H zsjTI0yI(UUS)iP>DZ?<9M=;PQD#&q~tFHA$BMXB(2a0c!qnF!ZS17NQG`c~-bFtqpA7K#S zG+85VhGa%cTQh!=%XiW5IBpt)9itv2u3BtpqFHEmZjE3f1?dw$c#!ej+Cp%4tS4L! z1Rpwsvzbvyw>T2!tzjv*^3pLDndlwrJ4~L>OG9V%{1PiVwDJ*#kqJLk1Nd^) zg;mG*Cif%1-D`c&Z)7X)_v2P=3VGJ=hp|v*H;k1n8*wXCe7WxSWw_o>*3u$=?RF1Y zsH|?%5Q?`HUr~+>DRWgh4w2vw6Pebhnn{`k$#Rg%#(LP*0a2T-S16IQBBJDJ#D$Lj zy4UO`X()m;%<66eBZyNL*`}P0b{vON@wO^8*Q7)Ns9Ras>r0AnWy)kjegv-WZtq@q zXgX-^i&uFVTC`_+2ZV8peuihxg3j_o$R+$B8`lBDa522F|AF=@tTjdrcE>ZG@tKk>NTHhO$VCKNmG>2sQSC}uc-Pf`x~m)i^{sA zYxG>Q5i8?f{|1WIJD8VmlafVMyk_XirMx&CY+o-Gs);J*6{VN7A7CcMKRPbq3>-eu z40#FC|99mhIF^n{hk(iFb{(W$c}^dOTnTPuQW<_?#B&n}u@50M!UO_bQMiGaoj^R@ zhj^+HbP3?b2p<1Efq1ct&@O(V5o8s(9mH=Fh}ZiNuQh_K0yjPfkMmswD#66rX%{V_ z@W7=P{0@%JKMoYkMA&O0RJ3Fl7ftNv@4<}@;6~a?cmivHFHRP}+=F^~07dgU+<^i= zM$uZ^Hqvuv$3}fNl5E?k`7sLCPN1$HKwZ@+ve1y=3y;Jf??J5}K&@*Oybl!k0;Q9} znU|j+Hsu8(=ZSnq;#2fZ$>q5uE@ literal 0 HcmV?d00001 diff --git a/__pycache__/settings.cpython-37.pyc b/__pycache__/settings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b98f4b7a258772404ac94354fefcdb4ca27ed177 GIT binary patch literal 563 zcmYjN%}&BV5T0!-R{jzVkKm;j9>5qv)WnM+B-}QQ6YMUuSX$jJK?pZ_86Uw{>D3cw zZ(ek^KZa?(Z@$@`+3Czpr_%&7UwuA4Fn});)Mk?y67&VpJqQqNPk6UD2x|hK9nkr| zS)_&p-6N8~nE-AHCagVhTiBHEf-oXM0 zR*x7RQk1u_i|9nqEj9$09;1VxR}N+>&p!N;Q%+6ZDR0dp84FxTA`5xD3_=;r!;HIc zSj3vUn@Z(v9VjW2GC%KBQCX0?Pjd{?I8`3Y9WCS82dFdZ^>cZ5<&QT(I91EBN*6N7 zw7*Wb^4Ztb{QZ|r?jlA>lp&h=b(aWOqx!n6%eLqBw)%DE$m|d?nJy(_-b7rcVigv38nROdz)6-=|Jn~9^lxwC?rXY8(%N7Gu^-X|3LHL0d literal 0 HcmV?d00001 diff --git a/agent.py b/agent.py new file mode 100644 index 0000000..01ebf4e --- /dev/null +++ b/agent.py @@ -0,0 +1,63 @@ +import pygame + + +class Agent: + + def __init__(self, screen, position_x, position_y, turn): + self.screen = screen + self.position_x = position_x + self.position_y = position_y + self.turn = turn + self.x = (self.position_x - 50) // 100 + self.y = (self.position_y - 50) // 100 + + self.image = pygame.image.load('img/' + turn + '.png') + self.rect = self.image.get_rect() + self.screen_rect = screen.get_rect() + + self.rect.center = (position_x, position_y) + + def blitme(self): + self.screen.blit(self.image, self.rect) + + def turn_left(self): + if self.turn == "Up": + self.turn = "Left" + elif self.turn == "Left": + self.turn = "Down" + elif self.turn == "Down": + self.turn = "Right" + elif self.turn == "Right": + self.turn = "Up" + self.image = pygame.image.load('img/' + self.turn + '.png') + + def turn_right(self): + if self.turn == "Up": + self.turn = "Right" + elif self.turn == "Left": + self.turn = "Up" + elif self.turn == "Down": + self.turn = "Left" + elif self.turn == "Right": + self.turn = "Down" + self.image = pygame.image.load('img/' + self.turn + '.png') + + def move_forward(self, board): + if self.turn == "Up" and self.position_y > 50 and board[(self.position_y - 100) // 100][self.position_x // 100]. \ + is_shelf == False: + self.position_y -= 100 + self.y -= 1 + elif self.turn == "Left" and self.position_x > 50 and board[self.position_y // 100][(self.position_x - 100) // 100].\ + is_shelf == False: + self.position_x -= 100 + self.x -= 1 + elif self.turn == "Down" and self.position_y < 950 and board[(self.position_y + 100) // 100][self.position_x // 100]. \ + is_shelf == False: + self.position_y += 100 + self.y += 1 + elif self.turn == "Right" and self.position_x < 950 and board[self.position_y // 100][(self.position_x + 100) // 100].\ + is_shelf == False: + self.position_x += 100 + self.x += 1 + self.rect.center = (self.position_x, self.position_y) + diff --git a/board.py b/board.py new file mode 100644 index 0000000..363a0ae --- /dev/null +++ b/board.py @@ -0,0 +1,48 @@ +import pygame +from settings import Settings +from field import Field + +settings = Settings() + + +def create_board(screen): + board = [] + shelfs = [(250, 150), (250, 250), (450, 150), (450, 250), (650, 150), (650, 250), (850, 150), (850, 250), + (250, 450), (350, 450), (750, 450), (850, 450), + (250, 650), (250, 750), (450, 650), (450, 750), (650, 650), (650, 750), (850, 650), (850, 750)] + + for y in range(settings.y_fields): + row = [] + for x in range(settings.x_fields): + field = Field(screen, x, y, 50 + x * 100, 50 + y * 100, False, False, 1) + for shelf in shelfs: + if field.center_x == shelf[0] and field.center_y == shelf[1]: + field.is_shelf = True + field.image = pygame.image.load('img/shelf.png') + + row.append(field) + board.append(row) + for row in board: + for field in row: + field.add_neighbors(board) + + for row in board: + for field in row: + if field.x > 0 and board[field.y][field.x - 1].is_shelf: + field.cost_of_travel += 1 + if field.x < 9 and board[field.y][field.x + 1].is_shelf: + field.cost_of_travel += 1 + if field.y > 0 and board[field.y - 1][field.x].is_shelf: + field.cost_of_travel += 1 + if field.y < 9 and board[field.y + 1][field.x].is_shelf: + field.cost_of_travel += 1 + + return board + + +def draw_board(board): + for row in board: + for field in row: + field.blitme() + + diff --git a/field.py b/field.py new file mode 100644 index 0000000..033612c --- /dev/null +++ b/field.py @@ -0,0 +1,44 @@ +import pygame + + +class Field: + + def __init__(self, screen, x, y, center_x, center_y, is_shelf, is_occupied_by_agent, cost_of_travel): + # Jakieś podstawowe rzeczy + self.screen = screen + self.x = x + self.y = y + self.center_x = center_x + self.center_y = center_y + self.is_shelf = is_shelf + self.is_occupied_by_agent = is_occupied_by_agent + self.cost_of_travel = cost_of_travel + self.neighbors = [] + + # Te parametry są potrzebne do algorytmu A* + self.g = 0 + self.h = 0 + self.f = 0 + self.previous = None + + # Te rzeczy są potrzebne do wyświetlenia pola + self.image = pygame.image.load('img/Field.png') + self.rect = self.image.get_rect() + self.screen_rect = screen.get_rect() + + self.rect.center = (center_x, center_y) + + + # Metoda do wyświetlania pola na ekranie + def blitme(self): + self.screen.blit(self.image, self.rect) + + def add_neighbors(self, board): + if self.x > 0 and board[self.y][self.x - 1].is_shelf == False: + self.neighbors.append(board[self.y][self.x - 1]) + if self.x < 9 and board[self.y][self.x + 1].is_shelf == False: + self.neighbors.append(board[self.y][self.x + 1]) + if self.y > 0 and board[self.y - 1][self.x].is_shelf == False: + self.neighbors.append(board[self.y - 1][self.x]) + if self.y < 9 and board[self.y + 1][self.x].is_shelf == False: + self.neighbors.append(board[self.y + 1][self.x]) \ No newline at end of file diff --git a/functions.py b/functions.py new file mode 100644 index 0000000..c18a05d --- /dev/null +++ b/functions.py @@ -0,0 +1,136 @@ +import sys +import pygame + +from settings import Settings +from agent import Agent +from board import draw_board + + +def check_events(agent, board): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + sys.exit() + + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_RIGHT: + agent.turn_right() + elif event.key == pygame.K_LEFT: + agent.turn_left() + elif event.key == pygame.K_UP: + agent.move_forward(board) + elif event.key == pygame.K_SPACE: + a_star(board[0][0], board[5][5]) + + +def update_screen(board, screen, agent): + draw_board(board) + agent.blitme() + + pygame.display.flip() + + +def get_distance(field, goal_field): + d = abs(field.x - goal_field.x) + abs(field.y - goal_field.y) + return d + + +def a_star(start_field, goal_field, board): + closed_set = [] + open_set = [] + path = [] + + open_set.append(start_field) + # start_field.image = pygame.image.load('img/green.png') + + while len(open_set) > 0: + winner = 0 + + for i in range(len(open_set)): + if open_set[i].f < open_set[winner].f: + winner = i + + current = open_set[winner] + + if current == goal_field: + temp = current + path.append(current) + + while temp.previous is not None: + path.append(temp.previous) + temp = temp.previous + + for field in path: + field.image = pygame.image.load('img/path.png') + + for row in board: + for field in row: + field.g = 0 + field.h = 0 + field.f = 0 + + return path + + open_set.remove(current) + closed_set.append(current) + # current.image = pygame.image.load('img/red.png') + neighbors = current.neighbors + + for neighbor in neighbors: + if neighbor not in closed_set: + temp_g = current.g + neighbor.cost_of_travel + + if neighbor in open_set: + if temp_g < neighbor.g: + neighbor.g = temp_g + else: + neighbor.g = temp_g + open_set.append(neighbor) + # neighbor.image = pygame.image.load('img/green.png') + + neighbor.h = get_distance(neighbor, goal_field) + neighbor.f = neighbor.g + neighbor.h + + neighbor.previous = current + + +def check_turn(agent, next_field): + if agent.y == next_field.y and next_field.x == agent.x + 1 and agent.turn == "Right": + return True + elif agent.y == next_field.y and next_field.x == agent.x - 1 and agent.turn == "Left": + return True + elif agent.x == next_field.x and next_field.y == agent.y + 1 and agent.turn == "Down": + return True + elif agent.x == next_field.x and next_field.y == agent.y - 1 and agent.turn == "Up": + return True + else: + return False + + +def change_turn(agent, next_field): + if agent.y == next_field.y and next_field.x == agent.x + 1 and agent.turn == "Up": + agent.turn_right() + elif agent.y == next_field.y and next_field.x == agent.x + 1 and agent.turn == "Down": + agent.turn_left() + elif agent.y == next_field.y and next_field.x == agent.x + 1 and agent.turn == "Left": + agent.turn_left() + elif agent.y == next_field.y and next_field.x == agent.x - 1 and agent.turn == "Up": + agent.turn_left() + elif agent.y == next_field.y and next_field.x == agent.x - 1 and agent.turn == "Down": + agent.turn_right() + elif agent.y == next_field.y and next_field.x == agent.x - 1 and agent.turn == "Right": + agent.turn_right() + elif agent.x == next_field.x and next_field.y == agent.y + 1 and agent.turn == "Right": + agent.turn_right() + elif agent.x == next_field.x and next_field.y == agent.y + 1 and agent.turn == "Left": + agent.turn_left() + elif agent.x == next_field.x and next_field.y == agent.y + 1 and agent.turn == "Up": + agent.turn_left() + elif agent.x == next_field.x and next_field.y == agent.y - 1 and agent.turn == "Right": + agent.turn_left() + elif agent.x == next_field.x and next_field.y == agent.y - 1 and agent.turn == "Left": + agent.turn_right() + elif agent.x == next_field.x and next_field.y == agent.y - 1 and agent.turn == "Down": + agent.turn_right() + + + diff --git a/img/Down.png b/img/Down.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb4c170dce363f07eb60f6139436b18a5e8c977 GIT binary patch literal 1829 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 W9O+cJ9{KHXO#m8cg{U#R9`zSW>nEuI literal 0 HcmV?d00001 diff --git a/img/path.png b/img/path.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0e16dca2878f89d18a29cae93e34f330f3f732 GIT binary patch literal 2568 zcmchZ`8(9_8pl6F8vB|x%bZZMOh_0@Xl7#U4P_Zbc4EksE&E#b%92Tvvdy6ESx1p2 z%g9m<#@N0SWuI~^armC=IzN2>fb+wB-`DlJ-_PrMetVt=mga_B>|*Qy0C1s<5a^@n zc3iAXNBuCGi5UREMq$>rIJ8SJB;XF#!~3>71Q#0M4sj3h_5gqoO1+(T&K87wzuIbm zkN1`?_mA+PIM~4{kBe-Lmb;D4L2)eOz zIdfe-x`I$#r^VlP)k)~DOEoE-Gc9kZRuSVCA_1S9L^ddPJye=c-6j>O1FlR3`;QL^ z-xXi`)*6i4HxIYs!s7&l>K!!{+_eSFQxsB=+CrVRf_l|1wK@8trlcT;uTaa5z5AZJ z)A$ZAJ#tw19JXJ0vaXiKsK^B8OsyQ$JX@iTFjqcq2?r%k_9oq#-=V3lFw$zb#lo=o z;6BZ!pE*`73R`R|oBF=(ivb~vtYRycIgvfQ`l&*RzlO~qgrR(_uA>bep*LjKI z+VX}lg{#Vl_^!I3yhsqIY^Hl^LS!o&*|O$VTK$9_HZDya7U-G?qfaMS^rdJ}!{}{1 z3&j=&v25y1G&rlutFmIqG9`IO1fHrQ%b8COdOyj=h3?lfQUB(V8^H}jo3m`5FZnw6 z@Iq17qlzlDN(O<@o+#$)GX;6=k?&WvBV>QO9PZ=TywuRLTAm~s-u$+~D?*FvoF?oW zrg}+i_q4CvugJAnL(R8w7nMu6;sSUkNFwpNnpQDsBXRFKpFR|;eeWaU4TfcdU7g8l z6AfEwE#2Zv3{h%tQXjs(Uz}_Cpm*vbw%V2;t()8TRhB_|Hv8Vy1a`r#C`5VNgH&v= z8JTpB;YQ2XgJ650gzm5RYTB@iwKjOH$Wp_ND}9(F_Hu?s1Z&n#k*@kV@WVOQ+SdeM%# z6@F%{AFI6MWNtiO%zr(fG2JuM6ZZxaj$=m58OX{i? zieU?ER?;;Ass{P_4X4~#^(3ygr-yt=Jw@T4Wr}}u<_Fh2{lT>xMrkCr`C-lJrh!e0 zRlcRQ%vgK}^lZ6Wp$f7giLhO$)eMSBeFs;`iuM!W5Yezbe|Zq4y@~0&*kf26cc~j#4thBWFwLUo%?@(d4|#Ok@iQU4=z+xow)F zo0q|swDJsrZlc3z3p=Z(#~c(~ngKAzMlk&__M{;Nx}3OH^|Sec%WC7R+F>>@!&!3Z zqId$Fo*mRWnp9$6y7iA76YqM_KNu7gbne(v9PqvMPWt7S(=-kD*$C!FP8GXHb<}*CibF3(G@}O+_Rio3xg4&Ldf)S(KpWh|}eX1W3`UF2+^L*YS z?~5-ktsmr@qWtA$j>Wk0(@zeRUlau*6V^L_5+0BoJ22|4{0{t*6>A z(r?u2l7yqZdX!!3>3ux1xVX^4CrUl9Dz+7GYGXh(D~zm7HJN!!d?a*$Tn3 z##FaxLz(BU%`SXc-r?K!TJ(rHUIi5U25h6rKv*Vnq50?LY5L0#Ov9X_PselulWi66 zy_xDHx|MZ}cDW$ON2M76oJ6wCs`=8=+R|9t7&TnCy9e5MeuuKaP{JJjb=U%o?1BIQDt%m_ zkk@+mjvyF^GDCtFSa>*K+P7@!en&_YhqT4Pv3`E;{x|@B$K3_z?gk0=#(6;uQD&Al zG2FsOp#l`bz&eDoLRJ9*yub;Pr?o!lkHGmC(RL?(2J=B@?NBwpc>~8Mi9*!AN3te4 gigvyKudzN0WF<3q1-__IJ-R4>LYgD0t~kg32Q8$>)&Kwi literal 0 HcmV?d00001 diff --git a/img/red.png b/img/red.png new file mode 100644 index 0000000000000000000000000000000000000000..d5869462cebd367133db12948e73edefd2a5743b GIT binary patch literal 2537 zcmchZS635=5`Yts76VcYT?rsXL7LKgC-g2YNDZA(qO@fxg7hjNO-v}_l7N7MF#&{7 zWfy7EAwYuCT-pYgrC!{7f5Uy4Z_d;+4|C2;hP9A$RyGtvEc(pg~6x}sGde$nFk7H6%ot{d0wkM7L_fAa)X$<7X! zOEzV^b3wZEzdA$+bP$z2HQ%?13CXP(pLx8qbCgzpQe#sQskAbW9Z^|v^wD^&mtZ-e zHBMcAx7>h!)=++^lxJtAnZTjlQ_!}eHO)9s3TsMWhbqOp_Dk?q_;NwXgtPRGl;H&s-*iCU?uZ&=e1 zp(0fb+mzqXHL`ZLifD-OXTS;!UuZOs{Q3fy!tbqL&pObME`K{i*wAeRHybiuUAU& zxY6bXWXZAXo!7J&A@^IGuJn2D38(PxPo$TLR^{S_2Wkr~#bK?V#9q?Xm9A>d`Fv6$ zevce#d0l;#f}f>i%3}J4Ax-uc#erCC*HeB0x5iCG`TYe!#bv!LG5nY$be#fOieNJp}vs_pszvXZn1s6J(b(fM{Ql7crKa0kc zRD&7pzKI-d<_D#>qZ3yHzUAj@>RIHTVAQsCBc|;* z7}al_%|hx^nuwI5u}2Ro$wo8q@M8gZRR3lMY6(&=F;OOEgyb@Y+p>|!cl9P<#tjc>(MW-3|Unscj=#> zWN1Zz)P7`+zDWLWMAmSqa-;q?$_u+OiGRsc?OnM!GrsS0C%*6wS(V{`ysbyJpq1H; z9UkwejHhn!`W@S1EKr@ln%ASZ552u~A7q!KrTizIwM-(t}iEp zE%wVo_uF5ehYMCHZBw1%>}p7ZEjwqKol_hlIlD9{RUN*nzH|(yiEO^;v9ERDd(p#* zV8WD=aZtXIT+z-Wl$+Zw)F4!Bvy(%AJWpxOKT?wT_fsF*(}S^GNAK+sUIl{K zwxjYZmcN_&$*KyzhiMUl@j2a%TjRUY#bfM{O;*>h@V6gw-OY2XJkEJaXiyiYF6eD+ z5Dnmr1TS^>P3)QTCRzaC@)O?DkQm^wAe#uk4mR-5x7VMhWuHa>QlgowGGrk1rU;H#pHwaRed}oUgjA)RuX|lVRZf|R<=nZ;4RgsJ4{_Dy2 z#c^PSEkdgC;vso!1V1~maZQBb*vq<=8qA(6ID4V))nQ|Ec#-?gk?!m&&nKFnFYzSZLN%8=7yISvogLw)1+5Nu>YZ*nW5B;?@&rUM$MTW@>_*{3p2N= zE5?E8nb}7)Ouvvqk;HQgo;u;w@G9F|D|eWag`k$XmYFiPl#4>WET?O^C;K~O>dp=5 z{X6E0apC}nx7qd@;)qCW^#w%h%6Oh6LJYB$LGxmS56)<6{L-1Vhuc{{7o;~O`y?9Q zs`4gyav<49gI(0t<06(dqxgG}4@p4@GYhsTp8aeW3V_V)N z6I365cNxHx*6mc#Iz#LrzJL2ZVf5Yc32?tEVt$Qw*Y)zJVF@#FjsyT?M1Kk}x=#D? zrIQH-voK^@W4HzuyaC^=J-Br7p$wf+`pA$F-%u1lKf>1&xlq%tsQ zOst(~>v7mY=4gDdx2v|Sj?$wE3wLEWh8zi86~V&2bnS&z%_o<}Us$4;Sy(6%!_8Nx z6DAuor?j*{l;t45fV#W7tGMRJde4QfJ?zK-R+PUl{LUvJmAY(JtZ>7s(B2dst+Y+6 z7yTEt`=Zog$m4P5%Hx$sO=6B;x3#I++xd6Gt#PF6k=*ckC5VP|vX#emM`ork+t1@4FXdZPFvFvx!GGv{(oUC@yXjI<-Q{X|-Edr^;LR*gwwO>>c%H z#;6(;=`3Ipo%ELdfAjsjvwp7hRM!+>t)^mS!_!phCBC$yI7hzw9jvcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%` zPaLRdj;D)bNX4zU7YrF01Q=KjEbprkW7PTdQkm)7ZjR|6)~HD4cJ7$9JDmG{%E?Kp h-qUpGM*S#Yn6J)!= 0: + time.sleep(0.5) + if functions.check_turn(agent, next_step): + agent.move_forward(board) + if len(path) != 0: + next_step = path.pop() + else: + functions.change_turn(agent, next_step) + print(agent.position_x, agent.position_y) + + + + draw_board(board) + agent.blitme() + + pygame.display.flip() + + +run() diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..11fb6d4 --- /dev/null +++ b/settings.py @@ -0,0 +1,9 @@ +class Settings(): + def __init__(self): + self.field_width = 100 + self.field_height = 100 + self.x_fields = 10 + self.y_fields = 10 + self.screen_width = self.field_width * self.x_fields + self.screen_height = self.field_height * self.y_fields + self.bg_color = (255, 255, 255) diff --git a/venv/Include/site/python3.7/pygame/_camera.h b/venv/Include/site/python3.7/pygame/_camera.h new file mode 100644 index 0000000..68ae989 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/_camera.h @@ -0,0 +1,27 @@ +/* + pygame - Python Game Library + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#ifndef _CAMERA_H +#define _CAMERA_H + +#include "_pygame.h" +#include "camera.h" + +#endif + diff --git a/venv/Include/site/python3.7/pygame/_pygame.h b/venv/Include/site/python3.7/pygame/_pygame.h new file mode 100644 index 0000000..68962fc --- /dev/null +++ b/venv/Include/site/python3.7/pygame/_pygame.h @@ -0,0 +1,864 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +#ifndef _PYGAME_H +#define _PYGAME_H + +/** This header file includes all the definitions for the + ** base pygame extensions. This header only requires + ** SDL and Python includes. The reason for functions + ** prototyped with #define's is to allow for maximum + ** python portability. It also uses python as the + ** runtime linker, which allows for late binding. For more + ** information on this style of development, read the Python + ** docs on this subject. + ** http://www.python.org/doc/current/ext/using-cobjects.html + ** + ** If using this to build your own derived extensions, + ** you'll see that the functions available here are mainly + ** used to help convert between python objects and SDL objects. + ** Since this library doesn't add a lot of functionality to + ** the SDL libarary, it doesn't need to offer a lot either. + ** + ** When initializing your extension module, you must manually + ** import the modules you want to use. (this is the part about + ** using python as the runtime linker). Each module has its + ** own import_xxx() routine. You need to perform this import + ** after you have initialized your own module, and before + ** you call any routines from that module. Since every module + ** in pygame does this, there are plenty of examples. + ** + ** The base module does include some useful conversion routines + ** that you are free to use in your own extension. + ** + ** When making changes, it is very important to keep the + ** FIRSTSLOT and NUMSLOT constants up to date for each + ** section. Also be sure not to overlap any of the slots. + ** When you do make a mistake with this, it will result + ** is a dereferenced NULL pointer that is easier to diagnose + ** than it could be :] + **/ +#if defined(HAVE_SNPRINTF) /* defined in python.h (pyerrors.h) and SDL.h \ + (SDL_config.h) */ +#undef HAVE_SNPRINTF /* remove GCC redefine warning */ +#endif + +// This must be before all else +#if defined(__SYMBIAN32__) && defined(OPENC) +#include + +#if defined(__WINS__) +void * +_alloca(size_t size); +#define alloca _alloca +#endif +#endif + +#define PG_STRINGIZE_HELPER(x) #x +#define PG_STRINGIZE(x) PG_STRINGIZE_HELPER(x) +#define PG_WARN(desc) message(__FILE__ "(" PG_STRINGIZE(__LINE__) "): WARNING: " #desc) + +/* This is unconditionally defined in Python.h */ +#if defined(_POSIX_C_SOURCE) +#undef _POSIX_C_SOURCE +#endif + +#include + +/* the version macros are defined since version 1.9.5 */ +#define PG_MAJOR_VERSION 1 +#define PG_MINOR_VERSION 9 +#define PG_PATCH_VERSION 6 +#define PG_VERSIONNUM(MAJOR, MINOR, PATCH) (1000*(MAJOR) + 100*(MINOR) + (PATCH)) +#define PG_VERSION_ATLEAST(MAJOR, MINOR, PATCH) \ + (PG_VERSIONNUM(PG_MAJOR_VERSION, PG_MINOR_VERSION, PG_PATCH_VERSION) >= \ + PG_VERSIONNUM(MAJOR, MINOR, PATCH)) + +/* Cobjects vanish in Python 3.2; so we will code as though we use capsules */ +#if defined(Py_CAPSULE_H) +#define PG_HAVE_CAPSULE 1 +#else +#define PG_HAVE_CAPSULE 0 +#endif +#if defined(Py_COBJECT_H) +#define PG_HAVE_COBJECT 1 +#else +#define PG_HAVE_COBJECT 0 +#endif +#if !PG_HAVE_CAPSULE +#define PyCapsule_New(ptr, n, dfn) PyCObject_FromVoidPtr(ptr, dfn) +#define PyCapsule_GetPointer(obj, n) PyCObject_AsVoidPtr(obj) +#define PyCapsule_CheckExact(obj) PyCObject_Check(obj) +#endif + +/* Pygame uses Py_buffer (PEP 3118) to exchange array information internally; + * define here as needed. + */ +#if !defined(PyBUF_SIMPLE) +typedef struct bufferinfo { + void *buf; + PyObject *obj; + Py_ssize_t len; + Py_ssize_t itemsize; + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; +} Py_buffer; + +/* 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 +#define PyBUF_SHADOW 0x400 + +typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); +typedef void (*releasebufferproc)(Py_buffer *); +#endif /* #if !defined(PyBUF_SIMPLE) */ + +/* Flag indicating a pg_buffer; used for assertions within callbacks */ +#ifndef NDEBUG +#define PyBUF_PYGAME 0x4000 +#endif + +#define PyBUF_HAS_FLAG(f, F) (((f) & (F)) == (F)) + +/* Array information exchange struct C type; inherits from Py_buffer + * + * Pygame uses its own Py_buffer derived C struct as an internal representation + * of an imported array buffer. The extended Py_buffer allows for a + * per-instance release callback, + */ +typedef void (*pybuffer_releaseproc)(Py_buffer *); + +typedef struct pg_bufferinfo_s { + Py_buffer view; + PyObject *consumer; /* Input: Borrowed reference */ + pybuffer_releaseproc release_buffer; +} pg_buffer; + +/* Operating system specific adjustments + */ +// No signal() +#if defined(__SYMBIAN32__) && defined(HAVE_SIGNAL_H) +#undef HAVE_SIGNAL_H +#endif + +#if defined(HAVE_SNPRINTF) +#undef HAVE_SNPRINTF +#endif + +#ifdef MS_WIN32 /*Python gives us MS_WIN32, SDL needs just WIN32*/ +#ifndef WIN32 +#define WIN32 +#endif +#endif + +/// Prefix when initializing module +#define MODPREFIX "" +/// Prefix when importing module +#define IMPPREFIX "pygame." + +#ifdef __SYMBIAN32__ +#undef MODPREFIX +#undef IMPPREFIX +// On Symbian there is no pygame package. The extensions are built-in or in +// sys\bin. +#define MODPREFIX "pygame_" +#define IMPPREFIX "pygame_" +#endif + +#include + +/* Pygame's SDL version macros: + * IS_SDLv1 is 1 if SDL 1.x.x, 0 otherwise + * IS_SDLv2 is 1 if at least SDL 2.0.0, 0 otherwise + */ +#if (SDL_VERSION_ATLEAST(2, 0, 0)) +#define IS_SDLv1 0 +#define IS_SDLv2 1 +#else +#define IS_SDLv1 1 +#define IS_SDLv2 0 +#endif + +/*#if IS_SDLv1 && PG_MAJOR_VERSION >= 2 +#error pygame 2 requires SDL 2 +#endif*/ + +#if IS_SDLv2 +/* SDL 1.2 constants removed from SDL 2 */ +typedef enum { + SDL_HWSURFACE = 0, + SDL_RESIZABLE = SDL_WINDOW_RESIZABLE, + SDL_ASYNCBLIT = 0, + SDL_OPENGL = SDL_WINDOW_OPENGL, + SDL_OPENGLBLIT = 0, + SDL_ANYFORMAT = 0, + SDL_HWPALETTE = 0, + SDL_DOUBLEBUF = 0, + SDL_FULLSCREEN = SDL_WINDOW_FULLSCREEN, + SDL_HWACCEL = 0, + SDL_SRCCOLORKEY = 0, + SDL_RLEACCELOK = 0, + SDL_SRCALPHA = 0, + SDL_NOFRAME = SDL_WINDOW_BORDERLESS, + SDL_GL_SWAP_CONTROL = 0, + TIMER_RESOLUTION = 0 +} PygameVideoFlags; + +/* the wheel button constants were removed from SDL 2 */ +typedef enum { + PGM_BUTTON_LEFT = SDL_BUTTON_LEFT, + PGM_BUTTON_RIGHT = SDL_BUTTON_RIGHT, + PGM_BUTTON_MIDDLE = SDL_BUTTON_MIDDLE, + PGM_BUTTON_WHEELUP = 4, + PGM_BUTTON_WHEELDOWN = 5, + PGM_BUTTON_X1 = SDL_BUTTON_X1 + 2, + PGM_BUTTON_X2 = SDL_BUTTON_X2 + 2, + PGM_BUTTON_KEEP = 0x80 +} PygameMouseFlags; + +typedef enum { + SDL_NOEVENT = 0, + /* SDL 1.2 allowed for 8 user defined events. */ + SDL_NUMEVENTS = SDL_USEREVENT + 8, + SDL_ACTIVEEVENT = SDL_NUMEVENTS, + PGE_EVENTBEGIN = SDL_NUMEVENTS, + SDL_VIDEORESIZE, + SDL_VIDEOEXPOSE, + PGE_KEYREPEAT, + PGE_EVENTEND +} PygameEventCode; + +#define PGE_NUMEVENTS (PGE_EVENTEND - PGE_EVENTBEGIN) + +typedef enum { + SDL_APPFOCUSMOUSE, + SDL_APPINPUTFOCUS, + SDL_APPACTIVE +} PygameAppCode; + +/* Surface flags: based on SDL 1.2 flags */ +typedef enum { + PGS_SWSURFACE = 0x00000000, + PGS_HWSURFACE = 0x00000001, + PGS_ASYNCBLIT = 0x00000004, + + PGS_ANYFORMAT = 0x10000000, + PGS_HWPALETTE = 0x20000000, + PGS_DOUBLEBUF = 0x40000000, + PGS_FULLSCREEN = 0x80000000, + PGS_OPENGL = 0x00000002, + PGS_OPENGLBLIT = 0x0000000A, + PGS_RESIZABLE = 0x00000010, + PGS_NOFRAME = 0x00000020, + PGS_SHOWN = 0x00000040, /* Added from SDL 2 */ + PGS_HIDDEN = 0x00000080, /* Added from SDL 2 */ + + PGS_HWACCEL = 0x00000100, + PGS_SRCCOLORKEY = 0x00001000, + PGS_RLEACCELOK = 0x00002000, + PGS_RLEACCEL = 0x00004000, + PGS_SRCALPHA = 0x00010000, + PGS_PREALLOC = 0x01000000 +} PygameSurfaceFlags; + +typedef struct { + Uint32 hw_available:1; + Uint32 wm_available:1; + Uint32 blit_hw:1; + Uint32 blit_hw_CC:1; + Uint32 blit_hw_A:1; + Uint32 blit_sw:1; + Uint32 blit_sw_CC:1; + Uint32 blit_sw_A:1; + Uint32 blit_fill:1; + Uint32 video_mem; + SDL_PixelFormat *vfmt; + SDL_PixelFormat vfmt_data; + int current_w; + int current_h; +} pg_VideoInfo; + +#endif /* IS_SDLv2 */ +/* macros used throughout the source */ +#define RAISE(x, y) (PyErr_SetString((x), (y)), (PyObject *)NULL) + +#ifdef WITH_THREAD +#define PG_CHECK_THREADS() (1) +#else /* ~WITH_THREAD */ +#define PG_CHECK_THREADS() \ + (RAISE(PyExc_NotImplementedError, \ + "Python built without thread support")) +#endif /* ~WITH_THREAD */ + +#define PyType_Init(x) (((x).ob_type) = &PyType_Type) +#define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API" + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef ABS +#define ABS(a) (((a) < 0) ? -(a) : (a)) +#endif + +/* test sdl initializations */ +#define VIDEO_INIT_CHECK() \ + if (!SDL_WasInit(SDL_INIT_VIDEO)) \ + return RAISE(pgExc_SDLError, "video system not initialized") + +#define CDROM_INIT_CHECK() \ + if (!SDL_WasInit(SDL_INIT_CDROM)) \ + return RAISE(pgExc_SDLError, "cdrom system not initialized") + +#define JOYSTICK_INIT_CHECK() \ + if (!SDL_WasInit(SDL_INIT_JOYSTICK)) \ + return RAISE(pgExc_SDLError, "joystick system not initialized") + +/* BASE */ +#define VIEW_CONTIGUOUS 1 +#define VIEW_C_ORDER 2 +#define VIEW_F_ORDER 4 + +#define PYGAMEAPI_BASE_FIRSTSLOT 0 +#if IS_SDLv1 +#define PYGAMEAPI_BASE_NUMSLOTS 19 +#else /* IS_SDLv2 */ +#define PYGAMEAPI_BASE_NUMSLOTS 23 +#endif /* IS_SDLv2 */ +#ifndef PYGAMEAPI_BASE_INTERNAL +#define pgExc_SDLError ((PyObject *)PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT]) + +#define pg_RegisterQuit \ + (*(void (*)(void (*)(void)))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 1]) + +#define pg_IntFromObj \ + (*(int (*)(PyObject *, int *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 2]) + +#define pg_IntFromObjIndex \ + (*(int (*)(PyObject *, int, \ + int *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 3]) + +#define pg_TwoIntsFromObj \ + (*(int (*)(PyObject *, int *, \ + int *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 4]) + +#define pg_FloatFromObj \ + (*(int (*)(PyObject *, float *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 5]) + +#define pg_FloatFromObjIndex \ + (*(int (*)(PyObject *, int, \ + float *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 6]) + +#define pg_TwoFloatsFromObj \ + (*(int (*)(PyObject *, float *, \ + float *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 7]) + +#define pg_UintFromObj \ + (*(int (*)(PyObject *, \ + Uint32 *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 8]) + +#define pg_UintFromObjIndex \ + (*(int (*)(PyObject *, int, \ + Uint32 *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 9]) + +#define pgVideo_AutoQuit \ + (*(void (*)(void))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 10]) + +#define pgVideo_AutoInit \ + (*(int (*)(void))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 11]) + +#define pg_RGBAFromObj \ + (*(int (*)(PyObject *, \ + Uint8 *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 12]) + +#define pgBuffer_AsArrayInterface \ + (*(PyObject * (*)(Py_buffer *)) \ + PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 13]) + +#define pgBuffer_AsArrayStruct \ + (*(PyObject * (*)(Py_buffer *)) \ + PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 14]) + +#define pgObject_GetBuffer \ + (*(int (*)(PyObject *, pg_buffer *, \ + int))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 15]) + +#define pgBuffer_Release \ + (*(void (*)(pg_buffer *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 16]) + +#define pgDict_AsBuffer \ + (*(int (*)(pg_buffer *, PyObject *, \ + int))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 17]) + +#define pgExc_BufferError \ + ((PyObject *)PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 18]) + +#if IS_SDLv2 +#define pg_GetDefaultWindow \ + (*(SDL_Window * (*)(void)) PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 19]) + +#define pg_SetDefaultWindow \ + (*(void (*)(SDL_Window *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 20]) + +#define pg_GetDefaultWindowSurface \ + (*(PyObject * (*)(void)) PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 21]) + +#define pg_SetDefaultWindowSurface \ + (*(void (*)(PyObject *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 22]) + +#endif /* IS_SDLv2 */ + +#define import_pygame_base() IMPORT_PYGAME_MODULE(base, BASE) +#endif + +/* RECT */ +#define PYGAMEAPI_RECT_FIRSTSLOT \ + (PYGAMEAPI_BASE_FIRSTSLOT + PYGAMEAPI_BASE_NUMSLOTS) +#define PYGAMEAPI_RECT_NUMSLOTS 4 + +#if IS_SDLv1 +typedef struct { + int x, y; + int w, h; +} GAME_Rect; +#else +typedef SDL_Rect GAME_Rect; +#endif + +typedef struct { + PyObject_HEAD GAME_Rect r; + PyObject *weakreflist; +} pgRectObject; + +#define pgRect_AsRect(x) (((pgRectObject *)x)->r) +#ifndef PYGAMEAPI_RECT_INTERNAL +#define pgRect_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 0]) +#define pgRect_Type \ + (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 0]) +#define pgRect_New \ + (*(PyObject * (*)(SDL_Rect *)) PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 1]) +#define pgRect_New4 \ + (*(PyObject * (*)(int, int, int, int)) \ + PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 2]) +#define pgRect_FromObject \ + (*(GAME_Rect * (*)(PyObject *, GAME_Rect *)) \ + PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 3]) + +#define import_pygame_rect() IMPORT_PYGAME_MODULE(rect, RECT) +#endif + +/* CDROM */ +#define PYGAMEAPI_CDROM_FIRSTSLOT \ + (PYGAMEAPI_RECT_FIRSTSLOT + PYGAMEAPI_RECT_NUMSLOTS) +#define PYGAMEAPI_CDROM_NUMSLOTS 2 + +typedef struct { + PyObject_HEAD int id; +} pgCDObject; + +#define pgCD_AsID(x) (((pgCDObject *)x)->id) +#ifndef PYGAMEAPI_CDROM_INTERNAL +#define pgCD_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0]) +#define pgCD_Type \ + (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0]) +#define pgCD_New \ + (*(PyObject * (*)(int)) PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 1]) + +#define import_pygame_cd() IMPORT_PYGAME_MODULE(cdrom, CDROM) +#endif + +/* JOYSTICK */ +#define PYGAMEAPI_JOYSTICK_FIRSTSLOT \ + (PYGAMEAPI_CDROM_FIRSTSLOT + PYGAMEAPI_CDROM_NUMSLOTS) +#define PYGAMEAPI_JOYSTICK_NUMSLOTS 2 + +typedef struct { + PyObject_HEAD int id; +} pgJoystickObject; + +#define pgJoystick_AsID(x) (((pgJoystickObject *)x)->id) + +#ifndef PYGAMEAPI_JOYSTICK_INTERNAL +#define pgJoystick_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 0]) + +#define pgJoystick_Type \ + (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 0]) +#define pgJoystick_New \ + (*(PyObject * (*)(int)) PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 1]) + +#define import_pygame_joystick() IMPORT_PYGAME_MODULE(joystick, JOYSTICK) +#endif + +/* DISPLAY */ +#define PYGAMEAPI_DISPLAY_FIRSTSLOT \ + (PYGAMEAPI_JOYSTICK_FIRSTSLOT + PYGAMEAPI_JOYSTICK_NUMSLOTS) +#define PYGAMEAPI_DISPLAY_NUMSLOTS 2 + +typedef struct { +#if IS_SDLv1 + PyObject_HEAD SDL_VideoInfo info; +#else + PyObject_HEAD pg_VideoInfo info; +#endif +} pgVidInfoObject; + +#define pgVidInfo_AsVidInfo(x) (((pgVidInfoObject *)x)->info) +#ifndef PYGAMEAPI_DISPLAY_INTERNAL +#define pgVidInfo_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 0]) + +#define pgVidInfo_Type \ + (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 0]) + +#if IS_SDLv1 +#define pgVidInfo_New \ + (*(PyObject * (*)(SDL_VideoInfo *)) \ + PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 1]) +#else +#define pgVidInfo_New \ + (*(PyObject * (*)(pg_VideoInfo *)) \ + PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 1]) +#endif + +#define import_pygame_display() IMPORT_PYGAME_MODULE(display, DISPLAY) +#endif + +/* SURFACE */ +#define PYGAMEAPI_SURFACE_FIRSTSLOT \ + (PYGAMEAPI_DISPLAY_FIRSTSLOT + PYGAMEAPI_DISPLAY_NUMSLOTS) +#define PYGAMEAPI_SURFACE_NUMSLOTS 3 +typedef struct { + PyObject_HEAD SDL_Surface *surf; +#if IS_SDLv2 + int owner; +#endif /* IS_SDLv2 */ + struct pgSubSurface_Data *subsurface; /*ptr to subsurface data (if a + * subsurface)*/ + PyObject *weakreflist; + PyObject *locklist; + PyObject *dependency; +} pgSurfaceObject; +#define pgSurface_AsSurface(x) (((pgSurfaceObject *)x)->surf) +#ifndef PYGAMEAPI_SURFACE_INTERNAL +#define pgSurface_Check(x) \ + (PyObject_IsInstance((x), \ + (PyObject *)PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 0])) +#define pgSurface_Type \ + (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 0]) +#if IS_SDLv1 +#define pgSurface_New \ + (*(PyObject * (*)(SDL_Surface *)) \ + PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 1]) +#else /* IS_SDLv2 */ +#define pgSurface_New2 \ + (*(PyObject * (*)(SDL_Surface *, int)) \ + PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 1]) +#endif /* IS_SDLv2 */ +#define pgSurface_Blit \ + (*(int (*)(PyObject *, PyObject *, SDL_Rect *, SDL_Rect *, \ + int))PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 2]) + +#define import_pygame_surface() \ + do { \ + IMPORT_PYGAME_MODULE(surface, SURFACE); \ + if (PyErr_Occurred() != NULL) \ + break; \ + IMPORT_PYGAME_MODULE(surflock, SURFLOCK); \ + } while (0) + +#if IS_SDLv2 +#define pgSurface_New(surface) pgSurface_New2((surface), 1) +#define pgSurface_NewNoOwn(surface) pgSurface_New2((surface), 0) +#endif /* IS_SDLv2 */ + +#endif + +/* SURFLOCK */ /*auto import/init by surface*/ +#define PYGAMEAPI_SURFLOCK_FIRSTSLOT \ + (PYGAMEAPI_SURFACE_FIRSTSLOT + PYGAMEAPI_SURFACE_NUMSLOTS) +#define PYGAMEAPI_SURFLOCK_NUMSLOTS 8 +struct pgSubSurface_Data { + PyObject *owner; + int pixeloffset; + int offsetx, offsety; +}; + +typedef struct { + PyObject_HEAD PyObject *surface; + PyObject *lockobj; + PyObject *weakrefs; +} pgLifetimeLockObject; + +#ifndef PYGAMEAPI_SURFLOCK_INTERNAL +#define pgLifetimeLock_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 0]) +#define pgSurface_Prep(x) \ + if (((pgSurfaceObject *)x)->subsurface) \ + (*(*(void (*)( \ + PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 1]))(x) + +#define pgSurface_Unprep(x) \ + if (((pgSurfaceObject *)x)->subsurface) \ + (*(*(void (*)( \ + PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 2]))(x) + +#define pgSurface_Lock \ + (*(int (*)(PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 3]) +#define pgSurface_Unlock \ + (*(int (*)(PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 4]) +#define pgSurface_LockBy \ + (*(int (*)(PyObject *, \ + PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 5]) +#define pgSurface_UnlockBy \ + (*(int (*)(PyObject *, \ + PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 6]) +#define pgSurface_LockLifetime \ + (*(PyObject * (*)(PyObject *, PyObject *)) \ + PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 7]) +#endif + +/* EVENT */ +#define PYGAMEAPI_EVENT_FIRSTSLOT \ + (PYGAMEAPI_SURFLOCK_FIRSTSLOT + PYGAMEAPI_SURFLOCK_NUMSLOTS) +#if IS_SDLv1 +#define PYGAMEAPI_EVENT_NUMSLOTS 4 +#else /* IS_SDLv2 */ +#define PYGAMEAPI_EVENT_NUMSLOTS 6 +#endif /* IS_SDLv2 */ + +typedef struct { + PyObject_HEAD int type; + PyObject *dict; +} pgEventObject; + +#ifndef PYGAMEAPI_EVENT_INTERNAL +#define pgEvent_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 0]) +#define pgEvent_Type \ + (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 0]) +#define pgEvent_New \ + (*(PyObject * (*)(SDL_Event *)) \ + PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 1]) +#define pgEvent_New2 \ + (*(PyObject * (*)(int, PyObject *)) \ + PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 2]) +#define pgEvent_FillUserEvent \ + (*(int (*)(pgEventObject *, \ + SDL_Event *))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 3]) +#if IS_SDLv2 +#define pg_EnableKeyRepeat \ + (*(int (*)(int, int))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 4]) +#define pg_GetKeyRepeat \ + (*(void (*)(int *, int *))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 5]) +#endif /* IS_SDLv2 */ +#define import_pygame_event() IMPORT_PYGAME_MODULE(event, EVENT) +#endif + +/* RWOBJECT */ +/*the rwobject are only needed for C side work, not accessable from python*/ +#define PYGAMEAPI_RWOBJECT_FIRSTSLOT \ + (PYGAMEAPI_EVENT_FIRSTSLOT + PYGAMEAPI_EVENT_NUMSLOTS) +#define PYGAMEAPI_RWOBJECT_NUMSLOTS 6 +#ifndef PYGAMEAPI_RWOBJECT_INTERNAL +#define pgRWops_FromObject \ + (*(SDL_RWops * (*)(PyObject *)) \ + PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 0]) +#define pgRWops_IsFileObject \ + (*(int (*)(SDL_RWops *))PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 1]) +#define pg_EncodeFilePath \ + (*(PyObject * (*)(PyObject *, PyObject *)) \ + PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 2]) +#define pg_EncodeString \ + (*(PyObject * (*)(PyObject *, const char *, const char *, PyObject *)) \ + PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 3]) +#define pgRWops_FromFileObject \ + (*(SDL_RWops * (*)(PyObject *)) \ + PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 4]) +#define pgRWops_ReleaseObject \ + (*(int (*)(SDL_RWops *)) \ + PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 5]) +#define import_pygame_rwobject() IMPORT_PYGAME_MODULE(rwobject, RWOBJECT) + +#endif + +/* PixelArray */ +#define PYGAMEAPI_PIXELARRAY_FIRSTSLOT \ + (PYGAMEAPI_RWOBJECT_FIRSTSLOT + PYGAMEAPI_RWOBJECT_NUMSLOTS) +#define PYGAMEAPI_PIXELARRAY_NUMSLOTS 2 +#ifndef PYGAMEAPI_PIXELARRAY_INTERNAL +#define PyPixelArray_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_PIXELARRAY_FIRSTSLOT + 0]) +#define PyPixelArray_New \ + (*(PyObject * (*)) PyGAME_C_API[PYGAMEAPI_PIXELARRAY_FIRSTSLOT + 1]) +#define import_pygame_pixelarray() IMPORT_PYGAME_MODULE(pixelarray, PIXELARRAY) +#endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */ + +/* Color */ +#define PYGAMEAPI_COLOR_FIRSTSLOT \ + (PYGAMEAPI_PIXELARRAY_FIRSTSLOT + PYGAMEAPI_PIXELARRAY_NUMSLOTS) +#define PYGAMEAPI_COLOR_NUMSLOTS 4 +#ifndef PYGAMEAPI_COLOR_INTERNAL +#define pgColor_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 0]) +#define pgColor_Type (*(PyObject *)PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT]) +#define pgColor_New \ + (*(PyObject * (*)(Uint8 *)) PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 1]) +#define pgColor_NewLength \ + (*(PyObject * (*)(Uint8 *, Uint8)) \ + PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 3]) + +#define pg_RGBAFromColorObj \ + (*(int (*)(PyObject *, \ + Uint8 *))PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 2]) +#define import_pygame_color() IMPORT_PYGAME_MODULE(color, COLOR) +#endif /* PYGAMEAPI_COLOR_INTERNAL */ + +/* Math */ +#define PYGAMEAPI_MATH_FIRSTSLOT \ + (PYGAMEAPI_COLOR_FIRSTSLOT + PYGAMEAPI_COLOR_NUMSLOTS) +#define PYGAMEAPI_MATH_NUMSLOTS 2 +#ifndef PYGAMEAPI_MATH_INTERNAL +#define pgVector2_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_MATH_FIRSTSLOT + 0]) +#define pgVector3_Check(x) \ + ((x)->ob_type == \ + (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_MATH_FIRSTSLOT + 1]) +/* +#define pgVector2_New \ + (*(PyObject*(*)) PyGAME_C_API[PYGAMEAPI_MATH_FIRSTSLOT + 1]) +*/ +#define import_pygame_math() IMPORT_PYGAME_MODULE(math, MATH) +#endif /* PYGAMEAPI_MATH_INTERNAL */ + +#define PG_CAPSULE_NAME(m) (IMPPREFIX m "." PYGAMEAPI_LOCAL_ENTRY) + +#define _IMPORT_PYGAME_MODULE(module, MODULE, api_root) \ + { \ + PyObject *_module = PyImport_ImportModule(IMPPREFIX #module); \ + \ + if (_module != NULL) { \ + PyObject *_c_api = \ + PyObject_GetAttrString(_module, PYGAMEAPI_LOCAL_ENTRY); \ + \ + Py_DECREF(_module); \ + if (_c_api != NULL && PyCapsule_CheckExact(_c_api)) { \ + void **localptr = (void **)PyCapsule_GetPointer( \ + _c_api, PG_CAPSULE_NAME(#module)); \ + \ + if (localptr != NULL) { \ + memcpy(api_root + PYGAMEAPI_##MODULE##_FIRSTSLOT, \ + localptr, \ + sizeof(void **) * PYGAMEAPI_##MODULE##_NUMSLOTS); \ + } \ + } \ + Py_XDECREF(_c_api); \ + } \ + } + +#ifndef NO_PYGAME_C_API +#define IMPORT_PYGAME_MODULE(module, MODULE) \ + _IMPORT_PYGAME_MODULE(module, MODULE, PyGAME_C_API) +#define PYGAMEAPI_TOTALSLOTS \ + (PYGAMEAPI_MATH_FIRSTSLOT + PYGAMEAPI_MATH_NUMSLOTS) + +#ifdef PYGAME_H +void *PyGAME_C_API[PYGAMEAPI_TOTALSLOTS] = {NULL}; +#else +extern void *PyGAME_C_API[PYGAMEAPI_TOTALSLOTS]; +#endif +#endif + +#if PG_HAVE_CAPSULE +#define encapsulate_api(ptr, module) \ + PyCapsule_New(ptr, PG_CAPSULE_NAME(module), NULL) +#else +#define encapsulate_api(ptr, module) PyCObject_FromVoidPtr(ptr, NULL) +#endif + +#ifndef PG_INLINE +#if defined(__clang__) +#define PG_INLINE __inline__ __attribute__((__unused__)) +#elif defined(__GNUC__) +#define PG_INLINE __inline__ +#elif defined(_MSC_VER) +#define PG_INLINE __inline +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define PG_INLINE inline +#else +#define PG_INLINE +#endif +#endif + +/*last platform compiler stuff*/ +#if defined(macintosh) && defined(__MWERKS__) || defined(__SYMBIAN32__) +#define PYGAME_EXPORT __declspec(export) +#else +#define PYGAME_EXPORT +#endif + + +#endif /* PYGAME_H */ diff --git a/venv/Include/site/python3.7/pygame/_surface.h b/venv/Include/site/python3.7/pygame/_surface.h new file mode 100644 index 0000000..016aac0 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/_surface.h @@ -0,0 +1,31 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + Copyright (C) 2007 Marcus von Appen + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +#ifndef _SURFACE_H +#define _SURFACE_H + +#include "_pygame.h" +#include "surface.h" + +#endif + diff --git a/venv/Include/site/python3.7/pygame/bitmask.h b/venv/Include/site/python3.7/pygame/bitmask.h new file mode 100644 index 0000000..1230497 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/bitmask.h @@ -0,0 +1,146 @@ +/* + Bitmask 1.7 - A pixel-perfect collision detection library. + + Copyright (C) 2002-2005 Ulf Ekstrom except for the bitcount + function which is copyright (C) Donald W. Gillies, 1992. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef BITMASK_H +#define BITMASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +/* Define INLINE for different compilers. If your compiler does not + support inlining then there might be a performance hit in + bitmask_overlap_area(). +*/ +#ifndef INLINE +# ifdef __GNUC__ +# define INLINE inline +# else +# ifdef _MSC_VER +# define INLINE __inline +# else +# define INLINE +# endif +# endif +#endif + +#define BITMASK_W unsigned long int +#define BITMASK_W_LEN (sizeof(BITMASK_W)*CHAR_BIT) +#define BITMASK_W_MASK (BITMASK_W_LEN - 1) +#define BITMASK_N(n) ((BITMASK_W)1 << (n)) + +typedef struct bitmask +{ + int w,h; + BITMASK_W bits[1]; +} bitmask_t; + +/* Creates a bitmask of width w and height h, where + w and h must both be greater than or equal to 0. + The mask is automatically cleared when created. + */ +bitmask_t *bitmask_create(int w, int h); + +/* Frees all the memory allocated by bitmask_create for m. */ +void bitmask_free(bitmask_t *m); + +/* Clears all bits in the mask */ +void bitmask_clear(bitmask_t *m); + +/* Sets all bits in the mask */ +void bitmask_fill(bitmask_t *m); + +/* Flips all bits in the mask */ +void bitmask_invert(bitmask_t *m); + +/* Counts the bits in the mask */ +unsigned int bitmask_count(bitmask_t *m); + +/* Returns nonzero if the bit at (x,y) is set. Coordinates start at + (0,0) */ +static INLINE int bitmask_getbit(const bitmask_t *m, int x, int y) +{ + return (m->bits[x/BITMASK_W_LEN*m->h + y] & BITMASK_N(x & BITMASK_W_MASK)) != 0; +} + +/* Sets the bit at (x,y) */ +static INLINE void bitmask_setbit(bitmask_t *m, int x, int y) +{ + m->bits[x/BITMASK_W_LEN*m->h + y] |= BITMASK_N(x & BITMASK_W_MASK); +} + +/* Clears the bit at (x,y) */ +static INLINE void bitmask_clearbit(bitmask_t *m, int x, int y) +{ + m->bits[x/BITMASK_W_LEN*m->h + y] &= ~BITMASK_N(x & BITMASK_W_MASK); +} + +/* Returns nonzero if the masks overlap with the given offset. + The overlap tests uses the following offsets (which may be negative): + + +----+----------.. + |A | yoffset + | +-+----------.. + +--|B + |xoffset + | | + : : +*/ +int bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); + +/* Like bitmask_overlap(), but will also give a point of intersection. + x and y are given in the coordinates of mask a, and are untouched + if there is no overlap. */ +int bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, + int xoffset, int yoffset, int *x, int *y); + +/* Returns the number of overlapping 'pixels' */ +int bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); + +/* Fills a mask with the overlap of two other masks. A bitwise AND. */ +void bitmask_overlap_mask (const bitmask_t *a, const bitmask_t *b, bitmask_t *c, int xoffset, int yoffset); + +/* Draws mask b onto mask a (bitwise OR). Can be used to compose large + (game background?) mask from several submasks, which may speed up + the testing. */ + +void bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); + +void bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); + +/* Return a new scaled bitmask, with dimensions w*h. The quality of the + scaling may not be perfect for all circumstances, but it should + be reasonable. If either w or h is 0 a clear 1x1 mask is returned. */ +bitmask_t *bitmask_scale(const bitmask_t *m, int w, int h); + +/* Convolve b into a, drawing the output into o, shifted by offset. If offset + * is 0, then the (x,y) bit will be set if and only if + * bitmask_overlap(a, b, x - b->w - 1, y - b->h - 1) returns true. + * + * Modifies bits o[xoffset ... xoffset + a->w + b->w - 1) + * [yoffset ... yoffset + a->h + b->h - 1). */ +void bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *o, int xoffset, int yoffset); + +#ifdef __cplusplus +} /* End of extern "C" { */ +#endif + +#endif diff --git a/venv/Include/site/python3.7/pygame/camera.h b/venv/Include/site/python3.7/pygame/camera.h new file mode 100644 index 0000000..46d2beb --- /dev/null +++ b/venv/Include/site/python3.7/pygame/camera.h @@ -0,0 +1,201 @@ +/* + pygame - Python Game Library + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include "pygame.h" +#include "doc/camera_doc.h" + +#if defined(__unix__) + #include + #include + #include + #include + #include + + #include /* low-level i/o */ + #include + #include + #include + #include + #include + #include + #include + + /* on freebsd there is no asm/types */ + #ifdef linux + #include /* for videodev2.h */ + #endif + + #include +#elif defined(__APPLE__) + #include + /* We support OSX 10.6 and below. */ + #if __MAC_OS_X_VERSION_MAX_ALLOWED <= 1060 + #define PYGAME_MAC_CAMERA_OLD 1 + #endif +#endif + +#if defined(PYGAME_MAC_CAMERA_OLD) + #include + #include + #include +#endif + +/* some constants used which are not defined on non-v4l machines. */ +#ifndef V4L2_PIX_FMT_RGB24 + #define V4L2_PIX_FMT_RGB24 'RGB3' +#endif +#ifndef V4L2_PIX_FMT_RGB444 + #define V4L2_PIX_FMT_RGB444 'R444' +#endif +#ifndef V4L2_PIX_FMT_YUYV + #define V4L2_PIX_FMT_YUYV 'YUYV' +#endif + +#define CLEAR(x) memset (&(x), 0, sizeof (x)) +#define SAT(c) if (c & (~255)) { if (c < 0) c = 0; else c = 255; } +#define SAT2(c) ((c) & (~255) ? ((c) < 0 ? 0 : 255) : (c)) +#define DEFAULT_WIDTH 640 +#define DEFAULT_HEIGHT 480 +#define RGB_OUT 1 +#define YUV_OUT 2 +#define HSV_OUT 4 +#define CAM_V4L 1 /* deprecated. the incomplete support in pygame was removed */ +#define CAM_V4L2 2 + +struct buffer { + void * start; + size_t length; +}; + +#if defined(__unix__) +typedef struct pgCameraObject { + PyObject_HEAD + char* device_name; + int camera_type; + unsigned long pixelformat; + unsigned int color_out; + struct buffer* buffers; + unsigned int n_buffers; + int width; + int height; + int size; + int hflip; + int vflip; + int brightness; + int fd; +} pgCameraObject; +#elif defined(PYGAME_MAC_CAMERA_OLD) +typedef struct pgCameraObject { + PyObject_HEAD + char* device_name; /* unieke name of the device */ + OSType pixelformat; + unsigned int color_out; + SeqGrabComponent component; /* A type used by the Sequence Grabber API */ + SGChannel channel; /* Channel of the Sequence Grabber */ + GWorldPtr gworld; /* Pointer to the struct that holds the data of the captured image */ + Rect boundsRect; /* bounds of the image frame */ + long size; /* size of the image in our buffer to draw */ + int hflip; + int vflip; + short depth; + struct buffer pixels; + //struct buffer tmp_pixels /* place where the flipped image in temporarly stored if hflip or vflip is true.*/ +} pgCameraObject; + +#else +/* generic definition. +*/ + +typedef struct pgCameraObject { + PyObject_HEAD + char* device_name; + int camera_type; + unsigned long pixelformat; + unsigned int color_out; + struct buffer* buffers; + unsigned int n_buffers; + int width; + int height; + int size; + int hflip; + int vflip; + int brightness; + int fd; +} pgCameraObject; +#endif + +/* internal functions for colorspace conversion */ +void colorspace (SDL_Surface *src, SDL_Surface *dst, int cspace); +void rgb24_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); +void rgb444_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); +void rgb_to_yuv (const void* src, void* dst, int length, + unsigned long source, SDL_PixelFormat* format); +void rgb_to_hsv (const void* src, void* dst, int length, + unsigned long source, SDL_PixelFormat* format); +void yuyv_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); +void yuyv_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format); +void uyvy_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); +void uyvy_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format); +void sbggr8_to_rgb (const void* src, void* dst, int width, int height, + SDL_PixelFormat* format); +void yuv420_to_rgb (const void* src, void* dst, int width, int height, + SDL_PixelFormat* format); +void yuv420_to_yuv (const void* src, void* dst, int width, int height, + SDL_PixelFormat* format); + +#if defined(__unix__) +/* internal functions specific to v4l2 */ +char** v4l2_list_cameras (int* num_devices); +int v4l2_get_control (int fd, int id, int *value); +int v4l2_set_control (int fd, int id, int value); +PyObject* v4l2_read_raw (pgCameraObject* self); +int v4l2_xioctl (int fd, int request, void *arg); +int v4l2_process_image (pgCameraObject* self, const void *image, + unsigned int buffer_size, SDL_Surface* surf); +int v4l2_query_buffer (pgCameraObject* self); +int v4l2_read_frame (pgCameraObject* self, SDL_Surface* surf); +int v4l2_stop_capturing (pgCameraObject* self); +int v4l2_start_capturing (pgCameraObject* self); +int v4l2_uninit_device (pgCameraObject* self); +int v4l2_init_mmap (pgCameraObject* self); +int v4l2_init_device (pgCameraObject* self); +int v4l2_close_device (pgCameraObject* self); +int v4l2_open_device (pgCameraObject* self); + +#elif defined(PYGAME_MAC_CAMERA_OLD) +/* internal functions specific to mac */ +char** mac_list_cameras(int* num_devices); +int mac_open_device (pgCameraObject* self); +int mac_init_device(pgCameraObject* self); +int mac_close_device (pgCameraObject* self); +int mac_start_capturing(pgCameraObject* self); +int mac_stop_capturing (pgCameraObject* self); + +int mac_get_control(pgCameraObject* self, int id, int* value); +int mac_set_control(pgCameraObject* self, int id, int value); + +PyObject* mac_read_raw(pgCameraObject *self); +int mac_read_frame(pgCameraObject* self, SDL_Surface* surf); +int mac_camera_idle(pgCameraObject* self); +int mac_copy_gworld_to_surface(pgCameraObject* self, SDL_Surface* surf); + +void flip_image(const void* image, void* flipped_image, int width, int height, + short depth, int hflip, int vflip); + +#endif diff --git a/venv/Include/site/python3.7/pygame/fastevents.h b/venv/Include/site/python3.7/pygame/fastevents.h new file mode 100644 index 0000000..04098c3 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/fastevents.h @@ -0,0 +1,48 @@ +#ifndef _FASTEVENTS_H_ +#define _FASTEVENTS_H_ +/* + NET2 is a threaded, event based, network IO library for SDL. + Copyright (C) 2002 Bob Pendleton + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 2.1 + of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA + + If you do not wish to comply with the terms of the LGPL please + contact the author as other terms are available for a fee. + + Bob Pendleton + Bob@Pendleton.com +*/ + +#include "SDL.h" + +#ifdef __cplusplus +extern "C" { +#endif + + int FE_Init(void); // Initialize FE + void FE_Quit(void); // shutdown FE + + void FE_PumpEvents(void); // replacement for SDL_PumpEvents + int FE_PollEvent(SDL_Event *event); // replacement for SDL_PollEvent + int FE_WaitEvent(SDL_Event *event); // replacement for SDL_WaitEvent + int FE_PushEvent(SDL_Event *event); // replacement for SDL_PushEvent + + char *FE_GetError(void); // get the last error +#ifdef __cplusplus +} +#endif + +#endif diff --git a/venv/Include/site/python3.7/pygame/font.h b/venv/Include/site/python3.7/pygame/font.h new file mode 100644 index 0000000..b861a29 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/font.h @@ -0,0 +1,57 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +#include +#if defined(HAVE_SNPRINTF) /* also defined in SDL_ttf (SDL.h) */ +#undef HAVE_SNPRINTF /* remove GCC macro redefine warning */ +#endif +#include + + +/* test font initialization */ +#define FONT_INIT_CHECK() \ + if(!(*(int*)PyFONT_C_API[2])) \ + return RAISE(pgExc_SDLError, "font system not initialized") + + + +#define PYGAMEAPI_FONT_FIRSTSLOT 0 +#define PYGAMEAPI_FONT_NUMSLOTS 3 +typedef struct { + PyObject_HEAD + TTF_Font* font; + PyObject* weakreflist; +} PyFontObject; +#define PyFont_AsFont(x) (((PyFontObject*)x)->font) + +#ifndef PYGAMEAPI_FONT_INTERNAL +#define PyFont_Check(x) ((x)->ob_type == (PyTypeObject*)PyFONT_C_API[0]) +#define PyFont_Type (*(PyTypeObject*)PyFONT_C_API[0]) +#define PyFont_New (*(PyObject*(*)(TTF_Font*))PyFONT_C_API[1]) +/*slot 2 taken by FONT_INIT_CHECK*/ + +#define import_pygame_font() \ + _IMPORT_PYGAME_MODULE(font, FONT, PyFONT_C_API) + +static void* PyFONT_C_API[PYGAMEAPI_FONT_NUMSLOTS] = {NULL}; +#endif + diff --git a/venv/Include/site/python3.7/pygame/freetype.h b/venv/Include/site/python3.7/pygame/freetype.h new file mode 100644 index 0000000..fda7226 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/freetype.h @@ -0,0 +1,137 @@ +/* + pygame - Python Game Library + Copyright (C) 2009 Vicent Marti + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ +#ifndef _PYGAME_FREETYPE_H_ +#define _PYGAME_FREETYPE_H_ + +#define PGFT_PYGAME1_COMPAT +#define HAVE_PYGAME_SDL_VIDEO +#define HAVE_PYGAME_SDL_RWOPS + +#include "pygame.h" +#include "pgcompat.h" + +#if PY3 +# define IS_PYTHON_3 +#endif + +#include +#include FT_FREETYPE_H +#include FT_CACHE_H +#include FT_XFREE86_H +#include FT_TRIGONOMETRY_H + +/********************************************************** + * Global module constants + **********************************************************/ + +/* Render styles */ +#define FT_STYLE_NORMAL 0x00 +#define FT_STYLE_STRONG 0x01 +#define FT_STYLE_OBLIQUE 0x02 +#define FT_STYLE_UNDERLINE 0x04 +#define FT_STYLE_WIDE 0x08 +#define FT_STYLE_DEFAULT 0xFF + +/* Bounding box modes */ +#define FT_BBOX_EXACT FT_GLYPH_BBOX_SUBPIXELS +#define FT_BBOX_EXACT_GRIDFIT FT_GLYPH_BBOX_GRIDFIT +#define FT_BBOX_PIXEL FT_GLYPH_BBOX_TRUNCATE +#define FT_BBOX_PIXEL_GRIDFIT FT_GLYPH_BBOX_PIXELS + +/* Rendering flags */ +#define FT_RFLAG_NONE (0) +#define FT_RFLAG_ANTIALIAS (1 << 0) +#define FT_RFLAG_AUTOHINT (1 << 1) +#define FT_RFLAG_VERTICAL (1 << 2) +#define FT_RFLAG_HINTED (1 << 3) +#define FT_RFLAG_KERNING (1 << 4) +#define FT_RFLAG_TRANSFORM (1 << 5) +#define FT_RFLAG_PAD (1 << 6) +#define FT_RFLAG_ORIGIN (1 << 7) +#define FT_RFLAG_UCS4 (1 << 8) +#define FT_RFLAG_USE_BITMAP_STRIKES (1 << 9) +#define FT_RFLAG_DEFAULTS (FT_RFLAG_HINTED | \ + FT_RFLAG_USE_BITMAP_STRIKES | \ + FT_RFLAG_ANTIALIAS) + + +#define FT_RENDER_NEWBYTEARRAY 0x0 +#define FT_RENDER_NEWSURFACE 0x1 +#define FT_RENDER_EXISTINGSURFACE 0x2 + +/********************************************************** + * Global module types + **********************************************************/ + +typedef struct _scale_s { + FT_UInt x, y; +} Scale_t; +typedef FT_Angle Angle_t; + +struct fontinternals_; +struct freetypeinstance_; + +typedef struct { + FT_Long font_index; + FT_Open_Args open_args; +} pgFontId; + +typedef struct { + PyObject_HEAD + pgFontId id; + PyObject *path; + int is_scalable; + + Scale_t face_size; + FT_Int16 style; + FT_Int16 render_flags; + double strength; + double underline_adjustment; + FT_UInt resolution; + Angle_t rotation; + FT_Matrix transform; + FT_Byte fgcolor[4]; + + struct freetypeinstance_ *freetype; /* Personal reference */ + struct fontinternals_ *_internals; +} pgFontObject; + +#define pgFont_IS_ALIVE(o) \ + (((pgFontObject *)(o))->_internals != 0) + +/********************************************************** + * Module declaration + **********************************************************/ +#define PYGAMEAPI_FREETYPE_FIRSTSLOT 0 +#define PYGAMEAPI_FREETYPE_NUMSLOTS 2 + +#ifndef PYGAME_FREETYPE_INTERNAL + +#define pgFont_Check(x) ((x)->ob_type == (PyTypeObject*)PgFREETYPE_C_API[0]) +#define pgFont_Type (*(PyTypeObject*)PgFREETYPE_C_API[1]) +#define pgFont_New (*(PyObject*(*)(const char*, long))PgFREETYPE_C_API[1]) + +#define import_pygame_freetype() \ + _IMPORT_PYGAME_MODULE(freetype, FREETYPE, PgFREETYPE_C_API) + +static void *PgFREETYPE_C_API[PYGAMEAPI_FREETYPE_NUMSLOTS] = {0}; +#endif /* PYGAME_FREETYPE_INTERNAL */ + +#endif /* _PYGAME_FREETYPE_H_ */ diff --git a/venv/Include/site/python3.7/pygame/mask.h b/venv/Include/site/python3.7/pygame/mask.h new file mode 100644 index 0000000..b151dd4 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/mask.h @@ -0,0 +1,25 @@ +#include +#include "bitmask.h" + +#define PYGAMEAPI_MASK_FIRSTSLOT 0 +#define PYGAMEAPI_MASK_NUMSLOTS 1 +#define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API" + +typedef struct { + PyObject_HEAD + bitmask_t *mask; +} pgMaskObject; + +#define pgMask_AsBitmap(x) (((pgMaskObject*)x)->mask) + +#ifndef PYGAMEAPI_MASK_INTERNAL + +#define pgMask_Type (*(PyTypeObject*)PyMASK_C_API[0]) +#define pgMask_Check(x) ((x)->ob_type == &pgMask_Type) + +#define import_pygame_mask() \ + _IMPORT_PYGAME_MODULE(mask, MASK, PyMASK_C_API) + +static void* PyMASK_C_API[PYGAMEAPI_MASK_NUMSLOTS] = {NULL}; +#endif /* #ifndef PYGAMEAPI_MASK_INTERNAL */ + diff --git a/venv/Include/site/python3.7/pygame/mixer.h b/venv/Include/site/python3.7/pygame/mixer.h new file mode 100644 index 0000000..36d57f3 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/mixer.h @@ -0,0 +1,65 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +#include +#include +#include + + +/* test mixer initializations */ +#define MIXER_INIT_CHECK() \ + if(!SDL_WasInit(SDL_INIT_AUDIO)) \ + return RAISE(pgExc_SDLError, "mixer not initialized") + + +#define PYGAMEAPI_MIXER_FIRSTSLOT 0 +#define PYGAMEAPI_MIXER_NUMSLOTS 7 +typedef struct { + PyObject_HEAD + Mix_Chunk *chunk; + Uint8 *mem; + PyObject *weakreflist; +} pgSoundObject; +typedef struct { + PyObject_HEAD + int chan; +} pgChannelObject; +#define pgSound_AsChunk(x) (((pgSoundObject*)x)->chunk) +#define pgChannel_AsInt(x) (((pgChannelObject*)x)->chan) + +#ifndef PYGAMEAPI_MIXER_INTERNAL +#define pgSound_Check(x) ((x)->ob_type == (PyTypeObject*)pgMIXER_C_API[0]) +#define pgSound_Type (*(PyTypeObject*)pgMIXER_C_API[0]) +#define pgSound_New (*(PyObject*(*)(Mix_Chunk*))pgMIXER_C_API[1]) +#define pgSound_Play (*(PyObject*(*)(PyObject*, PyObject*))pgMIXER_C_API[2]) +#define pgChannel_Check(x) ((x)->ob_type == (PyTypeObject*)pgMIXER_C_API[3]) +#define pgChannel_Type (*(PyTypeObject*)pgMIXER_C_API[3]) +#define pgChannel_New (*(PyObject*(*)(int))pgMIXER_C_API[4]) +#define pgMixer_AutoInit (*(PyObject*(*)(PyObject*, PyObject*))pgMIXER_C_API[5]) +#define pgMixer_AutoQuit (*(void(*)(void))pgMIXER_C_API[6]) + +#define import_pygame_mixer() \ + _IMPORT_PYGAME_MODULE(mixer, MIXER, pgMIXER_C_API) + +static void* pgMIXER_C_API[PYGAMEAPI_MIXER_NUMSLOTS] = {NULL}; +#endif + diff --git a/venv/Include/site/python3.7/pygame/palette.h b/venv/Include/site/python3.7/pygame/palette.h new file mode 100644 index 0000000..1ae4cf6 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/palette.h @@ -0,0 +1,123 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +#ifndef PALETTE_H +#define PALETTE_H + +#include + +/* SDL 2 does not assign a default palette color scheme to a new 8 bit + * surface. Instead, the palette is set all white. This defines the SDL 1.2 + * default palette. + */ +static const SDL_Color default_palette_colors[] = { + {0, 0, 0, 255}, {0, 0, 85, 255}, {0, 0, 170, 255}, + {0, 0, 255, 255}, {0, 36, 0, 255}, {0, 36, 85, 255}, + {0, 36, 170, 255}, {0, 36, 255, 255}, {0, 73, 0, 255}, + {0, 73, 85, 255}, {0, 73, 170, 255}, {0, 73, 255, 255}, + {0, 109, 0, 255}, {0, 109, 85, 255}, {0, 109, 170, 255}, + {0, 109, 255, 255}, {0, 146, 0, 255}, {0, 146, 85, 255}, + {0, 146, 170, 255}, {0, 146, 255, 255}, {0, 182, 0, 255}, + {0, 182, 85, 255}, {0, 182, 170, 255}, {0, 182, 255, 255}, + {0, 219, 0, 255}, {0, 219, 85, 255}, {0, 219, 170, 255}, + {0, 219, 255, 255}, {0, 255, 0, 255}, {0, 255, 85, 255}, + {0, 255, 170, 255}, {0, 255, 255, 255}, {85, 0, 0, 255}, + {85, 0, 85, 255}, {85, 0, 170, 255}, {85, 0, 255, 255}, + {85, 36, 0, 255}, {85, 36, 85, 255}, {85, 36, 170, 255}, + {85, 36, 255, 255}, {85, 73, 0, 255}, {85, 73, 85, 255}, + {85, 73, 170, 255}, {85, 73, 255, 255}, {85, 109, 0, 255}, + {85, 109, 85, 255}, {85, 109, 170, 255}, {85, 109, 255, 255}, + {85, 146, 0, 255}, {85, 146, 85, 255}, {85, 146, 170, 255}, + {85, 146, 255, 255}, {85, 182, 0, 255}, {85, 182, 85, 255}, + {85, 182, 170, 255}, {85, 182, 255, 255}, {85, 219, 0, 255}, + {85, 219, 85, 255}, {85, 219, 170, 255}, {85, 219, 255, 255}, + {85, 255, 0, 255}, {85, 255, 85, 255}, {85, 255, 170, 255}, + {85, 255, 255, 255}, {170, 0, 0, 255}, {170, 0, 85, 255}, + {170, 0, 170, 255}, {170, 0, 255, 255}, {170, 36, 0, 255}, + {170, 36, 85, 255}, {170, 36, 170, 255}, {170, 36, 255, 255}, + {170, 73, 0, 255}, {170, 73, 85, 255}, {170, 73, 170, 255}, + {170, 73, 255, 255}, {170, 109, 0, 255}, {170, 109, 85, 255}, + {170, 109, 170, 255}, {170, 109, 255, 255}, {170, 146, 0, 255}, + {170, 146, 85, 255}, {170, 146, 170, 255}, {170, 146, 255, 255}, + {170, 182, 0, 255}, {170, 182, 85, 255}, {170, 182, 170, 255}, + {170, 182, 255, 255}, {170, 219, 0, 255}, {170, 219, 85, 255}, + {170, 219, 170, 255}, {170, 219, 255, 255}, {170, 255, 0, 255}, + {170, 255, 85, 255}, {170, 255, 170, 255}, {170, 255, 255, 255}, + {255, 0, 0, 255}, {255, 0, 85, 255}, {255, 0, 170, 255}, + {255, 0, 255, 255}, {255, 36, 0, 255}, {255, 36, 85, 255}, + {255, 36, 170, 255}, {255, 36, 255, 255}, {255, 73, 0, 255}, + {255, 73, 85, 255}, {255, 73, 170, 255}, {255, 73, 255, 255}, + {255, 109, 0, 255}, {255, 109, 85, 255}, {255, 109, 170, 255}, + {255, 109, 255, 255}, {255, 146, 0, 255}, {255, 146, 85, 255}, + {255, 146, 170, 255}, {255, 146, 255, 255}, {255, 182, 0, 255}, + {255, 182, 85, 255}, {255, 182, 170, 255}, {255, 182, 255, 255}, + {255, 219, 0, 255}, {255, 219, 85, 255}, {255, 219, 170, 255}, + {255, 219, 255, 255}, {255, 255, 0, 255}, {255, 255, 85, 255}, + {255, 255, 170, 255}, {255, 255, 255, 255}, {0, 0, 0, 255}, + {0, 0, 85, 255}, {0, 0, 170, 255}, {0, 0, 255, 255}, + {0, 36, 0, 255}, {0, 36, 85, 255}, {0, 36, 170, 255}, + {0, 36, 255, 255}, {0, 73, 0, 255}, {0, 73, 85, 255}, + {0, 73, 170, 255}, {0, 73, 255, 255}, {0, 109, 0, 255}, + {0, 109, 85, 255}, {0, 109, 170, 255}, {0, 109, 255, 255}, + {0, 146, 0, 255}, {0, 146, 85, 255}, {0, 146, 170, 255}, + {0, 146, 255, 255}, {0, 182, 0, 255}, {0, 182, 85, 255}, + {0, 182, 170, 255}, {0, 182, 255, 255}, {0, 219, 0, 255}, + {0, 219, 85, 255}, {0, 219, 170, 255}, {0, 219, 255, 255}, + {0, 255, 0, 255}, {0, 255, 85, 255}, {0, 255, 170, 255}, + {0, 255, 255, 255}, {85, 0, 0, 255}, {85, 0, 85, 255}, + {85, 0, 170, 255}, {85, 0, 255, 255}, {85, 36, 0, 255}, + {85, 36, 85, 255}, {85, 36, 170, 255}, {85, 36, 255, 255}, + {85, 73, 0, 255}, {85, 73, 85, 255}, {85, 73, 170, 255}, + {85, 73, 255, 255}, {85, 109, 0, 255}, {85, 109, 85, 255}, + {85, 109, 170, 255}, {85, 109, 255, 255}, {85, 146, 0, 255}, + {85, 146, 85, 255}, {85, 146, 170, 255}, {85, 146, 255, 255}, + {85, 182, 0, 255}, {85, 182, 85, 255}, {85, 182, 170, 255}, + {85, 182, 255, 255}, {85, 219, 0, 255}, {85, 219, 85, 255}, + {85, 219, 170, 255}, {85, 219, 255, 255}, {85, 255, 0, 255}, + {85, 255, 85, 255}, {85, 255, 170, 255}, {85, 255, 255, 255}, + {170, 0, 0, 255}, {170, 0, 85, 255}, {170, 0, 170, 255}, + {170, 0, 255, 255}, {170, 36, 0, 255}, {170, 36, 85, 255}, + {170, 36, 170, 255}, {170, 36, 255, 255}, {170, 73, 0, 255}, + {170, 73, 85, 255}, {170, 73, 170, 255}, {170, 73, 255, 255}, + {170, 109, 0, 255}, {170, 109, 85, 255}, {170, 109, 170, 255}, + {170, 109, 255, 255}, {170, 146, 0, 255}, {170, 146, 85, 255}, + {170, 146, 170, 255}, {170, 146, 255, 255}, {170, 182, 0, 255}, + {170, 182, 85, 255}, {170, 182, 170, 255}, {170, 182, 255, 255}, + {170, 219, 0, 255}, {170, 219, 85, 255}, {170, 219, 170, 255}, + {170, 219, 255, 255}, {170, 255, 0, 255}, {170, 255, 85, 255}, + {170, 255, 170, 255}, {170, 255, 255, 255}, {255, 0, 0, 255}, + {255, 0, 85, 255}, {255, 0, 170, 255}, {255, 0, 255, 255}, + {255, 36, 0, 255}, {255, 36, 85, 255}, {255, 36, 170, 255}, + {255, 36, 255, 255}, {255, 73, 0, 255}, {255, 73, 85, 255}, + {255, 73, 170, 255}, {255, 73, 255, 255}, {255, 109, 0, 255}, + {255, 109, 85, 255}, {255, 109, 170, 255}, {255, 109, 255, 255}, + {255, 146, 0, 255}, {255, 146, 85, 255}, {255, 146, 170, 255}, + {255, 146, 255, 255}, {255, 182, 0, 255}, {255, 182, 85, 255}, + {255, 182, 170, 255}, {255, 182, 255, 255}, {255, 219, 0, 255}, + {255, 219, 85, 255}, {255, 219, 170, 255}, {255, 219, 255, 255}, + {255, 255, 0, 255}, {255, 255, 85, 255}, {255, 255, 170, 255}, + {255, 255, 255, 255}}; + +static const int default_palette_size = + (int)(sizeof(default_palette_colors) / sizeof(SDL_Color)); + +#endif diff --git a/venv/Include/site/python3.7/pygame/pgarrinter.h b/venv/Include/site/python3.7/pygame/pgarrinter.h new file mode 100644 index 0000000..5ba096b --- /dev/null +++ b/venv/Include/site/python3.7/pygame/pgarrinter.h @@ -0,0 +1,26 @@ +/* array structure interface version 3 declarations */ + +#if !defined(PG_ARRAYINTER_HEADER) +#define PG_ARRAYINTER_HEADER + +static const int PAI_CONTIGUOUS = 0x01; +static const int PAI_FORTRAN = 0x02; +static const int PAI_ALIGNED = 0x100; +static const int PAI_NOTSWAPPED = 0x200; +static const int PAI_WRITEABLE = 0x400; +static const int PAI_ARR_HAS_DESCR = 0x800; + +typedef struct { + int two; /* contains the integer 2 -- simple sanity check */ + int nd; /* number of dimensions */ + char typekind; /* kind in array -- character code of typestr */ + int itemsize; /* size of each element */ + int flags; /* flags indicating how the data should be */ + /* interpreted */ + Py_intptr_t *shape; /* A length-nd array of shape information */ + Py_intptr_t *strides; /* A length-nd array of stride information */ + void *data; /* A pointer to the first element of the array */ + PyObject *descr; /* NULL or a data-description */ +} PyArrayInterface; + +#endif diff --git a/venv/Include/site/python3.7/pygame/pgbufferproxy.h b/venv/Include/site/python3.7/pygame/pgbufferproxy.h new file mode 100644 index 0000000..92dc2f0 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/pgbufferproxy.h @@ -0,0 +1,52 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + Copyright (C) 2007 Rene Dudfield, Richard Goedeken + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +/* Bufferproxy module C api. + Depends on pygame.h being included first. + */ +#if !defined(PG_BUFPROXY_HEADER) + +#define PYGAMEAPI_BUFPROXY_NUMSLOTS 4 +#define PYGAMEAPI_BUFPROXY_FIRSTSLOT 0 + +#if !(defined(PYGAMEAPI_BUFPROXY_INTERNAL) || defined(NO_PYGAME_C_API)) +static void *PgBUFPROXY_C_API[PYGAMEAPI_BUFPROXY_NUMSLOTS]; + +typedef PyObject *(*_pgbufproxy_new_t)(PyObject *, getbufferproc); +typedef PyObject *(*_pgbufproxy_get_obj_t)(PyObject *); +typedef int (*_pgbufproxy_trip_t)(PyObject *); + +#define pgBufproxy_Type (*(PyTypeObject*)PgBUFPROXY_C_API[0]) +#define pgBufproxy_New (*(_pgbufproxy_new_t)PgBUFPROXY_C_API[1]) +#define pgBufproxy_GetParent \ + (*(_pgbufproxy_get_obj_t)PgBUFPROXY_C_API[2]) +#define pgBufproxy_Trip (*(_pgbufproxy_trip_t)PgBUFPROXY_C_API[3]) +#define pgBufproxy_Check(x) ((x)->ob_type == (pgBufproxy_Type)) +#define import_pygame_bufferproxy() \ + _IMPORT_PYGAME_MODULE(bufferproxy, BUFPROXY, PgBUFPROXY_C_API) + +#endif /* #if !(defined(PYGAMEAPI_BUFPROXY_INTERNAL) || ... */ + +#define PG_BUFPROXY_HEADER + +#endif /* #if !defined(PG_BUFPROXY_HEADER) */ diff --git a/venv/Include/site/python3.7/pygame/pgcompat.h b/venv/Include/site/python3.7/pygame/pgcompat.h new file mode 100644 index 0000000..9eb1b88 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/pgcompat.h @@ -0,0 +1,195 @@ +/* Python 2.x/3.x compitibility tools + */ + +#if !defined(PGCOMPAT_H) +#define PGCOMPAT_H + +#if PY_MAJOR_VERSION >= 3 + +#define PY3 1 + +/* Define some aliases for the removed PyInt_* functions */ +#define PyInt_Check(op) PyLong_Check(op) +#define PyInt_FromString PyLong_FromString +#define PyInt_FromUnicode PyLong_FromUnicode +#define PyInt_FromLong PyLong_FromLong +#define PyInt_FromSize_t PyLong_FromSize_t +#define PyInt_FromSsize_t PyLong_FromSsize_t +#define PyInt_AsLong PyLong_AsLong +#define PyInt_AsSsize_t PyLong_AsSsize_t +#define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask +#define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask +#define PyInt_AS_LONG PyLong_AS_LONG +#define PyNumber_Int PyNumber_Long + +/* Weakrefs flags changed in 3.x */ +#define Py_TPFLAGS_HAVE_WEAKREFS 0 + +/* Module init function returns new module instance. */ +#define MODINIT_RETURN(x) return x +#define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC PyInit_##mod_name (void) +#define DECREF_MOD(mod) Py_DECREF (mod) + +/* Type header differs. */ +#define TYPE_HEAD(x,y) PyVarObject_HEAD_INIT(x,y) + +/* Text interface. Use unicode strings. */ +#define Text_Type PyUnicode_Type +#define Text_Check PyUnicode_Check + +#ifndef PYPY_VERSION +#define Text_FromLocale(s) PyUnicode_DecodeLocale((s), "strict") +#else /* PYPY_VERSION */ +/* workaround: missing function for pypy */ +#define Text_FromLocale PyUnicode_FromString +#endif /* PYPY_VERSION */ + +#define Text_FromUTF8 PyUnicode_FromString +#define Text_FromUTF8AndSize PyUnicode_FromStringAndSize +#define Text_FromFormat PyUnicode_FromFormat +#define Text_GetSize PyUnicode_GetSize +#define Text_GET_SIZE PyUnicode_GET_SIZE + +/* Binary interface. Use bytes. */ +#define Bytes_Type PyBytes_Type +#define Bytes_Check PyBytes_Check +#define Bytes_Size PyBytes_Size +#define Bytes_AsString PyBytes_AsString +#define Bytes_AsStringAndSize PyBytes_AsStringAndSize +#define Bytes_FromStringAndSize PyBytes_FromStringAndSize +#define Bytes_FromFormat PyBytes_FromFormat +#define Bytes_AS_STRING PyBytes_AS_STRING +#define Bytes_GET_SIZE PyBytes_GET_SIZE +#define Bytes_AsDecodeObject PyBytes_AsDecodedObject + +#define Object_Unicode PyObject_Str + +#define IsTextObj(x) (PyUnicode_Check(x) || PyBytes_Check(x)) + +/* Renamed builtins */ +#define BUILTINS_MODULE "builtins" +#define BUILTINS_UNICODE "str" +#define BUILTINS_UNICHR "chr" + +/* Defaults for unicode file path encoding */ +#define UNICODE_DEF_FS_CODEC Py_FileSystemDefaultEncoding +#if defined(MS_WIN32) +#define UNICODE_DEF_FS_ERROR "replace" +#else +#define UNICODE_DEF_FS_ERROR "surrogateescape" +#endif + +#else /* #if PY_MAJOR_VERSION >= 3 */ + +#define PY3 0 + +/* Module init function returns nothing. */ +#define MODINIT_RETURN(x) return +#define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC init##mod_name (void) +#define DECREF_MOD(mod) + +/* Type header differs. */ +#define TYPE_HEAD(x,y) \ + PyObject_HEAD_INIT(x) \ + 0, + +/* Text interface. Use ascii strings. */ +#define Text_Type PyString_Type +#define Text_Check PyString_Check +#define Text_FromLocale PyString_FromString +#define Text_FromUTF8 PyString_FromString +#define Text_FromUTF8AndSize PyString_FromStringAndSize +#define Text_FromFormat PyString_FromFormat +#define Text_GetSize PyString_GetSize +#define Text_GET_SIZE PyString_GET_SIZE + +/* Binary interface. Use ascii strings. */ +#define Bytes_Type PyString_Type +#define Bytes_Check PyString_Check +#define Bytes_Size PyString_Size +#define Bytes_AsString PyString_AsString +#define Bytes_AsStringAndSize PyString_AsStringAndSize +#define Bytes_FromStringAndSize PyString_FromStringAndSize +#define Bytes_FromFormat PyString_FromFormat +#define Bytes_AS_STRING PyString_AS_STRING +#define Bytes_GET_SIZE PyString_GET_SIZE +#define Bytes_AsDecodedObject PyString_AsDecodedObject + +#define Object_Unicode PyObject_Unicode + +/* Renamed builtins */ +#define BUILTINS_MODULE "__builtin__" +#define BUILTINS_UNICODE "unicode" +#define BUILTINS_UNICHR "unichr" + +/* Defaults for unicode file path encoding */ +#define UNICODE_DEF_FS_CODEC Py_FileSystemDefaultEncoding +#define UNICODE_DEF_FS_ERROR "strict" + +#endif /* #if PY_MAJOR_VERSION >= 3 */ + +#define PY2 (!PY3) + +#define MODINIT_ERROR MODINIT_RETURN (NULL) + +/* Module state. These macros are used to define per-module macros. + * v - global state variable (Python 2.x) + * s - global state structure (Python 3.x) + */ +#define PY2_GETSTATE(v) (&(v)) +#define PY3_GETSTATE(s, m) ((struct s *) PyModule_GetState (m)) + +/* Pep 3123: Making PyObject_HEAD conform to standard C */ +#if !defined(Py_TYPE) +#define Py_TYPE(o) (((PyObject *)(o))->ob_type) +#define Py_REFCNT(o) (((PyObject *)(o))->ob_refcnt) +#define Py_SIZE(o) (((PyVarObject *)(o))->ob_size) +#endif + +/* Encode a unicode file path */ +#define Unicode_AsEncodedPath(u) \ + PyUnicode_AsEncodedString ((u), UNICODE_DEF_FS_CODEC, UNICODE_DEF_FS_ERROR) + +#define RELATIVE_MODULE(m) ("." m) + +#define HAVE_OLD_BUFPROTO PY2 + +#if !defined(PG_ENABLE_OLDBUF) /* allow for command line override */ +#if HAVE_OLD_BUFPROTO +#define PG_ENABLE_OLDBUF 1 +#else +#define PG_ENABLE_OLDBUF 0 +#endif +#endif + +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER +#define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif + +#ifndef Py_TPFLAGS_HAVE_CLASS +#define Py_TPFLAGS_HAVE_CLASS 0 +#endif + +#ifndef Py_TPFLAGS_CHECKTYPES +#define Py_TPFLAGS_CHECKTYPES 0 +#endif + +#if PY_VERSION_HEX >= 0x03020000 +#define Slice_GET_INDICES_EX(slice, length, start, stop, step, slicelength) \ + PySlice_GetIndicesEx(slice, length, start, stop, step, slicelength) +#else +#define Slice_GET_INDICES_EX(slice, length, start, stop, step, slicelength) \ + PySlice_GetIndicesEx((PySliceObject *)(slice), length, \ + start, stop, step, slicelength) +#endif + +/* Support new buffer protocol? */ +#if !defined(PG_ENABLE_NEWBUF) /* allow for command line override */ +#if !defined(PYPY_VERSION) +#define PG_ENABLE_NEWBUF 1 +#else +#define PG_ENABLE_NEWBUF 0 +#endif +#endif + +#endif /* #if !defined(PGCOMPAT_H) */ diff --git a/venv/Include/site/python3.7/pygame/pgopengl.h b/venv/Include/site/python3.7/pygame/pgopengl.h new file mode 100644 index 0000000..3c80dca --- /dev/null +++ b/venv/Include/site/python3.7/pygame/pgopengl.h @@ -0,0 +1,16 @@ +#if !defined(PGOPENGL_H) +#define PGOPENGL_H + +/** This header includes definitions of Opengl functions as pointer types for + ** use with the SDL function SDL_GL_GetProcAddress. + **/ + +#if defined(_WIN32) +#define GL_APIENTRY __stdcall +#else +#define GL_APIENTRY +#endif + +typedef void (GL_APIENTRY *GL_glReadPixels_Func)(int, int, int, int, unsigned int, unsigned int, void*); + +#endif diff --git a/venv/Include/site/python3.7/pygame/pygame.h b/venv/Include/site/python3.7/pygame/pygame.h new file mode 100644 index 0000000..bcbf1d9 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/pygame.h @@ -0,0 +1,34 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +/* To allow the Pygame C api to be globally shared by all code within an + * extension module built from multiple C files, only include the pygame.h + * header within the top level C file, the one which calls the + * 'import_pygame_*' macros. All other C source files of the module should + * include _pygame.h instead. + */ +#ifndef PYGAME_H +#define PYGAME_H + +#include "_pygame.h" + +#endif diff --git a/venv/Include/site/python3.7/pygame/scrap.h b/venv/Include/site/python3.7/pygame/scrap.h new file mode 100644 index 0000000..b1b3856 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/scrap.h @@ -0,0 +1,143 @@ +/* + pygame - Python Game Library + Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen + + Originally put in the public domain by Sam Lantinga. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* This is unconditionally defined in Python.h */ +#if defined(_POSIX_C_SOURCE) +#undef _POSIX_C_SOURCE +#endif + +#include + +/* Handle clipboard text and data in arbitrary formats */ + +/** + * Predefined supported pygame scrap types. + */ +#define PYGAME_SCRAP_TEXT "text/plain" +#define PYGAME_SCRAP_BMP "image/bmp" +#define PYGAME_SCRAP_PPM "image/ppm" +#define PYGAME_SCRAP_PBM "image/pbm" + +/** + * The supported scrap clipboard types. + * + * This is only relevant in a X11 environment, which supports mouse + * selections as well. For Win32 and MacOS environments the default + * clipboard is used, no matter what value is passed. + */ +typedef enum +{ + SCRAP_CLIPBOARD, + SCRAP_SELECTION /* only supported in X11 environments. */ +} ScrapClipType; + +/** + * Macro for initialization checks. + */ +#define PYGAME_SCRAP_INIT_CHECK() \ + if(!pygame_scrap_initialized()) \ + return (PyErr_SetString (pgExc_SDLError, \ + "scrap system not initialized."), NULL) + +/** + * \brief Checks, whether the pygame scrap module was initialized. + * + * \return 1 if the modules was initialized, 0 otherwise. + */ +extern int +pygame_scrap_initialized (void); + +/** + * \brief Initializes the pygame scrap module internals. Call this before any + * other method. + * + * \return 1 on successful initialization, 0 otherwise. + */ +extern int +pygame_scrap_init (void); + +/** + * \brief Checks, whether the pygame window lost the clipboard focus or not. + * + * \return 1 if the window lost the focus, 0 otherwise. + */ +extern int +pygame_scrap_lost (void); + +/** + * \brief Places content of a specific type into the clipboard. + * + * \note For X11 the following notes are important: The following types + * are reserved for internal usage and thus will throw an error on + * setting them: "TIMESTAMP", "TARGETS", "SDL_SELECTION". + * Setting PYGAME_SCRAP_TEXT ("text/plain") will also automatically + * set the X11 types "STRING" (XA_STRING), "TEXT" and "UTF8_STRING". + * + * For Win32 the following notes are important: Setting + * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set + * the Win32 type "TEXT" (CF_TEXT). + * + * For QNX the following notes are important: Setting + * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set + * the QNX type "TEXT" (Ph_CL_TEXT). + * + * \param type The type of the content. + * \param srclen The length of the content. + * \param src The NULL terminated content. + * \return 1, if the content could be successfully pasted into the clipboard, + * 0 otherwise. + */ +extern int +pygame_scrap_put (char *type, int srclen, char *src); + +/** + * \brief Gets the current content from the clipboard. + * + * \note The received content does not need to be the content previously + * placed in the clipboard using pygame_put_scrap(). See the + * pygame_put_scrap() notes for more details. + * + * \param type The type of the content to receive. + * \param count The size of the returned content. + * \return The content or NULL in case of an error or if no content of the + * specified type was available. + */ +extern char* +pygame_scrap_get (char *type, unsigned long *count); + +/** + * \brief Gets the currently available content types from the clipboard. + * + * \return The different available content types or NULL in case of an + * error or if no content type is available. + */ +extern char** +pygame_scrap_get_types (void); + +/** + * \brief Checks whether content for the specified scrap type is currently + * available in the clipboard. + * + * \param type The type to check for. + * \return 1, if there is content and 0 otherwise. + */ +extern int +pygame_scrap_contains (char *type); diff --git a/venv/Include/site/python3.7/pygame/surface.h b/venv/Include/site/python3.7/pygame/surface.h new file mode 100644 index 0000000..cc5f071 --- /dev/null +++ b/venv/Include/site/python3.7/pygame/surface.h @@ -0,0 +1,383 @@ +/* + pygame - Python Game Library + Copyright (C) 2000-2001 Pete Shinners + Copyright (C) 2007 Marcus von Appen + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Pete Shinners + pete@shinners.org +*/ + +#ifndef SURFACE_H +#define SURFACE_H + +/* This is defined in SDL.h */ +#if defined(_POSIX_C_SOURCE) +#undef _POSIX_C_SOURCE +#endif + +#include +#include "pygame.h" + +/* Blend modes */ +#define PYGAME_BLEND_ADD 0x1 +#define PYGAME_BLEND_SUB 0x2 +#define PYGAME_BLEND_MULT 0x3 +#define PYGAME_BLEND_MIN 0x4 +#define PYGAME_BLEND_MAX 0x5 + +#define PYGAME_BLEND_RGB_ADD 0x1 +#define PYGAME_BLEND_RGB_SUB 0x2 +#define PYGAME_BLEND_RGB_MULT 0x3 +#define PYGAME_BLEND_RGB_MIN 0x4 +#define PYGAME_BLEND_RGB_MAX 0x5 + +#define PYGAME_BLEND_RGBA_ADD 0x6 +#define PYGAME_BLEND_RGBA_SUB 0x7 +#define PYGAME_BLEND_RGBA_MULT 0x8 +#define PYGAME_BLEND_RGBA_MIN 0x9 +#define PYGAME_BLEND_RGBA_MAX 0x10 +#define PYGAME_BLEND_PREMULTIPLIED 0x11 + + + + + +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define GET_PIXEL_24(b) (b[0] + (b[1] << 8) + (b[2] << 16)) +#else +#define GET_PIXEL_24(b) (b[2] + (b[1] << 8) + (b[0] << 16)) +#endif + +#define GET_PIXEL(pxl, bpp, source) \ + switch (bpp) \ + { \ + case 2: \ + pxl = *((Uint16 *) (source)); \ + break; \ + case 4: \ + pxl = *((Uint32 *) (source)); \ + break; \ + default: \ + { \ + Uint8 *b = (Uint8 *) source; \ + pxl = GET_PIXEL_24(b); \ + } \ + break; \ + } + +#if IS_SDLv1 +#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \ + _sR = ((px & fmt->Rmask) >> fmt->Rshift); \ + _sR = (_sR << fmt->Rloss) + (_sR >> (8 - (fmt->Rloss << 1))); \ + _sG = ((px & fmt->Gmask) >> fmt->Gshift); \ + _sG = (_sG << fmt->Gloss) + (_sG >> (8 - (fmt->Gloss << 1))); \ + _sB = ((px & fmt->Bmask) >> fmt->Bshift); \ + _sB = (_sB << fmt->Bloss) + (_sB >> (8 - (fmt->Bloss << 1))); \ + if (ppa) \ + { \ + _sA = ((px & fmt->Amask) >> fmt->Ashift); \ + _sA = (_sA << fmt->Aloss) + (_sA >> (8 - (fmt->Aloss << 1))); \ + } \ + else \ + { \ + _sA = 255; \ + } + +#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \ + sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \ + sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \ + sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \ + sa = 255; + +/* For 1 byte palette pixels */ +#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \ + *(px) = (Uint8) SDL_MapRGB(fmt, _dR, _dG, _dB) +#else /* IS_SDLv2 */ +#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \ + SDL_GetRGBA(px, fmt, &(_sR), &(_sG), &(_sB), &(_sA)); \ + if (!ppa) { \ + _sA = 255; \ + } + +#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \ + sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \ + sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \ + sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \ + sa = 255; + +/* For 1 byte palette pixels */ +#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \ + *(px) = (Uint8) SDL_MapRGBA(fmt, _dR, _dG, _dB, _dA) +#endif /* IS_SDLv2 */ + + + + + + + + +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SET_OFFSETS_24(or, og, ob, fmt) \ + { \ + or = (fmt->Rshift == 0 ? 0 : \ + fmt->Rshift == 8 ? 1 : \ + 2 ); \ + og = (fmt->Gshift == 0 ? 0 : \ + fmt->Gshift == 8 ? 1 : \ + 2 ); \ + ob = (fmt->Bshift == 0 ? 0 : \ + fmt->Bshift == 8 ? 1 : \ + 2 ); \ + } + +#define SET_OFFSETS_32(or, og, ob, fmt) \ + { \ + or = (fmt->Rshift == 0 ? 0 : \ + fmt->Rshift == 8 ? 1 : \ + fmt->Rshift == 16 ? 2 : \ + 3 ); \ + og = (fmt->Gshift == 0 ? 0 : \ + fmt->Gshift == 8 ? 1 : \ + fmt->Gshift == 16 ? 2 : \ + 3 ); \ + ob = (fmt->Bshift == 0 ? 0 : \ + fmt->Bshift == 8 ? 1 : \ + fmt->Bshift == 16 ? 2 : \ + 3 ); \ + } +#else +#define SET_OFFSETS_24(or, og, ob, fmt) \ + { \ + or = (fmt->Rshift == 0 ? 2 : \ + fmt->Rshift == 8 ? 1 : \ + 0 ); \ + og = (fmt->Gshift == 0 ? 2 : \ + fmt->Gshift == 8 ? 1 : \ + 0 ); \ + ob = (fmt->Bshift == 0 ? 2 : \ + fmt->Bshift == 8 ? 1 : \ + 0 ); \ + } + +#define SET_OFFSETS_32(or, og, ob, fmt) \ + { \ + or = (fmt->Rshift == 0 ? 3 : \ + fmt->Rshift == 8 ? 2 : \ + fmt->Rshift == 16 ? 1 : \ + 0 ); \ + og = (fmt->Gshift == 0 ? 3 : \ + fmt->Gshift == 8 ? 2 : \ + fmt->Gshift == 16 ? 1 : \ + 0 ); \ + ob = (fmt->Bshift == 0 ? 3 : \ + fmt->Bshift == 8 ? 2 : \ + fmt->Bshift == 16 ? 1 : \ + 0 ); \ + } +#endif + + +#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ + switch (bp) \ + { \ + case 2: \ + *((Uint16 *) (buf)) = \ + ((r >> ft->Rloss) << ft->Rshift) | \ + ((g >> ft->Gloss) << ft->Gshift) | \ + ((b >> ft->Bloss) << ft->Bshift) | \ + ((a >> ft->Aloss) << ft->Ashift); \ + break; \ + case 4: \ + *((Uint32 *) (buf)) = \ + ((r >> ft->Rloss) << ft->Rshift) | \ + ((g >> ft->Gloss) << ft->Gshift) | \ + ((b >> ft->Bloss) << ft->Bshift) | \ + ((a >> ft->Aloss) << ft->Ashift); \ + break; \ + } + +/* Pretty good idea from Tom Duff :-). */ +#define LOOP_UNROLLED4(code, n, width) \ + n = (width + 3) / 4; \ + switch (width & 3) \ + { \ + case 0: do { code; \ + case 3: code; \ + case 2: code; \ + case 1: code; \ + } while (--n > 0); \ + } + +/* Used in the srcbpp == dstbpp == 1 blend functions */ +#define REPEAT_3(code) \ + code; \ + code; \ + code; + +#define REPEAT_4(code) \ + code; \ + code; \ + code; \ + code; + + +#define BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ + tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \ + tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \ + tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); + +#define BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ + tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \ + tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \ + tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); + +#define BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \ + dR = (dR && sR) ? (dR * sR) >> 8 : 0; \ + dG = (dG && sG) ? (dG * sG) >> 8 : 0; \ + dB = (dB && sB) ? (dB * sB) >> 8 : 0; + +#define BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \ + if(sR < dR) { dR = sR; } \ + if(sG < dG) { dG = sG; } \ + if(sB < dB) { dB = sB; } + +#define BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \ + if(sR > dR) { dR = sR; } \ + if(sG > dG) { dG = sG; } \ + if(sB > dB) { dB = sB; } + + + + + + +#define BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ + tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \ + tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \ + tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); \ + tmp = dA + sA; dA = (tmp <= 255 ? tmp : 255); + +#define BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ + tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \ + tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \ + tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); \ + tmp = dA - sA; dA = (tmp >= 0 ? tmp : 0); + +#define BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \ + dR = (dR && sR) ? (dR * sR) >> 8 : 0; \ + dG = (dG && sG) ? (dG * sG) >> 8 : 0; \ + dB = (dB && sB) ? (dB * sB) >> 8 : 0; \ + dA = (dA && sA) ? (dA * sA) >> 8 : 0; + +#define BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \ + if(sR < dR) { dR = sR; } \ + if(sG < dG) { dG = sG; } \ + if(sB < dB) { dB = sB; } \ + if(sA < dA) { dA = sA; } + +#define BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \ + if(sR > dR) { dR = sR; } \ + if(sG > dG) { dG = sG; } \ + if(sB > dB) { dB = sB; } \ + if(sA > dA) { dA = sA; } + + + + + + + + + + + +#if 1 +/* Choose an alpha blend equation. If the sign is preserved on a right shift + * then use a specialized, faster, equation. Otherwise a more general form, + * where all additions are done before the shift, is needed. +*/ +#if (-1 >> 1) < 0 +#define ALPHA_BLEND_COMP(sC, dC, sA) ((((sC - dC) * sA + sC) >> 8) + dC) +#else +#define ALPHA_BLEND_COMP(sC, dC, sA) (((dC << 8) + (sC - dC) * sA + sC) >> 8) +#endif + +#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \ + do { \ + if (dA) \ + { \ + dR = ALPHA_BLEND_COMP(sR, dR, sA); \ + dG = ALPHA_BLEND_COMP(sG, dG, sA); \ + dB = ALPHA_BLEND_COMP(sB, dB, sA); \ + dA = sA + dA - ((sA * dA) / 255); \ + } \ + else \ + { \ + dR = sR; \ + dG = sG; \ + dB = sB; \ + dA = sA; \ + } \ + } while(0) + +#define ALPHA_BLEND_PREMULTIPLIED_COMP(sC, dC, sA) (sC + dC - ((dC * sA) >> 8)) + +#define ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ + do { \ + tmp = ALPHA_BLEND_PREMULTIPLIED_COMP(sR, dR, sA); dR = (tmp > 255 ? 255 : tmp); \ + tmp = ALPHA_BLEND_PREMULTIPLIED_COMP(sG, dG, sA); dG = (tmp > 255 ? 255 : tmp); \ + tmp = ALPHA_BLEND_PREMULTIPLIED_COMP(sB, dB, sA); dB = (tmp > 255 ? 255 : tmp); \ + dA = sA + dA - ((sA * dA) / 255); \ + } while(0) +#elif 0 + +#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \ + do { \ + if(sA){ \ + if(dA && sA < 255){ \ + int dContrib = dA*(255 - sA)/255; \ + dA = sA+dA - ((sA*dA)/255); \ + dR = (dR*dContrib + sR*sA)/dA; \ + dG = (dG*dContrib + sG*sA)/dA; \ + dB = (dB*dContrib + sB*sA)/dA; \ + }else{ \ + dR = sR; \ + dG = sG; \ + dB = sB; \ + dA = sA; \ + } \ + } \ + } while(0) +#endif + +int +surface_fill_blend (SDL_Surface *surface, SDL_Rect *rect, Uint32 color, + int blendargs); + +void +surface_respect_clip_rect (SDL_Surface *surface, SDL_Rect *rect); + +int +pygame_AlphaBlit (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect, int the_args); + +int +pygame_Blit (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect, int the_args); + +#endif /* SURFACE_H */ diff --git a/venv/Lib/site-packages/easy-install.pth b/venv/Lib/site-packages/easy-install.pth new file mode 100644 index 0000000..b74fe2e --- /dev/null +++ b/venv/Lib/site-packages/easy-install.pth @@ -0,0 +1,2 @@ +./setuptools-40.8.0-py3.7.egg +./pip-19.0.3-py3.7.egg diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/PKG-INFO b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/PKG-INFO new file mode 100644 index 0000000..0b410a2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/PKG-INFO @@ -0,0 +1,73 @@ +Metadata-Version: 1.2 +Name: pip +Version: 19.0.3 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Description: pip - The Python Package Installer + ================================== + + .. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + + .. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + + pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + + Please take a look at our documentation for how to install and use pip: + + * `Installation`_ + * `Usage`_ + * `Release notes`_ + + If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: + + * `Issue tracking`_ + * `Discourse channel`_ + * `User IRC`_ + + If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: + + * `GitHub page`_ + * `Dev mailing list`_ + * `Dev IRC`_ + + Code of Conduct + --------------- + + Everyone interacting in the pip project's codebases, issue trackers, chat + rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + + .. _package installer: https://packaging.python.org/en/latest/current/ + .. _Python Package Index: https://pypi.org + .. _Installation: https://pip.pypa.io/en/stable/installing.html + .. _Usage: https://pip.pypa.io/en/stable/ + .. _Release notes: https://pip.pypa.io/en/stable/news.html + .. _GitHub page: https://github.com/pypa/pip + .. _Issue tracking: https://github.com/pypa/pip/issues + .. _Discourse channel: https://discuss.python.org/c/packaging + .. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev + .. _User IRC: https://webchat.freenode.net/?channels=%23pypa + .. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev + .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + +Keywords: distutils easy_install egg setuptools wheel virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +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 +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/SOURCES.txt b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/SOURCES.txt new file mode 100644 index 0000000..eb4810d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/SOURCES.txt @@ -0,0 +1,391 @@ +AUTHORS.txt +LICENSE.txt +MANIFEST.in +NEWS.rst +README.rst +pyproject.toml +setup.cfg +setup.py +docs/pip_sphinxext.py +docs/html/conf.py +docs/html/cookbook.rst +docs/html/index.rst +docs/html/installing.rst +docs/html/logic.rst +docs/html/news.rst +docs/html/quickstart.rst +docs/html/usage.rst +docs/html/user_guide.rst +docs/html/development/configuration.rst +docs/html/development/contributing.rst +docs/html/development/getting-started.rst +docs/html/development/index.rst +docs/html/development/release-process.rst +docs/html/development/vendoring-policy.rst +docs/html/reference/index.rst +docs/html/reference/pip.rst +docs/html/reference/pip_check.rst +docs/html/reference/pip_config.rst +docs/html/reference/pip_download.rst +docs/html/reference/pip_freeze.rst +docs/html/reference/pip_hash.rst +docs/html/reference/pip_install.rst +docs/html/reference/pip_list.rst +docs/html/reference/pip_search.rst +docs/html/reference/pip_show.rst +docs/html/reference/pip_uninstall.rst +docs/html/reference/pip_wheel.rst +docs/man/index.rst +docs/man/commands/check.rst +docs/man/commands/config.rst +docs/man/commands/download.rst +docs/man/commands/freeze.rst +docs/man/commands/hash.rst +docs/man/commands/help.rst +docs/man/commands/install.rst +docs/man/commands/list.rst +docs/man/commands/search.rst +docs/man/commands/show.rst +docs/man/commands/uninstall.rst +docs/man/commands/wheel.rst +src/pip/__init__.py +src/pip/__main__.py +src/pip.egg-info/PKG-INFO +src/pip.egg-info/SOURCES.txt +src/pip.egg-info/dependency_links.txt +src/pip.egg-info/entry_points.txt +src/pip.egg-info/not-zip-safe +src/pip.egg-info/top_level.txt +src/pip/_internal/__init__.py +src/pip/_internal/build_env.py +src/pip/_internal/cache.py +src/pip/_internal/configuration.py +src/pip/_internal/download.py +src/pip/_internal/exceptions.py +src/pip/_internal/index.py +src/pip/_internal/locations.py +src/pip/_internal/pep425tags.py +src/pip/_internal/pyproject.py +src/pip/_internal/resolve.py +src/pip/_internal/wheel.py +src/pip/_internal/cli/__init__.py +src/pip/_internal/cli/autocompletion.py +src/pip/_internal/cli/base_command.py +src/pip/_internal/cli/cmdoptions.py +src/pip/_internal/cli/main_parser.py +src/pip/_internal/cli/parser.py +src/pip/_internal/cli/status_codes.py +src/pip/_internal/commands/__init__.py +src/pip/_internal/commands/check.py +src/pip/_internal/commands/completion.py +src/pip/_internal/commands/configuration.py +src/pip/_internal/commands/download.py +src/pip/_internal/commands/freeze.py +src/pip/_internal/commands/hash.py +src/pip/_internal/commands/help.py +src/pip/_internal/commands/install.py +src/pip/_internal/commands/list.py +src/pip/_internal/commands/search.py +src/pip/_internal/commands/show.py +src/pip/_internal/commands/uninstall.py +src/pip/_internal/commands/wheel.py +src/pip/_internal/models/__init__.py +src/pip/_internal/models/candidate.py +src/pip/_internal/models/format_control.py +src/pip/_internal/models/index.py +src/pip/_internal/models/link.py +src/pip/_internal/operations/__init__.py +src/pip/_internal/operations/check.py +src/pip/_internal/operations/freeze.py +src/pip/_internal/operations/prepare.py +src/pip/_internal/req/__init__.py +src/pip/_internal/req/constructors.py +src/pip/_internal/req/req_file.py +src/pip/_internal/req/req_install.py +src/pip/_internal/req/req_set.py +src/pip/_internal/req/req_tracker.py +src/pip/_internal/req/req_uninstall.py +src/pip/_internal/utils/__init__.py +src/pip/_internal/utils/appdirs.py +src/pip/_internal/utils/compat.py +src/pip/_internal/utils/deprecation.py +src/pip/_internal/utils/encoding.py +src/pip/_internal/utils/filesystem.py +src/pip/_internal/utils/glibc.py +src/pip/_internal/utils/hashes.py +src/pip/_internal/utils/logging.py +src/pip/_internal/utils/misc.py +src/pip/_internal/utils/models.py +src/pip/_internal/utils/outdated.py +src/pip/_internal/utils/packaging.py +src/pip/_internal/utils/setuptools_build.py +src/pip/_internal/utils/temp_dir.py +src/pip/_internal/utils/typing.py +src/pip/_internal/utils/ui.py +src/pip/_internal/vcs/__init__.py +src/pip/_internal/vcs/bazaar.py +src/pip/_internal/vcs/git.py +src/pip/_internal/vcs/mercurial.py +src/pip/_internal/vcs/subversion.py +src/pip/_vendor/README.rst +src/pip/_vendor/__init__.py +src/pip/_vendor/appdirs.LICENSE.txt +src/pip/_vendor/appdirs.py +src/pip/_vendor/distro.LICENSE +src/pip/_vendor/distro.py +src/pip/_vendor/ipaddress.LICENSE +src/pip/_vendor/ipaddress.py +src/pip/_vendor/pyparsing.LICENSE +src/pip/_vendor/pyparsing.py +src/pip/_vendor/retrying.LICENSE +src/pip/_vendor/retrying.py +src/pip/_vendor/six.LICENSE +src/pip/_vendor/six.py +src/pip/_vendor/vendor.txt +src/pip/_vendor/cachecontrol/LICENSE.txt +src/pip/_vendor/cachecontrol/__init__.py +src/pip/_vendor/cachecontrol/_cmd.py +src/pip/_vendor/cachecontrol/adapter.py +src/pip/_vendor/cachecontrol/cache.py +src/pip/_vendor/cachecontrol/compat.py +src/pip/_vendor/cachecontrol/controller.py +src/pip/_vendor/cachecontrol/filewrapper.py +src/pip/_vendor/cachecontrol/heuristics.py +src/pip/_vendor/cachecontrol/serialize.py +src/pip/_vendor/cachecontrol/wrapper.py +src/pip/_vendor/cachecontrol/caches/__init__.py +src/pip/_vendor/cachecontrol/caches/file_cache.py +src/pip/_vendor/cachecontrol/caches/redis_cache.py +src/pip/_vendor/certifi/LICENSE +src/pip/_vendor/certifi/__init__.py +src/pip/_vendor/certifi/__main__.py +src/pip/_vendor/certifi/cacert.pem +src/pip/_vendor/certifi/core.py +src/pip/_vendor/chardet/LICENSE +src/pip/_vendor/chardet/__init__.py +src/pip/_vendor/chardet/big5freq.py +src/pip/_vendor/chardet/big5prober.py +src/pip/_vendor/chardet/chardistribution.py +src/pip/_vendor/chardet/charsetgroupprober.py +src/pip/_vendor/chardet/charsetprober.py +src/pip/_vendor/chardet/codingstatemachine.py +src/pip/_vendor/chardet/compat.py +src/pip/_vendor/chardet/cp949prober.py +src/pip/_vendor/chardet/enums.py +src/pip/_vendor/chardet/escprober.py +src/pip/_vendor/chardet/escsm.py +src/pip/_vendor/chardet/eucjpprober.py +src/pip/_vendor/chardet/euckrfreq.py +src/pip/_vendor/chardet/euckrprober.py +src/pip/_vendor/chardet/euctwfreq.py +src/pip/_vendor/chardet/euctwprober.py +src/pip/_vendor/chardet/gb2312freq.py +src/pip/_vendor/chardet/gb2312prober.py +src/pip/_vendor/chardet/hebrewprober.py +src/pip/_vendor/chardet/jisfreq.py +src/pip/_vendor/chardet/jpcntx.py +src/pip/_vendor/chardet/langbulgarianmodel.py +src/pip/_vendor/chardet/langcyrillicmodel.py +src/pip/_vendor/chardet/langgreekmodel.py +src/pip/_vendor/chardet/langhebrewmodel.py +src/pip/_vendor/chardet/langhungarianmodel.py +src/pip/_vendor/chardet/langthaimodel.py +src/pip/_vendor/chardet/langturkishmodel.py +src/pip/_vendor/chardet/latin1prober.py +src/pip/_vendor/chardet/mbcharsetprober.py +src/pip/_vendor/chardet/mbcsgroupprober.py +src/pip/_vendor/chardet/mbcssm.py +src/pip/_vendor/chardet/sbcharsetprober.py +src/pip/_vendor/chardet/sbcsgroupprober.py +src/pip/_vendor/chardet/sjisprober.py +src/pip/_vendor/chardet/universaldetector.py +src/pip/_vendor/chardet/utf8prober.py +src/pip/_vendor/chardet/version.py +src/pip/_vendor/chardet/cli/__init__.py +src/pip/_vendor/chardet/cli/chardetect.py +src/pip/_vendor/colorama/LICENSE.txt +src/pip/_vendor/colorama/__init__.py +src/pip/_vendor/colorama/ansi.py +src/pip/_vendor/colorama/ansitowin32.py +src/pip/_vendor/colorama/initialise.py +src/pip/_vendor/colorama/win32.py +src/pip/_vendor/colorama/winterm.py +src/pip/_vendor/distlib/LICENSE.txt +src/pip/_vendor/distlib/__init__.py +src/pip/_vendor/distlib/compat.py +src/pip/_vendor/distlib/database.py +src/pip/_vendor/distlib/index.py +src/pip/_vendor/distlib/locators.py +src/pip/_vendor/distlib/manifest.py +src/pip/_vendor/distlib/markers.py +src/pip/_vendor/distlib/metadata.py +src/pip/_vendor/distlib/resources.py +src/pip/_vendor/distlib/scripts.py +src/pip/_vendor/distlib/t32.exe +src/pip/_vendor/distlib/t64.exe +src/pip/_vendor/distlib/util.py +src/pip/_vendor/distlib/version.py +src/pip/_vendor/distlib/w32.exe +src/pip/_vendor/distlib/w64.exe +src/pip/_vendor/distlib/wheel.py +src/pip/_vendor/distlib/_backport/__init__.py +src/pip/_vendor/distlib/_backport/misc.py +src/pip/_vendor/distlib/_backport/shutil.py +src/pip/_vendor/distlib/_backport/sysconfig.cfg +src/pip/_vendor/distlib/_backport/sysconfig.py +src/pip/_vendor/distlib/_backport/tarfile.py +src/pip/_vendor/html5lib/LICENSE +src/pip/_vendor/html5lib/__init__.py +src/pip/_vendor/html5lib/_ihatexml.py +src/pip/_vendor/html5lib/_inputstream.py +src/pip/_vendor/html5lib/_tokenizer.py +src/pip/_vendor/html5lib/_utils.py +src/pip/_vendor/html5lib/constants.py +src/pip/_vendor/html5lib/html5parser.py +src/pip/_vendor/html5lib/serializer.py +src/pip/_vendor/html5lib/_trie/__init__.py +src/pip/_vendor/html5lib/_trie/_base.py +src/pip/_vendor/html5lib/_trie/datrie.py +src/pip/_vendor/html5lib/_trie/py.py +src/pip/_vendor/html5lib/filters/__init__.py +src/pip/_vendor/html5lib/filters/alphabeticalattributes.py +src/pip/_vendor/html5lib/filters/base.py +src/pip/_vendor/html5lib/filters/inject_meta_charset.py +src/pip/_vendor/html5lib/filters/lint.py +src/pip/_vendor/html5lib/filters/optionaltags.py +src/pip/_vendor/html5lib/filters/sanitizer.py +src/pip/_vendor/html5lib/filters/whitespace.py +src/pip/_vendor/html5lib/treeadapters/__init__.py +src/pip/_vendor/html5lib/treeadapters/genshi.py +src/pip/_vendor/html5lib/treeadapters/sax.py +src/pip/_vendor/html5lib/treebuilders/__init__.py +src/pip/_vendor/html5lib/treebuilders/base.py +src/pip/_vendor/html5lib/treebuilders/dom.py +src/pip/_vendor/html5lib/treebuilders/etree.py +src/pip/_vendor/html5lib/treebuilders/etree_lxml.py +src/pip/_vendor/html5lib/treewalkers/__init__.py +src/pip/_vendor/html5lib/treewalkers/base.py +src/pip/_vendor/html5lib/treewalkers/dom.py +src/pip/_vendor/html5lib/treewalkers/etree.py +src/pip/_vendor/html5lib/treewalkers/etree_lxml.py +src/pip/_vendor/html5lib/treewalkers/genshi.py +src/pip/_vendor/idna/LICENSE.rst +src/pip/_vendor/idna/__init__.py +src/pip/_vendor/idna/codec.py +src/pip/_vendor/idna/compat.py +src/pip/_vendor/idna/core.py +src/pip/_vendor/idna/idnadata.py +src/pip/_vendor/idna/intranges.py +src/pip/_vendor/idna/package_data.py +src/pip/_vendor/idna/uts46data.py +src/pip/_vendor/lockfile/LICENSE +src/pip/_vendor/lockfile/__init__.py +src/pip/_vendor/lockfile/linklockfile.py +src/pip/_vendor/lockfile/mkdirlockfile.py +src/pip/_vendor/lockfile/pidlockfile.py +src/pip/_vendor/lockfile/sqlitelockfile.py +src/pip/_vendor/lockfile/symlinklockfile.py +src/pip/_vendor/msgpack/COPYING +src/pip/_vendor/msgpack/__init__.py +src/pip/_vendor/msgpack/_version.py +src/pip/_vendor/msgpack/exceptions.py +src/pip/_vendor/msgpack/fallback.py +src/pip/_vendor/packaging/LICENSE +src/pip/_vendor/packaging/LICENSE.APACHE +src/pip/_vendor/packaging/LICENSE.BSD +src/pip/_vendor/packaging/__about__.py +src/pip/_vendor/packaging/__init__.py +src/pip/_vendor/packaging/_compat.py +src/pip/_vendor/packaging/_structures.py +src/pip/_vendor/packaging/markers.py +src/pip/_vendor/packaging/requirements.py +src/pip/_vendor/packaging/specifiers.py +src/pip/_vendor/packaging/utils.py +src/pip/_vendor/packaging/version.py +src/pip/_vendor/pep517/LICENSE +src/pip/_vendor/pep517/__init__.py +src/pip/_vendor/pep517/_in_process.py +src/pip/_vendor/pep517/build.py +src/pip/_vendor/pep517/check.py +src/pip/_vendor/pep517/colorlog.py +src/pip/_vendor/pep517/compat.py +src/pip/_vendor/pep517/envbuild.py +src/pip/_vendor/pep517/wrappers.py +src/pip/_vendor/pkg_resources/LICENSE +src/pip/_vendor/pkg_resources/__init__.py +src/pip/_vendor/pkg_resources/py31compat.py +src/pip/_vendor/progress/LICENSE +src/pip/_vendor/progress/__init__.py +src/pip/_vendor/progress/bar.py +src/pip/_vendor/progress/counter.py +src/pip/_vendor/progress/helpers.py +src/pip/_vendor/progress/spinner.py +src/pip/_vendor/pytoml/LICENSE +src/pip/_vendor/pytoml/__init__.py +src/pip/_vendor/pytoml/core.py +src/pip/_vendor/pytoml/parser.py +src/pip/_vendor/pytoml/test.py +src/pip/_vendor/pytoml/utils.py +src/pip/_vendor/pytoml/writer.py +src/pip/_vendor/requests/LICENSE +src/pip/_vendor/requests/__init__.py +src/pip/_vendor/requests/__version__.py +src/pip/_vendor/requests/_internal_utils.py +src/pip/_vendor/requests/adapters.py +src/pip/_vendor/requests/api.py +src/pip/_vendor/requests/auth.py +src/pip/_vendor/requests/certs.py +src/pip/_vendor/requests/compat.py +src/pip/_vendor/requests/cookies.py +src/pip/_vendor/requests/exceptions.py +src/pip/_vendor/requests/help.py +src/pip/_vendor/requests/hooks.py +src/pip/_vendor/requests/models.py +src/pip/_vendor/requests/packages.py +src/pip/_vendor/requests/sessions.py +src/pip/_vendor/requests/status_codes.py +src/pip/_vendor/requests/structures.py +src/pip/_vendor/requests/utils.py +src/pip/_vendor/urllib3/LICENSE.txt +src/pip/_vendor/urllib3/__init__.py +src/pip/_vendor/urllib3/_collections.py +src/pip/_vendor/urllib3/connection.py +src/pip/_vendor/urllib3/connectionpool.py +src/pip/_vendor/urllib3/exceptions.py +src/pip/_vendor/urllib3/fields.py +src/pip/_vendor/urllib3/filepost.py +src/pip/_vendor/urllib3/poolmanager.py +src/pip/_vendor/urllib3/request.py +src/pip/_vendor/urllib3/response.py +src/pip/_vendor/urllib3/contrib/__init__.py +src/pip/_vendor/urllib3/contrib/_appengine_environ.py +src/pip/_vendor/urllib3/contrib/appengine.py +src/pip/_vendor/urllib3/contrib/ntlmpool.py +src/pip/_vendor/urllib3/contrib/pyopenssl.py +src/pip/_vendor/urllib3/contrib/securetransport.py +src/pip/_vendor/urllib3/contrib/socks.py +src/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +src/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +src/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +src/pip/_vendor/urllib3/packages/__init__.py +src/pip/_vendor/urllib3/packages/six.py +src/pip/_vendor/urllib3/packages/backports/__init__.py +src/pip/_vendor/urllib3/packages/backports/makefile.py +src/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +src/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +src/pip/_vendor/urllib3/util/__init__.py +src/pip/_vendor/urllib3/util/connection.py +src/pip/_vendor/urllib3/util/queue.py +src/pip/_vendor/urllib3/util/request.py +src/pip/_vendor/urllib3/util/response.py +src/pip/_vendor/urllib3/util/retry.py +src/pip/_vendor/urllib3/util/ssl_.py +src/pip/_vendor/urllib3/util/timeout.py +src/pip/_vendor/urllib3/util/url.py +src/pip/_vendor/urllib3/util/wait.py +src/pip/_vendor/webencodings/LICENSE +src/pip/_vendor/webencodings/__init__.py +src/pip/_vendor/webencodings/labels.py +src/pip/_vendor/webencodings/mklabels.py +src/pip/_vendor/webencodings/tests.py +src/pip/_vendor/webencodings/x_user_defined.py \ No newline at end of file diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/dependency_links.txt b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/entry_points.txt b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/entry_points.txt new file mode 100644 index 0000000..f5809cb --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.7 = pip._internal:main + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/not-zip-safe b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/not-zip-safe @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/top_level.txt b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/EGG-INFO/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__init__.py new file mode 100644 index 0000000..f48c1ca --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "19.0.3" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__main__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +from pip._internal import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/__init__.py new file mode 100644 index 0000000..276124d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/__init__.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import warnings + +import sys + +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +# We want to inject the use of SecureTransport as early as possible so that any +# references or sessions or what have you are ensured to have it, however we +# only want to do this in the case that we're running on macOS and the linked +# OpenSSL is too old to handle TLSv1.2 +try: + import ssl +except ImportError: + pass +else: + # Checks for OpenSSL 1.0.1 on MacOS + if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + pass + else: + securetransport.inject_into_urllib3() + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import commands_dict +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation +from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = commands_dict[cmd_name](isolated=("--isolated" in cmd_args)) + return command.main(cmd_args) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/build_env.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/build_env.py new file mode 100644 index 0000000..d744cc7 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/build_env.py @@ -0,0 +1,215 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import sys +import textwrap +from collections import OrderedDict +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip import __file__ as pip_location +from pip._internal.utils.misc import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Set, Iterable, Optional, List # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + +logger = logging.getLogger(__name__) + + +class _Prefix: + + def __init__(self, path): + # type: (str) -> None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + self._temp_dir = TempDirectory(kind="build-env") + self._temp_dir.create() + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) + + def __enter__(self): + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } + + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), + }) + + def __exit__(self, exc_type, exc_val, exc_tb): + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + if finder.index_urls: + args.extend(['-i', finder.index_urls[0]]) + for extra_index in finder.index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + for _, host, _ in finder.secure_origins: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, show_stdout=False, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, prefix, message): + raise NotImplementedError() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cache.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cache.py new file mode 100644 index 0000000..eb295c4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cache.py @@ -0,0 +1,224 @@ +"""Cache Management +""" + +import errno +import hashlib +import logging +import os + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.download import path_to_url +from pip._internal.models.link import Link +from pip._internal.utils.compat import expanduser +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import InvalidWheelFilename, Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, List, Any # noqa: F401 + from pip._internal.index import FormatControl # noqa: F401 + +logger = logging.getLogger(__name__) + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + # type: (str, FormatControl, Set[str]) -> None + super(Cache, self).__init__() + self.cache_dir = expanduser(cache_dir) if cache_dir else None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, package_name): + # type: (Link, Optional[str]) -> List[Any] + can_not_cache = ( + not self.cache_dir or + not package_name or + not link + ) + if can_not_cache: + return [] + + canonical_name = canonicalize_name(package_name) + formats = self.format_control.get_allowed_formats( + canonical_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + root = self.get_path_for_link(link) + try: + return os.listdir(root) + except OSError as err: + if err.errno in {errno.ENOENT, errno.ENOTDIR}: + return [] + raise + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + # type: (Link, str) -> Link + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return Link(path_to_url(path)) + + def cleanup(self): + # type: () -> None + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + candidates = [] + + for wheel_name in self._get_candidates(link, package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if not wheel.supported(): + # Built for a different python/arch/etc + continue + candidates.append((wheel.support_index_min(), wheel_name)) + + if not candidates: + return link + + return self._link_for_candidate(link, min(candidates)[1]) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + # type: (FormatControl) -> None + self._temp_dir = TempDirectory(kind="ephem-wheel-cache") + self._temp_dir.create() + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + # type: (Link) -> str + return self._ephem_cache.get_path_for_link(link) + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + retval = self._wheel_cache.get(link, package_name) + if retval is link: + retval = self._ephem_cache.get(link, package_name) + return retval + + def cleanup(self): + # type: () -> None + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/autocompletion.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..0a04199 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/autocompletion.py @@ -0,0 +1,152 @@ +"""Logic that powers autocompletion installed by ``pip completion``. +""" + +import optparse +import os +import sys + +from pip._internal.cli.main_parser import create_main_parser +from pip._internal.commands import commands_dict, get_summaries +from pip._internal.utils.misc import get_installed_distributions + + +def autocomplete(): + """Entry Point for completion of main and subcommand options. + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + subcommands = [cmd for cmd, summary in get_summaries()] + options = [] + # subcommand + try: + subcommand_name = [w for w in cwords if w in subcommands][0] + except IndexError: + subcommand_name = None + + parser = create_main_parser() + # subcommand options + if subcommand_name: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = ( + subcommand_name in ['show', 'uninstall'] and + not current.startswith('-') + ) + if should_list_installed: + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = commands_dict[subcommand_name]() + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + for opt_str in opt._long_opts + opt._short_opts: + options.append((opt_str, opt.nargs)) + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, cword, subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ``

`` or ```` + if completion_type: + options = auto_complete_paths(current, completion_type) + options = ((opt, 0) for opt in options) + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + opts = (o for it in opts for o in it) + if current.startswith('-'): + for opt in opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, opts) + if completion_type: + subcommands = auto_complete_paths(current, completion_type) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + + +def auto_complete_paths(current, completion_type): + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/base_command.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..3ceea49 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/base_command.py @@ -0,0 +1,341 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.download import PipSession +from pip._internal.exceptions import ( + BadCommand, CommandError, InstallationError, PreviousBuildDirError, + UninstallationError, +) +from pip._internal.index import PackageFinder +from pip._internal.locations import running_under_virtualenv +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import ( + get_prog, normalize_path, redact_password_from_url, +) +from pip._internal.utils.outdated import pip_version_check +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List, Tuple, Any # noqa: F401 + from optparse import Values # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.req.req_set import RequirementSet # noqa: F401 + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + hidden = False # type: bool + ignore_require_venv = False # type: bool + + def __init__(self, isolated=False): + # type: (bool) -> None + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + session = PipSession( + cache=( + normalize_path(os.path.join(options.cache_dir, "http")) + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + insecure_hosts=options.trusted_hosts, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + def parse_args(self, args): + # type: (List[str]) -> Tuple + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + if sys.version_info[:2] == (3, 4): + deprecated( + "Python 3.4 support has been deprecated. pip 19.1 will be the " + "last one supporting it. Please upgrade your Python as Python " + "3.4 won't be maintained after March 2019 (cf PEP 429).", + replacement=None, + gone_in='19.2', + ) + elif sys.version_info[:2] == (2, 7): + message = ( + "A future version of pip will drop support for Python 2.7." + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 will reach the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "won't be maintained after that date. " + ) + message + deprecated(message, replacement=None, gone_in=None) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('ERROR: %s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + allow_version_check = ( + # Does this command have the index_group options? + hasattr(options, "no_index") and + # Is this command allowed to perform this check? + not (options.disable_pip_version_check or options.no_index) + ) + # Check if we're using the latest version of pip available + if allow_version_check: + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_version_check(session, options) + + # Shutdown the logging module + logging.shutdown() + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + name, # type: str + wheel_cache # type: Optional[WheelCache] + ): + # type: (...) -> None + """ + Marshal cmd line args into a requirement set. + """ + # NOTE: As a side-effect, options.require_hashes and + # requirement_set.require_hashes may be updated + + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache, + use_pep517=options.use_pep517): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + # If --require-hashes was a line in a requirements file, tell + # RequirementSet about it: + requirement_set.require_hashes = options.require_hashes + + if not (args or options.editables or options.requirements): + opts = {'name': name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + platform=None, # type: Optional[str] + python_versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None # type: Optional[str] + ): + # type: (...) -> PackageFinder + """ + Create a package finder appropriate to this requirement command. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_password_from_url(url) for url in index_urls), + ) + index_urls = [] + + return PackageFinder( + find_links=options.find_links, + format_control=options.format_control, + index_urls=index_urls, + trusted_hosts=options.trusted_hosts, + allow_all_prereleases=options.pre, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + prefer_binary=options.prefer_binary, + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/cmdoptions.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..5cf5ee9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,809 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. + +""" +from __future__ import absolute_import + +import textwrap +import warnings +from distutils.util import strtobool +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any, Callable, Dict, List, Optional, Union # noqa: F401 + from optparse import OptionParser, Values # noqa: F401 + from pip._internal.cli.parser import ConfigOptionParser # noqa: F401 + + +def raise_option_error(parser, option, msg): + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) + + +def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + # type: (Values, Optional[Values]) -> None + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-options ' + '/ --global-options / --install-options.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # gauranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Callable[..., Option] + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) # type: Callable[..., Option] + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) # type: Callable[..., Option] + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) # type: Callable[..., Option] + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Callable[..., Option] + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Callable[..., Option] + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Callable[..., Option] + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) # type: Callable[..., Option] + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Callable[..., Option] + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Callable[..., Option] + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Callable[..., Option] + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def exists_action(): + # type: () -> Option + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).", + ) + + +cert = partial( + Option, + '--cert', + dest='cert', + type='str', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Callable[..., Option] + +client_cert = partial( + Option, + '--client-cert', + dest='client_cert', + type='str', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Callable[..., Option] + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Callable[..., Option] + + +def extra_index_url(): + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Callable[..., Option] + + +def find_links(): + # type: () -> Option + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + # type: () -> Option + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host as trusted, even though it does not have valid " + "or any HTTPS.", + ) + + +def constraints(): + # type: () -> Option + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + # type: () -> Option + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + # type: () -> Option + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +src = partial( + Option, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Callable[..., Option] + + +def _get_format_control(values, option): + # type: (Values, Option) -> Any + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them. Note that some " + "packages are tricky to compile and may fail to install when " + "this option is used on them.", + ) + + +def only_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only use wheels compatible with Python " + "interpreter version . If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), +) # type: Callable[..., Option] + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), +) # type: Callable[..., Option] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) # type: Callable[..., Option] + + +def prefer_binary(): + # type: () -> Option + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def no_cache_dir_callback(option, opt, value, parser): + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=no_cache_dir_callback, + help="Disable the cache.", +) # type: Callable[..., Option] + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Callable[..., Option] + +build_dir = partial( + Option, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Callable[..., Option] + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Callable[..., Option] + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Callable[..., Option] + + +def no_use_pep517_callback(option, opt, value, parser): + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=no_use_pep517_callback, + default=None, + help=SUPPRESS_HELP +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Callable[..., Option] + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Callable[..., Option] + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Callable[..., Option] + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Callable[..., Option] + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Callable[..., Option] + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def _merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} # type: ignore + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Callable[..., Option] + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Callable[..., Option] + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + ] +} # type: Dict[str, Any] + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + ] +} # type: Dict[str, Any] diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/main_parser.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..b17c749 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/main_parser.py @@ -0,0 +1,104 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import ( + commands_dict, get_similar_commands, get_summaries, +) +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List # noqa: F401 + + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + # type: () -> ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + pip_pkg_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), "..", "..", + )) + parser.version = 'pip %s from %s (python %s)' % ( + __version__, pip_pkg_dir, sys.version[:3], + ) + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + command_summaries = get_summaries() + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + parser.description = '\n'.join(description) + + return parser + + +def parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) # type: ignore + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/parser.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/parser.py @@ -0,0 +1,261 @@ +"""Base option parser setup""" +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/status_codes.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/cli/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..c7d1da3 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/check.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/check.py new file mode 100644 index 0000000..801cecc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/check.py @@ -0,0 +1,41 @@ +import logging + +from pip._internal.cli.base_command import Command +from pip._internal.operations.check import ( + check_package_set, create_package_set_from_installed, +) + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + package_set, parsing_probs = create_package_set_from_installed() + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + logger.info( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + logger.info( + "%s %s has requirement %s, but you have %s %s.", + project_name, version, req, dep_name, dep_version, + ) + + if missing or conflicting or parsing_probs: + return 1 + else: + logger.info("No broken requirements found.") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/completion.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/completion.py new file mode 100644 index 0000000..2fcdd39 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/completion.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import sys +import textwrap + +from pip._internal.cli.base_command import Command +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ + _pip_completion() + { + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 ) ) + } + complete -o default -F _pip_completion %(prog)s + """, + 'zsh': """ + function _pip_completion { + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] ) ) + } + compctl -K _pip_completion %(prog)s + """, + 'fish': """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c %(prog)s + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + name = 'completion' + summary = 'A helper command used for command completion.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, '') % { + 'prog': get_prog(), + } + ) + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/configuration.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..826c08d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/configuration.py @@ -0,0 +1,227 @@ +import logging +import os +import subprocess + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import Configuration, kinds +from pip._internal.exceptions import PipError +from pip._internal.locations import venv_config_file +from pip._internal.utils.misc import get_prog + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """Manage local and global configuration. + + Subcommands: + + list: List the active configuration (or from the file specified) + edit: Edit the configuration file in an editor + get: Get the value associated with name + set: Set the name=value + unset: Unset the value associated with name + + If none of --user, --global and --venv are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen on the to the user file by + default. + """ + + name = 'config' + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + summary = "Manage local and global configuration." + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = None + + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help='Use the virtualenv configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".join(sorted(handlers))) + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + file_options = { + kinds.USER: options.user_file, + kinds.GLOBAL: options.global_file, + kinds.VENV: options.venv_file + } + + if sum(file_options.values()) == 0: + if not need_value: + return None + # Default to user, unless there's a virtualenv file. + elif os.path.exists(venv_config_file): + return kinds.VENV + else: + return kinds.USER + elif sum(file_options.values()) == 1: + # There's probably a better expression for this. + return [key for key in file_options if file_options[key]][0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --venv, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + logger.info("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + logger.info("%s", value) + + def set_name_value(self, options, args): + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/download.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/download.py new file mode 100644 index 0000000..a57e4bc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/download.py @@ -0,0 +1,176 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + name = 'download' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + summary = 'Download packages.' + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + cmdoptions.check_dist_restriction(options) + + options.src_dir = os.path.abspath(options.src_dir) + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + self.name, + None + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=options.download_dir, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=None, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=False, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/freeze.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + name = 'freeze' + usage = """ + %prog [options]""" + summary = 'Output installed packages in requirements format.' + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/hash.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + + """ + name = 'hash' + usage = '%prog [options] ...' + summary = 'Compute hashes of package archives.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + logger.info('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/help.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/help.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + name = 'help' + usage = """ + %prog """ + summary = 'Show help for commands.' + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import commands_dict, get_similar_commands + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = commands_dict[cmd_name]() + command.parser.print_help() + + return SUCCESS diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/install.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/install.py new file mode 100644 index 0000000..1c244d2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/install.py @@ -0,0 +1,566 @@ +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +from optparse import SUPPRESS_HELP + +from pip._vendor import pkg_resources + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.cli.status_codes import ERROR +from pip._internal.exceptions import ( + CommandError, InstallationError, PreviousBuildDirError, +) +from pip._internal.locations import distutils_scheme, virtualenv_no_global +from pip._internal.operations.check import check_install_conflicts +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet, install_given_reqs +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ( + ensure_dir, get_installed_version, + protect_pip_from_modification_on_windows, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + name = 'install' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Install packages.' + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + cmdoptions.check_dist_restriction(options, check_target=True) + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if options.prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + install_options.append('--user') + install_options.append('--prefix=') + + target_temp_dir = TempDirectory(kind="target") + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir.create() + install_options.append('--home=' + target_temp_dir.path) + + global_options = options.global_options or [] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + check_supported_wheels=not options.target_dir, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + upgrade_strategy=upgrade_strategy, + force_reinstall=options.force_reinstall, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=options.ignore_installed, + isolated=options.isolated_mode, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + protect_pip_from_modification_on_windows( + modifying_pip=requirement_set.has_requirement("pip") + ) + + # Consider legacy and PEP517-using requirements separately + legacy_requirements = [] + pep517_requirements = [] + for req in requirement_set.requirements.values(): + if req.use_pep517: + pep517_requirements.append(req) + else: + legacy_requirements.append(req) + + # We don't build wheels for legacy requirements if we + # don't have wheel installed or we don't have a cache dir + try: + import wheel # noqa: F401 + build_legacy = bool(options.cache_dir) + except ImportError: + build_legacy = False + + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + + # Always build PEP 517 requirements + build_failures = wb.build( + pep517_requirements, + session=session, autobuilding=True + ) + + if build_legacy: + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + wb.build( + legacy_requirements, + session=session, autobuilding=True + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + if build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in build_failures))) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir.path, + prefix=options.prefix_path, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir.path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + reqs = sorted(installed, key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed = ' '.join(items) + if installed: + logger.info('Successfully installed %s', installed) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + return requirement_set + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _warn_about_conflicts(self, to_install): + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/list.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/list.py new file mode 100644 index 0000000..a640274 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/list.py @@ -0,0 +1,301 @@ +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import CommandError +from pip._internal.index import PackageFinder +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(Command): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, self.parser + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls, session): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder( + find_links=options.find_links, + index_urls=index_urls, + allow_all_prereleases=options.pre, + trusted_hosts=options.trusted_hosts, + session=session, + ) + + def run(self, options, args): + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + ) + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + if not all_candidates: + continue + best_candidate = max(all_candidates, + key=finder._candidate_sort_key) + remote_version = best_candidate.version + if best_candidate.location.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + logger.info("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/search.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap +from collections import OrderedDict + +from pip._vendor import pkg_resources +from pip._vendor.packaging.version import parse as parse_version +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.download import PipXmlrpcTransport +from pip._internal.exceptions import CommandError +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import get_terminal_size +from pip._internal.utils.logging import indent_log + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command): + """Search for PyPI packages whose name or summary contains .""" + name = 'search' + usage = """ + %prog [options] """ + summary = 'Search PyPI for packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + with self._build_session(options) as session: + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + logger.info(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + logger.info('INSTALLED: %s (latest)', dist.version) + else: + logger.info('INSTALLED: %s', dist.version) + logger.info('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/show.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/show.py new file mode 100644 index 0000000..f92c9bc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + name = 'show' + usage = """ + %prog [options] ...""" + summary = 'Show information about installed packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + logger.info("---") + + name = dist.get('name', '') + required_by = [ + pkg.project_name for pkg in pkg_resources.working_set + if name in [required.name for required in pkg.requires()] + ] + + logger.info("Name: %s", name) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + logger.info("Required-by: %s", ', '.join(required_by)) + + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) + logger.info("Entry-points:") + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): + logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") + return results_printed diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/uninstall.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/uninstall.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import install_req_from_line +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + + +class UninstallCommand(Command): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + name = 'uninstall' + usage = """ + %prog [options] ... + %prog [options] -r ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + with self._build_session(options) as session: + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/wheel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..cd72a3d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/commands/wheel.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + name = 'wheel' + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=options.wheel_dir, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + # build wheels + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + no_clean=options.no_clean, + ) + build_failures = wb.build( + requirement_set.requirements.values(), session=session, + ) + if len(build_failures) != 0: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/configuration.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/configuration.py new file mode 100644 index 0000000..fe6df9b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/configuration.py @@ -0,0 +1,387 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import locale +import logging +import os + +from pip._vendor import six +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.locations import ( + legacy_config_file, new_config_file, running_under_virtualenv, + site_config_files, venv_config_file, +) +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + VENV="venv", # Virtual Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration. + """ + self._ensure_have_load_only() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = six.next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the currentin-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) # type: ignore + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self._iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self._get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def _get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def _iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + # at the base we have any global configuration + yield kinds.GLOBAL, list(site_config_files) + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, [legacy_config_file, new_config_file] + + # finally virtualenv configuration first trumping others + if running_under_virtualenv(): + yield kinds.VENV, [venv_config_file] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/download.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/download.py new file mode 100644 index 0000000..2bbe176 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/download.py @@ -0,0 +1,971 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.requests.utils import get_netrc_auth +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models.index import PyPI +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, + display_path, format_size, get_installed_version, rmtree, + split_auth_from_netloc, splitext, unpack_file, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import DownloadProgressProvider +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Dict, IO, Text, Union + ) + from pip._internal.models.link import Link # noqa: F401 + from pip._internal.utils.hashes import Hashes # noqa: F401 + from pip._internal.vcs import AuthInfo # noqa: F401 + +try: + import ssl # noqa +except ImportError: + ssl = None + +HAS_TLS = (ssl is not None) or IS_PYOPENSSL + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": pip.__version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if HAS_TLS: + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True): + # type: (bool) -> None + self.prompting = prompting + self.passwords = {} # type: Dict[str, AuthInfo] + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Split the credentials from the netloc. + netloc, url_user_password = split_auth_from_netloc(parsed.netloc) + + # Set the url of the request to the url without any credentials + req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + # Use the credentials embedded in the url if we have none stored + if username is None: + username, password = url_user_password + + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + + if username or password: + # Store the username and password + self.passwords[netloc] = (username, password) + + # Send the basic auth with this request + req = HTTPBasicAuth(username or "", password or "")(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username = six.moves.input("User for %s: " % parsed.netloc) + password = getpass.getpass("Password: ") + + # Store the new username and password to use for future requests + if username or password: + self.passwords[parsed.netloc] = (username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp, **kwargs): + # warn user that they provided incorrect credentials + if resp.status_code == 401: + logger.warning('401 Error, Credentials not correct for %s', + resp.request.url) + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class SafeFileCache(FileCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, *args, **kwargs): + super(SafeFileCache, self).__init__(*args, **kwargs) + + # Check to ensure that the directory containing our cache directory + # is owned by the user current executing pip. If it does not exist + # we will check the parent directory until we find one that does exist. + # If it is not owned by the user executing pip then we will disable + # the cache and log a warning. + if not check_path_owner(self.directory): + logger.warning( + "The directory '%s' or its parent directory is not owned by " + "the current user and the cache has been disabled. Please " + "check the permissions and owner of that directory. If " + "executing pip with sudo, you may want sudo's -H flag.", + self.directory, + ) + + # Set our directory to None to disable the Cache + self.directory = None + + def get(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).get(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def set(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).set(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def delete(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).delete(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + +class PipSession(requests.Session): + + timeout = None # type: Optional[int] + + def __init__(self, *args, **kwargs): + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + insecure_hosts = kwargs.pop("insecure_hosts", []) + + super(PipSession, self).__init__(*args, **kwargs) + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth() + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache, use_dir_lock=True), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + # We want to use a non-validating adapter for any requests which are + # deemed insecure. + for host in insecure_hosts: + self.mount("https://{}/".format(host), insecure_adapter) + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) + + +def get_file_content(url, comes_from=None, session=None): + # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + + :param url: File path or url. + :param comes_from: Origin description of requirements. + :param session: Instance of pip.download.PipSession. + """ + if session is None: + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) + + match = _scheme_re.search(url) + if match: + scheme = match.group(1).lower() + if (scheme == 'file' and comes_from and + comes_from.startswith('http')): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + if scheme == 'file': + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + else: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) + + +def is_url(name): + # type: (Union[str, Text]) -> bool + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + # type: (str) -> str + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + # if we have a UNC path, prepend UNC share notation + if netloc: + netloc = '\\\\' + netloc + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + # type: (Union[str, Text]) -> str + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def is_archive_file(name): + # type: (str) -> bool + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def unpack_vcs_link(link, location): + vcs_backend = _get_used_vcs_backend(link) + vcs_backend.unpack(location) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + # type: (Link) -> bool + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + # type: (Link) -> bool + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + # type: (Link) -> bool + """Return whether a file:// Link points to a directory. + + ``link`` must not have any other scheme but file://. Call is_file_url() + first. + + """ + link_path = url_to_path(link.url_without_fragment) + return os.path.isdir(link_path) + + +def _progress_indicator(iterable, *args, **kwargs): + return iterable + + +def _download_url( + resp, # type: Response + link, # type: Link + content_file, # type: IO + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> None + try: + total_length = int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + + cached_resp = getattr(resp, "from_cache", False) + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif cached_resp: + show_progress = False + elif total_length > (40 * 1000): + show_progress = True + elif not total_length: + show_progress = True + else: + show_progress = False + + show_url = link.show_url + + def resp_read(chunk_size): + try: + # Special case for urllib3. + for chunk in resp.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = resp.raw.read(chunk_size) + if not chunk: + break + yield chunk + + def written_chunks(chunks): + for chunk in chunks: + content_file.write(chunk) + yield chunk + + progress_indicator = _progress_indicator + + if link.netloc == PyPI.netloc: + url = show_url + else: + url = link.url_without_fragment + + if show_progress: # We don't show progress on cached responses + progress_indicator = DownloadProgressProvider(progress_bar, + max=total_length) + if total_length: + logger.info("Downloading %s (%s)", url, format_size(total_length)) + else: + logger.info("Downloading %s", url) + elif cached_resp: + logger.info("Using cached %s", url) + else: + logger.info("Downloading %s", url) + + logger.debug('Downloading from URL %s', link) + + downloaded_chunks = written_chunks( + progress_indicator( + resp_read(CONTENT_CHUNK_SIZE), + CONTENT_CHUNK_SIZE + ) + ) + if hashes: + hashes.check_against_chunks(downloaded_chunks) + else: + consume(downloaded_chunks) + + +def _copy_file(filename, location, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + if session is None: + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) + + with TempDirectory(kind="unpack") as temp_dir: + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url(link, + session, + temp_dir.path, + hashes, + progress_bar) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified; let's copy the archive there + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + if not already_downloaded_path: + os.unlink(from_path) + + +def unpack_file_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> None + """Unpack link into location. + + If download_dir is provided and link points to a file, make a copy + of the link file inside download_dir. + """ + link_path = url_to_path(link.url_without_fragment) + + # If it's a url to a local directory + if is_dir_url(link): + if os.path.isdir(location): + rmtree(location) + shutil.copytree(link_path, location, symlinks=True) + if download_dir: + logger.info('Link is a directory, ignoring download_dir') + return + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(link_path) + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified and not already downloaded + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + +def _copy_dist_from_dir(link_path, location): + """Copy distribution files in `link_path` to `location`. + + Invoked when user requests to install a local directory. E.g.: + + pip install . + pip install ~/dev/git-repos/python-prompt-toolkit + + """ + + # Note: This is currently VERY SLOW if you have a lot of data in the + # directory, because it copies everything with `shutil.copytree`. + # What it should really do is build an sdist and install that. + # See https://github.com/pypa/pip/issues/2195 + + if os.path.isdir(location): + rmtree(location) + + # build an sdist + setup_py = 'setup.py' + sdist_args = [sys.executable] + sdist_args.append('-c') + sdist_args.append(SETUPTOOLS_SHIM % setup_py) + sdist_args.append('sdist') + sdist_args += ['--dist-dir', location] + logger.info('Running setup.py sdist for %s', link_path) + + with indent_log(): + call_subprocess(sdist_args, cwd=link_path, show_stdout=False) + + # unpack sdist into `location` + sdist = os.path.join(location, os.listdir(location)[0]) + logger.info('Unpacking sdist %s into %s', sdist, location) + unpack_file(sdist, location, content_type=None, link=None) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise + + +def unpack_url( + link, # type: Optional[Link] + location, # type: Optional[str] + download_dir=None, # type: Optional[str] + only_download=False, # type: bool + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + """Unpack link. + If link is a VCS link: + if only_download, export into download_dir and ignore location + else unpack into location + for other types of link: + - unpack into location + - if download_dir, copy the file into download_dir + - if only_download, mark location for deletion + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if is_vcs_url(link): + unpack_vcs_link(link, location) + + # file urls + elif is_file_url(link): + unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + if session is None: + session = PipSession() + + unpack_http_url( + link, + location, + download_dir, + session, + hashes=hashes, + progress_bar=progress_bar + ) + if only_download: + write_delete_marker_file(location) + + +def _download_http_url( + link, # type: Link + session, # type: PipSession + temp_dir, # type: str + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> Tuple[str, str] + """Download link url into temp_dir using provided session""" + target_url = link.url.split('#', 1)[0] + try: + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", exc.response.status_code, link, + ) + raise + + content_type = resp.headers.get('content-type', '') + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(content_type) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + file_path = os.path.join(temp_dir, filename) + with open(file_path, 'wb') as content_file: + _download_url(resp, link, content_file, hashes, progress_bar) + return file_path, content_type + + +def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, Hashes) -> Optional[str] + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + if os.path.exists(download_path): + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + return None diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/exceptions.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/exceptions.py new file mode 100644 index 0000000..38ceeea --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/exceptions.py @@ -0,0 +1,274 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + + +class PipError(Exception): + """Base pip exception""" + + +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None # type: Optional[InstallRequirement] + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + prefix = ' or' + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/index.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/index.py new file mode 100644 index 0000000..9eda3a3 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/index.py @@ -0,0 +1,990 @@ +"""Routines related to PyPI, indexes""" +from __future__ import absolute_import + +import cgi +import itertools +import logging +import mimetypes +import os +import posixpath +import re +import sys +from collections import namedtuple + +from pip._vendor import html5lib, requests, six +from pip._vendor.distlib.compat import unescape +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.requests.exceptions import RetryError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.pep425tags import get_supported +from pip._internal.utils.compat import ipaddress +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, + redact_password_from_url, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from logging import Logger # noqa: F401 + from typing import ( # noqa: F401 + Tuple, Optional, Any, List, Union, Callable, Set, Sequence, + Iterable, MutableMapping + ) + from pip._vendor.packaging.version import _BaseVersion # noqa: F401 + from pip._vendor.requests import Response # noqa: F401 + from pip._internal.req import InstallRequirement # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + SecureOrigin = Tuple[str, str, Optional[str]] + BuildTag = Tuple[Any, ...] # either emply tuple or Tuple[int, str] + CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] + +__all__ = ['FormatControl', 'PackageFinder'] + + +SECURE_ORIGINS = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] # type: List[SecureOrigin] + + +logger = logging.getLogger(__name__) + + +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + _ensure_html_header(resp) + + +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', url) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + _ensure_html_header(resp) + + return resp + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.debug('Cannot look at %s URL %s', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib_parse.urlparse(url) + if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP as exc: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, + ) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except requests.HTTPError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return HTMLPage(resp.content, resp.url, resp.headers) + return None + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + find_links, # type: List[str] + index_urls, # type: List[str] + allow_all_prereleases=False, # type: bool + trusted_hosts=None, # type: Optional[Iterable[str]] + session=None, # type: Optional[PipSession] + format_control=None, # type: Optional[FormatControl] + platform=None, # type: Optional[str] + versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + prefer_binary=False # type: bool + ): + # type: (...) -> None + """Create a PackageFinder. + + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + """ + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + self.find_links = [] # type: List[str] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + self.find_links.append(link) + + self.index_urls = index_urls + + # These are boring links that have already been logged somehow: + self.logged_links = set() # type: Set[Link] + + self.format_control = format_control or FormatControl(set(), set()) + + # Domains that we won't emit warnings for when not using HTTPS + self.secure_origins = [ + ("*", host, "*") + for host in (trusted_hosts if trusted_hosts else []) + ] # type: List[SecureOrigin] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + + # Do we prefer old, but valid, binary dist over new source dist + self.prefer_binary = prefer_binary + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not HAS_TLS: + for link in itertools.chain(self.index_urls, self.find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + def get_formatted_locations(self): + # type: () -> str + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join( + redact_password_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + "Looking in links: {}".format(", ".join(self.find_links)) + ) + return "\n".join(lines) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + def _candidate_sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self.valid_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + support_num = len(self.valid_tags) + build_tag = tuple() # type: BuildTag + binary_preference = 0 + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + if not wheel.supported(self.valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + if self.prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(self.valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + return (binary_preference, candidate.version, build_tag, pri) + + def _validate_secure_origin(self, logger, location): + # type: (Logger, Link) -> bool + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin = (parsed.scheme, parsed.hostname, parsed.port) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + protocol = origin[0].rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in (SECURE_ORIGINS + self.secure_origins): + if protocol != secure_origin[0] and secure_origin[0] != "*": + continue + + try: + # We need to do this decode dance to ensure that we have a + # unicode object, even on Python 2.x. + addr = ipaddress.ip_address( + origin[1] + if ( + isinstance(origin[1], six.text_type) or + origin[1] is None + ) + else origin[1].decode("utf8") + ) + network = ipaddress.ip_network( + secure_origin[1] + if isinstance(secure_origin[1], six.text_type) + # setting secure_origin[1] to proper Union[bytes, str] + # creates problems in other places + else secure_origin[1].decode("utf8") # type: ignore + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if (origin[1] and + origin[1].lower() != secure_origin[1].lower() and + secure_origin[1] != "*"): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port patches + if (origin[2] != secure_origin[2] and + secure_origin[2] != "*" and + secure_origin[2] is not None): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + parsed.hostname, + parsed.hostname, + ) + + return False + + def _get_index_urls_locations(self, project_name): + # type: (str) -> List[str] + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] + + def find_all_candidates(self, project_name): + # type: (str) -> List[Optional[InstallationCandidate]] + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See _link_package_versions for details on which files are accepted + """ + index_locations = self._get_index_urls_locations(project_name) + index_file_loc, index_url_loc = self._sort_locations(index_locations) + fl_file_loc, fl_url_loc = self._sort_locations( + self.find_links, expand_dir=True, + ) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links. + # We want to filter out any thing which does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + ) + if self._validate_secure_origin(logger, link) + ] + + logger.debug('%d location(s) to search for versions of %s:', + len(url_locations), project_name) + + for location in url_locations: + logger.debug('* %s', location) + + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + search = Search(project_name, canonical_name, formats) + find_links_versions = self._package_versions( + # We trust every directly linked archive in find_links + (Link(url, '-f') for url in self.find_links), + search + ) + + page_versions = [] + for page in self._get_pages(url_locations, project_name): + logger.debug('Analyzing links from page %s', page.url) + with indent_log(): + page_versions.extend( + self._package_versions(page.iter_links(), search) + ) + + file_versions = self._package_versions(file_locations, search) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.location.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return file_versions + find_links_versions + page_versions + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + all_candidates = self.find_all_candidates(req.name) + + # Filter out anything which doesn't match our specifier + compatible_versions = set( + req.specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + [str(c.version) for c in all_candidates], + prereleases=( + self.allow_all_prereleases + if self.allow_all_prereleases else None + ), + ) + ) + applicable_candidates = [ + # Again, converting to str to deal with debundling. + c for c in all_candidates if str(c.version) in compatible_versions + ] + + if applicable_candidates: + best_candidate = max(applicable_candidates, + key=self._candidate_sort_key) + else: + best_candidate = None + + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + else: + installed_version = None + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + ', '.join( + sorted( + {str(c.version) for c in all_candidates}, + key=parse_version, + ) + ) + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + ', '.join(sorted(compatible_versions, key=parse_version)) or + "none", + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + ', '.join(sorted(compatible_versions, key=parse_version)) + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + # type: (Iterable[Link], str) -> Iterable[HTMLPage] + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() # type: Set[Link] + for location in locations: + if location in seen: + continue + seen.add(location) + + page = _get_html_page(location, session=self.session) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() # type: Set[Link] + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _package_versions( + self, + links, # type: Iterable[Link] + search # type: Search + ): + # type: (...) -> List[Optional[InstallationCandidate]] + result = [] + for link in self._sort_links(links): + v = self._link_package_versions(link, search) + if v is not None: + result.append(v) + return result + + def _log_skipped_link(self, link, reason): + # type: (Link, str) -> None + if link not in self.logged_links: + logger.debug('Skipping link %s; %s', link, reason) + self.logged_links.add(link) + + def _link_package_versions(self, link, search): + # type: (Link, Search) -> Optional[InstallationCandidate] + """Return an InstallationCandidate or None""" + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + self._log_skipped_link(link, 'not a file') + return None + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return None + if "binary" not in search.formats and ext == WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return None + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return None + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return None + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return None + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return None + + version = wheel.version + + # This should be up by the search.ok_binary check, but see issue 2700. + if "source" not in search.formats and ext != WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return None + + if not version: + version = _egg_info_matches(egg_info, search.canonical) + if not version: + self._log_skipped_link( + link, 'Missing project version for %s' % search.supplied) + return None + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + self._log_skipped_link( + link, 'Python version is incorrect') + return None + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python " + "version in use. Acceptable python versions are: %s", + link, link.requires_python) + return None + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + +def _find_name_version_sep(egg_info, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + `egg_info` must be an egg info string for the given package, and + `canonical_name` must be the package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> egg_info = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(egg_info, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(egg_info): + if c != "-": + continue + if canonicalize_name(egg_info[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(egg_info, canonical_name)) + + +def _egg_info_matches(egg_info, canonical_name): + # type: (str, str) -> Optional[str] + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(egg_info, canonical_name) + 1 + except ValueError: + return None + version = egg_info[version_start:] + if not version: + return None + return version + + +def _determine_base_url(document, page_url): + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _get_encoding_from_headers(headers): + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + +def _clean_link(url): + # type: (str) -> str + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + return _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + # type: (bytes, str, MutableMapping[str, str]) -> None + self.content = content + self.url = url + self.headers = headers + + def __str__(self): + return redact_password_from_url(self.url) + + def iter_links(self): + # type: () -> Iterable[Link] + """Yields all links in the page""" + document = html5lib.parse( + self.content, + transport_encoding=_get_encoding_from_headers(self.headers), + namespaceHTMLElements=False, + ) + base_url = _determine_base_url(document, self.url) + for anchor in document.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self.url, requires_python=pyrequire) + + +Search = namedtuple('Search', 'supplied canonical formats') +"""Capture key aspects of a search. + +:attribute supplied: The user supplied package. +:attribute canonical: The canonical package name. +:attribute formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. +""" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/locations.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/locations.py new file mode 100644 index 0000000..c6e2a3e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/locations.py @@ -0,0 +1,211 @@ +"""Locations where we look for configs, install stuff, etc""" +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS # type: ignore + +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Union, Dict, List, Optional # noqa: F401 + + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def write_delete_marker_file(directory): + # type: (str) -> None + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) + + +def running_under_virtualenv(): + # type: () -> bool + """ + Return True if we're running inside a virtualenv, False otherwise. + + """ + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + + return False + + +def virtualenv_no_global(): + # type: () -> bool + """ + Return True if in a venv and no system site packages. + """ + # this mirrors the logic in virtualenv.py for locating the + # no-global-site-packages.txt file + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') + if running_under_virtualenv() and os.path.isfile(no_global_file): + return True + else: + return False + + +if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') +else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + +# under macOS + virtualenv sys.prefix is not properly resolved +# it is something like /path/to/python/bin/.. +# Note: using realpath due to tmp dirs on OSX being symlinks +src_prefix = os.path.abspath(src_prefix) + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE +user_dir = expanduser('~') +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.ini' + + legacy_storage_dir = os.path.join(user_dir, 'pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.conf' + + legacy_storage_dir = os.path.join(user_dir, '.pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + +site_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +venv_config_file = os.path.join(sys.prefix, config_basename) +new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) + + +def distutils_scheme(dist_name, user=False, home=None, root=None, + isolated=False, prefix=None): + # type:(str, bool, str, str, bool, str) -> dict + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + scheme = {} + + if isolated: + extra_dist_args = {"script_args": ["--no-user-cfg"]} + else: + extra_dist_args = {} + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + d.parse_config_files() + # NOTE: Ignoring type since mypy can't find attributes on 'Command' + i = d.get_command_obj('install', create=True) # type: Any + assert i is not None + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + i.user = user or i.user + if user: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + if 'install_lib' in d.get_option_dict('install'): # type: ignore + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python' + sys.version[:3], + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/candidate.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/candidate.py new file mode 100644 index 0000000..4475458 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/candidate.py @@ -0,0 +1,31 @@ +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.version import _BaseVersion # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + from typing import Any, Union # noqa: F401 + + +class InstallationCandidate(KeyBasedCompareMixin): + """Represents a potential "candidate" for installation. + """ + + def __init__(self, project, version, location): + # type: (Any, str, Link) -> None + self.project = project + self.version = parse_version(version) # type: _BaseVersion + self.location = location + + super(InstallationCandidate, self).__init__( + key=(self.project, self.version, self.location), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.project, self.version, self.location, + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/format_control.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/format_control.py new file mode 100644 index 0000000..971a391 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/format_control.py @@ -0,0 +1,73 @@ +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet # noqa: F401 + + +class FormatControl(object): + """Helper for managing formats from which a package can be installed. + """ + + def __init__(self, no_binary=None, only_binary=None): + # type: (Optional[Set], Optional[Set]) -> None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set], Optional[Set]) -> None + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + # type: () -> None + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/index.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/index.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/index.py @@ -0,0 +1,31 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + # type: (str, str) -> None + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + # type: (str) -> str + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/link.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/link.py new file mode 100644 index 0000000..ad2f93e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/models/link.py @@ -0,0 +1,163 @@ +import posixpath +import re + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import ( + WHEEL_EXTENSION, redact_password_from_url, splitext, +) +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple, Union, Text # noqa: F401 + from pip._internal.index import HTMLPage # noqa: F401 + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL + """ + + def __init__(self, url, comes_from=None, requires_python=None): + # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None + """ + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + requires_python: + String containing the `Requires-Python` metadata field, specified + in PEP 345. This may be specified by a data-requires-python + attribute in the HTML link tag, as described in PEP 503. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self.url = url + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + + super(Link, self).__init__( + key=(self.url), + defining_class=Link + ) + + def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (redact_password_from_url(self.url), + self.comes_from, rp) + else: + return redact_password_from_url(str(self.url)) + + def __repr__(self): + return '' % self + + @property + def filename(self): + # type: () -> str + _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + # type: () -> Tuple[str, str] + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + # type: () -> str + return self.splitext()[1] + + @property + def url_without_fragment(self): + # type: () -> str + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + # type: () -> Optional[str] + match = self._egg_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + # type: () -> Optional[str] + match = self._subdirectory_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + # type: () -> Optional[str] + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + # type: () -> Optional[str] + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + # type: () -> Optional[str] + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_artifact(self): + # type: () -> bool + """ + Determines if this points to an actual artifact (e.g. a tarball) or if + it points to an "abstract" thing like a path or a VCS location. + """ + from pip._internal.vcs import vcs + + if self.scheme in vcs.all_schemes: + return False + + return True diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/check.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/check.py new file mode 100644 index 0000000..0b56eda --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/check.py @@ -0,0 +1,155 @@ +"""Validation of dependencies of packages +""" + +import logging +from collections import namedtuple + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.operations.prepare import make_abstract_dist +from pip._internal.utils.misc import get_installed_distributions +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +logger = logging.getLogger(__name__) + +if MYPY_CHECK_RUNNING: + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from typing import ( # noqa: F401 + Any, Callable, Dict, Optional, Set, Tuple, List + ) + + # Shorthands + PackageSet = Dict[str, 'PackageDetails'] + Missing = Tuple[str, Any] + Conflicting = Tuple[str, str, Any] + + MissingDict = Dict[str, List[Missing]] + ConflictingDict = Dict[str, List[Conflicting]] + CheckResult = Tuple[MissingDict, ConflictingDict] + +PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) + + +def create_package_set_from_installed(**kwargs): + # type: (**Any) -> Tuple[PackageSet, bool] + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + problems = False + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except RequirementParseError as e: + # Don't crash on broken metadata + logging.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + if should_ignore is None: + def should_ignore(name): + return False + + missing = dict() + conflicting = dict() + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + dist = make_abstract_dist(inst_req).dist() + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/freeze.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..388bb73 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/freeze.py @@ -0,0 +1,247 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache # noqa: F401 + from pip._vendor.pkg_resources import ( # noqa: F401 + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + for link in find_links: + yield '-f %s' % link + installations = {} # type: Dict[str, FrozenRequirement] + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist(dist) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue + if exclude_editable and req.editable: + continue + installations[req.name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() # type: Set[str] + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) # type: Dict[str, List[str]] + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = install_req_from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + elif line_req.name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), line_req.name + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[line_req.name]).rstrip() + del installations[line_req.name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if canonicalize_name(installation.name) not in skip: + yield str(installation).rstrip() + + +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vc_type = vcs.get_backend_type(location) + + if not vc_type: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement {!r} in: {!r}', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vc_type.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + vc_type.__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vc_type.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/prepare.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..4f31dd5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/operations/prepare.py @@ -0,0 +1,413 @@ +"""Prepares a distribution for installation +""" + +import logging +import os + +from pip._vendor import pkg_resources, requests + +from pip._internal.build_env import BuildEnvironment +from pip._internal.download import ( + is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, +) +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, + PreviousBuildDirError, VcsHashUnsupported, +) +from pip._internal.utils.compat import expanduser +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.req.req_tracker import RequirementTracker # noqa: F401 + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + # type: (InstallRequirement) -> DistAbstraction + """Factory to make an abstract dist object. + + Preconditions: Either an editable req with a source_dir, or satisfied_by or + a wheel link, or a non-editable req with a source_dir. + + :return: A concrete DistAbstraction. + """ + if req.editable: + return IsSDist(req) + elif req.link and req.link.is_wheel: + return IsWheel(req) + else: + return IsSDist(req) + + +class DistAbstraction(object): + """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. + + The requirements for anything installable are as follows: + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + - we must be able to generate a list of run-time dependencies + without installing any additional packages (or we would + have to either burn time by doing temporary isolated installs + or alternatively violate pips 'don't start installing unless + all requirements are available' rule - neither of which are + desirable). + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + # type: (InstallRequirement) -> None + self.req = req # type: InstallRequirement + + def dist(self): + # type: () -> Any + """Return a setuptools Dist object.""" + raise NotImplementedError + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError + + +class IsWheel(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self): + return self.req.get_dist() + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Prepare for building. We need to: + # 1. Load pyproject.toml (if it exists) + # 2. Set up the build environment + + self.req.load_pyproject_toml() + should_isolate = self.req.use_pep517 and build_isolation + + def _raise_conflicts(conflicting_with, conflicting_reqs): + raise InstallationError( + "Some build dependencies for %s conflict with %s: %s." % ( + self.req, conflicting_with, ', '.join( + '%s is incompatible with %s' % (installed, wanted) + for installed, wanted in sorted(conflicting)))) + + if should_isolate: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, self.req.pyproject_requires, 'overlay', + "Installing build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + _raise_conflicts("PEP 517/518 supported requirements", + conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + with self.req.build_env: + # We need to have the env active when calling the hook. + self.req.spin_message = "Getting requirements to build wheel" + reqs = self.req.pep517_backend.get_requires_for_build_wheel() + conflicting, missing = self.req.build_env.check_requirements(reqs) + if conflicting: + _raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) + + self.req.prepare_metadata() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return self.req.satisfied_by + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + progress_bar, # type: str + build_isolation, # type: bool + req_tracker # type: RequirementTracker + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + + # Where still packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + if wheel_download_dir: + wheel_download_dir = normalize_path(wheel_download_dir) + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + self.progress_bar = progress_bar + + # Is build isolation allowed? + self.build_isolation = build_isolation + + @property + def _download_should_save(self): + # type: () -> bool + # TODO: Modify to reduce indentation needed + if self.download_dir: + self.download_dir = expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def prepare_linked_requirement( + self, + req, # type: InstallRequirement + session, # type: PipSession + finder, # type: PackageFinder + upgrade_allowed, # type: bool + require_hashes # type: bool + ): + # type: (...) -> DistAbstraction + """Prepare a requirement that would be obtained from req.link + """ + # TODO: Breakup into smaller functions + if req.link and req.link.scheme == 'file': + path = url_to_path(req.link.url) + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + req.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '%s' due to a" + " pre-existing build directory (%s). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + % (req, req.source_dir) + ) + req.populate_link(finder, upgrade_allowed, require_hashes) + + # We can't hit this spot and have populate_link return None. + # req.satisfied_by is None here (because we're + # guarded) and upgrade has no impact except when satisfied_by + # is not None. + # Then inside find_requirement existing_applicable -> False + # If no new versions are found, DistributionNotFound is raised, + # otherwise a result is guaranteed. + assert req.link + link = req.link + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if is_vcs_url(link): + raise VcsHashUnsupported() + elif is_file_url(link) and is_dir_url(link): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not require_hashes) + if require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + try: + download_dir = self.download_dir + # We always delete unpacked sdists after pip ran. + autodelete_unpacked = True + if req.link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + if req.link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + unpack_url( + req.link, req.source_dir, + download_dir, autodelete_unpacked, + session=session, hashes=hashes, + progress_bar=self.progress_bar + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement %s because of HTTP ' + 'error %s for URL %s' % + (req, exc, req.link) + ) + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if req.link.scheme in vcs.all_schemes: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + require_hashes, # type: bool + use_user_site, # type: bool + finder # type: PackageFinder + ): + # type: (...) -> DistAbstraction + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if require_hashes: + raise InstallationError( + 'The editable requirement %s cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.' % req + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(use_user_site) + + return abstract_dist + + def prepare_installed_requirement(self, req, require_hashes, skip_reason): + # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to %r" % (req.satisfied_by,) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = Installed(req) + + return abstract_dist diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pep425tags.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pep425tags.py new file mode 100644 index 0000000..1e782d1 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pep425tags.py @@ -0,0 +1,381 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import logging +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +import pip._internal.utils.glibc +from pip._internal.utils.compat import get_extension_suffixes +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Tuple, Callable, List, Optional, Union, Dict + ) + + Pep425Tag = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + # type: (str) -> Optional[str] + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + # type: () -> str + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + # type: () -> str + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + # type: () -> Tuple[int, ...] + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + # attrs exist only on pypy + return (sys.version_info[0], + sys.pypy_version_info.major, # type: ignore + sys.pypy_version_info.minor) # type: ignore + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + # type: () -> str + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + logger.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + # type: () -> Optional[str] + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + # type: () -> bool + return sys.maxsize == 2147483647 + + +def get_platform(): + # type: () -> str + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip._internal.utils.glibc.have_compatible_glibc(2, 5) + + +def is_manylinux2010_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux2010_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 6 uses glibc 2.12. + return pip._internal.utils.glibc.have_compatible_glibc(2, 12) + + +def get_darwin_arches(major, minor, machine): + # type: (int, int, str) -> List[str] + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # type: (int, int, str) -> bool + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) # type: Dict[str, Tuple[str, ...]] + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_all_minor_versions_as_strings(version_info): + # type: (Tuple[int, ...]) -> List[str] + versions = [] + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + return versions + + +def get_supported( + versions=None, # type: Optional[List[str]] + noarch=False, # type: bool + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Pep425Tag] + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + version_info = get_impl_version_info() + versions = get_all_minor_versions_as_strings(version_info) + + impl = impl or get_abbr_impl() + + abis = [] # type: List[str] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_extension_suffixes(): + if suffix.startswith('.abi'): + abi3s.add(suffix.split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches = [arch, 'manylinux1' + arch_sep + arch_suffix] + elif platform is None: + arches = [] + if is_manylinux2010_compatible(): + arches.append('manylinux2010' + arch_sep + arch_suffix) + if is_manylinux1_compatible(): + arches.append('manylinux1' + arch_sep + arch_suffix) + arches.append(arch) + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pyproject.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pyproject.py new file mode 100644 index 0000000..8d739a6 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/pyproject.py @@ -0,0 +1,171 @@ +from __future__ import absolute_import + +import io +import os +import sys + +from pip._vendor import pytoml, six + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Tuple, Optional, List # noqa: F401 + + +def _is_list_of_str(obj): + # type: (Any) -> bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(setup_py_dir): + # type: (str) -> str + path = os.path.join(setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[Tuple[List[str], str, List[str]]] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + backend = build_system.get("build-backend") + check = [] # type: List[str] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return (requires, backend, check) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/__init__.py new file mode 100644 index 0000000..5e4eb92 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/__init__.py @@ -0,0 +1,77 @@ +from __future__ import absolute_import + +import logging + +from .req_install import InstallRequirement +from .req_set import RequirementSet +from .req_file import parse_requirements +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Sequence # noqa: F401 + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, **kwargs +): + # type: (...) -> List[InstallRequirement] + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + with indent_log(): + for requirement in to_install: + if requirement.conflicts_with: + logger.info( + 'Found existing installation: %s', + requirement.conflicts_with, + ) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except Exception: + should_rollback = ( + requirement.conflicts_with and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.conflicts_with and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + requirement.remove_temporary_source() + + return to_install diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/constructors.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/constructors.py new file mode 100644 index 0000000..1eed1dd --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/constructors.py @@ -0,0 +1,339 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import logging +import os +import re + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.download import ( + is_archive_file, is_url, path_to_url, url_to_path, +) +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.pyproject import make_pyproject_path +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.misc import is_installable_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Set, Any, Union, Text, Dict, + ) + from pip._internal.cache import WheelCache # noqa: F401 + + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) + ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + raise InstallationError( + '%s should either be a path to a local project or a VCS url ' + 'beginning with svn+, git+, hg+, or bzr+' % + editable_req + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '%s', please specify one " + "with #egg=your_package_name" % editable_req + ) + return package_name, url, None + + +def deduce_helpful_msg(req): + # type: (str) -> str + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + msg = "" + if os.path.exists(req): + msg = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += " The argument you provided " + \ + "(%s) appears to be a" % (req) + \ + " requirements file. If that is the" + \ + " case, use the '-r' flag to install" + \ + " the packages specified within it." + except RequirementParseError: + logger.debug("Cannot parse '%s' as requirements \ + file" % (req), exc_info=True) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + name, url, extras_override = parse_editable(editable_req) + if url.startswith('file:'): + source_dir = url_to_path(url) + else: + source_dir = None + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % name) + else: + req = None + return InstallRequirement( + req, comes_from, source_dir=source_dir, + editable=True, + link=Link(url), + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=extras_override or (), + ) + + +def install_req_from_line( + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + """ + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + looks_like_dir = os.path.isdir(p) and ( + os.path.sep in name or + (os.path.altsep is not None and os.path.altsep in name) or + name.startswith('.') + ) + if looks_like_dir: + if not is_installable_dir(p): + raise InstallationError( + "Directory %r is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." % name + ) + link = Link(path_to_url(p)) + elif is_archive_file(p): + if not os.path.isfile(p): + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + link = Link(path_to_url(p)) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + if extras_as_string: + extras = Requirement("placeholder" + extras_as_string.lower()).extras + else: + extras = () + if req_as_string is not None: + try: + req = Requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = "" + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) + ) + else: + req = None + + return InstallRequirement( + req, comes_from, link=link, markers=markers, + use_pep517=use_pep517, isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=extras, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if req.url and comes_from.link.netloc in domains_not_allowed: + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "%s depends on %s " % (comes_from.name, req) + ) + + return InstallRequirement( + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_file.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_file.py new file mode 100644 index 0000000..726f2f6 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_file.py @@ -0,0 +1,382 @@ +""" +Requirements file parsing +""" + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.cli import cmdoptions +from pip._internal.download import get_file_content +from pip._internal.exceptions import RequirementsFileParseError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Iterator, Tuple, Optional, List, Callable, Text + ) + from pip._internal.req import InstallRequirement # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + ReqFileLines = Iterator[Tuple[int, Text]] + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s)+#.*$') + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.constraints, + cmdoptions.editable, + cmdoptions.requirements, + cmdoptions.no_index, + cmdoptions.index_url, + cmdoptions.find_links, + cmdoptions.extra_index_url, + cmdoptions.always_unzip, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] # type: List[Callable[..., optparse.Option]] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] # type: List[Callable[..., optparse.Option]] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements( + filename, # type: str + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param session: Instance of pip.download.PipSession. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + :param use_pep517: Value of the --use-pep517 option. + """ + if session is None: + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) + + _, content = get_file_content( + filename, comes_from=comes_from, session=session + ) + + lines_enum = preprocess(content, options) + + for line_number, line in lines_enum: + req_iter = process_line(line, filename, line_number, finder, + comes_from, options, session, wheel_cache, + use_pep517=use_pep517, constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + # type: (Text, Optional[optparse.Values]) -> ReqFileLines + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = skip_regex(lines_enum, options) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def process_line( + line, # type: Text + filename, # type: str + line_number, # type: int + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] + constraint=False # type: bool +): + # type: (...) -> Iterator[InstallRequirement] + """Process a single requirements line; This can result in creating/yielding + requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + + :param constraint: If True, parsing a constraints file. + :param options: OptionParser options that we may update + """ + parser = build_parser(line) + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if constraint else '-r', filename, line_number, + ) + + # yield a line requirement + if args_str: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in opts.__dict__ and opts.__dict__[dest]: + req_options[dest] = opts.__dict__[dest] + yield install_req_from_line( + args_str, line_comes_from, constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, options=req_options, wheel_cache=wheel_cache + ) + + # yield an editable requirement + elif opts.editables: + isolated = options.isolated_mode if options else False + yield install_req_from_editable( + opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, + constraint=constraint, isolated=isolated, wheel_cache=wheel_cache + ) + + # parse a nested requirements file + elif opts.requirements or opts.constraints: + if opts.requirements: + req_path = opts.requirements[0] + nested_constraint = False + else: + req_path = opts.constraints[0] + nested_constraint = True + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join(os.path.dirname(filename), req_path) + # TODO: Why not use `comes_from='-r {} (line {})'` here as well? + parsed_reqs = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parsed_reqs: + yield req + + # percolate hash-checking option upward + elif opts.require_hashes: + options.require_hashes = opts.require_hashes + + # set finder options + elif finder: + if opts.index_url: + finder.index_urls = [opts.index_url] + if opts.no_index is True: + finder.index_urls = [] + if opts.extra_index_urls: + finder.index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + finder.find_links.append(value) + if opts.pre: + finder.allow_all_prereleases = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) # type: ignore + + +def build_parser(line): + # type: (Text) -> optparse.OptionParser + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, msg) + raise RequirementsFileParseError(msg) + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] # type: List[Text] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, options): + # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines + """ + Skip lines that match '--skip-requirements-regex' pattern + + Note: the regex pattern is only built once + """ + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + pattern = re.compile(skip_regex) + lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) + return lines_enum + + +def expand_env_variables(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discusssion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_install.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_install.py new file mode 100644 index 0000000..a4834b0 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_install.py @@ -0,0 +1,1021 @@ +from __future__ import absolute_import + +import logging +import os +import shutil +import sys +import sysconfig +import zipfile +from distutils.util import change_root + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pep517.wrappers import Pep517HookCaller + +from pip._internal import wheel +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, +) +from pip._internal.models.link import Link +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.compat import native_str +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + _make_build_dir, ask_path_exists, backup_dir, call_subprocess, + display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, + get_installed_version, redact_password_from_url, rmtree, +) +from pip._internal.utils.packaging import get_metadata +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner +from pip._internal.vcs import vcs +from pip._internal.wheel import move_wheel_files + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Iterable, List, Union, Any, Text, Sequence, Dict + ) + from pip._internal.build_env import BuildEnvironment # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._vendor.pkg_resources import Distribution # noqa: F401 + from pip._vendor.packaging.specifiers import SpecifierSet # noqa: F401 + from pip._vendor.packaging.markers import Marker # noqa: F401 + + +logger = logging.getLogger(__name__) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relavant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + source_dir=None, # type: Optional[str] + editable=False, # type: bool + link=None, # type: Optional[Link] + update=True, # type: bool + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + extras=() # type: Iterable[str] + ): + # type: (...) -> None + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + if source_dir is not None: + self.source_dir = os.path.normpath(os.path.abspath(source_dir)) + else: + self.source_dir = None + self.editable = editable + + self._wheel_cache = wheel_cache + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + + if extras: + self.extras = extras + elif req: + self.extras = { + pkg_resources.safe_extra(extra) for extra in req.extras + } + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + self._egg_info_path = None # type: Optional[str] + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None + # This hold the pkg_resources.Distribution object if this requirement + # conflicts with another installed distribution: + self.conflicts_with = None + # Temporary build location + self._temp_build_dir = TempDirectory(kind="req-build") + # Used to store the global directory where the _temp_build_dir should + # have been created. Cf _correct_build_location method. + self._ideal_build_dir = None # type: Optional[str] + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None # type: Optional[bool] + # UninstallPathSet of uninstalled distribution (for possible rollback) + self.uninstalled_pathset = None + self.options = options if options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + self.is_direct = False + + self.isolated = isolated + self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory = None # type: Optional[str] + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None # type: Optional[List[str]] + + # Build requirements that we will check are available + self.requirements_to_check = [] # type: List[str] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None # type: Optional[Pep517HookCaller] + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % redact_password_from_url(self.link.url) + elif self.link: + s = redact_password_from_url(self.link.url) + else: + s = '' + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + # type: (PackageFinder, bool, bool) -> None + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If require_hashes is True, don't use the wheel cache, because cached + wheels, always built locally, have different hashes than the files + downloaded from the index server and thus throw false hash mismatches. + Furthermore, cached wheels at present have undeterministic contents due + to file modification times. + """ + if self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + self.link = self._wheel_cache.get(self.link, self.name) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + # type: () -> Optional[str] + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + # type: () -> SpecifierSet + return self.req.specifier + + @property + def is_pinned(self): + # type: () -> bool + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in {'==', '==='}) + + @property + def installed_version(self): + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + # type: (Optional[Iterable[str]]) -> bool + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + @property + def has_hash_options(self): + # type: () -> bool + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.options.get('hashes', {})) + + def hashes(self, trust_internet=True): + # type: (bool) -> Hashes + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.options.get('hashes', {}).copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self): + # type: () -> Optional[str] + """Format a nice indicator to show where this "comes from" + """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def build_location(self, build_dir): + # type: (str) -> Optional[str] + assert build_dir is not None + if self._temp_build_dir.path is not None: + return self._temp_build_dir.path + if self.req is None: + # for requirement via a path to a directory: the name of the + # package is not available yet so we create a temp directory + # Once run_egg_info will have run, we'll be able + # to fix it via _correct_build_location + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir.create() + self._ideal_build_dir = build_dir + + return self._temp_build_dir.path + if self.editable: + name = self.name.lower() + else: + name = self.name + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + _make_build_dir(build_dir) + return os.path.join(build_dir, name) + + def _correct_build_location(self): + # type: () -> None + """Move self._temp_build_dir to self._ideal_build_dir/self.req.name + + For some requirements (e.g. a path to a directory), the name of the + package is not available until we run egg_info, so the build_location + will return a temporary directory and store the _ideal_build_dir. + + This is only called by self.run_egg_info to fix the temporary build + directory. + """ + if self.source_dir is not None: + return + assert self.req is not None + assert self._temp_build_dir.path + assert (self._ideal_build_dir is not None and + self._ideal_build_dir.path) # type: ignore + old_location = self._temp_build_dir.path + self._temp_build_dir.path = None + + new_location = self.build_location(self._ideal_build_dir) + if os.path.exists(new_location): + raise InstallationError( + 'A package already exists in %s; please remove it to continue' + % display_path(new_location)) + logger.debug( + 'Moving package %s from %s to new location %s', + self, display_path(old_location), display_path(new_location), + ) + shutil.move(old_location, new_location) + self._temp_build_dir.path = new_location + self._ideal_build_dir = None + self.source_dir = os.path.normpath(os.path.abspath(new_location)) + self._egg_info_path = None + + # Correct the metadata directory, if it exists + if self.metadata_directory: + old_meta = self.metadata_directory + rel = os.path.relpath(old_meta, start=old_location) + new_meta = os.path.join(new_location, rel) + new_meta = os.path.normpath(os.path.abspath(new_meta)) + self.metadata_directory = new_meta + + def remove_temporary_source(self): + # type: () -> None + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and os.path.exists( + os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + self._temp_build_dir.cleanup() + self.build_env.cleanup() + + def check_if_exists(self, use_user_site): + # type: (bool) -> bool + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately. + """ + if self.req is None: + return False + try: + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.conflicts_with = existing_dist + return True + + # Things valid for wheels + @property + def is_wheel(self): + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel + + def move_wheel_files( + self, + wheeldir, # type: str + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + move_wheel_files( + self.name, self.req, wheeldir, + user=use_user_site, + home=home, + root=root, + prefix=prefix, + pycompile=pycompile, + isolated=self.isolated, + warn_script_location=warn_script_location, + ) + + # Things valid for sdists + @property + def setup_py_dir(self): + # type: () -> str + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + setup_py = os.path.join(self.setup_py_dir, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + return make_pyproject_path(self.setup_py_dir) + + def load_pyproject_toml(self): + # type: () -> None + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pep517_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml, + self.setup_py, + str(self) + ) + + if pep517_data is None: + self.use_pep517 = False + else: + self.use_pep517 = True + requires, backend, check = pep517_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) + + # Use a custom function to call subprocesses + self.spin_message = "" + + def runner(cmd, cwd=None, extra_environ=None): + with open_spinner(self.spin_message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + show_stdout=False, + spinner=spinner + ) + self.spin_message = "" + + self.pep517_backend._subprocess_runner = runner + + def prepare_metadata(self): + # type: () -> None + """Ensure that project metadata is available. + + Under PEP 517, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir + + with indent_log(): + if self.use_pep517: + self.prepare_pep517_metadata() + else: + self.run_egg_info() + + if not self.req: + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + logger.warning( + 'Generating metadata for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def prepare_pep517_metadata(self): + # type: () -> None + assert self.pep517_backend is not None + + metadata_dir = os.path.join( + self.setup_py_dir, + 'pip-wheel-metadata' + ) + ensure_dir(metadata_dir) + + with self.build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + + def run_egg_info(self): + # type: () -> None + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] # type: List[str] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + with self.build_env: + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + show_stdout=False, + command_desc='python setup.py egg_info') + + @property + def egg_info_path(self): + # type: () -> str + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.setup_py_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv + # environment + if ( + os.path.lexists( + os.path.join(root, dir, 'bin', 'python') + ) or + os.path.exists( + os.path.join( + root, dir, 'Scripts', 'Python.exe' + ) + )): + dirs.remove(dir) + # Also don't search through tests + elif dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError( + "Files/directories not found in %s" % base + ) + # if we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort( + key=lambda x: x.count(os.path.sep) + + (os.path.altsep and x.count(os.path.altsep) or 0) + ) + self._egg_info_path = os.path.join(base, filenames[0]) + return self._egg_info_path + + @property + def metadata(self): + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + # type: () -> Distribution + """Return a pkg_resources.Distribution for this requirement""" + if self.metadata_directory: + base_dir, distinfo = os.path.split(self.metadata_directory) + metadata = pkg_resources.PathMetadata( + base_dir, self.metadata_directory + ) + dist_name = os.path.splitext(distinfo)[0] + typ = pkg_resources.DistInfoDistribution + else: + egg_info = self.egg_info_path.rstrip(os.path.sep) + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + # https://github.com/python/mypy/issues/1174 + typ = pkg_resources.Distribution # type: ignore + + return typ( + base_dir, + project_name=dist_name, + metadata=metadata, + ) + + def assert_source_matches_version(self): + # type: () -> None + assert self.source_dir + version = self.metadata['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir(self, parent_dir): + # type: (str) -> str + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.build_location(parent_dir) + return self.source_dir + + # For editable installations + def install_editable( + self, + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + prefix=None # type: Optional[str] + ): + # type: (...) -> None + logger.info('Running setup.py develop for %s', self.name) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + if prefix: + prefix_param = ['--prefix={}'.format(prefix)] + install_options = list(install_options) + prefix_param + + with indent_log(): + # FIXME: should we do --install-headers here too? + with self.build_env: + call_subprocess( + [ + sys.executable, + '-c', + SETUPTOOLS_SHIM % self.setup_py + ] + + list(global_options) + + ['develop', '--no-deps'] + + list(install_options), + + cwd=self.setup_py_dir, + show_stdout=False, + ) + + self.install_succeeded = True + + def update_editable(self, obtain=True): + # type: (bool) -> None + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, "bad url: %r" % self.link.url + if not self.update: + return + vc_type, url = self.link.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False, + use_user_site=False): + # type: (bool, bool, bool) -> Optional[UninstallPathSet] + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + if not self.check_if_exists(use_user_site): + logger.warning("Skipping %s as it is not installed.", self.name) + return None + dist = self.satisfied_by or self.conflicts_with + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _clean_zip_name(self, name, prefix): # only used by archive. + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + def _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + path = os.path.join(parentdir, path) + name = self._clean_zip_name(path, rootdir) + return self.name + '/' + name + + # TODO: Investigate if this should be kept in InstallRequirement + # Seems to be used only when VCS + downloads + def archive(self, build_dir): + # type: (str) -> None + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + if create_archive: + zip = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, + allowZip64=True + ) + dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dir_arcname = self._get_archive_name(dirname, + parentdir=dirpath, + rootdir=dir) + zipdir = zipfile.ZipInfo(dir_arcname + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + file_arcname = self._get_archive_name(filename, + parentdir=dirpath, + rootdir=dir) + filename = os.path.join(dirpath, filename) + zip.write(filename, file_arcname) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def install( + self, + install_options, # type: List[str] + global_options=None, # type: Optional[Sequence[str]] + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + global_options = global_options if global_options is not None else [] + if self.editable: + self.install_editable( + install_options, global_options, prefix=prefix, + ) + return + if self.is_wheel: + version = wheel.wheel_version(self.source_dir) + wheel.check_compatibility(version, self.name) + + self.move_wheel_files( + self.source_dir, root=root, prefix=prefix, home=home, + warn_script_location=warn_script_location, + use_user_site=use_user_site, pycompile=pycompile, + ) + self.install_succeeded = True + return + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + \ + self.options.get('global_options', []) + install_options = list(install_options) + \ + self.options.get('install_options', []) + + if self.isolated: + # https://github.com/python/mypy/issues/1174 + global_options = global_options + ["--no-user-cfg"] # type: ignore + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = self.get_install_args( + global_options, record_filename, root, prefix, pycompile, + ) + msg = 'Running setup.py install for %s' % (self.name,) + with open_spinner(msg) as spinner: + with indent_log(): + with self.build_env: + call_subprocess( + install_args + install_options, + cwd=self.setup_py_dir, + show_stdout=False, + spinner=spinner, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + self.install_succeeded = True + + def prepend_root(path): + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + with open(record_filename) as f: + for line in f: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + logger.warning( + 'Could not find .egg-info directory in install record' + ' for %s', + self, + ) + # FIXME: put the record somewhere + # FIXME: should this be an error? + return + new_lines = [] + with open(record_filename) as f: + for line in f: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') + + def get_install_args( + self, + global_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + pycompile # type: bool + ): + # type: (...) -> List[str] + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_set.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_set.py new file mode 100644 index 0000000..d1410e9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_set.py @@ -0,0 +1,197 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, List, Tuple, Dict, Iterable # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False, check_supported_wheels=True): + # type: (bool, bool) -> None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.require_hashes = require_hashes + self.check_supported_wheels = check_supported_wheels + + # Mapping of alias: real_name + self.requirement_aliases = {} # type: Dict[str, str] + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] + + def __str__(self): + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def __repr__(self): + reqs = [req for req in self.requirements.values()] + reqs.sort(key=lambda req: req.name.lower()) + reqs_str = ', '.join([str(req.req) for req in reqs]) + return ('<%s object; %d requirement(s): %s>' + % (self.__class__.__name__, len(reqs), reqs_str)) + + def add_requirement( + self, + install_req, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + name = install_req.name + + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if self.check_supported_wheels and not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_req, name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + # We'd want to rescan this requirements later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple(sorted( + set(existing_req.extras) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, project_name): + # type: (str) -> bool + name = project_name.lower() + if (name in self.requirements and + not self.requirements[name].constraint or + name in self.requirement_aliases and + not self.requirements[self.requirement_aliases[name]].constraint): + return True + return False + + @property + def has_requirements(self): + # type: () -> List[InstallRequirement] + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + def get_requirement(self, project_name): + # type: (str) -> InstallRequirement + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def cleanup_files(self): + # type: () -> None + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_tracker.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..82e084a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_tracker.py @@ -0,0 +1,88 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Set, Iterator # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + +logger = logging.getLogger(__name__) + + +class RequirementTracker(object): + + def __init__(self): + # type: () -> None + self._root = os.environ.get('PIP_REQ_TRACKER') + if self._root is None: + self._temp_dir = TempDirectory(delete=False, kind='req-tracker') + self._temp_dir.create() + self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path + logger.debug('Created requirements tracker %r', self._root) + else: + self._temp_dir = None + logger.debug('Re-using requirements tracker %r', self._root) + self._entries = set() # type: Set[InstallRequirement] + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.cleanup() + + def _entry_path(self, link): + # type: (Link) -> str + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + # type: (InstallRequirement) -> None + link = req.link + info = str(req) + entry_path = self._entry_path(link) + try: + with open(entry_path) as fp: + # Error, these's already a build in progress. + raise LookupError('%s is already being built: %s' + % (link, fp.read())) + except IOError as e: + if e.errno != errno.ENOENT: + raise + assert req not in self._entries + with open(entry_path, 'w') as fp: + fp.write(info) + self._entries.add(req) + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + link = req.link + self._entries.remove(req) + os.unlink(self._entry_path(link)) + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + # type: () -> None + for req in set(self._entries): + self.remove(req) + remove = self._temp_dir is not None + if remove: + self._temp_dir.cleanup() + logger.debug('%s build tracker %r', + 'Removed' if remove else 'Cleaned', + self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_uninstall.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..c80959e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/req/req_uninstall.py @@ -0,0 +1,596 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, + normalize_path, renames, rmtree, +) +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + path = os.path.join(dn, base + '.pyo') + yield path + + +def compact(paths): + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths): + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() + + def norm_join(*a): + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() + all_subdirs = set() + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths): + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = list(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + _normcased_files = set(map(os.path.normcase, files)) + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_files): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] + + def _get_directory_stash(self, path): + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) + save_dir.create() + except OSError: + save_dir = TempDirectory(kind="uninstall") + save_dir.create() + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + save_dir.create() + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + """Stashes the directory or file and returns its new location. + """ + if os.path.isdir(path): + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if os.path.isdir(path) and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logging.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + return bool(self._moves) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm=False, verbose=False): + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.debug('Removing file or directory %s', path) + + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = list(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return False + logger.info('Rolling back uninstall of %s', self.dist.project_name) + self._moved_paths.rollback() + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() + self._saved_lines = None + + def add(self, entry): + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/resolve.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/resolve.py new file mode 100644 index 0000000..33f572f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/resolve.py @@ -0,0 +1,393 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +import logging +from collections import defaultdict +from itertools import chain + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, + UnsupportedPythonVersion, +) +from pip._internal.req.constructors import install_req_from_req_string +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, ensure_dir +from pip._internal.utils.packaging import check_dist_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, DefaultDict, List, Set # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.req.req_set import RequirementSet # noqa: F401 + from pip._internal.operations.prepare import ( # noqa: F401 + DistAbstraction, RequirementPreparer + ) + from pip._internal.cache import WheelCache # noqa: F401 + +logger = logging.getLogger(__name__) + + +class Resolver(object): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer, # type: RequirementPreparer + session, # type: PipSession + finder, # type: PackageFinder + wheel_cache, # type: Optional[WheelCache] + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + isolated, # type: bool + upgrade_strategy, # type: str + use_pep517=None # type: Optional[bool] + ): + # type: (...) -> None + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + self.preparer = preparer + self.finder = finder + self.session = session + + # NOTE: This would eventually be replaced with a cache that can give + # information about both sdist and wheels transparently. + self.wheel_cache = wheel_cache + + # This is set in resolve + self.require_hashes = None # type: Optional[bool] + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.isolated = isolated + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self.use_pep517 = use_pep517 + + self._discovered_dependencies = \ + defaultdict(list) # type: DefaultDict[str, List] + + def resolve(self, requirement_set): + # type: (RequirementSet) -> None + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + # make the wheelhouse + if self.preparer.wheel_download_dir: + ensure_dir(self.preparer.wheel_download_dir) + + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + self.require_hashes = ( + requirement_set.require_hashes or + any(req.has_hash_options for req in root_reqs) + ) + + # Display where finder is looking for packages + locations = self.finder.get_formatted_locations() + if locations: + logger.info(locations) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] # type: List[InstallRequirement] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend( + self._resolve_one(requirement_set, req) + ) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + # type: (InstallRequirement) -> bool + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.is_direct + + def _set_req_to_reinstall(self, req): + # type: (InstallRequirement) -> None + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.conflicts_with = req.satisfied_by + req.satisfied_by = None + + # XXX: Stop passing requirement_set for options + def _check_skip_installed(self, req_to_install): + # type: (InstallRequirement) -> Optional[str] + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'already satisfied, skipping upgrade' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> DistAbstraction + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + assert self.require_hashes is not None, ( + "require_hashes should have been set in Resolver.resolve()" + ) + + if req.editable: + return self.preparer.prepare_editable_requirement( + req, self.require_hashes, self.use_user_site, self.finder, + ) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, self.require_hashes, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + abstract_dist = self.preparer.prepare_linked_requirement( + req, self.session, self.finder, upgrade_allowed, + self.require_hashes + ) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one( + self, + requirement_set, # type: RequirementSet + req_to_install # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.dist() + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = install_req_from_req_string( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + use_pep517=self.use_pep517 + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + req_to_install.is_direct = True + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + return more_reqs + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() # type: Set[InstallRequirement] + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/appdirs.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..9af9fa7 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/appdirs.py @@ -0,0 +1,270 @@ +""" +This code was taken from https://github.com/ActiveState/appdirs and modified +to suit our purposes. +""" +from __future__ import absolute_import + +import os +import sys + +from pip._vendor.six import PY2, text_type + +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + List, Union + ) + + +def user_cache_dir(appname): + # type: (str) -> str + r""" + Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + + Typical user cache directories are: + macOS: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Windows: C:\Users\\AppData\Local\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go + in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the + non-roaming app data dir (the default returned by `user_data_dir`). Apps + typically put cache data somewhere *under* the given dir here. Some + examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + """ + if WINDOWS: + # Get the base path + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + + # Add our app name and Cache directory to it + path = os.path.join(path, appname, "Cache") + elif sys.platform == "darwin": + # Get the base path + path = expanduser("~/Library/Caches") + + # Add our app name to it + path = os.path.join(path, appname) + else: + # Get the base path + path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) + + # Add our app name to it + path = os.path.join(path, appname) + + return path + + +def user_data_dir(appname, roaming=False): + # type: (str, bool) -> str + r""" + Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/ + if it exists, else ~/.config/ + Unix: ~/.local/share/ # or in + $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\ ... + ...Application Data\ + Win XP (roaming): C:\Documents and Settings\\Local ... + ...Settings\Application Data\ + Win 7 (not roaming): C:\\Users\\AppData\Local\ + Win 7 (roaming): C:\\Users\\AppData\Roaming\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if WINDOWS: + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) + elif sys.platform == "darwin": + path = os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) if os.path.isdir(os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) + ) else os.path.join( + expanduser('~/.config/'), + appname, + ) + else: + path = os.path.join( + os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), + appname, + ) + + return path + + +def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str + """Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default True) can be set False to not use the + Windows roaming appdata directory. That means that for users on a + Windows network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/ + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if WINDOWS: + path = user_data_dir(appname, roaming=roaming) + elif sys.platform == "darwin": + path = user_data_dir(appname) + else: + path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) + path = os.path.join(path, appname) + + return path + + +# for the discussion regarding site_config_dirs locations +# see +def site_config_dirs(appname): + # type: (str) -> List[str] + r"""Return a list of potential user-shared config dirs for this application. + + "appname" is the name of application. + + Typical user config directories are: + macOS: /Library/Application Support// + Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in + $XDG_CONFIG_DIRS + Win XP: C:\Documents and Settings\All Users\Application ... + ...Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory + on Vista.) + Win 7: Hidden, but writeable on Win 7: + C:\ProgramData\\ + """ + if WINDOWS: + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + pathlist = [os.path.join(path, appname)] + elif sys.platform == 'darwin': + pathlist = [os.path.join('/Library/Application Support', appname)] + else: + # try looking in $XDG_CONFIG_DIRS + xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + if xdg_config_dirs: + pathlist = [ + os.path.join(expanduser(x), appname) + for x in xdg_config_dirs.split(os.pathsep) + ] + else: + pathlist = [] + + # always look in /etc directly as well + pathlist.append('/etc') + + return pathlist + + +# -- Windows support functions -- + +def _get_win_folder_from_registry(csidl_name): + # type: (str) -> str + """ + This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + directory, _type = _winreg.QueryValueEx(key, shell_folder_name) + return directory + + +def _get_win_folder_with_ctypes(csidl_name): + # type: (str) -> str + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + + +if WINDOWS: + try: + import ctypes + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + . + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/compat.py new file mode 100644 index 0000000..2d8b3bf --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/compat.py @@ -0,0 +1,264 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import text_type + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Text # noqa: F401 + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", + "get_extension_suffixes", +] + + +logger = logging.getLogger(__name__) + +if sys.version_info >= (3, 4): + uses_pycache = True + from importlib.util import cache_from_source +else: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None + + +if sys.version_info >= (3, 5): + backslashreplace_decode = "backslashreplace" +else: + # In version 3.4 and older, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + if sys.version_info[0] == 2: + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(u"\\x%x" % c for c in raw_bytes), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" + + +def console_to_str(data): + # type: (bytes) -> Text + """Return a string, safe for output, of subprocess output. + + We assume the data is in the locale preferred encoding. + If it won't decode properly, we warn the user but decode as + best we can. + + We also ensure that the output can be safely written to + standard output without encoding errors. + """ + + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + # type: (str, bool) -> str + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # type: (str, bool) -> str + # Replace is ignored -- unicode to UTF-8 can't fail + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +def get_path_uid(path): + # type: (str) -> int + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +if sys.version_info >= (3, 4): + from importlib.machinery import EXTENSION_SUFFIXES + + def get_extension_suffixes(): + return EXTENSION_SUFFIXES +else: + from imp import get_suffixes + + def get_extension_suffixes(): + return [suffix[0] for suffix in get_suffixes()] + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + # type: (str, str) -> bool + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/deprecation.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..0beaf74 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/deprecation.py @@ -0,0 +1,90 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # type: () -> None + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is purposely eagerly formatted as we want it to appear as if someone + # typed this entire message out. + message = "DEPRECATION: " + reason + if replacement is not None: + message += " A possible replacement is {}.".format(replacement) + if issue is not None: + url = "https://github.com/pypa/pip/issues/" + str(issue) + message += " You can find discussion regarding this at {}.".format(url) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/encoding.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..d36defa --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/encoding.py @@ -0,0 +1,39 @@ +import codecs +import locale +import re +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text # noqa: F401 + +BOMS = [ + (codecs.BOM_UTF8, 'utf8'), + (codecs.BOM_UTF16, 'utf16'), + (codecs.BOM_UTF16_BE, 'utf16-be'), + (codecs.BOM_UTF16_LE, 'utf16-le'), + (codecs.BOM_UTF32, 'utf32'), + (codecs.BOM_UTF32_BE, 'utf32-be'), + (codecs.BOM_UTF32_LE, 'utf32-le'), +] # type: List[Tuple[bytes, Text]] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + # type: (bytes) -> Text + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/filesystem.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e6b033 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/filesystem.py @@ -0,0 +1,30 @@ +import os +import os.path + +from pip._internal.utils.compat import get_path_uid + + +def check_path_owner(path): + # type: (str) -> bool + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if not hasattr(os, "geteuid"): + return True + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/glibc.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..8a51f69 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/glibc.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import + +import ctypes +import re +import warnings + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple # noqa: F401 + + +def glibc_version_string(): + # type: () -> Optional[str] + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # type: (str, int, int) -> bool + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + # type: (int, int) -> bool + version_str = glibc_version_string() # type: Optional[str] + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + # type: () -> Tuple[str, str] + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/hashes.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..c6df7a1 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/hashes.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, HashMissing, InstallationError, +) +from pip._internal.utils.misc import read_chunks +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash # noqa: F401 + else: + from hashlib import _hash as _Hash # noqa: F401 + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + # type: (Dict[str, List[str]]) -> None + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + def check_against_chunks(self, chunks): + # type: (Iterator[bytes]) -> None + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + # type: (BinaryIO) -> None + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + # type: (str) -> None + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + # type: () -> bool + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + # type: () -> None + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/logging.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/logging.py new file mode 100644 index 0000000..579d696 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/logging.py @@ -0,0 +1,318 @@ +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys + +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.misc import ensure_dir + +try: + import threading +except ImportError: + import dummy_threading as threading # type: ignore + + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + + +_log_state = threading.local() +_log_state.indentation = 0 + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + def __init__(self, *args, **kwargs): + """ + A logging.Formatter obeying containing indent_log contexts. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + prefix = '' + if self.add_timestamp: + prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") + prefix += " " * get_indentation() + formatted = "".join([ + prefix + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(colorama.Fore.RED)), + (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ANSI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(logging.Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + level_number = getattr(logging, level) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": ["console", "console_errors"] + ( + ["user_log"] if include_user_log else [] + ), + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/misc.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/misc.py new file mode 100644 index 0000000..84605ee --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/misc.py @@ -0,0 +1,1040 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +import locale +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import os +import posixpath +import re +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 +from pip._vendor.six.moves import input +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote + +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) +from pip._internal.utils.compat import ( + WINDOWS, console_to_str, expanduser, stdlib_pkgs, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, + AnyStr, Container + ) + from pip._vendor.pkg_resources import Distribution # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + from pip._internal.utils.ui import SpinnerInterface # noqa: F401 + + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = std_logging.getLogger(__name__) + +WHEEL_EXTENSION = '.whl' +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + # type: () -> str + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + # type: (str, bool) -> None + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + # if file type currently read only + if os.stat(path).st_mode & stat.S_IREAD: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def display_path(path): + # type: (Union[str, Text]) -> str + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + # type: (str, str) -> str + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + # type: (str, Iterable[str]) -> str + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + # type: (str, Iterable[str]) -> str + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def format_size(bytes): + # type: (float) -> str + if bytes > 1000 * 1000: + return '%.1fMB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%ikB' % (bytes / 1000) + elif bytes > 1000: + return '%.1fkB' % (bytes / 1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def is_svn_page(html): + # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] + """ + Returns true if the page appears to be the index page of an svn repository + """ + return (re.search(r'[^<]*Revision \d+:', html) and + re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + # type: (str) -> Text + with open(filename, 'rb') as fp: + return fp.read().decode('utf-8') + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] + path = path.lstrip('/').lstrip('\\') + if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return [path, ''] + + +def has_leading_dir(paths): + # type: (Iterable[Union[str, Text]]) -> bool + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + # type: (str) -> Tuple[str, str] + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + # type: (str, str) -> None + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + # type: (str) -> bool + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + """ + if not running_under_virtualenv(): + return True + return normalize_path(path).startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in user site. + """ + norm_path = normalize_path(dist_location(dist)) + return norm_path.startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return normalize_path( + dist_location(dist) + ).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is an editable install. + """ + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions(local_only=True, + skip=stdlib_pkgs, + include_editables=True, + editables_only=False, + user_only=False): + # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + """ + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + # because of pkg_resources vendoring, mypy cannot find stub in typeshed + return [d for d in pkg_resources.working_set # type: ignore + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + # type: (Distribution) -> Optional[str] + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + return None + + +def dist_location(dist): + # type: (Distribution) -> str + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def unzip_file(filename, location, flatten=True): + # type: (str, str, bool) -> None + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + # type: (str, str) -> None + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + leading = has_leading_dir([ + member.name for member in tar.getmembers() + ]) + for member in tar.getmembers(): + fn = member.name + if leading: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file( + filename, # type: str + location, # type: str + content_type, # type: Optional[str] + link # type: Optional[Link] +): + # type: (...) -> None + filename = os.path.realpath(filename) + if (content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename)): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif (content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): + untar_file(filename, location) + elif (content_type and content_type.startswith('text/html') and + is_svn_page(file_contents(filename))): + # We don't really care about this + from pip._internal.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of %s' % location + ) + + +def call_subprocess( + cmd, # type: List[str] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None # type: Optional[SpinnerInterface] +): + # type: (...) -> Optional[Text] + """ + Args: + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # This function's handling of subprocess output is confusing and I + # previously broke it terribly, so as penance I will write a long comment + # explaining things. + # + # The obvious thing that affects output is the show_stdout= + # kwarg. show_stdout=True means, let the subprocess write directly to our + # stdout. Even though it is nominally the default, it is almost never used + # inside pip (and should not be used in new code without a very good + # reason); as of 2016-02-22 it is only used in a few places inside the VCS + # wrapper code. Ideally we should get rid of it entirely, because it + # creates a lot of complexity here for a rarely used feature. + # + # Most places in pip set show_stdout=False. What this means is: + # - We connect the child stdout to a pipe, which we read. + # - By default, we hide the output but show a spinner -- unless the + # subprocess exits with an error, in which case we show the output. + # - If the --verbose option was passed (= loglevel is DEBUG), then we show + # the output unconditionally. (But in this case we don't want to show + # the output a second time if it turns out that there was an error.) + # + # stderr is always merged with stdout (even if show_stdout=True). + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + logger.debug("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=stdout, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + if stdout is not None: + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if logger.getEffectiveLevel() <= std_logging.DEBUG: + # Show the line immediately + logger.debug(line) + else: + # Update the spinner + if spinner is not None: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + if spinner is not None: + if proc.returncode: + spinner.finish("error") + else: + spinner.finish("done") + if proc.returncode and proc.returncode not in extra_ok_returncodes: + if on_returncode == 'raise': + if (logger.getEffectiveLevel() > std_logging.DEBUG and + not show_stdout): + logger.info( + 'Complete output from command %s:', command_desc, + ) + logger.info( + ''.join(all_output) + + '\n----------------------------------------' + ) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + if not show_stdout: + return ''.join(all_output) + return None + + +def read_text_file(filename): + # type: (str) -> str + """Return the contents of *filename*. + + Try to decode the file contents with utf-8, the preferred system encoding + (e.g., cp1252 on some Windows machines), and latin1, in that order. + Decoding a byte string with latin1 will never raise an error. In the worst + case, the returned string will contain some garbage characters. + + """ + with open(filename, 'rb') as fp: + data = fp.read() + + encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] + for enc in encodings: + try: + # https://github.com/python/mypy/issues/1174 + data = data.decode(enc) # type: ignore + except UnicodeDecodeError: + continue + break + + assert not isinstance(data, bytes) # Latin1 should have worked. + return data + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) + + +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the password in a netloc with "****", if it exists. + + For example, "user:pass@example.com" returns "user:****@example.com". + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + password = '' if password is None else ':****' + return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + purl = urllib_parse.urlsplit(url) + netloc = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc)[0] + + +def remove_auth_from_url(url): + # type: (str) -> str + # Return a copy of url with 'username:password@' removed. + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc) + + +def redact_password_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, redact_netloc) + + +def protect_pip_from_modification_on_windows(modifying_pip): + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/models.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/models.py @@ -0,0 +1,40 @@ +"""Utilities for defining models +""" + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparision capabilities that is based on a key + """ + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/outdated.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..37c47a4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/outdated.py @@ -0,0 +1,164 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile, pkg_resources +from pip._vendor.packaging import version as packaging_version + +from pip._internal.index import PackageFinder +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse # noqa: F401 + from typing import Any, Dict # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class SelfCheckState(object): + def __init__(self, cache_dir): + # type: (str) -> None + self.state = {} # type: Dict[str, Any] + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join(cache_dir, "selfcheck.json") + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + # Attempt to write out our version check file + with lockfile.LockFile(self.statefile_path): + if os.path.exists(self.statefile_path): + with open(self.statefile_path) as statefile: + state = json.load(statefile) + else: + state = {} + + state[sys.prefix] = { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + with open(self.statefile_path, "w") as statefile: + json.dump(state, statefile, sort_keys=True, + separators=(",", ":")) + + +def was_installed_by_pip(pkg): + # type: (str) -> bool + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return (dist.has_metadata('INSTALLER') and + 'pip' in dist.get_metadata_lines('INSTALLER')) + except pkg_resources.DistributionNotFound: + return False + + +def pip_version_check(session, options): + # type: (PipSession, optparse.Values) -> None + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + finder = PackageFinder( + find_links=options.find_links, + index_urls=[options.index_url] + options.extra_index_urls, + allow_all_prereleases=False, # Explicitly set to False + trusted_hosts=options.trusted_hosts, + session=session, + ) + all_candidates = finder.find_all_candidates("pip") + if not all_candidates: + return + pypi_version = str( + max(all_candidates, key=lambda c: c.version).version + ) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + # Determine if our pypi_version is older + if (pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip')): + # Advise "python -m pip" on Windows to avoid issues + # with overwriting pip.exe. + if WINDOWS: + pip_cmd = "python -m pip" + else: + pip_cmd = "pip" + logger.warning( + "You are using pip version %s, however version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/packaging.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..7aaf7b5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/packaging.py @@ -0,0 +1,85 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal import exceptions +from pip._internal.utils.misc import display_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + from email.message import Message # noqa: F401 + from pip._vendor.pkg_resources import Distribution # noqa: F401 + + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + # type: (Optional[str]) -> bool + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + # type: (Distribution) -> Message + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + metadata = dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + feed_parser = FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + +def check_dist_requires_python(dist): + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s", + dist.project_name, requires_python, e, + ) + return + + +def get_installer(dist): + # type: (Distribution) -> str + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/setuptools_build.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/temp_dir.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..2c81ad5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/temp_dir.py @@ -0,0 +1,155 @@ +from __future__ import absolute_import + +import errno +import itertools +import logging +import os.path +import tempfile + +from pip._internal.utils.misc import rmtree + +logger = logging.getLogger(__name__) + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory or None + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + create() + Creates a temporary directory and stores its path in the path + attribute. + cleanup() + Deletes the temporary directory and sets path attribute to None + + When used as a context manager, a temporary directory is created on + entering the context and, if the delete attribute is True, on exiting the + context the created directory is deleted. + """ + + def __init__(self, path=None, delete=None, kind="temp"): + super(TempDirectory, self).__init__() + + if path is None and delete is None: + # If we were not given an explicit directory, and we were not given + # an explicit delete option, then we'll default to deleting. + delete = True + + self.path = path + self.delete = delete + self.kind = kind + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + self.create() + return self + + def __exit__(self, exc, value, tb): + if self.delete: + self.cleanup() + + def create(self): + """Create a temporary directory and store its path in self.path + """ + if self.path is not None: + logger.debug( + "Skipped creation of temporary directory: {}".format(self.path) + ) + return + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) + + def cleanup(self): + """Remove the temporary directory created and reset state + """ + if self.path is not None and os.path.exists(self.path): + rmtree(self.path) + self.path = None + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + super(AdjacentTempDirectory, self).__init__(delete=delete) + self.original = original.rstrip('/\\') + + @classmethod + def _generate_names(cls, name): + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def create(self): + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + self.path = os.path.realpath(path) + break + + if not self.path: + # Final fallback on the default behavior. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/typing.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/typing.py new file mode 100644 index 0000000..e085cdf --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... # noqa: F401 + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/ui.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/ui.py new file mode 100644 index 0000000..433675d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/utils/ui.py @@ -0,0 +1,441 @@ +from __future__ import absolute_import, division + +import contextlib +import itertools +import logging +import sys +import time +from signal import SIGINT, default_int_handler, signal + +from pip._vendor import six +from pip._vendor.progress.bar import ( + Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, + ShadyBar, +) +from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin +from pip._vendor.progress.spinner import Spinner + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation +from pip._internal.utils.misc import format_size +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Iterator, IO # noqa: F401 + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + + def update(self): + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it, n=1): + for x in it: + yield x + self.next(n) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call neds to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + +# NOTE: The "type: ignore" comments on the following classes are there to +# work around https://github.com/python/typing/issues/241 + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore + IncrementalBar): + pass + + +class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore + ChargingBar): + pass + + +class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore + pass + + +class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore + FillingSquaresBar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, WritelnMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # type: (IO) -> Iterator[None] + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + # type: (float) -> None + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 # type: float + + def ready(self): + # type: () -> bool + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + # type: () -> None + self._last_update = time.time() + + +class SpinnerInterface(object): + def spin(self): + # type: () -> None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) # type: SpinnerInterface + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..9cba764 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/__init__.py @@ -0,0 +1,534 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type + ) + from pip._internal.utils.ui import SpinnerInterface # noqa: F401 + + AuthInfo = Tuple[Optional[str], Optional[str]] + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +class RemoteNotFoundError(Exception): + pass + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__(self, vcs, rev=None, extra_args=None): + # type: (VersionControl, Optional[str], Optional[List[str]]) -> None + """ + Args: + vcs: a VersionControl object. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vcs = vcs + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vcs.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vcs.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> List[str] + """ + Return the VCS-specific command arguments. + """ + args = [] # type: List[str] + rev = self.arg_rev + if rev is not None: + args += self.vcs.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + # type: (str) -> RevOptions + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vcs.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, Type[VersionControl]] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # type: () -> None + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + # type: () -> List[Type[VersionControl]] + return list(self._registry.values()) + + @property + def dirnames(self): + # type: () -> List[str] + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + # type: () -> List[str] + schemes = [] # type: List[str] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + # type: (Type[VersionControl]) -> None + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, cls=None, name=None): + # type: (Optional[Type[VersionControl]], Optional[str]) -> None + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warning('Cannot unregister because no class or name given') + + def get_backend_type(self, location): + # type: (str) -> Optional[Type[VersionControl]] + """ + Return the type of the version control backend if found at given + location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + if vc_type.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vc_type.name) + return vc_type + return None + + def get_backend(self, name): + # type: (str) -> Optional[Type[VersionControl]] + name = name.lower() + if name in self._registry: + return self._registry[name] + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + repo_name = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + def get_base_rev_args(self, rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def make_rev_options(self, rev=None, extra_args=None): + # type: (Optional[str], Optional[List[str]]) -> RevOptions + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(self, rev, extra_args=extra_args) + + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + def export(self, location): + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + """ + raise NotImplementedError + + def get_netloc_and_auth(self, netloc, scheme): + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + def get_url_rev_and_auth(self, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + def make_rev_args(self, username, password): + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (str) -> Tuple[str, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + url, rev, user_pass = self.get_url_rev_and_auth(url) + username, password = user_pass + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return url, rev_options + + def normalize_url(self, url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def is_commit_id_equal(self, dest, name): + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest): + # type: (str) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + Args: + dest: the repository directory in which to install or update. + """ + url, rev_options = self.get_url_rev_options(self.url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) + + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) + + if response == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location): + # type: (str) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + @classmethod + def get_src_requirement(cls, location, project_name): + """ + Return a string representing the requirement needed to + redownload the files currently present in location, something + like: + {repository_url}@{revision}#egg={project_name}-{version_identifier} + """ + raise NotImplementedError + + @classmethod + def get_remote_url(cls, location): + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: List[str] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + spinner=None # type: Optional[SpinnerInterface] + ): + # type: (...) -> Optional[Text] + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = [cls.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, + spinner=spinner) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (cls.name, cls.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + # type: (str) -> bool + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def controls_location(cls, location): + # type: (str) -> bool + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For example, + the Git override checks that Git is actually available. + """ + return cls.is_repository_directory(location) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/bazaar.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..4c6ac79 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/bazaar.py @@ -0,0 +1,114 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # This is only needed for python <2.7.5 + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['export', location], + cwd=temp_dir.path, show_stdout=False, + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, url, rev_options): + cmd_args = ['pull', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location): + urls = cls.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + current_rev = cls.get_revision(location) + return make_vcs_requirement_url(repo, current_rev, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/git.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/git.py new file mode 100644 index 0000000..dd2bd61 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/git.py @@ -0,0 +1,369 @@ +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.compat import samefile +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, redact_password_from_url, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import RemoteNotFoundError, VersionControl, vcs + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +HASH_REGEX = re.compile('[a-fA-F0-9]{40}') + + +def looks_like_hash(sha): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') + default_arg_rev = 'HEAD' + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + super(Git, self).__init__(url, *args, **kwargs) + + def get_base_rev_args(self, rev): + return [rev] + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version becasue + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + def get_current_branch(self, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ['symbolic-ref', '-q', 'HEAD'] + output = self.run_command( + args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + def export(self, location): + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + def get_revision_sha(self, dest, rev): + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = self.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + def resolve_revision(self, dest, url, rev_options): + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + sha, is_branch = self.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + self.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = self.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + def is_commit_id_equal(self, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return self.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', redact_password_from_url(url), + rev_display, display_path(dest), + ) + self.run_command(['clone', '-q', url, dest]) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest, url, rev_options): + self.run_command(['config', 'remote.origin.url', url], cwd=dest) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location): + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + @classmethod + def get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + @classmethod + def _get_subdirectory(cls, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = cls.run_command(['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + root_dir = os.path.join(git_dir, '..') + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + # relative path of setup.py to repo root + if samefile(root_dir, location): + return None + return os.path.relpath(location, root_dir) + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + current_rev = cls.get_revision(location) + subdir = cls._get_subdirectory(location) + req = make_vcs_requirement_url(repo, current_rev, project_name, + subdir=subdir) + + return req + + def get_url_rev_and_auth(self, url): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + + return url, rev, user_pass + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + self.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls.run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore') + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/mercurial.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..26e75de --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/mercurial.py @@ -0,0 +1,103 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path, make_vcs_requirement_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + def get_base_rev_args(self, rev): + return [rev] + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_revision_hash(cls, location): + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + current_rev_hash = cls.get_revision_hash(location) + return make_vcs_requirement_url(repo, current_rev_hash, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/subversion.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..42ac5ac --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/vcs/subversion.py @@ -0,0 +1,200 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, +) +from pip._internal.vcs import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(self.url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = ['export'] + rev_options.to_args() + [url, location] + self.run_command(cmd_args, show_stdout=False) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + cmd_args = ['switch'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + cmd_args = ['update'] + rev_options.to_args() + [dest] + self.run_command(cmd_args) + + @classmethod + def get_revision(cls, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + def get_netloc_and_auth(self, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, self).get_netloc_and_auth( + netloc, scheme) + + return split_auth_from_netloc(netloc) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + def make_rev_args(self, username, password): + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = cls.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if repo is None: + return None + repo = 'svn+' + repo + rev = cls.get_revision(location) + return make_vcs_requirement_url(repo, rev, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/wheel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/wheel.py new file mode 100644 index 0000000..67bcc7f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_internal/wheel.py @@ -0,0 +1,1095 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import collections +import compileall +import csv +import hashlib +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from email.parser import Parser + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six import StringIO + +from pip._internal import pep425tags +from pip._internal.download import path_to_url, unpack_url +from pip._internal.exceptions import ( + InstallationError, InvalidWheelFilename, UnsupportedWheel, +) +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, distutils_scheme, +) +from pip._internal.models.link import Link +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + call_subprocess, captured_stdout, ensure_dir, read_chunks, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, + Union, Iterable + ) + from pip._vendor.packaging.requirements import Requirement # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.index import FormatControl, PackageFinder # noqa: F401 + from pip._internal.operations.prepare import ( # noqa: F401 + RequirementPreparer + ) + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.pep425tags import Pep425Tag # noqa: F401 + + InstalledCSVRow = Tuple[str, ...] + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + +def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] + """Return (hash, length) for path using hashlib.sha256()""" + h = hashlib.sha256() + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def open_for_csv(name, mode): + # type: (str, Text) -> IO + if sys.version_info[0] < 3: + nl = {} # type: Dict[str, Any] + bin = 'b' + else: + nl = {'newline': ''} # type: Dict[str, Any] + bin = '' + return open(name, mode + bin, **nl) + + +def replace_python_tag(wheelname, new_tag): + # type: (str, str) -> str + """Replace the Python tag in a wheel file name with a new value. + """ + parts = wheelname.split('-') + parts[-3] = new_tag + return '-'.join(parts) + + +def fix_script(path): + # type: (str) -> Optional[bool] + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + return None + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + # type: (str, str) -> bool + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + + +def get_entrypoints(filename): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + """get the string representation of EntryPoint, remove space and split + on '='""" + return str(s).replace(" ", "").split("=") + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (Sequence[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) for i in + os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, scripts in warn_for.items(): + scripts = sorted(scripts) + if len(scripts) == 1: + start_text = "script {} is".format(scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(scripts[:-1]) + " and " + scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """ + Return the given rows of a RECORD file in sorted order. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: set + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning( + 'RECORD line has more than three elements: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +def move_wheel_files( + name, # type: str + req, # type: Requirement + wheeldir, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + pycompile=True, # type: bool + scheme=None, # type: Optional[Mapping[str, str]] + isolated=False, # type: bool + prefix=None, # type: Optional[str] + warn_script_location=True # type: bool +): + # type: (...) -> None + """Install a wheel""" + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. + + if not scheme: + scheme = distutils_scheme( + name, user=user, home=home, root=root, isolated=isolated, + prefix=prefix, + ) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] # type: List[str] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} # type: Dict[str, str] + changed = set() + generated = [] # type: List[str] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None, filter=None): + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base and + s.endswith('.dist-info') and + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) + info_dir.append(destsubdir) + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # copyfile (called below) truncates the destination if it + # exists and then writes the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(destfile): + os.unlink(destfile) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + # Get the defined entry points + ep_file = os.path.join(info_dir[0], 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = ScriptMaker(None, scheme['scripts']) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Simplify the script and fix the fact that the default script swallows + # every single stack trace. + # See https://bitbucket.org/pypa/distlib/issue/34/ + # See https://bitbucket.org/pypa/distlib/issue/33/ + def _get_script_text(entry): + if entry.suffix is None: + raise InstallationError( + "Invalid script entry point: %s for req: %s - A callable " + "suffix is required. Cf https://packaging.python.org/en/" + "latest/distributing.html#console-scripts for more " + "information." % (entry, req) + ) + return maker.script_template % { + "module": entry.prefix, + "import_name": entry.suffix.split(".")[0], + "func": entry.suffix, + } + # ignore type, because mypy disallows assigning to a method, + # see https://github.com/python/mypy/issues/2427 + maker._get_script_text = _get_script_text # type: ignore + maker.script_template = r"""# -*- coding: utf-8 -*- +import re +import sys + +from %(module)s import %(import_name)s + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +""" + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'pip = ' + pip_script + generated.extend(maker.make(spec)) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + spec = 'pip%s = %s' % (sys.version[:1], pip_script) + generated.extend(maker.make(spec)) + + spec = 'pip%s = %s' % (sys.version[:3], pip_script) + generated.extend(maker.make(spec)) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'easy_install = ' + easy_install_script + generated.extend(maker.make(spec)) + + spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) + generated.extend(maker.make(spec)) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + if len(console) > 0: + generated_console_scripts = maker.make_multiple( + ['%s = %s' % kv for kv in console.items()] + ) + generated.extend(generated_console_scripts) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + if len(gui) > 0: + generated.extend( + maker.make_multiple( + ['%s = %s' % kv for kv in gui.items()], + {'gui': True} + ) + ) + + # Record pip as the installer + installer = os.path.join(info_dir[0], 'INSTALLER') + temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) + writer = csv.writer(record_out) + # Sort to simplify testing. + for row in sorted_outrows(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + # type: (Optional[str]) -> Optional[Tuple[int, ...]] + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return None if we couldn't parse / extract it. + """ + try: + dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] + + wheel_data = dist.get_metadata('WHEEL') + wheel_data = Parser().parsestr(wheel_data) + + version = wheel_data['Wheel-Version'].strip() + version = tuple(map(int, version.split('.'))) + return version + except Exception: + return None + + +def check_compatibility(version, name): + # type: (Optional[Tuple[int, ...]], str) -> None + """ + Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if not version: + raise UnsupportedWheel( + "%s is in an unsupported or invalid wheel" % name + ) + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) + + +class Wheel(object): + """A wheel file""" + + # TODO: Maybe move the class into the models sub-package + # TODO: Maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) + ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + # type: (str) -> None + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + (x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def support_index_min(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> Optional[int] + """ + Return the lowest index that one of the wheel's file_tag combinations + achieves in the supported_tags list e.g. if there are 8 supported tags, + and one of the file tags is first in the list, then return 0. Returns + None is the wheel is not supported. + """ + if tags is None: # for mock + tags = pep425tags.get_supported() + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> bool + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.get_supported() + return bool(set(tags).intersection(self.file_tags)) + + +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def should_use_ephemeral_cache( + req, # type: InstallRequirement + format_control, # type: FormatControl + autobuilding, # type: bool + cache_available # type: bool +): + # type: (...) -> Optional[bool] + """ + Return whether to build an InstallRequirement object using the + ephemeral cache. + + :param cache_available: whether a cache directory is available for the + autobuilding=True case. + + :return: True or False to build the requirement with ephem_cache=True + or False, respectively; or None not to build the requirement. + """ + if req.constraint: + return None + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return None + if not autobuilding: + return False + + if req.editable or not req.source_dir: + return None + + if req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + return True + + if "binary" not in format_control.get_allowed_formats( + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + return None + + link = req.link + base, ext = link.splitext() + if cache_available and _contains_egg_info(base): + return False + + # Otherwise, build the wheel just for this run using the ephemeral + # cache since we are either in the case of e.g. a local directory, or + # no cache directory is available to use. + return True + + +def format_command( + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> str + """ + Format command information for logging. + """ + text = 'Command arguments: {}\n'.format(command_args) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += ( + 'Command output:\n{}' + '-----------------------------------------' + ).format(command_output) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + req, # type: InstallRequirement + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> Optional[str] + """ + Return the path to the wheel in the temporary build directory. + """ + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(req.name) + msg += format_command(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(req.name, names) + msg += format_command(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__( + self, + finder, # type: PackageFinder + preparer, # type: RequirementPreparer + wheel_cache, # type: WheelCache + build_options=None, # type: Optional[List[str]] + global_options=None, # type: Optional[List[str]] + no_clean=False # type: bool + ): + # type: (...) -> None + self.finder = finder + self.preparer = preparer + self.wheel_cache = wheel_cache + + self._wheel_dir = preparer.wheel_download_dir + + self.build_options = build_options or [] + self.global_options = global_options or [] + self.no_clean = no_clean + + def _build_one(self, req, output_dir, python_tag=None): + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return self._build_one_inside_env(req, output_dir, + python_tag=python_tag) + + def _build_one_inside_env(self, req, output_dir, python_tag=None): + with TempDirectory(kind="wheel") as temp_dir: + if req.use_pep517: + builder = self._build_one_pep517 + else: + builder = self._build_one_legacy + wheel_path = builder(req, temp_dir.path, python_tag=python_tag) + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + shutil.move(wheel_path, dest_path) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception: + pass + # Ignore return, we can't do anything else useful. + self._clean_one(req) + return None + + def _base_setup_args(self, req): + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + return [ + sys.executable, '-u', '-c', + SETUPTOOLS_SHIM % req.setup_py + ] + list(self.global_options) + + def _build_one_pep517(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert req.metadata_directory is not None + try: + req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) + logger.debug('Destination directory: %s', tempd) + wheel_name = req.pep517_backend.build_wheel( + tempd, + metadata_directory=req.metadata_directory + ) + if python_tag: + # General PEP 517 backends don't necessarily support + # a "--python-tag" option, so we rename the wheel + # file directly. + new_name = replace_python_tag(wheel_name, python_tag) + os.rename( + os.path.join(tempd, wheel_name), + os.path.join(tempd, new_name) + ) + # Reassign to simplify the return at the end of function + wheel_name = new_name + except Exception: + logger.error('Failed building wheel for %s', req.name) + return None + return os.path.join(tempd, wheel_name) + + def _build_one_legacy(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + base_args = self._base_setup_args(req) + + spin_message = 'Building wheel for %s (setup.py)' % (req.name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ + + self.build_options + + if python_tag is not None: + wheel_args += ["--python-tag", python_tag] + + try: + output = call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return None + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + req=req, + command_args=wheel_args, + command_output=output, + ) + return wheel_path + + def _clean_one(self, req): + base_args = self._base_setup_args(req) + + logger.info('Running setup.py clean for %s', req.name) + clean_args = base_args + ['clean', '--all'] + try: + call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build( + self, + requirements, # type: Iterable[InstallRequirement] + session, # type: PipSession + autobuilding=False # type: bool + ): + # type: (...) -> List[InstallRequirement] + """Build wheels. + + :param unpack: If True, replace the sdist we built from with the + newly built wheel, in preparation for installation. + :return: True if all the wheels built correctly. + """ + buildset = [] + format_control = self.finder.format_control + # Whether a cache directory is available for autobuilding=True. + cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) + + for req in requirements: + ephem_cache = should_use_ephemeral_cache( + req, format_control=format_control, autobuilding=autobuilding, + cache_available=cache_available, + ) + if ephem_cache is None: + continue + + buildset.append((req, ephem_cache)) + + if not buildset: + return [] + + # Is any wheel build not using the ephemeral cache? + if any(not ephem_cache for _, ephem_cache in buildset): + have_directory_for_build = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert have_directory_for_build + + # TODO by @pradyunsg + # Should break up this method into 2 separate methods. + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join([req.name for (req, _) in buildset]), + ) + _cache = self.wheel_cache # shorter name + with indent_log(): + build_success, build_failure = [], [] + for req, ephem in buildset: + python_tag = None + if autobuilding: + python_tag = pep425tags.implementation_tag + if ephem: + output_dir = _cache.get_ephem_path_for_link(req.link) + else: + output_dir = _cache.get_path_for_link(req.link) + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning("Building wheel for %s failed: %s", + req.name, e) + build_failure.append(req) + continue + else: + output_dir = self._wheel_dir + wheel_file = self._build_one( + req, output_dir, + python_tag=python_tag, + ) + if wheel_file: + build_success.append(req) + if autobuilding: + # XXX: This is mildly duplicative with prepare_files, + # but not close enough to pull out to a single common + # method. + # The code below assumes temporary source dirs - + # prevent it doing bad things. + if req.source_dir and not os.path.exists(os.path.join( + req.source_dir, PIP_DELETE_MARKER_FILENAME)): + raise AssertionError( + "bad source dir - missing marker") + # Delete the source we built the wheel from + req.remove_temporary_source() + # set the build directory again - name is known from + # the work prepare_files did. + req.source_dir = req.build_location( + self.preparer.build_dir + ) + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + assert req.link.is_wheel + # extract the wheel into the dir + unpack_url( + req.link, req.source_dir, None, False, + session=session, + ) + else: + build_failure.append(req) + + # notify success/failure + if build_success: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_success]), + ) + if build_failure: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failure]), + ) + # Return a list of requirements that failed to build + return build_failure diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/__init__.py new file mode 100644 index 0000000..b919b54 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/__init__.py @@ -0,0 +1,111 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(vendored_name, globals(), locals(), level=0) + except ImportError: + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("lockfile") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pep517") + vendored("pkg_resources") + vendored("progress") + vendored("pytoml") + vendored("retrying") + vendored("requests") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("urllib3") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/appdirs.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/appdirs.py new file mode 100644 index 0000000..2bd3911 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/appdirs.py @@ -0,0 +1,604 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8fdee66 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.5" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/_cmd.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/adapter.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..780eb28 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = cache or DictCache() + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/cache.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..1ba0080 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, OSError) + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + + def __init__( + self, + directory, + forever=False, + filemode=0o0600, + dirmode=0o0700, + use_dir_lock=None, + lock_class=None, + ): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from pip._vendor.lockfile import LockFile + from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """ + ) + raise ImportError(notice) + + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from pip._vendor.requests.packages.urllib3.response import HTTPResponse +except ImportError: + from pip._vendor.urllib3.response import HTTPResponse + +try: + from pip._vendor.requests.packages.urllib3.util import is_fp_closed +except ImportError: + from pip._vendor.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/controller.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..1b2b943 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,367 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = cache or DictCache() + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ( + 'Returning cached "301 Moved Permanently" response ' + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/filewrapper.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + return self.__fp.closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/heuristics.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.utcnow() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response): + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response): + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = { + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + } + + def update_headers(self, resp): + headers = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers["date"])) + last_modified = parsedate(headers["last-modified"]) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/serialize.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..ec43ff2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,186 @@ +import base64 +import io +import json +import zlib + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, encoding="utf-8") + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/wrapper.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..265bfc8 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl( + sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None, +): + + cache = cache or DictCache() + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..ef71f3a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2018.11.29" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__main__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/cacert.pem b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..db68797 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4512 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/core.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..2d02ea4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/certifi/core.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +if __name__ == '__main__': + print(where()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5freq.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# <http://www.edu.tw:81/mandr/> +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5prober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/chardistribution.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetgroupprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/chardetect.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/codingstatemachine.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cp949prober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/enums.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escsm.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/eucjpprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrfreq.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwfreq.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# <http:#www.edu.tw:81/mandr/> + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312freq.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312prober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/hebrewprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jisfreq.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jpcntx.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langbulgarianmodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langcyrillicmodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langgreekmodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhebrewmodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhungarianmodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langthaimodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langturkishmodel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/latin1prober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcharsetprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcsgroupprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcssm.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcharsetprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcsgroupprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sjisprober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/universaldetector.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/utf8prober.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/version.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..2a3bf47 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/__init__.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.1' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansi.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansitowin32.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/initialise.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/initialise.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/win32.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/win32.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/winterm.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/colorama/winterm.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..a786b4d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.8' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/misc.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/shutil.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..1df3aba --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/tarfile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/database.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..b13cdac --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read() + self.modules = data.splitlines() + + def __repr__(self): + return '<InstalledDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '<EggInfoDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/index.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..2406be2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.python.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/locators.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..5c655c3 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/locators.py @@ -0,0 +1,1295 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.python.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.python.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at keys of the form + 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile('<a href=[^>]*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.python.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' + r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/manifest.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects <pattern1> <pattern2> ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects <dir> <pattern1> <pattern2> ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single <dir_pattern>' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/markers.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/metadata.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..77eed7f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1094 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include +# it in the tuple literal below to allow it (for now) +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/resources.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/scripts.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..8e22cb9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/scripts.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%s" + type="win32"/> + + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly>'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +if __name__ == '__main__': + import sys, re + + def _resolve(module, func): + __import__(module) + mod = sys.modules[module] + parts = func.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + try: + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + + func = _resolve('%(module)s', '%(func)s') + rc = func() # None interpreted as 0 + except Exception as e: # only supporting Python >= 2.6 + sys.stderr.write('%%s\n' %% e) + rc = 1 + sys.exit(rc) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + # Normalise case for Windows + executable = os.path.normcase(executable) + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s' % (name, sys.version[:3])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + result = finder(distlib_package).find(name).bytes + return result + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/t32.exe b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..a09d926872d84ae22a617dfe9ebb560d420b37de GIT binary patch literal 92672 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/t64.exe b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..9da9b40de922fb203df6b9a1d0ad4139af536850 GIT binary patch literal 102400 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�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk 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�?dYNUd4WaURX_A__M4W}D0!0n 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/util.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..9d4bfd3 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/util.py @@ -0,0 +1,1756 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) + \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) + \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.split('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' + r'\(\s*(?P<ver>[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/version.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/w32.exe b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..732215a9d34ccb7b417d637a7646d9b843ecafa8 GIT binary patch literal 89088 zcmeFae|S?>wm*FGqitH!CO`{C3REl(SahnPNDYM`O{q#T7)Xdvz$<hz5gjb&0FD$| zPs=nt#$jgk-tk`NUb*PJIy$3wMg@OiORy=5PEkZ0P^;6cyPm2=Y8#~Xyq~pC(iU~@ z_dd`2ywCg3TS)e=wSTX@_S$Q$y;FJf9>F9Cf*Bu86NCeB>CeT#|L3nblC!40kR?2m z{>H@z3`^g*ct!B1Tk<#8{Ol(+x7?n8>n(TO@iQ_1pEl;#NO$D_^p5<p8@>6r|7^p? zD>5@P3KB)%InlPUc<U{5lb_$uJ2!U@!dIxT&CTYnHuoCtzCL#`-1%8w%`JjkymkHD zpYr&>Cg9H}+(GW%^wV2|ROUbGfyXTfOART)i?<!WISJD#7!6|#8G`TvV*Xu^z32+K zc6>T0?9%;4K}Zn{6fx`yPa}*$9C+R!7zI~72c&$InY+UdMGBkF3c`HyxD3K09`bzW z?_q;rO&5ec#{?noJ4vI19bbHBt~vx^h2FH$V8i|^#EsiUg#JboP3@w-(&Uf&%NK<8 zSJZ5{MZ852W)~s>WeT(LIf&1wKNqULLI)GN_(-E-D)X~ZK=1;t<%*guHMhdg`-(mb zHzDv1KBN9zR9?--O+N$ReOXAr81V9z!X5SJ5`=3<1^<8V|AP@&sr2}Qvp;hQT24iW zOHg|EiZd1ojV;oo#(r^ba2`^8T22{~_UQ@YMZp7O1R*2@?SerFE~TuJB_wDaYC0h8 zfONF1t%{=H`W`bdYp+>YBsg9Ty9ec3iy+O3xa}TIvPK#Q&udyx1MvwG0(#iaGC|N| zJ#3?<Y4YLRkU`54s9BYRjyISA>){9$tW;Y34lPnX=&>D4X~|k7c$TwEfOzs@Yh#Nz z`FV;`(w!E`sKg@`2E}bDY>ku^4XS@tV(WO*<eu67;0Clk;vRHp!Qf<+5w0B!*Y>g? zYH=KK#%%Yu1~&m>IlB^#2^syGG|2AB1(}4aOcaC%!)}%`I7AIC2(Ro3yW`GSttng^ z_xb=ECor!L{-PNO>_ulJ3%fm=O0X!s%)$GZ?~I94l-^KEAX0n$?4wGpr7&i4#~)OB zQD%2NrWUKtZuYT1Vnu}AeF`cSgx>Rkk@}Lg{WltgT76VeA2aic`cTnpXrt2WXmJkM z9%u<Rp-*9{$HQ)>Xm?McyDyZ28Ux7mpxy?mnmvzMMr-85vkRrJLaDRx>|I7je+cM+ zj{RJ(3Vrgke;W@#D!y%U%fQLtlPKTAzWtVuOQdXpwsy6eRjt^cZ%0D4bF7$F;f!th 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ð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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/w64.exe b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c41bd0a011fd760ce20ba795d9e535e0d2c39876 GIT binary patch literal 99328 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 B=L-M; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/wheel.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..b04bfae --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distlib/wheel.py @@ -0,0 +1,988 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))? +-(?P<py>\w+\d+(\.\w+\d+)*) +-(?P<bi>\w+) +-(?P<ar>\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + sys.version[:3]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distro.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distro.py new file mode 100644 index 0000000..aa4defc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/distro.py @@ -0,0 +1,1197 @@ +# Copyright 2015,2016,2017 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is a renewed alternative implementation for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.7 is expected to remove it +altogether. Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +Still, there are many cases in which access to OS distribution information +is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = {} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file, appended + with the value of the pretty version ("<version_id>" and "<codename>" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "<version_id>" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "<codename>" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file='', + include_uname=True): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_name`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "include_uname={self.include_uname!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') \ + or self.uname_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') \ + or self.uname_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', ''), + self.uname_attr('release') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + return self.os_release_attr('codename') \ + or self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + if k == 'VERSION': + # this handles cases in which the codename is in + # the `(CODENAME)` (rhel, centos, fedora) format + # or in the `, CODENAME` format (Ubuntu). + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + else: + props['codename'] = '' + else: + # Ignore any tokens that are not variable assignments + pass + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + return props + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +<https://whatwg.org/html>`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.0.1" diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_ihatexml.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_inputstream.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..a65e55f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type, binary_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import _ReparseException +from . import _utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: # pylint:disable=bare-except + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overriden, we've been overriden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for _ in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, binary_type): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_tokenizer.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +# pylint:disable=wrong-import-position +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie +# pylint:enable=wrong-import-position diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..a1158bb --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + return {x for x in keys if x.startswith(prefix)} + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/py.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_utils.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/constants.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..1ff8041 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2947 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring '</>'.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +from collections import OrderedDict + + +def _attr_key(attr): + """Return an appropriate key for an attribute for sorting + + Attributes have a namespace that can be either ``None`` or a string. We + can't compare the two because they're different types, so we convert + ``None`` to an empty string first. + + """ + return (attr[0][0] or ''), attr[0][1] + + +class Filter(base.Filter): + """Alphabetizes attributes for elements""" + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=_attr_key): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/base.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ``<meta charset=ENCODING>`` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/lint.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + """Lints the token stream for errors + + If it finds any errors, it'll raise an ``AssertionError``. + + """ + def __init__(self, source, require_matching_tags=True): + """Creates a Filter + + :arg source: the source token stream + + :arg require_matching_tags: whether or not to require matching tags + + """ + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/optionaltags.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/sanitizer.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..af8e77b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type <application>/<type> + (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "</%s>" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/whitespace.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/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/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/html5parser.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/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('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharactersNonPre(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"gotName": "body", "expectedName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name.translate(asciiUpper2Lower) != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + # pylint:enable=unused-argument + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + "inHeadNoscript": InHeadNoscriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def adjust_attributes(token, replacements): + needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) + if needs_adjustment: + token['data'] = OrderedDict((replacements.get(k, k), v) + for k, v in token['data'].items()) + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/serializer.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000..53f4d44 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,409 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +import re + +from codecs import register_error, xmlcharrefreplace_errors + +from .constants import voidElements, booleanAttributes, spaceCharacters +from .constants import rcdataElements, entities, xmlEntities +from . import treewalkers, _utils +from xml.sax.saxutils import escape + +_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" +_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") +_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" + "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" + "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" + "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" + "\u3000]") + + +_encode_entity_map = {} +_is_ucs4 = len("\U0010FFFF") == 1 +for k, v in list(entities.items()): + # skip multi-character entities + if ((_is_ucs4 and len(v) > 1) or + (not _is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = _utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in _encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + _encode_entity_map[v] = k + + +def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = _encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + +register_error("htmlentityreplace", htmlentityreplace_errors) + + +def serialize(input, tree="etree", encoding=None, **serializer_opts): + """Serializes the input token stream using the specified treewalker + + :arg input: the token stream to serialize + + :arg tree: the treewalker to use + + :arg encoding: the encoding to use + + :arg serializer_opts: any options to pass to the + :py:class:`html5lib.serializer.HTMLSerializer` that gets created + + :returns: the tree serialized as a string + + Example: + + >>> from html5lib.html5parser import parse + >>> from html5lib.serializer import serialize + >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') + >>> serialize(token_stream, omit_optional_tags=False) + '<html><head></head><body><p>Hi!</p></body></html>' + + """ + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + s = HTMLSerializer(**serializer_opts) + return s.render(walker(input), encoding) + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = "legacy" # be secure by default + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer + + :arg inject_meta_charset: Whether or not to inject the meta charset. + + Defaults to ``True``. + + :arg quote_attr_values: Whether to quote attribute values that don't + require quoting per legacy browser behavior (``"legacy"``), when + required by the standard (``"spec"``), or always (``"always"``). + + Defaults to ``"legacy"``. + + :arg quote_char: Use given quote character for attribute quoting. + + Defaults to ``"`` which will use double quotes unless attribute + value contains a double quote, in which case single quotes are + used. + + :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute + values. + + Defaults to ``False``. + + :arg escape_rcdata: Whether to escape characters that need to be + escaped within normal elements within rcdata elements such as + style. + + Defaults to ``False``. + + :arg resolve_entities: Whether to resolve named character entities that + appear in the source tree. The XML predefined entities < > + & " ' are unaffected by this setting. + + Defaults to ``True``. + + :arg strip_whitespace: Whether to remove semantically meaningless + whitespace. (This compresses all whitespace to a single space + except within ``pre``.) + + Defaults to ``False``. + + :arg minimize_boolean_attributes: Shortens boolean attributes to give + just the attribute value, for example:: + + <input disabled="disabled"> + + becomes:: + + <input disabled> + + Defaults to ``True``. + + :arg use_trailing_solidus: Includes a close-tag slash at the end of the + start tag of void elements (empty elements whose end tag is + forbidden). E.g. ``<hr/>``. + + Defaults to ``False``. + + :arg space_before_trailing_solidus: Places a space immediately before + the closing slash in a tag using a trailing solidus. E.g. + ``<hr />``. Requires ``use_trailing_solidus=True``. + + Defaults to ``True``. + + :arg sanitize: Strip all unsafe or unknown constructs from output. + See :py:class:`html5lib.filters.sanitizer.Filter`. + + Defaults to ``False``. + + :arg omit_optional_tags: Omit start/end tags that are optional. + + Defaults to ``True``. + + :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. + + Defaults to ``False``. + + """ + unexpected_args = frozenset(kwargs) - frozenset(self.options) + if len(unexpected_args) > 0: + raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "htmlentityreplace") + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + # pylint:disable=too-many-nested-blocks + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from .filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # Alphabetical attributes is here under the assumption that none of + # the later filters add or change order of attributes; it needs to be + # before the sanitizer so escaped elements come out correctly + if self.alphabetical_attributes: + from .filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from .filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from .filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from .filters.optionaltags import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError("System identifer contains both single and double quote characters") + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError("Unexpected </ in CDATA") + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + for (_, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) and + k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values == "always" or len(v) == 0: + quote_attr = True + elif self.quote_attr_values == "spec": + quote_attr = _quoteAttributeSpec.search(v) is not None + elif self.quote_attr_values == "legacy": + quote_attr = _quoteAttributeLegacy.search(v) is not None + else: + raise ValueError("quote_attr_values must be one of: " + "'always', 'spec', or 'legacy'") + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError("Comment contains --") + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError("Entity %s not recognized" % name) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + """Serializes the stream from the treewalker into a string + + :arg treewalker: the treewalker to serialize + + :arg encoding: the string encoding to use + + :returns: the serialized tree + + Example: + + >>> from html5lib import parse, getTreeWalker + >>> from html5lib.serializer import HTMLSerializer + >>> token_stream = parse('<html><body>Hi!</body></html>') + >>> walker = getTreeWalker('etree') + >>> serializer = HTMLSerializer(omit_optional_tags=False) + >>> serializer.render(walker(token_stream)) + '<html><head></head><body>Hi!</body></html>' + + """ + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +class SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000..7ef5959 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,30 @@ +"""Tree adapters let you convert from one tree structure to another + +Example: + +.. code-block:: python + + from pip._vendor import html5lib + from pip._vendor.html5lib.treeadapters import genshi + + doc = '<html><body>Hi!</body></html>' + treebuilder = html5lib.getTreeBuilder('etree') + parser = html5lib.HTMLParser(tree=treebuilder) + tree = parser.parse(doc) + TreeWalker = html5lib.getTreeWalker('etree') + + genshi_tree = genshi.to_genshi(TreeWalker(tree)) + +""" +from __future__ import absolute_import, division, unicode_literals + +from . import sax + +__all__ = ["sax"] + +try: + from . import genshi # noqa +except ImportError: + pass +else: + __all__.append("genshi") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/genshi.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000..61d5fb6 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName, Attrs +from genshi.core import START, END, TEXT, COMMENT, DOCTYPE + + +def to_genshi(walker): + """Convert a tree to a genshi tree + + :arg walker: the treewalker to use to walk the tree to convert it + + :returns: generator of genshi nodes + + """ + text = [] + for token in walker: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + text.append(token["data"]) + elif text: + yield TEXT, "".join(text), (None, -1, -1) + text = [] + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text: + yield TEXT, "".join(text), (None, -1, -1) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/sax.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000..f4ccea5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker + + :arg walker: the treewalker to use to walk the tree to convert it + + :arg handler: SAX handler to use + + """ + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000..d44447e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,88 @@ +"""A collection of modules for building different kinds of trees from HTML +documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1. A set of classes for various types of elements: Document, Doctype, Comment, + Element. These must implement the interface of ``base.treebuilders.Node`` + (although comment nodes have a different signature for their constructor, + see ``treebuilders.etree.Comment``) Textual content may also be implemented + as another node type, or not, as your tree implementation requires. + +2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits + from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: + + * ``documentClass`` - the class to use for the bottommost node of a document + * ``elementClass`` - the class to use for HTML Elements + * ``commentClass`` - the class to use for comments + * ``doctypeClass`` - the class to use for doctypes + + It also has one required method: + + * ``getDocument`` - Returns the root node of the complete document tree + +3. If you wish to run the unit tests, you must also create a ``testSerializer`` + method on your treebuilder which accepts a node and returns a string + containing Node and its children serialized according to the format used in + the unittests + +""" + +from __future__ import absolute_import, division, unicode_literals + +from .._utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of trees with built-in support + + :arg treeType: the name of the tree type required (case-insensitive). Supported + values are: + + * "dom" - A generic builder for DOM implementations, defaulting to a + xml.dom.minidom based implementation. + * "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to xml.etree.cElementTree if + available and xml.etree.ElementTree if not. + * "lxml" - A etree-based builder for lxml.etree, handling limitations + of lxml's implementation. + + :arg implementation: (Currently applies to the "etree" and "dom" tree + types). A module implementing the tree type e.g. xml.etree.ElementTree + or xml.etree.cElementTree. + + :arg kwargs: Any additional options to pass to the TreeBuilder when + creating it. + + Example: + + >>> from html5lib.treebuilders import getTreeBuilder + >>> builder = getTreeBuilder('etree') + + """ + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/base.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000..73973db --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,417 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + """Represents an item in the tree""" + def __init__(self, name): + """Creates a Node + + :arg name: The tag name associated with the node + + """ + # The tag name assocaited with the node + self.name = name + # The parent of the current node (or None for the document node) + self.parent = None + # The value of the current node (applies to text nodes and comments) + self.value = None + # A dict holding name -> value pairs for attributes of the node + self.attributes = {} + # A list of child nodes of the current node. This must include all + # elements but not necessarily other node types. + self.childNodes = [] + # A list of miscellaneous flags that can be set on the node. + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + + :arg node: the node to insert + + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + + :arg data: the data to insert + + :arg insertBefore: True if you want to insert the text before the node + and False if you want to insert it after the node + + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node + + :arg node: the node to insert + + :arg refNode: the child node to insert the node before + + """ + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + + :arg node: the child node to remove + + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + + :arg newParent: the node to move all this node's children to + + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + + * documentClass - the class to use for the bottommost node of a document + * elementClass - the class to use for HTML Elements + * commentClass - the class to use for comments + * doctypeClass - the class to use for doctypes + + """ + # pylint:disable=not-callable + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + """Create a TreeBuilder + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + """ + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + if not exactNode: + if isinstance(target, text_type): + target = (namespaces["html"], target) + assert isinstance(target, tuple) + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if exactNode and node == target: + return True + elif not exactNode and node.nameTuple == target: + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and + name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + """Return the final tree""" + return self.document + + def getFragment(self): + """Return the final fragment""" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + + :arg node: the node from which to start serializing + + """ + raise NotImplementedError diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/dom.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000..dcfac22 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +from __future__ import absolute_import, division, unicode_literals + + +from collections import MutableMapping +from xml.dom import minidom, Node +import weakref + +from . import base +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(MutableMapping): + def __init__(self, element): + self.element = element + + def __iter__(self): + return iter(self.element.attributes.keys()) + + def __setitem__(self, name, value): + if isinstance(name, tuple): + raise NotImplementedError + else: + attr = self.element.ownerDocument.createAttribute(name) + attr.value = value + self.element.attributes[name] = attr + + def __len__(self): + return len(self.element.attributes) + + def items(self): + return list(self.element.attributes.items()) + + def values(self): + return list(self.element.attributes.values()) + + def __getitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.attributes[name].value + + def __delitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + del self.element.attributes[name] + + class NodeBuilder(base.Node): + def __init__(self, element): + base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + # pylint:disable=protected-access + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000..0dedf44 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +from pip._vendor.six import text_type + +import re + +from . import base +from .. import _ihatexml +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._childNodes.remove(node) + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): # pylint:disable=unused-variable + """Serialize an element and its child nodes to a string""" + rv = [] + filter = _ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,366 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +import warnings +import re +import sys + +from . import base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import _ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info[0] == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + +class TreeBuilder(base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value=None): + if value is None: + value = {} + self._element = element + dict.__init__(self, value) # pylint:disable=non-parent-init-called + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = Comment + # self.fragmentClass = builder.DocumentFragment + base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + assert parent is None or parent is self.document + assert self.document._elementTree is None + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our initial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + comment = self.commentClass(comment_token["data"]) + root.addprevious(comment._element) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000..9bec207 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,154 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +from .. import constants +from .._utils import default_etree + +__all__ = ["getTreeWalker", "pprint"] + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + :arg str treeType: the name of the tree type required (case-insensitive). + Supported values are: + + * "dom": The xml.dom.minidom DOM implementation + * "etree": A generic walker for tree implementations exposing an + elementtree-like interface (known to work with ElementTree, + cElementTree and lxml.etree). + * "lxml": Optimized walker for lxml.etree + * "genshi": a Genshi stream + + :arg implementation: A module implementing the tree type e.g. + xml.etree.ElementTree or cElementTree (Currently applies to the "etree" + tree type only). + + :arg kwargs: keyword arguments passed to the etree walker--for other + walkers, this has no effect + + :returns: a TreeWalker class + + """ + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType == "dom": + from . import dom + treeWalkerCache[treeType] = dom.TreeWalker + elif treeType == "genshi": + from . import genshi + treeWalkerCache[treeType] = genshi.TreeWalker + elif treeType == "lxml": + from . import etree_lxml + treeWalkerCache[treeType] = etree_lxml.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) + + +def concatenateCharacterTokens(tokens): + pendingCharacters = [] + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + pendingCharacters.append(token["data"]) + else: + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + pendingCharacters = [] + yield token + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + + +def pprint(walker): + """Pretty printer for tree walkers + + Takes a TreeWalker instance and pretty prints the output of walking the tree. + + :arg walker: a TreeWalker instance + + """ + output = [] + indent = 0 + for token in concatenateCharacterTokens(walker): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + # tag name + if token["namespace"] and token["namespace"] != constants.namespaces["html"]: + if token["namespace"] in constants.prefixes: + ns = constants.prefixes[token["namespace"]] + else: + ns = token["namespace"] + name = "%s %s" % (ns, token["name"]) + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + # attributes (sorted for consistent ordering) + attrs = token["data"] + for (namespace, localname), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + ns = constants.prefixes[namespace] + else: + ns = namespace + name = "%s %s" % (ns, localname) + else: + name = localname + output.append("%s%s=\"%s\"" % (" " * indent, name, value)) + # self-closing + if type == "EmptyTag": + indent -= 2 + + elif type == "EndTag": + indent -= 2 + + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, + token["name"], + token["publicId"], + token["systemId"] if token["systemId"] else "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, + token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + + elif type == "Characters": + output.append("%s\"%s\"" % (" " * indent, token["data"])) + + elif type == "SpaceCharacters": + assert False, "concatenateCharacterTokens should have got rid of all Space tokens" + + else: + raise ValueError("Unknown token type, %s" % type) + + return "\n".join(output) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/base.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000..80c474c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node +from ..constants import namespaces, voidElements, spaceCharacters + +__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", + "TreeWalker", "NonRecursiveTreeWalker"] + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + """Walks a tree yielding tokens + + Tokens are dicts that all have a ``type`` field specifying the type of the + token. + + """ + def __init__(self, tree): + """Creates a TreeWalker + + :arg tree: the tree to walk + + """ + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + """Generates an error token with the given message + + :arg msg: the error message + + :returns: SerializeError token + + """ + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + """Generates an EmptyTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :arg hasChildren: whether or not to yield a SerializationError because + this tag shouldn't have children + + :returns: EmptyTag token + + """ + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error("Void element has children") + + def startTag(self, namespace, name, attrs): + """Generates a StartTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :returns: StartTag token + + """ + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + """Generates an EndTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :returns: EndTag token + + """ + return {"type": "EndTag", + "name": name, + "namespace": namespace} + + def text(self, data): + """Generates SpaceCharacters and Characters tokens + + Depending on what's in the data, this generates one or more + ``SpaceCharacters`` and ``Characters`` tokens. + + For example: + + >>> from html5lib.treewalkers.base import TreeWalker + >>> # Give it an empty tree just so it instantiates + >>> walker = TreeWalker([]) + >>> list(walker.text('')) + [] + >>> list(walker.text(' ')) + [{u'data': ' ', u'type': u'SpaceCharacters'}] + >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE + [{u'data': ' ', u'type': u'SpaceCharacters'}, + {u'data': u'abc', u'type': u'Characters'}, + {u'data': u' ', u'type': u'SpaceCharacters'}] + + :arg data: the text data + + :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens + + """ + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + """Generates a Comment token + + :arg data: the comment + + :returns: Comment token + + """ + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None): + """Generates a Doctype token + + :arg name: + + :arg publicId: + + :arg systemId: + + :returns: the Doctype token + + """ + return {"type": "Doctype", + "name": name, + "publicId": publicId, + "systemId": systemId} + + def entity(self, name): + """Generates an Entity token + + :arg name: the entity name + + :returns: an Entity token + + """ + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + """Handles unknown node types""" + return self.error("Unknown node type: " + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (namespace and namespace != namespaces["html"]) or name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/dom.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000..b0c89b0 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +from . import base + + +class TreeWalker(base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (base.DOCUMENT,) + + else: + return base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000..95fc0c1 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import OrderedDict +import re + +from pip._vendor.six import string_types + +from . import base +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, _, _, flag = node + if flag in ("text", "tail"): + return base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return base.COMMENT, node.text + + else: + assert isinstance(node.tag, string_types), type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + assert list(parents[-1]).count(parent) == 1 + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000..e81ddf3 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from . import base + +from .. import _ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("ascii", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + + try: + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + except AttributeError: + pass + + try: + node = et.getroot() + except AttributeError: + node = et + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(base.NonRecursiveTreeWalker): + def __init__(self, tree): + # pylint:disable=redefined-variable-type + if isinstance(tree, list): + self.fragmentChildren = set(tree) + tree = FragmentRoot(tree) + else: + self.fragmentChildren = set() + tree = Root(tree) + base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = _ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + return base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (base.DOCUMENT,) + + elif isinstance(node, Doctype): + return base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return base.TEXT, ensure_str(node.obj) + + elif node.tag == etree.Comment: + return base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), "Text nodes have no children" + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + return node + # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None + + return node.getparent() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/genshi.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000..7483be2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import base + +from ..constants import voidElements, namespaces + + +class TreeWalker(base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, _ = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END or + next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if namespace != namespaces["html"] or name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/codec.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/core.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/core.py new file mode 100644 index 0000000..104624a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/core.py @@ -0,0 +1,396 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + ulabel(label) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/idnadata.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1979 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "11.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e0001145f, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187f2, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/intranges.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/package_data.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/uts46data.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8205 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "11.0.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' Ì„'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' Ì'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1â„4'), + (0xBD, 'M', u'1â„2'), + (0xBE, 'M', u'3â„4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'Ã¥'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'Ä'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'Ä…'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'Ä‹'), + (0x10B, 'V'), + (0x10C, 'M', u'Ä'), + (0x10D, 'V'), + (0x10E, 'M', u'Ä'), + (0x10F, 'V'), + (0x110, 'M', u'Ä‘'), + (0x111, 'V'), + (0x112, 'M', u'Ä“'), + (0x113, 'V'), + (0x114, 'M', u'Ä•'), + (0x115, 'V'), + (0x116, 'M', u'Ä—'), + (0x117, 'V'), + (0x118, 'M', u'Ä™'), + (0x119, 'V'), + (0x11A, 'M', u'Ä›'), + (0x11B, 'V'), + (0x11C, 'M', u'Ä'), + (0x11D, 'V'), + (0x11E, 'M', u'ÄŸ'), + (0x11F, 'V'), + (0x120, 'M', u'Ä¡'), + (0x121, 'V'), + (0x122, 'M', u'Ä£'), + (0x123, 'V'), + (0x124, 'M', u'Ä¥'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'Ä©'), + (0x129, 'V'), + (0x12A, 'M', u'Ä«'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'Ä­'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'Ä·'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'Å‚'), + (0x142, 'V'), + (0x143, 'M', u'Å„'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'Å‹'), + (0x14B, 'V'), + (0x14C, 'M', u'Å'), + (0x14D, 'V'), + (0x14E, 'M', u'Å'), + (0x14F, 'V'), + (0x150, 'M', u'Å‘'), + (0x151, 'V'), + (0x152, 'M', u'Å“'), + (0x153, 'V'), + (0x154, 'M', u'Å•'), + (0x155, 'V'), + (0x156, 'M', u'Å—'), + (0x157, 'V'), + (0x158, 'M', u'Å™'), + (0x159, 'V'), + (0x15A, 'M', u'Å›'), + (0x15B, 'V'), + (0x15C, 'M', u'Å'), + (0x15D, 'V'), + (0x15E, 'M', u'ÅŸ'), + (0x15F, 'V'), + (0x160, 'M', u'Å¡'), + (0x161, 'V'), + (0x162, 'M', u'Å£'), + (0x163, 'V'), + (0x164, 'M', u'Å¥'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'Å©'), + (0x169, 'V'), + (0x16A, 'M', u'Å«'), + (0x16B, 'V'), + (0x16C, 'M', u'Å­'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'Å·'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'É“'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'Æ…'), + (0x185, 'V'), + (0x186, 'M', u'É”'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'É–'), + (0x18A, 'M', u'É—'), + (0x18B, 'M', u'ÆŒ'), + (0x18C, 'V'), + (0x18E, 'M', u'Ç'), + (0x18F, 'M', u'É™'), + (0x190, 'M', u'É›'), + (0x191, 'M', u'Æ’'), + (0x192, 'V'), + (0x193, 'M', u'É '), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'É£'), + (0x195, 'V'), + (0x196, 'M', u'É©'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'Æ™'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'Æ¡'), + (0x1A1, 'V'), + (0x1A2, 'M', u'Æ£'), + (0x1A3, 'V'), + (0x1A4, 'M', u'Æ¥'), + (0x1A5, 'V'), + (0x1A6, 'M', u'Ê€'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'Æ­'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'Æ°'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ÊŠ'), + (0x1B2, 'M', u'Ê‹'), + (0x1B3, 'M', u'Æ´'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'Ê’'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ÇŽ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'Ç'), + (0x1D0, 'V'), + (0x1D1, 'M', u'Ç’'), + (0x1D2, 'V'), + (0x1D3, 'M', u'Ç”'), + (0x1D4, 'V'), + (0x1D5, 'M', u'Ç–'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'Çš'), + (0x1DA, 'V'), + (0x1DB, 'M', u'Çœ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ÇŸ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'Ç¡'), + (0x1E1, 'V'), + (0x1E2, 'M', u'Ç£'), + (0x1E3, 'V'), + (0x1E4, 'M', u'Ç¥'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'Ç©'), + (0x1E9, 'V'), + (0x1EA, 'M', u'Ç«'), + (0x1EB, 'V'), + (0x1EC, 'M', u'Ç­'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'Æ•'), + (0x1F7, 'M', u'Æ¿'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'Ç»'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'Ç¿'), + (0x1FF, 'V'), + (0x200, 'M', u'È'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'È…'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'È‹'), + (0x20B, 'V'), + (0x20C, 'M', u'È'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'È'), + (0x20F, 'V'), + (0x210, 'M', u'È‘'), + (0x211, 'V'), + (0x212, 'M', u'È“'), + (0x213, 'V'), + (0x214, 'M', u'È•'), + (0x215, 'V'), + (0x216, 'M', u'È—'), + (0x217, 'V'), + (0x218, 'M', u'È™'), + (0x219, 'V'), + (0x21A, 'M', u'È›'), + (0x21B, 'V'), + (0x21C, 'M', u'È'), + (0x21D, 'V'), + (0x21E, 'M', u'ÈŸ'), + (0x21F, 'V'), + (0x220, 'M', u'Æž'), + (0x221, 'V'), + (0x222, 'M', u'È£'), + (0x223, 'V'), + (0x224, 'M', u'È¥'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'È©'), + (0x229, 'V'), + (0x22A, 'M', u'È«'), + (0x22B, 'V'), + (0x22C, 'M', u'È­'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'â±¥'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'Æš'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'É‚'), + (0x242, 'V'), + (0x243, 'M', u'Æ€'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ÊŒ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'É‹'), + (0x24B, 'V'), + (0x24C, 'M', u'É'), + (0x24D, 'V'), + (0x24E, 'M', u'É'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'É»'), + (0x2B6, 'M', u'Ê'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ÌŠ'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' Ì‹'), + (0x2DE, 'V'), + (0x2E0, 'M', u'É£'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'Ê•'), + (0x2E5, 'V'), + (0x340, 'M', u'Ì€'), + (0x341, 'M', u'Ì'), + (0x342, 'V'), + (0x343, 'M', u'Ì“'), + (0x344, 'M', u'̈Ì'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'Í·'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' Ì'), + (0x385, '3', u' ̈Ì'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ÏŒ'), + (0x38D, 'X'), + (0x38E, 'M', u'Ï'), + (0x38F, 'M', u'ÏŽ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'Ï€'), + (0x3A1, 'M', u'Ï'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'Ï„'), + (0x3A5, 'M', u'Ï…'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ÏŠ'), + (0x3AB, 'M', u'Ï‹'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'Ï—'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'Ï…'), + (0x3D3, 'M', u'Ï'), + (0x3D4, 'M', u'Ï‹'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'Ï€'), + (0x3D7, 'V'), + (0x3D8, 'M', u'Ï™'), + (0x3D9, 'V'), + (0x3DA, 'M', u'Ï›'), + (0x3DB, 'V'), + (0x3DC, 'M', u'Ï'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ÏŸ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'Ï¡'), + (0x3E1, 'V'), + (0x3E2, 'M', u'Ï£'), + (0x3E3, 'V'), + (0x3E4, 'M', u'Ï¥'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'Ï©'), + (0x3E9, 'V'), + (0x3EA, 'M', u'Ï«'), + (0x3EB, 'V'), + (0x3EC, 'M', u'Ï­'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'Ï'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'Ï»'), + (0x3FB, 'V'), + (0x3FD, 'M', u'Í»'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'Ñ'), + (0x401, 'M', u'Ñ‘'), + (0x402, 'M', u'Ñ’'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'Ñ“'), + (0x404, 'M', u'Ñ”'), + (0x405, 'M', u'Ñ•'), + (0x406, 'M', u'Ñ–'), + (0x407, 'M', u'Ñ—'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'Ñ™'), + (0x40A, 'M', u'Ñš'), + (0x40B, 'M', u'Ñ›'), + (0x40C, 'M', u'Ñœ'), + (0x40D, 'M', u'Ñ'), + (0x40E, 'M', u'Ñž'), + (0x40F, 'M', u'ÑŸ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'Ñ€'), + (0x421, 'M', u'Ñ'), + (0x422, 'M', u'Ñ‚'), + (0x423, 'M', u'у'), + (0x424, 'M', u'Ñ„'), + (0x425, 'M', u'Ñ…'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ÑŠ'), + (0x42B, 'M', u'Ñ‹'), + (0x42C, 'M', u'ÑŒ'), + (0x42D, 'M', u'Ñ'), + (0x42E, 'M', u'ÑŽ'), + (0x42F, 'M', u'Ñ'), + (0x430, 'V'), + (0x460, 'M', u'Ñ¡'), + (0x461, 'V'), + (0x462, 'M', u'Ñ£'), + (0x463, 'V'), + (0x464, 'M', u'Ñ¥'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'Ñ©'), + (0x469, 'V'), + (0x46A, 'M', u'Ñ«'), + (0x46B, 'V'), + (0x46C, 'M', u'Ñ­'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'Ñ·'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'Ñ»'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'Ñ¿'), + (0x47F, 'V'), + (0x480, 'M', u'Ò'), + (0x481, 'V'), + (0x48A, 'M', u'Ò‹'), + (0x48B, 'V'), + (0x48C, 'M', u'Ò'), + (0x48D, 'V'), + (0x48E, 'M', u'Ò'), + (0x48F, 'V'), + (0x490, 'M', u'Ò‘'), + (0x491, 'V'), + (0x492, 'M', u'Ò“'), + (0x493, 'V'), + (0x494, 'M', u'Ò•'), + (0x495, 'V'), + (0x496, 'M', u'Ò—'), + (0x497, 'V'), + (0x498, 'M', u'Ò™'), + (0x499, 'V'), + (0x49A, 'M', u'Ò›'), + (0x49B, 'V'), + (0x49C, 'M', u'Ò'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ÒŸ'), + (0x49F, 'V'), + (0x4A0, 'M', u'Ò¡'), + (0x4A1, 'V'), + (0x4A2, 'M', u'Ò£'), + (0x4A3, 'V'), + (0x4A4, 'M', u'Ò¥'), + (0x4A5, 'V'), + (0x4A6, 'M', u'Ò§'), + (0x4A7, 'V'), + (0x4A8, 'M', u'Ò©'), + (0x4A9, 'V'), + (0x4AA, 'M', u'Ò«'), + (0x4AB, 'V'), + (0x4AC, 'M', u'Ò­'), + (0x4AD, 'V'), + (0x4AE, 'M', u'Ò¯'), + (0x4AF, 'V'), + (0x4B0, 'M', u'Ò±'), + (0x4B1, 'V'), + (0x4B2, 'M', u'Ò³'), + (0x4B3, 'V'), + (0x4B4, 'M', u'Òµ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'Ò·'), + (0x4B7, 'V'), + (0x4B8, 'M', u'Ò¹'), + (0x4B9, 'V'), + (0x4BA, 'M', u'Ò»'), + (0x4BB, 'V'), + (0x4BC, 'M', u'Ò½'), + (0x4BD, 'V'), + (0x4BE, 'M', u'Ò¿'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'Ó‚'), + (0x4C2, 'V'), + (0x4C3, 'M', u'Ó„'), + (0x4C4, 'V'), + (0x4C5, 'M', u'Ó†'), + (0x4C6, 'V'), + (0x4C7, 'M', u'Óˆ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ÓŠ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ÓŒ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ÓŽ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'Ó‘'), + (0x4D1, 'V'), + (0x4D2, 'M', u'Ó“'), + (0x4D3, 'V'), + (0x4D4, 'M', u'Ó•'), + (0x4D5, 'V'), + (0x4D6, 'M', u'Ó—'), + (0x4D7, 'V'), + (0x4D8, 'M', u'Ó™'), + (0x4D9, 'V'), + (0x4DA, 'M', u'Ó›'), + (0x4DB, 'V'), + (0x4DC, 'M', u'Ó'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ÓŸ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'Ó¡'), + (0x4E1, 'V'), + (0x4E2, 'M', u'Ó£'), + (0x4E3, 'V'), + (0x4E4, 'M', u'Ó¥'), + (0x4E5, 'V'), + (0x4E6, 'M', u'Ó§'), + (0x4E7, 'V'), + (0x4E8, 'M', u'Ó©'), + (0x4E9, 'V'), + (0x4EA, 'M', u'Ó«'), + (0x4EB, 'V'), + (0x4EC, 'M', u'Ó­'), + (0x4ED, 'V'), + (0x4EE, 'M', u'Ó¯'), + (0x4EF, 'V'), + (0x4F0, 'M', u'Ó±'), + (0x4F1, 'V'), + (0x4F2, 'M', u'Ó³'), + (0x4F3, 'V'), + (0x4F4, 'M', u'Óµ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'Ó·'), + (0x4F7, 'V'), + (0x4F8, 'M', u'Ó¹'), + (0x4F9, 'V'), + (0x4FA, 'M', u'Ó»'), + (0x4FB, 'V'), + (0x4FC, 'M', u'Ó½'), + (0x4FD, 'V'), + (0x4FE, 'M', u'Ó¿'), + (0x4FF, 'V'), + (0x500, 'M', u'Ô'), + (0x501, 'V'), + (0x502, 'M', u'Ôƒ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'Ô…'), + (0x505, 'V'), + (0x506, 'M', u'Ô‡'), + (0x507, 'V'), + (0x508, 'M', u'Ô‰'), + (0x509, 'V'), + (0x50A, 'M', u'Ô‹'), + (0x50B, 'V'), + (0x50C, 'M', u'Ô'), + (0x50D, 'V'), + (0x50E, 'M', u'Ô'), + (0x50F, 'V'), + (0x510, 'M', u'Ô‘'), + (0x511, 'V'), + (0x512, 'M', u'Ô“'), + (0x513, 'V'), + (0x514, 'M', u'Ô•'), + (0x515, 'V'), + (0x516, 'M', u'Ô—'), + (0x517, 'V'), + (0x518, 'M', u'Ô™'), + (0x519, 'V'), + (0x51A, 'M', u'Ô›'), + (0x51B, 'V'), + (0x51C, 'M', u'Ô'), + (0x51D, 'V'), + (0x51E, 'M', u'ÔŸ'), + (0x51F, 'V'), + (0x520, 'M', u'Ô¡'), + (0x521, 'V'), + (0x522, 'M', u'Ô£'), + (0x523, 'V'), + (0x524, 'M', u'Ô¥'), + (0x525, 'V'), + (0x526, 'M', u'Ô§'), + (0x527, 'V'), + (0x528, 'M', u'Ô©'), + (0x529, 'V'), + (0x52A, 'M', u'Ô«'), + (0x52B, 'V'), + (0x52C, 'M', u'Ô­'), + (0x52D, 'V'), + (0x52E, 'M', u'Ô¯'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'Õ¡'), + (0x532, 'M', u'Õ¢'), + (0x533, 'M', u'Õ£'), + (0x534, 'M', u'Õ¤'), + (0x535, 'M', u'Õ¥'), + (0x536, 'M', u'Õ¦'), + (0x537, 'M', u'Õ§'), + (0x538, 'M', u'Õ¨'), + (0x539, 'M', u'Õ©'), + (0x53A, 'M', u'Õª'), + (0x53B, 'M', u'Õ«'), + (0x53C, 'M', u'Õ¬'), + (0x53D, 'M', u'Õ­'), + (0x53E, 'M', u'Õ®'), + (0x53F, 'M', u'Õ¯'), + (0x540, 'M', u'Õ°'), + (0x541, 'M', u'Õ±'), + (0x542, 'M', u'Õ²'), + (0x543, 'M', u'Õ³'), + (0x544, 'M', u'Õ´'), + (0x545, 'M', u'Õµ'), + (0x546, 'M', u'Õ¶'), + (0x547, 'M', u'Õ·'), + (0x548, 'M', u'Õ¸'), + (0x549, 'M', u'Õ¹'), + (0x54A, 'M', u'Õº'), + (0x54B, 'M', u'Õ»'), + (0x54C, 'M', u'Õ¼'), + (0x54D, 'M', u'Õ½'), + (0x54E, 'M', u'Õ¾'), + (0x54F, 'M', u'Õ¿'), + (0x550, 'M', u'Ö€'), + (0x551, 'M', u'Ö'), + (0x552, 'M', u'Ö‚'), + (0x553, 'M', u'Öƒ'), + (0x554, 'M', u'Ö„'), + (0x555, 'M', u'Ö…'), + (0x556, 'M', u'Ö†'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', u'Õ¥Ö‚'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'Û‡Ù´'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'à¹à¸²'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + ] + +def _seg_13(): + return [ + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'à»àº²'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'à¾à¾µ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'â´§'), + (0x10C8, 'X'), + (0x10CD, 'M', u'â´­'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + ] + +def _seg_14(): + return [ + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'á°'), + (0x13F9, 'M', u'á±'), + (0x13FA, 'M', u'á²'), + (0x13FB, 'M', u'á³'), + (0x13FC, 'M', u'á´'), + (0x13FD, 'M', u'áµ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + ] + +def _seg_15(): + return [ + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'Ñ'), + (0x1C84, 'M', u'Ñ‚'), + (0x1C86, 'M', u'ÑŠ'), + (0x1C87, 'M', u'Ñ£'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'Ç'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'È£'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'É'), + (0x1D45, 'M', u'É‘'), + (0x1D46, 'M', u'á´‚'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'É™'), + (0x1D4B, 'M', u'É›'), + (0x1D4C, 'M', u'Éœ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'Å‹'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'É”'), + (0x1D54, 'M', u'á´–'), + (0x1D55, 'M', u'á´—'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'á´'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'á´¥'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'Ï'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'É’'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'É•'), + (0x1D9E, 'M', u'ð'), + ] + +def _seg_16(): + return [ + (0x1D9F, 'M', u'Éœ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ÉŸ'), + (0x1DA2, 'M', u'É¡'), + (0x1DA3, 'M', u'É¥'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'É©'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'áµ»'), + (0x1DA8, 'M', u'Ê'), + (0x1DA9, 'M', u'É­'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ÊŸ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'É°'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'É´'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'Ê‚'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'Æ«'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ÊŠ'), + (0x1DB8, 'M', u'á´œ'), + (0x1DB9, 'M', u'Ê‹'), + (0x1DBA, 'M', u'ÊŒ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'Ê'), + (0x1DBD, 'M', u'Ê‘'), + (0x1DBE, 'M', u'Ê’'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'á¸'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'á¸'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'á¸'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'á¸'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + ] + +def _seg_17(): + return [ + (0x1E40, 'M', u'á¹'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'á¹…'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'á¹'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'á¹'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'á¹—'), + (0x1E57, 'V'), + (0x1E58, 'M', u'á¹™'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'á¹›'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'á¹'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'á¹£'), + (0x1E63, 'V'), + (0x1E64, 'M', u'á¹¥'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'á¹­'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'á¹±'), + (0x1E71, 'V'), + (0x1E72, 'M', u'á¹³'), + (0x1E73, 'V'), + (0x1E74, 'M', u'á¹µ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'á¹·'), + (0x1E77, 'V'), + (0x1E78, 'M', u'á¹¹'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'á¹»'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'á¹½'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'áº'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'áº'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'áº'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + ] + +def _seg_18(): + return [ + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'á»'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'á»…'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'á»'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'á»'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'á»—'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'á»™'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'á»›'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'á»'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'á»­'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'á»±'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'á»·'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'á»»'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'á¼€'), + (0x1F09, 'M', u'á¼'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'á¼…'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'á¼'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'á¼’'), + ] + +def _seg_19(): + return [ + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'á¼”'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'á¼ '), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'á¼¢'), + (0x1F2B, 'M', u'á¼£'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'á¼¥'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'á¼°'), + (0x1F39, 'M', u'á¼±'), + (0x1F3A, 'M', u'á¼²'), + (0x1F3B, 'M', u'á¼³'), + (0x1F3C, 'M', u'á¼´'), + (0x1F3D, 'M', u'á¼µ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'á¼·'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'á½€'), + (0x1F49, 'M', u'á½'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'á½…'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'á½—'), + (0x1F60, 'V'), + (0x1F68, 'M', u'á½ '), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'á½¢'), + (0x1F6B, 'M', u'á½£'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'á½¥'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ÏŒ'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'Ï'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ÏŽ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'á¼Î¹'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'á¼Î¹'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + ] + +def _seg_20(): + return [ + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'á¾°'), + (0x1FB9, 'M', u'á¾±'), + (0x1FBA, 'M', u'á½°'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' Ì“'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' Ì“'), + (0x1FC0, '3', u' Í‚'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'á½²'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'á½´'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' Ì“Ì€'), + (0x1FCE, '3', u' Ì“Ì'), + (0x1FCF, '3', u' Ì“Í‚'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'Î'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'á¿'), + (0x1FD9, 'M', u'á¿‘'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' Ì”Ì'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'á¿ '), + (0x1FE9, 'M', u'á¿¡'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'Ï'), + (0x1FEC, 'M', u'á¿¥'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈Ì'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ÏŒ'), + (0x1FFA, 'M', u'á½¼'), + (0x1FFB, 'M', u'ÏŽ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' Ì'), + (0x1FFE, '3', u' Ì”'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'â€'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + ] + +def _seg_21(): + return [ + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' Ì…'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'É™'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'É›'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + ] + +def _seg_22(): + return [ + (0x212A, 'M', u'k'), + (0x212B, 'M', u'Ã¥'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'×'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'×’'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'Ï€'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'Ï€'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1â„7'), + (0x2151, 'M', u'1â„9'), + (0x2152, 'M', u'1â„10'), + (0x2153, 'M', u'1â„3'), + (0x2154, 'M', u'2â„3'), + (0x2155, 'M', u'1â„5'), + (0x2156, 'M', u'2â„5'), + (0x2157, 'M', u'3â„5'), + (0x2158, 'M', u'4â„5'), + (0x2159, 'M', u'1â„6'), + (0x215A, 'M', u'5â„6'), + (0x215B, 'M', u'1â„8'), + (0x215C, 'M', u'3â„8'), + (0x215D, 'M', u'5â„8'), + (0x215E, 'M', u'7â„8'), + (0x215F, 'M', u'1â„'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0â„3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + ] + +def _seg_24(): + return [ + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'â«Ì¸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BFF, 'X'), + (0x2C00, 'M', u'â°°'), + (0x2C01, 'M', u'â°±'), + (0x2C02, 'M', u'â°²'), + (0x2C03, 'M', u'â°³'), + (0x2C04, 'M', u'â°´'), + (0x2C05, 'M', u'â°µ'), + (0x2C06, 'M', u'â°¶'), + (0x2C07, 'M', u'â°·'), + (0x2C08, 'M', u'â°¸'), + (0x2C09, 'M', u'â°¹'), + (0x2C0A, 'M', u'â°º'), + (0x2C0B, 'M', u'â°»'), + (0x2C0C, 'M', u'â°¼'), + (0x2C0D, 'M', u'â°½'), + (0x2C0E, 'M', u'â°¾'), + (0x2C0F, 'M', u'â°¿'), + (0x2C10, 'M', u'â±€'), + (0x2C11, 'M', u'â±'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'â±…'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'â±'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'â±'), + (0x2C20, 'M', u'â±'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'â±’'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'â±”'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'â±–'), + (0x2C27, 'M', u'â±—'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'â±™'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'â±›'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'â±'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'É«'), + (0x2C63, 'M', u'áµ½'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'É‘'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'É'), + (0x2C70, 'M', u'É’'), + ] + +def _seg_25(): + return [ + (0x2C71, 'V'), + (0x2C72, 'M', u'â±³'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'È¿'), + (0x2C7F, 'M', u'É€'), + (0x2C80, 'M', u'â²'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'â²…'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'â²'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'â²'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'â²—'), + (0x2C97, 'V'), + (0x2C98, 'M', u'â²™'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'â²›'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'â²'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'â²£'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'â²¥'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'â²­'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'â²±'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'â²³'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'â²µ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'â²·'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'â²¹'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'â²»'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'â²½'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'â³'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'â³…'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'â³'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'â³'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'â³—'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'â³™'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'â³›'), + ] + +def _seg_26(): + return [ + (0x2CDB, 'V'), + (0x2CDC, 'M', u'â³'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'â³£'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'â³®'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'â³³'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E4F, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'æ¯'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'ä¹™'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'å„¿'), + (0x2F0A, 'M', u'å…¥'), + (0x2F0B, 'M', u'å…«'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'å'), + (0x2F18, 'M', u'åœ'), + (0x2F19, 'M', u'å©'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'åˆ'), + (0x2F1D, 'M', u'å£'), + (0x2F1E, 'M', u'å›—'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'å­'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'å°'), + (0x2F2A, 'M', u'å°¢'), + (0x2F2B, 'M', u'å°¸'), + (0x2F2C, 'M', u'å±®'), + (0x2F2D, 'M', u'å±±'), + ] + +def _seg_27(): + return [ + (0x2F2E, 'M', u'å·›'), + (0x2F2F, 'M', u'å·¥'), + (0x2F30, 'M', u'å·±'), + (0x2F31, 'M', u'å·¾'), + (0x2F32, 'M', u'å¹²'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'å»´'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'å½'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'å½³'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'æ”´'), + (0x2F42, 'M', u'æ–‡'), + (0x2F43, 'M', u'æ–—'), + (0x2F44, 'M', u'æ–¤'), + (0x2F45, 'M', u'æ–¹'), + (0x2F46, 'M', u'æ— '), + (0x2F47, 'M', u'æ—¥'), + (0x2F48, 'M', u'æ›°'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'æ­¢'), + (0x2F4D, 'M', u'æ­¹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'æ°'), + (0x2F53, 'M', u'æ°”'), + (0x2F54, 'M', u'æ°´'), + (0x2F55, 'M', u'ç«'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'ç“œ'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'ç”°'), + (0x2F66, 'M', u'ç–‹'), + (0x2F67, 'M', u'ç–’'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'çš®'), + (0x2F6B, 'M', u'çš¿'), + (0x2F6C, 'M', u'ç›®'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'ç©´'), + (0x2F74, 'M', u'ç«‹'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'ç±³'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'ç¾½'), + (0x2F7C, 'M', u'è€'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'è¿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'è™'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'è¡€'), + (0x2F8F, 'M', u'è¡Œ'), + (0x2F90, 'M', u'è¡£'), + (0x2F91, 'M', u'襾'), + ] + +def _seg_28(): + return [ + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'è°·'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'è²'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'èµ°'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'è¾›'), + (0x2FA0, 'M', u'è¾°'), + (0x2FA1, 'M', u'è¾µ'), + (0x2FA2, 'M', u'é‚‘'), + (0x2FA3, 'M', u'é…‰'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'é•·'), + (0x2FA8, 'M', u'é–€'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'éš¹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'é‘'), + (0x2FAE, 'M', u'éž'), + (0x2FAF, 'M', u'é¢'), + (0x2FB0, 'M', u'é©'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'é '), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'é«Ÿ'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'é­š'), + (0x2FC3, 'M', u'é³¥'), + (0x2FC4, 'M', u'é¹µ'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'é»'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'é¼ '), + (0x2FD0, 'M', u'é¼»'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'é½’'), + (0x2FD3, 'M', u'é¾'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'é¾ '), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'å'), + (0x3039, 'M', u'å„'), + (0x303A, 'M', u'å…'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ã‚™'), + (0x309C, '3', u' ã‚š'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', u'á„€'), + (0x3132, 'M', u'á„'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'á„‚'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'á„„'), + ] + +def _seg_29(): + return [ + (0x3139, 'M', u'á„…'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'á„š'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'á„¡'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'á„Š'), + (0x3147, 'M', u'á„‹'), + (0x3148, 'M', u'á„Œ'), + (0x3149, 'M', u'á„'), + (0x314A, 'M', u'á„Ž'), + (0x314B, 'M', u'á„'), + (0x314C, 'M', u'á„'), + (0x314D, 'M', u'á„‘'), + (0x314E, 'M', u'á„’'), + (0x314F, 'M', u'á…¡'), + (0x3150, 'M', u'á…¢'), + (0x3151, 'M', u'á…£'), + (0x3152, 'M', u'á…¤'), + (0x3153, 'M', u'á…¥'), + (0x3154, 'M', u'á…¦'), + (0x3155, 'M', u'á…§'), + (0x3156, 'M', u'á…¨'), + (0x3157, 'M', u'á…©'), + (0x3158, 'M', u'á…ª'), + (0x3159, 'M', u'á…«'), + (0x315A, 'M', u'á…¬'), + (0x315B, 'M', u'á…­'), + (0x315C, 'M', u'á…®'), + (0x315D, 'M', u'á…¯'), + (0x315E, 'M', u'á…°'), + (0x315F, 'M', u'á…±'), + (0x3160, 'M', u'á…²'), + (0x3161, 'M', u'á…³'), + (0x3162, 'M', u'á…´'), + (0x3163, 'M', u'á…µ'), + (0x3164, 'X'), + (0x3165, 'M', u'á„”'), + (0x3166, 'M', u'á„•'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'á„œ'), + (0x316F, 'M', u'á‡'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'á„'), + (0x3172, 'M', u'á„ž'), + (0x3173, 'M', u'á„ '), + (0x3174, 'M', u'á„¢'), + (0x3175, 'M', u'á„£'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'á„©'), + (0x3178, 'M', u'á„«'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'á„­'), + (0x317B, 'M', u'á„®'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'á…€'), + (0x3180, 'M', u'á…‡'), + (0x3181, 'M', u'á…Œ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'á…—'), + (0x3185, 'M', u'á…˜'), + (0x3186, 'M', u'á…™'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'å››'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'ä¹™'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'ä¸'), + (0x319D, 'M', u'天'), + ] + +def _seg_30(): + return [ + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(á„€)'), + (0x3201, '3', u'(á„‚)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(á„…)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(á„‹)'), + (0x3208, '3', u'(á„Œ)'), + (0x3209, '3', u'(á„Ž)'), + (0x320A, '3', u'(á„)'), + (0x320B, '3', u'(á„)'), + (0x320C, '3', u'(á„‘)'), + (0x320D, '3', u'(á„’)'), + (0x320E, '3', u'(ê°€)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(ë¼)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(ë°”)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(ì•„)'), + (0x3216, '3', u'(ìž)'), + (0x3217, '3', u'(ì°¨)'), + (0x3218, '3', u'(ì¹´)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(å››)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(å…­)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(å…«)'), + (0x3228, '3', u'(ä¹)'), + (0x3229, '3', u'(å)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(ç«)'), + (0x322C, '3', u'(æ°´)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(æ—¥)'), + (0x3231, '3', u'(æ ª)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(å)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(ç¥)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(å­¦)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(ä¼)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(å”)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'å•'), + (0x3245, 'M', u'å¹¼'), + (0x3246, 'M', u'æ–‡'), + (0x3247, 'M', u'ç®'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'á„€'), + (0x3261, 'M', u'á„‚'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'á„…'), + ] + +def _seg_31(): + return [ + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'á„‹'), + (0x3268, 'M', u'á„Œ'), + (0x3269, 'M', u'á„Ž'), + (0x326A, 'M', u'á„'), + (0x326B, 'M', u'á„'), + (0x326C, 'M', u'á„‘'), + (0x326D, 'M', u'á„’'), + (0x326E, 'M', u'ê°€'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'ë¼'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'ë°”'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'ì•„'), + (0x3276, 'M', u'ìž'), + (0x3277, 'M', u'ì°¨'), + (0x3278, 'M', u'ì¹´'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주ì˜'), + (0x327E, 'M', u'ìš°'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'å››'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'å…­'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'å…«'), + (0x3288, 'M', u'ä¹'), + (0x3289, 'M', u'å'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'ç«'), + (0x328C, 'M', u'æ°´'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'æ—¥'), + (0x3291, 'M', u'æ ª'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'å'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'ç¥'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'ç”·'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'é©'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'å°'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'é …'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'æ­£'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'å·¦'), + (0x32A8, 'M', u'å³'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'å®—'), + (0x32AB, 'M', u'å­¦'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'ä¼'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'å”'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + ] + +def _seg_32(): + return [ + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ã‚¢'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'ã‚«'), + (0x32D6, 'M', u'ã‚­'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'ã‚·'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'ã‚»'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'ã‚¿'), + (0x32E0, 'M', u'ãƒ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ãƒ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ãƒ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インãƒ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローãƒ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーãƒ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンãƒãƒ¼ãƒ '), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センãƒ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ãƒã‚¤ãƒ„'), + (0x332B, 'M', u'パーセント'), + ] + +def _seg_33(): + return [ + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'ãƒãƒ¼ãƒ¬ãƒ«'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ãƒã‚¤ãƒ³ãƒˆ'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ãƒãƒ³ãƒ‰'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッãƒ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリãƒãƒ¼ãƒ«'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'å¹³æˆ'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'æ ªå¼ä¼šç¤¾'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + ] + +def _seg_34(): + return [ + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1æ—¥'), + (0x33E1, 'M', u'2æ—¥'), + (0x33E2, 'M', u'3æ—¥'), + (0x33E3, 'M', u'4æ—¥'), + (0x33E4, 'M', u'5æ—¥'), + (0x33E5, 'M', u'6æ—¥'), + (0x33E6, 'M', u'7æ—¥'), + (0x33E7, 'M', u'8æ—¥'), + (0x33E8, 'M', u'9æ—¥'), + (0x33E9, 'M', u'10æ—¥'), + (0x33EA, 'M', u'11æ—¥'), + (0x33EB, 'M', u'12æ—¥'), + (0x33EC, 'M', u'13æ—¥'), + (0x33ED, 'M', u'14æ—¥'), + (0x33EE, 'M', u'15æ—¥'), + (0x33EF, 'M', u'16æ—¥'), + (0x33F0, 'M', u'17æ—¥'), + (0x33F1, 'M', u'18æ—¥'), + (0x33F2, 'M', u'19æ—¥'), + (0x33F3, 'M', u'20æ—¥'), + ] + +def _seg_35(): + return [ + (0x33F4, 'M', u'21æ—¥'), + (0x33F5, 'M', u'22æ—¥'), + (0x33F6, 'M', u'23æ—¥'), + (0x33F7, 'M', u'24æ—¥'), + (0x33F8, 'M', u'25æ—¥'), + (0x33F9, 'M', u'26æ—¥'), + (0x33FA, 'M', u'27æ—¥'), + (0x33FB, 'M', u'28æ—¥'), + (0x33FC, 'M', u'29æ—¥'), + (0x33FD, 'M', u'30æ—¥'), + (0x33FE, 'M', u'31æ—¥'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ê™'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ê™…'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ê™'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ê™'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ê™—'), + (0xA657, 'V'), + (0xA658, 'M', u'ê™™'), + (0xA659, 'V'), + (0xA65A, 'M', u'ê™›'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ê™'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ê™­'), + (0xA66D, 'V'), + (0xA680, 'M', u'êš'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'êš…'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'êš‹'), + (0xA68B, 'V'), + (0xA68C, 'M', u'êš'), + (0xA68D, 'V'), + (0xA68E, 'M', u'êš'), + (0xA68F, 'V'), + (0xA690, 'M', u'êš‘'), + (0xA691, 'V'), + (0xA692, 'M', u'êš“'), + (0xA693, 'V'), + (0xA694, 'M', u'êš•'), + (0xA695, 'V'), + (0xA696, 'M', u'êš—'), + (0xA697, 'V'), + (0xA698, 'M', u'êš™'), + (0xA699, 'V'), + (0xA69A, 'M', u'êš›'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ÑŠ'), + (0xA69D, 'M', u'ÑŒ'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ê'), + (0xA741, 'V'), + (0xA742, 'M', u'êƒ'), + (0xA743, 'V'), + (0xA744, 'M', u'ê…'), + (0xA745, 'V'), + (0xA746, 'M', u'ê‡'), + (0xA747, 'V'), + (0xA748, 'M', u'ê‰'), + (0xA749, 'V'), + (0xA74A, 'M', u'ê‹'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ê'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ê'), + (0xA74F, 'V'), + (0xA750, 'M', u'ê‘'), + (0xA751, 'V'), + (0xA752, 'M', u'ê“'), + (0xA753, 'V'), + (0xA754, 'M', u'ê•'), + (0xA755, 'V'), + (0xA756, 'M', u'ê—'), + (0xA757, 'V'), + (0xA758, 'M', u'ê™'), + (0xA759, 'V'), + (0xA75A, 'M', u'ê›'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ê'), + (0xA75D, 'V'), + (0xA75E, 'M', u'êŸ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ê¡'), + (0xA761, 'V'), + (0xA762, 'M', u'ê£'), + (0xA763, 'V'), + (0xA764, 'M', u'ê¥'), + (0xA765, 'V'), + (0xA766, 'M', u'ê§'), + (0xA767, 'V'), + (0xA768, 'M', u'ê©'), + (0xA769, 'V'), + (0xA76A, 'M', u'ê«'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ê­'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ê¯'), + (0xA76F, 'V'), + (0xA770, 'M', u'ê¯'), + (0xA771, 'V'), + (0xA779, 'M', u'êº'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ê¼'), + (0xA77C, 'V'), + (0xA77D, 'M', u'áµ¹'), + (0xA77E, 'M', u'ê¿'), + (0xA77F, 'V'), + (0xA780, 'M', u'êž'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'êž…'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'É¥'), + (0xA78E, 'V'), + (0xA790, 'M', u'êž‘'), + (0xA791, 'V'), + ] + +def _seg_37(): + return [ + (0xA792, 'M', u'êž“'), + (0xA793, 'V'), + (0xA796, 'M', u'êž—'), + (0xA797, 'V'), + (0xA798, 'M', u'êž™'), + (0xA799, 'V'), + (0xA79A, 'M', u'êž›'), + (0xA79B, 'V'), + (0xA79C, 'M', u'êž'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'êž¡'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'êž©'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'Éœ'), + (0xA7AC, 'M', u'É¡'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'Êž'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'Ê'), + (0xA7B3, 'M', u'ê­“'), + (0xA7B4, 'M', u'êžµ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'êž·'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'Å“'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'É«'), + (0xAB5F, 'M', u'ê­’'), + (0xAB60, 'V'), + (0xAB66, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'á€'), + (0xAB91, 'M', u'á'), + (0xAB92, 'M', u'á‚'), + (0xAB93, 'M', u'áƒ'), + (0xAB94, 'M', u'á„'), + (0xAB95, 'M', u'á…'), + (0xAB96, 'M', u'á†'), + (0xAB97, 'M', u'á‡'), + (0xAB98, 'M', u'áˆ'), + (0xAB99, 'M', u'á‰'), + (0xAB9A, 'M', u'áŠ'), + (0xAB9B, 'M', u'á‹'), + (0xAB9C, 'M', u'áŒ'), + (0xAB9D, 'M', u'á'), + (0xAB9E, 'M', u'áŽ'), + (0xAB9F, 'M', u'á'), + (0xABA0, 'M', u'á'), + (0xABA1, 'M', u'á‘'), + (0xABA2, 'M', u'á’'), + (0xABA3, 'M', u'á“'), + (0xABA4, 'M', u'á”'), + (0xABA5, 'M', u'á•'), + (0xABA6, 'M', u'á–'), + (0xABA7, 'M', u'á—'), + (0xABA8, 'M', u'á˜'), + (0xABA9, 'M', u'á™'), + (0xABAA, 'M', u'áš'), + (0xABAB, 'M', u'á›'), + (0xABAC, 'M', u'áœ'), + (0xABAD, 'M', u'á'), + (0xABAE, 'M', u'áž'), + (0xABAF, 'M', u'áŸ'), + (0xABB0, 'M', u'á '), + (0xABB1, 'M', u'á¡'), + (0xABB2, 'M', u'á¢'), + (0xABB3, 'M', u'á£'), + (0xABB4, 'M', u'á¤'), + (0xABB5, 'M', u'á¥'), + (0xABB6, 'M', u'á¦'), + (0xABB7, 'M', u'á§'), + (0xABB8, 'M', u'á¨'), + (0xABB9, 'M', u'á©'), + (0xABBA, 'M', u'áª'), + (0xABBB, 'M', u'á«'), + (0xABBC, 'M', u'á¬'), + (0xABBD, 'M', u'á­'), + (0xABBE, 'M', u'á®'), + (0xABBF, 'M', u'á¯'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'æ›´'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'å¥'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'å–‡'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'ç¾…'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'é‚'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'æ´›'), + ] + +def _seg_39(): + return [ + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'çž'), + (0xF918, 'M', u'è½'), + (0xF919, 'M', u'é…ª'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'åµ'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'åµ'), + (0xF922, 'M', u'æ¿«'), + (0xF923, 'M', u'è—'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'è Ÿ'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'å‹ž'), + (0xF930, 'M', u'æ“„'), + (0xF931, 'M', u'æ«“'), + (0xF932, 'M', u'çˆ'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'è€'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'è·¯'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'é­¯'), + (0xF93A, 'M', u'é·º'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'è‰'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'è«–'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'ç± '), + (0xF945, 'M', u'è¾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'é›·'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'å±¢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'æ·š'), + (0xF94E, 'M', u'æ¼'), + (0xF94F, 'M', u'ç´¯'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'å‹’'), + (0xF953, 'M', u'è‚‹'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'è±'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'æ‹'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'ç•°'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'ä¸'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'ç´¢'), + (0xF96B, 'M', u'åƒ'), + (0xF96C, 'M', u'å¡ž'), + (0xF96D, 'M', u'çœ'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'è¾°'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'è‹¥'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'ç•¥'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'å…©'), + (0xF979, 'M', u'凉'), + ] + +def _seg_40(): + return [ + (0xF97A, 'M', u'æ¢'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'è«’'), + (0xF97E, 'M', u'é‡'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'å‘‚'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'æ—…'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'é–­'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'æ­·'), + (0xF98D, 'M', u'è½¢'), + (0xF98E, 'M', u'å¹´'), + (0xF98F, 'M', u'æ†'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'æ’š'), + (0xF992, 'M', u'æ¼£'), + (0xF993, 'M', u'ç…‰'), + (0xF994, 'M', u'ç’‰'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'ç·´'), + (0xF997, 'M', u'è¯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'è“®'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'éŠ'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'å’½'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'æ»'), + (0xF9A5, 'M', u'æ®®'), + (0xF9A6, 'M', u'ç°¾'), + (0xF9A7, 'M', u'çµ'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'ç‘©'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'è†'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'éˆ'), + (0xF9B4, 'M', u'é ˜'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'å°¿'), + (0xF9BE, 'M', u'æ–™'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'é¼'), + (0xF9C4, 'M', u'é¾'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'æ»'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'æµ'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'ç‰'), + (0xF9CD, 'M', u'ç•™'), + (0xF9CE, 'M', u'ç¡«'), + (0xF9CF, 'M', u'ç´'), + (0xF9D0, 'M', u'é¡ž'), + (0xF9D1, 'M', u'å…­'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'å´™'), + (0xF9D6, 'M', u'æ·ª'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'æ…„'), + (0xF9DA, 'M', u'æ —'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + ] + +def _seg_41(): + return [ + (0xF9DE, 'M', u'å'), + (0xF9DF, 'M', u'å±¥'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'æŽ'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'æ³¥'), + (0xF9E4, 'M', u'ç†'), + (0xF9E5, 'M', u'ç—¢'), + (0xF9E6, 'M', u'ç½¹'), + (0xF9E7, 'M', u'è£'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'å'), + (0xF9EE, 'M', u'ç‡'), + (0xF9EF, 'M', u'ç’˜'), + (0xF9F0, 'M', u'è—º'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'é±—'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'æž—'), + (0xF9F5, 'M', u'æ·‹'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'ç«‹'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'ç²’'), + (0xF9FA, 'M', u'ç‹€'), + (0xF9FB, 'M', u'ç‚™'), + (0xF9FC, 'M', u'è­˜'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'æ‹“'), + (0xFA03, 'M', u'ç³–'), + (0xFA04, 'M', u'å®…'), + (0xFA05, 'M', u'æ´ž'), + (0xFA06, 'M', u'æš´'), + (0xFA07, 'M', u'è¼»'), + (0xFA08, 'M', u'è¡Œ'), + (0xFA09, 'M', u'é™'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'å…€'), + (0xFA0D, 'M', u'å—€'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'å¡š'), + (0xFA11, 'V'), + (0xFA12, 'M', u'æ™´'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'ç¦'), + (0xFA1C, 'M', u'é–'), + (0xFA1D, 'M', u'ç²¾'), + (0xFA1E, 'M', u'ç¾½'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'éš·'), + (0xFA30, 'M', u'ä¾®'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'å…'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'å‘'), + (0xFA36, 'M', u'å–'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'å¡€'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'å±®'), + (0xFA3D, 'M', u'æ‚”'), + (0xFA3E, 'M', u'æ…¨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'æ•'), + (0xFA42, 'M', u'æ—¢'), + (0xFA43, 'M', u'æš‘'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'æµ·'), + (0xFA46, 'M', u'渚'), + ] + +def _seg_42(): + return [ + (0xFA47, 'M', u'æ¼¢'), + (0xFA48, 'M', u'ç…®'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'ç¢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'ç¥'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'ç¥'), + (0xFA52, 'M', u'ç¦'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'ç©€'), + (0xFA55, 'M', u'çª'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'ç·´'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'ç¹'), + (0xFA5A, 'M', u'ç½²'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'è‘—'), + (0xFA60, 'M', u'è¤'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'è¬'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'è´ˆ'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'é »'), + (0xFA6B, 'M', u'æµ'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'å…¨'), + (0xFA73, 'M', u'ä¾€'), + (0xFA74, 'M', u'å……'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'å–'), + (0xFA79, 'M', u'å••'), + (0xFA7A, 'M', u'å–™'), + (0xFA7B, 'M', u'å—¢'), + (0xFA7C, 'M', u'å¡š'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'å©¢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'å»’'), + (0xFA83, 'M', u'å»™'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'å¾­'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'æ…Ž'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'æ… '), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'æ„'), + (0xFA8E, 'M', u'æœ'), + (0xFA8F, 'M', u'æ‘’'), + (0xFA90, 'M', u'æ•–'), + (0xFA91, 'M', u'æ™´'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'æ–'), + (0xFA95, 'M', u'æ­¹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'æµ'), + (0xFA98, 'M', u'æ»›'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'æ¼¢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'ç…®'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'ç”»'), + (0xFAA4, 'M', u'ç˜'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'ç››'), + (0xFAA8, 'M', u'ç›´'), + (0xFAA9, 'M', u'çŠ'), + (0xFAAA, 'M', u'ç€'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + ] + +def _seg_43(): + return [ + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'ç±»'), + (0xFAAF, 'M', u'çµ›'), + (0xFAB0, 'M', u'ç·´'), + (0xFAB1, 'M', u'ç¼¾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'è’'), + (0xFAB4, 'M', u'è¯'), + (0xFAB5, 'M', u'è¹'), + (0xFAB6, 'M', u'è¥'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'è«‹'), + (0xFABC, 'M', u'è¬'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'è«­'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'è´ˆ'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'é²'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'é–'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'é ‹'), + (0xFACC, 'M', u'é »'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'ð£•'), + (0xFAD2, 'M', u'ã®'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'ð¥³'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'Õ´Õ¶'), + (0xFB14, 'M', u'Õ´Õ¥'), + (0xFB15, 'M', u'Õ´Õ«'), + (0xFB16, 'M', u'Õ¾Õ¶'), + (0xFB17, 'M', u'Õ´Õ­'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'×™Ö´'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'×¢'), + (0xFB21, 'M', u'×'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'×”'), + (0xFB24, 'M', u'×›'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'×'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'ש×'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּ×'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'×Ö·'), + (0xFB2F, 'M', u'×Ö¸'), + (0xFB30, 'M', u'×Ö¼'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'×’Ö¼'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'×”Ö¼'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'×–Ö¼'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'×™Ö¼'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'×›Ö¼'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'× Ö¼'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'×£Ö¼'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + ] + +def _seg_44(): + return [ + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'×›Ö¿'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'×ל'), + (0xFB50, 'M', u'Ù±'), + (0xFB52, 'M', u'Ù»'), + (0xFB56, 'M', u'Ù¾'), + (0xFB5A, 'M', u'Ú€'), + (0xFB5E, 'M', u'Ùº'), + (0xFB62, 'M', u'Ù¿'), + (0xFB66, 'M', u'Ù¹'), + (0xFB6A, 'M', u'Ú¤'), + (0xFB6E, 'M', u'Ú¦'), + (0xFB72, 'M', u'Ú„'), + (0xFB76, 'M', u'Úƒ'), + (0xFB7A, 'M', u'Ú†'), + (0xFB7E, 'M', u'Ú‡'), + (0xFB82, 'M', u'Ú'), + (0xFB84, 'M', u'ÚŒ'), + (0xFB86, 'M', u'ÚŽ'), + (0xFB88, 'M', u'Úˆ'), + (0xFB8A, 'M', u'Ú˜'), + (0xFB8C, 'M', u'Ú‘'), + (0xFB8E, 'M', u'Ú©'), + (0xFB92, 'M', u'Ú¯'), + (0xFB96, 'M', u'Ú³'), + (0xFB9A, 'M', u'Ú±'), + (0xFB9E, 'M', u'Úº'), + (0xFBA0, 'M', u'Ú»'), + (0xFBA4, 'M', u'Û€'), + (0xFBA6, 'M', u'Û'), + (0xFBAA, 'M', u'Ú¾'), + (0xFBAE, 'M', u'Û’'), + (0xFBB0, 'M', u'Û“'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'Ú­'), + (0xFBD7, 'M', u'Û‡'), + (0xFBD9, 'M', u'Û†'), + (0xFBDB, 'M', u'Ûˆ'), + (0xFBDD, 'M', u'Û‡Ù´'), + (0xFBDE, 'M', u'Û‹'), + (0xFBE0, 'M', u'Û…'), + (0xFBE2, 'M', u'Û‰'), + (0xFBE4, 'M', u'Û'), + (0xFBE8, 'M', u'Ù‰'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئÛ'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ÛŒ'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + ] + +def _seg_45(): + return [ + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'Ùج'), + (0xFC2E, 'M', u'ÙØ­'), + (0xFC2F, 'M', u'ÙØ®'), + (0xFC30, 'M', u'ÙÙ…'), + (0xFC31, 'M', u'ÙÙ‰'), + (0xFC32, 'M', u'ÙÙŠ'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ÙÙ‘'), + (0xFC60, '3', u' ÙŽÙ‘'), + (0xFC61, '3', u' ÙÙ‘'), + (0xFC62, '3', u' ÙÙ‘'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'ÙÙ‰'), + (0xFC7D, 'M', u'ÙÙŠ'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + ] + +def _seg_46(): + return [ + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'Ùج'), + (0xFCBF, 'M', u'ÙØ­'), + (0xFCC0, 'M', u'ÙØ®'), + (0xFCC1, 'M', u'ÙÙ…'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + ] + +def _seg_47(): + return [ + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'Ù€ÙŽÙ‘'), + (0xFCF3, 'M', u'Ù€ÙÙ‘'), + (0xFCF4, 'M', u'Ù€ÙÙ‘'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + ] + +def _seg_48(): + return [ + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'Ùخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'Ùمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + ] + +def _seg_49(): + return [ + (0xFE11, 'M', u'ã€'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'ã€'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'ã€'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'ã€'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' Ì…'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'ã€'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' Ù‹'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ÙŒ'), + (0xFE73, 'V'), + (0xFE74, '3', u' Ù'), + (0xFE75, 'X'), + (0xFE76, '3', u' ÙŽ'), + (0xFE77, 'M', u'Ù€ÙŽ'), + (0xFE78, '3', u' Ù'), + (0xFE79, 'M', u'Ù€Ù'), + (0xFE7A, '3', u' Ù'), + (0xFE7B, 'M', u'Ù€Ù'), + (0xFE7C, '3', u' Ù‘'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' Ù’'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'Ø¡'), + (0xFE81, 'M', u'Ø¢'), + (0xFE83, 'M', u'Ø£'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'Ø¥'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'Ø©'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'Ø«'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'Ø­'), + (0xFEA5, 'M', u'Ø®'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'Ø°'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'Ø´'), + (0xFEB9, 'M', u'ص'), + ] + +def _seg_50(): + return [ + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'Ø·'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'Ù'), + (0xFED5, 'M', u'Ù‚'), + (0xFED9, 'M', u'Ùƒ'), + (0xFEDD, 'M', u'Ù„'), + (0xFEE1, 'M', u'Ù…'), + (0xFEE5, 'M', u'Ù†'), + (0xFEE9, 'M', u'Ù‡'), + (0xFEED, 'M', u'Ùˆ'), + (0xFEEF, 'M', u'Ù‰'), + (0xFEF1, 'M', u'ÙŠ'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + ] + +def _seg_51(): + return [ + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'ã€'), + (0xFF64, 'M', u'ã€'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ã‚¡'), + (0xFF68, 'M', u'ã‚£'), + (0xFF69, 'M', u'ã‚¥'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ã‚©'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ã‚¢'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'ã‚«'), + (0xFF77, 'M', u'ã‚­'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'ã‚·'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'ã‚»'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'ã‚¿'), + (0xFF81, 'M', u'ãƒ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ãƒ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ãƒ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'ã‚™'), + (0xFF9F, 'M', u'ã‚š'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'á„€'), + (0xFFA2, 'M', u'á„'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'á„‚'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'á„„'), + (0xFFA9, 'M', u'á„…'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'á„š'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + ] + +def _seg_52(): + return [ + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'á„¡'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'á„Š'), + (0xFFB7, 'M', u'á„‹'), + (0xFFB8, 'M', u'á„Œ'), + (0xFFB9, 'M', u'á„'), + (0xFFBA, 'M', u'á„Ž'), + (0xFFBB, 'M', u'á„'), + (0xFFBC, 'M', u'á„'), + (0xFFBD, 'M', u'á„‘'), + (0xFFBE, 'M', u'á„’'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'á…¡'), + (0xFFC3, 'M', u'á…¢'), + (0xFFC4, 'M', u'á…£'), + (0xFFC5, 'M', u'á…¤'), + (0xFFC6, 'M', u'á…¥'), + (0xFFC7, 'M', u'á…¦'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'á…§'), + (0xFFCB, 'M', u'á…¨'), + (0xFFCC, 'M', u'á…©'), + (0xFFCD, 'M', u'á…ª'), + (0xFFCE, 'M', u'á…«'), + (0xFFCF, 'M', u'á…¬'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'á…­'), + (0xFFD3, 'M', u'á…®'), + (0xFFD4, 'M', u'á…¯'), + (0xFFD5, 'M', u'á…°'), + (0xFFD6, 'M', u'á…±'), + (0xFFD7, 'M', u'á…²'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'á…³'), + (0xFFDB, 'M', u'á…´'), + (0xFFDC, 'M', u'á…µ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' Ì„'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'Â¥'), + (0xFFE6, 'M', u'â‚©'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'â†'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'â– '), + (0xFFEE, 'M', u'â—‹'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'ð¨'), + (0x10401, 'M', u'ð©'), + ] + +def _seg_53(): + return [ + (0x10402, 'M', u'ðª'), + (0x10403, 'M', u'ð«'), + (0x10404, 'M', u'ð¬'), + (0x10405, 'M', u'ð­'), + (0x10406, 'M', u'ð®'), + (0x10407, 'M', u'ð¯'), + (0x10408, 'M', u'ð°'), + (0x10409, 'M', u'ð±'), + (0x1040A, 'M', u'ð²'), + (0x1040B, 'M', u'ð³'), + (0x1040C, 'M', u'ð´'), + (0x1040D, 'M', u'ðµ'), + (0x1040E, 'M', u'ð¶'), + (0x1040F, 'M', u'ð·'), + (0x10410, 'M', u'ð¸'), + (0x10411, 'M', u'ð¹'), + (0x10412, 'M', u'ðº'), + (0x10413, 'M', u'ð»'), + (0x10414, 'M', u'ð¼'), + (0x10415, 'M', u'ð½'), + (0x10416, 'M', u'ð¾'), + (0x10417, 'M', u'ð¿'), + (0x10418, 'M', u'ð‘€'), + (0x10419, 'M', u'ð‘'), + (0x1041A, 'M', u'ð‘‚'), + (0x1041B, 'M', u'ð‘ƒ'), + (0x1041C, 'M', u'ð‘„'), + (0x1041D, 'M', u'ð‘…'), + (0x1041E, 'M', u'ð‘†'), + (0x1041F, 'M', u'ð‘‡'), + (0x10420, 'M', u'ð‘ˆ'), + (0x10421, 'M', u'ð‘‰'), + (0x10422, 'M', u'ð‘Š'), + (0x10423, 'M', u'ð‘‹'), + (0x10424, 'M', u'ð‘Œ'), + (0x10425, 'M', u'ð‘'), + (0x10426, 'M', u'ð‘Ž'), + (0x10427, 'M', u'ð‘'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'ð“˜'), + (0x104B1, 'M', u'ð“™'), + (0x104B2, 'M', u'ð“š'), + (0x104B3, 'M', u'ð“›'), + (0x104B4, 'M', u'ð“œ'), + (0x104B5, 'M', u'ð“'), + (0x104B6, 'M', u'ð“ž'), + (0x104B7, 'M', u'ð“Ÿ'), + (0x104B8, 'M', u'ð“ '), + (0x104B9, 'M', u'ð“¡'), + (0x104BA, 'M', u'ð“¢'), + (0x104BB, 'M', u'ð“£'), + (0x104BC, 'M', u'ð“¤'), + (0x104BD, 'M', u'ð“¥'), + (0x104BE, 'M', u'ð“¦'), + (0x104BF, 'M', u'ð“§'), + (0x104C0, 'M', u'ð“¨'), + (0x104C1, 'M', u'ð“©'), + (0x104C2, 'M', u'ð“ª'), + (0x104C3, 'M', u'ð“«'), + (0x104C4, 'M', u'ð“¬'), + (0x104C5, 'M', u'ð“­'), + (0x104C6, 'M', u'ð“®'), + (0x104C7, 'M', u'ð“¯'), + (0x104C8, 'M', u'ð“°'), + (0x104C9, 'M', u'ð“±'), + (0x104CA, 'M', u'ð“²'), + (0x104CB, 'M', u'ð“³'), + (0x104CC, 'M', u'ð“´'), + (0x104CD, 'M', u'ð“µ'), + (0x104CE, 'M', u'ð“¶'), + (0x104CF, 'M', u'ð“·'), + (0x104D0, 'M', u'ð“¸'), + (0x104D1, 'M', u'ð“¹'), + (0x104D2, 'M', u'ð“º'), + (0x104D3, 'M', u'ð“»'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + ] + +def _seg_54(): + return [ + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'ð³€'), + (0x10C81, 'M', u'ð³'), + (0x10C82, 'M', u'ð³‚'), + (0x10C83, 'M', u'ð³ƒ'), + (0x10C84, 'M', u'ð³„'), + (0x10C85, 'M', u'ð³…'), + (0x10C86, 'M', u'ð³†'), + (0x10C87, 'M', u'ð³‡'), + (0x10C88, 'M', u'ð³ˆ'), + (0x10C89, 'M', u'ð³‰'), + (0x10C8A, 'M', u'ð³Š'), + (0x10C8B, 'M', u'ð³‹'), + (0x10C8C, 'M', u'ð³Œ'), + (0x10C8D, 'M', u'ð³'), + (0x10C8E, 'M', u'ð³Ž'), + (0x10C8F, 'M', u'ð³'), + (0x10C90, 'M', u'ð³'), + (0x10C91, 'M', u'ð³‘'), + (0x10C92, 'M', u'ð³’'), + (0x10C93, 'M', u'ð³“'), + (0x10C94, 'M', u'ð³”'), + (0x10C95, 'M', u'ð³•'), + (0x10C96, 'M', u'ð³–'), + (0x10C97, 'M', u'ð³—'), + (0x10C98, 'M', u'ð³˜'), + (0x10C99, 'M', u'ð³™'), + (0x10C9A, 'M', u'ð³š'), + (0x10C9B, 'M', u'ð³›'), + (0x10C9C, 'M', u'ð³œ'), + (0x10C9D, 'M', u'ð³'), + (0x10C9E, 'M', u'ð³ž'), + (0x10C9F, 'M', u'ð³Ÿ'), + (0x10CA0, 'M', u'ð³ '), + (0x10CA1, 'M', u'ð³¡'), + (0x10CA2, 'M', u'ð³¢'), + (0x10CA3, 'M', u'ð³£'), + (0x10CA4, 'M', u'ð³¤'), + (0x10CA5, 'M', u'ð³¥'), + (0x10CA6, 'M', u'ð³¦'), + (0x10CA7, 'M', u'ð³§'), + (0x10CA8, 'M', u'ð³¨'), + ] + +def _seg_55(): + return [ + (0x10CA9, 'M', u'ð³©'), + (0x10CAA, 'M', u'ð³ª'), + (0x10CAB, 'M', u'ð³«'), + (0x10CAC, 'M', u'ð³¬'), + (0x10CAD, 'M', u'ð³­'), + (0x10CAE, 'M', u'ð³®'), + (0x10CAF, 'M', u'ð³¯'), + (0x10CB0, 'M', u'ð³°'), + (0x10CB1, 'M', u'ð³±'), + (0x10CB2, 'M', u'ð³²'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'ð‘£€'), + (0x118A1, 'M', u'ð‘£'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'ð‘£…'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'ð‘£'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'ð‘£'), + (0x118B0, 'M', u'ð‘£'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'ð‘£’'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'ð‘£”'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'ð‘£–'), + (0x118B7, 'M', u'ð‘£—'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'ð‘£™'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'ð‘£›'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'ð‘£'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187F2, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'ð…—ð…¥'), + (0x1D15F, 'M', u'ð…˜ð…¥'), + (0x1D160, 'M', u'ð…˜ð…¥ð…®'), + (0x1D161, 'M', u'ð…˜ð…¥ð…¯'), + (0x1D162, 'M', u'ð…˜ð…¥ð…°'), + (0x1D163, 'M', u'ð…˜ð…¥ð…±'), + (0x1D164, 'M', u'ð…˜ð…¥ð…²'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'ð†¹ð…¥'), + (0x1D1BC, 'M', u'ð†ºð…¥'), + (0x1D1BD, 'M', u'ð†¹ð…¥ð…®'), + (0x1D1BE, 'M', u'ð†ºð…¥ð…®'), + (0x1D1BF, 'M', u'ð†¹ð…¥ð…¯'), + (0x1D1C0, 'M', u'ð†ºð…¥ð…¯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + ] + +def _seg_58(): + return [ + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + ] + +def _seg_59(): + return [ + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + ] + +def _seg_60(): + return [ + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + ] + +def _seg_61(): + return [ + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + ] + +def _seg_62(): + return [ + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + ] + +def _seg_63(): + return [ + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + ] + +def _seg_64(): + return [ + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'È·'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'Ï€'), + (0x1D6B8, 'M', u'Ï'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'Ï„'), + ] + +def _seg_65(): + return [ + (0x1D6BC, 'M', u'Ï…'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'Ï€'), + (0x1D6D2, 'M', u'Ï'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'Ï„'), + (0x1D6D6, 'M', u'Ï…'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'Ï'), + (0x1D6E1, 'M', u'Ï€'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'Ï€'), + (0x1D6F2, 'M', u'Ï'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'Ï„'), + (0x1D6F6, 'M', u'Ï…'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'Ï€'), + (0x1D70C, 'M', u'Ï'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'Ï„'), + (0x1D710, 'M', u'Ï…'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'Ï'), + (0x1D71B, 'M', u'Ï€'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + ] + +def _seg_66(): + return [ + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'Ï€'), + (0x1D72C, 'M', u'Ï'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'Ï„'), + (0x1D730, 'M', u'Ï…'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'Ï€'), + (0x1D746, 'M', u'Ï'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'Ï„'), + (0x1D74A, 'M', u'Ï…'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'Ï'), + (0x1D755, 'M', u'Ï€'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'Ï€'), + (0x1D766, 'M', u'Ï'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'Ï„'), + (0x1D76A, 'M', u'Ï…'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'Ï€'), + (0x1D780, 'M', u'Ï'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'Ï„'), + (0x1D784, 'M', u'Ï…'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + ] + +def _seg_67(): + return [ + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'Ï'), + (0x1D78F, 'M', u'Ï€'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'Ï€'), + (0x1D7A0, 'M', u'Ï'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'Ï„'), + (0x1D7A4, 'M', u'Ï…'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'Ï€'), + (0x1D7BA, 'M', u'Ï'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'Ï„'), + (0x1D7BE, 'M', u'Ï…'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'Ï'), + (0x1D7C9, 'M', u'Ï€'), + (0x1D7CA, 'M', u'Ï'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + ] + +def _seg_68(): + return [ + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'ðž¥'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'Ùˆ'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'Ø­'), + (0x1EE08, 'M', u'Ø·'), + (0x1EE09, 'M', u'ÙŠ'), + (0x1EE0A, 'M', u'Ùƒ'), + (0x1EE0B, 'M', u'Ù„'), + (0x1EE0C, 'M', u'Ù…'), + (0x1EE0D, 'M', u'Ù†'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'Ù'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'Ù‚'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'Ø´'), + ] + +def _seg_69(): + return [ + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'Ø«'), + (0x1EE17, 'M', u'Ø®'), + (0x1EE18, 'M', u'Ø°'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'Ù®'), + (0x1EE1D, 'M', u'Úº'), + (0x1EE1E, 'M', u'Ú¡'), + (0x1EE1F, 'M', u'Ù¯'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'Ù‡'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'Ø­'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ÙŠ'), + (0x1EE2A, 'M', u'Ùƒ'), + (0x1EE2B, 'M', u'Ù„'), + (0x1EE2C, 'M', u'Ù…'), + (0x1EE2D, 'M', u'Ù†'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'Ù'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'Ù‚'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'Ø´'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'Ø«'), + (0x1EE37, 'M', u'Ø®'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'Ø­'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ÙŠ'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'Ù„'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'Ù†'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'Ù‚'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'Ø´'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'Ø®'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'Úº'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'Ù¯'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'Ù‡'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'Ø­'), + (0x1EE68, 'M', u'Ø·'), + (0x1EE69, 'M', u'ÙŠ'), + (0x1EE6A, 'M', u'Ùƒ'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'Ù…'), + (0x1EE6D, 'M', u'Ù†'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'Ù'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'Ù‚'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'Ø´'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'Ø«'), + (0x1EE77, 'M', u'Ø®'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'Ù®'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'Ú¡'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + ] + +def _seg_70(): + return [ + (0x1EE84, 'M', u'Ù‡'), + (0x1EE85, 'M', u'Ùˆ'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'Ø­'), + (0x1EE88, 'M', u'Ø·'), + (0x1EE89, 'M', u'ÙŠ'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'Ù„'), + (0x1EE8C, 'M', u'Ù…'), + (0x1EE8D, 'M', u'Ù†'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'Ù'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'Ù‚'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'Ø´'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'Ø«'), + (0x1EE97, 'M', u'Ø®'), + (0x1EE98, 'M', u'Ø°'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'Ùˆ'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'Ø­'), + (0x1EEA8, 'M', u'Ø·'), + (0x1EEA9, 'M', u'ÙŠ'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'Ù„'), + (0x1EEAC, 'M', u'Ù…'), + (0x1EEAD, 'M', u'Ù†'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'Ù'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'Ù‚'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'Ø´'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'Ø«'), + (0x1EEB7, 'M', u'Ø®'), + (0x1EEB8, 'M', u'Ø°'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + ] + +def _seg_71(): + return [ + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ã»ã‹'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'å­—'), + (0x1F212, 'M', u'åŒ'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'ç„¡'), + (0x1F21B, 'M', u'æ–™'), + (0x1F21C, 'M', u'å‰'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'å†'), + (0x1F21F, 'M', u'æ–°'), + (0x1F220, 'M', u'åˆ'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'å¹'), + (0x1F226, 'M', u'æ¼”'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'æ•'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'éŠ'), + (0x1F22C, 'M', u'å·¦'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'å³'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'èµ°'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'ç¦'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'åˆ'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'å–¶'), + (0x1F23B, 'M', u'é…'), + ] + +def _seg_72(): + return [ + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔å‹ã€•'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'å¾—'), + (0x1F251, 'M', u'å¯'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FA, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), + (0x1F9C0, 'V'), + (0x1F9C3, 'X'), + (0x1F9D0, 'V'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'ä¹'), + (0x2F803, 'M', u'ð „¢'), + (0x2F804, 'M', u'ä½ '), + (0x2F805, 'M', u'ä¾®'), + (0x2F806, 'M', u'ä¾»'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'åº'), + (0x2F809, 'M', u'å‚™'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'åƒ'), + (0x2F80C, 'M', u'ã’ž'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'å…'), + (0x2F80F, 'M', u'å…”'), + (0x2F810, 'M', u'å…¤'), + (0x2F811, 'M', u'å…·'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'ã’¹'), + (0x2F814, 'M', u'å…§'), + (0x2F815, 'M', u'å†'), + (0x2F816, 'M', u'ð •‹'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'ã“Ÿ'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + ] + +def _seg_73(): + return [ + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'å‰'), + (0x2F82D, 'M', u'å‘'), + (0x2F82E, 'M', u'åš'), + (0x2F82F, 'M', u'å³'), + (0x2F830, 'M', u'å½'), + (0x2F831, 'M', u'å¿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'ç°'), + (0x2F836, 'M', u'åŠ'), + (0x2F837, 'M', u'åŸ'), + (0x2F838, 'M', u'ð ­£'), + (0x2F839, 'M', u'å«'), + (0x2F83A, 'M', u'å±'), + (0x2F83B, 'M', u'å†'), + (0x2F83C, 'M', u'å’ž'), + (0x2F83D, 'M', u'å¸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'å’¢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'å”'), + (0x2F843, 'M', u'å•“'), + (0x2F844, 'M', u'å•£'), + (0x2F845, 'M', u'å–„'), + (0x2F847, 'M', u'å–™'), + (0x2F848, 'M', u'å–«'), + (0x2F849, 'M', u'å–³'), + (0x2F84A, 'M', u'å—‚'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'å™´'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'å '), + (0x2F855, 'M', u'åž‹'), + (0x2F856, 'M', u'å ²'), + (0x2F857, 'M', u'å ±'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'ã›®'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'å°†'), + (0x2F874, 'X'), + (0x2F875, 'M', u'å°¢'), + (0x2F876, 'M', u'ãž'), + (0x2F877, 'M', u'å± '), + (0x2F878, 'M', u'å±®'), + (0x2F879, 'M', u'å³€'), + (0x2F87A, 'M', u'å²'), + (0x2F87B, 'M', u'ð¡·¤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'ð¡·¦'), + (0x2F87E, 'M', u'åµ®'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'åµ¼'), + (0x2F881, 'M', u'å·¡'), + (0x2F882, 'M', u'å·¢'), + (0x2F883, 'M', u'ã ¯'), + (0x2F884, 'M', u'å·½'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'ã¡¢'), + (0x2F889, 'M', u'𢆃'), + ] + +def _seg_74(): + return [ + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'èˆ'), + (0x2F894, 'M', u'å¼¢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'å½¢'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'å¿'), + (0x2F89E, 'M', u'å¿—'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'æ‚'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'æ‚”'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'æ…ˆ'), + (0x2F8A7, 'M', u'æ…Œ'), + (0x2F8A8, 'M', u'æ…Ž'), + (0x2F8A9, 'M', u'æ…Œ'), + (0x2F8AA, 'M', u'æ…º'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'æˆ'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'æ‰'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'æ‹”'), + (0x2F8B7, 'M', u'æ'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'æ¨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'æ¤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'æ¢'), + (0x2F8C0, 'M', u'æ…'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'æ‘©'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'æ’'), + (0x2F8C6, 'M', u'æ‘·'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'æ•'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'æ—£'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'æš‘'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'æšœ'), + (0x2F8D6, 'M', u'è‚­'), + (0x2F8D7, 'M', u'ä™'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'æž'), + (0x2F8DC, 'M', u'æ“'), + (0x2F8DD, 'M', u'ð£ƒ'), + (0x2F8DE, 'M', u'ã­‰'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'æž…'), + (0x2F8E1, 'M', u'æ¡’'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'æ Ÿ'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'ã®'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'æ«›'), + (0x2F8EE, 'M', u'ã°˜'), + (0x2F8EF, 'M', u'次'), + ] + +def _seg_75(): + return [ + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'æ­”'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'æ­²'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'æ®»'), + (0x2F8F7, 'M', u'ð£ª'), + (0x2F8F8, 'M', u'ð¡´‹'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'æ³'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'æ´–'), + (0x2F900, 'M', u'æ´¾'), + (0x2F901, 'M', u'æµ·'), + (0x2F902, 'M', u'æµ'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'æ´´'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'æ¹®'), + (0x2F90A, 'M', u'ã´³'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'æ·¹'), + (0x2F90F, 'M', u'æ½®'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'çŠ'), + (0x2F918, 'M', u'ç½'), + (0x2F919, 'M', u'ç·'), + (0x2F91A, 'M', u'ç‚­'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'ç……'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'ç‰'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'çº'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'ç‘œ'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'ç’…'), + (0x2F932, 'M', u'ç“Š'), + (0x2F933, 'M', u'ã¼›'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'ç•°'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'ç˜'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'ð¥„'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'ç›´'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'çŠ'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'çž‹'), + (0x2F94B, 'M', u'ä†'), + (0x2F94C, 'M', u'ä‚–'), + (0x2F94D, 'M', u'ð¥'), + (0x2F94E, 'M', u'ç¡Ž'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + ] + +def _seg_76(): + return [ + (0x2F956, 'M', u'ç¦'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'ç©€'), + (0x2F95A, 'M', u'ç©Š'), + (0x2F95B, 'M', u'ç©'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'ç³’'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'ç³£'), + (0x2F96A, 'M', u'ç´€'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'çµ£'), + (0x2F96D, 'M', u'äŒ'), + (0x2F96E, 'M', u'ç·‡'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'ç¹…'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'ä™'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'è '), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'è°'), + (0x2F980, 'M', u'ð£Ÿ'), + (0x2F981, 'M', u'ä•'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'ä‹'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'èˆ'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'ä‘«'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'èŠ'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'è‹¥'), + (0x2F999, 'M', u'èŒ'), + (0x2F99A, 'M', u'è£'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'è§'), + (0x2F99F, 'M', u'è‘—'), + (0x2F9A0, 'M', u'è“'), + (0x2F9A1, 'M', u'èŠ'), + (0x2F9A2, 'M', u'èŒ'), + (0x2F9A3, 'M', u'èœ'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'è”–'), + (0x2F9AB, 'M', u'ð§Š'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'ä•'), + (0x2F9AF, 'M', u'ä•¡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'ä•«'), + (0x2F9B3, 'M', u'è™'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'èš©'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + ] + +def _seg_77(): + return [ + (0x2F9BB, 'M', u'è¹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'è«'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'è '), + (0x2F9C2, 'M', u'ä—¹'), + (0x2F9C3, 'M', u'è¡ '), + (0x2F9C4, 'M', u'è¡£'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'ã’»'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'äš¾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'è«­'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'è³'), + (0x2F9D6, 'M', u'è´›'), + (0x2F9D7, 'M', u'èµ·'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'ð  „'), + (0x2F9DA, 'M', u'è·‹'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'è·°'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'è»”'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'é‚”'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'é„‘'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'é„›'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'é‹—'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'é¹'), + (0x2F9EC, 'M', u'é•'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'é–‹'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'é–·'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'ð©……'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'ä©®'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'ð©Š'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'ð©’–'), + (0x2F9FE, 'M', u'é ‹'), + (0x2FA00, 'M', u'é ©'), + (0x2FA01, 'M', u'ð©–¶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'é±€'), + (0x2FA0C, 'M', u'é³½'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'ä³­'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'äµ–'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'é¼…'), + (0x2FA1A, 'M', u'é¼'), + (0x2FA1B, 'M', u'é¼–'), + (0x2FA1C, 'M', u'é¼»'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + ] + +def _seg_78(): + return [ + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() +) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/ipaddress.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/ipaddress.py new file mode 100644 index 0000000..f2d0766 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.22' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + @staticmethod + def _is_subnet_of(a, b): + try: + # Always false if one is v4 and the other is v6. + if a._version != b._version: + raise TypeError("%s and %s are not of the same version" (a, b)) + return (b.network_address <= a.network_address and + b.broadcast_address >= a.broadcast_address) + except AttributeError: + raise TypeError("Unable to test subnet containment " + "between %s and %s" % (a, b)) + + def subnet_of(self, other): + """Return True if this network is a subnet of other.""" + return self._is_subnet_of(self, other) + + def supernet_of(self, other): + """Return True if this network is a supernet of other.""" + return self._is_subnet_of(other, self) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000..a6f44a5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- + +""" +lockfile.py - Platform-independent advisory file locks. + +Requires Python 2.5 unless you apply 2.4.diff +Locking is done on a per-thread basis instead of a per-process basis. + +Usage: + +>>> lock = LockFile('somefile') +>>> try: +... lock.acquire() +... except AlreadyLocked: +... print 'somefile', 'is locked already.' +... except LockFailed: +... print 'somefile', 'can\\'t be locked.' +... else: +... print 'got lock' +got lock +>>> print lock.is_locked() +True +>>> lock.release() + +>>> lock = LockFile('somefile') +>>> print lock.is_locked() +False +>>> with lock: +... print lock.is_locked() +True +>>> print lock.is_locked() +False + +>>> lock = LockFile('somefile') +>>> # It is okay to lock twice from the same thread... +>>> with lock: +... lock.acquire() +... +>>> # Though no counter is kept, so you can't unlock multiple times... +>>> print lock.is_locked() +False + +Exceptions: + + Error - base class for other exceptions + LockError - base class for all locking exceptions + AlreadyLocked - Another thread or process already holds the lock + LockFailed - Lock failed for some other reason + UnlockError - base class for all unlocking exceptions + AlreadyUnlocked - File was not locked. + NotMyLock - File was locked but not by the current thread/process +""" + +from __future__ import absolute_import + +import functools +import os +import socket +import threading +import warnings + +# Work with PEP8 and non-PEP8 versions of threading module. +if not hasattr(threading, "current_thread"): + threading.current_thread = threading.currentThread +if not hasattr(threading.Thread, "get_name"): + threading.Thread.get_name = threading.Thread.getName + +__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', + 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', + 'LockBase', 'locked'] + + +class Error(Exception): + """ + Base class for other exceptions. + + >>> try: + ... raise Error + ... except Exception: + ... pass + """ + pass + + +class LockError(Error): + """ + Base class for error arising from attempts to acquire the lock. + + >>> try: + ... raise LockError + ... except Error: + ... pass + """ + pass + + +class LockTimeout(LockError): + """Raised when lock creation fails within a user-defined period of time. + + >>> try: + ... raise LockTimeout + ... except LockError: + ... pass + """ + pass + + +class AlreadyLocked(LockError): + """Some other thread/process is locking the file. + + >>> try: + ... raise AlreadyLocked + ... except LockError: + ... pass + """ + pass + + +class LockFailed(LockError): + """Lock file creation failed for some other reason. + + >>> try: + ... raise LockFailed + ... except LockError: + ... pass + """ + pass + + +class UnlockError(Error): + """ + Base class for errors arising from attempts to release the lock. + + >>> try: + ... raise UnlockError + ... except Error: + ... pass + """ + pass + + +class NotLocked(UnlockError): + """Raised when an attempt is made to unlock an unlocked file. + + >>> try: + ... raise NotLocked + ... except UnlockError: + ... pass + """ + pass + + +class NotMyLock(UnlockError): + """Raised when an attempt is made to unlock a file someone else locked. + + >>> try: + ... raise NotMyLock + ... except UnlockError: + ... pass + """ + pass + + +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + + +class LockBase(_SharedBase): + """Base class for platform-specific lock classes.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = LockBase('somefile') + >>> lock = LockBase('somefile', threaded=False) + """ + super(LockBase, self).__init__(path) + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) + self.tname = "-%x" % (ident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + + # unique name is mostly about the current process, but must + # also contain the path -- otherwise, two adjacent locked + # files conflict (one file gets locked, creating lock-file and + # unique file, the other one gets locked, creating lock-file + # and overwriting the already existing lock-file, then one + # gets unlocked, deleting both lock-file and unique file, + # finally the last lock errors out upon releasing. + self.unique_name = os.path.join(dirname, + "%s%s.%s%s" % (self.hostname, + self.tname, + self.pid, + hash(self.path))) + self.timeout = timeout + + def is_locked(self): + """ + Tell whether or not the file is locked. + """ + raise NotImplemented("implement in subclass") + + def i_am_locking(self): + """ + Return True if this object is locking the file. + """ + raise NotImplemented("implement in subclass") + + def break_lock(self): + """ + Remove a lock. Useful if a locking thread failed to unlock. + """ + raise NotImplemented("implement in subclass") + + def __repr__(self): + return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, + self.path) + + +def _fl_helper(cls, mod, *args, **kwds): + warnings.warn("Import from %s module instead of lockfile package" % mod, + DeprecationWarning, stacklevel=2) + # This is a bit funky, but it's only for awhile. The way the unit tests + # are constructed this function winds up as an unbound method, so it + # actually takes three args, not two. We want to toss out self. + if not isinstance(args[0], str): + # We are testing, avoid the first arg + args = args[1:] + if len(args) == 1 and not kwds: + kwds["threaded"] = True + return cls(*args, **kwds) + + +def LinkFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import LinkLockFile from the + lockfile.linklockfile module. + """ + from . import linklockfile + return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", + *args, **kwds) + + +def MkdirFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import MkdirLockFile from the + lockfile.mkdirlockfile module. + """ + from . import mkdirlockfile + return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", + *args, **kwds) + + +def SQLiteFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import SQLiteLockFile from the + lockfile.mkdirlockfile module. + """ + from . import sqlitelockfile + return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", + *args, **kwds) + + +def locked(path, timeout=None): + """Decorator which enables locks for decorated function. + + Arguments: + - path: path for lockfile. + - timeout (optional): Timeout for acquiring lock. + + Usage: + @locked('/var/run/myname', timeout=0) + def myname(...): + ... + """ + def decor(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + lock = FileLock(path, timeout=timeout) + lock.acquire() + try: + return func(*args, **kwargs) + finally: + lock.release() + return wrapper + return decor + + +if hasattr(os, "link"): + from . import linklockfile as _llf + LockFile = _llf.LinkLockFile +else: + from . import mkdirlockfile as _mlf + LockFile = _mlf.MkdirLockFile + +FileLock = LockFile diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/linklockfile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000..2ca9be0 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import + +import time +import os + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class LinkLockFile(LockBase): + """Lock access to a file using atomic property of link(2). + + >>> lock = LinkLockFile('somefile') + >>> lock = LinkLockFile('somefile', threaded=False) + """ + + def acquire(self, timeout=None): + try: + open(self.unique_name, "wb").close() + except IOError: + raise LockFailed("failed to create %s" % self.unique_name) + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a hard link to it. + try: + os.link(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + nlinks = os.stat(self.unique_name).st_nlink + if nlinks == 2: + # The original link plus the one I created == 2. We're + # good to go. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + os.unlink(self.unique_name) + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name) and + os.stat(self.unique_name).st_nlink == 2) + + def break_lock(self): + if os.path.exists(self.lock_file): + os.unlink(self.lock_file) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..05a8c96 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import, division + +import time +import os +import sys +import errno + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class MkdirLockFile(LockBase): + """Lock file by creating a directory.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = MkdirLockFile('somefile') + >>> lock = MkdirLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + # Lock file itself is a directory. Place the unique file name into + # it. + self.unique_name = os.path.join(self.lock_file, + "%s.%s%s" % (self.hostname, + self.tname, + self.pid)) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + else: + wait = max(0, timeout / 10) + + while True: + try: + os.mkdir(self.lock_file) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.EEXIST: + # Already locked. + if os.path.exists(self.unique_name): + # Already locked by me. + return + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock. + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(wait) + else: + # Couldn't create the lock for some other reason + raise LockFailed("failed to create %s" % self.lock_file) + else: + open(self.unique_name, "wb").close() + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.rmdir(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name)) + + def break_lock(self): + if os.path.exists(self.lock_file): + for name in os.listdir(self.lock_file): + os.unlink(os.path.join(self.lock_file, name)) + os.rmdir(self.lock_file) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/pidlockfile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000..069e85b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +# pidlockfile.py +# +# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> +# +# This is free software: you may copy, modify, and/or distribute this work +# under the terms of the Python Software Foundation License, version 2 or +# later as published by the Python Software Foundation. +# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. + +""" Lockfile behaviour implemented via Unix PID files. + """ + +from __future__ import absolute_import + +import errno +import os +import time + +from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, + LockTimeout) + + +class PIDLockFile(LockBase): + """ Lockfile implemented as a Unix PID file. + + The lock file is a normal file named by the attribute `path`. + A lock's PID file contains a single line of text, containing + the process ID (PID) of the process that acquired the lock. + + >>> lock = PIDLockFile('somefile') + >>> lock = PIDLockFile('somefile') + """ + + def __init__(self, path, threaded=False, timeout=None): + # pid lockfiles don't support threaded operation, so always force + # False as the threaded arg. + LockBase.__init__(self, path, False, timeout) + self.unique_name = self.path + + def read_pid(self): + """ Get the PID from the lock file. + """ + return read_pid_from_pidfile(self.path) + + def is_locked(self): + """ Test if the lock is currently held. + + The lock is held if the PID file for this lock exists. + + """ + return os.path.exists(self.path) + + def i_am_locking(self): + """ Test if the lock is held by the current process. + + Returns ``True`` if the current process ID matches the + number stored in the PID file. + """ + return self.is_locked() and os.getpid() == self.read_pid() + + def acquire(self, timeout=None): + """ Acquire the lock. + + Creates the PID file for this lock, or raises an error if + the lock could not be acquired. + """ + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + try: + write_pid_to_pidfile(self.path) + except OSError as exc: + if exc.errno == errno.EEXIST: + # The lock creation failed. Maybe sleep a bit. + if time.time() > end_time: + if timeout is not None and timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + raise LockFailed("failed to create %s" % self.path) + else: + return + + def release(self): + """ Release the lock. + + Removes the PID file to release the lock, or raises an + error if the current process does not hold the lock. + + """ + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + remove_existing_pidfile(self.path) + + def break_lock(self): + """ Break an existing lock. + + Removes the PID file if it already exists, otherwise does + nothing. + + """ + remove_existing_pidfile(self.path) + + +def read_pid_from_pidfile(pidfile_path): + """ Read the PID recorded in the named PID file. + + Read and return the numeric PID recorded as text in the named + PID file. If the PID file cannot be read, or if the content is + not a valid PID, return ``None``. + + """ + pid = None + try: + pidfile = open(pidfile_path, 'r') + except IOError: + pass + else: + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. + # + # Programs that read PID files should be somewhat flexible + # in what they accept; i.e., they should ignore extra + # whitespace, leading zeroes, absence of the trailing + # newline, or additional lines in the PID file. + + line = pidfile.readline().strip() + try: + pid = int(line) + except ValueError: + pass + pidfile.close() + + return pid + + +def write_pid_to_pidfile(pidfile_path): + """ Write the PID in the named PID file. + + Get the numeric process ID (“PIDâ€) of the current process + and write it to the named file as a line of text. + + """ + open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) + open_mode = 0o644 + pidfile_fd = os.open(pidfile_path, open_flags, open_mode) + pidfile = os.fdopen(pidfile_fd, 'w') + + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. For + # example, if crond was process number 25, /var/run/crond.pid + # would contain three characters: two, five, and newline. + + pid = os.getpid() + pidfile.write("%s\n" % pid) + pidfile.close() + + +def remove_existing_pidfile(pidfile_path): + """ Remove the named PID file if it exists. + + Removing a PID file that doesn't already exist puts us in the + desired state, so we ignore the condition if the file does not + exist. + + """ + try: + os.remove(pidfile_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + pass + else: + raise diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/sqlitelockfile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000..f997e24 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +from __future__ import absolute_import, division + +import time +import os + +try: + unicode +except NameError: + unicode = str + +from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked + + +class SQLiteLockFile(LockBase): + "Demonstrate SQL-based locking." + + testdb = None + + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = SQLiteLockFile('somefile') + >>> lock = SQLiteLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + self.lock_file = unicode(self.lock_file) + self.unique_name = unicode(self.unique_name) + + if SQLiteLockFile.testdb is None: + import tempfile + _fd, testdb = tempfile.mkstemp() + os.close(_fd) + os.unlink(testdb) + del _fd, tempfile + SQLiteLockFile.testdb = testdb + + import sqlite3 + self.connection = sqlite3.connect(SQLiteLockFile.testdb) + + c = self.connection.cursor() + try: + c.execute("create table locks" + "(" + " lock_file varchar(32)," + " unique_name varchar(32)" + ")") + except sqlite3.OperationalError: + pass + else: + self.connection.commit() + import atexit + atexit.register(os.unlink, SQLiteLockFile.testdb) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + elif timeout <= 0: + wait = 0 + else: + wait = timeout / 10 + + cursor = self.connection.cursor() + + while True: + if not self.is_locked(): + # Not locked. Try to lock it. + cursor.execute("insert into locks" + " (lock_file, unique_name)" + " values" + " (?, ?)", + (self.lock_file, self.unique_name)) + self.connection.commit() + + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) > 1: + # Nope. Someone else got there. Remove our lock. + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + else: + # Yup. We're done, so go home. + return + else: + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) == 1: + # We're the locker, so go home. + return + + # Maybe we should wait a bit longer. + if timeout is not None and time.time() > end_time: + if timeout > 0: + # No more waiting. + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock and we are impatient.. + raise AlreadyLocked("%s is already locked" % self.path) + + # Well, okay. We'll give it a bit longer. + time.sleep(wait) + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me (by %s)" % + (self.unique_name, self._who_is_locking())) + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + + def _who_is_locking(self): + cursor = self.connection.cursor() + cursor.execute("select unique_name from locks" + " where lock_file = ?", + (self.lock_file,)) + return cursor.fetchone()[0] + + def is_locked(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?", + (self.lock_file,)) + rows = cursor.fetchall() + return not not rows + + def i_am_locking(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?" + " and unique_name = ?", + (self.lock_file, self.unique_name)) + return not not cursor.fetchall() + + def break_lock(self): + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where lock_file = ?", + (self.lock_file,)) + self.connection.commit() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000..23b41f5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import os +import time + +from . import (LockBase, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class SymlinkLockFile(LockBase): + """Lock access to a file using symlink(2).""" + + def __init__(self, path, threaded=True, timeout=None): + # super(SymlinkLockFile).__init(...) + LockBase.__init__(self, path, threaded, timeout) + # split it back! + self.unique_name = os.path.split(self.unique_name)[1] + + def acquire(self, timeout=None): + # Hopefully unnecessary for symlink. + # try: + # open(self.unique_name, "wb").close() + # except IOError: + # raise LockFailed("failed to create %s" % self.unique_name) + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a symbolic link to it. + try: + os.symlink(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + if self.i_am_locking(): + # Linked to out unique name. Proceed. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout / 10 if timeout is not None else 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.islink(self.lock_file) + + def i_am_locking(self): + return (os.path.islink(self.lock_file) + and os.readlink(self.lock_file) == self.unique_name) + + def break_lock(self): + if os.path.islink(self.lock_file): # exists && link + os.unlink(self.lock_file) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..2afca5a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,66 @@ +# coding: utf-8 +from pip._vendor.msgpack._version import version +from pip._vendor.msgpack.exceptions import * + +from collections import namedtuple + + +class ExtType(namedtuple('ExtType', 'code data')): + """ExtType represents ext type in msgpack.""" + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +import os +if os.environ.get('MSGPACK_PUREPYTHON'): + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker +else: + try: + from pip._vendor.msgpack._packer import Packer + from pip._vendor.msgpack._unpacker import unpackb, Unpacker + except ImportError: + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/_version.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/_version.py new file mode 100644 index 0000000..d28f0de --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/exceptions.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..9766881 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,41 @@ +class UnpackException(Exception): + """Deprecated. Use Exception instead to catch all exception during unpacking.""" + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class UnpackValueError(UnpackException, ValueError): + """Deprecated. Use ValueError instead.""" + + +class ExtraData(UnpackValueError): + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +class PackException(Exception): + """Deprecated. Use Exception instead to catch all exception during packing.""" + + +class PackValueError(PackException, ValueError): + """PackValueError is raised when type of input data is supported but it's value is unsupported. + + Deprecated. Use ValueError instead. + """ + + +class PackOverflowError(PackValueError, OverflowError): + """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). + + Deprecated. Use ValueError instead. + """ diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/fallback.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..9418421 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,977 @@ +"""Fallback pure Python implementation of msgpack""" + +import sys +import struct +import warnings + +if sys.version_info[0] == 3: + PY3 = True + int_types = int + Unicode = str + xrange = range + def dict_iteritems(d): + return d.items() +else: + PY3 = False + int_types = (int, long) + Unicode = unicode + def dict_iteritems(d): + return d.iteritems() + + +if hasattr(sys, 'pypy_version_info'): + # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + class StringIO(object): + def __init__(self, s=b''): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + def getvalue(self): + return self.builder.build() +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + newlist_hint = lambda size: [] + + +from pip._vendor.msgpack.exceptions import ( + BufferFull, + OutOfData, + UnpackValueError, + PackValueError, + PackOverflowError, + ExtraData) + +from pip._vendor.msgpack import ExtType + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + try: + view = memoryview(obj) + except TypeError: + # try to use legacy buffer protocol if 2.7, otherwise re-raise + if not PY3: + view = memoryview(buffer(obj)) + warnings.warn("using old buffer interface to unpack %s; " + "this leads to unpacking errors if slicing is used and " + "will be removed in a future version" % type(obj), + RuntimeWarning) + else: + raise + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpack(stream, **kwargs): + warnings.warn( + "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", + PendingDeprecationWarning) + data = stream.read() + return unpackb(data, **kwargs) + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises `ExtraData` when `packed` contains extra bytes. + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise UnpackValueError("Data is not enough.") + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +class Unpacker(object): + """Streaming unpacker. + + arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes (default). + Otherwise, unpack to Python str (or unicode on Python 2) by decoding + with UTF-8 encoding (recommended). + Currently, the default is true, but it will be changed to false in + near future. So you must specify it explicitly for keeping backward + compatibility. + + *encoding* option which is deprecated overrides this option. + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str encoding: + Encoding used for decoding msgpack raw. + If it is None (default), msgpack raw is deserialized to Python bytes. + + :param str unicode_errors: + (deprecated) Used for decoding msgpack raw with *encoding*. + (default: `'strict'`) + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means system's INT_MAX (default). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Limits max length of str. (default: 2**31-1) + + :param int max_bin_len: + Limits max length of bin. (default: 2**31-1) + + :param int max_array_len: + Limits max length of array. (default: 2**31-1) + + :param int max_map_len: + Limits max length of map. (default: 2**31-1) + + + example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like, raw=False) + for o in unpacker: + process(o) + + example of streaming deserialize from socket:: + + unpacker = Unpacker(raw=False) + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + """ + + def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, + object_hook=None, object_pairs_hook=None, list_hook=None, + encoding=None, unicode_errors=None, max_buffer_size=0, + ext_hook=ExtType, + max_str_len=2147483647, # 2**32-1 + max_bin_len=2147483647, + max_array_len=2147483647, + max_map_len=2147483647, + max_ext_len=2147483647): + + if encoding is not None: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + # Some very old pythons don't support `struct.unpack_from()` with a + # `bytearray`. So we wrap it in a `buffer()` there. + if sys.version_info < (2, 7, 6): + self._buffer_view = buffer(self._buffer) + else: + self._buffer_view = self._buffer + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + self._max_buffer_size = max_buffer_size or 2**31-1 + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16*1024) + self._raw = bool(raw) + self._encoding = encoding + self._unicode_errors = unicode_errors + self._use_list = use_list + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError('`list_hook` is not callable') + if object_hook is not None and not callable(object_hook): + raise TypeError('`object_hook` is not callable') + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError('`object_pairs_hook` is not callable') + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually " + "exclusive") + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + self._buffer += view + + def _consume(self): + """ Gets rid of the used parts of the buffer. """ + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i:] + + def read_bytes(self, n): + return self._read(n) + + def _read(self, n): + # (int) -> bytearray + self._reserve(n) + i = self._buff_i + self._buff_i = i+n + return self._buffer[i:i+n] + + def _reserve(self, n): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self, execute=EX_CONSTRUCT): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xff) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + elif b == 0xc0: + obj = None + elif b == 0xc2: + obj = False + elif b == 0xc3: + obj = True + elif b == 0xc4: + typ = TYPE_BIN + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc5: + typ = TYPE_BIN + self._reserve(2) + n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc6: + typ = TYPE_BIN + self._reserve(4) + n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc7: # ext 8 + typ = TYPE_EXT + self._reserve(2) + L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) + self._buff_i += 2 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc8: # ext 16 + typ = TYPE_EXT + self._reserve(3) + L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) + self._buff_i += 3 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc9: # ext 32 + typ = TYPE_EXT + self._reserve(5) + L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) + self._buff_i += 5 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xca: + self._reserve(4) + obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcb: + self._reserve(8) + obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xcc: + self._reserve(1) + obj = self._buffer[self._buff_i] + self._buff_i += 1 + elif b == 0xcd: + self._reserve(2) + obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xce: + self._reserve(4) + obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcf: + self._reserve(8) + obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd0: + self._reserve(1) + obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] + self._buff_i += 1 + elif b == 0xd1: + self._reserve(2) + obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xd2: + self._reserve(4) + obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xd3: + self._reserve(8) + obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd4: # fixext 1 + typ = TYPE_EXT + if self._max_ext_len < 1: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) + self._reserve(2) + n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) + self._buff_i += 2 + elif b == 0xd5: # fixext 2 + typ = TYPE_EXT + if self._max_ext_len < 2: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) + self._reserve(3) + n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) + self._buff_i += 3 + elif b == 0xd6: # fixext 4 + typ = TYPE_EXT + if self._max_ext_len < 4: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) + self._reserve(5) + n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) + self._buff_i += 5 + elif b == 0xd7: # fixext 8 + typ = TYPE_EXT + if self._max_ext_len < 8: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) + self._reserve(9) + n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) + self._buff_i += 9 + elif b == 0xd8: # fixext 16 + typ = TYPE_EXT + if self._max_ext_len < 16: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) + self._reserve(17) + n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) + self._buff_i += 17 + elif b == 0xd9: + typ = TYPE_RAW + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xda: + typ = TYPE_RAW + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdb: + typ = TYPE_RAW + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdc: + typ = TYPE_ARRAY + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xdd: + typ = TYPE_ARRAY + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xde: + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + elif b == 0xdf: + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + else: + raise UnpackValueError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header(execute) + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise UnpackValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise UnpackValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in xrange(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), + self._unpack(EX_CONSTRUCT)) + for _ in xrange(n)) + else: + ret = {} + for _ in xrange(n): + key = self._unpack(EX_CONSTRUCT) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._encoding is not None: + obj = obj.decode(self._encoding, self._unicode_errors) + elif self._raw: + obj = bytes(obj) + else: + obj = obj.decode('utf_8') + return obj + if typ == TYPE_EXT: + return self._ext_hook(n, bytes(obj)) + if typ == TYPE_BIN: + return bytes(obj) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + + next = __next__ + + def skip(self, write_bytes=None): + self._unpack(EX_SKIP) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + + def unpack(self, write_bytes=None): + ret = self._unpack(EX_CONSTRUCT) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_array_header(self, write_bytes=None): + ret = self._unpack(EX_READ_ARRAY_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_map_header(self, write_bytes=None): + ret = self._unpack(EX_READ_MAP_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer(object): + """ + MessagePack Packer + + usage: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializeable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param str encoding: + (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') + + :param str unicode_errors: + Error handler for encoding unicode. (default: 'strict') + """ + def __init__(self, default=None, encoding=None, unicode_errors=None, + use_single_float=False, autoreset=True, use_bin_type=False, + strict_types=False): + if encoding is None: + encoding = 'utf_8' + else: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._encoding = encoding + self._unicode_errors = unicode_errors + self._buffer = StringIO() + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, check_type_strict=_check_type_strict): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise PackValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int_types): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xff: + return self._buffer.write(struct.pack("BB", 0xcc, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) + if 0xff < obj <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xcd, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) + if 0xffff < obj <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xce, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) + if 0xffffffff < obj <= 0xffffffffffffffff: + return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise PackOverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise PackValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, Unicode): + if self._encoding is None: + raise TypeError( + "Can't encode unicode string: " + "no encoding is specified") + obj = obj.encode(self._encoding, self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise PackValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = len(obj) * obj.itemsize + if n >= 2**32: + raise PackValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xca, obj)) + return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) + if check(obj, ExtType): + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(struct.pack(">BB", 0xc7, L)) + elif L <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xc8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xc9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in xrange(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs(len(obj), dict_iteritems(obj), + nest_limit - 1) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + raise TypeError("Cannot serialize %r" % (obj, )) + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_array_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_map_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xffffffff: + raise PackValueError("Too large data") + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(b'\xc7' + struct.pack('B', L)) + elif L <= 0xffff: + self._buffer.write(b'\xc8' + struct.pack('>H', L)) + else: + self._buffer.write(b'\xc9' + struct.pack('>I', L)) + self._buffer.write(struct.pack('B', typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x90 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xdc, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdd, n)) + raise PackValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x80 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xde, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdf, n)) + raise PackValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for (k, v) in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1f: + self._buffer.write(struct.pack('B', 0xa0 + n)) + elif self._use_bin_type and n <= 0xff: + self._buffer.write(struct.pack('>BB', 0xd9, n)) + elif n <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xda, n)) + elif n <= 0xffffffff: + self._buffer.write(struct.pack(">BI", 0xdb, n)) + else: + raise PackValueError('Raw is too large') + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xff: + return self._buffer.write(struct.pack('>BB', 0xc4, n)) + elif n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xc5, n)) + elif n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xc6, n)) + else: + raise PackValueError('Bin is too large') + + def bytes(self): + return self._buffer.getvalue() + + def reset(self): + self._buffer = StringIO() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__about__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..7481c9e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__about__.py @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "19.0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..a0cf67d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/__init__.py @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, + __copyright__, + __email__, + __license__, + __summary__, + __title__, + __uri__, + __version__, +) + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000..25da473 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_compat.py @@ -0,0 +1,31 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = (str,) +else: + string_types = (basestring,) + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_structures.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..68dcca6 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + + +Infinity = Infinity() + + +class NegativeInfinity(object): + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + + +NegativeInfinity = NegativeInfinity() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/markers.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..5482476 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/markers.py @@ -0,0 +1,296 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pip._vendor.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + def serialize(self): + return str(self) + + +class Value(Node): + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") + | L("platform_python_implementation") + | L("implementation_name") + | L("python_full_version") + | L("platform_release") + | L("platform_version") + | L("platform_machine") + | L("platform_system") + | L("python_version") + | L("sys_platform") + | L("os_name") + | L("os.name") + | L("sys.platform") # PEP-345 + | L("platform.version") # PEP-345 + | L("platform.machine") # PEP-345 + | L("platform.python_implementation") # PEP-345 + | L("python_implementation") # PEP-345 + | L("extra") # undocumented setuptools legacy +) +ALIASES = { + "os.name": "os_name", + "sys.platform": "sys_platform", + "platform.version": "platform_version", + "platform.machine": "platform_machine", + "platform.python_implementation": "platform_python_implementation", + "python_implementation": "platform_python_implementation", +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, "implementation"): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = "0" + implementation_name = "" + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc : e.loc + 8] + ) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/requirements.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..dbc5f11 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/requirements.py @@ -0,0 +1,138 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pip._vendor.pyparsing import Literal as L # noqa +from pip._vendor.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r"[^ ]+")("url") +URL = AT + URI + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine( + VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False +)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start : t._original_end]) +) +MARKER_SEPARATOR = SEMICOLON +MARKER = MARKER_SEPARATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd +# pyparsing isn't thread safe during initialization, so we do it eagerly, see +# issue #104 +REQUIREMENT.parseString("x[]") + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + 'Parse error at "{0!r}": {1}'.format( + requirement_string[e.loc : e.loc + 8], e.msg + ) + ) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if parsed_url.scheme == "file": + if urlparse.urlunparse(parsed_url) != req.url: + raise InvalidRequirement("Invalid URL given") + elif not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc + ): + raise InvalidRequirement("Invalid URL: {0}".format(req.url)) + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + if self.marker: + parts.append(" ") + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/specifiers.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..743576a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,749 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = (match.group("operator").strip(), match.group("version").strip()) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[: len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + + +class SpecifierSet(BaseSpecifier): + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/utils.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..8841878 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/utils.py @@ -0,0 +1,57 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + +from .version import InvalidVersion, Version + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() + + +def canonicalize_version(version): + """ + This is very similar to Version.__str__, but has one subtle differences + with the way it handles the release segment. + """ + + try: + version = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + + parts = [] + + # Epoch + if version.epoch != 0: + parts.append("{0}!".format(version.epoch)) + + # Release segment + # NB: This strips trailing '.0's to normalize + parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) + + # Pre-release + if version.pre is not None: + parts.append("".join(str(x) for x in version.pre)) + + # Post-release + if version.post is not None: + parts.append(".post{0}".format(version.post)) + + # Development release + if version.dev is not None: + parts.append(".dev{0}".format(version.dev)) + + # Local version segment + if version.local is not None: + parts.append("+{0}".format(version.local)) + + return "".join(parts) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/version.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..95157a1 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/packaging/version.py @@ -0,0 +1,420 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] + + +_Version = collections.namedtuple( + "_Version", ["epoch", "release", "dev", "pre", "post", "local"] +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def epoch(self): + return -1 + + @property + def release(self): + return None + + @property + def pre(self): + return None + + @property + def post(self): + return None + + @property + def dev(self): + return None + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + @property + def is_devrelease(self): + return False + + +_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) + +_legacy_version_replacement_map = { + "pre": "c", + "preview": "c", + "-": "final-", + "rc": "c", + "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), + post=_parse_letter_version( + match.group("post_l"), match.group("post_n1") or match.group("post_n2") + ), + dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + # Pre-release + if self.pre is not None: + parts.append("".join(str(x) for x in self.pre)) + + # Post-release + if self.post is not None: + parts.append(".post{0}".format(self.post)) + + # Development release + if self.dev is not None: + parts.append(".dev{0}".format(self.dev)) + + # Local version segment + if self.local is not None: + parts.append("+{0}".format(self.local)) + + return "".join(parts) + + @property + def epoch(self): + return self._version.epoch + + @property + def release(self): + return self._version.release + + @property + def pre(self): + return self._version.pre + + @property + def post(self): + return self._version.post[1] if self._version.post else None + + @property + def dev(self): + return self._version.dev[1] if self._version.dev else None + + @property + def local(self): + if self._version.local: + return ".".join(str(x) for x in self._version.local) + else: + return None + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + return "".join(parts) + + @property + def is_prerelease(self): + return self.dev is not None or self.pre is not None + + @property + def is_postrelease(self): + return self.post is not None + + @property + def is_devrelease(self): + return self.dev is not None + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_separators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_separators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) + + return epoch, release, pre, post, dev, local diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..9c1a098 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/__init__.py @@ -0,0 +1,4 @@ +"""Wrappers to build Python packages using PEP 517 hooks +""" + +__version__ = '0.5.0' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/_in_process.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..d6524b6 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/_in_process.py @@ -0,0 +1,207 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +from glob import glob +from importlib import import_module +import os +from os.path import join as pjoin +import re +import shutil +import sys + +# This is run as a script, not a module, so it can't do a relative import +import compat + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + + +def _build_backend(): + """Find and load the build backend""" + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + return _get_wheel_metadata_from_wheel(backend, metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + backend, metadata_directory, config_settings): + """Build a wheel and extract the metadata from it. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + whl_basename = backend.build_wheel(metadata_directory, config_settings) + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_sdist', + 'build_sdist', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = compat.read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable: + json_out['no_backend'] = True + except GotUnsupportedOperation: + json_out['unsupported'] = True + + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/build.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/build.py new file mode 100644 index 0000000..ac6c949 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/build.py @@ -0,0 +1,108 @@ +"""Build a project using PEP 517 hooks. +""" +import argparse +import logging +import os +import contextlib +from pip._vendor import pytoml +import shutil +import errno +import tempfile + +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +def _do_build(hooks, env, dist, dest): + get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) + get_requires = getattr(hooks, get_requires_name) + reqs = get_requires({}) + log.info('Got build requires: %s', reqs) + + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + + with tempdir() as td: + log.info('Trying to build %s in %s', dist, td) + build_name = 'build_{dist}'.format(**locals()) + build = getattr(hooks, build_name) + filename = build(td, {}) + source = os.path.join(td, filename) + shutil.move(source, os.path.join(dest, os.path.basename(filename))) + + +def mkdir_p(*args, **kwargs): + """Like `mkdir`, but does not raise an exception if the + directory already exists. + """ + try: + return os.mkdir(*args, **kwargs) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + + +def build(source_dir, dist, dest=None): + pyproject = os.path.join(source_dir, 'pyproject.toml') + dest = os.path.join(source_dir, dest or 'dist') + mkdir_p(dest) + + with open(pyproject) as f: + pyproject_data = pytoml.load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + _do_build(hooks, env, dist, dest) + + +parser = argparse.ArgumentParser() +parser.add_argument( + 'source_dir', + help="A directory containing pyproject.toml", +) +parser.add_argument( + '--binary', '-b', + action='store_true', + default=False, +) +parser.add_argument( + '--source', '-s', + action='store_true', + default=False, +) +parser.add_argument( + '--out-dir', '-o', + help="Destination in which to save the builds relative to source dir", +) + + +def main(args): + # determine which dists to build + dists = list(filter(None, ( + 'sdist' if args.source or not args.binary else None, + 'wheel' if args.binary or not args.source else None, + ))) + + for dist in dists: + build(args.source_dir, dist, args.out_dir) + + +if __name__ == '__main__': + main(parser.parse_args()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/check.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..f4cdc6b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/check.py @@ -0,0 +1,202 @@ +"""Check a project and backend by attempting to build using PEP 517 hooks. +""" +import argparse +import logging +import os +from os.path import isfile, join as pjoin +from pip._vendor.pytoml import TomlError, load as toml_load +import shutil +from subprocess import CalledProcessError +import sys +import tarfile +from tempfile import mkdtemp +import zipfile + +from .colorlog import enable_colourful_output +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def check_build_sdist(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_sdist({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build sdist in %s', td) + try: + try: + filename = hooks.build_sdist(td, {}) + log.info('build_sdist returned %r', filename) + except Exception: + log.info('Failure in build_sdist', exc_info=True) + return False + + if not filename.endswith('.tar.gz'): + log.error( + "Filename %s doesn't have .tar.gz extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if tarfile.is_tarfile(path): + log.info("Output file is a tar file") + else: + log.error("Output file is not a tar file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check_build_wheel(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_wheel({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build wheel in %s', td) + try: + try: + filename = hooks.build_wheel(td, {}) + log.info('build_wheel returned %r', filename) + except Exception: + log.info('Failure in build_wheel', exc_info=True) + return False + + if not filename.endswith('.whl'): + log.error("Filename %s doesn't have .whl extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if zipfile.is_zipfile(path): + log.info("Output file is a zip file") + else: + log.error("Output file is not a zip file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check(source_dir): + pyproject = pjoin(source_dir, 'pyproject.toml') + if isfile(pyproject): + log.info('Found pyproject.toml') + else: + log.error('Missing pyproject.toml') + return False + + try: + with open(pyproject) as f: + pyproject_data = toml_load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + log.info('Loaded pyproject.toml') + except (TomlError, KeyError): + log.error("Invalid pyproject.toml", exc_info=True) + return False + + hooks = Pep517HookCaller(source_dir, backend) + + sdist_ok = check_build_sdist(hooks, requires) + wheel_ok = check_build_wheel(hooks, requires) + + if not sdist_ok: + log.warning('Sdist checks failed; scroll up to see') + if not wheel_ok: + log.warning('Wheel checks failed') + + return sdist_ok + + +def main(argv=None): + ap = argparse.ArgumentParser() + ap.add_argument( + 'source_dir', + help="A directory containing pyproject.toml") + args = ap.parse_args(argv) + + enable_colourful_output() + + ok = check(args.source_dir) + + if ok: + print(ansi('Checks passed', 'green')) + else: + print(ansi('Checks failed', 'red')) + sys.exit(1) + + +ansi_codes = { + 'reset': '\x1b[0m', + 'bold': '\x1b[1m', + 'red': '\x1b[31m', + 'green': '\x1b[32m', +} + + +def ansi(s, attr): + if os.name != 'nt' and sys.stdout.isatty(): + return ansi_codes[attr] + str(s) + ansi_codes['reset'] + else: + return str(s) + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/colorlog.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..69c8a59 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/colorlog.py @@ -0,0 +1,115 @@ +"""Nicer log formatting with colours. + +Code copied from Tornado, Apache licensed. +""" +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging +import sys + +try: + import curses +except ImportError: + curses = None + + +def _stderr_supports_color(): + color = False + if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + + +class LogFormatter(logging.Formatter): + """Log formatter with colour support + """ + DEFAULT_COLORS = { + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red + logging.CRITICAL: 1, + } + + def __init__(self, color=True, datefmt=None): + r""" + :arg bool color: Enables color support. + :arg string fmt: Log message format. + It will be applied to the attributes dict of log records. The + text between ``%(color)s`` and ``%(end_color)s`` will be colored + depending on the level if color support is on. + :arg dict colors: color mappings from logging level to terminal color + code + :arg string datefmt: Datetime format. + Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. + .. versionchanged:: 3.2 + Added ``fmt`` and ``datefmt`` arguments. + """ + logging.Formatter.__init__(self, datefmt=datefmt) + self._colors = {} + if color and _stderr_supports_color(): + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or + curses.tigetstr("setf") or "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = str(fg_color, "ascii") + + for levelno, code in self.DEFAULT_COLORS.items(): + self._colors[levelno] = str( + curses.tparm(fg_color, code), "ascii") + self._normal = str(curses.tigetstr("sgr0"), "ascii") + + scr = curses.initscr() + self.termwidth = scr.getmaxyx()[1] + curses.endwin() + else: + self._normal = '' + # Default width is usually 80, but too wide is + # worse than too narrow + self.termwidth = 70 + + def formatMessage(self, record): + mlen = len(record.message) + right_text = '{initial}-{name}'.format(initial=record.levelname[0], + name=record.name) + if mlen + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (mlen + len(right_text))) + else: + space = ' ' + + if record.levelno in self._colors: + start_color = self._colors[record.levelno] + end_color = self._normal + else: + start_color = end_color = '' + + return record.message + space + start_color + right_text + end_color + + +def enable_colourful_output(level=logging.INFO): + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + logging.root.addHandler(handler) + logging.root.setLevel(level) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/compat.py @@ -0,0 +1,23 @@ +"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" +import json +import sys + +if sys.version_info[0] >= 3: + # Python 3 + def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + def read_json(path): + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + +else: + # Python 2 + def write_json(obj, path, **kwargs): + with open(path, 'wb') as f: + json.dump(obj, f, encoding='utf-8', **kwargs) + + def read_json(path): + with open(path, 'rb') as f: + return json.load(f) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/envbuild.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..f7ac5f4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/envbuild.py @@ -0,0 +1,158 @@ +"""Build wheels/sdists by installing build deps to a temporary environment. +""" + +import os +import logging +from pip._vendor import pytoml +import shutil +from subprocess import check_call +import sys +from sysconfig import get_paths +from tempfile import mkdtemp + +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def _load_pyproject(source_dir): + with open(os.path.join(source_dir, 'pyproject.toml')) as f: + pyproject_data = pytoml.load(f) + buildsys = pyproject_data['build-system'] + return buildsys['requires'], buildsys['build-backend'] + + +class BuildEnvironment(object): + """Context manager to install build deps in a simple temporary environment + + Based on code I wrote for pip, which is MIT licensed. + """ + # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) + # + # Permission is hereby granted, free of charge, to any person obtaining + # a copy of this software and associated documentation files (the + # "Software"), to deal in the Software without restriction, including + # without limitation the rights to use, copy, modify, merge, publish, + # distribute, sublicense, and/or sell copies of the Software, and to + # permit persons to whom the Software is furnished to do so, subject to + # the following conditions: + # + # The above copyright notice and this permission notice shall be + # included in all copies or substantial portions of the Software. + # + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + path = None + + def __init__(self, cleanup=True): + self._cleanup = cleanup + + def __enter__(self): + self.path = mkdtemp(prefix='pep517-build-env-') + log.info('Temporary build environment: %s', self.path) + + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + + install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' + install_dirs = get_paths(install_scheme, vars={ + 'base': self.path, + 'platbase': self.path, + }) + + scripts = install_dirs['scripts'] + if self.save_path: + os.environ['PATH'] = scripts + os.pathsep + self.save_path + else: + os.environ['PATH'] = scripts + os.pathsep + os.defpath + + if install_dirs['purelib'] == install_dirs['platlib']: + lib_dirs = install_dirs['purelib'] + else: + lib_dirs = install_dirs['purelib'] + os.pathsep + \ + install_dirs['platlib'] + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + return self + + def pip_install(self, reqs): + """Install dependencies into this env by calling pip in a subprocess""" + if not reqs: + return + log.info('Calling pip to install %s', reqs) + check_call([ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', self.path] + list(reqs)) + + def __exit__(self, exc_type, exc_val, exc_tb): + needs_cleanup = ( + self._cleanup and + self.path is not None and + os.path.isdir(self.path) + ) + if needs_cleanup: + shutil.rmtree(self.path) + + if self.save_path is None: + os.environ.pop('PATH', None) + else: + os.environ['PATH'] = self.save_path + + if self.save_pythonpath is None: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = self.save_pythonpath + + +def build_wheel(source_dir, wheel_dir, config_settings=None): + """Build a wheel from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str wheel_dir: Target directory to create wheel in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_wheel(config_settings) + env.pip_install(reqs) + return hooks.build_wheel(wheel_dir, config_settings) + + +def build_sdist(source_dir, sdist_dir, config_settings=None): + """Build an sdist from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str sdist_dir: Target directory to place sdist in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_sdist(config_settings) + env.pip_install(reqs) + return hooks.build_sdist(sdist_dir, config_settings) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/wrappers.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..b14b899 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pep517/wrappers.py @@ -0,0 +1,163 @@ +from contextlib import contextmanager +import os +from os.path import dirname, abspath, join as pjoin +import shutil +from subprocess import check_call +import sys +from tempfile import mkdtemp + +from . import compat + +_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') + + +@contextmanager +def tempdir(): + td = mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess.""" + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +class Pep517HookCaller(object): + """A wrapper around a source directory to be built with a PEP 517 backend. + + source_dir : The path to the source directory, containing pyproject.toml. + backend : The build backend spec, as per PEP 517, from pyproject.toml. + """ + def __init__(self, source_dir, build_backend): + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + self._subprocess_runner = default_subprocess_runner + + # TODO: Is this over-engineered? Maybe frontends only need to + # set this when creating the wrapper, not on every call. + @contextmanager + def subprocess_runner(self, runner): + prev = self._subprocess_runner + self._subprocess_runner = runner + yield + self._subprocess_runner = prev + + def get_requires_for_build_wheel(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["wheel >= 0.25", "setuptools"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None): + """Prepare a *.dist-info folder with metadata for this project. + + Returns the name of the newly created folder. + + If the build backend defines a hook with this name, it will be called + in a subprocess. If not, the backend will be asked to build a wheel, + and the dist-info extracted from that. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + Returns the name of the newly created file. + + In general, this will call the 'build_wheel' hook in the backend. + However, if that was previously called by + 'prepare_metadata_for_build_wheel', and the same metadata_directory is + used, the previously built wheel will be copied to wheel_directory. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["setuptools >= 26"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + Returns the name of the newly created file. + + This calls the 'build_sdist' backend hook in a subprocess. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + # On Python 2, pytoml returns Unicode values (which is correct) but the + # environment passed to check_call needs to contain string values. We + # convert here by encoding using ASCII (the backend can only contain + # letters, digits and _, . and : characters, and will be used as a + # Python identifier, so non-ASCII content is wrong on Python 2 in + # any case). + if sys.version_info[0] == 2: + build_backend = self.build_backend.encode('ASCII') + else: + build_backend = self.build_backend + + with tempdir() as td: + compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), + indent=2) + + # Run the hook in a subprocess + self._subprocess_runner( + [sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, + extra_environ={'PEP517_BUILD_BACKEND': build_backend} + ) + + data = compat.read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation + if data.get('no_backend'): + raise BackendUnavailable + return data['return_val'] diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 0000000..9c4fd8e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3171 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +try: + FileExistsError +except NameError: + FileExistsError = OSError + +from pip._vendor import six +from pip._vendor.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pip._vendor import appdirs +from pip._vendor import packaging +__import__('pip._vendor.packaging.version') +__import__('pip._vendor.packaging.specifiers') +__import__('pip._vendor.packaging.requirements') +__import__('pip._vendor.packaging.markers') + + +__metaclass__ = type + + +if (3, 0) < sys.version_info < (3, 4): + raise RuntimeError("Python 3.4 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Warnings + 'PkgResourcesDeprecationWarning', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + from sysconfig import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet: + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + return ( + entry + for dist in self + for entry in dist.get_entry_map(group).values() + if name is None or name == entry.name + ) + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment: + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.6'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_names = 'SourceFileLoader', 'SourcelessFileLoader', + for name in loader_names: + loader_cls = getattr(importlib_machinery, name, type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir('/'): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + loader = importer.find_module(packageName) + + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + new_path = sorted(orig_path, key=position_in_sys_path) + new_path = [_normalize_cached(p) for p in new_path] + + if isinstance(module.__path__, list): + module.__path__[:] = new_path + else: + module.__path__ = new_path + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path = sys.path + parent, _, _ = packageName.rpartition('.') + + if parent: + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent or None, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else filename + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint: + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + PkgResourcesDeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution: + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + try: + mkdir(dirname, 0o755) + except FileExistsError: + pass + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/py31compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 0000000..a2d3007 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from pip._vendor import six + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + six.PY2 or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000..a41f65d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/__init__.py @@ -0,0 +1,127 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +from time import time + + +__version__ = '1.4' + + +class Infinite(object): + file = stderr + sma_window = 10 # Simple Moving Average window + + def __init__(self, *args, **kwargs): + self.index = 0 + self.start_ts = time() + self.avg = 0 + self._ts = self.start_ts + self._xput = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def elapsed(self): + return int(time() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update_avg(self, n, dt): + if n > 0: + self._xput.append(dt / n) + self.avg = sum(self._xput) / len(self._xput) + + def update(self): + pass + + def start(self): + pass + + def finish(self): + pass + + def next(self, n=1): + now = time() + dt = now - self._ts + self.update_avg(n, dt) + self._ts = now + self.index = self.index + n + self.update() + + def iter(self, it): + try: + for x in it: + yield x + self.next() + finally: + self.finish() + + +class Progress(Infinite): + def __init__(self, *args, **kwargs): + super(Progress, self).__init__(*args, **kwargs) + self.max = kwargs.get('max', 100) + + @property + def eta(self): + return int(ceil(self.avg * self.remaining)) + + @property + def eta_td(self): + return timedelta(seconds=self.eta) + + @property + def percent(self): + return self.progress * 100 + + @property + def progress(self): + return min(1, self.index / self.max) + + @property + def remaining(self): + return max(self.max - self.index, 0) + + def start(self): + self.update() + + def goto(self, index): + incr = index - self.index + self.next(incr) + + def iter(self, it): + try: + self.max = len(it) + except TypeError: + pass + + try: + for x in it: + yield x + self.next() + finally: + self.finish() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/bar.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/bar.py new file mode 100644 index 0000000..025e61c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/bar.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals + +import sys + +from . import Progress +from .helpers import WritelnMixin + + +class Bar(WritelnMixin, Progress): + width = 32 + message = '' + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + hide_cursor = True + + def update(self): + filled_length = int(self.width * self.progress) + empty_length = self.width - filled_length + + message = self.message % self + bar = self.fill * filled_length + empty = self.empty_fill * empty_length + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, + suffix]) + self.writeln(line) + + +class ChargingBar(Bar): + suffix = '%(percent)d%%' + bar_prefix = ' ' + bar_suffix = ' ' + empty_fill = '∙' + fill = 'â–ˆ' + + +class FillingSquaresBar(ChargingBar): + empty_fill = 'â–¢' + fill = 'â–£' + + +class FillingCirclesBar(ChargingBar): + empty_fill = 'â—¯' + fill = 'â—‰' + + +class IncrementalBar(Bar): + if sys.platform.startswith('win'): + phases = (u' ', u'â–Œ', u'â–ˆ') + else: + phases = (' ', 'â–', 'â–Ž', 'â–', 'â–Œ', 'â–‹', 'â–Š', 'â–‰', 'â–ˆ') + + def update(self): + nphases = len(self.phases) + filled_len = self.width * self.progress + nfull = int(filled_len) # Number of full chars + phase = int((filled_len - nfull) * nphases) # Phase of last char + nempty = self.width - nfull # Number of empty chars + + message = self.message % self + bar = self.phases[-1] * nfull + current = self.phases[phase] if phase > 0 else '' + empty = self.empty_fill * max(0, nempty - len(current)) + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, current, empty, + self.bar_suffix, suffix]) + self.writeln(line) + + +class PixelBar(IncrementalBar): + phases = ('â¡€', 'â¡„', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') + + +class ShadyBar(IncrementalBar): + phases = (' ', 'â–‘', 'â–’', 'â–“', 'â–ˆ') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/counter.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/counter.py new file mode 100644 index 0000000..6b45a1e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/counter.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite, Progress +from .helpers import WriteMixin + + +class Counter(WriteMixin, Infinite): + message = '' + hide_cursor = True + + def update(self): + self.write(str(self.index)) + + +class Countdown(WriteMixin, Progress): + hide_cursor = True + + def update(self): + self.write(str(self.remaining)) + + +class Stack(WriteMixin, Progress): + phases = (' ', 'â–', 'â–‚', 'â–ƒ', 'â–„', 'â–…', 'â–†', 'â–‡', 'â–ˆ') + hide_cursor = True + + def update(self): + nphases = len(self.phases) + i = min(nphases - 1, int(self.progress * nphases)) + self.write(self.phases[i]) + + +class Pie(Stack): + phases = ('â—‹', 'â—”', 'â—‘', 'â—•', 'â—') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/helpers.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/helpers.py new file mode 100644 index 0000000..0cde44e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/helpers.py @@ -0,0 +1,91 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import print_function + + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class WriteMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WriteMixin, self).__init__(**kwargs) + self._width = 0 + if message: + self.message = message + + if self.file and self.file.isatty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def write(self, s): + if self.file and self.file.isatty(): + b = '\b' * self._width + c = s.ljust(self._width) + print(b + c, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def finish(self): + if self.file and self.file.isatty() and self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +class WritelnMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WritelnMixin, self).__init__(**kwargs) + if message: + self.message = message + + if self.file and self.file.isatty() and self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + + def clearln(self): + if self.file and self.file.isatty(): + print('\r\x1b[K', end='', file=self.file) + + def writeln(self, line): + if self.file and self.file.isatty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file and self.file.isatty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +from signal import signal, SIGINT +from sys import exit + + +class SigIntMixin(object): + """Registers a signal handler that calls finish on SIGINT""" + + def __init__(self, *args, **kwargs): + super(SigIntMixin, self).__init__(*args, **kwargs) + signal(SIGINT, self._sigint_handler) + + def _sigint_handler(self, signum, frame): + self.finish() + exit(0) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/spinner.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000..464c7b2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/progress/spinner.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite +from .helpers import WriteMixin + + +class Spinner(WriteMixin, Infinite): + message = '' + phases = ('-', '\\', '|', '/') + hide_cursor = True + + def update(self): + i = self.index % len(self.phases) + self.write(self.phases[i]) + + +class PieSpinner(Spinner): + phases = ['â—·', 'â—¶', 'â—µ', 'â—´'] + + +class MoonSpinner(Spinner): + phases = ['â—‘', 'â—’', 'â—', 'â—“'] + + +class LineSpinner(Spinner): + phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] + +class PixelSpinner(Spinner): + phases = ['⣾','⣷', '⣯', '⣟', 'â¡¿', '⢿', '⣻', '⣽'] diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pyparsing.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pyparsing.py new file mode 100644 index 0000000..bea4d9c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pyparsing.py @@ -0,0 +1,6452 @@ +#-*- coding: utf-8 -*- +# module pyparsing.py +# +# Copyright (c) 2003-2019 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and +executing simple grammars, vs. the traditional lex/yacc approach, or the +use of regular expressions. With pyparsing, you don't need to learn +a new syntax for defining grammars or matching expressions - the parsing +module provides a library of classes that you use to construct the +grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +``"<salutation>, <addressee>!"``), built up using :class:`Word`, +:class:`Literal`, and :class:`And` elements +(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, +and the strings are auto-converted to :class:`Literal` expressions):: + + from pip._vendor.pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the +self-explanatory class names, and the use of '+', '|' and '^' operators. + +The :class:`ParseResults` object returned from +:class:`ParserElement.parseString` can be +accessed as a nested list, a dictionary, or an object with named +attributes. + +The pyparsing module handles some of the problems that are typically +vexing when writing text parsers: + + - extra or missing whitespace (the above program will also handle + "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes :class:`ParserElement` and :class:`ParseResults` to +see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + + - construct literal match expressions from :class:`Literal` and + :class:`CaselessLiteral` classes + - construct character word-group expressions using the :class:`Word` + class + - see how to create repetitive expressions using :class:`ZeroOrMore` + and :class:`OneOrMore` classes + - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, + and :class:`'&'<Each>` operators to combine simple expressions into + more complex ones + - associate names with your parsed results using + :class:`ParserElement.setResultsName` + - find some helpful expression short-cuts like :class:`delimitedList` + and :class:`oneOf` + - find more useful common expressions in the :class:`pyparsing_common` + namespace class +""" + +__version__ = "2.3.1" +__versionTime__ = "09 Jan 2019 23:26 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + # Python 3 + from itertools import filterfalse +except ImportError: + from itertools import ifilterfalse as filterfalse + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +try: + from types import SimpleNamespace +except ImportError: + class SimpleNamespace: pass + + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + unicode = str + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode + friendly. It first tries str(obj). If that fails with + a UnicodeEncodeError, then it tries unicode(obj). It then + < returns the unicode object | encodes it with the default + encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + + Expected integer (at char 0), (line:1, col:1) + column: 1 + + """ + + @staticmethod + def explain(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `setName` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + explain() is only supported under Python 3. + """ + import inspect + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(' ' * (exc.col - 1) + '^') + ret.append("{0}: {1}".format(type(exc).__name__, exc)) + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff.frame + + f_self = frm.f_locals.get('self', None) + if isinstance(f_self, ParserElement): + if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): + continue + if f_self in seen: + continue + seen.add(f_self) + + self_type = type(f_self) + ret.append("{0}.{1} - {2}".format(self_type.__module__, + self_type.__name__, + f_self)) + elif f_self is not None: + self_type = type(f_self) + ret.append("{0}.{1}".format(self_type.__module__, + self_type.__name__)) + else: + code = frm.f_code + if code.co_name in ('wrapper', '<module>'): + continue + + ret.append("{0}".format(code.co_name)) + + depth -= 1 + if not depth: + break + + return '\n'.join(ret) + + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by :class:`ParserElement.validate` if the + grammar could be improperly recursive + """ + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`) + + Example:: + + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + + prints:: + + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys.""" + + values = _itervalues + """Returns an iterator of all named result values.""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples.""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``dict.pop()``. + + Example:: + + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + + prints:: + + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given ``defaultValue`` or ``None`` if no + ``defaultValue`` is specified. + + Similar to ``dict.get()``. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to ``list.insert()``. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a :class:`ParseResults` object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = dict(self.__tokdict.items()) + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + + prints:: + + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``indent`` argument so + that this string can be embedded in a nested display of other data. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + + prints:: + + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the + `pprint <https://docs.python.org/3/library/pprint.html>`_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . + + Example:: + + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + + prints:: + + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See + :class:`ParserElement.parseString` for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parseString` + for more information on parsing strings containing ``<TAB>`` s, and + suggested methods to maintain a consistent view of the parsed string, the + parse location, and line and column positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this :class:`ParserElement`. Useful for defining + different parse actions for the same parsing pattern, using copies of + the original parse element. + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + + prints:: + + [5120, 100, 655360, 268435456] + + Equivalent form of ``expr.copy()`` is just ``expr()``:: + + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original :class:`ParserElement` object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + ``expr("name")`` in place of ``expr.setResultsName("name")`` + - see :class:`__call__`. + + Example:: + + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set ``breakFlag`` to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` , + ``fn(loc,toks)`` , ``fn(toks)`` , or just ``fn()`` , where: + + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object + + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`parseString for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + + Example:: + + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. + + See examples in :class:`copy`. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, + functions passed to ``addCondition`` need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + fn = _trim_arity(fn) + def pa(s,l,t): + if not bool(fn(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + ``fn(s,loc,expr,err)`` where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw :class:`ParseFatalException` + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + + - cache_size_limit - (default= ``128``) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method :class:`ParserElement.enablePackrat`. + For best results, call ``enablePackrat()`` immediately after + importing pyparsing. + + Example:: + + from pip._vendor import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set ``parseAll`` to True (equivalent to ending + the grammar with ``StringEnd()``). + + Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the ``loc`` argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + + - calling ``parseWithTabs`` on your grammar before calling ``parseString`` + (see :class:`parseWithTabs`) + - define your parse action using the full ``(s,loc,toks)`` signature, and + reference the input string using the parse action's ``s`` argument + - explictly expand the tabs in your input string before calling + ``parseString`` + + Example:: + + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + ``maxMatches`` argument, to clip scanning after 'n' matches are found. If + ``overlap`` is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See :class:`parseString` for more information on parsing + strings with embedded tabs. + + Example:: + + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to :class:`scanString`, to modify matching text with modified tokens that may + be returned from a parse action. To use ``transformString``, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking ``transformString()`` on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. ``transformString()`` returns the resulting transformed string. + + Example:: + + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + + prints:: + + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to :class:`scanString`, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + ``maxMatches`` argument, to clip searching after 'n' matches are found. + + Example:: + + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + + prints:: + + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional ``maxsplit`` argument, to limit the number of splits; + and the optional ``includeSeparators`` argument (default= ``False``), if the separating + matching text should be included in the split results. + + Example:: + + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + + prints:: + + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement + converts them to :class:`Literal`s by default. + + Example:: + + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + + prints:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns :class:`And` with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of ``expr * 3`` in place of + ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer + tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples + may also include ``None`` as in: + - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` + (read as "0 to n instances of ``expr``") + - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` + - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` + + Note that ``expr*(None,n)`` does not raise an exception if + more than n exprs exist in the input stream; that is, + ``expr*(None,n)`` does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + ``expr*(None,n) + ~expr`` + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns :class:`MatchFirst` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns :class:`Or` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns :class:`Each` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns :class:`NotAny` + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. + + If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be + passed as ``True``. + + If ``name` is omitted, same as calling :class:`copy`. + + Example:: + + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + :class:`ParserElement`'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. + Must be called before ``parseString`` when the input grammar contains elements that + match ``<TAB>`` characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set ``flag`` to True to enable, False to disable. + + Example:: + + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using :class:`setDebugActions`. Prior to attempting + to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` + is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` + message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + + Example:: + + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', + fullDump=True, printResults=True, failureTests=False, postParse=None): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + - comment - (default= ``'#'``) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default= ``True``) prints test output to stdout + - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing + - postParse - (default= ``None``) optional callback for successful parse results; called as + `fn(test_string, parse_results)` and returns a string to be added to the test output + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if ``failureTests`` is True), and the results contain a list of lines of each + test's output + + Example:: + + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + + prints:: + + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + # convert newline marks to actual newlines, and strip leading BOM if present + t = t.replace(r'\n','\n').lstrip('\ufeff') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + if postParse is not None: + try: + pp_value = postParse(t, result) + if pp_value is not None: + out.append(str(pp_value)) + except Exception as e: + out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """Abstract :class:`ParserElement` subclass, for defining atomic + matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """Token to exactly match a specified string. + + Example:: + + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use :class:`CaselessLiteral`. + + For keyword matching (force word break before and after the matched string), + use :class:`Keyword` or :class:`CaselessKeyword`. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """Token to exactly match a specified string as a keyword, that is, + it must be immediately followed by a non-keyword character. Compare + with :class:`Literal`: + + - ``Literal("if")`` will match the leading ``'if'`` in + ``'ifAndOnlyIf'``. + - ``Keyword("if")`` will not; it will only match the leading + ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` + + Accepts two optional constructor arguments in addition to the + keyword string: + + - ``identChars`` is a string of characters that would be valid + identifier characters, defaulting to all alphanumerics + "_" and + "$" + - ``caseless`` allows case-insensitive matching, default is ``False``. + + Example:: + + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use :class:`CaselessKeyword`. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for :class:`CaselessKeyword`.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of :class:`Keyword`. + + Example:: + + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for :class:`CaselessLiteral`.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + +class CloseMatch(Token): + """A variation on :class:`Literal` which matches "close" matches, + that is, strings with at most 'n' mismatching characters. + :class:`CloseMatch` takes parameters: + + - ``match_string`` - string to be matched + - ``maxMismatches`` - (``default=1``) maximum number of + mismatches allowed to count as a match + + The results from a successful parse will contain the matched text + from the input string and the following named results: + + - ``mismatches`` - a list of the positions within the + match_string where mismatches were found + - ``original`` - the original match_string used to compare + against the input string + + If ``mismatches`` is an empty list, then the match was an exact + match. + + Example:: + + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, an + optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. An optional ``excludeChars`` parameter can + list characters that might be found in the input ``bodyChars`` + string; useful to define a word of all printables except for one or + two characters, for instance. + + :class:`srange` is useful for defining custom character set strings + for defining ``Word`` expressions, using range notation from + regular expression character sets. + + A common mistake is to use :class:`Word` to match a specific literal + string, as in ``Word("Address")``. Remember that :class:`Word` + uses the string argument to define *sets* of matchable characters. + This expression would match "Add", "AAA", "dAred", or any other word + made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an + exact literal string, use :class:`Literal` or :class:`Keyword`. + + pyparsing includes helper strings for building Words: + + - :class:`alphas` + - :class:`nums` + - :class:`alphanums` + - :class:`hexnums` + - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 + - accented, tilded, umlauted, etc.) + - :class:`punc8bit` (non-alphabetic characters in ASCII range + 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - :class:`printables` (any non-whitespace character) + + Example:: + + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Char(Word): + """A short-cut class for defining ``Word(characters, exact=1)``, + when defining a match of any single character in a string of + characters. + """ + def __init__(self, charset): + super(Char, self).__init__(charset, exact=1) + self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) + self.re = re.compile( self.reString ) + + +class Regex(Token): + r"""Token for matching strings that match a given regular + expression. Defined with string specifying the regular expression in + a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. + If the given regex contains named groups (defined using ``(?P<name>...)``), + these will be preserved as named parse results. + + Example:: + + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False): + """The parameters ``pattern`` and ``flags`` are passed + to the ``re.compile()`` function as-is. See the Python + `re module <https://docs.python.org/3/library/re.html>`_ module for an + explanation of the acceptable patterns and flags. + """ + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + self.asGroupList = asGroupList + self.asMatch = asMatch + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + if self.asMatch: + ret = result + elif self.asGroupList: + ret = result.groups() + else: + ret = ParseResults(result.group()) + d = result.groupdict() + if d: + for k, v in d.items(): + ret[k] = v + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + def sub(self, repl): + """ + Return Regex with an attached parse action to transform the parsed + result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. + + Example:: + + make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") + print(make_html.transformString("h1:main title:")) + # prints "<h1>main title</h1>" + """ + if self.asGroupList: + warnings.warn("cannot use sub() with Regex(asGroupList=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch and callable(repl): + warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch: + def pa(tokens): + return tokens[0].expand(repl) + else: + def pa(tokens): + return self.re.sub(repl, tokens[0]) + return self.addParseAction(pa) + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + + - quoteChar - string of one or more characters defining the + quote delimiting string + - escChar - character to escape quotes, typically backslash + (default= ``None`` ) + - escQuote - special quote sequence to escape an embedded quote + string (such as SQL's ``""`` to escape an embedded ``"``) + (default= ``None`` ) + - multiline - boolean indicating whether quotes can span + multiple lines (default= ``False`` ) + - unquoteResults - boolean indicating whether the matched text + should be unquoted (default= ``True`` ) + - endQuoteChar - string of one or more characters defining the + end of the quote delimited string (default= ``None`` => same as + quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace + (``'\t'``, ``'\n'``, etc.) to actual whitespace + (default= ``True`` ) + + Example:: + + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + + prints:: + + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """Token for matching words composed of characters *not* in a given + set (will include whitespace in matched characters if not listed in + the provided exclusion set - see example). Defined with string + containing all disallowed characters, and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. + + Example:: + + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + + prints:: + + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError( + "cannot specify a minimum length < 1; use " + + "Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """Special matching class for matching whitespace. Normally, + whitespace is ignored by pyparsing grammars. This class is included + when some whitespace structures are significant. Define with + a string containing the whitespace characters to be matched; default + is ``" \\t\\r\\n"``. Also takes optional ``min``, + ``max``, and ``exact`` arguments, as defined for the + :class:`Word` class. + """ + whiteStrs = { + ' ' : '<SP>', + '\t': '<TAB>', + '\n': '<LF>', + '\r': '<CR>', + '\f': '<FF>', + 'u\00A0': '<NBSP>', + 'u\1680': '<OGHAM_SPACE_MARK>', + 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', + 'u\2000': '<EN_QUAD>', + 'u\2001': '<EM_QUAD>', + 'u\2002': '<EN_SPACE>', + 'u\2003': '<EM_SPACE>', + 'u\2004': '<THREE-PER-EM_SPACE>', + 'u\2005': '<FOUR-PER-EM_SPACE>', + 'u\2006': '<SIX-PER-EM_SPACE>', + 'u\2007': '<FIGURE_SPACE>', + 'u\2008': '<PUNCTUATION_SPACE>', + 'u\2009': '<THIN_SPACE>', + 'u\200A': '<HAIR_SPACE>', + 'u\200B': '<ZERO_WIDTH_SPACE>', + 'u\202F': '<NNBSP>', + 'u\205F': '<MMSP>', + 'u\3000': '<IDEOGRAPHIC_SPACE>', + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """Token to advance to a specific column of input text; useful for + tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """Matches if current position is at the beginning of a line within + the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + prints:: + + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """Matches if current position is at the end of a line within the + parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """Matches if current position is at the beginning of the parse + string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """Matches if the current position is at the beginning of a Word, + and is not preceded by any character in a given set of + ``wordChars`` (default= ``printables``). To emulate the + ``\b`` behavior of regular expressions, use + ``WordStart(alphanums)``. ``WordStart`` will also match at + the beginning of the string being parsed, or at the beginning of + a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """Matches if the current position is at the end of a Word, and is + not followed by any character in a given set of ``wordChars`` + (default= ``printables``). To emulate the ``\b`` behavior of + regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` + will also match at the end of the string being parsed, or at the end + of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """Abstract subclass of ParserElement, for combining and + post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given :class:`ParseExpression` s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the ``'+'`` operator. + May also be constructed using the ``'-'`` operator, which will + suppress backtracking. + + Example:: + + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def streamline(self): + super(And, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the expression that matches the longest + string will be used. May be constructed using the ``'^'`` + operator. + + Example:: + + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + + prints:: + + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(Or, self).streamline() + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the first one listed is the one that will + match. May be constructed using the ``'|'`` operator. + + Example:: + + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + # self.saveAsList = any(e.saveAsList for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(MatchFirst, self).streamline() + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """Requires all given :class:`ParseExpression` s to be found, but in + any order. Expressions may be separated by whitespace. + + May be constructed using the ``'&'`` operator. + + Example:: + + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + + prints:: + + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + self.saveAsList = True + + def streamline(self): + super(Each, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """Abstract subclass of :class:`ParserElement`, for combining and + post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """Lookahead matching of the given parse expression. + ``FollowedBy`` does *not* advance the parsing position within + the input string, it only verifies that the specified parse + expression matches at the current position. ``FollowedBy`` + always returns a null token list. If any results names are defined + in the lookahead expression, those *will* be returned for access by + name. + + Example:: + + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + + prints:: + + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + _, ret = self.expr._parse(instring, loc, doActions=doActions) + del ret[:] + return loc, ret + + +class PrecededBy(ParseElementEnhance): + """Lookbehind matching of the given parse expression. + ``PrecededBy`` does not advance the parsing position within the + input string, it only verifies that the specified parse expression + matches prior to the current position. ``PrecededBy`` always + returns a null token list, but if a results name is defined on the + given expression, it is returned. + + Parameters: + + - expr - expression that must match prior to the current parse + location + - retreat - (default= ``None``) - (int) maximum number of characters + to lookbehind prior to the current parse location + + If the lookbehind expression is a string, Literal, Keyword, or + a Word or CharsNotIn with a specified exact or maximum length, then + the retreat parameter is not required. Otherwise, retreat must be + specified to give a maximum number of characters to look back from + the current parse position for a lookbehind match. + + Example:: + + # VB-style variable names with type prefixes + int_var = PrecededBy("#") + pyparsing_common.identifier + str_var = PrecededBy("$") + pyparsing_common.identifier + + """ + def __init__(self, expr, retreat=None): + super(PrecededBy, self).__init__(expr) + self.expr = self.expr().leaveWhitespace() + self.mayReturnEmpty = True + self.mayIndexError = False + self.exact = False + if isinstance(expr, str): + retreat = len(expr) + self.exact = True + elif isinstance(expr, (Literal, Keyword)): + retreat = expr.matchLen + self.exact = True + elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: + retreat = expr.maxLen + self.exact = True + elif isinstance(expr, _PositionToken): + retreat = 0 + self.exact = True + self.retreat = retreat + self.errmsg = "not preceded by " + str(expr) + self.skipWhitespace = False + + def parseImpl(self, instring, loc=0, doActions=True): + if self.exact: + if loc < self.retreat: + raise ParseException(instring, loc, self.errmsg) + start = loc - self.retreat + _, ret = self.expr._parse(instring, start) + else: + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[:loc] + last_expr = ParseException(instring, loc, self.errmsg) + for offset in range(1, min(loc, self.retreat+1)): + try: + _, ret = test_expr._parse(instring_slice, loc-offset) + except ParseBaseException as pbe: + last_expr = pbe + else: + break + else: + raise last_expr + # return empty list of tokens, but preserve any defined results names + del ret[:] + return loc, ret + + +class NotAny(ParseElementEnhance): + """Lookahead to disallow matching with the given parse expression. + ``NotAny`` does *not* advance the parsing position within the + input string, it only verifies that the specified parse expression + does *not* match at the current position. Also, ``NotAny`` does + *not* skip over leading whitespace. ``NotAny`` always returns + a null token list. May be constructed using the '~' operator. + + Example:: + + AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) + + # take care not to mistake keywords for identifiers + ident = ~(AND | OR | NOT) + Word(alphas) + boolean_term = Optional(NOT) + ident + + # very crude boolean expression - to support parenthesis groups and + # operation hierarchy, use infixNotation + boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) + + # integers that are followed by "." are actually floats + integer = Word(nums) + ~Char(".") + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to :class:`OneOrMore` + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + + prints:: + + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """Token for skipping over all undefined text until the matched + expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default= ``False``) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default= ``None``) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default= ``None``) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + + prints:: + + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.saveAsList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the ``Forward`` + variable using the '<<' operator. + + Note: take care when assigning to ``Forward`` not to overlook + precedence of operators. + + Specifically, '|' has a lower precedence than '<<', so that:: + + fwdExpr << a | b | c + + will actually be evaluated as:: + + (fwdExpr << a) | b | c + + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the ``Forward``:: + + fwdExpr << (a | b | c) + + Converting to use the '<<=' operator instead will avoid this problem. + + See :class:`ParseResults.pprint` for an example of a recursive + parser created using ``Forward``. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of :class:`ParseExpression`, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the + input string; this can be disabled by specifying + ``'adjacent=False'`` in the constructor. + + Example:: + + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """Converter to return the matched tokens as a list - useful for + returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. + + Example:: + + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = expr.saveAsList + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """Converter to return a repetitive expression as a list, but also + as a dictionary. Each element can also be referenced using the first + token in the expression as its key. Useful for tabular report + scraping when the first column can be used as a item key. + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + + prints:: + + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + + See more examples at :class:`ParseResults` of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """Converter for ignoring the results of a parsed expression. + + Example:: + + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + + prints:: + + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + + (See also :class:`delimitedList`.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """Decorator for debugging parse actions. + + When the parse action is called, this decorator will print + ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. + When the parse action completes, the decorator will print + ``"<<"`` followed by the returned value, or any exception that the parse action raised. + + Example:: + + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + + prints:: + + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """Helper to define a delimited list of expressions - the delimiter + defaults to ','. By default, the list elements and delimiters can + have intervening whitespace, and comments, but this can be + overridden by passing ``combine=True`` in the constructor. If + ``combine`` is set to ``True``, the matching tokens are + returned as a single token string, with the delimiters included; + otherwise, the matching tokens are returned as a list of tokens, + with the delimiters suppressed. + + Example:: + + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """Helper to define a counted list of expressions. + + This helper defines a pattern of the form:: + + integer expr expr expr... + + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``intExpr`` is specified, it should be a pyparsing expression + that produces an integer value. + + Example:: + + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`matchPreviousExpr`. Do *not* use with packrat parsing + enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """Helper to quickly define a set of alternative Literals, and makes + sure to do longest-first testing when there is a conflict, + regardless of the input order, but returns + a :class:`MatchFirst` for best performance. + + Parameters: + + - strs - a string of space-delimited literals, or a collection of + string literals + - caseless - (default= ``False``) - treat all literals as + caseless + - useRegex - (default= ``True``) - as an optimization, will + generate a Regex object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True``, or if + creating a :class:`Regex` raises an exception) + + Example:: + + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + + prints:: + + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """Helper to easily and clearly define a dictionary by specifying + the respective patterns for the key and value. Takes care of + defining the :class:`Dict`, :class:`ZeroOrMore`, and + :class:`Group` tokens in the proper order. The key pattern + can include delimiting markers or punctuation, as long as they are + suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the :class:`Dict` results + can include named token fields. + + Example:: + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + + prints:: + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict(OneOrMore(Group(key + value))) + +def originalTextFor(expr, asString=True): + """Helper to return the original, untokenized text for a given + expression. Useful to restore the parsed fields of an HTML start + tag into the raw tag text itself, or to revert separate tokens with + intervening whitespace back to the original matching input text. By + default, returns astring containing the original parsed text. + + If the optional ``asString`` argument is passed as + ``False``, then the return value is + a :class:`ParseResults` containing any results names that + were originally matched, and a single token containing the original + matched text from the input string. So if the expression passed to + :class:`originalTextFor` contains expressions with defined + results names, you must set ``asString`` to ``False`` if you + want to preserve those results name values. + + Example:: + + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + + prints:: + + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """Helper to undo pyparsing's default grouping of And expressions, + even if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """Helper to decorate a returned token with its starting and ending + locations in the input string. + + This helper adds the following results names: + + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains ``<TAB>`` characters, you + may want to call :class:`ParserElement.parseWithTabs` + + Example:: + + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + + prints:: + + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r"""Helper to easily define string ranges for use in Word + construction. Borrows syntax from regexp '[]' string range + definitions:: + + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + + The input string must be enclosed in []'s, and the returned string + is the expanded character set joined into a single string. The + values enclosed in the []'s may be: + + - a single character + - an escaped character with a leading backslash (such as ``\-`` + or ``\]``) + - an escaped hex character with a leading ``'\x'`` + (``\x21``, which is a ``'!'`` character) (``\0x##`` + is also supported for backwards compatibility) + - an escaped octal character with a leading ``'\0'`` + (``\041``, which is a ``'!'`` character) + - a range of any of the above, separated by a dash (``'a-z'``, + etc.) + - any combination of the above (``'aeiouy'``, + ``'a-zA-Z0-9_$'``, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """Helper method for defining parse actions that require matching at + a specific column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """Helper method for common parse actions that simply return + a literal value. Especially useful when used with + :class:`transformString<ParserElement.transformString>` (). + + Example:: + + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """Helper parse action for removing quotation marks from parsed + quoted strings. + + Example:: + + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """Helper to define a parse action by mapping a function to all + elements of a ParseResults list. If any additional args are passed, + they are forwarded to the given function as additional arguments + after the token, as in + ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, + which will convert the parsed data to an integer using base 16. + + Example (compare the last to example in :class:`ParserElement.transformString`:: + + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + + prints:: + + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. +Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. +Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """Helper to construct opening and closing tag expressions for HTML, + given a tag name. Matches tags in either upper or lower case, + attributes with namespaces and with quoted or unquoted values. + + Example:: + + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and + # closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are + # also accessible as named results + print(link.link_text, '->', link.href) + + prints:: + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """Helper to construct opening and closing tag expressions for XML, + given a tag name. Matches tags only in the given upper/lower case. + + Example: similar to :class:`makeHTMLTags` + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """Helper to create a validating parse action to be used with start + tags created with :class:`makeXMLTags` or + :class:`makeHTMLTags`. Use ``withAttribute`` to qualify + a starting tag with a required attribute value, to avoid false + matches on common tags such as ``<TD>`` or ``<DIV>``. + + Call ``withAttribute`` with a series of attribute names and + values. Specify the list of filter attributes names and values as: + + - keyword arguments, as in ``(align="right")``, or + - as an explicit dict with ``**`` operator, when an attribute + name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` + - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align","right"))`` + + For attribute names with a namespace prefix, you must use the second + form. Attribute names are matched insensitive to upper/lower case. + + If just testing for ``class`` (with or without a namespace), use + :class:`withClass`. + + To verify that the attribute exists, but without specifying a value, + pass ``withAttribute.ANY_VALUE`` as the value. + + Example:: + + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """Simplified version of :class:`withAttribute` when + matching on a div class - made difficult because ``class`` is + a reserved word in Python. + + Example:: + + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = SimpleNamespace() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary + or binary, left- or right-associative. Parse actions can also be + attached to operator expressions. The generated parser will also + recognize the use of parentheses to override operator precedences + (see example below). + + Note: if you define a deep operator list, you may see performance + issues when using infixNotation. See + :class:`ParserElement.enablePackrat` for a mechanism to potentially + improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the + nested + - opList - list of tuples, one for each operator precedence level + in the expression grammar; each tuple is of the form ``(opExpr, + numTerms, rightLeftAssoc, parseAction)``, where: + + - opExpr is the pyparsing expression for the operator; may also + be a string, which will be converted to a Literal; if numTerms + is 3, opExpr is a tuple of two expressions, for the two + operators separating the 3 terms + - numTerms is the number of terms for this operator (must be 1, + 2, or 3) + - rightLeftAssoc is the indicator whether the operator is right + or left associative, using the pyparsing-defined constants + ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``setParseAction(*fn)`` + (:class:`ParserElement.setParseAction`) + - lpar - expression for matching left-parentheses + (default= ``Suppress('(')``) + - rpar - expression for matching right-parentheses + (default= ``Suppress(')')``) + + Example:: + + # simple example of four-function arithmetic with ints and + # variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + + prints:: + + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.tryParse(instring, loc) + return loc, [] + + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of :class:`infixNotation`, will be +dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """Helper method for defining nested lists enclosed in opening and + closing delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list + (default= ``"("``); can also be a pyparsing expression + - closer - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - content - expression for items within the nested lists + (default= ``None``) + - ignoreExpr - expression for ignoring opening and closing + delimiters (default= :class:`quotedString`) + + If an expression is not provided for the content argument, the + nested expression will capture all whitespace-delimited content + between delimiters as a list of separate values. + + Use the ``ignoreExpr`` argument to define expressions that may + contain opening or closing characters that should not be treated as + opening or closing characters for nesting, such as quotedString or + a comment expression. Specify multiple expressions using an + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quotedString`, but if no expressions are to be ignored, then + pass ``None`` for this argument. + + Example:: + + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + + prints:: + + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """Helper method for defining space-delimited indentation blocks, + such as those used to define block statements in Python source code. + + Parameters: + + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single + grammar should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond + the the current level; set to False for block of left-most + statements (default= ``True``) + + A valid block must contain at least one ``blockStatement``. + + Example:: + + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + + prints:: + + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form ``/* ... */``" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form ``<!-- ... -->``" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form ``// ... (to end of line)``" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" + +javaStyleComment = cppStyleComment +"Same as :class:`cppStyleComment`" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form ``# ... (to end of line)``" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or +quoted strings, separated by commas. + +This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. +""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """Here are some common low-level expressions that may be useful in + jump-starting parser development: + + - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, + :class:`scientific notation<sci_real>`) + - common :class:`programming identifiers<identifier>` + - network addresses (:class:`MAC<mac_address>`, + :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) + - ISO8601 :class:`dates<iso8601_date>` and + :class:`datetime<iso8601_datetime>` + - :class:`UUID<uuid>` + - :class:`comma-separated list<comma_separated_list>` + + Parse actions: + + - :class:`convertToInteger` + - :class:`convertToFloat` + - :class:`convertToDate` + - :class:`convertToDatetime` + - :class:`stripHTMLTags` + - :class:`upcaseTokens` + - :class:`downcaseTokens` + + Example:: + + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + + prints:: + + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional + scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (``0.0.0.0 - 255.255.255.255``)" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) + + Example:: + + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + + prints:: + + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """Helper to create a parse action for converting parsed + datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) + + Example:: + + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + + prints:: + + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (``yyyy-mm-dd``)" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """Parse action to remove HTML tags from web page HTML source + + Example:: + + # strip HTML links from normal text + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + print(table_text.parseString(text).body) + + Prints:: + + More info at the pyparsing wiki page + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +class _lazyclassproperty(object): + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +class unicode_set(object): + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``, such as:: + + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + _ranges = [] + + @classmethod + def _get_chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in cc._ranges: + ret.extend(range(rr[0], rr[-1]+1)) + return [unichr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + "all non-whitespace characters in this range" + return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphas(cls): + "all alphabetic characters in this range" + return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def nums(cls): + "all numeric digit characters in this range" + return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphanums(cls): + "all alphanumeric characters in this range" + return cls.alphas + cls.nums + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + _ranges = [(32, sys.maxunicode)] + + class Latin1(unicode_set): + "Unicode set for Latin-1 Unicode Character Range" + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + class LatinA(unicode_set): + "Unicode set for Latin-A Unicode Character Range" + _ranges = [(0x0100, 0x017f),] + + class LatinB(unicode_set): + "Unicode set for Latin-B Unicode Character Range" + _ranges = [(0x0180, 0x024f),] + + class Greek(unicode_set): + "Unicode set for Greek Unicode Character Ranges" + _ranges = [ + (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), + (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), + (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), + ] + + class Cyrillic(unicode_set): + "Unicode set for Cyrillic Unicode Character Range" + _ranges = [(0x0400, 0x04ff)] + + class Chinese(unicode_set): + "Unicode set for Chinese Unicode Character Range" + _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] + + class Japanese(unicode_set): + "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" + _ranges = [ ] + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] + + class Hiragana(unicode_set): + "Unicode set for Hiragana Unicode Character Range" + _ranges = [(0x3040, 0x309f), ] + + class Katakana(unicode_set): + "Unicode set for Katakana Unicode Character Range" + _ranges = [(0x30a0, 0x30ff), ] + + class Korean(unicode_set): + "Unicode set for Korean Unicode Character Range" + _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] + + class CJK(Chinese, Japanese, Korean): + "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" + pass + + class Thai(unicode_set): + "Unicode set for Thai Unicode Character Range" + _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] + + class Arabic(unicode_set): + "Unicode set for Arabic Unicode Character Range" + _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] + + class Hebrew(unicode_set): + "Unicode set for Hebrew Unicode Character Range" + _ranges = [(0x0590, 0x05ff), ] + + class Devanagari(unicode_set): + "Unicode set for Devanagari Unicode Character Range" + _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] + +pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges + + pyparsing_unicode.Japanese.Hiragana._ranges + + pyparsing_unicode.Japanese.Katakana._ranges) + +# define ranges in language character sets +if PY_3: + setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) + setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) + setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) + setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) + setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) + setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) + setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) + setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) + setattr(pyparsing_unicode.Japanese, "ã²ã‚‰ãŒãª", pyparsing_unicode.Japanese.Hiragana) + setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) + setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) + setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/__init__.py new file mode 100644 index 0000000..8ed060f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/__init__.py @@ -0,0 +1,4 @@ +from .core import TomlError +from .parser import load, loads +from .test import translate_to_test +from .writer import dump, dumps \ No newline at end of file diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/core.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/core.py new file mode 100644 index 0000000..c182734 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/core.py @@ -0,0 +1,13 @@ +class TomlError(RuntimeError): + def __init__(self, message, line, col, filename): + RuntimeError.__init__(self, message, line, col, filename) + self.message = message + self.line = line + self.col = col + self.filename = filename + + def __str__(self): + return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) + + def __repr__(self): + return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/parser.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/parser.py new file mode 100644 index 0000000..3493aa6 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/parser.py @@ -0,0 +1,341 @@ +import string, re, sys, datetime +from .core import TomlError +from .utils import rfc3339_re, parse_rfc3339_re + +if sys.version_info[0] == 2: + _chr = unichr +else: + _chr = chr + +def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): + return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) + +def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): + if isinstance(s, bytes): + s = s.decode('utf-8') + + s = s.replace('\r\n', '\n') + + root = object_pairs_hook() + tables = object_pairs_hook() + scope = root + + src = _Source(s, filename=filename) + ast = _p_toml(src, object_pairs_hook=object_pairs_hook) + + def error(msg): + raise TomlError(msg, pos[0], pos[1], filename) + + def process_value(v, object_pairs_hook): + kind, text, value, pos = v + if kind == 'str' and value.startswith('\n'): + value = value[1:] + if kind == 'array': + if value and any(k != value[0][0] for k, t, v, p in value[1:]): + error('array-type-mismatch') + value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value] + elif kind == 'table': + value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value]) + return translate(kind, text, value) + + for kind, value, pos in ast: + if kind == 'kv': + k, v = value + if k in scope: + error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) + scope[k] = process_value(v, object_pairs_hook=object_pairs_hook) + else: + is_table_array = (kind == 'table_array') + cur = tables + for name in value[:-1]: + if isinstance(cur.get(name), list): + d, cur = cur[name][-1] + else: + d, cur = cur.setdefault(name, (None, object_pairs_hook())) + + scope = object_pairs_hook() + name = value[-1] + if name not in cur: + if is_table_array: + cur[name] = [(scope, object_pairs_hook())] + else: + cur[name] = (scope, object_pairs_hook()) + elif isinstance(cur[name], list): + if not is_table_array: + error('table_type_mismatch') + cur[name].append((scope, object_pairs_hook())) + else: + if is_table_array: + error('table_type_mismatch') + old_scope, next_table = cur[name] + if old_scope is not None: + error('duplicate_tables') + cur[name] = (scope, next_table) + + def merge_tables(scope, tables): + if scope is None: + scope = object_pairs_hook() + for k in tables: + if k in scope: + error('key_table_conflict') + v = tables[k] + if isinstance(v, list): + scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] + else: + scope[k] = merge_tables(v[0], v[1]) + return scope + + return merge_tables(root, tables) + +class _Source: + def __init__(self, s, filename=None): + self.s = s + self._pos = (1, 1) + self._last = None + self._filename = filename + self.backtrack_stack = [] + + def last(self): + return self._last + + def pos(self): + return self._pos + + def fail(self): + return self._expect(None) + + def consume_dot(self): + if self.s: + self._last = self.s[0] + self.s = self[1:] + self._advance(self._last) + return self._last + return None + + def expect_dot(self): + return self._expect(self.consume_dot()) + + def consume_eof(self): + if not self.s: + self._last = '' + return True + return False + + def expect_eof(self): + return self._expect(self.consume_eof()) + + def consume(self, s): + if self.s.startswith(s): + self.s = self.s[len(s):] + self._last = s + self._advance(s) + return True + return False + + def expect(self, s): + return self._expect(self.consume(s)) + + def consume_re(self, re): + m = re.match(self.s) + if m: + self.s = self.s[len(m.group(0)):] + self._last = m + self._advance(m.group(0)) + return m + return None + + def expect_re(self, re): + return self._expect(self.consume_re(re)) + + def __enter__(self): + self.backtrack_stack.append((self.s, self._pos)) + + def __exit__(self, type, value, traceback): + if type is None: + self.backtrack_stack.pop() + else: + self.s, self._pos = self.backtrack_stack.pop() + return type == TomlError + + def commit(self): + self.backtrack_stack[-1] = (self.s, self._pos) + + def _expect(self, r): + if not r: + raise TomlError('msg', self._pos[0], self._pos[1], self._filename) + return r + + def _advance(self, s): + suffix_pos = s.rfind('\n') + if suffix_pos == -1: + self._pos = (self._pos[0], self._pos[1] + len(s)) + else: + self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) + +_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') +def _p_ews(s): + s.expect_re(_ews_re) + +_ws_re = re.compile(r'[ \t]*') +def _p_ws(s): + s.expect_re(_ws_re) + +_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', + '\\': '\\', 'f': '\f' } + +_basicstr_re = re.compile(r'[^"\\\000-\037]*') +_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') +_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') +_escapes_re = re.compile(r'[btnfr\"\\]') +_newline_esc_re = re.compile('\n[ \t\n]*') +def _p_basicstr_content(s, content=_basicstr_re): + res = [] + while True: + res.append(s.expect_re(content).group(0)) + if not s.consume('\\'): + break + if s.consume_re(_newline_esc_re): + pass + elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): + v = int(s.last().group(1), 16) + if 0xd800 <= v < 0xe000: + s.fail() + res.append(_chr(v)) + else: + s.expect_re(_escapes_re) + res.append(_escapes[s.last().group(0)]) + return ''.join(res) + +_key_re = re.compile(r'[0-9a-zA-Z-_]+') +def _p_key(s): + with s: + s.expect('"') + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return r + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return r + return s.expect_re(_key_re).group(0) + +_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') + +_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') +_litstr_re = re.compile(r"[^'\000\010\012-\037]*") +_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") +def _p_value(s, object_pairs_hook): + pos = s.pos() + + if s.consume('true'): + return 'bool', s.last(), True, pos + if s.consume('false'): + return 'bool', s.last(), False, pos + + if s.consume('"'): + if s.consume('""'): + r = _p_basicstr_content(s, _basicstr_ml_re) + s.expect('"""') + else: + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return 'str', r, r, pos + + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return 'str', r, r, pos + + if s.consume_re(rfc3339_re): + m = s.last() + return 'datetime', m.group(0), parse_rfc3339_re(m), pos + + if s.consume_re(_float_re): + m = s.last().group(0) + r = m.replace('_','') + if '.' in m or 'e' in m or 'E' in m: + return 'float', m, float(r), pos + else: + return 'int', m, int(r, 10), pos + + if s.consume('['): + items = [] + with s: + while True: + _p_ews(s) + items.append(_p_value(s, object_pairs_hook=object_pairs_hook)) + s.commit() + _p_ews(s) + s.expect(',') + s.commit() + _p_ews(s) + s.expect(']') + return 'array', None, items, pos + + if s.consume('{'): + _p_ws(s) + items = object_pairs_hook() + if not s.consume('}'): + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _p_ws(s) + while s.consume(','): + _p_ws(s) + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _p_ws(s) + s.expect('}') + return 'table', None, items, pos + + s.fail() + +def _p_stmt(s, object_pairs_hook): + pos = s.pos() + if s.consume( '['): + is_array = s.consume('[') + _p_ws(s) + keys = [_p_key(s)] + _p_ws(s) + while s.consume('.'): + _p_ws(s) + keys.append(_p_key(s)) + _p_ws(s) + s.expect(']') + if is_array: + s.expect(']') + return 'table_array' if is_array else 'table', keys, pos + + key = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + value = _p_value(s, object_pairs_hook=object_pairs_hook) + return 'kv', (key, value), pos + +_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') +def _p_toml(s, object_pairs_hook): + stmts = [] + _p_ews(s) + with s: + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + while True: + s.commit() + s.expect_re(_stmtsep_re) + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + _p_ews(s) + s.expect_eof() + return stmts diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/test.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/test.py new file mode 100644 index 0000000..ec8abfc --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/test.py @@ -0,0 +1,30 @@ +import datetime +from .utils import format_rfc3339 + +try: + _string_types = (str, unicode) + _int_types = (int, long) +except NameError: + _string_types = str + _int_types = int + +def translate_to_test(v): + if isinstance(v, dict): + return { k: translate_to_test(v) for k, v in v.items() } + if isinstance(v, list): + a = [translate_to_test(x) for x in v] + if v and isinstance(v[0], dict): + return a + else: + return {'type': 'array', 'value': a} + if isinstance(v, datetime.datetime): + return {'type': 'datetime', 'value': format_rfc3339(v)} + if isinstance(v, bool): + return {'type': 'bool', 'value': 'true' if v else 'false'} + if isinstance(v, _int_types): + return {'type': 'integer', 'value': str(v)} + if isinstance(v, float): + return {'type': 'float', 'value': '{:.17}'.format(v)} + if isinstance(v, _string_types): + return {'type': 'string', 'value': v} + raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/utils.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/utils.py new file mode 100644 index 0000000..636a680 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/utils.py @@ -0,0 +1,67 @@ +import datetime +import re + +rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') + +def parse_rfc3339(v): + m = rfc3339_re.match(v) + if not m or m.group(0) != v: + return None + return parse_rfc3339_re(m) + +def parse_rfc3339_re(m): + r = map(int, m.groups()[:6]) + if m.group(7): + micro = float(m.group(7)) + else: + micro = 0 + + if m.group(8): + g = int(m.group(8), 10) * 60 + int(m.group(9), 10) + tz = _TimeZone(datetime.timedelta(0, g * 60)) + else: + tz = _TimeZone(datetime.timedelta(0, 0)) + + y, m, d, H, M, S = r + return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) + + +def format_rfc3339(v): + offs = v.utcoffset() + offs = int(offs.total_seconds()) // 60 if offs is not None else 0 + + if offs == 0: + suffix = 'Z' + else: + if offs > 0: + suffix = '+' + else: + suffix = '-' + offs = -offs + suffix = '{0}{1:02}:{2:02}'.format(suffix, offs // 60, offs % 60) + + if v.microsecond: + return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix + else: + return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix + +class _TimeZone(datetime.tzinfo): + def __init__(self, offset): + self._offset = offset + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return None + + def tzname(self, dt): + m = self._offset.total_seconds() // 60 + if m < 0: + res = '-' + m = -m + else: + res = '+' + h = m // 60 + m = m - h * 60 + return '{}{:.02}{:.02}'.format(res, h, m) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/writer.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/writer.py new file mode 100644 index 0000000..73b5089 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/pytoml/writer.py @@ -0,0 +1,106 @@ +from __future__ import unicode_literals +import io, datetime, math, string, sys + +from .utils import format_rfc3339 + +if sys.version_info[0] == 3: + long = int + unicode = str + + +def dumps(obj, sort_keys=False): + fout = io.StringIO() + dump(obj, fout, sort_keys=sort_keys) + return fout.getvalue() + + +_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} + + +def _escape_string(s): + res = [] + start = 0 + + def flush(): + if start != i: + res.append(s[start:i]) + return i + 1 + + i = 0 + while i < len(s): + c = s[i] + if c in '"\\\n\r\t\b\f': + start = flush() + res.append('\\' + _escapes[c]) + elif ord(c) < 0x20: + start = flush() + res.append('\\u%04x' % ord(c)) + i += 1 + + flush() + return '"' + ''.join(res) + '"' + + +_key_chars = string.digits + string.ascii_letters + '-_' +def _escape_id(s): + if any(c not in _key_chars for c in s): + return _escape_string(s) + return s + + +def _format_value(v): + if isinstance(v, bool): + return 'true' if v else 'false' + if isinstance(v, int) or isinstance(v, long): + return unicode(v) + if isinstance(v, float): + if math.isnan(v) or math.isinf(v): + raise ValueError("{0} is not a valid TOML value".format(v)) + else: + return repr(v) + elif isinstance(v, unicode) or isinstance(v, bytes): + return _escape_string(v) + elif isinstance(v, datetime.datetime): + return format_rfc3339(v) + elif isinstance(v, list): + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + elif isinstance(v, dict): + return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) + else: + raise RuntimeError(v) + + +def dump(obj, fout, sort_keys=False): + tables = [((), obj, False)] + + while tables: + name, table, is_array = tables.pop() + if name: + section_name = '.'.join(_escape_id(c) for c in name) + if is_array: + fout.write('[[{0}]]\n'.format(section_name)) + else: + fout.write('[{0}]\n'.format(section_name)) + + table_keys = sorted(table.keys()) if sort_keys else table.keys() + new_tables = [] + has_kv = False + for k in table_keys: + v = table[k] + if isinstance(v, dict): + new_tables.append((name + (k,), v, False)) + elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): + new_tables.extend((name + (k,), d, True) for d in v) + elif v is None: + # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 + fout.write( + '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) + has_kv = True + else: + fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) + has_kv = True + + tables.extend(reversed(new_tables)) + + if (name or has_kv) and tables: + fout.write('\n') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..80c4ce1 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__init__.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at <http://python-requests.org>. + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +from pip._vendor import urllib3 +from pip._vendor import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +from pip._internal.utils.compat import WINDOWS +if not WINDOWS: + try: + from pip._vendor.urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) + except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__version__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..f5b5d03 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.21.0' +__build__ = 0x022100 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/_internal_utils.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/adapters.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..c30e7c9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/adapters.py @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +from pip._vendor.urllib3.response import HTTPResponse +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.util import Timeout as TimeoutSauce +from pip._vendor.urllib3.util.retry import Retry +from pip._vendor.urllib3.exceptions import ClosedPoolError +from pip._vendor.urllib3.exceptions import ConnectTimeoutError +from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +from pip._vendor.urllib3.exceptions import MaxRetryError +from pip._vendor.urllib3.exceptions import NewConnectionError +from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +from pip._vendor.urllib3.exceptions import ProtocolError +from pip._vendor.urllib3.exceptions import ReadTimeoutError +from pip._vendor.urllib3.exceptions import SSLError as _SSLError +from pip._vendor.urllib3.exceptions import ResponseError +from pip._vendor.urllib3.exceptions import LocationValueError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL) +from .auth import _basic_auth_str + +try: + from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session <Session>` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response <requests.Response>` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` + + :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/api.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/api.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request <Request>`. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response <Response>` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + <Response [200]> + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/auth.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/auth.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/certs.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..06a594e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from pip._vendor.certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/compat.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..6a86893 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/compat.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +# Note: We've patched out simplejson support in pip because it prevents +# upgrading simplejson on Windows. +# try: +# import simplejson as json +# except (ImportError, SyntaxError): +# # simplejson does not support Python 3.2, it throws a SyntaxError +# # because of u'...' Unicode literals. +import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from collections import Callable, Mapping, MutableMapping, OrderedDict + + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/cookies.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/exceptions.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..a91e1fd --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/help.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/help.py new file mode 100644 index 0000000..3c3072b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +from pip._vendor import idna +from pip._vendor import urllib3 +from pip._vendor import chardet + +from . import __version__ as requests_version + +try: + from pip._vendor.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/hooks.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return {event: [] for event in HOOKS} + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/models.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/models.py new file mode 100644 index 0000000..0839957 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/models.py @@ -0,0 +1,953 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, 'read'): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request <Request>` object. + + Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + <PreparedRequest [GET]> + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '<Request [%s]>' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request <Request>` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + <PreparedRequest [GET]> + + >>> s = requests.Session() + >>> s.send(r) + <Response [200]> + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '<PreparedRequest [%s]>' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + from pip._vendor import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response <Response>` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response <Response>` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest <PreparedRequest>` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '<Response [%s]>' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/packages.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/sessions.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/sessions.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('https://httpbin.org/get') + <Response [200]> + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request <Request>` sent from this + #: :class:`Session <Session>`. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request <Request>`. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request <Request>`. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request <Request>`. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request <Request>` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request <Request>`, prepares it and sends it. + Returns :class:`Response <Response>` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/status_codes.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/structures.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/structures.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from .compat import OrderedDict, Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '<lookup \'%s\'>' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/utils.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/requests/utils.py @@ -0,0 +1,977 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '<local>' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '<local>': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) + pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/retrying.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/retrying.py new file mode 100644 index 0000000..6d1e627 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## Copyright 2013-2014 Ray Holder +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +import random +from pip._vendor import six +import sys +import time +import traceback + + +# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... +MAX_WAIT = 1073741823 + + +def retry(*dargs, **dkw): + """ + Decorator function that instantiates the Retrying object + @param *dargs: positional arguments passed to Retrying object + @param **dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + def wrap_simple(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying().call(f, *args, **kw) + + return wrapped_f + + return wrap_simple(dargs[0]) + + else: + def wrap(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying(*dargs, **dkw).call(f, *args, **kw) + + return wrapped_f + + return wrap + + +class Retrying(object): + + def __init__(self, + stop=None, wait=None, + stop_max_attempt_number=None, + stop_max_delay=None, + wait_fixed=None, + wait_random_min=None, wait_random_max=None, + wait_incrementing_start=None, wait_incrementing_increment=None, + wait_exponential_multiplier=None, wait_exponential_max=None, + retry_on_exception=None, + retry_on_result=None, + wrap_exception=False, + stop_func=None, + wait_func=None, + wait_jitter_max=None): + + self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number + self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay + self._wait_fixed = 1000 if wait_fixed is None else wait_fixed + self._wait_random_min = 0 if wait_random_min is None else wait_random_min + self._wait_random_max = 1000 if wait_random_max is None else wait_random_max + self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start + self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment + self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier + self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max + self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max + + # TODO add chaining of stop behaviors + # stop behavior + stop_funcs = [] + if stop_max_attempt_number is not None: + stop_funcs.append(self.stop_after_attempt) + + if stop_max_delay is not None: + stop_funcs.append(self.stop_after_delay) + + if stop_func is not None: + self.stop = stop_func + + elif stop is None: + self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) + + else: + self.stop = getattr(self, stop) + + # TODO add chaining of wait behaviors + # wait behavior + wait_funcs = [lambda *args, **kwargs: 0] + if wait_fixed is not None: + wait_funcs.append(self.fixed_sleep) + + if wait_random_min is not None or wait_random_max is not None: + wait_funcs.append(self.random_sleep) + + if wait_incrementing_start is not None or wait_incrementing_increment is not None: + wait_funcs.append(self.incrementing_sleep) + + if wait_exponential_multiplier is not None or wait_exponential_max is not None: + wait_funcs.append(self.exponential_sleep) + + if wait_func is not None: + self.wait = wait_func + + elif wait is None: + self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) + + else: + self.wait = getattr(self, wait) + + # retry on exception filter + if retry_on_exception is None: + self._retry_on_exception = self.always_reject + else: + self._retry_on_exception = retry_on_exception + + # TODO simplify retrying by Exception types + # retry on result filter + if retry_on_result is None: + self._retry_on_result = self.never_reject + else: + self._retry_on_result = retry_on_result + + self._wrap_exception = wrap_exception + + def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the previous attempt >= stop_max_attempt_number.""" + return previous_attempt_number >= self._stop_max_attempt_number + + def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the time from the first attempt >= stop_max_delay.""" + return delay_since_first_attempt_ms >= self._stop_max_delay + + def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Don't sleep at all before retrying.""" + return 0 + + def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a fixed amount of time between each retry.""" + return self._wait_fixed + + def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a random amount of time between wait_random_min and wait_random_max""" + return random.randint(self._wait_random_min, self._wait_random_max) + + def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """ + Sleep an incremental amount of time after each attempt, starting at + wait_incrementing_start and incrementing by wait_incrementing_increment + """ + result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) + if result < 0: + result = 0 + return result + + def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + exp = 2 ** previous_attempt_number + result = self._wait_exponential_multiplier * exp + if result > self._wait_exponential_max: + result = self._wait_exponential_max + if result < 0: + result = 0 + return result + + def never_reject(self, result): + return False + + def always_reject(self, result): + return True + + def should_reject(self, attempt): + reject = False + if attempt.has_exception: + reject |= self._retry_on_exception(attempt.value[1]) + else: + reject |= self._retry_on_result(attempt.value) + + return reject + + def call(self, fn, *args, **kwargs): + start_time = int(round(time.time() * 1000)) + attempt_number = 1 + while True: + try: + attempt = Attempt(fn(*args, **kwargs), attempt_number, False) + except: + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) + + if not self.should_reject(attempt): + return attempt.get(self._wrap_exception) + + delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time + if self.stop(attempt_number, delay_since_first_attempt_ms): + if not self._wrap_exception and attempt.has_exception: + # get() on an attempt with an exception should cause it to be raised, but raise just in case + raise attempt.get() + else: + raise RetryError(attempt) + else: + sleep = self.wait(attempt_number, delay_since_first_attempt_ms) + if self._wait_jitter_max: + jitter = random.random() * self._wait_jitter_max + sleep = sleep + max(0, jitter) + time.sleep(sleep / 1000.0) + + attempt_number += 1 + + +class Attempt(object): + """ + An Attempt encapsulates a call to a target function that may end as a + normal return value from the function or an Exception depending on what + occurred during the execution. + """ + + def __init__(self, value, attempt_number, has_exception): + self.value = value + self.attempt_number = attempt_number + self.has_exception = has_exception + + def get(self, wrap_exception=False): + """ + Return the return value of this Attempt instance or raise an Exception. + If wrap_exception is true, this Attempt is wrapped inside of a + RetryError before being raised. + """ + if self.has_exception: + if wrap_exception: + raise RetryError(self) + else: + six.reraise(self.value[0], self.value[1], self.value[2]) + else: + return self.value + + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + + +class RetryError(Exception): + """ + A RetryError encapsulates the last Attempt instance right before giving up. + """ + + def __init__(self, last_attempt): + self.last_attempt = last_attempt + + def __str__(self): + return "RetryError[{0}]".format(self.last_attempt) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/six.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/six.py new file mode 100644 index 0000000..89b2188 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/six.py @@ -0,0 +1,952 @@ +# Copyright (c) 2010-2018 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.12.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24.1' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/_collections.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict +from .exceptions import InvalidHeader +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connection.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address. + self.source_address = kw.get('source_address') + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + if self._tunnel_host: + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, server_hostname=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + server_hostname=self.server_hostname + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + hostname = self.host + + if self._tunnel_host: + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=server_hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connectionpool.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host, self.scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] <https://github.com/shazow/urllib3/issues/651> + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host, scheme): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/appengine.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..9b42952 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + +Example usage:: + + from pip._vendor.urllib3 import PoolManager + from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations <https://cloud.google.com/appengine/docs/python/\ +urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + <https://cloud.google.com/appengine/docs/python/sockets/\ + #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/ntlmpool.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {'Connection': 'Keep-Alive'} + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/pyopenssl.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..363667c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + from pip._vendor import idna + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/securetransport.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/socks.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/exceptions.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when performing security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/fields.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/filepost.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import +import binascii +import codecs +import os + +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/makefile.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..740db37 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/six.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..970cf65 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,156 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used in Python 2.7. +try: + from pip._vendor import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/poolmanager.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + + if 'headers' not in kw: + kw['headers'] = self.headers.copy() + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/request.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/request.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplementedError("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw['request_url'] = url + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/response.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/response.py @@ -0,0 +1,705 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = b'' + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/connection.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..5ad70b2 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/queue.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/request.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/response.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/retry.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,411 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = remove_headers_on_redirect + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/ssl_.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..dfc553f --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,381 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + from pip._vendor import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from pip._vendor.urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.7 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/timeout.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/url.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/wait.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/__init__.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000..d21d697 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# coding: utf-8 +""" + + webencodings + ~~~~~~~~~~~~ + + This is a Python implementation of the `WHATWG Encoding standard + <http://encoding.spec.whatwg.org/>`. See README for details. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + +from .labels import LABELS + + +VERSION = '0.5.1' + + +# Some names in Encoding are not valid Python aliases. Remap these. +PYTHON_NAMES = { + 'iso-8859-8-i': 'iso-8859-8', + 'x-mac-cyrillic': 'mac-cyrillic', + 'macintosh': 'mac-roman', + 'windows-874': 'cp874'} + +CACHE = {} + + +def ascii_lower(string): + r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. + + :param string: An Unicode string. + :returns: A new Unicode string. + + This is used for `ASCII case-insensitive + <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ + matching of encoding labels. + The same matching is also used, among other things, + for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. + + This is different from the :meth:`~py:str.lower` method of Unicode strings + which also affect non-ASCII characters, + sometimes mapping them into the ASCII range: + + >>> keyword = u'Bac\N{KELVIN SIGN}ground' + >>> assert keyword.lower() == u'background' + >>> assert ascii_lower(keyword) != keyword.lower() + >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' + + """ + # This turns out to be faster than unicode.translate() + return string.encode('utf8').lower().decode('utf8') + + +def lookup(label): + """ + Look for an encoding by its label. + This is the spec’s `get an encoding + <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. + Supported labels are listed there. + + :param label: A string. + :returns: + An :class:`Encoding` object, or :obj:`None` for an unknown label. + + """ + # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. + label = ascii_lower(label.strip('\t\n\f\r ')) + name = LABELS.get(label) + if name is None: + return None + encoding = CACHE.get(name) + if encoding is None: + if name == 'x-user-defined': + from .x_user_defined import codec_info + else: + python_name = PYTHON_NAMES.get(name, name) + # Any python_name value that gets to here should be valid. + codec_info = codecs.lookup(python_name) + encoding = Encoding(name, codec_info) + CACHE[name] = encoding + return encoding + + +def _get_encoding(encoding_or_label): + """ + Accept either an encoding object or label. + + :param encoding: An :class:`Encoding` object or a label string. + :returns: An :class:`Encoding` object. + :raises: :exc:`~exceptions.LookupError` for an unknown label. + + """ + if hasattr(encoding_or_label, 'codec_info'): + return encoding_or_label + + encoding = lookup(encoding_or_label) + if encoding is None: + raise LookupError('Unknown encoding label: %r' % encoding_or_label) + return encoding + + +class Encoding(object): + """Reresents a character encoding such as UTF-8, + that can be used for decoding or encoding. + + .. attribute:: name + + Canonical name of the encoding + + .. attribute:: codec_info + + The actual implementation of the encoding, + a stdlib :class:`~codecs.CodecInfo` object. + See :func:`codecs.register`. + + """ + def __init__(self, name, codec_info): + self.name = name + self.codec_info = codec_info + + def __repr__(self): + return '<Encoding %s>' % self.name + + +#: The UTF-8 encoding. Should be used for new content and formats. +UTF8 = lookup('utf-8') + +_UTF16LE = lookup('utf-16le') +_UTF16BE = lookup('utf-16be') + + +def decode(input, fallback_encoding, errors='replace'): + """ + Decode a single string. + + :param input: A byte string + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: + A ``(output, encoding)`` tuple of an Unicode string + and an :obj:`Encoding`. + + """ + # Fail early if `encoding` is an invalid label. + fallback_encoding = _get_encoding(fallback_encoding) + bom_encoding, input = _detect_bom(input) + encoding = bom_encoding or fallback_encoding + return encoding.codec_info.decode(input, errors)[0], encoding + + +def _detect_bom(input): + """Return (bom_encoding, input), with any BOM removed from the input.""" + if input.startswith(b'\xFF\xFE'): + return _UTF16LE, input[2:] + if input.startswith(b'\xFE\xFF'): + return _UTF16BE, input[2:] + if input.startswith(b'\xEF\xBB\xBF'): + return UTF8, input[3:] + return None, input + + +def encode(input, encoding=UTF8, errors='strict'): + """ + Encode a single string. + + :param input: An Unicode string. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: A byte string. + + """ + return _get_encoding(encoding).codec_info.encode(input, errors)[0] + + +def iter_decode(input, fallback_encoding, errors='replace'): + """ + "Pull"-based decoder. + + :param input: + An iterable of byte strings. + + The input is first consumed just enough to determine the encoding + based on the precense of a BOM, + then consumed on demand when the return value is. + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: + An ``(output, encoding)`` tuple. + :obj:`output` is an iterable of Unicode strings, + :obj:`encoding` is the :obj:`Encoding` that is being used. + + """ + + decoder = IncrementalDecoder(fallback_encoding, errors) + generator = _iter_decode_generator(input, decoder) + encoding = next(generator) + return generator, encoding + + +def _iter_decode_generator(input, decoder): + """Return a generator that first yields the :obj:`Encoding`, + then yields output chukns as Unicode strings. + + """ + decode = decoder.decode + input = iter(input) + for chunck in input: + output = decode(chunck) + if output: + assert decoder.encoding is not None + yield decoder.encoding + yield output + break + else: + # Input exhausted without determining the encoding + output = decode(b'', final=True) + assert decoder.encoding is not None + yield decoder.encoding + if output: + yield output + return + + for chunck in input: + output = decode(chunck) + if output: + yield output + output = decode(b'', final=True) + if output: + yield output + + +def iter_encode(input, encoding=UTF8, errors='strict'): + """ + “Pullâ€-based encoder. + + :param input: An iterable of Unicode strings. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: An iterable of byte strings. + + """ + # Fail early if `encoding` is an invalid label. + encode = IncrementalEncoder(encoding, errors).encode + return _iter_encode_generator(input, encode) + + +def _iter_encode_generator(input, encode): + for chunck in input: + output = encode(chunck) + if output: + yield output + output = encode('', final=True) + if output: + yield output + + +class IncrementalDecoder(object): + """ + “Pushâ€-based decoder. + + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + """ + def __init__(self, fallback_encoding, errors='replace'): + # Fail early if `encoding` is an invalid label. + self._fallback_encoding = _get_encoding(fallback_encoding) + self._errors = errors + self._buffer = b'' + self._decoder = None + #: The actual :class:`Encoding` that is being used, + #: or :obj:`None` if that is not determined yet. + #: (Ie. if there is not enough input yet to determine + #: if there is a BOM.) + self.encoding = None # Not known yet. + + def decode(self, input, final=False): + """Decode one chunk of the input. + + :param input: A byte string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: An Unicode string. + + """ + decoder = self._decoder + if decoder is not None: + return decoder(input, final) + + input = self._buffer + input + encoding, input = _detect_bom(input) + if encoding is None: + if len(input) < 3 and not final: # Not enough data yet. + self._buffer = input + return '' + else: # No BOM + encoding = self._fallback_encoding + decoder = encoding.codec_info.incrementaldecoder(self._errors).decode + self._decoder = decoder + self.encoding = encoding + return decoder(input, final) + + +class IncrementalEncoder(object): + """ + “Pushâ€-based encoder. + + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + .. method:: encode(input, final=False) + + :param input: An Unicode string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: A byte string. + + """ + def __init__(self, encoding=UTF8, errors='strict'): + encoding = _get_encoding(encoding) + self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/labels.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000..29cbf91 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { + 'unicode-1-1-utf-8': 'utf-8', + 'utf-8': 'utf-8', + 'utf8': 'utf-8', + '866': 'ibm866', + 'cp866': 'ibm866', + 'csibm866': 'ibm866', + 'ibm866': 'ibm866', + 'csisolatin2': 'iso-8859-2', + 'iso-8859-2': 'iso-8859-2', + 'iso-ir-101': 'iso-8859-2', + 'iso8859-2': 'iso-8859-2', + 'iso88592': 'iso-8859-2', + 'iso_8859-2': 'iso-8859-2', + 'iso_8859-2:1987': 'iso-8859-2', + 'l2': 'iso-8859-2', + 'latin2': 'iso-8859-2', + 'csisolatin3': 'iso-8859-3', + 'iso-8859-3': 'iso-8859-3', + 'iso-ir-109': 'iso-8859-3', + 'iso8859-3': 'iso-8859-3', + 'iso88593': 'iso-8859-3', + 'iso_8859-3': 'iso-8859-3', + 'iso_8859-3:1988': 'iso-8859-3', + 'l3': 'iso-8859-3', + 'latin3': 'iso-8859-3', + 'csisolatin4': 'iso-8859-4', + 'iso-8859-4': 'iso-8859-4', + 'iso-ir-110': 'iso-8859-4', + 'iso8859-4': 'iso-8859-4', + 'iso88594': 'iso-8859-4', + 'iso_8859-4': 'iso-8859-4', + 'iso_8859-4:1988': 'iso-8859-4', + 'l4': 'iso-8859-4', + 'latin4': 'iso-8859-4', + 'csisolatincyrillic': 'iso-8859-5', + 'cyrillic': 'iso-8859-5', + 'iso-8859-5': 'iso-8859-5', + 'iso-ir-144': 'iso-8859-5', + 'iso8859-5': 'iso-8859-5', + 'iso88595': 'iso-8859-5', + 'iso_8859-5': 'iso-8859-5', + 'iso_8859-5:1988': 'iso-8859-5', + 'arabic': 'iso-8859-6', + 'asmo-708': 'iso-8859-6', + 'csiso88596e': 'iso-8859-6', + 'csiso88596i': 'iso-8859-6', + 'csisolatinarabic': 'iso-8859-6', + 'ecma-114': 'iso-8859-6', + 'iso-8859-6': 'iso-8859-6', + 'iso-8859-6-e': 'iso-8859-6', + 'iso-8859-6-i': 'iso-8859-6', + 'iso-ir-127': 'iso-8859-6', + 'iso8859-6': 'iso-8859-6', + 'iso88596': 'iso-8859-6', + 'iso_8859-6': 'iso-8859-6', + 'iso_8859-6:1987': 'iso-8859-6', + 'csisolatingreek': 'iso-8859-7', + 'ecma-118': 'iso-8859-7', + 'elot_928': 'iso-8859-7', + 'greek': 'iso-8859-7', + 'greek8': 'iso-8859-7', + 'iso-8859-7': 'iso-8859-7', + 'iso-ir-126': 'iso-8859-7', + 'iso8859-7': 'iso-8859-7', + 'iso88597': 'iso-8859-7', + 'iso_8859-7': 'iso-8859-7', + 'iso_8859-7:1987': 'iso-8859-7', + 'sun_eu_greek': 'iso-8859-7', + 'csiso88598e': 'iso-8859-8', + 'csisolatinhebrew': 'iso-8859-8', + 'hebrew': 'iso-8859-8', + 'iso-8859-8': 'iso-8859-8', + 'iso-8859-8-e': 'iso-8859-8', + 'iso-ir-138': 'iso-8859-8', + 'iso8859-8': 'iso-8859-8', + 'iso88598': 'iso-8859-8', + 'iso_8859-8': 'iso-8859-8', + 'iso_8859-8:1988': 'iso-8859-8', + 'visual': 'iso-8859-8', + 'csiso88598i': 'iso-8859-8-i', + 'iso-8859-8-i': 'iso-8859-8-i', + 'logical': 'iso-8859-8-i', + 'csisolatin6': 'iso-8859-10', + 'iso-8859-10': 'iso-8859-10', + 'iso-ir-157': 'iso-8859-10', + 'iso8859-10': 'iso-8859-10', + 'iso885910': 'iso-8859-10', + 'l6': 'iso-8859-10', + 'latin6': 'iso-8859-10', + 'iso-8859-13': 'iso-8859-13', + 'iso8859-13': 'iso-8859-13', + 'iso885913': 'iso-8859-13', + 'iso-8859-14': 'iso-8859-14', + 'iso8859-14': 'iso-8859-14', + 'iso885914': 'iso-8859-14', + 'csisolatin9': 'iso-8859-15', + 'iso-8859-15': 'iso-8859-15', + 'iso8859-15': 'iso-8859-15', + 'iso885915': 'iso-8859-15', + 'iso_8859-15': 'iso-8859-15', + 'l9': 'iso-8859-15', + 'iso-8859-16': 'iso-8859-16', + 'cskoi8r': 'koi8-r', + 'koi': 'koi8-r', + 'koi8': 'koi8-r', + 'koi8-r': 'koi8-r', + 'koi8_r': 'koi8-r', + 'koi8-u': 'koi8-u', + 'csmacintosh': 'macintosh', + 'mac': 'macintosh', + 'macintosh': 'macintosh', + 'x-mac-roman': 'macintosh', + 'dos-874': 'windows-874', + 'iso-8859-11': 'windows-874', + 'iso8859-11': 'windows-874', + 'iso885911': 'windows-874', + 'tis-620': 'windows-874', + 'windows-874': 'windows-874', + 'cp1250': 'windows-1250', + 'windows-1250': 'windows-1250', + 'x-cp1250': 'windows-1250', + 'cp1251': 'windows-1251', + 'windows-1251': 'windows-1251', + 'x-cp1251': 'windows-1251', + 'ansi_x3.4-1968': 'windows-1252', + 'ascii': 'windows-1252', + 'cp1252': 'windows-1252', + 'cp819': 'windows-1252', + 'csisolatin1': 'windows-1252', + 'ibm819': 'windows-1252', + 'iso-8859-1': 'windows-1252', + 'iso-ir-100': 'windows-1252', + 'iso8859-1': 'windows-1252', + 'iso88591': 'windows-1252', + 'iso_8859-1': 'windows-1252', + 'iso_8859-1:1987': 'windows-1252', + 'l1': 'windows-1252', + 'latin1': 'windows-1252', + 'us-ascii': 'windows-1252', + 'windows-1252': 'windows-1252', + 'x-cp1252': 'windows-1252', + 'cp1253': 'windows-1253', + 'windows-1253': 'windows-1253', + 'x-cp1253': 'windows-1253', + 'cp1254': 'windows-1254', + 'csisolatin5': 'windows-1254', + 'iso-8859-9': 'windows-1254', + 'iso-ir-148': 'windows-1254', + 'iso8859-9': 'windows-1254', + 'iso88599': 'windows-1254', + 'iso_8859-9': 'windows-1254', + 'iso_8859-9:1989': 'windows-1254', + 'l5': 'windows-1254', + 'latin5': 'windows-1254', + 'windows-1254': 'windows-1254', + 'x-cp1254': 'windows-1254', + 'cp1255': 'windows-1255', + 'windows-1255': 'windows-1255', + 'x-cp1255': 'windows-1255', + 'cp1256': 'windows-1256', + 'windows-1256': 'windows-1256', + 'x-cp1256': 'windows-1256', + 'cp1257': 'windows-1257', + 'windows-1257': 'windows-1257', + 'x-cp1257': 'windows-1257', + 'cp1258': 'windows-1258', + 'windows-1258': 'windows-1258', + 'x-cp1258': 'windows-1258', + 'x-mac-cyrillic': 'x-mac-cyrillic', + 'x-mac-ukrainian': 'x-mac-cyrillic', + 'chinese': 'gbk', + 'csgb2312': 'gbk', + 'csiso58gb231280': 'gbk', + 'gb2312': 'gbk', + 'gb_2312': 'gbk', + 'gb_2312-80': 'gbk', + 'gbk': 'gbk', + 'iso-ir-58': 'gbk', + 'x-gbk': 'gbk', + 'gb18030': 'gb18030', + 'hz-gb-2312': 'hz-gb-2312', + 'big5': 'big5', + 'big5-hkscs': 'big5', + 'cn-big5': 'big5', + 'csbig5': 'big5', + 'x-x-big5': 'big5', + 'cseucpkdfmtjapanese': 'euc-jp', + 'euc-jp': 'euc-jp', + 'x-euc-jp': 'euc-jp', + 'csiso2022jp': 'iso-2022-jp', + 'iso-2022-jp': 'iso-2022-jp', + 'csshiftjis': 'shift_jis', + 'ms_kanji': 'shift_jis', + 'shift-jis': 'shift_jis', + 'shift_jis': 'shift_jis', + 'sjis': 'shift_jis', + 'windows-31j': 'shift_jis', + 'x-sjis': 'shift_jis', + 'cseuckr': 'euc-kr', + 'csksc56011987': 'euc-kr', + 'euc-kr': 'euc-kr', + 'iso-ir-149': 'euc-kr', + 'korean': 'euc-kr', + 'ks_c_5601-1987': 'euc-kr', + 'ks_c_5601-1989': 'euc-kr', + 'ksc5601': 'euc-kr', + 'ksc_5601': 'euc-kr', + 'windows-949': 'euc-kr', + 'csiso2022kr': 'iso-2022-kr', + 'iso-2022-kr': 'iso-2022-kr', + 'utf-16be': 'utf-16be', + 'utf-16': 'utf-16le', + 'utf-16le': 'utf-16le', + 'x-user-defined': 'x-user-defined', +} diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/mklabels.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000..295dc92 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + webencodings.mklabels + ~~~~~~~~~~~~~~~~~~~~~ + + Regenarate the webencodings.labels module. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +import json +try: + from urllib import urlopen +except ImportError: + from urllib.request import urlopen + + +def assert_lower(string): + assert string == string.lower() + return string + + +def generate(url): + parts = ['''\ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { +'''] + labels = [ + (repr(assert_lower(label)).lstrip('u'), + repr(encoding['name']).lstrip('u')) + for category in json.loads(urlopen(url).read().decode('ascii')) + for encoding in category['encodings'] + for label in encoding['labels']] + max_len = max(len(label) for label, name in labels) + parts.extend( + ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) + for label, name in labels) + parts.append('}') + return ''.join(parts) + + +if __name__ == '__main__': + print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/tests.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000..e12c10d --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# coding: utf-8 +""" + + webencodings.tests + ~~~~~~~~~~~~~~~~~~ + + A basic test suite for Encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, + IncrementalDecoder, IncrementalEncoder, UTF8) + + +def assert_raises(exception, function, *args, **kwargs): + try: + function(*args, **kwargs) + except exception: + return + else: # pragma: no cover + raise AssertionError('Did not raise %s.' % exception) + + +def test_labels(): + assert lookup('utf-8').name == 'utf-8' + assert lookup('Utf-8').name == 'utf-8' + assert lookup('UTF-8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8 ').name == 'utf-8' + assert lookup(' \r\nutf8\t').name == 'utf-8' + assert lookup('u8') is None # Python label. + assert lookup('utf-8 ') is None # Non-ASCII white space. + + assert lookup('US-ASCII').name == 'windows-1252' + assert lookup('iso-8859-1').name == 'windows-1252' + assert lookup('latin1').name == 'windows-1252' + assert lookup('LATIN1').name == 'windows-1252' + assert lookup('latin-1') is None + assert lookup('LATÄ°N1') is None # ASCII-only case insensitivity. + + +def test_all_labels(): + for label in LABELS: + assert decode(b'', label) == ('', lookup(label)) + assert encode('', label) == b'' + for repeat in [0, 1, 12]: + output, _ = iter_decode([b''] * repeat, label) + assert list(output) == [] + assert list(iter_encode([''] * repeat, label)) == [] + decoder = IncrementalDecoder(label) + assert decoder.decode(b'') == '' + assert decoder.decode(b'', final=True) == '' + encoder = IncrementalEncoder(label) + assert encoder.encode('') == b'' + assert encoder.encode('', final=True) == b'' + # All encoding names are valid labels too: + for name in set(LABELS.values()): + assert lookup(name).name == name + + +def test_invalid_label(): + assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') + assert_raises(LookupError, encode, 'é', 'invalid') + assert_raises(LookupError, iter_decode, [], 'invalid') + assert_raises(LookupError, iter_encode, [], 'invalid') + assert_raises(LookupError, IncrementalDecoder, 'invalid') + assert_raises(LookupError, IncrementalEncoder, 'invalid') + + +def test_decode(): + assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) + assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) + assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) + assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM + + assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM + assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM + assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) + assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) + + assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) + assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) + assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) + + assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) + assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) + assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) + + +def test_encode(): + assert encode('é', 'latin1') == b'\xe9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf-16') == b'\xe9\x00' + assert encode('é', 'utf-16le') == b'\xe9\x00' + assert encode('é', 'utf-16be') == b'\x00\xe9' + + +def test_iter_decode(): + def iter_decode_to_string(input, fallback_encoding): + output, _encoding = iter_decode(input, fallback_encoding) + return ''.join(output) + assert iter_decode_to_string([], 'latin1') == '' + assert iter_decode_to_string([b''], 'latin1') == '' + assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' + assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' + assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' + assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' + assert iter_decode_to_string([ + b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' + assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' + assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' + + +def test_iter_encode(): + assert b''.join(iter_encode([], 'latin1')) == b'' + assert b''.join(iter_encode([''], 'latin1')) == b'' + assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' + assert b''.join(iter_encode([ + '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' + + +def test_x_user_defined(): + encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' + decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' + encoded = b'aa' + decoded = 'aa' + assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) + assert encode(decoded, 'x-user-defined') == encoded diff --git a/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/x_user_defined.py b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000..d16e326 --- /dev/null +++ b/venv/Lib/site-packages/pip-19.0.3-py3.7.egg/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# coding: utf-8 +""" + + webencodings.x_user_defined + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An implementation of the x-user-defined encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +### encodings module API + +codec_info = codecs.CodecInfo( + name='x-user-defined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, +) + + +### Decoding Table + +# Python 3: +# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) +decoding_table = ( + '\x00' + '\x01' + '\x02' + '\x03' + '\x04' + '\x05' + '\x06' + '\x07' + '\x08' + '\t' + '\n' + '\x0b' + '\x0c' + '\r' + '\x0e' + '\x0f' + '\x10' + '\x11' + '\x12' + '\x13' + '\x14' + '\x15' + '\x16' + '\x17' + '\x18' + '\x19' + '\x1a' + '\x1b' + '\x1c' + '\x1d' + '\x1e' + '\x1f' + ' ' + '!' + '"' + '#' + '$' + '%' + '&' + "'" + '(' + ')' + '*' + '+' + ',' + '-' + '.' + '/' + '0' + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + ':' + ';' + '<' + '=' + '>' + '?' + '@' + 'A' + 'B' + 'C' + 'D' + 'E' + 'F' + 'G' + 'H' + 'I' + 'J' + 'K' + 'L' + 'M' + 'N' + 'O' + 'P' + 'Q' + 'R' + 'S' + 'T' + 'U' + 'V' + 'W' + 'X' + 'Y' + 'Z' + '[' + '\\' + ']' + '^' + '_' + '`' + 'a' + 'b' + 'c' + 'd' + 'e' + 'f' + 'g' + 'h' + 'i' + 'j' + 'k' + 'l' + 'm' + 'n' + 'o' + 'p' + 'q' + 'r' + 's' + 't' + 'u' + 'v' + 'w' + 'x' + 'y' + 'z' + '{' + '|' + '}' + '~' + '\x7f' + '\uf780' + '\uf781' + '\uf782' + '\uf783' + '\uf784' + '\uf785' + '\uf786' + '\uf787' + '\uf788' + '\uf789' + '\uf78a' + '\uf78b' + '\uf78c' + '\uf78d' + '\uf78e' + '\uf78f' + '\uf790' + '\uf791' + '\uf792' + '\uf793' + '\uf794' + '\uf795' + '\uf796' + '\uf797' + '\uf798' + '\uf799' + '\uf79a' + '\uf79b' + '\uf79c' + '\uf79d' + '\uf79e' + '\uf79f' + '\uf7a0' + '\uf7a1' + '\uf7a2' + '\uf7a3' + '\uf7a4' + '\uf7a5' + '\uf7a6' + '\uf7a7' + '\uf7a8' + '\uf7a9' + '\uf7aa' + '\uf7ab' + '\uf7ac' + '\uf7ad' + '\uf7ae' + '\uf7af' + '\uf7b0' + '\uf7b1' + '\uf7b2' + '\uf7b3' + '\uf7b4' + '\uf7b5' + '\uf7b6' + '\uf7b7' + '\uf7b8' + '\uf7b9' + '\uf7ba' + '\uf7bb' + '\uf7bc' + '\uf7bd' + '\uf7be' + '\uf7bf' + '\uf7c0' + '\uf7c1' + '\uf7c2' + '\uf7c3' + '\uf7c4' + '\uf7c5' + '\uf7c6' + '\uf7c7' + '\uf7c8' + '\uf7c9' + '\uf7ca' + '\uf7cb' + '\uf7cc' + '\uf7cd' + '\uf7ce' + '\uf7cf' + '\uf7d0' + '\uf7d1' + '\uf7d2' + '\uf7d3' + '\uf7d4' + '\uf7d5' + '\uf7d6' + '\uf7d7' + '\uf7d8' + '\uf7d9' + '\uf7da' + '\uf7db' + '\uf7dc' + '\uf7dd' + '\uf7de' + '\uf7df' + '\uf7e0' + '\uf7e1' + '\uf7e2' + '\uf7e3' + '\uf7e4' + '\uf7e5' + '\uf7e6' + '\uf7e7' + '\uf7e8' + '\uf7e9' + '\uf7ea' + '\uf7eb' + '\uf7ec' + '\uf7ed' + '\uf7ee' + '\uf7ef' + '\uf7f0' + '\uf7f1' + '\uf7f2' + '\uf7f3' + '\uf7f4' + '\uf7f5' + '\uf7f6' + '\uf7f7' + '\uf7f8' + '\uf7f9' + '\uf7fa' + '\uf7fb' + '\uf7fc' + '\uf7fd' + '\uf7fe' + '\uf7ff' +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/venv/Lib/site-packages/pygame-1.9.6.dist-info/INSTALLER b/venv/Lib/site-packages/pygame-1.9.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/pygame-1.9.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/pygame-1.9.6.dist-info/METADATA b/venv/Lib/site-packages/pygame-1.9.6.dist-info/METADATA new file mode 100644 index 0000000..b318aa7 --- /dev/null +++ b/venv/Lib/site-packages/pygame-1.9.6.dist-info/METADATA @@ -0,0 +1,15 @@ +Metadata-Version: 2.1 +Name: pygame +Version: 1.9.6 +Summary: Python Game Development +Home-page: https://www.pygame.org +Author: A community project. +Author-email: pygame@pygame.org +License: LGPL +Platform: UNKNOWN + +Pygame is a Python wrapper module for the +SDL multimedia library. It contains python functions and classes +that will allow you to use SDL's support for playing cdroms, +audio and video output, and keyboard, mouse and joystick input. + diff --git a/venv/Lib/site-packages/pygame-1.9.6.dist-info/RECORD b/venv/Lib/site-packages/pygame-1.9.6.dist-info/RECORD new file mode 100644 index 0000000..e3f1d71 --- /dev/null +++ b/venv/Lib/site-packages/pygame-1.9.6.dist-info/RECORD @@ -0,0 +1,496 @@ +../../include/site/python3.7/pygame/_camera.h,sha256=4dX0hz1SNd_5xZn0kuwHw6-3pGxEOuj1XcENVbAeucg,840 +../../include/site/python3.7/pygame/_pygame.h,sha256=OQ9soShwz-VZtechnxP3TfBV1VM58l_u4w3p0D8Vu5c,28409 +../../include/site/python3.7/pygame/_surface.h,sha256=G6ICVNMqd3DqzBtTh1BxFxW1bs2fPrO__vcBUQtbwRM,958 +../../include/site/python3.7/pygame/bitmask.h,sha256=7FJpaFGWXPa581C333b1ObFfQkfc6i-bW1In5qjxwvg,4777 +../../include/site/python3.7/pygame/camera.h,sha256=jwdMpuVS1iAhbNgIjXvCcL-nolqbLdnwNlbrCjKfn24,6957 +../../include/site/python3.7/pygame/fastevents.h,sha256=OKgCTiH8K4ud2orTBJXeF5w3Mo0_ImbgRW5f5UTnCqY,1643 +../../include/site/python3.7/pygame/font.h,sha256=97S2JuIstaUlyTmmuEGGr_Mg33EhvDJZ5nlTTbU_6O0,1836 +../../include/site/python3.7/pygame/freetype.h,sha256=9OyIUWvVYfqIUZRNdTQpvVzdH2W7x21yjItkdc7GQZo,4175 +../../include/site/python3.7/pygame/mask.h,sha256=pKCMpOLRBF4KxnF-c9shrUPFbLbr6-LqDlEXHm_IwvM,620 +../../include/site/python3.7/pygame/mixer.h,sha256=hr5NeLohLT_ljX6FceMNK_10ASrIKhIyASK2YVtvupo,2258 +../../include/site/python3.7/pygame/palette.h,sha256=dzARYIsQdHAaV8ypCrQbYRWFisXYXABD4ToMlzYKojg,7057 +../../include/site/python3.7/pygame/pgarrinter.h,sha256=alsw7p6X7ukOB1o3curyrjWOcGHgVCQgCvS1D9FtiRc,1060 +../../include/site/python3.7/pygame/pgbufferproxy.h,sha256=hcAe-mipMYC4hNL9xIYVBwg4Aot4w1qpit84Zmkmnqw,1961 +../../include/site/python3.7/pygame/pgcompat.h,sha256=HFUiPlkczXkP3Bjpvz60iW9JiD6LKZ8L4qt2DL5KfcM,5927 +../../include/site/python3.7/pygame/pgopengl.h,sha256=hbNYtcJU3jxmvubD890dhSSE2KjzISXT76PJcguKV04,379 +../../include/site/python3.7/pygame/pygame.h,sha256=90tX-gvapUFv077c3Z22x8r17DB0bmMYfQ7aduxOKHc,1246 +../../include/site/python3.7/pygame/scrap.h,sha256=MhdSrMflRdBNnwemNm1Os5kgQ-tU9rGk5yN3qoMJza4,4594 +../../include/site/python3.7/pygame/surface.h,sha256=gbtI4NuqYrVty0iJLXgPwc_7tQjtRy1FJgHQ-bCeFuI,14554 +pygame-1.9.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pygame-1.9.6.dist-info/METADATA,sha256=QkfSJHGdvxbVNWr5ZSCH-DF_HJZhmXey3HDoc2yhXWc,444 +pygame-1.9.6.dist-info/RECORD,, +pygame-1.9.6.dist-info/WHEEL,sha256=u4Efs1ohefs6i6rm-BSBkNuQzwmF2Y4Na3ETsbtk2VM,102 +pygame-1.9.6.dist-info/top_level.txt,sha256=ABXdFGIAE2g9m2VOzQPaLa917r6XEu6d96RqIzvAWCs,7 +pygame/SDL.dll,sha256=ojgZcurGuaYJp_JYz_znx99a9qPqapg6IBk6y4LsBzY,388096 +pygame/SDL_image.dll,sha256=Zb6s2lJw2yE2dVtiPe2gAQIZeaE1y72nvUDIFPXkg8A,58880 +pygame/SDL_mixer.dll,sha256=gCWfoNXbyeysC3h28f2PZbajX8bHgr5cAfo-0fcAECI,644608 +pygame/SDL_ttf.dll,sha256=Zbu3OWbwIAEHVch5UWxPP8Sg_10BD2TFpOjlRkRKa2I,31232 +pygame/__init__.py,sha256=eowEkDP_hoyHbEdkVkDlV1d1SOsSSYx7rmWYseNWiOQ,11582 +pygame/__pycache__/__init__.cpython-37.pyc,, +pygame/__pycache__/_camera_opencv_highgui.cpython-37.pyc,, +pygame/__pycache__/_camera_vidcapture.cpython-37.pyc,, +pygame/__pycache__/_dummybackend.cpython-37.pyc,, +pygame/__pycache__/_numpysndarray.cpython-37.pyc,, +pygame/__pycache__/_numpysurfarray.cpython-37.pyc,, +pygame/__pycache__/camera.cpython-37.pyc,, +pygame/__pycache__/colordict.cpython-37.pyc,, +pygame/__pycache__/compat.cpython-37.pyc,, +pygame/__pycache__/cursors.cpython-37.pyc,, +pygame/__pycache__/draw_py.cpython-37.pyc,, +pygame/__pycache__/freetype.cpython-37.pyc,, +pygame/__pycache__/ftfont.cpython-37.pyc,, +pygame/__pycache__/locals.cpython-37.pyc,, +pygame/__pycache__/macosx.cpython-37.pyc,, +pygame/__pycache__/midi.cpython-37.pyc,, +pygame/__pycache__/pkgdata.cpython-37.pyc,, +pygame/__pycache__/sndarray.cpython-37.pyc,, +pygame/__pycache__/sprite.cpython-37.pyc,, +pygame/__pycache__/surfarray.cpython-37.pyc,, +pygame/__pycache__/sysfont.cpython-37.pyc,, +pygame/__pycache__/version.cpython-37.pyc,, +pygame/_camera_opencv_highgui.py,sha256=0BxVKRNVVKV6De4Fj7bjHY6xZgFPD7DG43X8sJ7YC9o,2230 +pygame/_camera_vidcapture.py,sha256=3MSVsbGNi7jRLR9o4MwkL7Kqwzfrb4PY4Vobl_IDjIU,3739 +pygame/_dummybackend.py,sha256=cIt88kBhPzgset-VkJ1D3bG10pvlXLevpqRgrHhbeuo,770 +pygame/_freetype.cp37-win32.pyd,sha256=xxHSUAVsul-ys3Q6vt3DU4t73_z3T3vVl-SDrsrfTgg,67072 +pygame/_numpysndarray.py,sha256=58IIFmOiKGbYSt8yiKSGGGztcmg3aJKcPlqhCMvTYwY,2616 +pygame/_numpysurfarray.py,sha256=OYIpTY3mCz87c1IF-IXiLrTmeUmDKnrpj2q84ssW5d0,12999 +pygame/base.cp37-win32.pyd,sha256=NV1mcLQs_ZKdQN-FQJLwndwLmYA4aVlcgnSDFEX5nrQ,25600 +pygame/bufferproxy.cp37-win32.pyd,sha256=14EfeW9ZJmp9z6OpmmI4_HLaKzX6VXnZyepWgW1lI5M,15360 +pygame/camera.py,sha256=Yop3_-IWJzFaJgAv-NiAlLKpLkK8guAEbpGVhdQ4IdI,2871 +pygame/cdrom.cp37-win32.pyd,sha256=05ZTJvJNbEBvMPKHcdO7m9Wj5XKWfsexohii0T2k73Y,18432 +pygame/color.cp37-win32.pyd,sha256=fts1DFDaWlns1mNHFbDGqrEQhWxaRoLMvmp7CqWIFRQ,26112 +pygame/colordict.py,sha256=3Xu50TCCxRdi-ue8Vp9YBGQpmKOsv1rU9bOxf3kpkR4,24175 +pygame/compat.py,sha256=ybSN_4HbNWvDJ6quCTklD1hATz8LyN0bIeRzN2yTqD8,3113 +pygame/constants.cp37-win32.pyd,sha256=CBnRq4pezLN6wcssvA7jNyUIWCC46s1G0oUaAFZwy4A,18944 +pygame/cursors.py,sha256=haMvZ4N2kCrHrmFXY161Q_tDt8zVaKFW_JNjji13n-0,10043 +pygame/display.cp37-win32.pyd,sha256=hErrzqAbIeDPMkJpxlQ8Jd_5LbjEVnpyJz2nNemvOGg,25088 +pygame/docs/__init__.py,sha256=29vwukb_6yJPWEe66QZQynt10HvgrYBmGP2vWm7Nt_w,287 +pygame/docs/__main__.py,sha256=5r8cR_y261Kf_QDTxmw9hCdFaVBGexXV5-OrQLbSNac,750 +pygame/docs/__pycache__/__init__.cpython-37.pyc,, +pygame/docs/__pycache__/__main__.cpython-37.pyc,, +pygame/docs/logos.html,sha256=Av4WDVwgX0xfhNJ-GJ2hFARHmZiDi_yv0WGk8FKzvJI,1604 +pygame/docs/pygame_logo.gif,sha256=XTZuyss-niaQhtGw78vP9MQmqIH_yLgq6cJqtb8hRtI,25116 +pygame/docs/pygame_powered.gif,sha256=JOcurZ9ApwPx420aiIOPFgoKFHkhpQKbll0w9-qhvnY,10171 +pygame/docs/pygame_small.gif,sha256=OT5k5n6OnoatNH9HfWETFx88Cr3PrUzkZyZritBviOM,10286 +pygame/docs/pygame_tiny.gif,sha256=vx7ERhvSpj51wp_qu-jISAgQr8E6vxK4_3I58-oSRm0,5485 +pygame/docs/ref/docscomments.json,sha256=MN3tMIlMeCG4G3qA3J52ZuR_vkf535KlPuRot9pJu8s,445603 +pygame/draw.cp37-win32.pyd,sha256=2W-iHb_BOcgMenXwA1WOTNDDaeytEISqdoBCtv5zmQo,32256 +pygame/draw_py.py,sha256=fQooMsO259L-Z56ZTJXliaxyVBPKLEUsrEsIrrmFBAM,17943 +pygame/event.cp37-win32.pyd,sha256=VD-QC9VR5CRVZX-4gPW9g0YSz2XcpY6KPvecm7ICAJ8,22528 +pygame/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pygame/examples/__pycache__/__init__.cpython-37.pyc,, +pygame/examples/__pycache__/aacircle.cpython-37.pyc,, +pygame/examples/__pycache__/aliens.cpython-37.pyc,, +pygame/examples/__pycache__/arraydemo.cpython-37.pyc,, +pygame/examples/__pycache__/audiocapture.cpython-37.pyc,, +pygame/examples/__pycache__/blend_fill.cpython-37.pyc,, +pygame/examples/__pycache__/blit_blends.cpython-37.pyc,, +pygame/examples/__pycache__/camera.cpython-37.pyc,, +pygame/examples/__pycache__/chimp.cpython-37.pyc,, +pygame/examples/__pycache__/cursors.cpython-37.pyc,, +pygame/examples/__pycache__/dropevent.cpython-37.pyc,, +pygame/examples/__pycache__/eventlist.cpython-37.pyc,, +pygame/examples/__pycache__/fastevents.cpython-37.pyc,, +pygame/examples/__pycache__/fonty.cpython-37.pyc,, +pygame/examples/__pycache__/freetype_misc.cpython-37.pyc,, +pygame/examples/__pycache__/glcube.cpython-37.pyc,, +pygame/examples/__pycache__/headless_no_windows_needed.cpython-37.pyc,, +pygame/examples/__pycache__/liquid.cpython-37.pyc,, +pygame/examples/__pycache__/mask.cpython-37.pyc,, +pygame/examples/__pycache__/midi.cpython-37.pyc,, +pygame/examples/__pycache__/moveit.cpython-37.pyc,, +pygame/examples/__pycache__/oldalien.cpython-37.pyc,, +pygame/examples/__pycache__/overlay.cpython-37.pyc,, +pygame/examples/__pycache__/pixelarray.cpython-37.pyc,, +pygame/examples/__pycache__/playmus.cpython-37.pyc,, +pygame/examples/__pycache__/prevent_display_stretching.cpython-37.pyc,, +pygame/examples/__pycache__/scaletest.cpython-37.pyc,, +pygame/examples/__pycache__/scrap_clipboard.cpython-37.pyc,, +pygame/examples/__pycache__/scroll.cpython-37.pyc,, +pygame/examples/__pycache__/sound.cpython-37.pyc,, +pygame/examples/__pycache__/sound_array_demos.cpython-37.pyc,, +pygame/examples/__pycache__/stars.cpython-37.pyc,, +pygame/examples/__pycache__/testsprite.cpython-37.pyc,, +pygame/examples/__pycache__/textinput.cpython-37.pyc,, +pygame/examples/__pycache__/vgrade.cpython-37.pyc,, +pygame/examples/__pycache__/video.cpython-37.pyc,, +pygame/examples/aacircle.py,sha256=mVTq3082ajYV7-uiYGCdjKldNPSZIh1y98_sqFDJ3g8,909 +pygame/examples/aliens.py,sha256=df5swn9ApFlOoq3Glbo9V7mnUmLCixwc9bgmnl8txHo,10720 +pygame/examples/arraydemo.py,sha256=UaIWsusqmEhKg9l520pupgwhGlXsN_Vz2Hk8y_Mdif8,3721 +pygame/examples/audiocapture.py,sha256=N5lSw4TV0GNVPW4rYs3Zz-W_o-zS_l4VJDXP4IvYhRQ,1275 +pygame/examples/blend_fill.py,sha256=DQ6UsV6qwK2PwuFuDhdTnlUBLddOwsD_loGG-xGi1iY,3105 +pygame/examples/blit_blends.py,sha256=roYwEUM6atE8mxF0Z_FHJlvVZ61LZVgg2rMjifmUvf0,5908 +pygame/examples/camera.py,sha256=UyKAwSHwV9_GxMLym4FO6O8WfyNuiy5xb2u-ewtZwl4,2756 +pygame/examples/chimp.py,sha256=1KllbxPCeLMP3GhqUxPcpXBTQVmSwxmbVTqyJWxVKwE,6016 +pygame/examples/cursors.py,sha256=kDG9Fv-J-5z7jFmrpCNVojkaihgTQZSyPO5GOhD8qiA,3062 +pygame/examples/data/alien1.gif,sha256=8Wveo1zpLVaFCtYITm_SoYqjy8L-TDuaZOcNa8Osqsw,3826 +pygame/examples/data/alien1.jpg,sha256=HOjXjmW4Ofsu_en9WNrkuIp_DCwupXcFB0Yt_cqV9rA,3103 +pygame/examples/data/alien1.png,sha256=femzLssV7oGvT3S2tyviyq7qO32QfhBDtMOR3ENBCLs,3522 +pygame/examples/data/alien2.gif,sha256=0MPpVYzvjAECy0pd7YRFKCEzzIYDKEJt70rbjlLbTZM,3834 +pygame/examples/data/alien2.png,sha256=FKGYDI2FBBR1Z56BLn357PNfh3-M38gAJpSQL8BpKYY,3526 +pygame/examples/data/alien3.gif,sha256=bFCRGZOQPaadCKIc-tlqoUjHdsi5IzR0E-2SjpPEvmA,3829 +pygame/examples/data/alien3.png,sha256=a51Tb9E4IvoICGzQChHq51RKVQJLf1GOCEeqA5yYfnk,3518 +pygame/examples/data/arraydemo.bmp,sha256=xM4-n_hRCQFZlfwwdTK6eaBweycUc863TgSFbWp3dbA,76854 +pygame/examples/data/asprite.bmp,sha256=97XMpKq9lLpMuv8UveCf8UJEAxheBhPUjHfMRQBkUx4,578 +pygame/examples/data/background.gif,sha256=-3kZwt99MFUBbBo-kHvPZXVlFrSB34XVNQWWxfHb970,9133 +pygame/examples/data/blue.mpg,sha256=XDj1CRPt1MWxspCfA3oqb822nlZgQ7CyyEuVJwlgmpg,6144 +pygame/examples/data/bomb.gif,sha256=T4VCSOht8tpisgV5rIQnBCPs7vtSzAZBJF7SZ_L6JQM,1162 +pygame/examples/data/boom.wav,sha256=kfoWs0VVDGHv0JSa46nXZBGyw70-jpfPq_B31qNA_F8,12562 +pygame/examples/data/brick.png,sha256=K_mshK0aL81nzOjAorTXyPps6n9mvofLeOWFXFpVjYA,170 +pygame/examples/data/car_door.wav,sha256=TwYWVqme5NqVVID1N4es92RSKEdTYkxbNx6dNamK-_4,3910 +pygame/examples/data/chimp.bmp,sha256=PS9dLh1kfgnmba5lQiKyEQIBi8k-R1kvJ832SNudj1A,5498 +pygame/examples/data/city.png,sha256=c0Nu2o7x7QmvGMDmDCaPnhvJ8tPNuguKKpI_Z-NfQ40,143 +pygame/examples/data/danger.gif,sha256=m0CBKalFbkqlohgOmrwkwVOfqBhRWonb7xm1pzbDy2Q,2761 +pygame/examples/data/explosion1.gif,sha256=WYcdwbZqmYdaaaPYFiR5vka0Anp4F4nnNlpSSx_1xug,6513 +pygame/examples/data/fist.bmp,sha256=Nze8jhiCNl9wLgNYtVtRBqUGYqbn4-frAZaSVYXm_TE,4378 +pygame/examples/data/house_lo.mp3,sha256=R0nZUXymMp_XLPU8S1yvsiVeWT6MKLt5Rjp-WSnVrLQ,116320 +pygame/examples/data/house_lo.ogg,sha256=64FiQ1Zjq-cOj6Bmya_v3ZjEWmBaGZlTl19udKaz6sU,31334 +pygame/examples/data/house_lo.wav,sha256=B1BwfFaPIsSxaash-igVI_YE9SQd1BCXRTnSAKsNunY,78464 +pygame/examples/data/liquid.bmp,sha256=qtzPXhq0dr2ORNCCZ6gY2loT2Tsu0Dx5YvXB548I1Xg,11734 +pygame/examples/data/midikeys.png,sha256=9HCCmMHvlubR6G9a0jMv1C-AKeBzYfb5jjNhol2Mdqw,19666 +pygame/examples/data/oldplayer.gif,sha256=NWEhmaE5FUe0J-uCF8fr-XUAnoaqWa0SicoMQUBFYUg,1075 +pygame/examples/data/player1.gif,sha256=3ZTVWGxnedKqtf3R-X1omPC0Y8jUSPGgHBAzeGhnV4c,3470 +pygame/examples/data/punch.wav,sha256=A0F1xT8aIZ6aNI_5McMqLygb1EfmdIzPi4kWkU4EwQc,4176 +pygame/examples/data/sans.ttf,sha256=nrZ6FRet4dwlvA7xOReYCP2QwyGebk0iVJaSFbtpOhM,133088 +pygame/examples/data/secosmic_lo.wav,sha256=-EIFkzj7k5qEqG04n7mnUGUp1SsyCJ4n08TzPT600DY,18700 +pygame/examples/data/shot.gif,sha256=bF2eY629zQzvDu83AKpveSFhJq5G4QpOE98A0tvbPFI,129 +pygame/examples/data/static.png,sha256=Xe4wN80awt7nTNiLemoSNTEKlAbGFW7djNETP8IleNs,1202 +pygame/examples/data/whiff.wav,sha256=FMWM3XnYtce6mHFXQCYPgzT-xu-Q4DJybZfpPjG8cpE,5850 +pygame/examples/data/yuv_1.pgm,sha256=WGXoVZ0O-c6DTX9ALLoy-y4LFeOEul-W1PqFjBXGL20,649743 +pygame/examples/dropevent.py,sha256=EnvfZWDNuFYF5lHihTD5Pe3BlwnvcAmJFFuVVj4qSDE,2112 +pygame/examples/eventlist.py,sha256=6Xjeb9KTdhfeGbxy3slam4iCbwHGlmLCKZeiw2gJmW4,3677 +pygame/examples/fastevents.py,sha256=5AI_PBXwXnZlqG-shmkzEdWBBtnh30CWcyS7SDkVKkk,2890 +pygame/examples/fonty.py,sha256=YMFsysZUCdoUVhr0WYi1jm_WTF3QzzbNB2vvuq3Re5k,2539 +pygame/examples/freetype_misc.py,sha256=LtIEvxRJFwwldAYy-otKQkwa-mm4yAMwhXhewUEN2QE,3543 +pygame/examples/glcube.py,sha256=Q7XdacBhYgOTVdRy5LVKqNqAB1vm5LVYjPp5aZ9FoA8,3404 +pygame/examples/headless_no_windows_needed.py,sha256=iT4Ifv-CRP71ebyd7oYIGjXyDniFCu3W49Df8SlJMLY,1333 +pygame/examples/liquid.py,sha256=pi2Wc_fwtb4StxiAuGqCV99a-Kp39mwPU6GCptaPSvA,2519 +pygame/examples/macosx/__pycache__/macfont.cpython-37.pyc,, +pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist,sha256=xhIgbq92qrjlpg57wb29TGJP0m0shOPN46mZMaumQOM,278 +pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java,sha256=u16hPcsJQdm1ylRbrg2zn4DBwEEIALLAj53CkzcykHk,5793 +pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib,sha256=5bgACAlsCG2ezXYqAOAKtoBXAj-0yU7JrIby-Fuj4Dc,306 +pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib,sha256=QZyXxX5PBZnb_A-_-Xd2MFX1YBHdJJecqKF4T0N1BJg,566 +pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/keyedobjects.nib,sha256=8IiTBRH77Z1V-WRSL1nYA_dQ5eAGbTRqZ6H6JUYCFBg,9442 +pygame/examples/macosx/aliens_app_example/English.lproj/aliens.icns,sha256=DuKpW8ACs9WR98NVge-Rda6bHyYhqGFN2EXlH-WmgBY,7236 +pygame/examples/macosx/aliens_app_example/README.txt,sha256=i6ixQdcSofTjmtIY5OKVdkHQ8TvyHjdcMroWzFpIffE,432 +pygame/examples/macosx/aliens_app_example/__pycache__/aliens.cpython-37.pyc,, +pygame/examples/macosx/aliens_app_example/__pycache__/setup.cpython-37.pyc,, +pygame/examples/macosx/aliens_app_example/aliens.py,sha256=e6wjvgHqDicdXHUCXp3zhaR1tjNdLyyzd-6vfJRv8Pc,9634 +pygame/examples/macosx/aliens_app_example/setup.py,sha256=dvNmUM1MRKe6LZvBnoM4Zhe8vLRdce1QcSJ2Zv-cE5w,578 +pygame/examples/macosx/macfont.py,sha256=El5xehQNCjZub57OJmRUmfJQrcaEzUND12lvjMor3Bk,4486 +pygame/examples/mask.py,sha256=ERdhkGFu6iPk5L-coC42vzeaK32VlCUcY0R1uVTa6Zw,5555 +pygame/examples/midi.py,sha256=djuCoTzwhcxWmtQ0PYcq7nfKCnHES8wKviIL4hq52iw,29990 +pygame/examples/moveit.py,sha256=xc2Sug_XjmAEsdyrBGu5sr3DBM0tO8_Z_i3MYNUo_PQ,1837 +pygame/examples/oldalien.py,sha256=mGla5IFZqIQmL3YQ7kNw4f7O9b83_XmcWeoSkh8vToM,6714 +pygame/examples/overlay.py,sha256=CLqqCwwOxIFKKZDX__7iZ7hH8rQ-tPr5BF0UERcdwkI,1397 +pygame/examples/pixelarray.py,sha256=WFoqKpM73S1CylX_2Tr15zvfnUoqnruQzwxV8UCEJ38,3318 +pygame/examples/playmus.py,sha256=lsOaUiCFjn_H0OOUhFK3gqhOBM_Kfyd22V6J6Vj56Ic,4564 +pygame/examples/prevent_display_stretching.py,sha256=0SrxOL-zECoN2ZPhYqH85d78u_-V_M8FG_FlWCDajtY,2741 +pygame/examples/scaletest.py,sha256=dRx3I3cO3uBrdrxrUEqKCjYLPyWlms70ZSUeU3bH3Lk,4689 +pygame/examples/scrap_clipboard.py,sha256=t1Ofdo-FaSsNt5TmrnDD6nZpgB6PN6mDNThDYrvEVY4,2926 +pygame/examples/scroll.py,sha256=yG4OCUDI4eZHXHR5viINt5d7qXRpcCVLSTVnG_SLYX0,6792 +pygame/examples/sound.py,sha256=ncjK2E85bLTk6IhIlBDKKa1hw_NCi2zHMk3nKPwqrrw,1359 +pygame/examples/sound_array_demos.py,sha256=5HsxrBo0uWXUHGOsfUXOxsCo3vQVjmx3c6vCrTxq1bA,6598 +pygame/examples/stars.py,sha256=M6_Q3pD9DgPVNfF0EtTsVet3m09ny-HlQvw1o5F5wf0,2488 +pygame/examples/testsprite.py,sha256=ObeWnWbPnM8D3W3tnhJFfGn1nEcYYfXzgSkHgjGLMuM,6910 +pygame/examples/textinput.py,sha256=JVRlppW4pCGQ_vYNb3Y3VAeusB0fLcOPko4F-OibuBs,5346 +pygame/examples/vgrade.py,sha256=ImMjT5H7_3JsziaxPFRLoLQRIk5H_0LzW0spxLTBEeI,3320 +pygame/examples/video.py,sha256=QP1Z2h1u99YFJsYOxw_5WugiBSuw23Z8qXk7huNjBDw,2814 +pygame/fastevent.cp37-win32.pyd,sha256=L9MrpjtZUw7Z0Ker80Otstt9Ssxvcc6sR2KDq5EpGm8,15872 +pygame/font.cp37-win32.pyd,sha256=mdAs513VnzlbprCZVlNT2CvxQzBqUI0x2ZpdU5i4gqk,19456 +pygame/freesansbold.ttf,sha256=v5JRJp8R5LNVgqmTdglt7uPQxJc6RZy9l7C-vAH0QK0,98600 +pygame/freetype.py,sha256=jIO8euGMhCUIzpTsRSZQ0BSEyLGiA24IYkuicmOAWTM,1814 +pygame/ftfont.py,sha256=vHzoGq-lEswO_AU9G23bzsKg6m6g-dJzXokhszW4z-I,6239 +pygame/gfxdraw.cp37-win32.pyd,sha256=gvliEns9EroLNa9rbEp8bqDX3Y-5V8Y_oGe5f7OEHys,50176 +pygame/image.cp37-win32.pyd,sha256=Y7dKGuXx0fdo3ppwfZTY-OT7VA0IKntfrRKHktqJQn0,24576 +pygame/imageext.cp37-win32.pyd,sha256=re6kxfu4Vbat78RnW72Amc-RRb31CR2tzrR_C3ahuo4,16384 +pygame/joystick.cp37-win32.pyd,sha256=Jb-dmIhFbnZGEcd4FgG2Y2TThBFmSOGiOao2J7JMOBY,15872 +pygame/key.cp37-win32.pyd,sha256=C1CK6P_AMQDvTHL1TWzBE_st05jc6PH1lf6Gmjzq6mQ,12288 +pygame/libfreetype-6.dll,sha256=ybJffOvQXJE1TZGdGULsmAIIaRh2r97AkRi4pnB7anI,604160 +pygame/libgcc_s_sjlj-1.dll,sha256=aRT-5H21dYTZrQQMDDUw453DVN6Uh0hC6Pt1P9XZoxE,99840 +pygame/libjpeg-8.dll,sha256=boDbHZa66kR7CDpCf4l9haIF0afKnf7cUbyuhmTe_1o,250368 +pygame/libmpg123-0.dll,sha256=QC7GWw34aPVDioDJZ21TL6ZCiDPprYzhsab9so4vK48,322560 +pygame/libogg-0.dll,sha256=rOPfkH9MUH2_vibvLp8GSl5m31ibzCU-ia9PcPU6JJ8,32768 +pygame/libpng16-16.dll,sha256=vRBOQgdF-6_qCgQN3VOi4MjlYyPxzyDL_4Z42Tfw4Ig,239104 +pygame/libstdc++-6.dll,sha256=LPaBJ00un80_L5DSMqcqFBUpPkvAN5ouMo0IqPRmq6Y,937472 +pygame/libtiff-5.dll,sha256=Wnbanu24w2I3ApKQCjVkuuoIlmNIdhdlK_RhKNZgmCk,489472 +pygame/libvorbis-0.dll,sha256=8Q34R4DH6C9ADmqys5sJQTMZnjjYXcDf_wy3Q9KaYRQ,174592 +pygame/libvorbisfile-3.dll,sha256=KdfUN2KwfFDDHyrOEfy9AmV99SyeuPsbDPg414zmeaA,40448 +pygame/libwebp-5.dll,sha256=07yxmM8qodQf1bhPGqHc4IV2w2vLrglbAnLJS1GcZt8,452096 +pygame/locals.py,sha256=8ZvWyqOqFiaPT5y7ru0_PHeCp15u_ecMqlRqNaNJ_As,1102 +pygame/macosx.py,sha256=H9QEz8HaEG__660Nz2mndCPpQHLEjf6jNulFy_3xQXk,769 +pygame/mask.cp37-win32.pyd,sha256=bpVhHRK5v3xWf5F8wWq-BGk-zKRVXQanuc5jSiTqRgQ,38400 +pygame/math.cp37-win32.pyd,sha256=wDRcpav3Dy7vg3_Au2i5pawHyB7mVKMt8HR4FolhHxE,53248 +pygame/midi.py,sha256=ezAnHYQ2szG9o3C_1N6kyzax9fnhz6CKiqlk27dormM,23836 +pygame/mixer.cp37-win32.pyd,sha256=yinrVXUg9kdeFJ_Ab4a0OgfgnjnoFxPGzfzsjdJnSSg,29696 +pygame/mixer_music.cp37-win32.pyd,sha256=s0_gRaiMkqvFfhYh2-nlNwdBOqzllX4kUIbwnDsNwvU,15872 +pygame/mouse.cp37-win32.pyd,sha256=BF-kBpJfgUBDzsQg2vVYyIG3z9b1NgruhyobDXEDyYA,12800 +pygame/newbuffer.cp37-win32.pyd,sha256=DjHMQEFiGCMOJJzYl41TBnEi_Px4pKf48lDB8WSIVeQ,17408 +pygame/overlay.cp37-win32.pyd,sha256=5NFsaIQvTexbz9DOQyV4z-Q5pQACpc7rEkHanz3KkRA,11264 +pygame/pixelarray.cp37-win32.pyd,sha256=BYX4w7j5M5Jz-kD_i8-MlXkoYcstOqvty_HzF2iNpAs,34304 +pygame/pixelcopy.cp37-win32.pyd,sha256=vUg8EzEsuETc-GmREbRxbT2Z2NbC9T53vmXYde2QAXE,23040 +pygame/pkgdata.py,sha256=sN89ew2QZXjAyc1wVlqNSOcPcK4z0cAy9Zmw29qkFoA,2264 +pygame/portmidi.dll,sha256=CAvCICL5hdcF7e0AyYAxwXhs0keZisJf7GnDq7mpgX8,33280 +pygame/pygame.ico,sha256=PBF9cw0Ca9Rw2pNmDD3iXvcYYQeI9ZzZ9vxtRLQRoJc,145516 +pygame/pygame_icon.bmp,sha256=Twnby8nv4HMhGka49n-47CPseDvwrSLZ0l1o9U2Bb5s,630 +pygame/pygame_icon.icns,sha256=B3Q59PaET66Br-x3wUFtoymOjJBB9cxEUEA74YE1TL4,53627 +pygame/pygame_icon.svg,sha256=oxge7RESGgP2--7fUmM7HnmD3vadIT5hjDykhVLcIj0,15363 +pygame/pygame_icon.tiff,sha256=cvDqNeR5SckSMyD6a7vNUsVgV7QYXNVWjsmC0BAUX98,61604 +pygame/pypm.cp37-win32.pyd,sha256=Ludzh0bd7qWAKmxFEB6zXbKzvYb2mMLuVNOBIO769T4,70144 +pygame/rect.cp37-win32.pyd,sha256=GS5jM7pPEr1RcEVBzwincH085hXjuXhwAYN6kZxuMxc,27648 +pygame/rwobject.cp37-win32.pyd,sha256=nv2g5qDHZLIFOaltWrPJPFroSZaLmkETKS5dKJcn2Jg,14848 +pygame/scrap.cp37-win32.pyd,sha256=5QbJTITc5bQDohvG29niRIJRMGTA3B2WL9R_bu3FUyI,15872 +pygame/sndarray.py,sha256=0zkFW14vjzBkA_FprdfwoWxt4UEeu4gOLkWXtLjk7sQ,3413 +pygame/sprite.py,sha256=t8_kbgO15FPjrBBiAxlKM1Y-mlSSv81h_0O2asJQYDM,56082 +pygame/surface.cp37-win32.pyd,sha256=A8EW53xJotXNYOVK8jZJKan3tVw5wbb4IYiWEqP7V4Q,233472 +pygame/surfarray.py,sha256=8FC0ltTJxGrxaZ1RLZ3HGy8ap72ePe99-uSb-zVg50E,10257 +pygame/surflock.cp37-win32.pyd,sha256=u-_o6cqOOcu8wv4m2KZOHeCjYH8EWXs8ZXuogfACRYU,10752 +pygame/sysfont.py,sha256=kfgHO6VDvDUVzj8tsL4reURbkKK2gs4R4HiIDpkF9qc,13581 +pygame/tests/__init__.py,sha256=dE6IFYHjVPdSDk9jtWne-2yjHXt1ukGOxMP37sBRfgA,1273 +pygame/tests/__main__.py,sha256=HJMNTIIl6i0nAbrghd3sQsVSqcyJleYCmfqt3Rv8ekA,3834 +pygame/tests/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/__pycache__/__main__.cpython-37.pyc,, +pygame/tests/__pycache__/base_test.cpython-37.pyc,, +pygame/tests/__pycache__/blit_test.cpython-37.pyc,, +pygame/tests/__pycache__/bufferproxy_test.cpython-37.pyc,, +pygame/tests/__pycache__/camera_test.cpython-37.pyc,, +pygame/tests/__pycache__/cdrom_tags.cpython-37.pyc,, +pygame/tests/__pycache__/cdrom_test.cpython-37.pyc,, +pygame/tests/__pycache__/color_test.cpython-37.pyc,, +pygame/tests/__pycache__/compat_test.cpython-37.pyc,, +pygame/tests/__pycache__/constants_test.cpython-37.pyc,, +pygame/tests/__pycache__/cursors_test.cpython-37.pyc,, +pygame/tests/__pycache__/display_test.cpython-37.pyc,, +pygame/tests/__pycache__/draw_test.cpython-37.pyc,, +pygame/tests/__pycache__/event_test.cpython-37.pyc,, +pygame/tests/__pycache__/fastevent_tags.cpython-37.pyc,, +pygame/tests/__pycache__/fastevent_test.cpython-37.pyc,, +pygame/tests/__pycache__/font_tags.cpython-37.pyc,, +pygame/tests/__pycache__/font_test.cpython-37.pyc,, +pygame/tests/__pycache__/freetype_tags.cpython-37.pyc,, +pygame/tests/__pycache__/freetype_test.cpython-37.pyc,, +pygame/tests/__pycache__/ftfont_tags.cpython-37.pyc,, +pygame/tests/__pycache__/ftfont_test.cpython-37.pyc,, +pygame/tests/__pycache__/gfxdraw_test.cpython-37.pyc,, +pygame/tests/__pycache__/image__save_gl_surface_test.cpython-37.pyc,, +pygame/tests/__pycache__/image_tags.cpython-37.pyc,, +pygame/tests/__pycache__/image_test.cpython-37.pyc,, +pygame/tests/__pycache__/imageext_tags.cpython-37.pyc,, +pygame/tests/__pycache__/imageext_test.cpython-37.pyc,, +pygame/tests/__pycache__/joystick_test.cpython-37.pyc,, +pygame/tests/__pycache__/key_test.cpython-37.pyc,, +pygame/tests/__pycache__/mask_test.cpython-37.pyc,, +pygame/tests/__pycache__/math_test.cpython-37.pyc,, +pygame/tests/__pycache__/midi_tags.cpython-37.pyc,, +pygame/tests/__pycache__/midi_test.cpython-37.pyc,, +pygame/tests/__pycache__/mixer_music_tags.cpython-37.pyc,, +pygame/tests/__pycache__/mixer_music_test.cpython-37.pyc,, +pygame/tests/__pycache__/mixer_tags.cpython-37.pyc,, +pygame/tests/__pycache__/mixer_test.cpython-37.pyc,, +pygame/tests/__pycache__/mouse_test.cpython-37.pyc,, +pygame/tests/__pycache__/overlay_tags.cpython-37.pyc,, +pygame/tests/__pycache__/overlay_test.cpython-37.pyc,, +pygame/tests/__pycache__/pixelarray_test.cpython-37.pyc,, +pygame/tests/__pycache__/pixelcopy_test.cpython-37.pyc,, +pygame/tests/__pycache__/rect_test.cpython-37.pyc,, +pygame/tests/__pycache__/rwobject_test.cpython-37.pyc,, +pygame/tests/__pycache__/scrap_tags.cpython-37.pyc,, +pygame/tests/__pycache__/scrap_test.cpython-37.pyc,, +pygame/tests/__pycache__/sndarray_tags.cpython-37.pyc,, +pygame/tests/__pycache__/sndarray_test.cpython-37.pyc,, +pygame/tests/__pycache__/sprite_test.cpython-37.pyc,, +pygame/tests/__pycache__/surface_test.cpython-37.pyc,, +pygame/tests/__pycache__/surfarray_tags.cpython-37.pyc,, +pygame/tests/__pycache__/surfarray_test.cpython-37.pyc,, +pygame/tests/__pycache__/surflock_test.cpython-37.pyc,, +pygame/tests/__pycache__/sysfont_test.cpython-37.pyc,, +pygame/tests/__pycache__/test_test_.cpython-37.pyc,, +pygame/tests/__pycache__/threads_test.cpython-37.pyc,, +pygame/tests/__pycache__/time_test.cpython-37.pyc,, +pygame/tests/__pycache__/touch_tags.cpython-37.pyc,, +pygame/tests/__pycache__/touch_test.cpython-37.pyc,, +pygame/tests/__pycache__/transform_test.cpython-37.pyc,, +pygame/tests/__pycache__/version_test.cpython-37.pyc,, +pygame/tests/base_test.py,sha256=VxGkbo89qJfmc53FdXjouXqAoWBhhCC4owFnYebN3LA,24055 +pygame/tests/blit_test.py,sha256=cl0dU599wvF2wwMRoM81rITzp11BpxQhxiP0xVUbG_k,4683 +pygame/tests/bufferproxy_test.py,sha256=VZukxi7C90IQq8mfY32uXPJdLZFENABl7UsiSWZrxlU,16808 +pygame/tests/camera_test.py,sha256=rcfoTOQKD57NaYS7uQ8_IUM45tjH0v-AS9VNrgJ-h6I,129 +pygame/tests/cdrom_tags.py,sha256=Ka5HOPip7wostxjh5nPQCPMhQWZzQtqCiOssl01fXEg,42 +pygame/tests/cdrom_test.py,sha256=aL8xrIPUj-FJzIBVk_VT05A1aaFCoWiJxMLtqn8PSsQ,9976 +pygame/tests/color_test.py,sha256=RMoVPGY4ctfObWfJiMF6IYa4dSFQuJRPSid1hSqVKuE,36611 +pygame/tests/compat_test.py,sha256=cuEgdQEKUgUbRJwn5TWqPfygOC_bbyO6Pv18o8XwDHI,2773 +pygame/tests/constants_test.py,sha256=8aeCXB2yg8QitImPVLjOAm8sPRHF5FaRlW74QVdAis4,1445 +pygame/tests/cursors_test.py,sha256=naD_joc1jPy1ATkDyZgsajb_Ez5oiLbV3C4OjgmGgrg,2491 +pygame/tests/display_test.py,sha256=AzRyb33RuWkpZPjsVHBf9f2tCdS2yo9vh0VE5HKeyDI,16299 +pygame/tests/draw_test.py,sha256=pIYeUxGY5NDLS8mrDX6AIoDjS-jub6JWdxR9SKs4EWA,51526 +pygame/tests/event_test.py,sha256=WJfV5VA-ULlnIKblNVQEYQYjaBNplVA9T4V6bSaoLLw,10698 +pygame/tests/fastevent_tags.py,sha256=m9CAhjZFciPRvWFz1fJu6kGZMNt2FrDloEkA_Wz1POg,14 +pygame/tests/fastevent_test.py,sha256=DjPLD3ygDT_bQBsIdPfz5s0xCa1snsPoiTu1_dLuhkY,5410 +pygame/tests/fixtures/fonts/A_PyGameMono-8.png,sha256=QmhReADwKrzW5RWnG1KHEtZIqpVtwWzhXmydX1su10c,92 +pygame/tests/fixtures/fonts/PyGameMono-18-100dpi.bdf,sha256=nm3okxnfAFtADlp7s2AY43zS49NYg9jq7GVzG2lPhOQ,1947 +pygame/tests/fixtures/fonts/PyGameMono-18-75dpi.bdf,sha256=4kB0uYeEpa3W-ZAomFMpc0hD-h6FnOh2m5IPi6xzfds,1648 +pygame/tests/fixtures/fonts/PyGameMono-8.bdf,sha256=aK0KV-_osDPTPiA1BUCgZHOmufy6J9Vh5pf1IAi0_yg,1365 +pygame/tests/fixtures/fonts/PyGameMono.otf,sha256=_Af4LyMEgKKGa8jDlfik89axhLc3HoS8aG5JHWN5sZw,3128 +pygame/tests/fixtures/fonts/test_fixed.otf,sha256=FWHmFsQUobgtbm370Y5XJv1lAokTreGR5fo4tuw3Who,58464 +pygame/tests/fixtures/fonts/test_sans.ttf,sha256=nrZ6FRet4dwlvA7xOReYCP2QwyGebk0iVJaSFbtpOhM,133088 +pygame/tests/fixtures/fonts/u13079_PyGameMono-8.png,sha256=x_D28PW8aKed8ZHBK6AISEZ9vlEV76Whi770ItTuFVU,89 +pygame/tests/fixtures/xbm_cursors/white_sizing.xbm,sha256=VLAS1A417T-Vg6GMsmicUCYpOhvGsrgJJYUvdFYYteY,366 +pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm,sha256=CKQeiOtlFoJdAts83UmTEeVk-3pxgJ9Wu2QJaCjzAQM,391 +pygame/tests/font_tags.py,sha256=m9CAhjZFciPRvWFz1fJu6kGZMNt2FrDloEkA_Wz1POg,14 +pygame/tests/font_test.py,sha256=-57BrYOw5XrqvkbnPZpEhUK0mCnZWsAqg3gEYXX24e4,19716 +pygame/tests/freetype_tags.py,sha256=k8pF6wXOxo6geb3zWRLafKemsFBJsaTbgLbGBdZHl5w,183 +pygame/tests/freetype_test.py,sha256=_2SFZTVVZ0LFtRLVPd-Q9BzjDa0D9RtpCxfNM3mMrrs,60454 +pygame/tests/ftfont_tags.py,sha256=QoCzxaa4QXJEtHTVWXauabL2GhNx0ZDi_cbkN2XeUHY,181 +pygame/tests/ftfont_test.py,sha256=c2adgJJmf3ppWLH6ASRBHymm7RMamtQifSeQyfZfTyU,534 +pygame/tests/gfxdraw_test.py,sha256=3CePp-GpTqkfiALwSiiCeI3LN_INJcDYSYf4-999N9Y,34365 +pygame/tests/image__save_gl_surface_test.py,sha256=Kcn8RGVkMSu7WUqMdpIgEQkZIBv2QLm0Gmx069AT6ZQ,1201 +pygame/tests/image_tags.py,sha256=Neq0in62AlLpXmGuEgu3X8-DLQYMaZfoHFyIcyxHe6I,132 +pygame/tests/image_test.py,sha256=wdZZ4i3tFMgq0d-blos7OSz0Ydh6EmX3HYGGzRhZD3Y,20747 +pygame/tests/imageext_tags.py,sha256=CR9cI4WIVu0b_GuPqczNqFk-t-hcWATTaOWSnAOIAEs,140 +pygame/tests/imageext_test.py,sha256=h8GgWEdcLuxAXPbRXgqY0AGTVS5aJfcBud_JBc_JcTs,2956 +pygame/tests/joystick_test.py,sha256=fvRuB3uaiewWcmbrg4W2U3tlKlxArWmMjTtCo0OoNKk,3254 +pygame/tests/key_test.py,sha256=uv8nnTloAdKfJ5uPeaL0oVUHbG2H48Pi9QN0zqMm8GY,2099 +pygame/tests/mask_test.py,sha256=3YW-64LEmbPYLt1j8sbXHJzcUnwdAVW0wLRPBajRT2A,75723 +pygame/tests/math_test.py,sha256=-re2ESSFIrR4yC0TX5BejVE6D5sJ24D3nnjC03fsxag,75473 +pygame/tests/midi_tags.py,sha256=kh-RgQubZpoDpC0fLslJZOOgKCuyANiJKWFPcuUXakA,27 +pygame/tests/midi_test.py,sha256=MC178DaLkqxHdtMSj_2hYN-JiYGX0nrw727gWalDFdI,13053 +pygame/tests/mixer_music_tags.py,sha256=tv3QqQFSCb4m5Ej67KVNbM0CneqEwp1cqdinoPD-wC0,138 +pygame/tests/mixer_music_test.py,sha256=B8F7V3Bf4FLQJOru1CrKd-eXTEq2JQXTcbZxsTO3OOQ,8371 +pygame/tests/mixer_tags.py,sha256=OxorCxCHpu5TIVo70M_VfQXlPU9ksfbpFE5giS-zb5I,132 +pygame/tests/mixer_test.py,sha256=pHAI2Msqv_I_nWbxgIe5A0Qy23CpJ-XpCXWCrUSA-U4,38752 +pygame/tests/mouse_test.py,sha256=ZhHxTcAyIuzDTk71EAo2g5F-u_Og9WV8dH3fsPltMtc,5607 +pygame/tests/overlay_tags.py,sha256=o4vxnSAG_uhNaj7lKUmbzpdwqldhCX9mbjOjtdsJLbc,66 +pygame/tests/overlay_test.py,sha256=jVkFbxEl94DfrMr0CX5eqLL6-cpJR0FLt4RWI1ItJ0A,943 +pygame/tests/pixelarray_test.py,sha256=HP1jLfIhnACqILGny28c5PtNW9Non4_qjf_L2IYa3bQ,56189 +pygame/tests/pixelcopy_test.py,sha256=y7GdW9bM06T22-sM4C87jA86pUNs15L2xrZ3HKpfIME,26072 +pygame/tests/rect_test.py,sha256=4EgyD0WEl6FgdFN9hcFhN55hvrRUl5pC4LKdcbebzAc,27447 +pygame/tests/run_tests__tests/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/__pycache__/run_tests__test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/all_ok/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/fake_3_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/fake_4_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/fake_5_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/fake_6_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/no_assertions__ret_code_of_1__test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/__pycache__/zero_tests_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/all_ok/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/all_ok/fake_3_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/all_ok/fake_4_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/all_ok/fake_5_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/all_ok/fake_6_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/all_ok/no_assertions__ret_code_of_1__test.py,sha256=yMOBw45z13s73pTx82OzMmYG7ZiSiQ_IEgMEH21_4io,877 +pygame/tests/run_tests__tests/all_ok/zero_tests_test.py,sha256=s30QH2Ae0zlo-IouC0UuFNYa5rrTwPI6UZ5PVW8hxUc,625 +pygame/tests/run_tests__tests/everything/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/everything/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/everything/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/everything/__pycache__/incomplete_todo_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/everything/__pycache__/magic_tag_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/everything/__pycache__/sleep_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/everything/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/everything/incomplete_todo_test.py,sha256=zZeKBjmqEtpFcHcuX0jVZudWaTxvM2oX0JToAbKLleY,990 +pygame/tests/run_tests__tests/everything/magic_tag_test.py,sha256=7fQgh8UMxCx51jLGN-5zhxHcl6ETegpYd4y4or5gqZk,940 +pygame/tests/run_tests__tests/everything/sleep_test.py,sha256=4t-3qQW7G4Wn0T-e2yMqCjBdTg_I7-zWFKXUkW6-9Gc,796 +pygame/tests/run_tests__tests/exclude/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/exclude/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/exclude/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/exclude/__pycache__/invisible_tag_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/exclude/__pycache__/magic_tag_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/exclude/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/exclude/invisible_tag_test.py,sha256=wYEC59vGVFIsidO0f3mgHir_nUQZRKbehaHq0A-aTy8,1006 +pygame/tests/run_tests__tests/exclude/magic_tag_test.py,sha256=7fQgh8UMxCx51jLGN-5zhxHcl6ETegpYd4y4or5gqZk,940 +pygame/tests/run_tests__tests/failures1/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/failures1/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/failures1/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/failures1/__pycache__/fake_3_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/failures1/__pycache__/fake_4_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/failures1/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/failures1/fake_3_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/failures1/fake_4_test.py,sha256=-fMHT7BiAm2z_b38xpCZw2y-jjNNVqxMOwEmOjeSXEw,1030 +pygame/tests/run_tests__tests/incomplete/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/incomplete/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/incomplete/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/incomplete/__pycache__/fake_3_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/incomplete/fake_2_test.py,sha256=0N2viyjn6Mq10bgcHP_x9rkUfyobvYjGRbT_FfJSUyc,970 +pygame/tests/run_tests__tests/incomplete/fake_3_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/incomplete_todo/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/incomplete_todo/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_3_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py,sha256=zZeKBjmqEtpFcHcuX0jVZudWaTxvM2oX0JToAbKLleY,990 +pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/infinite_loop/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/infinite_loop/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_1_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/infinite_loop/fake_1_test.py,sha256=A6bbE5P9J3jdoLCqGiGKZrI5cfjZy7nikBR_7baHqNw,987 +pygame/tests/run_tests__tests/infinite_loop/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/print_stderr/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/print_stderr/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_3_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_4_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stderr/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/print_stderr/fake_3_test.py,sha256=kmHeArRCqQ6CsZjSNxb26ftElmGNSZ6_xWQz2qjmZjo,1034 +pygame/tests/run_tests__tests/print_stderr/fake_4_test.py,sha256=-fMHT7BiAm2z_b38xpCZw2y-jjNNVqxMOwEmOjeSXEw,1030 +pygame/tests/run_tests__tests/print_stdout/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/print_stdout/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_3_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_4_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/print_stdout/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/print_stdout/fake_3_test.py,sha256=S4aPSIEYpWuOiSKB75WceZgLJEs3LqmnWqMfbuh8pbA,1092 +pygame/tests/run_tests__tests/print_stdout/fake_4_test.py,sha256=-fMHT7BiAm2z_b38xpCZw2y-jjNNVqxMOwEmOjeSXEw,1030 +pygame/tests/run_tests__tests/run_tests__test.py,sha256=-8bey9yXLmafecehooi3xCPScI6DtVPa5p13EkRkGoY,4285 +pygame/tests/run_tests__tests/timeout/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 +pygame/tests/run_tests__tests/timeout/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/run_tests__tests/timeout/__pycache__/fake_2_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/timeout/__pycache__/sleep_test.cpython-37.pyc,, +pygame/tests/run_tests__tests/timeout/fake_2_test.py,sha256=WQbZ12A0FMgoi0Jv-MGSf7K93GKCEA_NtY-s32fFPCA,980 +pygame/tests/run_tests__tests/timeout/sleep_test.py,sha256=f8oaqC2-JwlZADxCqScqv3PA2vfe2CDOTkv4efcdo-0,797 +pygame/tests/rwobject_test.py,sha256=Tg4T0vJDntlCrSmlv2d0yCj09QmbxZtJzZD5SzVkXpg,3865 +pygame/tests/scrap_tags.py,sha256=Z59xMvR6VZh_jxMGXJAQhLcOCrKc8wqLzFYIuFCC1iQ,417 +pygame/tests/scrap_test.py,sha256=RMQ-uB5kxEUMr4twvbP0r7ptJsH0jYFbd1SFqd8OVyw,9036 +pygame/tests/sndarray_tags.py,sha256=OKf8uXDz43bSC5YmOXme0CJ2R3mF33CWfVKKwV5v624,190 +pygame/tests/sndarray_test.py,sha256=VmNjrFkhAfVe0w3VxjLwLu7nrt9JeeIyUWA6rXZh0AM,6841 +pygame/tests/sprite_test.py,sha256=BEhFJlUSOEQqNg-7N7ffoPiebZ53YHo1fJiyXJF1ujg,43313 +pygame/tests/surface_test.py,sha256=oBUzoml2k7LJdITM4FNGH1rWBZTyut4w-NUOE54FUnc,100140 +pygame/tests/surfarray_tags.py,sha256=qBxxuyRGVht11RU3jpN78PPwxBkFmoVyinj0UTIX5FQ,260 +pygame/tests/surfarray_test.py,sha256=wwdi6lC5NQFPuZqnQXOdBM_xWLN-Gs4RsfdIkmr3hHY,25452 +pygame/tests/surflock_test.py,sha256=czBVDuVXbinJ7X055cgX6Q3uSUCtnZTd6vj6OBkQ9PY,4725 +pygame/tests/sysfont_test.py,sha256=cL7hDRuJtXfMKMvQHq8OyADrjI5Do3c5aCaOjCChg1w,798 +pygame/tests/test_test_.py,sha256=YTMzScCIzPnxzIIxhLvMuxKG2EfL9klWbC87pO4Eri8,25 +pygame/tests/test_utils/__init__.py,sha256=IGEBsBPznul3Ki-b6-3JLTm9zMos4r459fduBzoKSS4,5836 +pygame/tests/test_utils/__pycache__/__init__.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/arrinter.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/async_sub.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/buftools.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/endian.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/png.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/run_tests.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/test_machinery.cpython-37.pyc,, +pygame/tests/test_utils/__pycache__/test_runner.cpython-37.pyc,, +pygame/tests/test_utils/arrinter.py,sha256=XWN_5AHyOFWHrTeGfCvQn56jUgN-m13hjAOvjQ0kXLA,15234 +pygame/tests/test_utils/async_sub.py,sha256=5P6H3egMmICa5u83ek4iFMK84wDFBc4pkgGQQbx-2UY,9109 +pygame/tests/test_utils/buftools.py,sha256=nrygK9ouEu70oCi0d0bSBWHlvPH8ERnIyj5r0NeILbQ,23886 +pygame/tests/test_utils/endian.py,sha256=hxXVLc_t5P8_Q5ReHX6wuV-YPD1-jdsVszLDLNaMf7I,493 +pygame/tests/test_utils/png.py,sha256=3Q6zk1_oCs4cSJymYlDaUh3xE-dzoD6tguHOMNSkbYc,151218 +pygame/tests/test_utils/run_tests.py,sha256=tIM5nM5m3EFGPLAm9tLzDC5YMR86qbn3-Zj4KvPCxLk,12292 +pygame/tests/test_utils/test_machinery.py,sha256=sQA7HSiLYnmFfWC6a8OKkYw4xe2f9zYLHYHvEvJwJ6w,2404 +pygame/tests/test_utils/test_runner.py,sha256=nFwRt5Mv5KZcEfWhE2uFFoZYksMoop5g7VI9Un9hkxw,7729 +pygame/tests/threads_test.py,sha256=zov2oHktLZIrlAsvE_fP18TePWN00jXIYVLC5ltfq_s,5055 +pygame/tests/time_test.py,sha256=Zf-AcvJVPNMj4KNU1w1o8u21bJouuAPBZxP2cvkMkGo,6908 +pygame/tests/touch_tags.py,sha256=LsHl4hEKvNKjvGCZWC2lcQ9VZsvMmFbiynd9prQKM54,28 +pygame/tests/touch_test.py,sha256=b7TvlNGOGhODFk72A5IJf2v118XsJ051JH7hTchcFn0,1198 +pygame/tests/transform_test.py,sha256=PyYFWxUwZ1Hqpdr7dIqDq6uyCMOwHk4yOlvWAbTUTuc,39625 +pygame/tests/version_test.py,sha256=LlO7iW9dAK0dBdu3_7X5b-WzkSFArF-1wyti4OX0gZI,1339 +pygame/threads/Py25Queue.py,sha256=qdHdnydu26pfhdq7VRGD8j8cFN2DdYuxImUGdzLWhG0,7759 +pygame/threads/__init__.py,sha256=n1eKpbYy0KyDmVxUXKLgmPQL-UIJl5IN8f8VHP56CFc,8709 +pygame/threads/__pycache__/Py25Queue.cpython-37.pyc,, +pygame/threads/__pycache__/__init__.cpython-37.pyc,, +pygame/time.cp37-win32.pyd,sha256=LVScktX8MlLApDIxJgNs2Yxkx2ijPb9QR8GVoh9gPE4,13824 +pygame/transform.cp37-win32.pyd,sha256=RG4rS5_M9EsfLkuwY78VqbRiUbOUso2HpxGGQd8qeG0,43520 +pygame/version.py,sha256=tqiSc2GHKlALMPmW9w1EhflZzosvMYzrsgRvGR5OGmc,1965 +pygame/zlib1.dll,sha256=wC1usoAjk0lPP_9UfXXfKEte51hsKCSWqhuBDkumR64,99328 diff --git a/venv/Lib/site-packages/pygame-1.9.6.dist-info/WHEEL b/venv/Lib/site-packages/pygame-1.9.6.dist-info/WHEEL new file mode 100644 index 0000000..bb93ff5 --- /dev/null +++ b/venv/Lib/site-packages/pygame-1.9.6.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: false +Tag: cp37-cp37m-win32 + diff --git a/venv/Lib/site-packages/pygame-1.9.6.dist-info/top_level.txt b/venv/Lib/site-packages/pygame-1.9.6.dist-info/top_level.txt new file mode 100644 index 0000000..0cb7ff1 --- /dev/null +++ b/venv/Lib/site-packages/pygame-1.9.6.dist-info/top_level.txt @@ -0,0 +1 @@ +pygame diff --git a/venv/Lib/site-packages/pygame/SDL.dll b/venv/Lib/site-packages/pygame/SDL.dll new file mode 100644 index 0000000000000000000000000000000000000000..a3d81e546e779c93ff0c94fe1e1939ed5564e09d GIT binary patch literal 388096 zcmd?S4}6r>l|DX`Oklv^j2JX(l%PR_VHH|bXrRW*xY2@5l~}6SqSZ)SQK}QbN+39y zHq#;9e7mI5UA83#cd4Z<Z7Hx6bpk1gHmyO^8f(B*)Ak)F)u^dNMe}=}bMJlUok;?; z+wJb>w|q2n?!D)pbMCq4p8Nm43vaG>Wx8B05B?t-a=G^4m;XxS@A3asBl*<Hdrx)k z9QVs9d)y0tIc3qZ&)=WF;=X(Dy6?8-`JcP(o_p>M=HGs2{(Y7A<bVF2{P~}_F@O2J zcief&gbCvdH0iQ{%eBBgK7~<_>(mQQac7+6+6k$wESIas<?`nM#gG3xDCvx40%s_> z-H2hV{OcJbft)XnaUmK1@>M=&V1E3QpOP`IV$xhX#uYmgzgxz*{8U8xza3*-rG@E{ z$*`w>j4L-8w4uJwjd3j)iJr!|BzWiQAmD-@Lvjklvf71ENK0L1OE0<Ow%~0DW}l5e zEPEb)_oO10xK_k2xlbYX?LvA#(piz6!|+Njx&8k8k>bjE2!D1!w<G+kCcQfqJ<$<# z<vIh18&dI0Tr)~8`Mkmt9YU9)j7Nsy#V)z}hDBsGoqwu<$I96|0$%WLkuRTk(5>L@ z8v*aW`|tZ4P^8XKccQx|M#8)E?t6hKb%?rjU5rfohv9vU?EWwQyD`+4+v+K(M%k^> z9UfQYK*UpEz5Pv(EBs>9;LOXHH4WfTa6+rta;PPDX6%*&_}RlocgunLPu&Cx{^+8D zg7CAI_cgk9T(&G6^L>31l0%kz=8MtGJa>W!;}gERl`inIKx*hWp+3)E(uj2R`+hX( z7?^}(mA`9redzLKp}`Da%_~R)@?;A3SqLT!LoNPWKJ(fA*{;ajb^9(tk}LGCTT&`} z?`UK@ocVTiu_ro@OcQ5<-<&RAO*Z%#zR!biq#rEL)hv(9d{HxX`)Z~DQ$i?1%^M(> zOga-u;TL^1zhG?1wJc^Z59KawonPRgF-H~^coEKz<P;2bg!-~WSuC_0A}d{q-1ReK z@hgUghHUv8sbi}A{syQ#7C9Kas*xIJ)KWx64ule(IY(CcqNj(S4ZelI(6e)ntb8Lf ztHA2`fydRFMQpGKL{fxi##*zeN5WstVmVWl_cQ7}J_ce`)PGg<5Wg6K`nuqSE|$h$ zefcuz%gY}jM11RMaEteSFf?Rp<tawI$Oz=|s5~zGSX)FcN<h8D4+6z5Z~3Ppzr5+j zNNeP|P+wm7*~p~9_^f4>*J{HF-eDEN^dff`cu5qwU6Hv3)*rv^aY3VzgQ52_gA2ni z2Cqe7kq<%-g<A3={V<AK4~YC$0!pj9dWa+<OA0*59vXD7+GpMPK5+Z8VPqvU-%dPP zU$^r@A)myvRv0#p%+@(3pY)8r`TdEIGkLDc!<wtSAoQNQ@{x4me|t<A$FCKA6J>>U z&HqallFDTvGm?~i;XELx6Z+l1DJ`TaXYa_-pVMrgqV{zbF;lR5SZ6sH{~l87*k!m( zd+N(;&FZ*R84sH^8d&h`=z@a6==_3wYaZ~SakN0AzeNSv*2DE47jUx^&(}A4U!BFK zadmm*_sX@n`cYAn_T7PY-RB9%_L5of3|8-{NP(RXO^QjPH?kilK8}_L8bi-M_11xk zdXPcQCjTJ}hm+Ij6-QI)vofP>1PoG<(SSG9;|BlfjUGe^T$yj}0@rZtf$@82G4Whr zs^m6z6VW7BK5|{Fa{;cLhuEng>5d$LNClA9I@E}&qEVr7u6irOLGtH7)FkthB>f;+ ztVsf{ycC3Hkx(rOfyh@+amrPlB;q$jrm_PBnIa*hLzU-Rci)vs_G6_)2_<)Rdqy%F z%IL@@A!NICsW8;pCJNE&cBKU|@K8(6Ew>&}m1iA8KM5^R(i&8JlHVChH-50F%(B*@ zTb0aDsf=DBdjZv_q?l-JtkC+Y?)^YyOrogrO|+Wt$y6$=?tMQ6CDcPbPPC>?G&=5i zJq;mW5H_BxDTI1nN<*MYOtdop)25)LPy$zZU6o^71741Qja)_ts4+%c7r=0=x1kTo zvd7giYnj-kvd4nDKu#nu5Dg4O<`-l~1AhE?qk(Mvc(ejfN1H?E+7)UkPzpx8W>RRK z^;6hGpg$VuZ>7qh^!~as588;AHbDv?gpS3!_Qz<cpc}A=TU~=x{)_)7asjQb%pEEB z`gXbIPW6Q!MO?xY3V7W}VcaFbH#KzW+VL8iv-XHHpYMrSXz=sFrTDY%{LtVX>rM|1 zey-}1(BAye;NoCuyaYr;gB8Iq#V;4=eqYT&2oM^)pQ!f+FANQ?@YRGUlZ*idD}#t% z9XvHYhWN|9?)dvig!IvRN?&&!r0b8=5{?F}x>8SMp%ryS7xsttyPIDg>wY@&F>n0o z<7V+9%VCn#Svn3c_QoGRZkCa_B<`YAqSHvAkHVCBBIOVUH5;lL5E~hokLDW<^o3&X z=AN;U{m9|&s4HV{rK^e-AXWA49jcf@5Ea8>N|EbrHlab!+Kj}hsw!$?zVIBhGTn&i zl%Uzr@@%*DE^0jz=#An(v^ZbQ)o3$F7K`Z(#l#;yhJFfywg&o8aP;niGN4W2FmzuR zh>6*tSTGVRT0Q{XM-~EQVy!=Mrj&Ph0!&(&PL75yT{}rbbJm>#nxWWva{|_Vu~GAD zekco2LRJRI(aNl;p}`w{U;PXui+aKfpw^)tC`N?qKj@mug2yjlYM@Ud`=aG2E7k7q zh?cNLWV1-lhSpC{^#yc%kpO7*xY?q5rUkO&FN!e?r*pW(dw9txbj}}v&OeVr=Xmn` z_Pt^9B(Ap$l{BPYcSk5DzV;>N7_E5G;pFNQ=h&J{tyU^g)mBX`I6hRB?ec~H07C(~ z)Q49aTQ2O^!zmQpT?slw>j5B{H0wcFvhr@Nv@PWV(YeC}F}4a$#-IDLF=!875E{%3 zPEX7RmCbLUn>!D(Cayr}F^2pMO+%=Sp$vx3L8zCZfp-y_fRO7=g#Lg~y<sn+iQYvy zUu^QYtffF;13+~%tWgVF0|S&VQGznVs624e%)L2p#xkPL04mx{sH)!;JS&M3E$_$J zT^iA;zz78fs56}(9o&zNC^r48lj%k}((iag=&!HpC&y7(d=E&&Sp4uQj&abJ$aHFf zwC%2FpetH}0c#Krf>5-)OXe2VthL|+*V7fLXSXY<C6Pd<0P`b(4gpG$vk;JPcgcc^ z(4e<+Tx+1an(9Gc*NtD5aS7T=0{wZHZ&%3`zFqJU-I9GS;^PlU`vY?lJ6qxx13E=P za7l^6c)7vJH3A|&RMqRML`T>at=<k!;=FoPTkXaVI>laU?1@GU9Er3QNKkdL1YmA5 zI@-0GsXAM)%GQBw(Lm>rl(E`i_6nw!^KK9c#Y#zk%{*Po6Um0GOPj5XNHYakyp(@S z7Q^90o{t<n_SU0sAIJ!1RN%)QbZ?FHN8XJrY>$+;MFK4%FpF3m=+zaKWAxxmtGoaq zRK;xH?%3yJoB{(Ydh?8L9et02&R_3wu_FLme@gZ(q8MLzC3*%)&a(|7&mii7+X9&d zsi7MzC|bQ!@&?baGS?`BK^$@C?61s7oF*tnfgfLGw<0!cN8Z*4Pn7qrWZuGx*1+3T zIma6^mbfu^N@%dWaw3Nzi8J`OV*SFmUDb*4B6XZ21)x(0Gq<2+40?lOLxcX{gv4!v z99sCcH*qV#j0%8$Hn$wO2%Y7c?{Lx_oW$tdWb~yH&B(lD<k=Eg=@tI|#JI#*ks#sm z?GC)1^dS8Z2owCBGQrQXc8*0Ki~(XWpXBmwa*a!{!Z6eUo8`!{2=Uta=nj|z24DDD z(30GDw+4i8;zoA<o^T0V6Gl1ZUhR33<Sua_lz7P@Nbhd)&<*s78-PcyPuw2D03?|V zalVtd-tf92nSc&TNaZ`DoTMmkFe8C_N~8BP8Tw?yHP1vLt&jhib~w;P1sN?}EdbnT zG^ardHZkH?Q6&YCs6fMofO7?IEh#uOd4|g0T2eS6f5tMY3*+(y2?aktTAr;k%j$~q z0Aedw{fC%MA}g6sT<02{wekW8?1%QPU%bJI%j$6^LC*mP(b-9q8Y)Dqw*eU}&p^Hf zEa>e6Lqlr1_)DO&P0&GIgyb(W`5=Y@aFwB|ZdY((G|){0Ucn(g{IWOVH~8ZKw7Sl} zNwtaHC7ucpVIR1TMAkcqV0<M+c5>K3A{CJ`xJfU3hGZh8iq;Y=&M<OU$(Wj0Wg!UF zlhAAjq0=>?mp5x^YRkqXvy26Juw+bzj)B9+AT)R}{;V611v{>lj7^*q8XO~<*h=Dy z-!hsw0Jl}ooV!cBrXbG{WzRQ~+AsyV-S9_2ypBvIfTP~M&n>*&A89-KYV*5eB5los zlc(*EbbK*(NhHwK8t6rr;!0#5y0aJkL~)>N&7av{Xr+)Ayd?C<y6PqSU2hr*r$9oh z<x8sMJ&}6)H*_IU=_!zf1CCSPLY5G+SS*jK<G3DCqZSv)q_?N8Y{q|%LGGXB3JLG% zJwa!rydx552b<QCQXrFIYxNcYEQSQwz3Bj2Vzj&`w0{O$J|Jn!GChE}G(u!B)`;be zd|Sk8M8qE7?y}iNn{)PakYS><o@t4-VzNEalDT4+|6=QdJ(VyZKz&$Gf-IDRpv#*2 zw$bAYke0*6;FZ9xTQOs=LlxPPLy`UH1V`-}+al#Hkw7e73?i&7v<8SW1KrLvk(_o7 zp-W~}Ac{)~zFjoY9$59|v-kUIG9@3gu+Amgw`)-6@$K#>P4-f31-@NvLbC*J9AlR) zz+&IOs3148rXVL0EbwE&COfhK)A3ukn6;Z{FOyXepS2&HlmS>;F&ydmYSx<&MnPLz z1FSyROUt($zIDgpzz(oDT(a!QJ1<oI0A0rqc4k*Z0^46$zWv2px4p3Z2hs9vK!}tr z!QZI*TXKi*hx=I(f81m$qHHmfOE8$K%(do13R4A-7`K!7G%>_2agd#nm`}3kgMhi= z+!@QPwnx$CsGmqZJ9@!ZJw8ar5d*{vY3iF^*R`4$BjZI^sAWxZsGvM`Brw<-IL2az zss>%bi=%<TsF*NZ;<*x_4iLZ~@)#^e29d`gH~1dYZre~g7OFbt3S#hgjQv|ZGn(#I zdt8}L2T_FsQT7lVHxa_zMOwpgu+fKT?7}o`?qZ0;f8bB{)TPkL&sU>X5e8J-gjA4y zz#i$ygg}N&?C6=w8v7}fELe0T;EhoevM|8ZuH_t{B0{w$oyq`HXFjY_W$>(uxR~*0 z>3GxSpnFH@^G$gWYLz6AQPg7uv~F6n*z+>Ube1rG7~nu_)_k3im>!)(IMU&cxjUMB zGP0^M+VJgmRTKvXF!DRIk*Sz?Ht|;l2D8>a-I`UZDOjvwp|4ZN1jjcr5&c4?9yVPV zoxtqTNsO=in7fI;kv6d8{~f;FH7>H1C9Y%(m3at)2TR6QC+Numm@b7a82wRQ*;q8e z(*4bYnd0&zWiTagRQ{?KAM^dN15qgn=#iM+B$(wp-RlQ06d+nM9d&rNfuobC%jiNc z+yj?vhB~xP(Ky+tThP2)rsh_oQ4IQhHSa<x0MJijkeU~7fM=fPMPl&F^ZfYn)qDtQ zi?2mA<t_2c@{9udBqleqzxmb4?v6u)sISBv48=G~-i5OCqc#MF=4AfXkwirk@2mA= zT$T|E^tnUJ2i!6uYmVnQI9Y}zdQ7k!#>tZLI5=6F(-R|e>Ln)&oO+#{9z($lgB}BP zi*~qoO^^AnP>y0<SC*;kFN4MWG8~gCT5}Ip_z|+pIu2F>kq{w^Lc3zbzzhr#nJUY; zHdN|xm2igJ4KmU4j#__nRR;_S3PT*F@4=F1cZRK}>UbaA)TpA_!Wii^V_P&WNm4W| z>v2RgvM9-HK}QhnlSVWcOP5h>XNqFKHJV~qb3#e`5w)T8nDlBRf?}V9iV%^iSVY*0 z-88aVJ4aA!C)L^owRR@e`cQo1@dUF)(Q4I_CIw4XYf{p2ZKDV#N`)j!skWHI1*=ze zozj5dE704ZVU)>83&Ao5<!@-eH#)!G3&)V39_QPQfs72(yeD=Ke}Fz5?%_|idsv~} z!%cJ#zi~9$eh~>(FYci<cklNed+cJ4iR}R~8_<Q~C;Z|C)Uu&Ol(=irO#8>cDI{y9 zGrrP6Kh-H5hd#Um=%el9k0=NcioON<y-xaPIOvb!3U+J5a4<aduCqw-uL#ER+yaJj z9qFDy`3_^iXrMr9AJq{^LT0qQohH)`4}o@=AwjgmY`6%IaS^`o3hoNd)lTk&VyD}- zE(g7tEw;nFmDt8>*kX_3Bph<uVyjY&B6j%1F61XCtdNHUV{~`2Ni8a-_!H%E?CJmt zD#LD<4zG+xD+$iZ0G_FgE>uRRqcVc5j31n=$mx|~I~rT$)T(fJnhquMD2_!$Rx+xJ zfXJpIMiRN6jTyFcQ+av0qYWeW@8Em7pe~2+`I+r|KCgYx<@7yU9c{Ni#rKrtruEv# zcRJ__Qk>4m9fVVz&Parh<844V#oN58+aw25qj(!*DddzKI0gp(=bemq1Sd1a6lfG_ z)6Mzs=UYaS_Wl$5mdA8M9j5;OQI~?k409=%$=Soe6hqOHrmOz%<4H!4R6L1u2oF#D zw{;?=YJS6kW~ZzG`YW;bjqwm1HD?bT8j6FkBV-Uh(k$kp(DFVw@BR!9N_HcEUj<h` zvDK<#TosYz@Zq_{&FO5!U8J%xQy7eWunSCoU}1@SB(LGZ5Xj7jeyv2W%V8z|)h@Sl zgyG&YrLCRN*3RT?@BrF|?Q-+u4`H7`W`n+(XJBaB?cR%pg!o-ZN-wr(w-kzk(sR{B z-Hq)eqhS=i3W^<L6uZk+8+gtP`vTAUb_Jg6up;~M`)r5h?x+nMg35in%AaFb%WZC^ z)S?Dh55&GWa7YKy9R{9F20aLxq$~v+mHNUDuq)n%rN4CXrPhXvpRBof1AC<9y(obN zF;ICZL5BbsSO%T}C-l3qSFxAhF&Jq^@EJSkZmSLa3L{aJ2h%$>Bqah1fD-^H&%zF* z{c75w$kUQ8vzmpV>4?MG4dnTi<f$uT$p9xyb{k9ftE}NA>tRucmyDC$om0(ZcY*PX zY29YLfJU*rJ3F+z$AjT(%Jj@R@5SN*21}_E-~A~Q-wvQW4W{iChgi|O15X2RGZs@~ z#1;kG03VbD1-Gc7Fy<^6@(NC~B@=GUiq&8kNun^0gb7zPzv|U#S)A%<80#?QEsnIY z2p`mGV+cFa#v$CM)35+j-sVU<#gR5XnU<`CXR)UlzZOk|I!_-dr0X)>J=;B_t;^Jb zUQ)T^{t8`Ee|kkBsa8kXM1Q*6nJAl6m!dzNCVF+`6aDEl(W@g(^rzEAuZ}d)pH36K zs<bp+zOP3Ywm*d*mt}=gSU{?$q3=%`^c|xaG?%7B%R6DvT`=g;CkUtn*l%)hZKnOn z1qW6_3{3Y&_Ct0bOc~2y&4`FOBHT3UC!kMS{1e;~LU<p-%xS`V)ii@xV(6eZD28rN zG?;<P;w*!3Mf1C2=m@hy_UbfN)Lus#D`cNeV@2(Aq_IMt&}powCmd<45R=A=(rL-c z*-JzJ>`Cf4-O%lEh^^yPLr*GQ4E=AUV^vd7p)Ru<<$|JZJ&Im+8XJI9$D&uACi-^d z6TRv*(YGT_^s3WD-;OlVt4<SrtF%-d*E_5n=J?kS19qPDFrbDF#4HNu$8SMrsfPhS zOb!F~VSW_nB^r@W+TsZZSr`J`=^R`Aw+sP{`YIdZjU#l1#~++wgwl(l-~T}WZp79j zlt1V$#Od~=AGaf9_?p^>=Zw}I`()(O?ft*dhbI*|o&%zPGxPZLaZQ>|(p}X5ulnLN zokT|KQ&WvAwLhIcnsIsPE|zz~xc=|<r%46B$$s&olhjqZ(fyz37gKd5{Tl|#|Ft>p zNS)hkHOG|+oNd_0Uj;x1m5=!;_6hqiG2^6DCa9Q`BXp2vu6HVbi?Kv+sOOKNHa~_i z!s5SNhTai6=>KvVupNuO8Jn&618W;rhKi|we7$0V|L<3d)IDUXQBOfDu~5o$dc(GQ zag5(C#jq{oS4aVcxHr_sBLli7{ze;RC#n%C3kA>%PJxpt4mRz$M;_|0=47m2Z-X1d zdYOA;q5{|=ZYAi;1E|H&o7KQIc)zb$U)k%b7Tmvh1MsBEH9}3`s1rr64ZJRZv<_Mp zg~V#a>#}=iuSirL5*d+>^8C$ZJW-3btHp~;0yum-FaAvof|9z$GMs7Wwsoa8d0W@N zPJCtrWn9gLERJSH7j`2vK7)IWLJxmMX)2T{A=!vDRk^!fQU5Qxz!O#KU#hUX;u&@? zmTXV3%D-K~<6G=1N!zPg2jyZM-se3j<(6b<U2E-T>Y%C`<-M_BW~*N61*h{+FLqWO zB4rR+O}+cVt1y84UspM&!kT?G--YJlPudmqzgB(ma~v|JY*8FV2~f)zHsY>5b$_BJ zWLMRQwOr!Sm9DEfO9yo|kI_M0&0}>?*_W{poJXb&n3jwCgiZ^=4H0c2Vn5j`XxL6r zLBkej<A`k7`cx2Xlh!qak>dYS>w2Bm^%Xr!a2y^;Iq~o_Re@Lz?^C+?@2o&mMY{e> z6{-5OEkjqJY5%$cO%>@1L=`0~p_p^T&DusCB~3fsaW61ntXMPT6*1K8e`i^3s~OQ) zOT5~4bz#Tppf2oq9n^(AMF&+487*pKHCoihYP_g6R-;7}m8NX8h~uIR8bilL0jHtk zq&|bDec|9dgGOWyXb?0a<D4{uMr1Y6D}l(#`uXbLt&t2Ln98V5-`%+^v2uhl!10Hs ziK}(To_c!lFFJ>y9YnGN#+dQ1UjsbR7-3W$$Pnt<xO2Zb<wWFPRHnpjMla3|frr6i z4Sz+$!lVFO&fK!qv$I|Qo3!?Y__$HJz`tdQ<6Gg4jaq&Bu&M`V?c&vv@YiWpIyyCq zvfKa3_OGZF9I@;}|E_8U_x+N?ssCwvR)eVj2i3$^p2+zpZvSfy^Z4q6f^bZX8{*n* zH^pDomFVb*n%~Vx>2>%04^^j>MR&Kxou6zEgp%f>r06}3DSYJbVhW}DOo(b1*k*n) z&;}Sc<ayKOH<%*+MsB)1`@-^PU%b_NVfk-V>I>EjPrVdB+~xa92eb_|b)rPiBp1iO zXBsq)aP_|M+TmOKaS8w@9TJxbC;#C<zff!^#qxIC9H3j1v#4Z_<Ri_<q)w#c{CicO ztMccG+e3F+A1DGi8D^7Bp0DpqU^xhL>0$Jr<=q5u=#g_OsVsWXnQ9jM>*IX?DZM;* z>8AwLSs84|%XMkB20@Lb7EjCnJIcSjTdmg&6G#=9N7oJSpC=wL#p6U&xO7Qra#g(? z&RT(sJxAWr+|o;(!nO-@>Er343wp3Q@2@9vx%D?aKZ8La1;ACO({V?qlvk3nerB#D z!R(+*41Mg58drSG9g`wNx0aNl9+bProgeHG-hlnZXPxVR$vdEU8faGZ*6ip)T%rcs zyo$)JowW<GiHtK5V$Q9kMPf;^xPWTM<-u5)`hs<MaXxl6xvJkjvqP`C1uwJB!CyIz zNqQ{{H>6O)vbs{-Nbp9kE5lzr<<L6+A@7Wj&sgT9Q!TfMM#o=#of9AAdAFhsLXq3l zAzZfL`pnhy{D6Y1aS_EAwol-V#DBxJGnPTP!zKB~W*AzWpI9}j$Qh-QC0dea7FqHX zg|3*+i(C4m6!+kX^44SNtK%a$!%{O2Gp6dQ4tM4J>Z&&P%8!mpv;T@=@*E6w(5g`? zBNHfPR4xRiF_r%~Dy8%0%vgr3nB~Ic@*=z*rACOlfQPeIvspbw(u?zjB!%--jxOBP ztAr%FeQ0D<h4Cq=k?muI!gbu)K>?CwqsmYf_-UK7f9+1lHKwu{a%HSiE_9@Nzw}a( zOKV9N>>aycih!qbbOPV|uwAg>#`BR;%i}MC{X*UjOOAUDH#{cdRW4j!K1Jcd81CNz zdhp?kz0rj^dnbnzpHvrvv!pYRJU8t?bYcFmc%BZKbHG<~jdU<M#ew{_%cJ@krhJ@V z6i#@QWC~s;S%)_T+`&^5GkDqgEZ%NDH&K9BFs3e=u`Dqaz_fAzc>q3p6M)kJyz?ml z`m*>Ou)w{3I)}qq)v%GnxAr8y7!82UfUrC%W}WZ_!Ypf{X7<SSnwjg9NoMWf0%m9) zU`9VrW+lTlURUbH(WJ=yui=Nr=lfxxkE`Txq<M$#><55~>t5JHU~xW%W$u{h@aW5t zL(OrFOb1M`quI)u)4X!C&?&=37&f6+ePNl0GCJ+M=;iGI*??M0av-2fAowEXpv`@n zR@|pCaky<d%e*MII8>G6s?3U?g?(moGw))38xQwxgFb<AGk5{EC*Dp>GQn9A9K**Y z{MGP;Z|fr#UjY*V)t$U$@t;6z`sgJu5zq72^Il#%!1yLvp~;pd`Bz{YuY_XNP+3l0 z**ZM~7>k(Nz$++{oZCac9C(Gpk@^@a0kPbD@VY|*KB?ocD;tWGvrqe8{NtbugINb* zS_56x7_DI_rOtA~3~47gnu(2o=Y3D$|5TQUl>svz%jjUTxs+8L=w6Fuh;F^@kvI=G z+;9=T3UOT~4vQFacR_87K(M|P!D{0_7PD<1f@H0MHWws=;5beg@W-2^#<J7*RH+_x zI&zTcpzleXFH98|^>7fHNYADern0p_K^eX$%bC4}#j!AgDGs!+g_*V^#8*xbZmWV7 z;lwLb#cFv?#{v$CV+10~hWoM=?F%p9^3xH~a!i$J-$-RrMbHP(k|mTf?S)W#hnEQ_ z%5)KQwqyw<+a6seX5Ygy^<sot9Eh<@xboA>G9kQ=W!k4U)}#~|#Wq*<0!ckyFiM%^ z-J{r_F)VuRN6B}O3Mmur>^4>Njw<1jjEbg*R3KX7X{s@xx2e`f$*ySHU<XdEX!^Pe zgkl(d58&A$XmlXG_V~b;s`RFMpr07)8yd^EJBuJ57aAMn(9ZQX%5X8tpdKasvU!K( z*5fdR!@}iPPemjr%mST&IkAcQO^u4l5)P(`6u5j<9Oz%SF*z6v^({g}tPO0(%Ph)X z`e`q%fgOJkBigBc_NbqI>L>PLX*4b0lAkudzSxT6w(`^Ag5PQlbgEF7O6yjbJt|+X zqGG9^KK`h>^T>@%oXd4>QkRrbpJRMaw!y;XkRqd-@swOW9vkF^THb&5Mgqs+gtmuz zcsmgn)Wrx;P@Ht$9(vV}R|VXGV+jtPX&tysOKcU3+xJjM6>P5`RA`_G53GfO4j`PG zBRW641G&<958^2R-#R>RGe`%IM*yUq!vDjFz))T%QN6)2lY()Oc@3Zxy64k*eL$8c z^z?5p>We1o+l{jKee38uJl&i{!(+jIh{;(Nja&lzWdxed3k9TwyYr8JO1+@qWt@7F zg|C1>K9_aZPt5BTQ}sC}u<zIOV5AwojWPIlRNxLWc!FKPnC70$EVeKll#Ty_T|{{& zRD_Ydyo`r6;OeSZT)5be$C^^2aWWED^6}sxp3n2`dbasxZ{!dnRA}7O)Dmr3a$f|e zeKN==ripF;lcy=jC#H!To+nRJkU>+q3^ZJMUI6+7C}-OBshsqb4(5Ty>%I$CDSN*X z$K$(L#>NGA(biO+GaimAaY<A~&ocr&PZG&VFCCTi9H>bftSkE<#Rkzw#s5Vb03Bt_ z^3(=ijxNO1FYvP5-S6b%BAkxWKErs`PL>2r&)r<r%{D0Afm~1LO&Jmj_4tGk+pHqg z<s>xsBnYA6aQeo|2vu1w-#;xu_XxpN+lo!Ypu-LnBk=X}<=sDdcJ1Lscu$*cM!$E! zwj_N`3^ge*`<neKz`mx%fZnDy8wGt$yB$DZ^D7mQzUEj6&xF7kr1v%OXQr>|0D4jg zyxz3FuLVw*E;~E}I~f=QE3a)Sue}xJL*zE~vt9k{P(M4-a^acx;2<b|_KlIB7{{Qk zffj|*rheMhPlx*HRQbA8zHXJThxzKlC6M7~u0yky?fo>uc(M9O<j`A>Qajk+!P{oh z8bMKm0X|m2DThcN>hZu|!`1fU1xh<E1932g-a~`VST|y^G}zlbnBk13!_Pd*wK6ZC z&*@haRjDU%=glAC1kb${;}LX=-dgoq6jJ9dUJHtNS;Mn9fgLB2w+2rIt2p*YQM^{y zCr`lgF)_bjG0tLtA?rWn6m_j{VT~l;ioueKACqQ`{?%JCarFiOM~!06@4=SwKOf~p zPms$7F$G$bS<--#5(A<EGLZ%`zymQkLJ`$&TGt3vUQ~~pvh$L%jz)!pb66f$36Ev^ zzJ5C@SzCB18UyVa-3rzVLsdN)E6?LQFH--Wf<lg5R=~8>V?c$7#)!UC40^;~4BjJ) z#-G}Y(WLEOOtWLh%JX{8UhJi^(R;B*ShkYl5orz5dG^QelkrF|EYTHz9)DmmbvZw0 z5VHhYN9wSySveUF>)LPuPX>O@3>{I|R9CeuMir)#>cFdqb=kib%H`eer=t_sW2N2g zVu$OXP?wG7Jpd;jVW;P+y$Tgh5u~miczCN-UMa#P#kj#V@^Ytu-k(dn;8BcwQxBbs zs)LHPLh&#e2JJnZJ=~1f!6+MN#11wTr@RMI@S%P<W4^o$GaFErDDT341U3Xk@WeWH zzznPV_FyTvxyOUXM>o1|i(RqWg{oS{*b*-EK^QY9V6f{&pGb9~i?v)Z8;XaCp!yl$ z51#<6%*HSjmFS8;tVSoKa?!`&SvUuhNA1p%Q1AMx-cMb1Q=k$Xz`Zb5PLKk<tpV$X zYp=P613AI{(^bsbv%X5AE61&`>S3lJpFvtoYkuTWdP~KT;~`!~#z>apU?K+h0@u(^ z8NPNs9#B^ab%7S8Fk!JAx$vrJsH)TTfGzxQ(KKX?)UBSY<!hlW^D1upTrjwe(1L4k zTonAaO!Y8gLdx=Bz6iC3LQQZ8RWFT<C(9vFAH1jZ`&j6V@hRCnuG-+~NPLuG3ox)E zK6qNN2v11{uS;N=N9v#xZ@A%2a$B~K3dMdZIdQMX$$KXi=WNAQa6WExWT~OJEtK)| z=xB`Mxa5<L6eH4n2U07L>fubhxnOJ_kAkP9at|-y8&G)FQ-&XYHX;r@PL)!6`R<-S z$VI8j%lRs8<rr>n@Of3gdg?E6k(PuD021eQC2(xOB*PI)4cE)_jgynab%A;*>!v2m zo6k2TDaoJ<^~<AxB;$2KrW~^_p2JrTgE(sdfbuUF`E_!td0Y>Q!_0%{T*N$bQPlEw zE{=hG%RGK01`l^}aGhc}jIXSPZF=QZUX&nLSzr#i{{$}&qJr_}n3OWHRMeA(l!v!~ zok&=n#xzUbgM<5XJ_^8cqw~g_ahPcAmnSW9`3Psn(cex%8bl6Nb&2}LyuS2tyhqBX zKj+Fzcqj*!+3;qjdJ9IKJw@)e=)zuJMJ+1trV&6Ze5?{r`zbuB8BC(|BAH)zNV!58 zH7!kT3|N^29hLo2(1BFaZwS)6c+6JCu&d9eO+iQhe4Xk`vgMUU#A4_m8!eE-W!?Di zW;TAih!3%{qc?asSHUlzEzcH#^$^w;8mpy6Xb?=Ze4ruxM2cI$4<Q;3{;8QhhB_37 zj~J`xXYoOX8R`=fR_7$hhpvGSsE=>WD*UPXP(y3hbU-8lFRhDS*vM2thSq10D6Fya zqUa>zB1l_Oaa?Zj9EEZJY>Tv35|Z4&=Ub(@O#2SflGN23*T6$E(XCqaF+kVfLda^Q z$fgoZGd8#!TnjF9CO#s#a{}Hqlw%HgeHgrCG@CfL(FJMIihKeXmEx(=ML;w~O=s{P zx)w0dui|pPF`UOU-!VL@z_!JMGBlJXwJS?7EZAq@oRlo(v`8WvcI*;iG}j<oqlZe> zR!X}Xpn3<W@(0j22;M!wQ<Pw-15K(L?CPq6@hZnDb~4)(0lFHBa|8jC({>_IHlkFV zG=|1(B|zQ6KKlVS89u1a0OQaBJb_BX@qN7pIUBtWfgvOs6&_1Or(QLX5rpR)$gEtd zSLqWN0P_exmmd~_P@in}@GU%d8|Eiy##kI#`68P{d0*&NH=mLN9)e}r!%(NGw-E43 zICo=5D?Nu7Qh`!>c^#lC+qIf49Br~VkiCuz73H**vESB>QV!F}nmF7+uB(!xbs$3t zX6fugwo?p|vF11c-XK#sAzBVG)Ef;6v^?wy_ZubyRb+BEnLP4uhRGGE9exLb>((gu zz`8uqNm@bS7_;Vjf?Xq}Ndf%pux%+{v;d20vbfS_(TVB-3mjQcLav=G>csePC{>-B z%ddsYKx&$B>90B)B(zy=C6^aA>w+Y{G@@*L7|>4zsj5yV%4C^7^>M=pgDs5z@Dje| z!nadskBM^{{mQPQ3oXvTqYiU4?jX(5ugBy(={Xz({E7hI8%=pourQ6lgcJhvOiM7W zR300XYVF4`sB&Usj>Ga{2?_T56uy3Rdwfi~MdRIyM`1yu!lV6_{>I!C7X8`)!Jyx` zth6#*o5J9u$76sc3cM@qZ_GOpkK8mKzn9UQDa3@vd<TJ1>gLBPOGe`S#sUX6S_mEA zzg^9*1(~i#lki&e&SErsA8OU^$NYMpyLoY>8BfOMyUPA;^WvFpL3p0@w@)?Z%-D^- zM{YrB*NmSTD<K>y$7-ut6g32CdDTpvhqhV0CY#^qlCT5Y;_DmeM#fwJLMPYb*N<Jx z)0UR%kb>D(6%wZ+w<{%ip30kTg;jD%YVvs|xk4r5J$Chywj$2c*5I6N{i9AUNlET8 z$!?vTk&@hOl3xY@(Oe#9GQJk4b!F7jSpDoQyevB83*+-Vs0IcBxU8d!&;*5mZ#6N+ z`XDtnL&c6&B{H}k73)up^{d#kQe*Q~?D?s&B`UT^#b%2P+0`oYGAAlOpG3g~L+S4# zq^r+Rjg>F2Im>VHrfsN)t3e|q{t1Os%SR(5c1R*N9Y@Of6G_Y;Iq{p4STb_r14x`& z4TX=Kd^3}|89Y2$eY4_VRtXx8@}^RL`QzIq(E^A1N-@wt?@?RciE{zfm{A6O8ex0@ z&)2+_$idQ4$5AY0>F6np)$r`VTV`O?1Tlg6)+1!8oglELVCXj2UHNGacXEJY9BG|; zQ~gs{dRzxF@jy=SKTKA&fg_F8pn*c2CO}<zx42zIOw{uYox98{JaKG+m39iH$49Sz z06rw7YRkmN&vp)Ia~r##5*D+p>a#gaZ|p%BuXYzSb^@S7dKSau1V^k;u*;e^8RN1p zl_y~woFQ_qRh&X(f=%T2AY#0<bq0`{$S00R*<FqOoie1>zgXnJJOAnx;~8MdZ=dkt zTdO~p#mO23Ha-<|dSeZAGqu_$wVq`?HYO7dlY&vq#ui{f6<OA4*UNBPWM6+CWH-fn zFNY458GxURo(n-6TSV=?FyG)o!HIx*GFv{SW>7k2Q~cH}Dv{BwUDSnLyU0v_*6Mlq zB+N6Xqu4Q!Zseb2@4U7(iwr3u`T)8kF1dc%`VR4#U1Uz;U!N2k^s!ptvPvi%2D*Sb zdHBV8yuN+ibuL#E1=F=td77FE`9>`Tr62`UotFz>=+YKSKMwkKX>DEJ2T5DAD5_*< z@rZqkL^H%_(UzE(ZgE~K1pQjekKxbzr=b+rqK2&>pGOvLI#X*_yA5?b=^zy9D@+Q~ znq`<+kFd(Js!b-;M?QG74Ad`llaGdIS;Z8X76kMmF{SF>mzo%HFzX*UG1M*BdIIAh zcVNK!0-ng??`O_bzu!Jrerc@c6L<N#2mj;y?3*6Qw$1=;rE|weAke!svP^YYnC!q; z1)8n1-1|c>uTx{c!A6$6I55b?IC<?nei(8`Cov1~F+Jd)y7~@;Ii~hT#z*l*vg<t2 zQk?6<!%*3g>oC*xM?QujIFAg>o!|>cL86iBlQBA`5T5A50UTZ8WCMS)m=ql!DfL9J z^F(lH=Q?ksG&_1-cBIrFy}=*B;YZ=0n#n)j<r2N~i)glFSrm+v)Y5Bu37dpfV6chh z89qkQrT11A3N(_Any4U2)!$t6j)VnAMh<wrpEDNWCJ}ONR3NO_CZkbZnE5jY&&aSI zu_JvOy8jVr<K_ACW62`x%2+t))F?<DzitM>LIf!e9II>qOYKc&Ywv^pgti&4g5Bz& zuJ{c$tSkNesEjZCaioQ+{I1G5+FTPCa7t=d2ItIPOgxa~As8iBkg-mMs=+L6&9CJ% zce3!CgT)_d9+-il{B>Bo40uJyn6t!VR0$`j#`>g=VOm(FQXj}|e(vQ+#|42LxUDr9 zj#Fvy+L+9k97>S=oVYlw?gTnQ$ucTo#eI~&8}dV##N`N&Tq%7C%*#eggH$MU)u~$J zeZDZiCu=M88Xx*Nu1>UZJ~!^4xMI^!^*bgP#*JQgvK`iy6OY$ny)%?ydc<5AKf_05 zlO=w=bn3=u(HfzEm&B{A(^JAM8MT=X$hukOJ6`_pNd90hj~U`qXhW4}OCOe)q{e@z zqVQ<YE^En|P{j`nWeSB@3d4RaU8w7fP!wE`A&nhF?k4)-`Z{b9pa7=<B^+D#hNR1Y z#vXZLZ!pk_Q40pxyu@)Za1{S{x)RGc9P;g|rq4#7??Hl$kg()XThB-=d%7zp6U$+U zX!~^J<2uBjC(@HSgcF1*3ZXjC=?3q~E589rdnoB$7*A4C&^;Po4}lzF)CP`Xlo*QP zl(T!)=a}#}6~>6rs}%c2!d*`(j81hk$1sSU6vmUEWW}V8C#48uFXMQ!2R8%Z%6iks zk?NB!XsyX{q~!9V;AXzQzHbjVBBcH^r2dUj=0hWO;UFZWvi=brWKyh|N~}2t!%LB_ z#;xF!qXw`Ij5K4|NysJMMo>vAf>dFz)@TdU8yZX$tTEbwp`!Qxg&Gb}1KC;1G?@&n z7?Lc{EcEe6yBbXJYsN+;Pb1Cxu=?;t^>ief5vBu4*o?*4@?chb2iSmSFFnJ37js9U zPZs&<i70g*_;5dH5<e}7le=zw3FT~+FEeqP0^A9&0y63``hs-tf?8`<FCfn#p?*MK zfd&AbDo}R&Wy>ZBG#$`60+j$dU!eJb3I!?!bg@7S08JOD4A3P4Ee140pe2AlB+ybo zvjn;W(B%Rx12kKpy8(SfpcR1T3KRtNQGr$iDiLT6ppOYu4QReVHGr-Ws1{JEKpOyE zCr~}01p;jZbiF{E0F?=}8PE*^Z2`1Mpsj#z5@;Ks#R6>ybhAJ^04)({C!o&=v<J{q zf%XBqU7#4CI|Q2kOPmH2Xa=BV0?h*S1%YM*x?7;RfbJ2f1kehB<^#G<pi)3VfffK- zDNq@p)dDR7^ksn-16m`{5<qJOS_-IIpgRCPB+xQIH3HoY=qm!P08}eb5YX2IS`BD} zKx+VfU7%_}^#auZ`i4NYfHn%W0nj%Est2@5ppAh3MW9W9HVd>F(6<HJ0%(gsTLC>H z&^AC@1=<Jb-vui9)n&`RFVK8IKNYAH(BlFv0Q7T#$^iXRphbXwEzn{>hXq;!==TCG z1@tF@?f~>>ftCS!U!c1Ijd_PHWd$IgKtVvc0<8u#MW8i+E*7X7(1!)80W?>jT0jAT zHUPR_pn5=`5@;i!r2=gN^m&0c1G-P3Er1>rXe*!^fwlpv6KFf2Zwj;n(02sd322)@ zdjS1NpnZV$3KRo$K%f>t?E<v{`n5pqfQ|^%0qBncbpq-as0+|L0(Aq*c$a$V0d$H$ zy?}BAvH+bcP#>TR1?mTMsXzmOW(zb3=qiDZ0lH2g*E5$byHOwypd|u%0o^H3HlTY1 z@&j5WP!6DKfpP&w1j+;S4T16j{i{F)fVK)$2<ZC)O$W3~pc#Ok6lfNpHi2dXIwa6s zK))5J1kfu2%?H#cP${543$y^x2LhD=8v7nKv<Q%2pv8dB5@-pa^95Q8s7RnY0L>C; z8K8Lr-3{m(fmQ(egg`++iv?N@=r)1Y0Q!PJ)qw67s0Pp)focJT1=;}U>jKpSdRU;1 zfVK#<3D9>1+6?H&0&M~GGl8}OY7uA~pkE5K9nfzC+5zY#fp!A21lj}W4T1IndRL$r zpv+^`OADZ}0<{4;MWA*-K7l#_oi0!(pfd&P0(6c*-GC+w)C1@OfqDU5B#;HDNT5DI zmkQJm=)(dH0J=h;K|sX<9RqZwKrZyV0f9V#76{}8^a+8o0WA{959sE!)EvZpR^oC2 zRS1*^=!*j71G-nB0zj(-Dg?A%py_~W1eyWps{+je^fiHI1F92fE}(jWN&x+{K=T28 zQ=n2n-x6p6pv?l60oo$aB0yUOS`28LKuZ8^7icM<9RjTYv{RrUpnU?Z26RxMHGrNK zs2b1_focH71*!!!AkYRt9|%+r$ooF)d?TRK1lj~BPoT|!E)-}BpqT<~1vF2fZGh$r zv>ng_fp!4;q(D0XeMX=?fGPyq2k35rVt~FRPz#_{0<{5J11PzYrl$k5IcVeds~L~! z`NOP>F`m<(Po9opVireoT;On5^2=!0HzT6j?UnJ{ckq|<-St%iAHy(j<u6*Z7GQYF zG(Dd7H@ZLr6LHRhS95o@i4kVmUk*U<pkk|wgUCH(C_*-J>?shl*n#B6!TKsMS+3&v z8{b9ccvQF?lTWlCTaR+vOtA7S^B)#FbtErmJmyWqf+ShsX3J}OApp}Aw=cW~9B}pN zHST%x`;|Q4FmEO!YjW^cz*Sex`v-~nIZ7?yD$LS-H6I}Y2fxAl<5LM=Dp(0(an;pV z^8cqYw~Fpu;JxaypFACj1DjNzpMU(J3ZbD?V9<r3a&gAeT{$m?monw`XA7%z#v z=E6Z28C+u(L9JV7#UDi)E>FESRXt-~i3wk)qloda$(!%Y%hl41#N8@mKG%cOGbTQP zPxHQ3k|@QObzj3iR0)Ib#2o%)BtFDgmpgH>{9;>9em#k^<=2~-D8D6%@z6fX;li9u zA69Z`ybTGd8t2-!L*u_^P&EG8_-_d-jnhcA#_IsapJZ5RoU3+9<EM+pgG)u*!L@SO zTQrRiyHVlyJt!Iuu94><oVwwDKt^J@G_v@1)`COnN^xZ>@t=@b5xVoWClgmztiSWM zbwi0O82lhHgFo*lrZINtgTxg1eLr!Q{JxhsO@5Ci#>wxKoUqz9$>}i!;32unnFj-1 z8HvmAH?xt=5b=4@Ns9p~%f(V%cCvvcvd!n0k3tIy137RTlsd<f0Ndh60-a{p<q)uF z0MZx@61H;ciDyqw`8;?`uP4k!3);k7kg+!KTjudc%Db^P8o@EmGH;~37l$yo8_$oi z2O8%qndjmJTT_`x-QBcEetVi!DSDfhNZ4vxieG#N5r1hf*32v{<g?7_^KkXGbd)PO z50^Gy{aSJ!j)iWcuT|C`J#v^vBCyh@){Ofb$q7`>6CrVK<o<<lh{91x0U=z8IgO=2 zW9p?Q)yOkZ08DaOF!>5I_j?$y{+#?)r5p%bjbkj?t_QeQRu3;`9e&WPaZgL~qF1E8 zpwuQZP1bAD+v5w6g28(-lZXW5i2v3DocmX_X1NY=b`K!K03HL3F@V<q;{`aFmCava zA<kKMD1}^4N?ZfWXF6^~a76{nzmewW-i=^)jLo2caqz$?i(SsnqzXq(tFio4U3GNq z%AKnJ;K@55PUBKmxjcok$U!_tQf`SvsWfXPkIBXI49mr`nOrD*TA7`6Zn{yHN21kq z7If*4ppqR?_*?;FHy{?8#odWWb82dI5;xwW-w<cB`v#my{4GB9KCL;@CP(<x;}gtx z;6(YJ<{ha+DOhNtCHSO8f28eOM?aW$AR<>n@ua8!md}`ev!aRh2iYo`Sbw^*O63F% zR(*477vfTHIbKExw4=Yn(L7yxEES@qGyXOF;<hi>WAGi|LR}N`Es75L5JiWs2Z_SN z9i)|*Scg-^7$(%=ZYq{<euOnIp@%&He7-vHCYlOJl`}5|#20|qKsN%zXh7o4gjWmj zrU;-j_Unx8KxTnVM#3s%zhtDu*yPN1RbB{8+K!0#<}_U-u^fr&m#DsqP}OU$%G2<J zheh=9yFOGaJ=Y^*(z^q1Ry2tf?#AuICNaI;Vmw0UHI%$b%x!lT4NM~Y7%Apv+o~34 zlesE%E{-DGzB8);Z4_gz`$ie3G~{!|u?rP1{uG*d69wgq=Kc6Rg5THh+k@Xe{Jv~l zkJ;KD%@tP0ldceNXUvb@isMf>;wlzmKb--JZKKHbJ~phuw4GlA$CLf|C<&VTgLSys zD>fhp%)gH<NZq+>R568i)aZFI1=grB1)Pg^m;zFSprB(2kjMvm8&F0zfVRZA1Wx9_ zQlz&MneeFqF#;69P{YFms!mue+v;DZW+8had(%>=nxBm6fMumDeIxGmaX35hdg4-` z;2?22iaNm%c%8==UN@cWe<*W$UCc>3ybp;Yj8V1OMy1`F7TPwIH_vpKN@_P-c^w6> z4ZKKM(9;TGWf}aI#;`*Uqglci|0tFaYMGDA`s!Rqs85c}<~}0tZ?HALel9lJIS|z& z{6biThw13AxPEQ@3JBN*l|u$Nrf$yhN!pK*=D^4Dugm)O$oP`>5Ymzz8h50@44JrG zECg>;nK1#O2*GrIAJhDF7NL2`s97Z0hvea#0n=5}oPia890S7M2h7AYtkKr`^Zt-* zSZb|braRNbmtN55ho2}8cq_*@<_MIH!@|;E=>EnyB2EI>-4mbPJ+ax7LlcN*m7I!G zcu)*_R=2FjQ!`XlK7Nzi2(DM0+XypMfj+Lb5xA2b3Ev^R1KE-AG61HOC%3UM<M+w3 zhWNxUAD2D`Lp=7C76XY^k>YE^-Y0%_e}oHV*g>&aBplxafQ?YxGscm*@<B}Dd{6t@ zz7Z+sW-h-$UapSOt?wH|;bd!7@8UMVE<mZZB$qp70_6ck#pT<O>~Byx_eq*u(8xZA zo4q(tg%OB3BZnS@SgVp)f54d<!J>NgP8=jAR#6fwCRn`0fibOYC7NS(C?j!iOX6-c z6lu~n#oka=udDLhG`h=dy0{!7bW7|UJv_=<iGfiMdoLD0{#6tOZNvr2Rwc5^_Anj= zfnM-T2pqM2WBM|@GN<y~h&-$XSk$XH3n@pZyBllN!Mw`rTf?(Jc_T!v69{;X?RRiA ziwXxt%q@tEbXQ_ZG&~>3+^W&h9HwJ_XQK#R4xc6<g%?6%<oh)E%IAvkrb$5#CIa~J zLld&?s*K)C#gGY#$NlxjZY=`_W0m-xwhZt0f{rRGscu)H))FxY<lDn>HNW_(3Vt(c z6tV7VP#Z8M!nGD`O`oFPQ|XNy8rMwy;`+E;`0Y7GYBN^^fvCvp!hv6rm2v3c<y^dy zr*XBWnkUCYI;lFFkrsI@gp98jWk?m=m8+@%g?AME2qcH7udo0&<a4VGclEj>@|Aa` z!mlD9I=WUo_JMz)st#B1W+%#i)iLKmjUqiHg`zoLb11q4L8qcgs<GfsRoVG$1$ejv zKlAndvFpH;FOfjmR|-fgV`!!drKx`Wy+-vff$)Eu>N)ag3?5hYGC0|Q4S6m7dVuJ; zhAKalG@s>?49}wdi8=pnu@bJl2SvdEcPN3kO>vU|*A?i{aDftsdQ!SBasKKm0FDR@ zNeeti633PsZ9FD5=66@3AA<%9pkXeK0h)%%Go72bFPwE}%bLhN(KBH6=a@x1ykayU z4Gpgt4TziKEON#NVDhkGk|-65xfB(5Bw+?#)-Lwg^`NwIP;1ODqv-yjAYZUdoCZqt zkCx{?Ew1=;+}RHGEolw(2oc<^!ecSm50}D<MoL&%oQHr@TMMs<qcnPe{iN8sDyHx2 z|4bQBRPCbj`3-m}IA%*c*xxOQ1-K45XTR@yT-?IV!meg319-RMVFhTXJMw(w;IX$J zefvO0FrxxL?x1^Xq(Aa*WML;}IcO7#Vi8;fPwhm?K&`7d&|8VlC?_r_Ap>1*D!OYL zUv~kFyOq5|D7EjOSd}7za-kd*aRt>?w{RcYy;39GlF?zW)*+SxrJ`9Y*3<Mj%oIO> zKYS(zattpI%bll6HF}ZSBKRzMAf}0+F!|B)eUzLR9FoOD5fV4R7^UdxLPJ;>s$K6+ znQ1p7^BG2FToC8w+I_4H{Puk7XqCV2&Vl5`@Y%dsC$*2UALi|;wLg$n`<z~>`hbzE z$K(o*s*1t98rsb!dt;qOt+r_*tKAr&E~q)E9}i|$n!d@3U+FIB3+(J{e=H&qtq;>1 z0dV2Vq~!zYn&Q1As>rFSLhT7zyEd6VdIBMX){A>6elF3vj=q6blsx04uKblNCTtk$ z8Ngghcel0~j}*=fV_*v?ocI*wQjbiOzRh+=G6cLmEA7Or;(%FPs_51x<c8E7@IlXX z(Q6TtY~2^K6mVze(tIHiOW`fhN$_Tir~<tMgp_V-F>>qCekJaw8ls;RHt77d89f8{ zgSmj2Gn|0vE2oV}^cbR{3lf!z`*I3VrP>Qb2HFE}N$Vp10vQovY3INgq?VGRh%?2p zl8hi6ZsiPS<71TBwDf_*hb0XC>##7Om(pR@{}Oswo^%z>>1V9*8r{H3<-Xw&m0jf_ z?tT@gh60WrgJ1g<k#pFFlg>3C-U;o>FWxxEwKk7VbnO|@TOnh=vaz?A(~mRd`s~_D zp_8ZS<*G%@KA__U`$}9FQ<v-dmHQMeMe)o8Ji(|Q)WTw|w0r0Vy3lV?0Hh^pDc%mX z<QsP&-GUey(M5iFz5>=fXa7n*V+6=4AKgg=H;xsqmQ0oVfL#Nl%hw;_tO1h<C0~-E zbjLZN7A%W>)=W51W2;$XA>4d%+PbnJb060S8%wbi-OK9L1@Un>59!4Q8BWfrWl228 z#wRTBvLVf46PcVxCgK+EvFhQ|Ok>ei^=ahbU<-s)tCBmHXRAxkI9V&f8st+nE=EkN zYw3469Uo{d@yvNlL*A>lYbd+o`vPeL&(&gErze>QF-``VUnxY8Ir9gG%-sgcZdMR) zhq4X_Xdi4BrV-~_%_x>GPLS*2t*)acx96KbG!)Br7{M}sB#=-fA!%l6z@*@8dBj4d zDM>E3oD`Q=|4Up7QCo%JV_iET>3Qg9SaH_G&pVwLbRnMPCZHyr2<+Lzt_MoC=iqha zZ?oev_iHg5e)})Zz{g79wjRY<+0pZ|gR7JAoXsp*PvXH-g&P^4d~QB2AC463aPHVq zD71cbnxl(0Y8G%K9c%D)XUVd$STF!Z4e*z(xrEb@G_7*rY8N!g+Rm$W_9amMOUa;e zu?&GBU^-`|G8rqG`qZ2y3sg55?Eb>6s2XtVXV1#gQj-YcHI?D~N6@3A<mp7TZZ~6> z>n|dx@9r0J&@>N~txY{KF4-#d0z+Fe^>L)iVnKgn9@eJj;8yh&jk#Q<Ql>(?Y8DD| ztkWz}d_^eqH3?>*zlnJr+0ZlEFKT`2bWA@5Zz0@}moF`_bGEQrBq!mmgA~<Lo*1(g zOD~N?CovQKDvrc9_UrML7rnf>@Soz~qmyhIU}4%Hv#mGo&{<Ji>J<a+y(@Hy2UdPc zi!Qdw5<lam&ae%ECp|RwY*eu>?tm2cBp3==Tt<~Q73ijx4WUz6fB~8j#fQjy8F@uo z<Z4FpMxzt6hLIDJk-;hO6iRVtveqL=M+{5wr?E0r<Q4li^khuEMCwdZpGT@LA1A5( zVgWE*-J9uGcf?a}!qp?@E=k(Vw;Z`KAnBJ1R2MYX_iY1SdS{F6r)1}PhM`s$*hWcT z!UP;mPr77asV=$lEE_A#OGrfAC5X5=&FP0LaW@C*o}b6CY?U0+HZGCTJ&Xj8?=ZQA z$*gy*=w<NDq0~HLAS35N?GG>yKU;uHA$_62Nh>!<+)Say=QY@{t!Kwjnb-)oTzq)N zq9efQ3BP!707GpWG>V|Qfc1U#q97@QEG9$$>PZYewVrq?SAKF_oHnS}Tzq_6fc1pO zPEfM(vSbl|bpqRsJZ^;pI({rH!WBi6OOdEfz5#<}SLPEZgQuwYelorXG1ga84LRaP z=<={mi%CE1=8%O^VqyWNwXmtVLzNJq7nZ@m2bCOIwYo4<aV2JGj1Qa`LmFcYF;2z% zOn8dF2k&@cS@Q?-mqYqi7n9>Z<)0n+BdoDHFu*Y*9&oIdxNgNBt2p@3y=IR`1?8*v zGCqS~2=FV~e1=-+vL+JOBVI)&^8zE87v)IiMF~~jam+iB?<?V}t`ND)r9R(5$ce(+ z`Wz}yhj@>AZ19rAVwi$^m9CM+Sj5LNcSWmf=z~yT5DMU1ftc%hL@CpOn`v;TD_o-T z7}g+I_p7<1hvL-ZxhVX&;zv&*O{ut3d|!PY`p1E(4QS^>J)*oetmUD|a!P0&_j>tw z8lG{8Zzn2iwgu1kC=6$Eok{L&4Rnx`{j?Nrl(^=;w-RGQLLfX961wK`wjE|~fxh>L zAl7%qZUpsMC7et<hfa1592(%_dZ2^mB3HCj(%hp?vZOd~Foo<5NwR|@k<C<O*`LQR zOya)oBuk3(`cufhhme+_e<ZSF6<My3#h*#yzO?c>yGT<>ab6GpB$co=iP|#~S)U@y z>2Bgd&Hu@jHzaA2+`Jh61o1+WC^m6pGWCc_9f|g2MVo3*OjddDM4(LugCJddz%w?1 zc2*qdxPSZ}?B@=}AA_AG=7n&*$HtvXS>{#aPg0=5<~#e~<TbTW&z0kx1Uuvz?GAXQ zU7@OW_#j=5^;LaC&*M-bo;B+m!aDKFa{zn*%Lz_o3;{{P2N71<M)eLf73b2Y*li5H zmQ729eIM-`Pc<up)Nee;lyiWE${Wv5@Wo1)en!Rmswak?U+I<KmsVzDMEV4@5dRlY zmbe#_Ecw|tC!Yr4gH{te0k?e)Zu^E_6mI*5z|FLf>7Y!`Q@I4$+%sNI73`DHIJOHs z$OoCmn9}ZXO5qbJ_Sogq1>U2IFQwh(;J-_kb{F}B=Ppv-4%0wscR@B=rcH=*^7#+k z+7(^zi3X0#ZKs3VPF>oa&eDDql*u`zv^&#Fn+q)Aw*ykp6-wPs5h-?<x|Nlb9ged5 z$6<j45g7)<t0UL}NbRG%5RlK;c;Y-oDLl42c{~me9K}P-(rF-1bC0k=giTf0Ac7r^ zU<jM-Bk*7&g^6r)s&a`i*oFf^oWO`YVvGsA9Sq#9PGM#U?pAinw%m5t0x$m(eX}RL zPkVXno^IiY!*u*_AQ^{U)~)nL16vNdu1sLmBp(jg!uQDs;r{#G@qZ-^?8F8(JG1UW zEZZM+#N3;mxi>p<-)eGilGchwY8o~fue!)dldG3nfK3h(Ghx}xjLKbg74Yp|@<R&0 z*%}k-nH*}1aUlsA@dvu+Yfdj;8G4#u|J6Nc{Ex62?KD=EgHnd+LoM_J;M{Cw<MGl^ zTTeQr=2yoUVnQ7+OggD&LQ$FVh@n2&wd(VrZuih%Gt?)Bdd7y@aA7x9&gNIMhfz=G zn3>8^I{EmShT~A?sw!~wnDSt|O_e7%)RP%%8ywDY;s_j5r69+2DKOo3mOBgO&WiIU zDVS#&=Kl&eCCWSxy?3bX*l^~#BQQ@DNHI?ph|JRk%1RYz3<MezkHcW%z2XmHwj0w8 z&se}^5Zbn-KL|Q3z)NvA(uy`JD{|Nm->Gy~?2iy$zZ?T_w<_@X3izpt2`+p{Dew)b zKnJ@KtcOqgMnyV#9Af&0W`#G~%j+weU&Xg2gmosv!dumKjw#QElPb>{g1$i&K~t5c zy}?nQ80^Pcp5M`)Mk&wNQp-~t4Ujm5{F)LP<@*{{2l|pk`D;yifXedKI?6L2yu_{4 zq?gAj(I*58)gn%|hO}!;nfyA$#;8k(G+K^>4UZ@Zo9g4S;Rrbzs8+d~U(F?DgcN1r zgAiScQ<KWGNbMvZAdm1GjE1yzIow>*$kq!RR)e7Ob6eUq@e^eruo?uQXB>1)dP(?^ zv1)5M5LF0R<7P(TT+fLc9!Y?}emz~x!HF4$v0KwmL<<uUJe(IE!fG<+kY>F~rpc$_ z?+{-Zl^Oci1~XIEx=Z!kK~3j5so?DSvsfHdYY9V@SEo(3A-4B5tP;q46upUF21j%@ zqf-f;;UJ`^tbE%Tv(3HmUz}k2K87vcK4^q|cOK2;<P+xM;+$NTA7(;fvUn4pEjjyT zcLI9=m<sk_;*ZrAwdjB!7m0idMB;BDz!!b6dCQyVSXr#Yb~Ui;umpz{3QhcBk<Wt8 zLWA%7Y8sIXz$#37kNIkNk}obh^@AU99z5i$;h~uL!}x=h49tTM-6@g_y?*jO@OH8Q z6E%+⪼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 DW|z8? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/SDL_image.dll b/venv/Lib/site-packages/pygame/SDL_image.dll new file mode 100644 index 0000000000000000000000000000000000000000..63b9359c4bec9f66f5a2accf638258eeae8bf69f GIT binary patch literal 58880 zcmeFa3t&{$wKskyOdw!jq6Uo?b=08X6MPj)tPwao6f^|__@Ef_fM`h4WCqX@Nt}#i zI*jJF($dzpq|i!RTWK#vs<Z}3N%YbhmDVV^n%Y=roT#a$!mZxs|NE`I&zUnxKyB~+ z?)|=h184So?X}lld+oK?-e;frw>BEX48w5a>F+m;J#hJ#E59fHsYUXbbDkJu>>Bx- zbN9IB{pQ?7t4gcAl~olhs|r?o3k%B2D}3G+#oj7^xwo|3JM-p+-qjUF#g~m9Jt|v+ z&NB^To@-Q6MP0_2^G|Z6oMHSB(XZi2cNrO(a5L~U<1yTY;!ja{yBNc0{@tM>pG$EW z@Zry^%CP{;<4-v$Mvx89NHKP%!_7@GrZ7D4FE7Pt7%?z15q3{XF|rat+c)Qw6k`Vw zJI>!_zT$O0q|MxcA0ouI+Kqr8e|H#pcU)Ff;46TC9AP!%VWWP6$MKhIR5o8$r7})A z1qtnVNUxoaOz`F!lX5RxQC-d0qLToyH#yx3)e>H@f+sX$rNphp%As6=SE}*}4M9s| z4AR;L<!iod#)3tRy@Wqr<imgC_Y5Td0I&HnUzy<NWi)6j`8pDL=#zX^)m4S?OP}Q; zAMtycsfj<8uehuN8Kn==mqr@WUrFSl5Ba7i$Nc{%v@p<<)#}c!MT?^kKVlf610i>I z^qPkaBY0%noDWh9x6Q<lZ*;4SjX+D*<mTHBz}Z87yzM~alEr|K5nhy?9emzj)nxR# z3xmy`2gV{f5OqyH62AKOQ->FBV|?5bS!1BCC_wf9KG5TSf-piIy`G<rorg+-&Hg_$ z<-rp;mg1@ZBhrxh93r+5h)IQkmW<mzzkGkX5qdwe_d+BYfxo&W#ot}j#Bn(J{qRzE z_*zyPKOOZ=?eNq?eAxBAh<Zc4sPZgb<tvkq=t^Cl`g4&}LTE$%p8+nBbUKoPM?Cfa z#@L*f*i7Fzw0lD9%xpLK$_OpWPD9um%FOO>5A>u5QrT!1P*$`Oyc;Js$3ETP-*4mJ zL>iOi|N0HUZw?*wUEf5CGiocMLI(nI_taO`dcvm$pZC3oK>zboUs?0#&{f&d55I?Y zr7}0FhmWA>o7~)*N;=ZNF_rC1Cf<{zdu%w+C~4d%bckJqKx4#rfx*^fc!w8)^l5Yi z5c5Y5qPAGi-}?KlUil>>jxYjc+^UQLC;G79MGQ!n*g<5m+nc{6^qa*CL#?3~0zKn` z&xgjQ?Q<9U=W53B6-Dp*CK_FqokpN2ZG>{NqZ_xQqkGar2Lm4r^UV()@y%^bWjP?- zA7~jD>IG9QJ0SQ+FGl&ujDCU$-Jb16@xU?H+P%?*|B1Xk>0q+l$?wOXYK-i<K)@&R zMKi2w9EGEwvdYQK=$Y9Y4>*%Mw+U+OIsf^A4_yB54n+Rt52fPRT%k9!R7UUrYNC-O zE*tsX1SC&z95N3CRHrfwjJ|c~=t5oX)1<zpr?4ri`m`=`F!m#)Ms|}B)_Cd}*P5E4 znTNv~1I%}3cwY8|@XTy)^jhQx#W4ac`Yp;%kG{CsFpxJr{$gWO7WxH4V@7`HbtPJi zc68L(91KVdy<qbbtju>ByLSvyz~}vAb0sk?v>z-!66{47{m(!B-hq-vfI-hD{t!Nx zn#O^3Fm)uHl!K|G;EdkGxMc@)t!5u<37ctwE*FqFqsfg_@%u+c{{wRn*uWi_-{+Dn zDUK}gBg+Ff+F4R03lO)Vz>h5FuduVYB}<wk3;f8kHDYH;6AVr=`?e7i2|TTkRVfP3 z)aZ-AO(RRJQlozYCOU#Rq(=X<z>Z*zsnK<)r8Sjc*=7w@q|zPj?n0nOQS$4pU^26p zRKE<lbnI<SjO`25^cg;P!0dAcYI+U-2;ubjnPIapG*b;k@@UxXC8Te`t1HO@I8LWX zN=HtTfjPct<-p948NUXxp52CLcQewOy3y19?V$rGF)(uK0bfddT)<3o1<Z7I3^LR= z`$nm(_09g>R-FH2J8pzXws@+b9B9eBO|!s+KuwzAKMlN82qHwk{T;2@#;!zD04GdA zm&Rt1B+`cbG?CoF=DROKv04^eiDH48bi+4>MRL=_I*-&Ai?XySI#jD-xEKV85zg-m zwY!>K?fbe?QjKPGK`wjlyrJSPfMAzN@sdDIhT*$la6Us3H-p6e9tI$Cr^KfW&X=2J z!9!OMg*Un|el`0UT^l$y#&drj1?UhB1OdK70+f7P(@lC@XpPY*gG^C)lp+Pj|B0ze z-m?cK2m-2eR+e6%REp%kjrr4U;SYLUzz$*(J7^D(iI{Jb0FMDB5MTtrDX!FgiJTyP zuM-MdX$=Qq2aW8%Fz1O_APHI4xfV=c5;EULDF#=mV2=*oqJnRt|K2wIr+XeZd#0J` z{xJx@Y4|=Fq8w6g-7Z%3S#*$Nw27jjt35xFGzU?h$8$40k2i<RC<5Tskl8Js%#hg? zHoHBKnbFYxu-WBm51E}|GkUax!A=JIG#6u34d@zT63PFaB5JxGAO2Co2(ib885q{) z@9Lo|or#>sD}H$B;*}^a96tkW8Od{n(0Rb9j~I1?&5mhiR}}_2+|KHep56I};cv)b zg-|RT%-^Z1{rh9*DLf80N8JtPi-<lP=<+m}zyBCu0TPg390F`g-2B+(e?MgT)Yuo% zL$P}B@bM^f9KtR}5w;F86S|A<T<F8T3!sq(x1l@izCsVW%)VGQGOIy&&L^*_2i>M? za+$rK5Y5LDg~?qCoy~}3uX^fhfh=KTYHKjxIUej6hGve1!cQNEEnXO!Egp;=*7cK$ z&93K;ofwbjhsJ~2{_*+XG|ir4(9Y+<e&pYwcr+z`!^Z>y&OJVm)ELD<ZOuD|Z_@GT zIgq9F1UbAhb~Y435hV-jdN@zDn%($?Bf63Z$aF1KWA2e3Eh3{o*rGBiX%6PI=hVpN zdw{5-sG3#D!dz#fTaD-)C}`F64JZ(UBz;hdL;USWPRs=?xtH_N@4uEPc?U{rQTQyP zL*_0WdKw`}>!0c16Dqh<2e(PyM|EhkgmwgKcBK0&bX*8=B1v0x#5yaYSx2ly1Zw!c z4lY%}U$vSt5L?ZyXeC;RMKm3>fzCt9X`~Z-06)6)DJUH>t-9P2vMTx;)(MV^-ci9{ z>5?5>MVNbZ=otxZ)uFu-dRT{kBB3ohv{gb6>Cl%Y)EKB~Htq%k9AXz8UDh1O#C3?c zM!${>N*A;FqkA|>Wd4fcDK&7+?e{PgGTTa8&0nP%@w8U6jb$5KO%6je^{^7^GWT@K zl(Yx4_}yW1N1%DkH1kn^xq_GFyEJetYs08O)WdaKetbmWnAbNcKCjj6GS-uhon4Uk zt!4);1MzDZZS*r5zl_GO5kE)O+dp)wt1(`qYV)kG3LMM0SL(PdUZN>d3w1_Nl-a&Y zLYOioR3xE}_%t0}l$3W?Qr;;lug-aqgbv4Djg724oX>f2TsXf2PF6U-6HaD0zY9(V z^u6@3*-Y&_Y_?GQ!vH|LjOe8Tq&ra4ZTRipSe!}<cVq4j1Mf|NnoSVDus<Ra%29ZJ zZ#aL4>zTm*F&t<FgE}0l*4-Rlps5jU1&>+-(*>Z!QyFRYz3^HH^YTL+D4yWc$lPl7 z5LE0@{IDKWp1&!)z#X37v+oZntS$xB*-9R{%31BuMO>e>$cgiB60Camy_Vu?KbSkr z2$(%keIJ@;_IMtg!^!z|U}ZJrH~)(pG8B1-ov7{3mR^XKhVwDpH-$119Py~@82~sT zJM8&#f*sxkI|XX?r1*y8*X6&Czn+JhxvUc|O(U0r2}M8t3xvO3R-O#rIzrL?DFBN- z3MjEhgfqdeP)!@iw|SZTodcHd)>^FRv3*nn>%(RnMGVHL+cz!#1q_Bj^N4-NhK0=9 zuvr`E8ivW?4EVmj@6EGa?Fdh7f5MG^oVY*Kt`~(+h~ulIAasCFSPrwSU<AM=oQ4tz zB4&t+AVd!tK8)Fhkl7xGc3`zfDckjIQ+w<yqT5KrMxtS!;4{GZVDN5qld*>#a<SPK z3a&@cVolB<lJfPVHEp4NVYBD!NB<+#4goq-jiZ6A5ZO#<&hdu49Olv$jhKV1VJ?b$ zK9(}=uKk|ff`n&xM_8&4?R(*aP)9?G9p8@rKqN##gXC0PhMr85A$1GtjDOA=*=YL$ ztVpO>rIXVr0mAw1PNb;nSR|Ud-!~QrGFSAv1cLGPAZpa`U8`vkzvOr=UN@k{3OOvr zqU#SyzjzXrxzIh1AXQhit$mu=Pz5f8TkpB=7Mi+f8Tkx#BiMSaB_l8#xYDFN_MHUy zWdAQbNb-tuC2Q+UDL=r3fV_1r+X2b8SRAKa`A3};gQ9s<l(@yv;&y`7G2;;*J<py< zr<(=VvfDs1qf<Cm&=#emVc8q~9TXE}Vl(c87rMtm9jsPCOHV0M!Tng|9yI*uXS0Qi z-Vq4zH~g2O;Vu}G-o?nrID8+Dp2hx3S>Qooivb_Q=9<Olv<>R&qM$y7i@8@vyl6#O z`VP&?lA}%M_&FjP%*S=;0L)@Q-%<*9si374eha~n`KZqOpoE|W?uGTM)!b`<JP>da z*rNh%5@=%pgJ7E3aW5F9O_Z7)A*?ttvw#NsWgJWeCjzpvF)0e`HLz`BvZvfdsM;dM zc4$=^qyOAQ{I&;bwomW`sYmMg*Cl?d4!tNLOUZi<A+-1#I&r@WKCgp6lDwAE_bmxE z>a+(Xv`L5RBm~JUY)~zsLpoF}q55bLuF?rFh_fwO&!JnVAku0}2h<14e@OI`hq!`0 zh^Bx}&r_gh;b#LxyURBwJ|}Q2&377Ay))xE%m76Zy5#fFB~9pdl#213R<l-gJrPc# z?gcsMsqs<&V;<r%g}6K#PSigS^*26O^Dr2G95QjgB1;O*%+3@rGqW=UF!U8KGK9^C z)ugsnGcDqb=+6KVMio)LRHJWaMKc@~{ZR&_*rj4G!jHl5eA?P&ls^7b*s3ID>X0SU zt^#qPsYEuHeE`PM`V)|}l_w5UrxZ}4?GTu41IFVCCeSWecu49cAg`w$a>)R>J;D9( zgw3sbE)Dv~ukx#A)Nv|s;z>28%xD0@dG+su5zhk_e{WeR4O?MiRmEG)DB5H+#vYOZ zYE3E>>=q5iki{_JqWu(^2ZMKk+SY{I846Z{3YH-HJ~CJnZs*6Fa0$)XM|#5DKpr_K zlwiiEMEmK9WCn>a4RV}!Sz6{@Vxi{UaD9;c5aRT!k}*XA88!VfX2A4&BZ|fsDP9Wa z4?X>Id10&m1Eyb&9Z=7RHa8^D<(B@(oq_KhKmz9sOg7EUgiX(L-!jPQ6LT#_GZFcR zS#&0#91NBMEk{3>k=t#xLpa3hc8-fr*zE-Fq^YypCu~g6u}#{O)a_8?BI!04w1u<K z(FEt&-5U-POZ4^MLcLHt^^T0}a`cbv5SCCmoh-qa0W5JjpnOdAY1M#+9H;YsjL!SJ zw4&SYCo#G~24(d<zE(uF=C;q<dwG_YqNbyqw~`FvoESurQT!q^)+_H1odui>mXa(_ zCbA^$W4xrY9DjExX=?y7+bN|nd&5}%W->SU?nIU}uCC#_w?G<1%r~iCy@8$wv)t%R zepn?3nujq*Dkz4|KhK$CYf_FsDj1(+ivi~~>U!3T1x5No4>d8AuxGGqrngB(r3$%D zM2ik3Y=EFWRVgAgClkTXRp53?!m;&O0EW@Q&PFM!aDOoR9MaKd=6{O$Uk@PvZI1jA z6V}{eoR=fPU9f1f&><8$7<?QdA+k`>PJB>7yciX_g?e_1KT%gZ>$;nDy+hKZ-u|9C zT+o_&hwUq}eXHO@hmx5FumE&fu)t8QKgJqPXAKe505yIebk}`d*z<;;%jl8q+j4u| zg$NyRq#%_kGgV3pLV>OkPmq(<M6hiRa6uWBQi-K8=HqSiROGLbeOsRLAEbYg&RpMo z_tYkqWX~;CZrU8wLAvT8avIRoJ#ohK!2P!SfctZ(d2p*a_9FRD4bkUQSn^z!{2EFE z&!=*x`LBWW#imXT775+1dq?b9f=pN>+yY0bUENykx|OB>SclTLSf$VP=YNv=*AYS! zA)KxufDDdC4nrejzXAS&+9kf!STh0vvm0ijfqgsjxP7~wwM=6zKUJXGj<z>PN3bgM zFd(<Vhi*g9B<X+cfttgHC%BJrgL}x!=#5D5DdmF|q1}P$MnKlx(Z=cy)uOuTh*ZS% zYz7aZ9$i;1bZy48hXt@__p(;c?jxaB_WcRF>dU|jM@GH^4;bV~=+%91FcKVeWaI~- zdD-L8k6EZW(?%sjp^_f*sWUa2L#_oyU?z=W1>?k`cMujG;n8F=;kZz6JKBdVK&Uyi zf8T4U+az<2<Uk<DhFS$7Vd;^_Q0F+D<H-VInc&t8a%nh17>G#+s@m`*V*N*$4uDah zrV9qpML4+A#DN@aUN=rWXp}lu1Z^LR7ez;81BG6f;UBoXr&ZQgl#scug+f!#8L91W z?8AZjT;t%^i1Ap&V4gt{jEuLOupskKg>-wJoj3xus{;&QMC0EI&(FZ7zU!HWl(3l* zY2aED(QhZkDK>sb$6@pGEoPar-+wCnZ^Qo%{7I)G&c#^(wdIcmx@Xf8QGYU9iM84| zwD!ocrF89oAktSX4s7sPnq|e_N7S`{V|@0tTs8Slj{Ol18vZWY5Mv4WN4x<4TgrbH z{Ed{iwV=Lc79OTU(_?$!8nHj9jF%(hfP7CQ#j`t=C7YvAeK~NpQQ+#x_Nc_Uwox1- z?mlrWNt#-xf)JS$+`5b^fzjhZL_p=(M$Q<B<UCYvBN@LA%~CDk=@#Lfxi7FmedL_k z_d+oq2;d|qfCOC!iV`wTB-yZoYDerr*Yw91q7#o|PhE_w+sXu8M)<B&{Dpo#>e>A~ z=q8gchd?-=Bf)0Z1T4rP6PcUUzF(jxTQ=M$w5HbfsVS^AwchqMXrJmL>dxV@%m==3 z?Qdefsrx;fegfQ^m=*LKuQKSg_37a2TS1}d<=Ci^#>B`sO`DKAz|O2~hVQ%l(Qz&- zZXe>v3H#w{j(JMVIq}+>I8>6>R8~p4p+)gPbILXXbyQD_Z=gA28xhu7_H_;0My$1V z-^8TEVTbsQ=*URk2uR8~`!R27Ot=U$`>^yqi}vIZ6Wi5dOwMO%k&1IrvIrY#_Q;tj z2m<WxVsNehae`p&f(caoKufkV@j>t6@(MkWe(xwnop&K0Xd?8~zlfG$&~NMb3uwb1 zPUD?cz%gxX>tZB-n4{YYxSF>`EkCK#g8=B6e8NfTzVAXVwx;$X1IhU$9wYv#R`<7z z_Z3S-0z8i%8W&_l;DAdin|fe<XZ(!TRO1?Tth9-qkSc^cbszM54CCHckzq}0VJ;rU zL?@$xO{@yca+9i*^)<0&M2`W-B)0^pZOeT>wXlgl+h*b?JeI!-hyA{TO$^1T05utF zQVXxm#m|~E#2<*dw=qrvVI#H~nPNrENoq|s`;^_|lQejOqD8A)XhCFEL|8=(YJYoj z*RkFqJI1Ec@d$Af=C=WaP%Wo=(!^dzd;HUyC>=oBQF|~}`eWOW7zxsH>Y(X5uIs>t zH9f|L*HpeQA|Iug+1o@u0jTw73)Lcd?$B7$P*FXUA^m_c6Q466J-@GRKiMRlxtVOj zjio+Km1)3?l3*Pr!T5Djl|?YK&+3etpL_&F>316s;t4$JYWm1%8%n}s$sue6>?lA$ zsDnvSVHI)<R?<2S6P6B-<!=*5$<+Pp$BXA$0d|J?t&SpVT7wV6TJ=JL*G?0(2k=__ zlH+w`@UNu4oUrtSs=?ksxvqtBz_R<#v5ye;kioPeYp^PTBA7E?4JFHYo^TW;d+!=O zo5xO5D#EJ}`_{C@vRbNEgB@_hk>$R|4yw1yy@FhUnry>&X(I%vvpDh6#jjGuUs1#R zM<{|}Ort8@EbV4$7yKdd=^W>fZbS!@37HesGcmdh)x)T&wWxR%?Lyqf=1+bfH*WWb z=VRZk&(#KVGZmx3>1LMFmF!&8A&-xf4YWyQOR@E$%=P!jb_$Z(m}>7snmsiC^}5<z z?bw`e$Ozcd-oH-wT%g8l_*UXbog8w(&xYYpInU(Dg<&vlpA1V%TKpvZy5p(%O=-le zFwM+ZKP6yBfvFT5%e-e$;Yx|;W5RL+nfS@@0AV>!(ZfD$jN_Cpx3HyrO8nyEcU1U4 z$ar0%3Wvsv&e#1k4pKvTZK}o4fsSx1CRO;>?SL#!-2`8)_!{A>6yHPetrFiB`0fzj z!|*K?-&XkY#J3&3IpW&^UoL!71xFF95?&E=j#YC?e6-3DRXMb+XNuGOK*J+PfmjOI zcrX~L;@qy%Y@;Xm!DEKRi^$0ehi>Gl|0=+Na-BK-p5T|1|KD>uJi&Y62S`>HTZP{Q zKmy`?#iRiM+37rqffOTl1u`hezEdc1<&1`;WZ5Zxu6X`Er{90xpypBkvv%WRe?mFQ z`I0|XG;RQN`A0JfhoMtr2d(sH*GObe$J*4`PZ4=sv~eWEDL#n#NNePMaS$>@+d>AL z=%^P<MoZBa`M~Y$ZYc+IbKp&$_Yev>E8#hs{3ymF)Tw9+?7wm#mawI5FXJThDA*J6 z?#%<3w`?R-<wKt4ZM2SfOFOeLi(!0*bH|Cu=#AXq#VO$Mf^k45oimh;)I7Wl!dG*& zINmT8#SZ3rQ74>pUjiZ6%LqmCy!geGmfuG=&n-)|ByAqGLZ+u1_s)!;4tavAC*tfZ zJ@y%K6-}-16?!p2LW_n^O_g~tv!qXyaGqO04`>#~=VWOhgdv;YRZU4A0Vtmq%7b{s z0)r?yJbkUXX^+jMG7Vq)&n;iZ#U`ghj$PuylNU(Ox}UKqk99;IR>Fu<6~V`zunzoB zU<HuZsHiWs9`V4;%`w3R(a}o7fOL`Gsq1M2F<XNZ(5Ec#9N6z8Mc`OHLm<qQV75L? z4+I;%^tW=_U0WpgqGS_AOk{Hrrc%|L!AYp2HOPnwvmnWWW$@iZp9UL|G(neWz5_I& zGTqulITzW?(gG+f$RcHo@-got6%JGtihWMz2AYp@61@)j)QorrQKT$I?P*ljh(#WX zI%`6wAvPkIvl=&WXrhQ^X13dzIk*U^*u(Qzw+3&Am!vuvyazrk!v;2?5z*My32uT5 zU>|F@6Aco4tSR}Ka`dMVBmM<dCEE0fs$`>~3y3w=-e4skAU>T+!oVt**i~A+;GaII zf2_Fx<-sZg`{60}!{e*1e&FV06XzudDdTe$be=bg>;Q#S(4Ojf<S2Lv;+r_h0aqpN zH#3U8?f@0utjd$#Q}<Ur(!{CKkv<4{p{JgI@fsBPA3OCQVoUhL`&%rZhykQ{aI64& zQrb|n;y<)Okq)9n^1GcJ41Sjl3UU=%>~04cBkCB-{U9c!kZe#`$-h&{fo3tc6-f@Y zL1E>1IVs0<1>=)!P{_d+EF1O2#M2nWO`SG$%8@^fb_`CA8sg8q2|2Qrawd6`hB+en zUrD9`r|G?~0`u4u4RnY?n>W$un5=%Y+)<V@P>vj9kwMY%D;(XQEfaymteJ<A^>^ro zPmI@A6gp_WmsE%945{PgyQHs%Ba17}tqvOz)gO}S=aPxa%HH#d$UMN*=O$Q!TDwKU zNN^n+3+&gS&_VM_JWm+0ap;#%jQZ;^iXErW2}$~6l+)W%5NH}5zDyaCkh76jqd5^% z8rgm)Dd7peO-2~h`)p%mv$Sn+M}CGx`LwE)89k2+6?haJgqVSvOF}v(cn?B4;Ublw zVuI@v2`8%r6%)KSk#G!)D1cHi!TLnPt13ao1RD|w2UUWK34SS&@MD$07$-p%CJ6FW zsj$WpMU1eJ99eDKVPx}HP<RNwUP^LI7zHva>O+we&l5lT;SYa!6lVaRi{g-uv(_&p zYMrZU6|HipvE&=N&NZxa7xon#bxKxrz^hzJ2N}Zg6#S0otNf5(Zm_3IN7bU+RMZnL zCuR>OFnes3WLczYQ14xObfDR#cuNH@#ukCJSOo$191_v6X*fvPJx-N5QYChJfOUeY z0?nR4S8vFCI4LTU=g}5Px2qYaMR6vemc_W2bf~uGJsdOKSKK~KpVLQbok~SRLgtom zJ`QSaakb-poOUwpGb_2g7UPe|xQ9sJMWCAoo0H`mUR(1dj_Un_^Kv}(7f2)HD{gMb zNhq}GgzJ0fHjJf0Y%F25V)ej6r5n4VPDJ@)>$#}IVtmLRRN@wM5_D3aeYBV=V<+sQ zcR}|6g4iZ2fX`~4!ybwgevzPXuo=~7A>(CKWo;`$2doH@bm-qvdC3e58KVJ9=#R*8 z{l~}x`#}e?@eQ>qoVxGy`bO2(JOQj9BN6S6b6^`dmg@;pH-X&Eh2uosi!co!Cq}G2 z`q9WE&qt%rOwxcrO~-X>8iqu7nz^fnr&2TrIvOGeEAbvjM~wHD42`sI2(Du=JLIkJ zqyEki-->nNrMu(y!3j&{x{lkj6PHWTjSZW-aCXzP@dm84Ihy>VZQS#Bg)&;r7Bt6* zosF{(t?Ct)*e>W6IO-`w3Jb0tu6nVc#cwl6b03CZ4vv&9mRtk14W-O~8F_{fuupI> zwnAe77-qqqPv}9^u7gK$$ePhQ2&;Zl7!qNc*}V3W!IPY-^j}U;>4HS1*ds;-%uEqu zZ>L5%4A&QeBX70qcMVnl<*I(q?#&9<0sB(X<F)%)s1h17Dt6Jnpj+EK5l1}mGLk3w zD75SNReIveZ-<buXD!$ijtAKf$N{s>WeJOE=(~;607`lq?;J#N9@CP0SpT-5XCDq> z`-tys1Cco1IF~s1Mc|%op9k&Xx($Ma#96Wee4^fpIF#k7zXViQg6cfsgok;!GCEA_ zD(aAS>^<}@=LiZ}5qWSmxD0@^IPPC1+UB?p+6};V95m8X2hBHX^?~pB`fz?5-mZdm z<=BX|SBt6TFm0yb(8FRg4IR+^d!G3QC>@^PcJ!r-=N}I28}Y)ikvQBRzjCNT*pZj2 zbfIN!;rWMMF9l*FUg#Rx+mO<}`i%hK;{d}5&;5K^ZxF$ABr=*NB2s42sTg<n{SEyP z+Y1V{nmf@-w0=lJJ%Ahs&Bv@(#ww-64wh&&w<7?jjiLC}YH~&&w&7K(eQyqP5X<}; zY)oG}&wLD<r^CbM_L1g}=Zd!rsyxDdsOo_9SpDw+C~O{reTpX{cZ8mM0XA8euM|I3 zr_xHc9@be;eIv5PDBAHlmEso9?)p^DJve${$HD5Eh^D#Bwa<};O;D={(lT6F>g|j# zt}EV2JIS6i0sLa~kcCCpNF+{0B5&r}15IpD;y9MXLVFKyeHu`*F^)FlZ2C@n<_qWV z-1lZiLt-kFh_vL0hK%;rk0m<yesmc65bIG)a}Rs&E0J&u4!c`A@HC8;jn6_kqrsCe zLG*BV+_9Wf_+G<zo#;&DdY}l>ZFP=YIZ1d51}2M4{XDx>45?vrFJs<V#*V>;$xe)E z9tjltbzKi_Eik^5B3KwgR>O(n7fv^s!?{e{jj)Y^aL%A*VwYX(K>1yZ!ja8)fR~f7 zKIZbzzyM*qh~ZxURR|VX!5;s31XozWZk{_x1f$2hyP(Ti2bwMR04|5U!u`5|oj?ig z?4aXp=WmC9WIMMiQEJIi_DL<EL^gkjPIXp}Wj|Jl9fvtVoe#L^Y_K5LEOZb`Q6V}A zxmAb`LUONANF0PdtJ3J`oSvuJ;Ul0eYSSKyD|KL&Q)vX7NZX=coyCiLP-V$pV)2E3 z399x3b2Wus%i_D6J&)}Vnb^RRlpL4;G<cZ=5pa_B=D61|mPK>Y{Fzp)%MWAtVRC6a zH<3KiN*?Av8_Cp?!7XCU!qp#e#WK-v#7VF}l3?#*awV?Nn~5w;VYDLSJQdj-Cz$vy zEM_w3>2NTv_^yGyA2$CsYR;IUq6ReQN7Ov6nntRTj9a9Mn=q=i<!YL_sRkC7jt@~g zU-HAid0xPDB9FXf2L|s3;zsNqDAD@0-at)bnm-jMo8rTGtegkOf|SnKTbPo}CwQ+D z%z;BDZOJ_13BE4WP<-+MhG?tVF4gSAFJF4_1iuYmGBk1>hhb#%2dFI>VuI^_tkeT$ zL8p#yMuBVj<DUyOb!?#PI;@F40rX7G(~Ys41ldEx1Fxh(yOTrsgxio3SbYdL(6mFb z$9rI#Je#fr%|R@;=fPhyJ89L@Y7!YE#^$w}yXc2ig-#r=G`Gk?0|)Ai1~ZJ8!m<7_ z;!ALDCmc5S;Oxj>aa4uNwR(uTNG72I>>d}Ydw6|H{37V60$>+*9`n0g&u{~>i*q>` zsX6Sg2ZTR`dO3FoR`0<ayvMkETfp2)k^EWm$24=V=fO3^+T>g$>@Q-f+4JDdh~`Bz zjamLXq$xXF%}0qqe0n(lQPu;!wyo9NA#vx0&7FeEPS0-eZ5!{ou)w+SYNojZRN6tb ze;+U(O{(kB4UZ)_6fa?@GnHV+^l3PI|KM5}>7hNOd4dPf3Bspp*H_-qY;>+P<ZT~2 z$L95DK`4XV>k0l%C^t}OEAIO13ApQKWI;=qB`4kgOQ;lVuHy_}IDdO29j{uGJ!<7e zS<yT#-gR=V;=cg}0{dxx_@re{_`-AmdQV-=c1j-41B*d~SO{K?dfX57#(t%wHj<tK zgc3SRI<j-wc$_R+WszK5I372fXfG-omX6z*b((a~`dTs*1W)M_j{J^~oc8fXC#HQ- zq^B=tGh}vyl0hK7`N9%)Eu8q&v@iSC%`mdlw)ZPGJhcs>4B2%)1Yer?+Tk<AcNo57 zk8o$Z6TYbUI^gRPUl)A6;_HU5Lwr&A+QrucUz_-P;cFIOAAEbncMQIr;`<Q39pW>N zrWS4ypBuhL@uk7nAii|?YQ>iU-&XjV*c9%M)1@|Jh_PRyG5K<TTykK4oUXOw>74Iz zPXxxz$J!rHh)B#QvH+1GlHcRxV{S2B2z|LHC*(f|?prx|xXTD<OLK0*?G89snlt-& zip!AOw1J)pO(b~28sCQrFwAou8P?c9{fV=SILd?FSy6hR^KeAAnp?rRkQ0fQ5+;1K zmcz|MOmjxG_ovRy!?#ljuonq%nw6us7G(76rGFEdiTFtlt+gUd%JCA(?BC(d0IvNZ zi<O$xdkLaqxa!MjB1?vG{9kP|?}d2RS<0B@RlsN>2OtX|rsWbMAe)clY!i!E)o={V zStMpkXcfKRWa00!FqumiUc3U6{rogo-_)*l6InGpe=n=I<2VRZ96)<f9qSWoUS!!0 zo~n*4dlXJ)WZ6zQ8IfhX;G{>E?SbO}O-{C&)kIde0%7w}G;nkihlCZ^#BpR-nwEh| zZG<p*>$f4IiK9;Ci7b0qRlP-3{ZLZXr~peZ|6Ncl$O+b>_bR#00E=EsvCvmA8?+ni zQsU#~nvwSS$&Tclew?UD=XwST*HrWH`WEH-p?RSjx5iIP!k)LDYz2lGTBzBLwsDZ# zZKD+U?;*0a(*c_^&s21ajR^+!o+iq#0d-<F7tM#n@m&NBROzEprH^)V>lNykTixW> zZ(oGah3Om%<wIeZx?Tw9?+HDp?i;}+B-|9lB_uSe;1UuF2Dya9>I}=U`;$DXryyaA zX6(nwo5L~O!sgb%v3}oj)nh(fj{==Oceos<rO(YZvczE$fyUJWNx&WlZ=|6%H+g=7 zK;H^bTmiQr+BOU``42a<nq7S76QOq`^L9)@PE>fbQSWKRFGL#dRZ)k?P~jXg_NZ&p zK!#2%zA=k+f-ztd?A-8N6Xkw*KFTD9kV2Ga9@+vmZ7}Vgi3*y!>@JBcYgBx@$s(0H zOdtaT#Aw6$2|-ELYjG@w+e8G?D9saPxGidMR31<om@Q9iwRJUezs<dSVz^BM#Aw8b zdSD~H`Hd(;1E#8|+zEl!?`4~K(~Pol!Tg#_gXl-)QO4E;CPTo18CMy>8)4pA|0NNM zzKg?SIT4Ha^QA`2y_y3de7L-l6Tf(m3%%I?y!0Qf2HV-G7om%J2c<99p4wPoz;?f| zAN7Y8mPxsZUEU)3u+T!x&iSNG%Yge8oYTky1o}xQPfnU_0w<Tj_Z4!^d|S_%@8nFn zSIwE%Z1^O5-<UIxYl>j)k^J{KR;(!%jIU3|>_;N%e=p~J|BS?JZy|iVq7<nya*q@p z?MoAPl>e7>DPwS9=c96AC$+9p<Yq^R1s{wg3vkI7h)%*ybRV}~{hGrmx)Kx)92>dj zdzQfibALTh(sa;bQ4eWn7dB%;{D>}W9*mOeyYD)w2t2l-v4QAhysd@tLuz4ZlCtI` zJ(vQk4`YceCmxn^QDI+6af5{R(9Cu3aIV8PV7l&Xqe!HAo3D5IChC%BOWs~G_q`+Q zYI-TL?>!aS-)8o$$c~wwk*wN3+nT50!sKxLlQdjVf+cA$b662Z+(<FqhpQ7lV)G8^ z`f%=0V480bFf`I}W!{<kd!YIk5%yH%AVpF^IEd1{VzM~w@~_h>9?$Q>@~G_ryh^d% zUY+dZ>cknQ9Bhw_)61=$u9w5h+8b`gG_fG1ArFg6Z2HK8ysoBQsP;3f5+z$>EJ#{= zf?@cqM8RMeWc$I~lzup#-Fc{X7a*zt9SYxFkvVSs2AVOfb_Mpk4^B_PcyLs00c<tM zJfO671yNKlV2XuIUGf^4O{U+1jie+t9B{n32Stt8j}gh$k*A)TCvo;yXmd>bmch)b z#%+_6S=C(Ec`AG2E~JBbn=pbJ%qIGBTx)+J+aBGtXP8Z}5a2#Hn6_aOSpS{a5mahb z$HRq`mG|QSfx2i!ZhupdPbTu*O2(;8EF^jAS%ZnLZ;d@<;ci)vpsc`j;9Q0)O#-_8 zqsK%3Cl-*ot=f_gs}tUv#5*@3bBAndpb?1TZBP5O0R+wMpiNuuC4vcs?ZZY7jrn`m zH)B-MAh2Poo(<v?!ue2Dx@9#?kLZigJ}AP{Cbr`;rCxGY3n1X~n&^6{C4Jha=E6lE z)=BF<o=vkcdVvE8ws8)7u5<7Tm%C@SXihS0-!a>kXL^}D1~I6tu7#owZvu#28<LN+ zm@WBw5kN>-Ct=@KkzJJCLrBHI2m(Igst_uZv#THi(ztsN*<22g&Ne7s>&qsuy-h3d z?qD^taLDi8%sWHy78>5)q{V0}(s*+P<>;}KJR5g$ndT1Ofuj9g5NzaRWT`+F>~hwB zT|v7S!5o-zzJy?1%~mQ(o(F3XKx<hdezh*DTOS{v0Hw;}h28m*U(EhWZKm;;sl-KJ z7WS~_dW-}dsSw5gu&foJ3E6qES9L7Qv++YL<bZmkpsww(F~r5es2%DC!oyu6uG`Nc zj#r?Eh^*{>$VCkah5L}qAiSOMuu{!MfDyqB3c>NsD9OonBWg%Q2f8vCSw&RXnV>g2 zN4@no=+p_yaSKlM%NJEX-7i~^MuVA3t4T_G2<o_PeLRHe1LkVJaSSUX4b+)5#=u++ zj!0MLY|Jt=S=+YirkR``Iyo3PJ@ic@qx>4vGAgxtdJJSHf_{aA>JLm9TVbOoZ9VnR zfp)x7#}jOY4;n4U*r_HVZ=x}q7dUl7mdh(4a$lSdVIv9B+sVn$fq^W94$al}NVK-} zF9mo9Cg|$=ud>^4+2j~?*`#M<D)QhsI&LAlSKe!tnF6JnWop1w1f@l>JkD(1A24@e zMrpApwg$+T$Mf$m+4ts%z-z}iw+xk*!Zc1ogA(_>Hmo5pB~}Zpl2T>9)Fxrtl&QEo z3J*$7hCMKuR$6vPj@OT#PJpd%UWX2D!Fl~SE_|_s;#SY5R*`+Otq`8U&gwGOfmOP| z3ik3$i?!>fgMMenk?N2@s$1;-kgL+FlRCB564=la5)Bh8rZddBsKwS3YN;o*4Av7` zU?pv_^aRB#N>4z$H)uBO^5O^*THmRqy_j>57jt!6{L(}`uI;0tr;{g!&4(g$Fb7yg z^bLhDmG41+p~Ln-FSK}#JJi(lJoT&K(_7uL8@h^`8fVKb7n?hA?P<+O<+W!}Oqrg? z@*fV*$4Y(v!=Zn}e!c4@s%ZdZkiBV4u@(SWY)_;%`lyS$ynwd_n?^ij5MNDolrJR# ztsPcvI})`aZpTD(PyAvC0qg>^N?HTju-kxcjRaSLQXK18%|=&WkJgww!B#sWdHtdM z9hex}?CLm!C67bSD8x3hc_pDZ#v;0aQMi60C%H%%)uU~Z%~J2+5|rg#8(=UE0cUPP z5DX(3vp3cR7R78Y(jc6V4YGV5TeC?vVCM>pRN1`H^ZrAgO?krNo$)!1xSbV}Y%V03 z&BJI3l%eg;cF6pXHLIAs@4Jo!kR9w#!z=7i*TR{c6Fc9x%7w`cG`j*{Xn}8v*r(^g zH%WYX@J$fkBKW-GTMAzmd{UHlVuBFJ%1*2y(oRfo0Cr-!+D;74rd))f6-YboUQBnk zK@6=}aPoybZm4Ep!60qs>ofB+ExU}xYG2p+6>JFEkA$5-H{lEPq)AQ3!Y0Prhm8p& z90CJfhe?D)x9%lWh>@?Tf)7l$dx}gqF!AeHnuK`2B`Uz`l`sg~NeS*P<@Z>qIM<ku zBj*XBgK}D3V>WfrmAJDS83KcC?6aYm_vFm=XTg07F1Q(XgNx*?uy?Ra?UnTT+6F&g z+2CR1RQ806K9LO`AK>t5{G83I2Nge}Sy5R0*pTRtzTq^Y-++=$WMVWh`>u8Jl8v`O zx#Mb;o3%u_nIEi`^o)yDIQ?0K*{9m9*M~udT8>iDf(ofF)=Q239CT~qm{9lVs3`_< zv{BMXuG98fU|fzgSPLlmsTad_C|_7YQ}FJ?(5GpU`VA&2>NlJP;6T1}LX({dFF;uA zZy7#+K8+fQb)uE)qb814a8&r#OxxO>fs%&Ps%asO(Vr^IFJQrA)9u!Z@CPWsWum-@ zrDr4PM?L$ZDLg0%x*W2S_g;+q!Z-z4YZOdDiENmNWW5l-iEpr3m&+Z(oC&<K_;JR8 z0=@RlV{NWBWPwVN$bsE(Y64hX^+M=3Pc?h1erT_T+CBI2qPZptFspgMDSm~`Q6z#| z0NN9kEQcU4MM{3|Gg?XpT71^pC(x7h@+X({Hark}(6AnA;OTs6V~{_R|C)1%W4f2` ziHy{s+%NKlf!C;OE(bQ~o=<3|19B`}GL>v0Rvq6}AR*%x1E7|rl)=3iDvp^b>AfZH zHt6$C>a-8QVphY!Fmh?ycyjSb<%4%$G{XuQ{Uh5Q!k*P0nSyGOH(k_X#yoAu$lHct z=(;C+HoimBx`P>@K!2BR#&;4qA)nL3d1=a0Oeh=KM1h-^j_hGtOB^|v63*o$V>c4x z2zf}K{^w%fVRedFQ<G{D`dyHSN{_GA`A$wmro~sVPSP<wyueKrB|Wg8GC|d*HxI0t zLJo@(>EC|ZMmjBi4ncq;2>~Sst)G%+woAY&>Z;yJ1oU;_qS1N)UY&Ic#KKi*SoBV! zYMDOO^dg9{8nU622Q`>0HEMYIlIs^%;!Q+B4oTGLL=+?x-p7<(JMm2bT;PPbOKjgH z`XVC9H0h(S;)Dfc8~R+Pj&9j?L8TMopO<Kte=&wHhh*L*_zmY>lIZiVBx;|ONTd0m zukyn7H_4KZM1MYVYg5>r;_c+(l?ztnO(JeOv(J(|(#mP@I!MZvMNdbZA}KScUZXlv zUYnIN?_F)hkgFxCD-i|um8iuyl}WBe>(Z0y(ux!zfQRd!Zk-9UfqWhZ`Mq)6C=R-% z@iSB1Xo|W>i=eWR09o-9UCF9My;i^FC!*MINv#*e=Ac2k__gplTA$6<pTYJDL$UQE zY-kp%`~_^MQMOty7muo@qV*Q5BscnbSox$;!+GoO@U?QG`s_Hqw3z0bhc6)bPKo0M zq3(TMSsHj&oO%kFMhPSMUl)IxT+{U@_(!TLGvhcO%}ObK<Jgl)rkJ-;Nam6IEOoml zC)$8!CDTYaBpc1vdC!1XXarRz8>5ahY_yL6sIv-1U%OI~gl}xCn07nHW|3beqClix zyb=vS&=C6Q014>W_N0lI$wgCU50q+L@ftX!A5$>O`9jG!tFl5u#{NLBTwvc9;fIX+ zICo=O1+Q#FO2E1T2p_})is4+r`?CP85xx>$XDf+ZbPTJuTlwJ?16%o~9m7_lNut;u zw@LOc>sOOW0c-{~sgaOXlgLpYqe&!HIpAt`p1^4cQ8%)xgm_GvB~WRybhH>@jxIb# z3U^RVbAUh@$BHHi1h#Lmtbq2Eg(rjc{~H^UP`1W{N1^G%%tgft{3DsMK(LNSzOR@; zHCT@CJqyl%RvEcA+<TYY1%5Hatl3#t(^-q${_{Z~<Wz%01`k+CMX-`iTrrY@Apm<a zekbDXg41n^%9*-e+KDpc<4c{gx`u$+&>64b#`ND?hoc6ZKzvs3p~X)Hm*5cMvsR4( zoc4p-i@opluZuD6K_1Gr6}=44re|ecEN8MBCzD&%@f>{c^`P00Hk<vTswj^V4Ny!h zCa_sCou}z>!-=a3--=1`p9R97B<oGe3+bpwQ1MAz681F$c_<J{?U(M5!7?5*oWSMh zX78ZRfu76^FW{Ykjs>0iM44tFzBCE_xmE2i=*_&?yJA$8@`u6;(!=vR<Z~tAQ%(SB z1!of;i|hhMAVU{AR-Z+QeK7&AExaHN?@62xURR(wmuv#*Fm?YLylMgu4zgm0JQtuv zRqwR3<hqduYI7SjAZMm#iNd%&jDv>iBmrcNZz1g46fOq_CxgiV#KI1BP6Q6kT=7uT zhdL$47if5qksCI%<f057SP+m{Iq{vCX8S!E_yz#5bg?7=>`jieUYKd*7o!iur#tpn zn9wN;x$v>RU55&~Wv@rXCx=hFsvcaUJ_roYTHND}+d|f2B^vuFfba;6iK9CBI+}n) z-$di*VGA)b!z}=Mc&imgy+Mhvr4KzhOfKHZ??Rh+=r+3Hx!B4?*)p&>EQYdV)E^+T z2Dqr@SW%5c+uJ$a3`oaqu1GjeI@*#*!U1Dk<rBqAN(n4B#{M7+^NesVCTX;>6G*V> z!KD;j<hp3=XNbd~3D21%qZxw`+gbAF5)KF}F{H30dhKDz?~L%$fq5aK<Q+UcrSA(p zquZn5iU5SHNI=KiXYw|YXpxC#45EPO4~g_4n(29v$Juo|q_c2VMb%|3e1x>^yfVd( zhj7s-I!WH{B<bIQ%Z4DWy`*<|Y(2k0yFb^GJxj4ZqVaPplx(^GCH4n&LhL%}3A=}W zWc3hl!PGreM=v(Crz`ezlD{p~hOTN$&^{xC&ua{kV?YNTFOzzclFC>w?jJC4S3H;O z1Nh4GAXV{Ly^Uc!7i5z`0fRay%uS8ZbNl`P?Ounldo&VDEgc&9Ox-gAT`s>G0DZ&1 zek2K(U2Kt%$K|oNfZKKRJ0U$d_;42dFObuii*jWwh+M3~(TgtRh1t0i(a1{)h>JE- zc&JN^2z5tUh^P8QuH_%L#h@p+8ZRRup5uKZF8Wpnlpw~SyXkXRkd~g{`?w;DJA%k| z558EmM=ET&Ltj099NXEABJR^pbS+hfHpOV=?wLPx@_=e`IGj5HQd+)vaZ>ygSgG>r zar5ykcp~&%+ax@Q`2q5nv(XvA2(BAE$D^lfz>-npA~M=xB0UR$1?kvsnCb+6CIt}c zp&g4W#*h5e1=Oje%U^zjH5df8d<U3&dX1<v=2qZabG-lwrMZhv{IlS9r`n8az0~N4 z+7%N4hNxgUB?x)Zx$Ges#o$tE9x}0KONH$`!71yi6A|{%e@z=>7qX3Vo=^5IrHx)| z0_c{zwm3Cm6dw*R@P_Ai*X_dyx^BpMU74tLW3G^{Zs8P{m{~~$bSATiVMO@y3a~G} zZ-VZ_?-T63mM}lwf=QAmBjNj%_{PDvQ+!_daPmcE+hu3lExv5<l{aGUB<Da5vc8C% z48nXa^=-aD>R{iL^<qe@?#7EF*mZsIRJ2Uz`Gw?>b{|SshEyYyk0Qjr3MRm+87#mP znbNc#!oNnyi+TQpg9LpkHSy51LxHo%so&MN*JM4BaVeU}{|5ZIIypX~I^)yh+0VjS zp5OwsQ|&lkBO)B!`VSA5tx`cVUsg^q(u*LAwVv1|B<fDIg67z8?l`OqH(;eaFy4z^ z#FpK_cwX>@Lo7i61HpT^umti@G{bYVxEx|{%dVgtsf=!biUXp`0$1|_f*8Uq%`<(` zhHQEVRKtXu-=VaGc;*G|QO~AaVGb$tu#^$G^V=Sh5+BC8PCCKrK%Osk?A*yQPU!by z6a73&+fq^Fce=pC(pZ^*)i<U8>ukU@^hWaEa3TcaCfR_uLbOH9H`wlP0+~;21I}nQ zKO|9MU(ElIM~YJAmWeb`o?yl`Jio$Rk6kXP)UvWm$I1@VKn8Z}&Nn}_S4nPsgb2(1 zbAW>-dG)Ez1BmA$3Je<`_FQovroL%r+WNnMs9ZfOiv%`QXh@`Kg5!{HNWvE2CT4v7 z5Uu<5`AQgzfuvWg68eK8#j+Yk6zF8HxLD*q6roX7G)sa-+`Tp!u{S_Ufn=GiSv2bk zB+G2X53BWtB~K_1Vy{=XbR4+_mKBkOJYBBW8quF%l__LGa#{qR0Yt?&q=n35Vf@d} z#07lfQHE_w<qy?dk5(U(8blIEB&L^Rp_IgZeY6^}T4i<_qV6kDH&+`SXaqJfCShL_ zR8|CWpm@)D!XRi(AKD#9tKkAgwITG3Rvq+3&#>}vx6LP4BY>~)Np}h>((ner5i-au znWI8Xm<+Gb2^eQ`)g=t1j^K975nQh7(v^yj0!=D%>H+K9FrNvSY0&)AU4hjZoLi9- zn~7))%kceo-u&%<L{fC@l>O?C@jy$abs6mhRWj#%Pw=oX5SH#Ed@};aM*Eh@8jE+A zNFE%@G<n_p+YPw4p4H(*In{NuS3dU4h+z%pyNGzV!TfXlcI3fKL0N(GS_VlQG2dd# zJ?DbEueD(&fW58aQf+v{QGtpZ36RP+3UxGE7h};lXo)%v{R>{j`x&7O;fnYIZIz(< z(ie9By1AK~lC<|>Ic?j>s=*fMIDEmeFP!=77UqGWLWA(gt=~0$srT-cj<-g#bUIiA zea$nafHn%(P`@qH4faTqz7>N=$ftLde6l{Qz9F+UwFuj4KZIlw$kz8H-pM)7|D^h= z_D&QGm>KS-JCJdznQ`v|V783`i3#m*x*dMPC2@avPC}@ht5Oi#f>>2kvt83{L9=%o zOM_{EE`~znhW_wa#(=5=He8O6^M3+Ek#Z15eKD?KHOU1*2tQm9y`e+`5FohOoyfE6 zBnsCsAFnb0es-cUXWNZAir4{-iPu2tI9oDWTE$N*SPg;e*axy3bMk-=z~vaKtYrn2 zMR3k}p5W!wCsy~l6n(%a_`)ojz>3s39&n7k7Yzg<I+Vk~g;2Y4+QgBrS3W{fKGK3d z`H-ZS9b=y@KogXd2luKM&M-lwfoq3HplZTeg(k8n3Mok@is0w4Ed(`_hmo))-2?~` zc>_H&Vs1sYj0j%DKxapA$`<8W$8W(S+&l;4+;|oZ5^jDh1BZa_#SN<4;b6OLE1VHH zN`x8Cqe%ENO2wuFJZ^m8dp~$B9{@fB09qyU>x^W<*cr^o_pzWBZoQTh-iA`FGdN0c z^aiy75w2(0_$=*m)?}EhLst&6a~!j^SS~R-`k$W?p5crHj#kIg58EN0Ayi+MM&7{{ zVfU4Q?JF#?o|1~Zh#y$dL#iTKIHkts4r6<^vdO0%Bf&d(>^rH+7a)su3ZNYgMMXn& z*LTH+X>}K`o8hTV9v|FG`&bJvgqCwmiJ8HAW5fSCmIfmHt$P1LQvXC?FrmSG@<hd9 zo7BaRoG2S>!70rXWpO~lg)7zIyO)LDEjWKTaeqWzgdn2O+(nXo0Sj}8hSb=<GMn`= zMtQ?Quh(BblS86Q-V;iEQw=W!%4%r~cFMW>+(}C}0%DfiDTgk%sCd2#(1Wvmydq_b zobkgcxMrZBRfI$2A^kS;by%ta2^V>D3*K?_pQ#L=N?`)`ft`r;bS&3tJddZwcu5Mn ze=5E+y(ydi{2h7>@aP{{5teQkkh{@5BPNIK%||)hl85T|<qB`~eHRWAKB!0myP*Gi z>p1kqvK`yWMK$!7@UkclqPSl2>>laa{WKS=vQTjIkUR{H=8ma2;{F@?Y@-E0UH#K3 zYby`{qZDrd!tk?K9RpNdBIf^{u%k36yQu>7>-dcpl+R!lXfI_x4zNN1(?(bY3~Sw9 z``|scOt=EsJ{7j1O@9RSnm8vyuFV!92-%~BAgO2XA}JY|wCISP&JiYpS3t0nHY1LL z2HsymkmxR+4TS6o<@*xfYoE=R&;5u-r{1SDxRH`1WJbf@q?Ldy3}eVLLQZ2P@1hTR z?W<bfWW{fzdN5cOP#TEn3>4)Mqxvl=d@G9zT+V2`6Ml~NkK(0e>6mTyu%h^>mexlF zVZ(Ri%OZkJT~C&X)pW6D1EUP(5lMrTNRSs%Doz(<mts!C&GquZIcjNa%Y+WBl2k@C zrwZglPw3B=bRbXc2P$LQNL}FaqypDV0Sx6wbT&$B!kwCw?M#*Jj^m>COHs)D&=a|G zNJslQUI^%hBtSnnjid*IpdA?e8RF5aolEfk0EO&OP3Jc$VH2#s0whRK5XU3s+?)n* zCp%9BH76!k4hJk~9aFT<0!DC_02M{#_7{i|A?{tO1)uDk(HyNhX*PBq;`=Oc_y~NW z5$qWVBHeH-L|%gifG<GMx|avq#eOVp=)#&GEwU$B%uZ}!CL`cxbSZbpNp=gSVr%J& zJ9PR=0haGGDM8m0pRJf4$4vmqJ|={<rwABLKJYxtu4P&55GLe75ABRmobv^WUC8yb zA#D#)C#)nf@Y<<pff55y(>N#_5rZ16aoMy=<O}ZiNv(vhK~CWM;A<4$I{3E0C)u!u z*~aWL^we2gU7BZc=>@8iLm$sdGHG1+(S2s|kRloBMLh?uK2Mr#V>y=T338IeGOHtJ zfhWjO2LDSrb3MUtD*wwlvphl09*93ee?a-Wa+dh{)v-V1nEq<GujNel-v#%Nc!#wR zZg<XN|7~zzN0^_a`cuvn|BZ0pz>5Pj&`}%$2u88{fKBC?dND#yhrB7<N;s>A<hb~= zMq*;dEu`s&k8>P*9)nYlCBVTL>UH)X`sq0Gl-F)c683>xYJmnzYem{QI=(Gh&Iv~= zkGN9finifp6;U@bQ3w~RKm_zFHP{+5v=ShP7{obb;#NOm0uJmSum^3KFt?M{=AM!m z8Z5q*#UIthxyItTa>s#&Br;&1RLz6(fr)=((J!EA6S<TnpCfw=1JV&(NJqt2UJdA# z)c~Y4J|EKeDhdg&#x|iORBF*_lg`INPeNw-WL&>~QCqevB=$)!C=^e9G7FAe5VQk! zN7OS8`{r=6!t*=fz!=#DCqs_D4$#2A2#GKIu$a|^f*-OSoHbO%bDB87uwmwTd_jii z@t1AiGw@-9-t(C9WQP6Q0Y3xv$Z8!Q1_b$3W5HbUSxp?WcIm$tj(oL)g6LB(K@i~$ z$M$$Wen27Y!;9YVWe;^vyrYf?QT+U9VbTHDNyssPy_3X~bV#75mOD-T<M*60ys)vc zfBY`(?$qw1+TEeu?b_X{-G{ZiMY|7aw^6&BwA-NFdhOO~cfEGkY1gOSO6{h@>_oiM zwCmQcq1_L4zE#>S((WDFy<NLYwYx~WdD@+)-8tGFr{QL4H&a~L!zMJ%`G6lA%Z@&X zSqU0ACNsRfbst#B8p7v+;&!f5<YJblnY!3g6)`S?`Az0SB+7(1GkX%jeu$%*Ft0Hd zq0b=qHr9xUag3OV2wl-Of{boQ{y@uwP{(Zt8j*=G`p0epx`@2(KxEeiz|4s3y^v0z zXB@J431_mXSFpJSTE;;v9_^rB*ktU(@|sH3If0(^l13bGXAHJyp(f&ET<~Mu!~!kp z?;VKvE-*lktngWr_P7fJAN2dq4Ic5O_h)`f!f}_Mci+_h0NaE?)D>vSy6wQ^Bk`2b zfyfM3I5Wsx!RP(G@uwqeEc}|*W7Kf`zjvUK@LN+E0a;<h9|C%f`S@UPpy!gN3?Kq= zL-kGc0=n1U^rze>eV(K3+cJ?FXt_i_j|nPg2t{U+BKXz;2JMx&WTt=YBt(RM-9Pp! zx~=_V=g>Wf{G@yT*hMNo@@C-~H#t7})yaRW`<qmf73w|O9=e)XBvsb9XXhDD&HUBP zKqTHp{6$;m2M+(5S~${eG>1)hB;SqC93sqCfj~q(G<N1Od|_@1e>Ncr!*$yw2uM4j z%QUe?uwV6$U8=A`xvL-%`p2$P;r_9gzypf7S&QI*hoq!MG0ox2kor&cKlkV46Hm&7 z2nN`nZV0`@i?SzZUgYknsET`_e2cYG<%{el#+skl|AA}Mfn7>?W_Gp@_A?0}2abyP zPR0V!Hw`^6<!?hRPfqX-FRc53zrHt08pFeYN=kow;DB32`rmTqCO=PLt4J%36@-O( zvw>6mk&?#A&E(p|AJW~zm>NF`Cz2b9uk33BXc}xJWF7$?xjmZ)I&(qPfZFnoW}gJP z$@+Nv5VG0(;TSwyM`5Nu9~t7K9nc#ag*_*Qug=2248HGq;3ZTMzIGf!laEA}xEsTx zrtVuiCVY>3*v)BE+dTL2{0u%=7}%da^*ujd00<q3&Kbc~O{mpV-+|P~xHaLc31HtJ zQ(UivW~H@qEo4N`gR(Gec6w-*8yqWhK6PWklexn)vuJYdA6qGGfXyD?YBXj-B=5t( zYajTo2}E-PT~GNgV*`hs#S)}Qt_FeFOqo3ip-doT2+yRlVXi>SB#f;Cli!c=;_Cjf zQ^<Sn?42MU5r}>j3QCiW1-or_8q(KW>1&V<@HC6vj<_fd6pF2yG65eojX0pf7(YVN zd9A5TAsa;3fdCPAZp0mgt<}J#_0ip+MXR8O2xDRkC~^+sw-JRsQ(kiyUdkWr9e5s~ z8p?OVAIJx+CPwq@MFg=;IXX~_K=|5Rgr1zqsD4j9-`0JSnZq;iS~l+2{s0ky1L<`i zFtU1X_|))??l7hRh{~Vx7q&3ZZsyJK)Q@7`V_r{vP&{d#`uXsXP-uVp%WOZ^Kzdje z_leY!$~5$NxY`{)HE<wp81}eP!TnM}{-NlDC<Y6Z$`+F7su!BrLz9nSWilrI(?;;t zw6hpf^SwyUZPF)^tA2?F8m``OM(}yxE0OuKyDrQ_g$-gpiETXfZz6XD`}WZ8RHwT4 zzz@y2gKbbIFq=!_5k;pf!TrH$U=9!___U|~0J=DKF~Xk5>jeM#;PAR<VZ-b%3H*XF zhG$M|xTfV&`X{!#T0^~|nnTea;jAOROLHhZzquqNC2g{M?h6v=Nd&rkIEse$)jiEK zqqUy}tbGFj@z5kz0EZfe$A1}SZb`p*m{rkq9;*CoyeT}IT;uw4_<Far@_KFqI+^zu z+Dd`A4l?f#5VmE2nxDoYZ33Y5kDY*#5kAWcKc}8cix|9?!v!<t1WbG3VWjr&kQh4H z{~}e=;QLsV;H=<PFua6sOA8+HAF-k3p&+tC4y&ncjnR}1&?sh&7s@w^G;X(}82HSH z`Y>J~PY(E|bFgb*II=J^J3BPPt#EA8D24=AE6<Fy{;{lca<kNm`CE(;@xIXe4*4%Q zU|RJ84-cgG<Yp)$TJ5k=7eb8HwSezV52sA+@Q=d#VQEue@=bspbUHQ*{C~C!*lkUM z7oH=Vv5>$Iq)H1FnRVv)b0O&HX(6d6{u1a*da$8#fN=w;QFRt?a2u`Z<_UfaarTUJ zpwW*13gRU|6Xz>J9*Cur!%JmKJQ<Y-kAyn>@3f|}O~?!Z#J&)p)%)41zvADv>80WO zPFK0vKZ)9buigB4y6B71A7GTnZUI|UpNM{wp+bZd%MHuTshg5#;xpK(m<mf8OX}8T zo#av*sRzhk;DwU9Df4gD>G9tt>w}9IV#ZIWPBd&mj_2{J;hx8*X9nMo%uLDheQNU4 zjp4lXsV}b`F)S}_>I+rrfqkw(^Mt8?_D9jjpC^3s`{ehjRjh~NnS*bXK|9539BWT1 zsk@dV88x2-ehu{s$2MZEfgv*s_=B2nH02-^X=I$|@!Cvr?i?PuJtZsnmVZpVwWKj{ z&=oi^Vd~rJtOVD`q4n5H9EWo~s0a-63W2|(!6SdmxXJI|7V7={@?}atoqPl@`6h4y zf2N6|tjVD8*$p`YeEtY(WuOO$k4Oi~x9CeqWT^uzH@P_hYZ!D?Ri5)1%D*G+K}&`M zfYM(VPk!Gnun=TU_l+j5_V`fcuTkY+SM+Fb&?B<QmF0PS?(pE#zE;%T`2O?@y}l6; z9;XH3=nE(g6Q;KLW0T((s3nb|-;2lQw}q3B*!BC|Y=Nq=1#A>-7QY8_9Pw)YNopVX z3B*$cz9I$iiEYdRgGjVnC7u$_%|6<`FM1BhWy6cVt7o>SI5d_lp4^Wyndp(QFFVUO zlJq@Bl|of^fr1wkdW5&sf}Cjb%UWe1d7?8^mV<Q%7!1AaKPmnM_%ZM{NRk=80dtOj zM0h&Yo^iqVH$=ntq@#}8K3~@=*^e#P_#tv~zp7dWRR8!sz5eUfZjW}O+U?eEmv%d~ z+o9dV+HKeFA?>zlw?(_n;(jjgT7GCI0xLq**t!_~fsw|gbR}VJeBwStEWHJ4E=G5w z=+RWx_20lSG#@t>@jD?suvU)Jf!n3sPVIJR_po-`wR=drZQ5<oZnJjxYIl!zcWHNr zcDHMHt9BpO?iTGnq}@jCHfXn2yX&>PPF%KE?RG@3z8#0i+}T?*(eqPrs!?pEBmo3T ze+Jf(<SqK?{`2quUJ7KltG;Zga2HO1|9fY+3tyV#F1!T(FTuYX{z>p(mE|t{Cj3{y z{~_GBCc6u#z`t?2yKvzwcVQ0v-<s<#eBcImVJ`eTmm++NyKpA_j}*8Izr4a-I0ydj zRmgLvyKo--C*AEXd>Kz3{PpYIg{MW_g^S>C__Dk3yzjURm%@K$le_Ticy5FL8{6H5 zKgZ*wc3KA(<@g&7m+_~nuyKZj`;D{cf=kb5ytAP8=k8JE2?Lf?gVu(h!lW=n*8eA? z%1T$PEWGp5$yZ)hR90pzzhTYt1;r~%t9`{)Gs+68tBb4A>P54!H)iB7Fy_v<*_b{* z&zL=TmT^PgY-8T^`9|K1rAFROv+>L~79oD=3_N-Bjirl?CFb-zqiThbM>s{^0`E=v z^X7Sr3Va3L>I#2VVKE6hqoDjkpSQZW_%3g0x!1R<v^ptAetEUOva+Je2LPq33sx3; zODd{X7x;jOVazHmEB2y5d4&(qmz0(lRjjS{0z+>JQVg@Is-ntURa{V1TE5a-QdO~< zY0?U|X6Vx6t5soV#b~#8MX7IfL8Vo@K`4^ZySCJ~%IkNaiJacT3V*rJm{GC1vZ`1b zZ)I1=+HD#NM^f1k8c+FjfiY!jfl-{)5Ky7C&|B_by`s3vP)$dND69=*MM05wO>tFq zX+^otbBWOBLIAta3wm4#h_FnS6o5oUUSEX}$Xi`lRa{)|Eh>hmw9;2mHK5X!Wfdz5 z%FwPdlE2b0%$sL<FIQz1dZ<rz5Ifia+f<a7-R&K(yNzT8O%N*AoijxF;&r~_avw1- z@s}5hr?8@^*Z?)lipVDHOK(|miSKe>MdjsdON)G~E?-q#x^k6o0J>!rg-&cq6dU!t zvH~En2$gwFR!CAA*H>1Sl@=CAorzd<;A&vx$Tz#HpmG(+Kck}DS5;BwNXftH#+z<l za+7z$q;=ybU9oPWQB_dxttcr0PZxWO(ejEC@9MkBM;uZ{VQE#NzpS9j>nm6RE=Da? zcYCMLo$WOjEVy~WfaVBc4U9Q+wzsT8@v~6fxY_R$z{RU8s_rJ-SvN1hpqxJ6Ys}^F zOlF<Avu1e<SNY5DI$pfDy7Zo6%~Z@R<4ExsgO#O)K7Um)2H%{S13)lJ!=5q!`n&<D zjIvU%pFewGDx!4i^qXhig8D&^3jfMg-qq4BjykWecs1le0jRXXUs3|rPi`6uY8VEw z_WG*8Lj{l<hI4R2TqVZvio1Qq)!xeDDsNe7xkwUUMTHlg0x>h8u%fEUU+KGUqG3$F z?3&9aPl2qm_^_ai4CX6#;s+rp<l-1BEic5-2RE^6nLyd<D38I$(rUbvmMf7ae2>Bw zpaHUhY-A-}Hn`vO%Y~1u@vK102=Nwx`Sd7BBE?PfEm9<N(E##ctS8AI%myN&2jJio zn9QQ(^q95o!aFOWSK#?M9)<@#g^2$)o}b`3`wQ;ElaXhr=VGMs87j?+oBI*z(~(}a z+E_Sq-f}&v3}a>K>Pqjr!V)j~sQX@b;ooYYr@(bSn{@cu0rAc}MM!JXPk#Ab<rQno zy|W2h^@i{6O7PYAqKTsnC$X$q0{ws4r~yPZjLR?bVmkF+bh(jNRg8%b!_Sf?B50Gl z4&v7OZ_F)UQ&3h~q&vbE?UZ(uh5jmUWkFRnps{x`=E{qW6=em5cNuF}mHLW}DvX?! zoD>l2FE;W%?Y;8KD~$7}=g*zDXzop)G0rz{nz{VuS<7eKJb%7<)1rljRGic@)ojfO z$%xuRNkqEJDDAPZ7UhBR%$}$0L8oMcPs;(e&nvkTSp}%XEh%1+H@nz33*!xxtM;xc zz(gb<hlWkQSm>`RDS&p8fLBz^c}UfQa@<?0#V*;-AHm!L-D2&fYp=P=3wh%!T@3{V z;8E9SMj6)^6><9aj<1w@A=ad!msS_c<Ysuii%Y9~{(`d4`HLaf6kgIE&{7Gf0%$fi z6jYrklUG&Y101WAs3C$S=AU)UXK`R<b+NyQ)4a$mN|{O&tpE?$io*CJaNdc_P^;nO z0RED^vuDisjCVrmHB+v+w6dbQbls)Zcb46GX;tx>Ntbx1`%BBvJ$HLSoY_k*T>|2u z$~%GWMDJCXO}z}aG8m5XYfH<oyyBCTzw)2u|4F|D|NWDH{%6O}KRW*ZS^giBpZ}!a z|1ACfQTg*f-G6@<{+NRQ`S<?_1?txI<g+Q?aHSaBARVut3Haj0UOah-e-_7(CuSMO zPPosHHH>dgGK`n-yoGzAcEepb%P=0e!7#pci(!0u1^jm!Mni>RybP<v^Ej0M^X-Ol zTEsBU`;K9Jy~!{>jkxuIa|6Ox0q*zCFpLiY=Sy%mP6wR1sB5WVJW_x)*($?032?pv z81?G`_sfQHCSdFUUO&aN56@vd|Bj~z&j)x$rKA{V;F*Bu(|Bg#$;VTKry9?Fc)o&X z8=jxx*@x#@JV)?!<M|If!*I5CG@jG(oQvmTJXhnn4$oXX3-K(&vkFfYp7nV6xhIsw zO9rXNaASm#W{fmO87CR(#%N=V;lV!B$;K(hsYa$T);P^L-N-V|FwQhSWsEb<GR`*6 zF}%jP#(Bp1Ms{L}Dwf%~^Jg!gTVCojlm{k0-}Pmcs|qAMueAKG;-ck?mEBK8!AxX( zVD?<TV2K@s_0t)I_0SoF{m~hOq1PFNQOOyEJtZl4Q&MIag`KG|3nT@T>s^H9agj5f z3pi&OrsbqyUJ~%7i=By<|8ss#vIQ_5Vj(>XR^aQastWEFVw6^kK^UYhtri2f_-NiH zl}oE>id8<EyOobtHRYq}Tl-)Dw|rJAjo~Uz7NW{a>$vv8My`E}!8HG4e_J!iv+A$= z%oJnJDJe#qBQEz-DMlsYvQAFqYd~Bx;ubmLwj=IC#FaVXnh}?ID#nE)&O0u}$VObd zBW^q5)*)`Fzh1<r;b8s*JTvj!fyaku6P_J-n(^@OFx*}|>0^->&lEg!@Z6545>G9j zMm*c`?80*hPZyqJcrs1{PI#u^nTLmex5KT((}3q8JlpZ?!PADP15Xd05Amd*o??u{ zGYL;F9{%OQEy7cYrxwpcc=-1y+!j0?I@||0JqvZ?nS$pgJVkhXcpC701J5ozEqJ={ z9K&<U8K?`-6g>0r+=^!no(4Sp+XDCdcy{4w#?ywU9nZ^n{)DF&&oMkH=<9SmnRw2| zGXc*PcyjQ}!jp&RRy;*`%JHnjb03~fc)p5fE1n<X*@cIH|Lmv#JNoHt<Ic+BmCI*{ z1$rjzT55~RxKPDo+oW)Lh2K}{_bo4iHA{9!xM6X*O2-Bf_C4-iPK%f>iMd~;m6Vp3 zR<BA<G9oIC7P;lC@B_oW@t`BFy0D;})_2y?XvJ6GU0%4{SFs${GhacKkNov@l_p_l z72mYti<T=xCi0$SRF<z?u8i!<X<lCrr2T~gC*7GQSS8X<ku<A`$%$E#wzAl_eD0i? z3k=NKtb^gad5cWg&g^jEs)F+J;xaVo8auAEVtJ(xEjNst?Kt0pn-&_zEp}L}wZ=UX zmb%4Q$TDAa#Gy6DhD6w339D(bG!i<K#8(5S;&qj<`m^j0?6{Sf^@OM^S0MhUc6?by z`N}(2S1vCpXa2|S_)6G<VcbOAUOP_kl8nEx<3PXC%H@-<F^oT`xKhx5btTH3EIQ1L zvf_d&*+L-vaVidge8mf9Pq%EXxYmrOSC#D&@ne6sYyoVBhA~NnVT`u38`nu3OuHI# zwS?yvR01gLsgv-6C7kd9shDx~Dh^yY-GnXMxZe)XGl~C3N0{kfk?_J|-wbYh-dGG3 z)cC3ur|bQJg!3!0i!{9qy2cppg3p>!R*D_Hn=4^G$6tnytEeu<AtR>KBwbouh92@u zcmZ$%;@8jR7B}!>9@Hy!%t23<ao8AHE}FABXp2a@>*tpHpkad-lj9}&Qi)?d+VqXs z;;Qlj?n50mW)_zf`-*2&mHM#hS+)>V=C;5)hRI9=qm339;LPw>RiRBVI~T&HZTxz0 z+}tALX-Dj$Rpb^#8pBdheqKSf)mLK~o?lVqFDq7!yB>Q?j3aPuGzZr+X5rm9im-YS zB+>QN>_+;GuQ6p&Y2jViMZh+@5l^9JT#DU}dj_@Xf?@ND3)T#ZHoh`UjP7~GRkA-( zURW%^K<AZiP(HsLqZni_GS?LrSCTrY9kelg?uBK=#g)c=?nT8_t4qtl#uiD8kb6;C zHBehzz#WsXx{nLQ*zMMqf0U&a-!Oh*#Ryth9~sM+W7iP7GV8!q|6(jJSY5pm;~D|u z^DYedQXkM+ZLEO50t5PxYdP%ucVTU_T$lM-%5sPTjO;57W6rSU{&Gn_$6c@j$0>}9 z-ROA4V28zBQdw16?kh3oyGt;}3}dOgWGz?&zH)bIbu|P5c+#!qgt5`RT9=Htu|F$A z{XzOr8`gdjSBatWT{rq)s`!b!TG#MXcQplm3D%5m$PFp`OZv(<Qkv;2XJiX~RfVgn zjNj1bs{q?}x_uQm3xYoQgL{pIG6om)kB@k8#)XsKrBh@jWf+;r|6lb0HYS3}*IYXJ z8i76mu>YP1(of3gp!~oGb@)n4N-n)x<DZ8-)`PUQ#Vac9v?8SaS3WnI3vM#!U3rDB z+E@qp|EHhT)oTi?d=>_jc>nzSZ=pa&;%puFHt)dm-%`&%f&TBJz@*`Y<M5>8b&4#! zC-}b$xqo8we~tn!o`Z)?(x^?Y(<OFcm}dvY<Ly^t4l*yzO))w#6<dFuDObU}7;D4j z_%)3M@Xf{Q=O%>b;&&GO{QIT*oxdrYsSBaeu$?ORI!VR51Ni3vE3r9<Z~>mrs4_~8 za$_Z+l^SJ6F(8*4B?gsZm`adml5rKDsp77{FYM2Vbr~~|XSGpj6d?cIz@`8pSt2O- zu-Lk6m^kT%<BWw;S0(B!MOjhnfx%2;9@<li(gnbR5T?M=n<%>&aaAatC^Ol(1Z%}B z<ae@hrMSfFDyftB<18b}{D0kCYj9S@89w1Q5;Afr(IAw3q?961+}qjRv%6<cCIm?Z zA%<v>Yk(lZA_T}lz)%Sng%}}&L1~(n5D6ef%FPU<0ud+%qR50cA`|2?f{dVsP8%gw z?0b?jwYB}-nVuitnLTIE?)yCZyzl$%p8dW#(BkaxSoWX#%7hi;D6n7#^c~g?QRM)h zkd>KEHnaqL&c1go0&~L90_0%$i~x!deFWMG*$DB4j827TlVLU!1>@A#UU)t1<u2D@ zsg1So+cwn6f|}u6BMoNCQ4Z__20LIY9`Km^9aQ1kLC9VX)SUq~Btr>y_O;f6&5Q8F zEa;`pw#86xokBaNmE(VH^WT~NZ#*Z1O;Mo8snFJ4B>z;61MBV}XeS-+hHNYVyQa2s za(B!-ci0_P`2RV;;fnyx4^aXdgQlUG=mk`aK0qy~BmM!7V2&r^0$hTR;&<^md<C~7 zJxOoUkED<>WIQP#tI0tU%N}FXST@UNtJntiCVPt=V<*`sEZY64o9fPT=eY~r6>f=J z=~lV5ZlgPwujH3`oR}gOiA~}i(MxWX#rAaz0}bl~j+4c{a3{+dGDnV3XO+>Jent>F zZ%!1<NbpPeclc?tl9ZCO<TKKV-bW*J5M?x*7SXM=hW?3Ork~Lk+KxrD{%kT^!3tR! z`-mmG``np)Hs8%J^6NZL7?~o|<s`XOu9C0HO1V=Wlr{2w`JucdZ^_%Tofq#7^@e%n z-j`mK>Z0P+gNmy}HC&~tEHy_hP<d*(dO@vIud9RVh&ry$sEg``iqWZhyk4hEbeZ0) z_vk8pSRd1;^!xe){gsY3z0HrzLq?jwq?&Xy-8^F!n)T*YQ)Vj6HnZDQn<M6gIc?6G zkImO6#_#F>#Fu{HkMT47iT-py+t2YA`b+%h{9pOyex<*|-|rvxzx6xY9yZR#+XpSN zNp`dyZ)e$g_F22qme^8TZnxQk_L!};=j;W0)!wj8_O|U9#01@gUO~TLKrlEUfeL~k zB{&v*9XN??y7&ve17m&<i6K46eWVYGkO5>6L4*-SEJ+3(j3#L$gG?cF$YRh#qkGM5 za+}>wd=Gz@H}DpoDAL6maY!IpDr;q<jP*u%8D3X46nKo*NjgJ6qbv09^(Eb`Cz%cA z52lOX;6GqT*|qkXeKPnwfbbDY!+DlA(FN>1)<-?6>vS@()?}J2+{lD?fpFT1s?lL| z9Mz)Js2-g|jpz!xhHj!J)C_uda0eWX@5McF9PWz~@IX8S6VSK8iTGjs2u{W6cs!nr zvv4+^gXiN#_&K~5{}OM;lSp@p=rH;yeTwGL74$Xw20cJe(hIad!)!Q9V+&b(x1T%I zO>!&TfS=+q!W9`ZqSADM9%9D&Rem?Sz(SaV$O1VCO+s;aB#9MSVvd+E@<hH^E}j=f zqFB5lO2H?#i7N57I4P*oYM2_S#;OTwy85|Vq6*Y2YOhk-GtK5J_`#>Mtj%XS>o`5i zOfXCR=lz%b-}>>keE<upP99Vlg<HsL?g7^k{h@~vaZsEPb)sI}6fNS8=q3|nGWf!5 zxmd1{Me=32QEmcXct_UB^YWVP?!|fuUXnM)d(qqAZSoRSx*DgJf+aaRSJ&(7`ljv< zdY)jm*iUS9n7GR!4}z~o&|@eMy^X%X>7<x+p!d=qG>-P633LD*OeswQMjxlho$Ky! z_q!L}`FsVh<Gp~3La`ors1Q5EUQsQMic?_id2vO2D*g;Mx0BJbhkO9+9wdoWGD$un z)8u$LO+GE>%O!HTER^d(ZIytaQQq%8<o(Pm@LmSntGp9ly>}D*xrZ949tKutt6Y_@ zUR1l(K6OrASGUz2)n0ee-GI-2da%Y?>5<^W$Mh9I`i-7pmYH9hTGL?e_lNsw{vyA` z-wfk>$glG+__zEh+uIuOzOi<koon-Lp<QRo>>hjA9=Eq_=b&p4AN)ArfeD5Mj|WqN zH9>h$9UKp?244owZg`IZ^tDIvXdoJeW}}s;6zxK%&>7T#E~2ZTn!Xt088{a&#>?>< zydJ-a&*Bf^k5W32Xo86#Bgic9!nI^0*+&kMT5_6PCO1fX+L^uwaq$cKSNb>lB%243 zx{y_}J?scO!5Y{t_ATq^#<)+o(_u7LL9E{HzTw_*qj*;y%lmW6r}5>ykgw;Zyn^rG zdwDfK3OcXn=lK=>DIXz5izmcn@f7HJq4))8c`YdUH)5;U1xh{)dOIx|#7E+q_*^uD z<~qr~l1ZlqVmjb;&^;&ybwfQ-9O{E2s6U_|f)HXzB7+i9GD-n9Qc*e@hbE#-l!dZ^ zn;eu2>dHsUfTh)_2(nfQ+K9?fIog7@qn&6ss)0yw2I9aabUpmC<2Ywv&jFk=c^1!x zOpwEKc^=Q_%OD@E=0&`im++0ejF<B*d^_I>nPNXbz~ACE{5Y?LXm*DGk)Pv@{1X2d zGRRHd#Jh=}B2M%X5%8>mVu(P32`P+76v-k*j1s93`<N#^<2ey{&j@|Tv|<b~x0O5m L13O&#pB#S&*T3a7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/SDL_mixer.dll b/venv/Lib/site-packages/pygame/SDL_mixer.dll new file mode 100644 index 0000000000000000000000000000000000000000..d629e90993d7c0e2125d44144686f46b236b145a GIT binary patch literal 644608 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Ν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�NU=LuR5Et;gN+O7Ggj+RylHr*ko3<Fe=( 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�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®O$Bbx;f%s z#UK9-I>^Ck;@H8tL~zbbkE5B|N|M<$(}D`k1iU}se9_q6tOoWd{nTct`K9#JI{{sR z+%jl?d94K@ie{@dR|tSm6=E$dtfAy0dS!IqRhPAS*F7y8z5gY2neJ1z`-0v&PG)(+ z8`$)l40lO3cTp;o!oeBI;4(Y~W%3tZ(hNcKiWCgc>aE>}XDgDp&VZ&e*%XLcq`pM$ zSnxTC%BJ9pqy8S$`F5Kul?><?%{FGf6DVp%^)?g_mYc+&rXezlnZvM#GK9ED_`e_9 z;0NO>dSstA@H!0Ov03xe{{G7EC2kV_1)M%*N6{pCZ18vbuOfk(xc1&^!$L2<_)cKh zWD4<+spU^o9S7gAW#^1Bgm9+txtb|L&2@Il76N@dfpDlyAZS7(N5MOrpKN@pJ6?Bc z39;op;YMc}l}l>aIA%sA7lIYOijP>cY@NCGF}w`<!!-;uUvgeu-=)^jC)Ff~ZsaM6 zgNx&{?yCjwADLrWZVYlshPyG6W3_zo5x%hI{U<jZ{(Yt>jD|P!$+)s}>Q11N!b&-e z%&x5e77{U&-!xIJMl}^bNx+mQFlyNjOHUpDr2K7zSOLesQr5rxmPEK<X0;{0%Pk$h zx|%|qd4+|noT=Ihz(fu)9ROTu!t^v?mH}A_q16LIohN`EmWT=8VtFNwP0A{QnrEk) zxBBhh6%8l&v{Z}SlJEv3iLdfKYpJ(d<a(i&x>7Bgo`$t>jYTvb$3GpiY#A*1Eh&MM zw2JETn-USS)@+w7`PBY0`RfhL#(!BhwXf%GG>N}Vrk%6nkR)Z3c;`ZM^Lr5^F;b9Q zhqv~&KP*WUXLN<&MHZbCGsu^$lP|Fyckzg<!r+`SP1%dV5>42jB&#)=v72`$i5qtV zH+|%UP00!2q}9@L4Li?EwfxCMxZw^xB#?@UTs~C7t(?SBJ+4kUe<YY@*PBD2RaGA) zQR0db9j$WEoP%>lwfm>Sm10fjNz^eg?bZ(+QPPG;Y?pH(xXihjN-a8R>iWYvcG)0< zo46P91tGbzwd{h#w8=UFcIucRkQTY0f;n`Dw`POp(9WU(s%%tUp)Y?R7GWks6U9&D ze^%pf@t>evvdE#hTS%mif1<cFX~_m9>nz!%q&BUs!ghHf0xCGY9;gbrn&u6hHD~jH z*h!W6QK6s1dhXIf^D})pAqe!xOy-bp?BV!LSTSF|8_r6mi5fI?*BAPeoCH%Yu(AlO z5CU)QY?=(4D@m<t;h+(F*Cugum9_doL`Gb-8)CTyS-2=4*P{eUehZQ#mL+AKx$Z<w zYA^YPZt(e<0yyt5G@~fiE+8}bBrIlX<chbiI)YdB3h$b?e~;VGb*PkPQSs=ve`aDx z6dXV#W59WXMYco5rDJTve73y1s3~eN8Lo&en~=@YR0&GK7<jSD=M|PM!%}{8QU~2S zI^@#tjmeW&p-={9;Dm;JQ#cd{enYD6O;p|Yr0U+B*w@9NBqNZ6lZ!7#AoWe;T+}yU zvl$8h*P{Xk%V?<(T$U7*Y)q>0N1M0!TmAmA|76J~MnkEvY79O!UX4S=6Uv)at@$kz zU9HCGN&ob*2!>x-g$_GX{_k8hBXvTl`xQW*nrKEs;sf(fkF|DX0eO%q0Prz}D+^!} zsX(27x?S8LGpw?JwvkdG<)3bMEgW5--W90#5ewnUO=S%Y!gr&8dPDTuhLAdAW6_4i zFrLh_*=@5l4DCV}G&^QUTK!B(!1+TQniV!xe6rRtM{)7pWBH#SSJ8Ci-N?yG)8y{L z1vNzSihI1mNA@A6u)gk(tglNgG0_`1$r82Rz#$RoVMzGjEOAWVrTN3h_Du=7gKIG( zI2PYLR?+t4n=!x>&1Ec=xVdn_#Bo0iT;b?@$hq=6Vw3;RcN=8I9)*{9ENA}|Q-|3? zh$!Ydl4EGDm@`<}WSJ$Hc5|_8tU~dD*jV)s6ACLi2(&b!_g0Q*-MvPVX!;*ha^m|e zSNlH8#b6c}ziYe4ywCcMeV^rydzW&EKkjRB+@fB4Yi^TOxr=}e&@3L3N_tq2v+IM) zlEE3eYDa3r*H#ObxV0vfiD(zgDKt0zO}u8YyDqr&K=7I1%uybj!nGg<DT`I;)DPB_ zO=5$#F^VJ#pFQH10p_5NmTHl_!PcuA8ODa7f28;#23KP^&y9@4{J~VXDyP-AC5M7b zor-p=c&%2<t<h!6^>s<vQF%ft=0%xcNz|QeVo1q0nV7bubs(L_Y%b;3S`1V~mjmne zm|ZeQE}L%)Gb6#}T1##NMQ(D%O0mspFDY3LZV}O~RcRT@SuI+6QTn}rZ2;JC9LjXF z3{>?*C+54wLt$3>`fe=|$HUAVe&Ee#VWvGc&z9mBv}(A6Wi(mJ;nJC=<8Hxhd`NBa z3>hwvDO!PD#wk@M?*Lbb1l$q7@viaFLl}rH&w}YW=1p{MJHy&x$zjG}$xRz78jTus zORTO*`D8ZubMDe1?g><Wv?LCEA)4lxX^(FMn3LY>17d-lyBXCe0K{ASpdQ_NQIJan zUVf++S(N-U*=Bs5@UFSzqX;8s7d<u<G0Eoq&ufB}V}<Ss6VYjoQ;eRv;fCKXGEmZh zTj_9p@g*kqu?A*>Uyo{wF{p3|W;-0oQfUANX1!r85&j{g?+F(Em~xeDd5(K=1|Q$w zB{FDMK`q-h5bfF@Nz*C!6_zH$lGx$iz-{P93T8yrf6r&6W8fIQWN^s@!ETKT`u&1l zP)9>xw%yAC>qhVlkc-HYzGq~X5ShuvQ^Ah0Ybc!B**U^K66YQ#ao~|cE)_aom={kO z@dl0&m@b;ccvFL_z=&ipe?svf5ZW4uprrW}FeZVq(rKWc;lX+ph%T|k4savKGOqCn z`ha0L>LVO~NgtP-<b*z#_d2CDLNLbXEx6H_B=|T(Yb_B*G=dwsLNb`I>TTJsR2=C1 zXUF*>&msO>QXFI|NqE^<)XDt%#K{^)a=q2R#$-b8L-LE{JyXL`e`7p34Enhgsn*xM zcFE!=3~Yvrrv!6ETCNy9!McUhe4MAtPy8dAGi02?`M9?3dfI}82fq3nSWj<b>;DTh zl7D+*-+8J&f&jZ#*om51RN0LG#D=$H-_;Xw$+<~<SE<7JCEwMZDES6Bx3cPBnL=0I zv3BPa<ItT7i{jq=mYNS*O-Ns$WW3r!toW~ah5tnawJHa)ckj7_%?33o<G%05#!Mwd zCC3?$U~ZlDciRc-b^DLyo8s##B-D-br9RX7J<*r)NAabrE*>0lM~Mb19gF#m4$pHP zxknY%;TH`1@2#1rDeXUT>`R&0yg`p{DN)`hB1>TB3O}}Dm4HU`0hE=LEGzNnrQqr? z)GeH)hSpx}a%zR%xa)qbaQ+B_ID<=D`&AEf?~DjqZdJ*+bnK|nx^vo;tJH>kGqXvk z7#|$%=8hdSjJk=eCLD0OM-D%p`4pKlNeWu%B6y?D*!9he@Qyd<^QPsvx^k~oE-BX% zu9I-l?K0=}a%!!l`l?;urMg1j5!WDXWR?eTt#W?Hz9SCetU*X*y){FcT47v7^Y)=a z-*-o1!62z%+5@Q&IdbqCsY1bm*GNfeVZ27M^^CLf{8&A~B2sHk!VUU~Z?o98G(r2N zFoq^??dm5H8hAXGv9CUV1flVOgvODHeG3e+h|j2bLM)=@iDZbHC)%LAd30!*XbsLv zp~A`>NMAREu<PHAvBY_7k)f5e$lx^N`)F!@+*3(`O>V|X`+nkPe~@nef6+!6D*Y|q z+Uyf1Y{u!<2klR}37NRt4TaGqNwk#1zbFCx$3yYn&hMG#{Jz_{(3g~4=wU5Zp)-g@ zTEvW$jcwVu!hJKP+01&xCx5r|rY|XZ(}_HZiA9mbj#gQ}E2}W9psZdLtE#SpuiNjI zAmjLMa~fRt&u0H^uMlJp>XAqZ!X(b94=%7cIrx{^LMYy#fP@R@MUs^-)L~X)0da2$ zmH`}Ulb?C%9&hdS1m=Yknb5)s=@Dkq3=6+{CqJy)9SF{G;c`wE>fCXbAZffS5|TGM zR~`;OHft>pLn7J;iC9JaKwo;Hi~n##Yh2*uqQZu3J=3l1yH$RzTuXwD2tBFe-$XtU zibj?bNedY)`eJxiIHcw*Wr%jMbOg}OZ{iiP5>)}L&9crqqM(Q<N<;A$$#`WITgcKb zV2*f$C>CNtI4h7f<N^>}yg^%V8msIA1wGOgSszx1mgFrKE?T8!7NDqtFg&Bf#nHh< z#6wuvuLbj!HSa)K5F!P`ufZZjRLrdfy8s6VNULkjmW9DuTe-7A$glv1wg?n~u`SOq z6WSoGVCHlxv|$#W&N_xo!3kZ=NOju$Lg1c5mEDEe66!q~eQ(VlJHg&rW%*gC!`?Ch zF9FqN!~ZJ|bzniX>0K5?0fgfK%hkX%Z*4#O(CAGY``iY;Ap(bWqA~kb#o3|u7z$z> zgxG1vzgfok!C6g2I+Q7j+X0}nBCr7<cRuRGYdK)id_Io1BXEUp|Euu~3MMKe324FT zC6tQ|*?%$g4)a4S9mabYT3ozGMXULDi^7}cT{j}3c>g0H#hG)89R7DbUe;opBhtYc zO+l^^842OGL2ez2C&N9YeG;&o%)c|V$k?g*^JgI6ZVD|7C(4m$s1I6SMToka@dX#} z;`1Ip>J7RE3m0u8RE)Y7(*lO%4&K@NIOwv4jPN5j2WMwVz;r3ho4b$3V*iuo;g=nP z+q*_N_Loq2SRXs|da&K*CULF6H`!!l2b8KvdbYgSP)p!d$B2h+kXBxGvKBZRT<&7V zyXgztXZX%NFNl>B@oKJMt4Yuvdy%#DVoN(eN3W$_NO@m{lzl5A=#u4yph!5=r1AUt z&D!yiB`c%h=R6pxHUN?S(F~QVrqD~F%LBR7L^p*@%_ueFC7%4CM*Q)gFvQM3sDQzZ zdYqkBtoS)8u%-aL*$M&d;M+L?b6X<EwHJmhGL2++lC5!`7R-)jr{Rc`iTAJ$-{5&e z!I=kmjFcG=E(pg>fEciCV*%S?1R8UMXi%@%6{)}5i~tH<d&y8oDb>p{9L|&2r^)yr zA2*pNF^xcIqQ~jtaKzgtmp?*7t)^cbS6d9wJ{{<Co|HGj+s0p7h6py&2~!E|c3=tH z0bm(jg(ds!z2f`ApjcD}pLJVy($Whm6{B4{<t*qTp<%Vam^3e=1~qitX%Y<eCm~pE z^$=n*yw->=<XtcM4diFZH^-JY@KH7+GOm3Rv~@U2ENHzaG=ft=wAi^NwR@yhi`Yhh zj$)nDtu0iFnVLtA-=m&~7J8!Q<>TK9E>|6MXg@1rwvW4vVx5i98Gg+9!uD~uKITN; zOPcsrj!8OcAT6jM?Ktcn(6u5!{Y@d!V5!bAO_+&2vxSR>$kQG4iOA8(bEbqd?Q;>1 z5;Q5iu+Qb~2XKB8jlf3@{$UsdpAkLjG23NvxYGp}s3JktMF@gj8mCFl%TY?ayNx8F zUp!Y6L&+A>+b%1)&`Ne%8evbqXdw(DRm71Tt&jvMNQKTCDTF(ruoBEXXpMHa^n`<8 zBUo~o_J+hOdE-Pzo7?A7CQv#o?F5aJVqFZIb4EKEg#Z&gHkjR(c9c*tMxe|_FA_r0 zju!4<RM3Qo5Q`<=*+Owqr}kgrxcEwf9WJHaD{kl<9m^Ha<gH#R$<xI)bWGp{u=9lB zKVjxL>B#WzpIKhU^8OeX6a~8M;bzn|4_SM7;#ufEbP77Z!SG)nBnv_se&7`=XzqjI zA)*)gs=>axi{K+3%;p~c7vjy?D}UP-3%oDeFPc9vPb>wFdh>6vO|(Z2$W`gZM543B zuJAXnGSBW|lDl>mFY<@k4BGQ?Z3g}Krq6!kFD4xcI+lCuP8q0qH0bCfajg=)B-SXg zn8fu;^pLnwiG?J-uEYWoH!0Cg;ua;kNZhK#JQCkhf>V)BxlM^VByLxtgTx(5w3E0~ zi8d1VC^3!1dL^<X?pI<miLFX-T+=B(QG)XnPT8hJhQtmfIHl>7K_!|<>{5c0nNHcO zL<5O^N^mmxDML!6NE}e2j>L!(NfL*YNRZ(4?LZl0I)!^qdinMvwXD!_jD!wqS~11} z#*4kxcR>pI`{&tK&Fk}TuvhbkoMDlFgT0!kCzYu421c3~0!pubrhiA!n+cYugPx|K zs{!ErSD?FTCP8}ZgXKE#iI;Vf5KySjb7<jZYtWkvmM6GJX#xe>8NpS&narCk1UZMX zUKLz2inA%`8PWqU6BJAay$6DxL7&6fmAN?G$QSjHP>P|S5cKY%TwS4eFK-ve+Ne`y zy>*>C_yviZf=|@w8mBrwXSDEG=^CU=jV`tVjNq(&-n#8#HyxYSLQ!3g1hWvL*Nqt3 z7Mu;1AFSC5O)`F`9pWQ!yITSklv*jMVUHzxwvX1<^4Y5V{ziY6G`+bH(HF_P1Tk?& zivy0r(!_&!Lpsv{Wose=k}qQ*c+;uX^oJ;{(>bOAcvHZc^yqSd4FpfA`&wqOv*;Q4 zIe6W4EPX~7Rw<FR{z5JCjPtsc=ec+jeAlyfUpF~n5TR8UvzkD)tnlz1-C_o0XfaoT zC}y;Fx~=N)g*=G$L0#JCv^KgJc2538r!?Ql?~i+PuPul5L0<#6C{|qP*XeWW5l)?O z7_3u!!hXq++Zi;5eNms)8}7=)yyZqJWQefP0uV67974i0s0^BhYMX=Kfo>i0);*-V zxHLlQWslXMTbt|BwewcXP6Kn$N8yVJ|8q?isRekONqkoQ1(#dtV28i8Mv+@I&DkX6 zx7#DFvai>YjroLtfWp0XPm^;w#PX;Kb?qzwx$Wu6z}YA)@!L^Cw5_T|6a?W=JO1Gy z;m>UHALfBb#EE=W=kFJv`pnoxc`->zyBEFH-<BZP8kzGy<ljhmSAWac_E_)gR&7j# zqX(|i(e4-{96qu(Md4t1LjbpSrGm~nWJb`VwO9?_V))ap2iAV+BzG@xZ}8$;a4zma zv#?~QuCBf152&yY?wONb1wFPvjuV0}4rw!C|DoXgQTCtfH6Jwz`&5?ELGdmttubUp zS^KSo7A~nZo{}*FF*3aO38T0okr(n>YzU6k>2!KX+v#*5`7N=lyNm!VV{*qb4w#y1 zxl-Bc<QDoNzdywl0y^xScDat>>_pA5{{%2KX=K!-kx@g~fNrIy0bI&<*FClG(OsP4 zhPSAtc0PQv)jz*p4X8Fgrkgk!T59D~uqr{G)mCq}re#E>(A$1vPot2KHeXPew!c|> z7MD2-#cBU+)gY_0rErR_xo`E>JSD+^Y%+vvoaV3sz4+#RSZI^exF8UI-nz??7ncCp zX)Hn2_~IAfnpszKSOSLEDZ5OLwoh~W<>=PT27BA1OCv;xo3|gXovdZ3DGYjHe!{<` z(Odi68+eo-@B4y{R014+ge&H3Sq?C0Vj2HWtutn%8N`g-0W`A=5kd)?Ikmyw_SB4o zG83VaxC^jaSa4EP{*1=Ld~WQ$l&1J(d2k|FX&`VS;KU!Sa~d48c3;!&4%UEckfwEe z-ZCff>f@#(Kqdq3iLP<irU{I>$(n<XI9L~&0f11o<?tDs9_^B5>&d~IC#_0J_4a$U zu<g%i5WwDbpVvyvW-da<WV(^9gV#s<<&F%m<uTr`!Ru?Pp0BKW{!-QR#Z}LXs-72C zJ<qRtKD+AqjH>63s^`yEJx{HAKC$Y#rRw=(RnNay{v0e{<*i$B<?t6U_Ou^^8Pji< zMA2%B2E7fza%_o4%$lGxCDQ@j4-G9w(lq*w>0o)1yMOZsohU*+L3XgnWVoe{B65G! zBbekA!Kt*jk?Ijj@XIPlOv1^nV{vu&vVFl9bzh@<IeUy+L|-yCvRn&kZ_e8ltT;es z4^_%=X)1hauNX2MUx@_;%48u;i4&;rII+J33}VM3{3q8uP3zF+R&U+2I-n~-#s%&w znL41&qMN*RgSxa+TxTLcb<|rDRkIk~@&qtsw!dvs>x@LLu5m|F{g%%$A8M)2Zk$0} z_919q!4FjPbfo<aF4r2gJ%_sVfdVfwC^*Cvi&<MBb?&lpLha33Zl^{DUoht5T5>p{ zt#d|!)5Mpl>x5MU?4Y0I8Fe-H`CAzaj+&qsVj^;oIxR}3EJ^d5jQaoyId92~EQ)0Q zK9h3(>_(xPuUZQo5_Z$PHQ#hrP^$(Hm>WSf;3o?6ez?njt@uPOTFhJb+upkAp#GF( z{`nfNfi(esQJtA!lf8B4V(SP;6sR}tk2t!h!QKMWx!m+2gz&a0v<(Ie=O#+Bsr}!% zF`#COC~$fjied-n>LY!kCIREEJJ|#vFu8V5Wuy@sG81TfW!(0uaocQ^)?3<M8Ml3E z)b?ma!_a+ee)B|Yd`7x(E>dxUc92RceuVZ69g4?82HOSnE7f|!P)lmAgM*&0thYQM zLL|#lsy7(G#7cTTx6z(@?2VqANXa^!o0OpZA<$CW%9PKILZVOFqKisVAzQ%Tq<|V} zuskYdOP=!7#U`!_eG}m=I%qID=t05FyFEd_{JBl)ns?nNB|oob+pJweeKrTT%5oX_ z!H3~q1gvIvJ-iKi6G21JqxGo8zOzeoF9#*Gk%+t5KP1CO9IaDbur6SCj34qoe<*<C zKRX6tL-I*S^1IQ`*z&qv_aVNbS6eGI`vr%LX*c=jA2MpEz(X;YuvU{u*NQ7P`e!q0 zt^y_oj*CWX*_RJ*=#0BrV^bi%EAl|ZW%EFnNEcT9+aWHD#|K(`oZUx@y>+vRaq`w( zkmR;^m=V5HWSpI9A*nD}xFDgS_yMGNvPf}uomV)EnKh`WQ^e5!q?h^8n!XF!;?{R! z@F62j6tn5exnTd{5HcHMsj$Qk1dm2xMqL3v;>mnMxCOT*sViz+H&N+gr!tx}0Q?yr zu(Tld3jeH~mM0T=PHcmy%L$6N&AgjCY7|IwD@V=x?%94MIQ3BNG%Xd7`>-x$cLK^^ zITn#oaO$Wi$@;1iKE}w~@lbf{>eKOX(5IdnZFcRcZU27K+Qxe&qGY#*Cc;0c;}|1< zWzt|>GfxEh8qNxKaBH^!9Z+26&&Z*U#Y}92t~ya-M<SS@#Ydw-JF&6Bhe42pNuQx% z95I@{ppAwSV2~t$h%D=kEH4-fmLB4$C0_ItzBJ-L9en-(>L(T159Bw9EHqboBqGv> zC1}hRg?fjq3z}>U`@5m1l+I*^VoX=mp5U$X0`~gl;K^s*Cx#yAVYg8}<Pp(@MN~2G zz@!yo2phQ|>Cc9RU&Vtcy<&=nTgk*Guf%*ne^RxdOTtz4wfPM?lA<1c;-8}_f2wf0 z#CW5(=0xxb*!3W9RbVq-XSUA!&H>^&LYsA}x9(zEMvN05v5|oX%;~Yox&o8cx@KOx zo|?llPrt<mz$tR8UR+<`+qKi#!-?B`V87VmEdm~Hu*Af^|G`v}AwanOp0|!5JdwCH zKotMFS#>pgz#Zs3KNZd!91+&+fi$LRCttm$U;Q+agmhIA)Z(o>8$<NZ#l_S|J;Z6P zJ6+O=nyAyrt!7VLqw4w&`}mlE2nWbRtE8Vwjy<Xpn<1R-1b9!)U^GhG#JTHK$*hz* z?yWroN1LN(><;zv6RH_R1I#SJ2w?kxn4f-~46oU*IY4;DMkFWm-F#DpYugJFp_D#7 z#g?X7^#nX3;{+cabV@yCCQV&P1DX&$O~VrFtA$mNd_LdLsuPy2p0l00Wh)_BAcsl* zgQkE{kB(e1ssAAv=uq;d`V7oKvcImG95u{?nPzD|R1X+XBnYM(sZdyhVTWn%AFply z4y(B-e~56sDbf-cAKrC8*R1&C><uLV2EU6qSgUCt)o#%SYFY)*iwzF&)FT=#^d4dN zt~Nic+eod)`4eM@jW@6xzoon~KU655c9`BTB0J0;hkvw0ZQm8_Z|FNefB2ZbKhxfZ z-*t7v<Q5PrbkZpG5=%Ohl~}2B8dg3MLL>Zle&TCvM02kgF}*^7sDodf;3xhren*|9 z>Jne`c^$v|FI6chz9w)SByv@G13%ODM!;c&meXuuMNI_J*LYN#xVpr>g%w<BU;c<n zD}Q82%O8)ad}MN8{`R>1eGpTaBQR*-k}nT;36yRIl0~vPN-s|Y8I2=>!WJa#T{HD~ z8*3A}j}d`2VWI>JTpygv#_Ul;ZaBN>@dt6GMFy(yOt8Ooat}D@@hAHDAf7O?Uj?0? ztr^LxAIYobV=6=D`OQfmySY2vgRL_K=fc20h|*vrtp(jDx_G0eZ#ni&-^u=C9MGxV zRAv@E%%{?BjuC)@#%GMO;xKEp(kdVG&mQw1!@;CIRJ{6c{|;3^lL&B3u}9TaE}}O@ zTn=h2kTPOr3L5+nwfLBSHp5KzQ(@24EyX0w66_^)uF`cXjaaBEO}G%ed{pUrl|~9Y zTvjpif@#T9Y;_tBadafVAsP0C0rOT*l0Gtb!YUi*!n`k!`kS313Vz#>Ng~js0#UWe zM3vc0|5muv>@Q{r{`90*cs$%9DHANO5yb@SlnM56Ofad@NA-Cm;~<Bg+Qj#R$!RmY zk{I-u@iK^<5GW%-XQ63T86!?rQ3k=(Q&pq02r1)CtQi8wl}?Rc8l%d8!7AD2&lrs* z_!eBD0&d>-wVFJHP3F%<EtSU3-o};_{OqQ30<+zjP7a1uR}SB+{gi#qVETd5U0Mi` zv4r{FQOA`1X{Nn$<jNtaiFzZpf-{$fgBfG~Yr(Qnd&>;MXOLzbuqWKJCa2fU9m+>b z&Ej|leoL@xs9tJA<;Sb2!&xft+|nbQ#Bdc<4TlD0yzRXy}$dEx28M8EcASrM-? zG-{DbL%{$eALP7ex}RD7K;OmEJ#xItkYQ5XZQeI3Kj^KiOV?})jzhcv4>G1^lf|ef zoW^BMfu>`76ths~{LI9U%`vW~XY0Icgl*cF$E>Mv#i%#XN6YL(ur?Jnj2nRsu9|bB zVxM%^U)~qYMotVy8W})=%k-{%=SJK$+eHi8->Pl=4vBh-P{%gn;^it}lpnEay&dc5 zX6CZ=sD&PdHeYGl!yBmN+r&Lglz2F&&hUmczxphh%=bMHuIP?D%m1M?>pWeFAd4Rd zq(+lA28sJi<B40!Tl+1A=4s-FSd}WoLat+I!igKsVdie~5C1xLW}W=1vWfFsBs0vc zh12kOfM0oQ>D^#yB6s>|ttN60`{z5K1x2@d>$tN>eWPeu-%cO13Eji~+0Ig-=tGgc zTs^a^vzc8T(lO<&StxNLt7INSxVg~%WySi^U!LJ!&7&n!bdRK)sUx~v<DsiGqDW|h z0~KemI$l_2QCz~AOqjJ_)V@mWmw7rbRgt`ZD``U{@66!Oty)ePV$^AnF3F~qJZ0(z zG9w$y(Y~6v3$Y5Onej}7%u|JB$>8^>#H`U{%c`OOvL1J9L@La+8Z$%xQR{|qGPYUp zo0Z?2xycUNb?j_e_XK0&ybe)6Yh<b=zFGQy3Yy$oJHTqQ)5?3040Twt80AzfG?p2& zGPKJKS?g@geT7-ca6N}zb)dk<x)n9>C1z_#7f;7@QQQ6F1Y0vOM-6?HKOdbklj)EU zV3Q-UD-YBU6&PG*CNqQlQPQ6&F#wL2^4}WKY(gdj{*I>|s<C0|X8T==bp=PxRs3<W z$=|cH5~P}A<2t2rcCvhmzq7Ya4$dA)L=EU-AA=qSnt;Se>I?~+XEJoKP|4M)rO35i zcsfLX)T;?*TI>TBGo02HoI4s!AG4Qd><d;5QMp1fR#8cdiU*%Nz++G03i&qGbW`Zx zq>HV5mXYYh-AEx5E?@+*F=tPU{F4d#j1Ms7qrgEZt+qy@M>k=E*H?uk-J#8d)>}7X zUiGH!hpCXdacF*uR;a2z?O*0RnofvCJgSSfnw1~f|1L{z<8t5omAA2mN~vaShP zcdmG$(L@9jHrhdQq|sYvAn@QQ|AGdqyw!wd+)lvB2@m?i^uPenG=sZd$)g76v7|NJ zwNKgzNA3kIZU%bh7@sxa#KcIQ?5$ZZ&!zC+oz{eL72qTaegC)@wJ<GSreP+^B<E}` z(nv(L<I%HODYM5%X%gBxJ!P{S%%HRDZBhyVvl{Fz{XM-gocnBv*Sl(`ebeu6ik5Ad zlCJ#|?Ixw_)$2JvqS7<OfU*8jDU4`T%fmEJqqr^2T}WPo<<aP=jgG!!rf};w$m4MR zrir~o$p1Ywd!lg{HjEQaJ$w!Iyk-k2B$lzN=lXf-_)A4nhBUd%?qe2r5&vqQu)ENv z0-nmKfS*%wPnzm&FfxOMsaym{e^`Ce2&zBsEl8xwP(8llx?{YmWgX0G)}S1_o-B4f z@GLzE*>$hdJ(-}hiExdeD;@MUvV1Cnfp-XXU=1}1nJUze60o%vFfztzm_JhScugrf z4cZV*tP(R)I2)XCh>~r=e1gfxY+WM-^OIEvS+p~LZk=NJP|&f@p5_h)%MJvKc5qu5 z;x^!(F;Q6OHgTlLsKG7>nGU_n>#tpC-~{u;lHhI&GV~&wRqKn4Nz};^EdUf&jXh;m z4t99h*0I4M(S^LgjHcqYX#BJoULhnC-=K&jJb2d-`_o(KNS$x<B^Qcj>uvy_(2_Q| zsrOcYM)+Q(y`P~4*{d|j?r9XVZK0ZeN>&QzS|8de>`}`!jw1}0aFC%O&b9!^=)7nY zd`i|K`tYcOUm%(6x1{}T!9@pxGj~xHJ2?xTdqL7-9@=9AvqPx%)^!XDp?nOXZPLim z?O&s3(9s+gk%?8?hg^Ww*<eX$LG&Eip)L$WNIeC-JxibD8En(rj7F9Ww=RlQvrrO{ zj*;r{7^=9z?W1<gcJ0gw7#oWNpa!G<bgfp)UIeiA!nyl=Io#WXOmAS?E~D2D84Ul9 z8t@phEMPSRELK2zwx)#LhnjGqBZ8R`e$)YP>;TuWB5wV#XGw`u=>+i=QNJ@KK&2j_ zYf7Rt&BtV_vK|u`Y-xcm3AlA|s37i!mZ3)KNf0DrR59Wowu4kSnF2q<%4e(tMr#Im z1=!L)S-|;_5D^Ukb&UhJ1evoaFnm=>rUW8GiK0^GWCNM179-@fYQ++TFj8B8Cl6pk z6wj<A!GeX%Wknt^#7KKXm=S@x%~FW?0s>-)#ZtEQ(`M_o5++Uu6V@6;VSst-UXW%e zLs}bN6p0}>(yU203Ms;y;w@xl$|797S5B=nT}Yk_uG@i)$dH<Ad3fy$_F&5&!(V0^ z#v6;v7+x>Ayg1!M50^uLtA;;?2N9U-ARu-elRNxn)@Q>@M24SmA$w*|41ba}c`7p7 zeE8R1vjy)T?qo6d4!h>T-S2QKBu8BE{rchB6n^Y}ho8zJa%1`)J%{%@{Dd?;vilwG z<hAdL$Lr;Q=<at&PPO|TdI{+ZxWR<afWrC~K{M|C4l4M6?sxbA_d9F_VU_ng+?2kP zJpUyo2epasvX<qK=Go;qVB_d-@>X|2hgaRNF)v;3u<#g-IU$30E96MmJ2dHfhnwsp zq6W*ZcOa_DUGC5YYjkVVf?e(~kY1y)Bh;PKZJ`>Yluf?7-^GQx_r!NPq$s3lqy=t2 z*g*PPeLLVj(&Y^ISTblkprCez%!C<Nj7ebfrEc0)6JbkiaImMa7*POM3`)xs&fObQ zFyFOt*@J>>!b1w^NO9>7>N+awoyb_#X6qK(4f0}ef@0YH+tN3ZP5AL`_P(gi42nqZ zqRbKn!c*ew(T6S;x;mnL$YPs&?6Y3d;mr?rE|87oQ^ng18&<*v&=c7MZo;M=W~0q8 zK&sIu0J?C|KE#rI5{k%7)lQ18dJy{}cQZcs*eJP7(SNdbv}Z#{4@3tXkfkUCr|D%3 z5&r27Jg)G+_@I-4-x1U6pn?us$pF?G)yZ6d(u!VgAyir`K{_UpyPtT;m9%zR#w(m? zcZmi)Yk1qhw^#DIEG9nO5@J@13$J$DL3$|Twhp_!Aa2ixg04eUDIVKx2U#v5y(aCr z0+8b4m10EQXFYdVto>}lxrButJ9nFtL58><!*E8O)T=mcp{2>^wn5+}8Dq#-kiNP^ z#Qb*%%e(OU7&X}vYNqjtLhPrFgPP-C(J2wO!I_bGPt0sR{%N<)=06D%7dX_Wjt8{> zq2u}8Hko%oQyFU9F?d#s3xUl5$sLZC!Xy3JS5V8|-HjloFjFkoYC91+U?1TDavBgi z=sX`PhtUu*z^Zx?4TI6Km?)$M+o_n~YtggC<Ch2hyUhS@1BhcCZ8C`>|65@_%t*JD z)4p|##Et;U^u{bx#zD(@rBka1tZ%ltFcC8k!w%;Vkzd<)t;V`FzhR=WO0T4tjC_rJ zTSySFmkwMoxMdfLMchuRkhP5WAP>HAM6vosm}mHUZjZP=)VFru#0hnhvBY;in^Gc) zC)%A%E3%U#?tH!o@0*yN3eKt1u|jsbqVAheA-fVs4p<4&@V*J<*Fr>QL?i8F^|6Qc zH+0`brL1()D-?35<8Hp35X?9fTul5c2U6~%;sw;C?M9M=p>U<n&QK21_YNwR=n1$P zv2&<!hRzsh1DY&bY9A`u1JV{BVsJ!29lV|+mVy~N$V-B-IY8<5hq!@GX(LHQJ2tEh zHmnOQtzCIe+{#!}y3_JoEe(~$LwlNJqS~!_*=M3DKGqaYTdEwNsd09#kkesR&@fJW z+t88)rUiWKTJ9=q*|kQ?RWPdknS2~IA9Vm2*d#ndMqroP4iO<dwX0=dQJ!FFH&{~E zSk|^%&6O42W@PRlajiQXxScg_LyUvaV1RRC7@+Kp1R>V}0eB*41cyqu4ru6>J%G*Z zt(lK05D^FY5!f7y;_jRfO*v8FPRuN!Q6OhI6$QI=nt3_i_4G`gosiK%n$9EAsw6>G z$G?CkHT@OJ9L&dV<W8`vFoDAnYPJ+UTf?4ygQCAtgGj&tF^38m_$SexM6}?rV`U<& zCaHx@idx%icQar#MdcX@(T2ltU%d7LvAbTm5}nb$_)v>DI*&H;m{`2qpQ#CZH^(Ws zU9kqD!S_#!l)Q98xF1FkRzs&T2fFeh2f7iqkqdwZ4*t<84oG?tXA^s^fHHcUL5bdD zD0>%xQ8z#vO#Vl^ngxK3w17hq!T!tOv4koErjq_>T`f02is9zGCM8|ivFJ|ceviWd zbiYJ>vA%WU^(vg>I%Xp4U(yhcsCV5SO^7aLPEx{`-CuEt$gxmfhWAyhXRwD4l3o5h zRQ3GRs^?u*&reo8Z>xHKu<H5#s^@#Fp6{%B{z29AZB@_zT=jfQ)$=#2o^PyrUduDg zDqK|EU-5n7%A)%#ma~^C)DkRYul-1Pf5in&I+%g|#<>)+p9mJ+Utv@$BT)7<5oOW+ z70Ry-@2`-DROS)(qK%(?7S59N)_(g0+6paiXEH|`!`WBpmL94?M;zjqW9<&QcpoP6 zwaRizh-!P$E8US03hnpP<o4-`s-D5=4!Z!NGbF0Q(!GGfL2Q!KW^t(p%juN76iI~Y za(E5~TV;go#AAtvI^i%0_lU(hU@>_HDo%6IaSItFf}5Hk6!1KlfatX}-i%0ChK$<H zW@)Yyrd*q2H*AfMl*!_nS6Br<tH}w21;Dy6gmppDguz08jUfh%IH~TWz0^{qqN?@L z%z9H-od&9k^_upOB0x4-8ckBgsWEhAu+=V01oQ2*Ew21}8PxX*pMuYD3O<EQv!fzd z99#~yRoaP;+dWAgrn;P(cF+j25TQc(I{}BTF9QzOAd0J}HosoV48RuD6#dH^jcQot z(qRwIBK6jcXs#khiL-a25h}aZLX_?HJZqPkPO%puIkQBB(@|U`$;_5zUP~E&;0u*Z z3KqjFE@ac_iVNKn7<H*kGTNy)9kr9c9g0NVv$Twm<?|J_h|X4!f=&n)s8MGe0d)fN zJhBCIrz0S)A_-wen<!}l{C!=y<X{euKM>4z-9=<F$ADw0VbIi0zLv^+%Jd#Y0~R?k z!drVQ;e5Oeb>4eH8ELgp=Z&wGBQ|Z7CgjW&q=HO_P+exFE_GohN=>R82VaCKj$gt| zjr4X<ce6C13YsQ7O+d#0Vjl>T41F0I-;W-ox>g~q(NK;8G~A8La~<Q-fF>W2cI@yk zX^OSuze_vL!_#MXVEkKBQw3bbfACQgo+4yT6;9Ny-EdOCEa4oT9cCxjn+%7QZ6g@W zl0sN=8_Dl#rV&mD!g+v`)uCBIT{3%++-}<ivjX;Y5`GoRYc^_uH#yduv>$}-H^9k~ zzuI~rqo@f)Do;j*!;1Jwb1>O}F&l`IT2<UW=M&$KOKc)bQYTF<P1KMMzZ5YqW<j!4 zOVF9HYcQ$EA4IyIrJlOlWM?>QzkzBrs}?ZM+LtY(il9C6;*-Kqe~<@)rd1~kuuHqH zW}_Tub^d&<J!H5dlrvf&GVi)1D;_|pqrx;hipZ_dop(272=jJ^AmSzeyxo`qG(wGN ztief`5@wJvS~F|4Gh)h(VY4)Us9^6|k^7Dy17X@LOjAVTi{8MW;Eu7w1%FJVI$ZF4 znkmT&onhES<7sPr73eXGJzZ|G>jXn%sM6u~EIe4_*C|kdo)T~1%(n*B9vPsOmCtdN zceBG!JeGnPITo#w8DnpZ)gDG8D5jPevtMn^TySfl4h_`IK?fQVuW+2A4p%{GuUTVG zjyQQ*LX!GnbB9ttkf&w+hy;rD;a-2HRFbIHq)LemGz)2vSYZzg>{q(3LBuysb+KBw zFX;Y}yK00Qlm7gak)J$lj<+%)Ik!ZFXFO5jF*pU&&JmKkC|0c2_hn(&*uzk8iRPr% zYj^A@(8}RQr^7QYDu9I4t0_|_f^Fj9P1||u&rEX2p<#K=Es|R|4P%iaAH0E_wuCqV zC3`f_3mpzN+b-HbT>UBJWE>OPp|}y8Q-i&$?u~P5;C%4bp7{q>nK>mw-$W?HoZ*Pr z$}-dzh15A3Trw7%aR7@$u*-lAIhJeFw8D!#B=m<{HIJT{hf_#7``i@LdDK!y+HyR) z^B^>Dl;t?iaEdyPCFTSyOUi``u?=3-#J_Ti8XgSdYIk)ya&fJWTYo^Tj?|fdT0Pf+ zo@VR=-CCzYlO{gcv4d{7qbywIrEWw<tvs(Uy;C<hYYVjMMoVpvHG0p`hph7=bb4#< zmKQ-jPB#^Z=(5m$^8q{Lx)l=B4VD__0x-%y3_`|q2ZuzfqiqStjI-NYVv=6sE|N4; z##uFz-{A}uZ5!Jru^+s4@>P=5q1OP1^JZ`Dud|vapTU&?P#TO<!_03S&$q;~>mB_C zWn(=KS0w(;pII;DV1~9LGxM905h%cMwZa37|IHBKn-Fhnh(eLn3Wg{1D5`69BB^v% z6S$PT7EzaZL#n8HoSwGdO-P~chk(dA7tnbBx<61bz%7IkM*dE3pq|4hAPl|NhMc@& z4Bg;_+!%Z&CYatMxR@7>g{_s{WFT&;4a=7f7q>PCCQ+k;`#XOZ4XEJ$Pf8~$xc^Ps z%pc|ggH4vec+z@=g8VN~kpCy5cEk3HFO`dSB4C_;Csx-E2aijKdZVH==a4z#=R`6z z&;OsxM(T9nP7D5X_G0MAt3+Wtw+Sq&0VAbsyXC_1YHi}%5t{tO_X>+9zOPcX@2gbe zeU&=qeU&=)eU&<H+)_jm(9IBI^wL}XkhEjJA_$%PMcZ0(dJK7jU0lD<h6w)=BzeM} zoxU5@mGrK;P8+Y+n90fM>5euFtD-FuO`Olf0l(+j{VcNJWpi+NrIrYW;Qw)sA1|{w zCWRF<Qynb6<WGtRru6y2TGHrOi$5tp#k{PV&ue``%DHAEagPlXean#cEqo~%zAAi? z^$rsX*dLnU=ESa}@a>S8lSuq!{z%k5+EoT`O2TXWPDnBw$0=Gf-Kr#e;3_|e!A?+n zIoN!d-@>U4N$h+~{OTs-d59g`-o%&ba_Mk%lcf*TWc3GV(9}fQ12LPh>3)g!=%5A% zgt#t#fcC&%iZ+?OG;o|G=w>L4M0BK=&{e8SXVh22UV-0=(&P2Cb~Xy$XTk7&Rz6#& ziq3R5EL6fWe(iOtz3zS2t|R!c!VGcm1NM5=UjM#pZ}4X}M8g7orlS^u3mS{#fuG+( zaH>0HKqHc0pVXl672!cT(n}*1vUbD*Wk=MT{j`WP`$~sVm(4fa5%r~e4`1KVRASBA z#5cGV&nh@yvn{XiCSiICH~Sb{T`fNSI<X(|>9YZ%G=n@Lob3T)G{NUwbe&RP(URCO zu@0jrrEQlpk~*8dvKpr~)m1SvFT-j|=cxm*Rr5V|&S<|R8u*u}BBbrAn!?U|g<86; zYJ+Ltt2luE9iXv^a)J)C(O9qxZWBay6-Bu`k!GuH|DH)7=Ipjsu7?O~I*N|Hnn$56 znD@P;g|MZ3&YzcW!c_s1tPXv16pq@zSI3_0{3adf7j<pT$7Fo{ks=98s-<3!W%trZ zI78yh5W;(DP&2xa#_~6j-)SdKlF(70mdpBDuwpbgbBt&lx^8_6-xYdCLcJA-Uv|T4 zUmW6ljlcS?&7qnE*AYeI=4v$?3QG=gi^*^Dw#$6P?$~6-+?o$>f?1@R{Jg|m)t#5< z!aFM5?xERME|%kaXGH0W(nEE!+d(9!;ll!~RiI*Dx?2`wczbXIAsC>&!!)KF<4!)% zwj1qv;@T0vXb@?Z<l;~SrduDNqn37y1LHv{<sB_=Mza(Jp|mkfLNHAvqCk`=^n{kB z^xgbXx7Bz9rw}+u(FXQCh5;@HGe`!}g11p`=~|<OnQ%6v-E~SKCvVya$Pvi4P219~ zmQGkYTQf)i2zvyM1~q8>zFc9}nmHq)Nvs-cBU@fmtzK&Z93*#Hlk(Fg&DG`>09+(f zYXrM`XOleUaK-(CJUsas0G!hzmR(vvq=iInpB;-RBB8embn5aispFJHjkO$|VT9!$ z5Z%bf%9X?6H}vQVh4(9PxbC02<HuE|7Enaf?siZ4AvxvCTYIv$qB^HSD3C+y4ek8c zL3+laU`FIZ<0kgPr6aJEe56f4nzi$?wMd?|`$QttWuPsgPK@Ck45BThXFL~s$Jsb` z0QB4*&hM5A^eiAx1K&;5nhk4pN0iD7SMI7{(JLB(FlbO(;xy+<pa$+a;hMa9de9Wr z>x7VM2G(i8<vPs^CMjb82YN--6?Yitae?Um1(T(mj#B6M+c7%Mf6(Er*(uG(d^tok z%Qey63mTwGb=O2+oi`I0<;|>eI7V~X=pF{yIb~gq84$Bvcr4w)U{nMSIWXo)rx`yd z!&E!Bo)8ph#*2g@=q_Bu`vCrfGOUjywGvF(rCC~CIDu%#S}J!?{*sLmqZDzpX+%v< zA$Y71HnPjNtKdHw=*|uLD{Ey_=zndZl_@tFGkR;U3GZVFQ5d!?T4qq?-jsvlJv=dG zn5^g+j@S}c;A0a1l~am2V$-ms(>0>s(DM;F+{URnmO=Lg^YF<k&|LeZ&#ISWmhqwm z=U2gfPj&Qbvh=A5HkLY!p{v(l-C`+TEQFE}AIZCtlNPT{9bpnQ5HYsIMI~cPIhwd& z^Qjv^%cx*NSfgU_+iy0H?M91SD;t;VdNe0}VLMFdCZWvA);^=h%Nl}n8o9uQonlUQ zB4%|3mhlSO)s~y&u+`~ak+T-Jw<s(eR-G%H_3yByZEx+Mc8xkKAd;$~5_H}Zq-r-f znGmqI0;#%!(^mF@(H<&W5LziEv!pAO&j8RF`X7SN4+WhE3YYB#f(}NfjSa$#StRq! z;_D^9kK9hwSFcG+j#IZGV}Z^M8E>@;svrS^!f>tAekYHt<npS=UOBb4z|wBSyDZJ3 zw(f?DJ(G-U4Uq+Gq!1*sB&h)q7W3Ev2t6SPi>+?gtk&v!?71@n1A3XO6Di%Ix&y>D z?f`L(14z}<qrjov3V3QS0gfaq&9>IR0DvN#C^)VXCk_C&?&k0VP6Ukfqzg`Sz&HRL zFb+fG12Z#O0Sn5Z+myqI7WcU#)kVr#h?)x(@YYOm`XLGuG5z4KZgBd6o16`|T9Aq~ ztVBth(+^I;isLKq>5;0C?&5Z5B_#)lPg7FdMSPl)StV^RTNG6siJg*gFkRAgv@T(} z^~P;Zmnhnv+N3?&oTwFf&LK;Hb`)*J$@%C_G&wD6PFd%l6`*DQ*~)0O2vAm`%cR&l zXd2PsQGsiKI?Vad*9*p&TP&)s1gD}SEL3HV(Uex4{>zaDM+?EA@yh~&mTF%0=Sz%K zK_Fu=gdl=ckklDa4N5v{ZBnu_XpM?nmCNF*?p%TM9DBfZkr<9gwK8t4jmWvsk?&on z^E`*|dISMkGBdxc$6O{*oK;J3PCB@ZYjCv7uoF?#t*9#wXL5b%(u9oTmUNQ?d>(K~ zUN`}Bp;1wwd4-(hTQTYK;IoI2rfWn_XK^Cp7*SeI5h;>C!*(3GxFf?gTq3Iwu>l*3 zIiopzb?$*^7ScZmFj)X*=brAAXb4W<Q8;%S;#>RnlK!4aFKR!(gw|y#yFJWU%@&zD z#cVQVfuXI;K6FzzH$md0bad5a&RAR!^A^!MmUj8QmKNEEA>5+u<vf<c|8GlQNe``@ zW?L@i+#bciVUT$_7hv8W&9bap!nN`;%x<Bx+6p0?U5h47;e?t#X%c1zHrWb!uo(}< z#6oTp0G6<~`WK>y@95qK=VDP@#^394Hit6WH4w-pcL_u%W5`7x;Uy4Gz-e;~$327t zVJl|KxeS7~7eq?ZZhv6P&Sel36(Mz(^k8o^+->0%5biMGaPo4+kcKc|M@+aRwkNEV zDLdpMN^*N*jBo(7xM)ya9PcIw8PiVs@8wo<V!fHuFB&n%>maW0N?yZNi`?Z7k`Iu- zy+!7e?ouFBVbMN&=(ZP9VT%sMtSf2=^%doNYc^|-8FgxCj^@zXN&blpoQ}>)hWne4 z4H`7JwS{mHUS%0LnLN5(Ll6SDO|E%V=Q$kxL5Au^V;tSh{?J6q3_72Hjz8CSnhYPw zK-Iq3Oh}uw%yMD4TE3jrDD)>cg1aP%D;;9-v?rJ^_fHirs83;WE;2@PDca^BA$Bw- z01Hfn0<!`k7OqjOy;v6y%cB4z>$Cu(eVf9&AB2JkLvqK^D=?*7Ni+kMxuN4z*u}C> z_dX2LdK)dIAen0&#!Ai*aU%AOHk_zW)^SeF4*QO=XT0dxxzo~)|B(e;`$EKxm2~$e zNYAR%;&L&4Bn+GzrT4v+S^4Ia5rg`u%_-4nxjibdO6BGhFiPN%3urZ8)N&)hCL4kd zOFQCqgO{~@2$}ELAreeau^mQaMB|R4#kXz%7nG5*BkNwiuG);!8k04Yg{=sNv?!qs zDbZ$>i$%q@Q41;*WoM%eDXvd6sEsIsA{tO{^`A;6{U#SgFxIKzW}dLEdnhtt_-W?1 zk)b_&7_HAk*53Rn=MM1DY7hUnJY~)-AO0vCRl|7(x=LbT_=j%0YRbyC6V(w{`8n-H zjcQ2~%E&Dd7jAL!Ao&B+b|YhU9^CoBGsBnF>+kNJyN?-So9NSz?cSNcf7-^K4?qna zyXn-V$LX*v!iGJV;=BHAgi_Bwu)8rmbQU+!4}N%*=UpdFnEs8wpw1@M_4Ec;N4)<e zf1rhTt^Ci@=7Z0?aOt1ye2}^uTs<E?x}JtoJuMrr-@Wr_5L-5u;?=c(Hh(~NoKC>0 z7cv;Eg&=(a1GQL80_>^Pk2~nqvN!NsEQ#+vCJEed=|c4C@*}&C%@5ZIEBWVYo*DM8 z&cf|G9}p6DJ^*)SNTqhc=jwdd52DUX8Xb)QI-8Qrj{p(?5Jvp`?1RdA_P%F^FHP+p zob=-Ux>A33?=*>fGWSju>VL-@7(@PYjM5i(CpNn=^RD^747AE|1IRa`=9;-l+VxtJ zHp(q)^h3J`{Z0FiyI%1@4A=Uany1wsM?cb-3=sb{|5<<I@P~Oc9Au~-$}h*kyzj?2 z;7yDJN;)Di9E?VdH%p`0K)eG;Nk9VE`zHd=#+sT}cDL`I5cc<K-N0#Jv>F%{L-FwK zWnh$sf|6xmlrXdNJuq{82*!tE`VHaXxP^s%e^mz6H9v!+t4VX`1H+0<94A}*&<x+> zyzAzZQhS3q;+pn1MDZKD2lv<Q9xTyEVP;MK{yFZh5shCtV!&}z`54{4t{geANK-sc z6$lz$4|L&v52L>QH(ek7bNnUMI|qJh1Go-|o&(#sS7tr*0kd)R!-vDI??BL~1@*6r zkSKQH^)O<iT`{x!_w9<A6inxKN)-N6%sT0HE}WS$P+Wr8N2JfVwzvdefKqFUORztb zy1uxC$+=QD7MCE%mHK*d$wHU9skj6|ue@7|OHcty-CA7YRK$#L6_?C&dAAjpphEQa z_Tm!eFG}4}T!M;G>dxX4T<A*OQ(V&KQtOLLrn%Jp#U)vn+FD#P*`<D>jsKm+C9P<g z8QaW6BHXY=PdiXEOEOAnlCvbO)Gno(l-jFQqf#=&w3jECF{D(zQU{buDK(;$W>qr| zDV0=eRH=kgV@gd>6s;N8`RBBD$6>+soFJmJW9D%;_O!2X&JJhmwEH@4>~Emh{QWIP zJ2Aao=q=r#9gxi&v~~4MNEX|KeyPrr)+Y2nX>dbKu}d<qdi|$O;Llmf)sJ83^*%62 zdVY%3<4XN?1F2_}TGB*n-ynZp9PBTUF@yBdl{@^pbZ{cM>kAip+00>RsU7l}r-w}! zdONmIa^>Fqi!~HEQs7{6y%>vL3|X$S-Xd#MwT{Gf-4|tz##tNm;e}p~oMn5G?qTV) z^o8Dba{IS5AND_WFH|~#V*uL=a|gYF=Rl7ldUZ=U;7$~@D_ZOx7N{R6b82*YB5vVu zIp8bmV)!DESJcN@5y;aU<F6x-r>6^Zcg4By4)vzymjtfAJmC#|3UI|@aAmuOJA`fN zR1W_PR?yD~%@LGU(BB`TY`Oq<BeGFgqMkCq-;A;Z_z@eoHykc25le7rh*@Ctr+q(I zA!?Zj9#?>laY12B!u%K%(NYyC4RO0MD59?S4a%zT>)7-u&w8t$0b#>qY!VN}&pqtZ z5|wk`%WoOEvmf}+byl4A1OH)NO!t>J(349<_wyayKRHPHG{L$by6$~$&|CYzsFutb z5b07bNnnhE6AE*O$T}4w&1Q;}8!Tv;NNfO&OY72w{v&$D*zb6ig6Bb~jt@rizYq&- zG;E7ZHbZ+<v+P-sF%R3JlK%D0oBU>X!~h2g0WlzO%Ki$f5{)kXZQEEMtZ0PIL>#AR zoJXwAJtZL2<{@f*mJ%EYJ@-HagnG6)h5*XQk+bX>LBNASu(`R&@jC7P<xu0TZ<(Rn z4mHM<_$i}AF~OjOz$rjwm~ef5mi(73AHZ_-il?&1m9unmS~)@ijprT$fSm$hCjjty z|DZ%%5KPwqox+Qy=Z=wr=&~7gQT3HknEJq1xe>}tXY{g}-MrsQp&hT1O{ENqvY!rf zfMD66+5`97U#7ic^Qhk*Xj(AkWpDLIwc39h8^tT=N&0N~B+h(^_D||rXTX#{H&;FX zQPuPBRz3e#)${RH&mXFKKBnsV2=}a%xBo`f^Q%?QFIGMOqU!m%s^@2_o}Z|Cezf!) z%(xOG0Y%BFkN#7`HG1<OV#IL2F6Z)N#KS4=jK`8D#_Ft)^&Vif9u(_c&fxWKSISh* z9+B!kn6QanlR0BAUoP7v!z4I?SEEK&I`V8@;o>8Oxx992<uHYp4ds6>X4@=ET*g3W zGm?U%aTX~@fi8=x9Z`-asJBBgXqLAt`0{V*p<*4rN*`&%cyp@bO&F7Q)~o4@VS;St zZ604YaPJ2Q(_Z=n7RqLz(H&@<oJ5Iz0%xBY^9PXkZsAMQaM_HY1DHywA-%V``4!{Y zvl4~5`@De{b$^Vc)lqEQNW&`<)|Og-jg*tQg3PKGWCpdAo1k)tmYC)#C+uD<=9d%^ zAlVE&q%If+b3o&`3&d_Gw|_L`W{r8QIGn%&FHTGq1r;nwUzLIo+;~OZcSFUKYrf$F zG=HRmxnGj9c$9gx?fv?p*+q!C_L5qdp9F%xo?w>H0jN*g&dFIxcb1-d2#di{p9UpI z$Ct8b9@;vuGTjv5vU!BbZTVl+f{dpnYLIo?!EpbE=7;@1jt)?7r(tSWu-IR~9JVBW zvve0r;&ap{Dt76qqjpkyu+oe_Ls8taT7!PdnyhYbJ;?u3g1T1SpbpHr;ZTscL7L-( zR<xO`Vcm)96_wT9@ZJ>}T~wlBbF(f|Xy=wrxYtia=Bzg`nN907&>lfsm|hc1Qybfa zZ%h<36SJ8o!0A)u{FDyw5`uSt;3q-w6Eai2613!1OWyjNKUDEOpE_G}-0z=)&0DT2 zOrKc(J=IlI0cX4m2vHTaoI3bls%6S6fa0w_Ae#LhwwssFue^aT9cT9JX}Zs?U7qn# zZDR+kjPqPk4(FwQ$PINi^BCya4tlm>oiuN-$sp8;cc9(pK#zeR^Qp*iE5SLCVc%Sl z;K!-skNDq`4vFth*aZ_hn|Y4fo~O2-Hy5EUiuC2xAU8R*<ngmXTqYE@BQN@2X@0_Q zxdvwh1=_6`hmh9k1{f=bMB5H?^xxO~m|u4_#RQW#(4xK&{lrI{{P+q#3-e<(46gN` z@yT<|4|6$^-|}VNE)IAbsNG>I+|S#C&9C__e_QC7$lJd7EgZWYj_H3re9Pu%!QUPi z5Ih?xu(|oQDWg<y$-wX}90G8?H}HD|I!pOb{PGmzx+K(Jnle2<$e&k{7JZcEou)8L z=N<@7kiz465rk+aNj4+*COz-nEve2)!^0pZn|TBhehe3t(y|<}RdS4%;~E~e(*SnS zrV8P49F6Hr{ZY?U(5cY*(nTXqT%4-dD4A>`h2EVsmdz;W5Ab{MQ`62S!f@IFwz8S~ zNg%j#Lo~Wu48=oe4ZdtM&4WJCOanJ^bB*~ssG<9Y1JvJs!$=@0klW5fxA->dD0wgN zwB6cP2N{|iW9=HFp&W)<?qO<bNz-a<0+LHtH^BOS9aleS0O#ecsr-nMK<;UpnkVKC zo5Cv0(Tm=vE1F^$OHIM`RZWQ{$nAfu`Qa&V`Yl&`t246vexNPlZqzQ<2ruE<0;+z> z>=G1H?{1|oX&^Pmp!6PO)cg5{%o%${AHm5a|BCJboWvW6L(*!ZiEQR!vsLzyxz~V& zMRq*G+hwDX!J<--_l}>??=*;Ux(~X{ZH=%bB4xn(H7A==HdlCEcfP#dcLnu*%9$cC zBM;LV(B4OAk4AaCm~H@x{`^7>k@c7A&*nmKrY2#B3^LHSgBGDt6@&$Mz&ts|(T$Wi zi5|g8&hj`1%VWqJSf+jI2%*sOxR@KwlEFm{YC_{BqoMaF{K@SVAi!lX7&HzLq1Z}& zASgy)jTWX1GH))H)cs45eb}1vG#N1qk#1XlS>Nl)`arF{);v@_VOXi{;*36R8QJ`` zn^P7=EHl-oT_Tok5X<K%N#?0ThNcrpE&`9eZxlko@VpTV$jWBk4Cj&}2lZ!f!KRSe z%+JYS=*%k2K`3rWo?}SJ?cZA^C-!i=i=_K*f`ruEf!LyOB4P%Dqt}|1#S!w<Pf5wh z$z~p+F{;jHFlu%{c1D$zf<nZoX(I^m4>EC-pz#L2K)aE@lXmCaFl3T~uJVN3upTik zFY##hN!TFW&1MiCI}XGwpr(%!Pil32nV?V``5~vQT^sqzHcVu=PJNIzFxo;1@o7nj z>)9eMJCNp1o3MI4y^yP51-ay$H)=BA1akL-J-A0sroxINX7th7*UTz3vp0u%?0i@x zwlm`WZ!|w_ILvqhe@uNEv_;V|_g96M;h)pW+_929_@J86<V90m(;kwAPKcA(evo=! zXnxAZJhlZZtw3}vpKsIWJ4iej5fq8-jDG(k<;LIQ8@L(k2B+qGUsL1t`kF4-^s6)h z*uvL{dkEuYzfSk`sB7N9=h!T63zqGC+L+d$-7w0PuEAuqNbj(b90Q+w4JgbrLI+Hv zzu0`xpL{)Po=;W<k|u5_?{~15EKDSq^taz~ZQ&HzadU!EGY;OZax)hw9~y1c?>>3= zCPWt3daJV{i!ZTm7fOKnVzWz}1TbIHVF={&yeIqA5os5j!EO*A{FMksN@AB#iTmhp zm_#sl_<5}mij8Xi3^NEYTpUKw+S?iIqYQ%ASuNC@^kYfPIPKV!&yyXSeV?PD8HdU( z0~*|>=FbzyzpADs=VedZq|ix6<idCY|7A=8KAnf=pL~N<91ne_`F~19CS4s(>{4y8 zt@&-_U#e7LA`UrhC(Hh)j)hb>%_=l>ki$H{S+r*VJHZ1Mj9x>Z6DoWMhJT4@rPrb2 za3&Cw-P1#c{yy4hxq+%7x)9dh=YZN#|MP+sobLb+IePEVjkMj4ypUX#QPT1iL1wmy zfHt9`>51tO!4YEcQR<P(M0S<@O+b&osWiu!7uC~e^@y1bfjN`7hCAu#acNvG3C&eP znw=AxNA$-4RR3(+L`Q78Vi-FbS=#}LIZHU(7}RXzU)k3kI+mjI*3jwHYW`Bz30|k} zN2J@{Wu1VxGc%NXagaYFaKJg#O6JOKJ}!7EKCK_%ey~ZkO&dbD-eE#$1T)=tD*}6o zq@k$uA%hFIrZ8k*tDsyJw#*=T@BA6^SB$C+p}~E)L8TZFa>iLYxUcz%!rUGHC+#L2 z?s7p?{WIIjwUhE&un|>F{IMoL0^TMsI7Y}c+sf5%A~1qkuE;8YS2V=XMF6jmy;TYD z^h|JOYy9oI!@R!vK0(R_Q?}IcIy<(j)($3`vsS}k&`yjit^^iCtPEJ;tqgt`*R3Cv z;1_mnNudNklk=moTUtMmCt}*SgXt}*TSCWSFA+Cf2@v*LH9+-oRt!)hStaZlKuEDL z>pcM4BFB(j-!o;mxB4-W{eLJL!`c2eyMxeW`#=0ngnqetZwq2CLEg*xn$FD_Gz&np zfR%fBKN8IXwiL|vH=+2NS^I8!vYC?0pk>h|ZbDTdGIlhDym0P8RY!r?6K2Zqz1)J; z6ND$&SuO?f&5)qWCkf_%lV2`WtLWbne3~+p;F~T&I2t|?a|mB>rbtf8^SwZfJeQh3 z?DYmt1j4fUgOTq=O>}-L^}Qo>BHzO_R<;Q6F5XK)|Ngy~Zek%jWrda@Y@x6yG&ygr z2-T5b31JZ+P^^<p%<{%_ql$drFCcGM%sI5EIeeVEJEvXZXn2w4t(e{RuvUi?>cLD4 z)aCG9nx7!UrLGy2$?4&*%8V`LP-ZtSZTrfWMfKGMxF-oRy8O8#NA`a>3LUUtcfP&C z#Dg2tJM?o;dQd+D>0SD{BfXCwh5emqPFBJSrjQ`WNrmmydq0u3gA~aoUQ!<`@FCJS zTx#{!N4#rZW^?|L^gk>pg%`N>z2GMMf<P1tl!^jU+}Zc3;-ckDK#4hLH{^{Du36U> zFY2?55YSm`iaEk!3AlSRn00;eqQw<2Z!G4BpLH+4Uc6{w#mk$DIb!SF%Ug;U5pzd7 zQMI=gbA;r%m)|O0G_T_2ZN(h1d+z1!#fu0`FZ=S2Vy+{4d1vt=!t2Xk-c!uAMK9ME zFJc>7*~|NjIl=>7wOfl9O|E$PlVYxwNWfX!2n5U#SsBdQp;ShxL8a14?NX{qsl7@y zDz#6k2Bn6S0-wRG14^Zo8d0iFDK?!Jb4jHXs+mhDHAd=_F3@l<LtA;2{yph!<oUyS zj+5F@!v<$AG@3O=^qq*qTYZGMm8<R-aamA<$O4)jNbe;l4r=)AWAwnu`Wv{Gn4kuD z^H2Hz1^MqUkb~}=2L7DU#Kj*UHBaemiKGJsC{&HJtwxQ>tdQjBHPcmwu(OM24U*bf z@S52^=QS_XGI;i+y<Ri1!(KB7@q5jE99h<UPx?wKp`E3B`E&X<mD)|}Y~*?Nq?bv} zLY8MwdQe3qzE83u7zsJTaJ^>8m&^=PoE$rGl$3SD$2@lGQL4^8w&_vkfO~A!BNlY{ zXw_ic*dyyIX3je+=Ov!9n6P|zm~@WD`#(V-H6ny3#i<Js7kX1Yph=pIqlbe@-o7RT zG?8E?na!|=CI3?}Hq|?zm(TJ4ZGyVp=h+Mqr+W7@y~Ag@<Dl1kt406nTSK8{^iw@~ z`f}j%rt~e=a5h5(66LLpThmusW{y}l6@E~KvFQ<6F}jFMqqsZ-&-0=O8zKkVoRPhk zo?@^c=8ZD@FT`tkJM<(`H0o-;F>F_BZm!cXuV~`O#1Br0JCwUA1b(W=k$D0`vjTt& zyT}Y|s`nBhHoOh7qa3aG<ZNXNe3US-!_<ReVQG#cI}RO<0F-@>(7v#rQ@zJ1m(94y zTVC1J!u4J5xDm4GX}qHT4*e(U;dWvOki6<5a?=f04yUQ>JfUaQ;^MTGN4%bOR>V%n zrh327qfH_fYJ_w5MEJ8RtiKG9Bav>A?Nsk6eL|?D(r<vG_>)KDL5#YU%@9@XHAn4d zGxJ0Yd~8TvmF}ghngTHc)3i*ks2zJLz~G{yNIYCN^h*=pR+Ep=yryhgF*-~^!_yt% zaLP|I)m!L#xhCq%4x!q(n>R|s<g~=(NFVnnzNe4GAe_UX<n!v`Fs9>CG)_(89<TYf zn7#@7rY@$cIR%3|uAl0?tSTOHq|;hH(wd_!O<%<)+b98(TSwjalB1QJ!?dC|{q;Dm zKOt-2A%!el8tG4qf7v2Gz$o!AhdC<_!HE$1B>zJZ=?(nZN1R}kLG-o^&(lFH4tt11 zv_kq&p(H2GPuD*LpeHc~1b;{nru6ufNQEBaeG)e?ng|V5r<ja>6MNXv*^?x1LW#%3 z*u)pB5_EHr|2Q>vXh8spxAeqlNcEsW)|$-W5#BPH?*Fv6_E};AczPieUg65rRBsC? zEt5{F55Ak~{Zy#lVZtkS;N*c=WEt2w$V=l*Uu?Vq*c#1d2(8rD&*|%*s1T$|A&H|? z6C}2g&mdHe3~ZX)0GJ#kH}GlTl;rsbvEFSVR<-WoK+WyAQzC~C9*u#T>dEUh)q6sX zzN$tI$f@2>l!4H5t^tSo5Fn(jtaC-sgg`GnjnZ<tI8O`+E(Q4j@!_p}VL&1tz9PFX z6c0`-@=~b7gAu|><yLW_t44W(P!b^o3UZk0y{0^QVx-Jaj{0Ju&?UtHYF(%UFQo)b zO`(X)rQ^^y#8cubhML#v;$dE^yZwo)RlOTQrQ8_rS99U`=J>=0kb~jKwc&IsB}9xN zp=vm%SfAX0g14o0-*5=442UYn6$jm}{;61P0pS%@_OP9=e!Y%dzk`EdiGO`y(lf(f zseBGi(cuEw_I~a7@BcP>AB_M0n&|zt<G&w>-mf12{Z-NXFOUDeKYD+~`0rOn?^lig zetGo%OQrXry&j*hp7J>eWcajrRU1L^8U9};8TAEOZx;~He=K1cjLdA9u=gR!r}Ouc zI#`G~i5X!@KK1TEBC%f%3fLT)E!mSEl8}N3nWIVWqL6V(P}7B)(=UbQvL`{u7;SvT z6XJ>Q%^<_rqR81JB36AMayf~`UW$mQPuiz)Fj#1S0i*f9W20<GXlpH1aB7LfXHI~` zd39K=LE<vSQs9ZFVgA1<3co)Y$~C(PPB}8hrh0Gj*O_GSQ)H4Ya8hlLde*B_!zwk# zv7wP&#<neTP?O?By0-%+oa())Vk7*QzZ0uQ%VSIDBh|!7)*H@k<`pa`+r<`XD}9;d z9!5Z!OuiIh_dgg-3A_89NHYcM%nUl@tZqsp`9mY=h5rnN-;NkqnOZ69>#!MCDS^YD z4}D`cMbryvoL&c+1Y|1}gE~e0h2SskQvc}F4s0c{zWOpkmc$cU1beb<ShPxVSV+)_ zEJY?>t^fol6Uo)qzR+yKbtQ9DVyKWq80N6!^@uzMVw1|b=S6CkYno#_r4Xf(&`xMd zv`aX)kzx8!a!zo!s-}koxJmLkZX9f8Ae+bB(#|eHK<a}|IwHrty+K1s0GAd6`DAJ0 zM^(`2vjz0_eo8+t@p`Z84JS@2@pHAVQKhyJMg`ZHpbmxn!6^_Ma{&rrL5rw>+pHUU zxU>ZeEX4Oz?^V@?X4fD#Q3&vkR+?0QShf+ew!faE{Jtp}J4U2InLohdwXT6)Fl^w) zPkIBdy7-qXBr!C}Vg-{wdm`aL?&-#|BP9uuJxQATv<b8&Dxke=#wH!$!j>2L;AqeA z;SH4C3T(%EYcB*UNI9ehD$oR_L?>`?HUr|OdYh9W@8(7dUFO=9s8CJY@;|GM>AkdQ z#oTSFVrdSGN_gn+hog!(b#%V!w=~6liv^vZz*_mYCieZME0lW}LE%g_#7xLeQ@u^X z`Zj?fLs%SVtGE(yw!$X^rnF%4AT6Isx$V&CVZG5foUIQ>V?itFG1YrpnZTAqepS`& zCa(04B`gZixa%5;?Wz;zTsrT^VE!=T#*Os7`7Jf7$DpNtnu~=5kh%uknqt(09dA&K z3TVW?FXl<tlCr1$Z|2?wKC0?k{LdtlFu=%3bcEPO2{yKg#x~J-O*HBV2?Plk%Tom< zR1uI8#EDQv1ZM)-9uMNxs%^ckx3{-H+j=Ya*7~HH0VKQ%;UOeE1ES6ll^{w&faL#O z`<zLJ)Z5;E`n&)CUq58_d#}Cr+H0-7_S*ZrX?NF2cZ-UpgKkV$)q_Ty6KDWhvwH<+ z)~zn9D$yE|Bx$>3e6S1qFh~~276*0W2_gJ>j{9v!rX6GiVwSDO8o7(SdL8LqGfc$U zxN5*Rb17Qd>81b~z!OCWV>klea(O|HP=(eOxtB}*bpj0N)0lN|FI)uN19u!;bKJir znV#&^DnO3Gr19+ieGD20)iENqoi`nz=6D~syE}&>yVXQ5yNuPcEbqmRD9aKKDgIEs zZ7FjG0o`5jNDbl~hM@hfcQDpYSX$MG4DS+S`Czd|+I9!W-cXo**t9p{fd7eg2e_D1 z<(8!qvoD;pqdy=n4J?dbiiiJcSKv-r6uI3CQ8RZWvEI<rpz!<K0j9GN7#Q&)UeSxu znuAPd66Sbcrr3Il$xL{E&rSC3C8kCD9P!DSlMBkl1xKX#qFgD}4QJK+M(8HMGh-qH zV3ZJN#;ew72wu0cW1Ur+XpK*z1p!BPmri={eQ0G)@l!=;B%Q(sgc_VYGQ7)3)<l9< z+>@O3Jju;K4NQx&o~vFFU4?l!j(@@q2lKBA(RLe#Gg{JGmS&u%g>imnIryj4LyW5M z8gMoDh-h6CU`d77oTT+l5?I~CP(|F}yCbScs)VGVxDf1wr|cABW$A1D+EhiV5QrvE z!jijafU!IcP>E4lI=Iegh^ar_wy4vHR&5Y)xDE)YI<EB|y*fn65DtUQC{rLn3U^P3 z?OMcy+H%tAwi})uGSvd*t)RVAas|1vb$bLq1<__gwl)J~!g<c!56PR7Hv6>!yUy6* zp&V;b3}9Lm*p8y~AU?oV>(4bY*`hiITsJJEXru=grtFyb7C1Y!Zs~(sp|y}lAu5M= zwb6y11Fcm!;unUXFGy%T2&!^!h5!+yC%YZJTDrG~b21R%vSMTyLY;zL$Nuq!jE*^v zZNi!)E|`f;ya;}IsZx4@L5iTU$6W+Z{BK6<MMLQxt@mA{CR5xg&fv=c?TyHe4!0dA zMr206LMbEdF;CRPmX*-(n1qUvBxw*>;We$$?or6v7WM}S*ep}j{11Ud`wSBhf2qzx zjPKjV@+at#HQ>nhwGO_!X;AZH+O2A|?uI+*L;k9d<2jVw>c@7gwlJr8QKYmL@^bOc zfM=!1frtom<p}d(-Mr{JV?7wPT`^#n8i!Te94<CzE_vq=Zl@3$)4S*)Surs}6#Y>T z*H$7$PBFqczTd{i4M5$p9*Rfj5-u0xzC8-4rVASe7R8*bS81S;#zh$Jpj(Z&taF*) zW+OBdPYc$CjYj}c5Qoz!<S?h;W!RuKKGAwKNk%A&A8W-XKS+89i>wn;T~zRUsitjY zAHx)d9~Ne#u>OU=Ta{K%YpHgaYFW#rn$}|XNpCBpnoK*CY(q~##BC=ezR3NYlwQlA zWFcse15x$n_}-+nP`9XTy0l)sQUe0b6#~7}_GTE79(@=71>xP78vU(&U(%il2LsV3 z<tm1a+a9EF{MLeH$eH(^^x~{&15%bFw<cT<;{Cnt`??Eh=|!l9iYw&D{$M9s+OLF^ zx;SJDxHv|ee}Zz)l9ay}7qaD}Nz-?AH*xE;E9;LdIZWer?kx-WntRB#)x0G@pjHBN z2|Ou**#uTdU<QF_C2$Xc7bGy1z>5-?OyDI6Od{|r35+A~vIHs!ydr^e0xKm@M&LCG zln{7R0(=;}Y?TD~2zyzb1PTePl|TW3^%CHl<Yk*BkV~LJ0@(z1N`TL-mo-X&?~s@6 zlK`J>FKd=SI)Nh+;B(|<5ee`?^RiDRz!%KRS|z|I&&$4)0ADXJYbVf;-!rbQ^0dfH zU~Wg3$){P|Ij2<lza(&V{rVR*LXDa~Fh9Yy3%d`dobyU(<~3b0*oCa(tYYa#!FpFe zGR`-ao`<p|^Anoq)57--5%RM<9Fxj45!Uxiw-cKCp+s*%oX-79LU;HG)k|nrhO@t% zyG^1Ga~^`JI`}!uXwI~BZFnU#FOvg)wx52&L$jqu1r6+=#@v1K=Og*^x%_F9KkW&| z^4*w$#U2$;Zzm9@o}FAdCQ#y$wc$se7y4N=o!CXlWOWt#VJ=RzS)y>3&h@&+5s9+W zoM=R%EFq`xrxKNW<gtWSJHg*w;Y&%-mKLW4n201~c2_~klr}(==tFwjaabVpvT8fl z8)@a|B?QB%MJJ3W^H{D9rmZn&!qG&lz+yfUuD7voSh+H%%+9htsFOApy0ZS1FzhFl z-S?@3U2bEk-hXzb7)yUHYG)T6&FRN$w|HoFPozCJdU~fx{wyzl<^kj!xqUllXgc#H z6Qm6Ve|=i~=iAew{p~f%kHqFfqqEn1Xq@)UhsJ2nd}w_3%!kHi&wTvPaTyTS_bT}6 zZU5|wzQ$eAZhUb&@;`dTf88toi(c^;dc~ja6@Q{vJlHF~uvfggSA0&d_<g<NQ+vg4 z?-l=kulT55@seKg8{*^U!wZd97c7o0l~Wq_Ptd|Nc);8}5}F64%>6V$Y+9TSadu*a z4s#QS#7@bU>v)<Y%$ervCbT)T(xoOmVWF5`=4el{h6K$H<~H$35NaQhCO(rtC*@BU zYrTcLBC^))B^;xtW?4(!^c1&((c0oy@Y?Rxr>PCi&sor#+R!DO!v8l{@Ark`<bw?k zdvfk~cO@E2=i57(s~G+rZdNG2Lj{$BHG6F}vr+Ak%Y9F3MjMPK)yT6ismAid1G-nO zRpz$tI`giugm6oud_0GPPiqQR=&CYY;i_gZoT?@Qe%6VcCl&g+fg*>vg?>F!(IzmN ziAEthm)4sO6X|F)(x%8u1gVDg2-Lv08!{6D_fXgME=O|-R+*1*84YPetnPxjrd3IX zY0#1U`D^WeQ<}G?WE$2*@$@Er1lM_j;mqI~j^e6rharo1RMpLT<}}!}-N^;<s*w>J zfH`sxN7I4q)eoaIb(}EL9>lYuYNW0zc!)|&^9$HVp`X?|-zVt-IEprqWau{7hzK?g z!*MzyM%w+Y8VOHMm$`g^C9uN01Cc&?WrLRJ<tul(HffPwzOqq5$n^4+`y_-=FJIX# zA*6cw$|Dj&te3BhNC>%JzVcHEA=t}Twn_-eUcT~62_f3cSGE&EwwJFw<J#0M+)ta{ zl{q{b^T&kXI#)~#gf3%Kp_QmEbhG@uEqmhj&z$Dm2Jk)nZEti`uXt&%_)WdyMZMxz z_ljTHEB>8carp*NeE;9<6~8b(ZiH&FkM?j2VK#HFa~8-Pc{D&vC3FItW9+s$MzgG( zsJ!|O^}#ia<!{T&vi9n+Za?!@YWyO}vnJsZSG9o4Syg_`0=OMqRi=qcIEO4AzZNx{ ziJgK%gtefr6#9jAkf4<UExSAM-mEHwWDw?JEf*0!T0WPUDeJNb^RZ!FD+iUFFLTFf z0j00ki|DOP@`>r?DE<2xs;!xvA||V=(7#roq2ZXOVCyCtK2Tw+CIY|$hJ6kMsrZql zf{sj{ny}tLm*+{d7w8brx=dv&<5Vm6v|0;2XRHFb?nHc{hjk&H75ZhX=oe&2^9wz) zvdcXhCoCeJc$1XStW*LW%#4^&b=HmNLQ{U840HhhsN*!R+tXw0=|m%d77K-8IUO@h z(UW?0u+Y<Mz~$$q!ZWz3k!n2oEeI;M#juAO{UZ*6S|7m_E$)1_Rt(6AkV_;X*pgJU z7w!pveH@c@5Bd4B;HM~GHk0K$nun5L!<kkYZd+C9{3{dI`k}yw3Ue4q(s9U0yVv2J zH_@x+okmD-FF{w}F8N6eTu$YDO$cave7k|@NKJt7X}ys?3}JR`G15l0YHu^A%#UOu zD#?-~j5#*b`iPzZq2o)K-Z_Oe_p8*c0^J<B?-B#?2R3K3UgQXm7H{TN5)kMQuJIH5 zQ625Cr-qz075dLo4RYw%3NUqK-@a4IG*AZNq3w!x8Bo#D1`G|7eS|+Fk<W6ft$RKP zLqBMiY#GY~G8Wli%W+VlpV8}q?=sTHI?Q(p(;5AeGdc?0A<vV?wjQa>o!(N+f{yI{ zhuoK&BM%hJxy9C4$vA+5!iIy;Cvb^54|i`zjuV~xf&A%`KM}Y_2<9VdMmN6#!g5b@ zOy4*nAa?5;_I@JbOunN+uz>7kYilEn&R(;2VLcb3Z`e`2p0x4LsSOHcx4_8$*5=>` zf|UdIX`h3T%Nd<k&b~@OVPHi2c&g3T8eT#1?;-l)EKSdh%`dDZ+ZrWQy#5_wlEf=y zuR+2`P`kjRS0vUmIb=DEnWN)y4~b6(0=dh(OX&L)#-Wf7BnE_z$~>CD-^sMwoyxGP zwvoPoSrUtHp&!GEBfTLoIsG^cv31lNX{D)9Jw?Z*3xrweR6wX#m81)#o24p_(oR*` z+o5V4hLPwE)WvLko$3p9b+1(Cww_a+VHEmXs4gaPduvG5!vNILV5E)H)otZxk-ipP zH9NhX<w1R)H1tt-L%>_;XXR<eXE#J6!iPKBjkJXq3o`FX*Nin?#=cqCl))d9n&8!0 z88QND9Y!?~wPW_h(ph=BFqqltnUoi-m854#?^09HrVWF7UrVjSjK8DVNW16aOiGSR z&*twv>3Nj5v6f5dZ(%Ku#c!)SeTB9jmm|aO#dbbDe*NyymctuuIlMzeFaZDMp50iU zjX>;?$X3~zZl%?4O_Et&5aEw#W^vL-(rpn9X0=FIpw|$yuVdFk-+5ZPOEo6M7T$Ut zfl;9gjj6+qn3jooRK#<tBc4%lUl12`Jb&bd!4jKP<3u!q6g&bFkm%(At>{kR8TLxo z0@y9F7*q?iVC#m4887tz1vDbFH8>)x^>eEttNR0tBddGl^g>U>8s}+uWHo@4h@g%` zlP#oMC5@qL@Jc)yQEQwi3%W;L(4reP=3Mk3wKd&pX?-2N^!bZEC=%a;9(1gS5|17= z)Yv1s3;lo5ix%B>KdC(Sj$>jtQ<N2+G|V)fG=%hS5`C$g^n|Cw#I*rJ6g<4>Fj4hT z5@e*B5Ys$EP}BxF_?0kM&DqLY3CT7{FE)L?v0frt@e@SpO_A_pT%K)B41&@7AvrV^ z@u&AgtjQnhPhbnt$S%vUeqdirfN126t17?8DoeGhWhAl!^Y~Y$v4e=zhxU4IHq)rc zxlTFD^kXgV{G5XM6!|m1Gc=vR8YEln<A;$g9e*~``pcq%LQ~(7-B-~GAjmVULmbvA z$Dm5D+(wgLU9xqm^Vqwmkw<8Vo@Iwq=oe}2&7#cBv}<pHK9|61k{*DbI%WOctO1pM z5P63M5E44R`iuS4adM>mNG-!?+G$YQ(yLFfDx0pplI65#pAb-0k4zeE<=qTawqZ=W zV;qk5WnB3uqXYQ?;J;;Y)OJQ~an!a)ZE<`!GbZu1QF0bWMifJ+Xq!+`%;I=UHqFn= zh%-AfGmf?}m5{A1<i<>qU!yHd0BUW3#4zI6QyFl%ry-^<?3A(h(ia*fP3&FkDO+Nj zBiD9En<ZCPl&v5ze}(=YeL>G#c^1&cYa7}}$Vt$%r>&??3!3<~x8Ogna}1WnIg9f} znHO)*3e^_`cfk+m%n~eXq{~}NbL4%&Ik#l$rQ3~Le>ZNi1lvw-UxV8YeBTAPz3g=w zzl|~c?mGv+HbON9g-6F>kag!oH3kv9@%R&tW!L>*#oo<=y<83ju`y2Mtf~7xQt;Cf z^ExxnM7f>ewVu3j!LMfRHs^Y;p6mJ6T(>IDx_YkHT;RESfjnC7c5Shqym-PJ^$~NH zC%mpt(p<MWNj_EO8Paz30*`B}_2d<M=VoS^licBYuQ|i*YRf+{<n+~(+}hd@-ekB= z!y~=cE9ZT_<xgRCD*yP9ru^fss5vV&yrG|~iKbGmSHAnIv5-f1^E-!Z$?tT1ZqD-2 zmum}|KI@h5UA}JF2(>l;;E=ZbgRWydlR;OmHZs$#SFX5Vc;3tEME<5Br}H<tTFhA) zcAvAeGOSl}Tt6OuHoniySf82n+4#cZnelyQ#rn*m&sW<@%=kXDV|`}R=YQS_D~#(i zH`Zq^eZISUvWo9BFV<%seO{Wj;{NzP3u1j1(C0G`yl^(Y&%#)rh4i_6*pGf4-)FJz z(|R^%i08GD-TiH2!|m1`TCZI-?XpWws*U-3hIHibamm-!(!;BhT^p@cH~RnJuT#77 zw+uOuzs1$bWwzY#y1uSm)~dm`-Er5q>1M}}P5C=qr_JK5@R|Xx6V@u@xAm__6;n54 z8`F1+D!%XrudB&gHE2re_jc)SzMz{9a<ZLnt{v+uN$lyyT6OV~kN>q%_Y~K~!mQL- zAL~!=_~e{EvSNLF{O3bM&gr8t*2k_s*RJX5gWkQdp)5P^gD=nNCo|U1XTCd1&*`Ti z)=zTu!{40Kk0;ho`@bDKb51`Qc0Vr;Zc41WPqpRm9<numx9ecIegL$2I$xw_u_$xa zll`A4zuXc{foSoN9jb|6U;gnVQmkh$7+TaJAJ!`t5KckEJH%!ZUc&-n3YVOGU>Wel zCNMX=y1#1=6L@Lmzx)t7+LFIZPhVkpU8+o<;Vt~=tlE|@OHAenQt0bC&a{>sefL*_ z3)(+TIvAJsR}K2j)&rwxKQ?n2PW#tR9re!1xc0N{_MbH7u6plXwLAY{ej8_j<yi&c zt$kf>){7UdTlBMRbv%Dt{wY_JnUNI^yIrRkTgP|)^{C*&8J0J^ra#?2dsR)|v7L&g zo`1l#i{YkA^9QU|*Ck(E>sEX60Z0>4R(NAy*B924Mp47gCQy731WUJh;d-}gxAo*j zAN^$S$7)CZ3G20M+86$EaQ<o6CUuHV^0&E8=Qp|J^)yd7oC=vfJMi8KudJ1&2gUC) zeOcixec^4-URQEy&X?+7+wQ(?`CDD`>QqL!K1Ig#jpw^AAEq|8ZSUIwID42PXs(~D zgZcbF-+K0U>O|X)zB{Bx0P=;`7_J@GYxzYlJ#$8#YTMSg2@s@vR)2q4B{#0Q{my&U zuC`r$w=if~a?oiC5Ud*X&zrqZsXg@bMgGRv`sv58R}Fsj%VS+?ll97l%^&A>>h4bH z>2urNJ!x#45~@*c03X9lW_W9V*FgZeb<xXJO1MEfz?>3Xr~{12H_Y{K;c!aZF4f^W zMVB_aoy|n9>*w0imrif^*EG)<9>q!pm_2G!c(u{C!}SFtrE6=|d5<p|+oq0(H}!AZ zMxk8S4n5LS)~ai+`Qo}isa?8pay+gkd!*K?3*Xtk`*O919!Sq>+b;dcNZ|)h?^xPm z!j%k>9ACIL0qZu`2T2tkR>xegN_U+S^!-^?c+?EHn(Ga&Ejjo7X0%Xuz2EQpR_T59 z{u1@OKOd|2mv!!Y`-OUc`9tHbO0D--pu#59`^VWolkA_#@*~gakDvIbYYECD`ttqC z0+}&$SVge;Cd-?|I~KRO*0~lNwer#8;90lzh+jpG$7d6>hPvyq?9p^dzccb1Y(A5- z+O<)A5d7#2MUBUIl4y<YQb+40I{_O<@K7K1=eP7maGMc)jl`PI0<(f=U4e<gvx$MS z;Mt@=5p@HX2hS!4z8O5567bghrF_C$qKVhL<uAvz?!P}&wC%y+PObV9k8YD+-5$Rj z{m4i>Vv&(wpYxmU{AS26ntsu?d2fRr^Zs#`?|n%Nf0PuCT--OJ#uln!#cGdgkNiYD zISe(x<U`EE`9zyXP4JkH$wwE>2Pd(8@u-5VNY?K`&i(Fs@oZ11AExIczYf&pw5Vg& zsHtG<#P5P@GxThOr6=0n7i_Of<e=&iQG@HItCGt*qg908yNR5fdJeW!`-9)*5n$ux z#C12j5(0hlH%wRM*LBLY31nT^N7bIU3Mn2f=4_VvucsXU1;fepCD+;Wc<4;dMpuJc z9Xxy{*x{bHnn#J$2X70;>UG)hu|(A#Z0=KZ^ub@()CK17?QrIg?}nEJ+hzXRW&YY_ z{@P{!Zq~Sd+nzs8E9q=C^Y{0LijEq=0tV~UtS?D(<}l5f!!&0O)0{a>bLKG3nZq=D z4p(Ou9i8`fG%CYq8!>+3TQu4=VJzReSij`c7Xh#BwX8aR%vZ8j%Fl~gLa2Ou>P>!( zWi8B@ltmkt1PZT`^jGalMeB@Z8z_Najh(zow`IJ#N|(O=(aCCIR)(?ck5cB*N%udi zv+qf=KSj8tV~eyE`s8BiDNLDQ$1EeX0LYD{^Kc(n(y>7oxQ{UzOH;w&l8%i!<+)4= zi`%zR^P(KZ*l>x7<rIWtCYfVBCXfBy>E+$s64tr%F(Txyk|PQ}Jr#_2!jU9yZaI0D zZ$Hg(2j9g+QYg<@nsp6>ufv*CAUW&}#-*f+w8pMb;3DcyVVAmox=|@x+<RPXPG)kW zxvIcLGW)PfY%;Pr7ZdqRHo!CGB-4wfL|mFHu?>h}x{}@4%(G-nPL#HbNn!s`$<wb@ zvlFF7jB!<mh!s<D=3$BykZ_P9m@+HbyUpZ4Qd}@A*@ei(4yjOyrKs`{VS#|1ekHb| zD)uIoY!+v-S*|+6FZq?2Pbz_M<~k#-cm(#n5viC5M`RjlB_r~Jb(uvwjAhBt3kCws zDvO+NF@iqJ-DZR=RtON~iE02VEi^NpHoebHSLxGLSt5y<X2H|b6?=#Px={uhlTxfZ zTt&_YI+u>Is}~q=_<lMarcYCaPPm`x`-z$Hb5gz10W}9$cO-V#^qpH%Fc+(Nes@iu zQ*)qoM^bmqJ<KHOu|DNvPO+Nb=&qUJ)V##H!`)r;rE_a$#?`#EyQVyQE6{%1x+B@C z`OqxV3QX@$%z~dgqs#88Tb2ugzRNf-mzu%VDMiofwe(PdBcBT8Suw#~nY4SA#;T~A z1y7s4XQ*31-G7R`C#O223t<%9=L=@(B;J#V{QJv#&>8wsM7(!PH!5#d<W^E^>Qw2Z z>hH$tFIg)rA-~S{<9aB8<?A-9CkYFW{vRnF_z%h}`DRvzYEz|?quJtu(0#vlNypR7 z44<(5wyf9#9Cs|~cvh!uA0jC)a{RTV<2juYyh6e+NVukvl9=3tiHN!X8fZ?|u-hEv z(F@pb@`-b1%H*5nPi8Hqm^sSF!Y($4rDM(vNrH_x^Ue%bcV6704<AlMH_r?=C%f8< z)>#Dujc3*rwHeQZ`)(@YJ3R!{7O-0A+E%nxQjZVWgx{=y@@;hhez=&B@qBp5mZCLe zyLNER=b1Hqn}!^xb}>N;F(0w?6Eyau2588EqA=O9W}DQBA<|)9ti!xm4qIf>3t~+b zbT<`hGD3G2F*H_^v{mQYShU-CX0@lm2n~~TXF0ZuB_sH`JN$W~^^nW*{Sk=eyJK@9 zDbCzn!N_75h`XOq9f5*=;A$~N2>T?ln1ELj1&@S_B~h$>xe_QKkR^dk0vY`{PZW=w zsc;c^+$;>5)8IzJ(q_TZroolu{>QAHgyDHrhr|=7g1|zlGVK$xU_w<es97*BU7WKL z-4uqBX?yf_L=v>sNiKTK!g@80*5qjf?X@SK*0V73O@n*Nk@zg#{xtmNjI;$SjI^@F zq+<b_MfcM-8)-9E5~q(@dx#$;|0N@B5+^Y;>PWW-@*%kg$o-g{RwHd{bI}Ro@%NCK zjCw9g?#IclPG?;jp>!w~eO`8Vg~$#;r0IPg1<3o18sj#-@=?oTHO3>MkVdH*<F%9X z)R<H|RKRDi?NFu~lTL^y)SM4KsxcYHQa%)wU=}Y^i!za|b{9c4CJRb{kuFnrWkZ;n z>Wi1CMY({J$LqmrjLnIqfUu8Dvv>(_{T0~@OD!toHGeg{_@UbwmJNRK6Ame;MSjz5 z3L&fEC8kc6=GCGyJ2_7cFPCJ<K`pAV(=yfYaipn5lT5Fv#!Q9{z$?ts3ZTree6FGf zHNN5@cd&Gv3kCZfKkenLDVj`Pso!{fI-W*qHS07lXHW37+XyZup=NJjfbsf(lWP)d z`x!MCe-9*3Kpk}*h~#6iWt<r~2ZLQVX|-Z$x`_Ie;4wd&z-WppO)&3rW2R^Q7pN(2 zbAm^W_n2e6YP8qn+uNn7=3PED#b-`PSL6BIWQH1@VGieu(V6C5S!zm_IU!q(&o;;8 zs?oXT@H|zTXWm6S1?Gf8>n^_<UucdgR!7xn`Sf{S<d=9i1BkKoVIc>Wue^x1m?4_i zt49-HU244MUZXw2y7>0>BdO}qRQagxc%L~cU5!pR`TA^WhWSXQdNk7<o2ABQnWM7R z=xlRXt}4wnAIZ~0e>Be=TcE}ln4=1%^Fs5^Vl}1M`nhx!xfmcQm0>MdtYP__M3L1> zHk^6p1;KTTgDs2Ic(`Rqjdt_BAyw)z$3CgXd(BZR)aX>cF{Da;=GYemBcomvj0}58 zFf#U68lIOmJg*2mV^^y2dFH6s)aU}fAEZj*#jE&e<9Kiq`7uUYb5tFVW}Cy-s#3Q( zcD<l})Mi2bum(XrZ^+5O8}-2V$-u`ptMQrUs3U507GDHXrP=1#Pu2Kbb5yGu&8F;2 zRa#(<ZI><z%~5AG<|Dau6zsgoSSFVt&?<z=Gt@!V2oXSI!B6TSs0=G`qaQbj42bGV zo_K(0`AkzF4Z^A&op6!@iAK%ubCEt;+UaM%wZNOcB8Z|Cnt_TP?3iJM##|(UdySeR znd2Vu^qhTwBqG90vL@gYZ9g4;xDU@2NNTNNgpSJ>O11|c4tBT#Q-U3dfziQ^q`(dA zF#=ZxJCXwz2Rl*%=b2aQM;got?%Ihi9wzrKsrB{Yy>Ihs)4R0RtAiJq-p8Hb)uwN$ zQ{ZdMI{owDu)J;JRHUtOOWn2O`bY=kmUsvyl2*RdTU*{IiBjc{rxJ4Oaz1jCb-8px zDY{$+xj+*8=w<b<qdt-P>?f9VTq*K9RG{VhcXjxNAtKisK!Xt~Mh`%k))7fGLUWM# z#?t*c-DycYKEpgXCEP|$v1}%7sV2Jol@hf#3;7$Ay+aXkj&!o!9@(|XwnRQ;^eveq zd)va-XnYpQ3D#Vehm{cgxR2_irwIJ$eNE`N)H)e>l=nabKajUTzaQ*O3fvs*bO-W+ zoymd0!OoPx0P{h&Jw3StRh8Q;2$}@+v+e&#*a0Fi*KWj`%j22L%-lbivoB0gxo=o= z6XPRE@ey}?Bso5k5+89UONQE$T)iR*roh8e&gUGBns-IQ*;tJZ#r<&liX|QYEOS^> zCOI}O3t#(p+<2G=P4IRqbaAKK^6m~dCtALgqAkWVFh#AL^kZ_0Hi@RxSX7VB(l_ih z6xwKnWYsy!6;D*XB(aG2VWfm3iR`oT=p6S?*;{=J;T&Pxtu_if4<AY_qFqEZLVea+ z7J1>Dvhg+2zGtMdX$d|fq5$<quBP2aE37&rbb$^)cpp-f)n|l6tg-@)P*4Yw*~zmC zd33Ytq0~1sNfRJwO0=LyQUO794K_^Eb{lE)^Nh5KS_evD1DGd3dXp%^25wdpMZ!kf zWZ6HtM+ECq$;|35mMg{B1kS>{Vj9PidYe_?6f5p7mLbL1$<0DJnzjQE4{6Qk6mxeM z)15X`jLqFN+`&quSe8>Px4T$@w1ze|i~ZfSPTAH`tk@}*(Ot|f#l!|J$ZeoF&bdCe zf((UW;PF;q1pf&<>H%35GB6E*%mX{fX;Ei5xg*F4q)7h4B*7f|l*ZgaBP}qIt}`ZD z6@tBz6#08kQYK}jKds&|3Mu2GjOd-SQ{-=X5-^El@hr}XryXYqQl@}1esUM4$lu9H ze#)SPYNV|JX;Q{bnF@06Ns+&^lPV~K3aRn`0RYGPno4dUMgEp2O{I(|v7%X?a$qi| zow?*rPLaPQNpsPpDfS`7(0!-j5i?nu%9<zyA=}qHjj+eJvV62Zprd+O?yW|s8FQ3b zyj&HUK2ue=u{Fk2%BAn?tmouYOOCF#z{Bp2&9AZaH<DMdT+KyuG*y`|`T_~D{aUbN zwo&slxn9-7G~30qrhk52Y{7b6*7v)(6<TY+&P;Dg?X52JL9|l>iROc7rUa7A2Wg&w z+k6nclt8liAZlrfHQ!TvYl`_uhUxB8JG?8#M1>O=p#eaGh?`~hw|q6E;5N+dAeZS) zs~yuWPjPz()s8u3K0;>%I?PAtjKFDhAsyhkZaO37toaC?5$L2RM~0ccLA4Wj>H9bE zo}T@zmU;tq+skUlxWvqZa2%5;ZTpthPDnCGrHT-p;MQ#~vle;qtwLSQs~z)|IhI~1 zebOA8LBOhT@iI>Bm^Qv6=zTs0^7EoP364g2%;KjVV3eG$keX<Y@{$^h>fU;yD15%S z++_5;xM+$wD#P?WErY5N(_VBdPKR;x<`+Mqs~t5Xzs|a?3;YKU_p#^Aonn8#&z|Sn z5wN$Xs4x7kO)xL~PE53D8b;_P9Y_j1CfdebqHUmeqy#c#qV(p_bf?w2=Zl5RmsUG& zK0fj22A12-^SNq$I?wH@Es5p*|E3;(={EJP5bwk!T-Iy7^Tkx){x55S1{m$d{dBE+ zq708fi6~aqgv75)O!~S+U8{HX<gY84@^y)QSOpG{y|axP@s5w~!tc+~UwUNh&EoN6 zuYSun(kd8a4LxgKFmwIye*4?sqSNP@=Zkl6L+zk&M{2m;0|oFrLv2NuHdPn3viZ>8 zJqbL7pJbpkcq%b)iFtjnF3FteR@-VT&PugY9;qM}<l3@M^J>X09*BKfb+Uu%N)2~< zYRk^5<7BE+wPjs){o+AiTLRCTJY9;byY#GV!?9yO4%T^PQ4M1AD&}OhrMB$L@F}~4 zlj=n6q_0fF$urB-+>+lG%ReRg?eX~@$?u5epOO62<d>&;gR4^|@2s6C8Jz+bu=4>> zLG}H@4AKAjB(Hpy-JON*=!snO<G)n?HNQ3osD852)p4`rk~3<=8S7zp@RKt+9XZ=v zd+ZYe<MElaNizkeD|pluKAOlHMZI)0PWnb%jwBzpI8!wL+eGspCYt{>vKGH1Yw;pk zi~Y^p+;7TEsEI5>mlCc2?+e(S?Gvt{>zm_TZZ!@yew@q0FXG6B&8!dhQy0%l^}$B! z^6`sR)RoRJmQPm(zZuwhrKx#uMOR2$17*7?8~E{V25c@Ia7HaW?+mYiyL0%`Ksb2l zOz;%PU3EgkKk715I5Rw!82qG<N>pdx6C_|o3;t4Q@w32va@cj79Ci(p!>()Ou<JW= z*maQ{cJ(*MxZl$#xCOoTMwNRVFM^ov8<krJyf-SZ4*d67nBs!h(v@A?EV<FGO0MIJ zU^jX=2lAM+Z}h6!*Lg`#B|VjNAL%~Q(@9S!J%jX&V0~uM!FlgQKNDK%S&%E`b%6`i zuHeT8hPAc>e0w0qdq&ti$kAjyvOJAtqb@-OwN2aD8}rP5+-A4tCr(#v1`YN+=1@1! zaai-+)71!g^cUGA-Qo$JPO|2wOjoy}l&0xYUaTS3d=I5kjL?_5RBG^avNgXSrFivV zw<Hbq1y3WKy_Djv<=eVcdhoQznm>S2UZX}y(j6Jr{M6~{?g84fPwWYfjmZdYmuvkt zySYN_rI;9lQBOFUWZkR{D3(_r_~8Ml?LcC8vP<)6CaDlS#f8tSMC&GEd2fxGWp(Tc zn$xBzIXgjlOt3FD_@ylRlZ$_HY;todM-L-YX?QVZNNmTrNRpgNpxjpCsC{!QO%+PL zAjgq<dHt3K8H!&vCVQprc0}JY9Y_p}q?H^daWQe}Ty%Mo9-!H(k7%Y)4m_ZEdihv( z5hP=VtVElgxsTr#BQ3}7%ukLuJJM63KJOu}VQxh&7O-1MXrKy!&XjYU)kd11kHJwo zOzTxYYL2gYi~>J$YR;6J>?z~`XC~ThCCd2%U6UFGC>(-tBe;gY(u8bwsW2p1=MP2~ z3n*@B{w4kh#FZ-uY=y-Y(Aw=1nOP^Dtt5nME$Z{kkwj*$Ar-|{HW*d6H<KVh3#Ml_ z@P`E1$W-3mO3nif*g$Dzrg&?LOSqgL&HR|(&jFR<V!o|J1D@H=FSx5j$)ABXJgN11 z+lXvDK2i)cfDSf`U7Ly^FRNe-=4|<d!YG%c=9+HKeW0UKQcd?0)~J~NJ6#RuBI9>s z$w^LmlDTg@D3<K*Nv4s6SaNbtvd35&l_vx4OmPll=!Hhudu}J$lw+p}UJgx0U{?}* zMw~kKpHd(xf4f8WraRRd*@bnnwvVXM?tutkQKKcG)o2N5HCh6qMq49NOy58exUvF3 zjIFjb!B+Uh{dlv#z9nJ$@@rGIB9>oUp_NV&Dzu&{0b8FX;I>9!L-gs7l{jsg-fKnB zg_hBx^S+|Ubd>Dp5Vu-Ke!jNsE3NF4a#HKxq_k;e|2b=(OBh#e8LB#JIG>_PtSvi* z*e-Yj@uzc8*-_%(up_ALDBDg1)t!FcK=g_-PhrUs6&bzaL0>n3?`lb`?>8QT;jD1> zBzl+5R~b;>(6S$NV+XdEtk_Cry`#k6Dd#)g2e;4<8iuS4^P3i$NuoJWu8*ibvP7n< ziHT;atR6yc9m*t>Vy1#L0`SsFo$u&baE=~BJNPProHTXNqP|%2QyoYQjB>aUreq|v z<``;HB4$R~PL&j1IA!++Y12hn3Z*qrI9J|A#w3q5BK;lBbkxLwPE#@^oMw9EH1kU; z0xy%{{i$BG3iRusG}j?Pdj%0YLyXfKLY*Wo764^(e`@+@i3t{NrYcTK+n7iQw%b8k zs_2lQ4I8mD#O&7^ga%3IG(y|>qyYOOKQvJ6nAWt|ViH*e(wi(@Gvi&;_ZBC*U_g3H z6rfG-J7(_Nz##acw;3sT`sA6#lw;qz%EpNIRSNV|QL>6LI+?!ZRQDQhjI*#wnS=+} z<DZdgypbyh3)0Z}61FPRgLNEs&NyOvpQ4eE=>_(WRg5NPM5ICEjoB9Cm~oV*)Q;(D zmP`m|y0M1tPtjqie!mCM^Q00@eGy!fq>o{FzQQd21;?jfLcI2b$QgDnC$t4Wq2YGw z!yM*z5I)1OI%S9NmX>((LNDZ+?P4R7b0FJ-1{ZM&2kKEEs^mii>_Hrh*#%lCIzlw& ze1J4XlBxrszQD@R9tg%#=bONJeBK57B$kJHsmQWIAz&hWyQyjjJQ)64$wxA(My9@% zNe<i?lZ%|}%gMipCXu7^2CVi7fVs~UDZ~L>B?oPlaCLFLpNWj9<Yu23hpsi2-bWuI zSD&UuS=Ct43liV*(>xvBkta|%*0G_Pq>Ra=6+}nn8X}AGXig*y)*5j%&>%>cB8IT4 z%)|my$+?`Cc>)5C2{H(AQmAYKgghhd?o4B;80%>6o_=zFqfkaWdw?u%Il6TB<4^Gb zDvB(YhGT+sGhrDs@~-Njt^;f$;{+>On~)nefdK%i$A6mGxPHX6&jbdf%1<yt8Dh;b zNED%m;cVu|6f5Z`!$eK6eLYA;@Xo~bLf&`MszXd+;gqqGrZgb$6UNq5Vlb?6Mkco( zwfeG5-&Y2;jzF^9zc50j%}@#po8;*VCM)YZu}4hei9!J=6WOJmDd4s&g|d_$foUvt z^%U{g3|Wfwvqr^)C+G18yIb-06d7QRiV0F<={r3|9JVg4oNtYa2~}h13r>;XnwU@p zDql}~1C6EC6hXM+z@a)>>FF@WZ$v+Y;l!<u+oa6Zab~I%ZKg{43o{iOvlw2GH|{>~ zX(n!;&SQ=;LMDxhG{HGRY#@PqWxtgtc8))hf<em7YlmX(7=A{Uq6E&0%#lE+7;~_H zaDda_a>tj)0y06Dmw+xW0bL%O$Z#qDKWv|e7KK~b-58;LummwinMqisOz)euV_LQ8 z;_ceu#|13kTeTCuKnPmcEF|{?;@JIs?Qkv4CGeF9VF_qy4o@<D&+|3c+6iLB@;y~M zLEGIVpzUrF&~~?RtYyu?yiZx*PZAp(TmKd8-^ZLWhq;~LS#uaRFH*H6#~3%v+YSE; zZMQ1vVoyDYLB#Zp9&Wc}Kl6z>&f#`f3%YT?qGQK67;bipY<IO=-hoBygyG@wV7pvs zM+~?;&KTTmcl;vyAzQj#F$RbShIXG2VbHr+XcK#&3qdoDikC*6YfrbM#4qjiLIgw} zi}{}%00~~eO5Gw=2q$t5@wS{Okam>A2$HVnAOa)r`e1Vs_FmbCzy_ur(|QC6yX8h1 zrJF3TK5HU~hCB^6F$*R)?J&Pz7-@rzv|HgR_hstygJ4FI&0ohs$9mt=C`5`g;Vc2q zVRFOe#-0ErSB|P0-p-^9F}ctuJ`c0PMDCX?@w+%|Ya4dQ>?nk(PlF53!VPR1%yAZ* zsQdh!TvPzTRJiP16oD8w9Y{;X!dvsCBWaNYudPY-^pz`pF&-J4G(U@OdUuiaJY4R1 zMjCjYp_V+4CsXSGYaQvkeHflGrZ}=#9Hc}g0gpW!(?V-#D&uqOQK!j>iIra{Q!eAq zg&u7D+C!CL>Tg>x<i9yw>X!_Z))%G;w(OQAq-D_sg#O1(F9Vay1e41IlgsifEow^! zioji%CM0LKE+M;hLjOSPc^Y>4yD%-UyLAcKtuvMWf1m@{PO%#jD;8a`Xua|HJkgu% zEx)5W_4tpejp4&FVPyFR8KK_^S1Df3MCPgMU`x2LJf()h$i-KsKn;Z%nrf&QqeaZJ zv2=k{$yloHkY$8cx=cNcRX(W8Kb&s;D6z=l$vDFd#nq-v$``yV>_=9DnwM#2yhW@) z-H~M$ys748quHv5bEAW$pl$h)!|4@`L@%&Lq*}M67Oi%8S)FH%5qg&=svO%82RJK< zsfJ*)0b6Nngqt{L3dV>Y=2_~6d0hoZu<mxFWa)EIb#34~yw-x3v30jc5=HaEPE?&{ z&huDzdnE~WlAz{$K&MEVoG{0+4!v6=&$#O4QLhJF;)gE7LD3C=oQO(SC>y_Gt00j% zPEoDuHLbC8!&DzJhzC|C!y<DbS5edOaruU@tA)718lku7M}pW~o^yhU9HWzx6u3uz z+<{T@lN`88eo_J#(N5oY1$JjYVx+N2LLbWH&_N!j5OYe^%vLN2ye`p`avLcX=cL?D z%A|8rDoL4oPRawM%snUNW>WmEyp&S-&;&Xvk~1poD3QgOG8U6Cas@77D+Gj>0O2J9 zx2>e-l>~0Dqr*A^l@0XMK;VI9nr|l1)9U=+LYBpr`yHV+*J%XiV#bR9#~!5QBd!>+ zd4H-fM(mTsJ7a#VX2IL&bH>tjq@ph20ULcsf;}{ryNhU2{sw2?Y`Q(RlBCwv_6fIZ zd-{k(F5;Y&11sdXH&3nSG*8Uoazud9AmtpDNz4V4=t5McLx8D|jg$@~28Ke-1-2Sg zmx9_P)&bLZm1uTyg3u8=K{!)ec3QL+-&N-xEXdyf|JxSIIvsrltBVn;YC_p^1VXRV ziFCd}&%4|3AALN*=pwPv9jz^kiiIcRU2DEe?WvvA5<Z<8?(o!3`mDC%Qxg{_yOQbq zPqm}A;&Z8Ynsb%b+DXSue7>Aq?|)en6Xk5;c<kKbgd9(N5!ZnCY02+>E`pnu?`gHG zwxUg1?(|44dCye<t*tm^O-vFic@G$NE4@!gx?9obK6Wed$f-FF7mjwF%hBH50k!oP zB@mO$Mi_}UZH)4YRnr`%O)?JOw)u@1XsnyNRM^xn*JxV|=LgyZW7~7Ez1W5sHPI{9 zm~=HUHQpSCv)qC+99-_UtugzB66Ki>ZO-KgYpBCBf_3SRHAYoL%tdas;M162<ZW(M z(JH%t^H#T5MII)zUHtDV&e&h}we1no0$!SB5zXg|pOY4fpLXPsTEHiEpVmBo!IyGm zOAE!%@R3}gi-SNiB3cM}pHpR@(w+l^Dr=Pp{7xW{ZZPUdea8@nEr;`e)-p>fGe(l) zYbi>f&3(202fxMD+cvhuw+>0j2Y~ZzANf2p_jxtLi-J>Nj{9+fm^M@e$2%BSbQ$q` zhrhb8m#7)(X6_Se1_#gh9Ei(0Hjby%j4V=dwFuTtRWsI017^9EpvpE&1Gc3_&1fJ! z)5OlAX6)2v7RAe)(x>k!HI`E)x}$&^D`K`-gYPwitCLjO5wqYqH8%p^z;OR#n*G$w zeNH2H255d>f#QOv)m*Gq&)9nsG<k7750r88t_RH1F9f{z!5A#Ua}uPS)ixFCJ^S zg$ID-LE8u1mZO49*<gr|xPwy;+#gKmqK9)V!+j5&#TN^a)wv+vig0t1HMWc6IAiIz z5v8%2Ijznzu`4N;za1%?Ngx3OWi3CVA>dMpvNSF=mA`IBS+-3BBm`0sXWBRrA*Pk< zLga;*UGOfMiETvN6sS$AC|CsqD#M~6ktG&=EI9hk#usGDvjUZ3s+io}>`rj97)Z!K z&9B7FAa_i}#xqmiL&%UCSX<;hmP(X%0j2UQGG?cyQd3qm35Q7V;>UfDJcug(ES2c? zGsPwZfK{|rDJG7cl)6Vcmb)c#gQap0DdPr`B5x;aV~#vmlRHp~$X90OlEdz&5)W{F z6~-rOw%Af+++vmzXykc}d(u*at22pU6q+fv8$hjObE6Ak+tJ4rT!hg#U3SKt!r5SH z>yZGeKP3`7gdipZiIBgVhUi{zXRs_u<CSZr0V$xr8KNyd>qw?Kd1Fd$(CF(p7^`M- z(xI!%F$u;!VjRyrvN#r-DX|sAF!{^`KDlY5jabs{9`as-q%&PSWwnxw%}i@11qA~< zv~efe!zgr$AD~VQlcy;vjK_a>7P7W!iw9YR=F~B`y$-BK8FqEV6x-0?Esn+3&eqG$ z);6dh6DwO(y@FR`TUat(-O?(n&JKP-u+R>EX}sYLl6#WhW&C36EU&?udP@fhOZh!R z*-XMqSSC*Iq;}5#x2TtM64k*&%mEAms-5TmN^#3p?V^hUKtlBMO*rV<4xcWg=7)dQ zgOin=e^Ts<lSyz^88C}~qPT9J;TK2R(Or&r3JR;~URi6qY!*d~P?Hqg5Lh6t4L=aq zhVKVYiMQq{@zy*g-kPVxThli1jBwdLo8F)}BH1pq|3J7X5}1N-z1@~s9z@AX!ync~ z5KEl|x#<+dE-%3(g5X|)*v5k#t4J`JAks&IDFpF7k{}2Eo}x(gzqyW~_Qp<@Yd#g` zcORmHEk?}+{h8EGu>5^7CFAOByisxq7PXR#JEJ!ttaTKzgVk_EXLMTw$UWUX6`zQI zj4i0;q~j1XgRBvps}5{X1<pLUPQps_@=x0S5B9}9p2rT|fX?sC5p(1HBlQxjM>%R= zX*)ZABF@gz+H`ff5$aEAsr3X2!7dlqB)by%{6tq0*Ce~#ocwns2QCeEr34H)QgR#9 z)zC!8wKixjJdZ|-heB;;?*EOL16bfkam`r^X#5>>wse*Iu(g2Ggt!<^wsA4M5#nOF z*~Z22vyF?%96G(lrB^RYLKel(>aS$a3(jLJyEFO$i#hHzY}iJkHa?j^ec#ZTAIs~P zb?x{I*%K(+&oY@G5rPPN^_ArwWZiN${83`CK8cqy@<e4*@0&?8w~7A{t0{OmiA}?Z zv-Yk5AD>%0i;mTf=(2|4cpwW9kCpjiK^-9$)FGnZi>Rx|!79-j=207KZ`EElD8jdP z)lTd*vt?gEzPPQ7yC#9Hz{Hr3(ZnuV|7!(q?Yy2{XzfG@W(i#j&x-jEr3dT1Yza+Y zfAvA_#4kk$KI^HScv7|0-u;!yagA?)WN77BGEPZGyD8d)&d|FQ$v7h!r_H&Xed!Dh z+*yyL#(J-QI_9nf%Ec%qr|-h7jGAX;88&Zcx5i;(itM2K$X?$gS|y0@InM0|N0a6C zdlI$kx>N@e169JJCJBpzPbG6l7#4K_9xvGU$FeU=MI*NL)8gkKBGEXt#wf>r|2rx1 zy6CvgkehVlR}1Ro;!@dK>lT-Ir!H8p-Ap%gZ%9WQbabb63-)4i8+CM_g~yIWn|1Vv zbxX32Ms)O3>y{K9ZPn2)ty}u={-;i9?>-sEl@(QQf!LGlg)`a5<K`vILLqKdYOrjl zg=n{#ph_R_nMrDd$NWY-{soVd(5*u>A+w-O5(tSqL`Yl#wpks8U>pMD{Tnq&PH9o1 zu|LRawDEs8=^V8_M@k`-C%U{8&v;%<`Vt@toc%!D?2xKUvTK0%YV^rzY=N%B&f)1e z&0n@RAG5e)QV&g7*Y>L!b?DF7r=C#@)@t6Mb>;Oa_e_PFu~{RmLHEERr|95MNij8} z(VCUW$*3yZXBPin=0F4SJ5jv7uj(RY5#|f8Ju~-JHG_Q)Gu3Kln9^TtPz%xP7xbQv zyJR|!Zq=+v)`58y<geMix|TH%TOFYb84&V#w#eh#1l7ZY*sl>{|Bev*MMCWT!MJAe z>TYD_<I1~C7<|Fwsz3)a9#<JU@ZV>3_xJA`011a(Zc2EUnHm4ZiHFK~!z_406+C5? zC0QJbWjvuWo-)1vrMz6ANVYhc&-kynG7h8GgVIH-Uya@>t)dq?_7-Na(BxT9xe&fs z7V*bP>I>*FpNwKP-)*Kl`m?&*qZ9Mgd@qTx4Rv>_PRUgBeP(*RleD@!-ORV{&QuRV z2M5-JHY_h<-qV(sccmNH?G(t=ulvWeY41=}lKFrfuNN!!JUUftc<jw}a-PC-n`Ab0 zik-PmqZ1!#YFIjP>u$e|{Q1R@gl;^zCKDg&*p_u{vstjj?%;@>tUDMRv6JcGQ%M$z z8{2B9(E<E-nHt+poXKQR|7&eKbFcCC>-z5X!?95XvTZ6@pNasITZ|PNaj)n(GmDp^ z%@iUq=d$3Q1igx5u_cVz9vld(u{X@C^ma~hU`2}TXR#CG$s$WhLOvO|jJ46alRa*` zIw*3M-lmG7ZsHkhETqgXHxn0MbxPszvr2d8sPe)IZs!=5-R}eTQESEub$cqCdlA{{ zcAp)}RJW%CeTC_h^g^|XH!{`OGsr@{*Q7UVY@%2MZkGw1%k_FjR)|t3+3I$vUUxH@ zZf^IQb{DWsGvgWQLU@;i#CIdp?&cY5<WzOr8OAb|t-1|FMR0aj#bR~WREiav1<&x4 zrywYH>OW$`kAXpGU?#_}E7Z-Y6i^TN!~!wX2Av%aTb`-n8!^@KjWB&H=)|a*C_?mS zu;zET-klI#h?Pg5Rz>GYNW^G#hJ<)MHX(YKgpwsRPC{-8-6A2eaYy}xMB#`YK1cuv zqc5T(uaIY40KlpkT+}fCQvCW@UZtxQSKjB%)Otl0S;522DlND+V-5C%@~o`<?fG@F zxI6^olNN4(^WF4NYH+PjF2Apd-LH`AO}g!ml`kuD32j=F2CH?!51Y9Pzg=20U4%T+ zqhER)mz8DnOEH^ft4nB*=DP1M{C)lXe#T$xuYugZtG~ftH@>8}@!j}W`<wdr_V+jO zx#hmUHojJJ|E}@<&HnECtNkthAM`gC(i3gM%SGjHApr;HZ+{cY>1sP(v}XRL#;coH zpPoCTUrkR)(EBNLd5_TfozcT2O<w_Vt<ewjIe)q?dtt}VDp#!Ny6jo!cZKu&r1M+r z{Dz$0#m?_S=XZhg8*qN-I={1>-x<#DJ<jh`=XbL6JIVP?-)Y0)bAD6x?`;(~B&0G) zjCkIKOQI4E_D#4_es#wDmYgsNlWu2J)A?W1{%UVRY>d6*!B2Ddv#n_QylKPU=>8_- zaTDb1_hs$ph1SS?4$8<)ZHzW07xI;vrVR(9`y1!q+Vs)S4mO`$>#82GKiRL-rS3z+ zbfsT{SE*E=a4AhSEzG)vO>x#Gui^K{Mc*dg1>8G1E1h4_EYpK)bJsLpR!k!;zY%}W zrsOih2cz@<(6Uy?>!i`9=KUF2kqGb2XmG;u;5?LK*KcZ$-owPl2I~9<KP{$;Uqd|o zvV_v<Hzc^!>OgD=iPbkwU(%7_H$rOwR)Wb!XuZH4X{u}5xcBJ(JrAb@9^T*BlCr;1 z!_yI5TPzP(#lEK`wF5tLFp^k(cT@6Y1_02R{L79!d#{E$vp!)6twMe73OhT!-kl|c z*z~y!5E!%h^+d{{c_NuD9(#Yezv<lmnvy3u&A0qQ;Mw2U^f@J(n%6kxiMMR-fsg#; zsnlqB(?*E>eXd+qjefy{N0yS%cW@I4TnH1spnjOJ`2=Rgxqtl|SuKGh<`p>~sAJ)- z!NIPCg}WAwR2f-VcQYdYevf7e8SHR{<&x%(+(w!T=f595HCSHG>wC2Na%{veFAk&x zo6jn&#bZ7BbuG`>@CMH&JhZfBWj8+#j`DKX-J{oVbT;$Z>pjpI{3TiCdJKWA5~Lw7 zKe+-q;<hogrmp&ai<c?UI?^$!2xM-cjePS5J;T!ZjDW1jSkkF8(na|+%C~Hxv=oSp zBu8q7<ri@xzpmD_4#+rN2H)~4&>Z;#sr3m1L7IlS<!AQKvyMMb3|{aZsntaVztZe1 zY4&~22r<Lejt9#ShgT><h(rnrtCC-pn-#g3!Zq9JIhCG$c6pGhXUD#8#xc=YkJ>7L z<?MbriJ_+(HH)bJ@?r|mF5*x0138OGRa^V+HbSlB=6Aj93Jk{tB(|bs(pw~ns^Ruz z{S-vH;>zz}%e(kr--P{y4{<$f#o~oLUuM)Emcs4G?yelbx(KjX&m4MW`2<NZ3R0h& z7fMxiEco%@a96Tb@Ot>;q$JK++XSG+kI|I6mwBdQhNKj2GnS4guC{7^oxfr6b^VNI z!))MOTZ%fWk3|c~?4fTtW92zTHd4Ny<kVmE0sX4>JJr#<?w+zn)`vsT(O;nXNL=z; z^S9g2=@8F9na^8h`P-w{+Rf_Odz)}qRKA0<LMBCy%D-k(kSrOIP-Q~G)r|RS89NDm zS66?J^E%60ShW7Z3y?3{7Z(EmYLs)=?xOY8$4(AAFB5J9I2`Ck-{CigHtC9<WWJ?o zCfm(ydLl#UVo6s5P)G;!&u8A>lh|eQid?YW6G-B+rk)=Y#%j7>ILZ5R*pTj~?UtWL z&ZoK_P#l#;r;w-dYtyGZy_W~}3&3R|xGawBn+n10trvI_jF9%lKAUJPdzxtQ2i{|H zjVK^g{K{ztAgjB&^s>Ghp1y%ml3`9|B(t-;tV1`%s1>q_qz!2Zws#rN))}wY;d|jc zFxNAmyy6FoX!%o2->V;%E@N$Z#aU0%^vk?;;98fqdwTw7(FIIW<a@LmH@cRWd)nh+ zwY|Yl<-M!aNV<TO*K!_iP{HE;A-G~!U~o~v{>6l<k4B<*gJGXeSLmH?)Wqp4tl^&p z+tVJpa>?hiQw??wcqlDWM?t$gyHw;=ogj<VN%*-=IIlaQM<^k0E#V(bF7uuzd}Z5R zngd-(Tpqv5fJA%r(;j+k`9xX~eKm`c^14?Zr8&^cDn{YG)|w<|nQkaYScDhpLhtf+ zxhK+o8F#=MjWLbu+?N1hR=oauP92BgICUd+)U%8Cz#n}CXnUgQ`{jtMigV<v5qb!I zgQP{4S^z-^0sDQ@_9uHvMUBv^#<FJe_9v&3axiKvyOjK<qm3IXf}eWO8r%k2gM0C2 z)CPA}Q*Kt%nWixRVA;X7o=HvNy;r^zd7-jtb>oHuhnv<met2NR0n%2G*0}jVxT&=% zav;3Fsp;(gCjMt11(b!swdHHNCH45GWH()ll;&Sv<meQc)k_5?QHVsvA&?zz9;nwo zMZ@ibDTyn*TR^hqw&3>#W?PEt<|R41<v(KdtDAm`rtRMB4q^@NAD1O+KoWg6QL9@O z$fK4gax={~In8#<M_b;PckhRYN2K4l{<0&3=}!RaQ92T2q;_whIi_?-FMF9!DH}Z~ zEaB_s)2~(=p<hWYTkT7%zRppU9wSkLu0Z<U;;cyPcWEjP)sB9WoJr>bqmB!zADc{L zI=KhJ^j;87&dTkDk9;5nAGy+0JU)`MdbdAVx1T|B55D8tcktc2{cSQ!v>){g<9Gf8 zHSVUm|DGltdaS8ystcqvZP=gQk_gp>ZSrY!G|uFJ=RlMx()yarU=RE(=Na@dmwyYo ztEn|8pPB$0)#@dO6H4X%mIObX7`_?0SQbj;;8EjeVWV_?XoFERh?FHCI>iVZp&v6d zOHL=~uy_*@mg=F!@KRB7C48CGI<3Ps7lM=S?oX~wv?gawGD440f-x~=5@%PS8i`~_ zK7mwZ#~`}_p&kC^J<Q!mdFP{Pg9ACO7&TWR5>U*44G6Zr7vBj+ebSqfb7ku7WmqVk zMee?%H~nVYMPf=b9ZE@2o9(r7Au}$J1lP{Ea}7W>w)BhX!?HqJvb)y@?4acvJ@SFF zO)dTQH^uUG15L?!4oJ}%(1L@c(9^w;Bop4$%s<&HY}(the=mE5pG)8S8)NN}xAEXn zHdaf|NNsyk1vMdgg|Fp&4Xc+rF?}EEh|Z@|N8Z`!hhca~>#{dy*^$?;V7Mr-jgiTm zRyTdFcXiHe<QYF*ZIm{2QxKgAW&*zMl<DC}Uv9D#uAaB#-0654>WEJXeDmBotvnm% zDr_*8=^awfSZbc5VhB6x>oT7`>7kXxTii0nrsQH!8vPe2Cq{pd_v%g4T#a}<e*K`s zm&XQu9|}Oz=la+oMuNsq>x`0yp1y@Lj8G?yg|-L2t<yn7AhV~0Q6qEPl4?_ny~AVi z0%@T@dIH2kCSOPX5p<s3<ZnE&ov|7<oB2!MllCW<(aOQ-yi1yrD+t+(#R#4!gWk~c zjTn8<--Z@1|D5^P{be`Ft~amgkZ{#mGHfRBzy^us<`A2lRYr>ZbL3QGQ=K!-M(A<? zhXrkb-OKeLn{H%vp*by*+L~^%&K*PE!(QowOVFSen3|&}<UuLMA7ey9vo#T!-(<gx zNAHb|Cx(JUqh`3!W>Zr~^iMJ~U&Ar}*zuPr6OQ2%P7=>C^ebIW&5bt{$Rx~>=FWj& z3ZsM4YF_3yT44`0j^J+6oGJQG0=y8Trb^Kl<K{i|Q;C1h7!3k|-BZ7&ixydcCj~n) z44WTq9WTQcp3oz&G)Ib)sDk0%T<Nii)B~+i`J`-oH!s-TJf*uq*%>a%&T!jAQi6_C zf{Db#?{Jy49Edo24@E^JeVx7)m?gSaz$f(aqR?NQ3>G?y7#jY`=fFRSSiD96{JrFD zc!CZ6x$>5Bk@v>gB-w+F-mUd0M~~2okXCdKG_qpFUIb=S=fURRBp?~8U2B?J8tWi{ zuVN`*F&~}SuBhTh5&Rj*alf5_YTX~x!ji*Xr_pJBjy`D1-Zk3JCAKd4A9*V4qJj<0 zB#rT=h&V_m?2Q^fgDq|o+NmWjAGlw^Z_FlSg#MYB;z<dYt**99rdDAu5{?wE+1qr; zsNG5`CYjT&K=#Qs_|yE0<VBh`sK#v(E#F^uHLedN?%S{}QvIb~+ll9rx6F^6I6cd6 zQ*+Be&3y)(BagI3SB6>A(Vv7o_3F!%&XQ-##0j-A%aLow#?ORY;UPI)^vkI-+qQ{m zFWUu@MOq3ydm^7W^A}u8HwR9&?Tub8lOz4<r2UPcr}mHrHE=@@;WmA4geob?(z%15 zbKwghj>3__p}N2~YqnPpf}tieEO797^hzoG+P7)XmJY&+2iELea6T>$11OO^7ht1( z1P0w1`PCE1Un2QE-B<4tdD%jZmVR;kGdUo&H?Z=BUnS3Q@Dtrj%8I7C=w1AF>x;Dd zYg%2^@{-LTB;4KSv$VX@QT&{rv1$zz#fD1`xia}3$FFR_Ch?oi?_?-ClW=Y~oUXt( zPOfGDEqi5VqEOULZrNsK=Wl57kyAZc$0SQIlD`2BZ!ufXlB^jjmCa!>)0oOWjz`L~ zUSmH)<8r2Q55ID@Ih9`@#R~cL@++NtA_d=(y&BVba;-mbxwMU-vAcb1&3j@9u*WMo ztUUSX;r5m%r?2P+1=_-8WXYi}l=>yn8~ws_m=M-eHpj*%>;2UpzIR)6OV*;)#h+wW z4<cfIqt@M@Up!kCf7fP1vt~b~&43v)fXJ>}8J8G#&M9O=V!cO?ynjAnET?Rrmdofc zyX7&WT!0i96U3M$qZ12Q(rB9Eh?S(GU554VWaD&G`!D=rZz)=5Sic~c)5`nF!#s=n zog9|T6ucmf1b8~7+g=L-GivG<jpKwYJrOH<E(z(t>M`E%cZ%hOt|QNv%Z_}}_pCrN z&VSfxjCV)yaDC($lvLDK{W<4z8LpPsg#OhY{YqVACs|_msptZLv7X01fop0b6NzdU z;5{h|r+%0g$6Bl8U2`Cf)qnQf`qiIA<!0aX6&gS51VdhPrnl&WN2_W+TX4UO`29zJ zm=n>XHI~1@IQ58Y780^swy_**zrb#vSM?(<42i=$)gRS-hWA+Dhw7`~`wXyD1~`CH zT9?d;xY}K<)gQHt68JwTdVk?FHJ>@qQ>%I-Vaj#|*Lw9Rd)AjUTKzi*1m3H5@belH zuNQvoni>kD<{@cJW2EJGz3GE9#hSYMo4pk23fySUbXyCv&Vx?8>-cwN@T1K9lg8^A zR|P*j*texN<6611(wS8KDUSI$t0Q7zi!(D(yX}417X>bq+E>JyYI)P{we5XB7!0IK zW@dNh&$`Da-KzSQCu00(y!uEe7$#91T#$O!Hh36sRQRUDS*GEmukPI$tTTemt&y8~ zzanR?ReGep^ay<<(7Kpv+?v7>-9v8CRClvg(5Hu9dx&oy%8C%5dGAi^-Y;zfrp7P3 z?u5uVa%0KhT&MX-YiV$Li*$^l%kf88Tly;#Vk9yXgxsyt!>rlJ7sGY;T>c+_c)H?Q z++nHOC~CYh*4Oey_jo6&_ZjaNwOeN8Bx05)Xg$XA_dzL-PCk{(Z_aTw%7gPy?O-Ap z2f1U$<HK?riqDfuVR;4;tM_ubK*fFgnv<mJC7Wv0^p(5~i~Kd8RS&?p`<puAM(88{ zN=d1|D65TAiWJm`Z?<@2^feCs=p6dOjkU(^-_1#tQFARVyzDn>e#bAC@|x|7E};3# zq@5eY!f1rPO%5z&`7Qif!!rIfVf^^<;KyscKIqLnaLh(RF5wvOu4bhiL7~Mn#R&DI zE=w;p&^SH#NJc_nn`&+QOtoSw%2{o>zhAVj`aM{TS2gMFO2iACE&tIozs{O^OK4j< zmydHxb4KWTLb^#KBrd4d@Wi)c5VakZCUqC$wX%FO`QUrGFc-BxrvYPg%K)36#Ruz7 z1_bho!qqY{(VtVgo1Venl|ny0#uGi_wBzTO3R3t6DZJ-R_L~Wj)>D+JlRVtP#(K2A zK%U?xvXi`X@qf~I>UGNMY!LPbUBFvY_t<R4=c%5~XlwqJs(RJ)VHx{VBPZ9gE4Z3^ z(c%1=z9Kfi0qMJhBqr_TT8~k)7KS1S+sW_Awcu+L0UKX64O0IdiLYRbd^^j4mt`+$ zxf-;8?PLzJVRM+b_pv=OXz))M=5@7Vk&e-SY`jO>LBl#%^|6+9Od-Qah(1Aw6i0CM zqt_2*qJO(WkF_;Ah?&v&a+rnR^i$9lUnmfwT%=m42&~F<eslTt?On*)VvEP(<flNE zD!(H3J^U66X}&4CMPyPN9V5zA{gP7&i{X)Xs@0Up7F&5agO8h+MHj^o`Yi^)%C#PV za@2zeECmbNlEHke^}}4&IQm-sFfS`4;Z6Ay{l3tb-E>oA8WbaSei~PY@A=sLa4Y;! zl{T9<d$snh#vegam2NghuIH;X!SEnvOqK2o^q(GlEQ4KhHjBs{;VBBMHL7&IT5puE z3D#XAOw)TvGtH8$!Ng9M?p&-&_XX0;Qra_WAEVlmdv`ttSZ3)?@%f?4@keN+LG9|> zXoP+!?UwFSk2Y{6iV|BdlY??q+SpD1)~znkBvx=?jQtoTzxFZA=;p{nJmJ90C$)Y4 zn=+9p6o_?aj&2TA6ph}8n`3DsCiyJ0v|)OXkEaB_q1Infy6-39qnEh2cACTj<wG?W z+UsX)^hbi#lg@dvb!+0f5w2XdH9C!C=<m@6vwE}IRC99CU>V7#ob@hroJHqb87{4_ zhh6J#?#e4_s{X2I%D(DUbNprmPv3P(d7N@U?`HLSs!pM5PNP)BVRO-~ZKXSft-{Wb zxOi}uZWe4FV({eXjae?UVK0Y?o<)OIhpprslUIj(G9LRxJ~33fQ>G;_(R$FeF6qjm z>V4*veGeAI){F4ScT-eH<PX#>I#7KquKuELvOb-rpY7drOqdBo0_(SR`&YF5T&>r9 zu<fW?uQ{M=TQtndbLbUV{OW)alIswx&vi+e(V6l1g$m+$evRl9aS$PrNN_dw@Mo~N zZW#DoQ~g!_2wQnOFTTCDDb2z0M-tkm9Em<A>womVXgS=cdp^fcgpp1d`_6sSr%zWO z=<B>30kL*7)OtCqVF;YL`AP6Go>PO{TGWp4>BO8(f%La@oyPF#!3?A=8tzEU*`sz; ze`b!z<_IlN%@dQOTLt(DiA4>MO?1Fx;b*Wc^@l~&QEEm;%1R%Rt$41A=~^9Z&Rnul zra!p86hB_3CY@(XUEEoQ2l3JboF`}>|3|+E^T=s{LRx+kn@{t?m263Z9bJJ-YPM^C z#_IDT&tss*GRS#e9Uj5insnK`EMO-VF^7q)4-7Qk<?dE6lE)#v@!V>qn`v3aCge*; z-CM;DMm_{4x>Si-;jP)eU>>Kw!W~h%gfpgsrF7XJ2)6zw+>zCv5V=mCBNXnq&f$)^ zJ={@m4f&MHu0g{0__W!YdcWp(Z}*{UOAz{uvAYK$P({(-br=0Qer`X$-Vf~lBV1j> zt-r?|&|JM!xVn8_AM8B4@Db6e);$&w*<#de0#f0_zq~oN{qY*LACRa;K!<Ry<B`&n zAfab_vS@N_K4ap*Cs^t&4&EEsEe>MkwLH5~`n!t$Y}xI|8g(36^0EjdH`G%V5duCE z^u8kc5sM>uzt`2W(Vq5m<jZ<8b41$OM=*MS6~q4tF3+_5`wFeP8Ot+enKrPEi4G(r z1s(nwlRs~z3tD!u)`IO-$c#5}WlAtg!p4uo#_Jn`;UqP>!Q@jABfW^fO=@(bmQ%*a zO)dn5$MmCQAfYyMhpE(~nYdAtuZ0PDBBxfv_e4%{u&?FRJ$u04=zTeBRR?x#Blux! z@KlxY<GQ|IaL{eJ-xqq~+7wL$4`tSt9#M_8qnpjq4Qfh5%SE-5x{Uwm%-_D_*vW9F zQQBsdcBs>RPXsPCULSu1Wp2n9)*X3^PZvG3E4cdFe&d_DOx?1@#-BN*f%jEHVoNt4 zZN!OV`B9Lq_V6jZ4(v?J_Yrfgj^k%_u62I+Sp)K72M-riH=-K#TbIb25?Y?9hMdNt z(w)Zge*<9i(VaQ<AfTp;XT*%<vcV2My06MckP#9lBDz@UH<EEIv8HQLf8C%_n?aWG z`sjT%UDmwBbwgcwd_CkT*^L*Sc+jsNJ;JAo4wzFseBa?1@}Up<;WNjO51sRlnU5Z! z(%oH)E;6ghS6^t+6Krus9-u_<bQc@D*!G8M2bTAsfUbJKX3hd$V4w}43NJY%mP1tF znz<BFyP}KuF-JGb-bB7m0Pt#;Q8SiQvDnn?06>eKe(4dQP*a-KY4cG}tbd667%u`_ z!|*SC?5H{V$eWZ-FsC&0E;J2}46EHa_41jTi)qgGQW5*WUrMVtWr+xE=v1&IX3nUY zM;)u+I`FaDwQeZ$^F{SnG8X%J2Niyg{4RSq(OiPv@<j@9K3nrWmJYz4905xRT`G%= zh7$6kg9r*xwfurra2ov$!S4DR8w)OC_=1TWXj%}k3lv1#DYv2*prMJB(16vvN48Tf zg~XP6)rj%|42wT*L#{-B$S~g{qbn+wf*AkM_6#_@n9b%k)xpKHwc)JC4toI8kMRb& zuj*X#al&H3j_lnW^IGgg6@8y_)0ceG^_V(kpJkf&d#xp|I`Dv_ugNEM#o=&Z@azC% z=|qsM+WWQ|p+VGQ3xVaQP)uI~#X&;-8A<F_VG%DP9W~X|iZm2AoM_8XlR`Y5RI_)H zd_mI#F{&wE<CRW#_!!<>>d)MRZ0~E0W+xVcB!YF<_M>ubsncZ>X{wdyMv7Xi|9Cw; z&Ho0iWU#?KUm8|_wwvy+<%u<u4_<y3FT454yfpU^cgVWv$hGYl*Z)rt37&BEJzf2& zxGmweR(m}jHuHIS8Tf>g8MU8+Dj-2=jXnbIS1cLj289XHKQRZwCK2yq^2%1b`_}W= zB6xvI)c%Tn#9M;86~?c)W53l^ht^WF{YS^A<GM3Yty8-}uEyjQw6DFE9DPg1GacDH zkYO+w&VXqONdsEYr;X(`g89f5=+x#|ukjwO)oizT(1?8wO{W^ShP9fr<gnIAI$RfR zw*sjts=Y0$+R=^Fw(zOMoG`MFcHZM(!keNMq1LbyM<+TpSk$78YFqUu#(Q17DMFX0 zD8&#xIsXrP?;RG^@%@j_;=Q}5=%S*cqO6JviUt%53f@(*H;mXDYcIqKVs{l#SAqpF z(ZqsLqe)Dnu|#778}^18?AUk3a_wEduXA^<Aj$jf`}6pR&+qwhcn;_8xp&UYoH=u5 z?zAgEM}bl;!ztegs*cU+=Um1UJpJ$6zf9Oob_0p7Z4(-pamB}JT+RAu8ep^c*ZKSM zjXN;xzrc;j8dn;oqxRqRE1zpL&tkI1Kf{+VJxXjXj7OA{sC`d)+3?W}Dop*V-6tQU zWx&^mqd(@GOzY*S6wX1nq<>BFRy~6GKC_4T^+ehorCq@M#aYYWmi@K{s9I|JZMJXl z>wWxuJi(sqn07D$MF}K1rVIYl4WmA$7cSLT*;2>~<@P*mKk7hNYkuW7N^nXwwDu0+ zmF(kk_Vz{%bOVQnexNV1L{vPdNRP}G`ahev4U9>q`d2xehO{fI!yknp+y7~J<*0i! z<cQU4HSj5(7vAAV(E`ke$jobM1W`%^PVe8zl>)IRG1xkgZlaE9COTTq!NkdU7Fo?W zE;?#&Pi1IK^*8kXe;0CR>vzE!C>DfNIV+O`cAFks-}jVa!MwzgTxDn-14v4Xhu{7f z4XjrqZm{A}-AUc(cq~GVqH1W%j|-$)86r7qg;}hyGYlw0>vm$qgE0^z&LuQ9a?O|0 zp^mxe9Q!6)-C%dN<|rnx62P*^*8Ifs14~J*tqS5pN|nX1mi=2CP)jX;E3VB(^WaMH zqLqU>oN$y3g4tT(pPGO2w@BrMX?MRya$?tdtff@FtA}fP)9r~zvp_>R?T^T^2Er*0 z1~Uwg(g>kvY_!KpTn@x*@<{N*i4Qu70^xoL?k9m&iG?c9dw|y!yfxtAavVAWs5~1h z<0sSaOo^LJJ2WOny{M#*nFbb8?tw=%%FzyLLX?DA-XRtYFDPQVq9A%kAA~?dc+I#* z8F9m5Lgxay>t_z8D!w^6%OhqTG^pR)PNN1>j^el6k3JZ23=vzN#v~*1h#15eK5Z{4 z#6FA~;t^skb{k!6q{8ynMoLuEOY;rL$~rt7g@ffW+BTy#qQkZ{J5!*E#QT&&HxH|O z9njrqTS8!VjZyNLUqRlLnJu1wOpO($4EsYx`sg4kIJ+R<gGh7`1d(Q2aN33_j%n#C zAoC#>!DGufFyL;D)?)NNvRFwN=62rCZ{Ub0H<61(+QVbf>$D-k#K&mmBJ@M)(g7R9 z5jS1tvtaP-tL%i(@-};tY!VcK#CjrPYwOzd9%tF3k0}c7Ul7T*{Rnm2=yf<de$u}A zWf(pqg*8T04CJ$UG1$Uk{A%%_nRw6d3BGC{O8CM0=u(J*!lP!te@>aiAlpi`7svs_ z8gkN5WD7)dp(-hfmx~ikhWEisjco!6f3F{8=U;;R|7-AII1XC_1poIybd>o&<7@yY zWYbcdn~`$6hIx7Dqsv1nT>bZOi5FrjmN*>SONAPQycn@#pBI;i^M1(g^wDdG^Ev|S zS@09n1|gP{cmYYL_bey87TLZ<t>ya5VXx4hQkzt}{Ryg!rJW-o%22dw!06~0p*W*; zKF)u(wIOfwuR7X<;Q!37H(o4lC9~t7*2bf&`5*b#qSwXq?Sp(P8D6C1ow7_>$HX$% zO?I~TfkPbtceJD}?4%7P-})_i$RFVRsD8E6L?KQ=wJ~R~?M7HfAFV^Y=9jhf(VcKX z)`XP3x29Vdp`Di_uWRrIKz;K|4ms?|k?g3XjQDCQ@#T6x_1~XID`#`~x95-i>+?Fi z+1O4YIRk0Exl(A{WZst+TtF-wuv%98aQp<X{kBC2_`dzmmA=+6#DC@|5(7TAzDj)P zcf`<}IjM}wj$TJB_icwTxU2Mc6pwcuOnN}o@mk!?_Gj?#JS>!quybf&SnUtN-*tU| zAMxP+@Lc!ny}u79g!}Ds-FKz?RK`Z!^u<l2IXZx+8LV<SpU2=iIp3xjHny2@16^YS z`o+<K@KVorL;F~*WQ7rM{nBkkwQy}3{j93+N)#Jct>r$7!$3A;+lnayWxUnqV}6-m zKXWNmLLV@jxd0cW#7THcsaGfg1BO$hdm}Eoj)mLQ&!QemoM0y5aY0Q^ps#GO<g+!T zXY9^4))kwkw=9H5MT-)YPR+@@FA#<r6V!EUS_ZVbQE>>i)sz@}d#a?Nh>{owWi|k- z;FJ;N9R5_zgj#&}Fd&FQ3aWSBN|`$=mBUCGwWc9bwEs>Bq|6gyC<InV?GHW!;$c04 z)o3xv@G{<03gDC)kA~FE9jWLH9R`%fJQ6<K0UQU2pyO5FSGWk=inTXcu{f}uMeV_7 zQS4q%wdF#nG_m$mckGX(W<O$Q+a9A-b3_0i@je0<M1ZsV?F!A&jzxlRp5oxAk6wXd z*os#AAI{($=1`EwP|69?9g0WTUr;Ly64^J{w$dC6E}}Ahl+50@xY|~M2eCD`*1~i6 z>^Uk_-0*z3osV)(fmMx9q|iKD@cNW%oEfM1KAx+x$Q7Mu|Btk9qoDK|6KV=@X1qNV zsm;!^okvLX5mI(2>JN3ey4uzt5Y>b&m5B4!TIVvV!zeJR7i{G1$|5CxNV0tk5&ssq zL?N&;&4?u1+ak5RY+u0yQMX4a_Jex=yr)M`TZ-a)?a%XqwFTip{Z8<*qw}QbFv{&t z$3Ofd!-vqK<WOTy1M<TywSZ7_vQRd5B_Q(#<doTp;)xFy@L-rhP=*dRH#OWc<2#Z* z=aT>91_S$ovWqq>*;4io(C&dfKaooe$0AlN+nzU%Vqr{{=I(y#*>mnG>D)afhUANt zl3cJIA^F_Zi)Gi~>Pm+BM$>Q+tJz*+J@UDSw8@m#r(xC{%diagF^?3hBZkc*jOXs# zm!}2oj!us7!E!B6q~H+6&KEyo#jf&Xd2F4)mPA_0raW67i<hxvH40m)d40!vvU8bE z+5H{-#%sB?5GHvMucLiEJU!2~lsi9{#F51pn(SJ;l5sA1>FBcQ*X-FEha3OM)`Y9H z!6JJNp0eGB_L&)?UKX2DM0xeaXaeS<g7yA~COsj)R<AUS(lu%??WE|TCY+Dos{64$ z$wT6O(u17NYLvBpb1|I19(`(-Gq!J*df&ca?U8<SHyZ7VzA&qFgpAQl2TKY2CU0fD z1HQ}dmRr2RiPCA;@QnnVHv-caY-Xf`-jA^Q2vxg3hKxdEgPnbo8{iXybI-z4DBN)D z%ujZS+V5gXMJOCuoQ2vz<MNoA#cp&>D&~hViWMt?5rF;`CKNHS@%$lLlzm{q>7+u* z5MEEUQcw@lJ19J_LS2X|?F-z3HMa2cL2qzZ>8|91xfBb*F8K>^%k&>_@YULQxR&YZ z;Rfmqiqz3oF$01qg3vW=_Xd{bk96U2=P^GaCjqg}sIU#8Q%n>?75@9jRF0kcCMGMw z9bXs0V&TmEFq>G{m<tgFa2s>{{wbqnh^0yBP^90-GR~Pa0*N#c9cn?z+$%@T0S1te ze0mv<Yf6WdIzt2as1rt-aE1axQX>3#e|SG8X<2N$H@+7zB66VA`D#dC8Jct2M>DYY z<fmDhzKOc7@qdmSJC8X+aU(+SIF~K4^^smWcGx?v@f-itF&?p_-^4tND67m{`DE(m zeLVes>dGvo2H4Ag65P;YWC1=}A+Gp-amI0rj)*Smg`l4)6lV-Cm_E%HneZ&R0epxC zAEq@-DWMDytM7}j_1zjw&OEo^c!KtrD}qQG_qObdYnBz))&;LF^b`9l<8Z14ZPq$~ z?^5j+P!;_D#tA%Q9-{6zdtqwRA+r$518cQTz=GgmF%p7<Y+|y)@9KAi#9(s5IVD4k zdgP7?I(kLJ61jOuBce-$d}a7848`E1k6DVqv2C5v3yS%TQi3OEP{Qml=&1~bPCsa1 z041R8j!zXlsw1aV($=AH>QQ?qDR0V{k5)s`lvIvT<fakIOAY0hBh-HiL(LV!7}PK< zM;KL~an!5e%koCT*k~OqjMcu^l<cC7hbNW=XX&ZobDnmHd~;kIeHQH21rE<XgnJwt zm(wc+Q9Lhv4|u((UK=WjNxoR91z4BFVEo7CG1Rw<g}N%&Q)sHu&CUr`I9P|=o0`Jj z_C?w~u{gWu1&j@V_C9x?_OJCtb}+JY06GjJm8N94V74FccO@XpC6d;Px?K|Xu@;CD z3F8|AX0(Rpl=XxZ4#CLjc;ecRuDuS>*juW8)>FK<lK`q~2XU<-UlfeT0_ZWE@0SFE zZs{fJ3EF>&`Z?$6*IMPC;G4|(`Sj6C^P|5q=On#V+MlJWXQV`9SUsnNm_2v~Dt62F zwK4((gAIYl#grK)RP}RK7leeDh4CW{bGqeE;8n5(rnTW0o}$%93hSZhsjgtP3uOeJ z467p0HYgLv%A`rub@IiA@Ip%GwHhwzrx{zik(MV&3vz8Jh@9(VZrOhYk@k>YWpoNF z*bNv=DvbS5D1xaNHpLQNw1{}dke-|_PND+Fb_qyn0m0<I+Mp>k=ED!NA#dub)7w8% zMF$~}3vGb}Gc-R&8rs>4ES?jiA?CdW!2HOSEAe0SJNg3mHaf+1$7g{sKy|S{6)m?8 zXR;3cX2c6q!nxW$m(jJD<$%Us*+_dXCB6DclFau*R&r9Z8-^J_%rGJb{ha+MlyhP@ z9?JAl-p6u>d5-iUA34J;q%i0|Ts(+o_u?URB<!~O@2P2$b-_0FC#Bm!n_sZ2i*!ZX zYG{APYFG-Avy0j(qzDJvz<abPhB)nh01n=5e?IK0#cy&TD2x335{Ks6ooaqM#T|Pu z?Jgv>soLgwlAdi%=<OALh6MkP@}tafC+3Bk07FMDw*}xSCI6}Rp+*WiE#)2R&a{`$ zQ6Kc*B-`BZc1Q2eN-eT&f-|A^EKxCByrIo0MS0n-{45M}jkTL}`Q5WZU>h)DWkE&= zS+>oeUeo_KBT_7_k{Kn0D-=By?hwR;638Ge>SsPgDl=UmPFcFHP#h*fR*JkDU`-xK zw1IL2Jt+J8VT?XBnL`t<P@+<U(AqcX>Y|?;OFXpUmxN2?O0WcOZe4N?_90qj0Y0X~ zz@hbZ;fOlDP<G;!1Vx2{Ye`3>N=f)W!#8)SY^juX86ZBcD+aoK@zdFYs@xr?Za`MF z1BMbTSOC!qzim%R*Svpaq&gH0nRrQ|q*kNpH{^g$)oZ5ldgy-=(!(a##Hn6MB)#3+ zsH<<oD?+{xWkgx7hzORY;2R`l^ow^#pVUX2kp=FZFt0Y6vWO${5y;!}2)@K?xBvdh z=n7T~QC7kQXhJ-K(IVSx^sIqc$b}kAYv#hx!jNY}gW!z58XT)~jtJE5Y}t<)>ynt& zE9QU2g8k8{Ubss^y!K$)8@?4&Aas_Mkp>VtQj>9NiXY?%Py_XgtnE<|l=CI9<bA(2 z1&XmZRnFE*P%R`-Q{{t09w5u>1Wpfy44xcoKRgZD!HAEV<~dp<61FE;pz`Nftf1zd z?oTa<cEl6Ix2xceQEp1jL15?DM$Y;jLDQV0WOuI@h|7;UZW->H-O6NU7}8ssQe<Cb zjD0}pUQx*?DGJlPK>pkypL%oDQ2J2ZnN+#yno^I-gu;!PNQG-x?Oa+v%hTqdpR)wN z_?;M9)r)KL&1edhgbMU_Zh_Po)NH$M1QKlBgp@$?oGZAGF!<!DVuH4Duq!p^?{i%U z)#-h%QO;Z35sC(Z9PwUYdjh-6e&11(hUblV3XRAsaxmc@2Do6u#X^J0-;zJ1{Xy`~ zh`cMUT0#k;;H`lePQ}GP+bw;}8!9~BOoE2c3n(bf#%IARt)$ohHVKaBQjXfiYbMOG zp5jKIry~M4+Y;`daP0-NgQQ>zuG|f<RmF&fQoo*Gf&cTvEYmxBr60?vPog^Kd0;7B z2ipv~sf;(n2m;9ReV^HAqG}$x%0@cc!wYR(oKO%YUYM+xI(8aZnPop7_Jn%;(AdTF zrdoz{A~9hoOd1EG_b@-(P5j{Vf7k>}bttHiQgD8jl!9M-B;j@hon2tS8wPznl)AXj zG%(n8umnUuYatAwpuMkw2kc$qXF5DE6*rJ5GH?Sn7)Da9C%2Ds@kGZ5ZKn^;M8z*} z%$S7fqhs*^3<)WGZ)3D*)9Qir_+Pf{%Y6fx)kl9#PdMNSi`)B<mi>5CP{LZ#?qby$ zWf~DVb33(O#YjHh`LHw;oTyZ)5dqW~Szk~^CkNpS1t}G_4ykgtvcf6070tuPoF;Ec z^-igNe%8HI-BCf6xpV7SigCYXPv&e$2~Z<sR7v*P&ck4lHX{<vY*R6yp(e^+D+TK~ z$if&Le&Xm9m=VI~&bDF})Rb8ZQdH!Dj8v2Vpc01hVhKx8wW=Ur-uk(;Ws>gDFXWlJ zpo$HUJ<$6WysvYnf!hDvaaq@(529!fFT7k^do<P`Fldew?Pqn&!fR;Qr2P;;i}-vH z-0r_nAF1W&je13k0;A*TVzM*5eJi**{pOA|cv~;CFt!gwYhb?m&B0h}YkuV)*CZ?a z4qmgA#tP$oR1okn>rt50P-*Ob$kSgAcSe823HOy5tohU^D87bzqHeY?&_`9;Y_)5T z6uvk8bIIwC(5vfh@73k@7zpo-yrD8W&nl6A2;Dk<e%1sWGmByl^ACYeqpKh#_TC$E z;+?6d{s`Sf^F~Vq(Lvj-K_3lT2}8f`@qde@V^;d%%Xbis{Y<JY5u2$afo_DdyP9Xq zmwcC-t*hN;;8g7yZGqpYU*3h)GJW4!x39@-jp+bojD))}B#qfFkr3`oY+K-tFbCe^ ze{z6jAWrSI81Z7O@sC#CN%eCYLE|tKKU%y&W}rk=6{CUZ3MtM56M1NAC|~3c;2x^M zCMa{ZNLn9E-AMef7d*NsHVtYSJq=;Xcq=IH)7WajC4Nx4YUatHFFNsVyV7U37ty&x znFR;VOFx7%Q3}M~X@1{Gz>*43u~V5}wxQI}ouAc&R21faDB{4S^XTx|-xGGHr`Ss= zasZAd!66Cy8HJ!sG7+W!HM=M>rH^sKf8VT3t$uTpcb2pOAAI*9{4uiFLM^uWq(}6x z*I<OJ2{mCY@TqC2=bwE^Qh`!e^z-}=*^h0|Z*Gh+)&PH!nh8fx4^n42ka(rmsBu)M zIPgLSM@HvX`#?FK)Z3wx0PJ;fGF>UoIeH#0Emxo%10M6s97O#;^3VnpC!Dk;+qpv5 zcGnsQe*?GtPp6>|lA%pcYZ&=+a!>Ew?oiCSA}OBGFP<=1(v+Lr(N2apgYUACxlo!d zucKc1!%QfVszWG7?h6G3-TB$BQ0uQmFOaoao#3lJjISz0M!jJAxwG+TL_sW&@xgYX z$@oDEP@3$i1#M>#1LYSEXkwNRd7!5@EJmc0FRASgBWLZKT&*Ww9%5-`o-__+Yb=NM zYkao&QjMAnV~uTQZ!gg5#kFv<?1^pWY;p3y_xPwai)%(-=cD&w!Rk@M-hrY-L$THn zI4|7rv-Lz(<h2X&+CAxqwd@>>&9(sUJUy9SMs7fY-SX&#PWie4jEYRk{#FOOvQ43G z7n(MI#SW-PfXx%>2&go`IrOO-4=mpnO~d%<PyqEGJh3c^YBCB-d8giqsdpGw2z70X zp;MJ!h+bmhRSS&+{qV&c`Dj7CDCCcvdG-ssZ7kZ5sL3v<E#r|wv=++ikFQcP*!qJ6 zDtS;=7%G*3=Zq=?RT$fAYSlWq&;;Eta6afqDI1#7b7W~h^Z&~qk|>OADITJFpy~nE zWl0Y|N$YB_(=%|0b`|XQwIv`)IZTV{h4ojI<A>&TnBF>HP)Ng+Nyr@*z{6lCAiJo8 ziY&`+Wl5(!Cr=c+b75P^kLjDfuvMp6{QlYK)`I&$?+q<B5)PH;ZqEl&&F1a7%>gFy z-n1hTw-T{!6D$(y)s)J5{&&=EXIptP1J&sDbN_(ya^9vHcYJB$0cPLd&#~CYPn~1K zuqhftaj~5+pc&W81>>9kC-iag$V8kF6?N4;4yS56Dg93SuH0BZ4`tjG%e|HEs3X!U z#A45hfY<PcX;yqKa>iDK#_N>_ggYu9<aNUMV`+;m3f~ajEu>x7Z+7y?pKig2L>s@M z5Ruoa;j{o4Bz=j;Bd*KqlsgV_AqliZ(;<9dTw}p2orYDLrt%?(rg#ZK;p}y`uL4r~ z&;F@nGcXn#8~g@SZT_h^`!`aiq&+{Od4bQx#R)OcJBDu^AhfA-_%=1PI$lZZrzw&Q z%lXWiXzx2Buw!fs^cGy=+-CcqALAL@0w>zyq|$<!#i>6~Am(6%lQIBo@K1}Bd*H*p z+Yf3E^w?uRnH2jW_S1>D#jV?Mh!Rew4#)PM>X?;}s1RE=8VBp~_sOg@{>WVcH^Xi8 zXv-+&tXrj#pDB_6EEx@sE!*E7jP1YyXlXbc4I*4~TxWc-&}0=(z068g!ocyN498*( zI|Z-^9$Ce`Apqg*;_1}IQfm6pWYb}OnPycV*)lT!BLArj^Vt(a0X2It`{Ei~*7Lt4 z2@^$h7=nGiyGv)^WCWp492u;1WL4Db{8PV(4Oo&)*~`Kq|ACZIhuD%97ljwm6xma< zT0G32?95uqHXO^jv|ISRNf|26JNZ&@usufXkD}V4WK+XKxf~poj?ejpZ%b{ibSzSv zqqTrlzOa`&_PYljp)LC76p`-*T3$}GC2zoqVG#T>pXTJWmj*cU$nWA@{<ajS0GUZR z0&^SL2W205!SS_TQ4@vyQ)^&RppIIKCW4w3ml(>N1%tmtiiMX^G{Waopd4Elq>bw* zcV_L6Lh<VUh%UYdX~v5d0UOb;ZxL&Bw!BSw>kj8jBS6Nut~4$hM825T-_kHCKJ6He zLnnWipZCWY$|KE-B6lo8tnWRH1pCtp>A$C5w9t-JWBym+W#Q=D8U#B|u8a#Km~NIy z(_N^$(b(B?B8s0Yij4F0*q0YzY*b@G7rq=a4)yN|uaDM|BvR_$w~xf21`;1#N4f+n zy)P*|gxrXbaN5SqSy1f4Z26dP<u$}gyToX$m|StH(OGF(gR$2MbEi4=W1kPCxxg^Y z3E~|22xlyy|GGJz$Cnu|TlT~W<r?6-6KIU}%aXC~FdueRAq9OE@n8q=<>>hSK%CJ9 z49_^HSy;Y}_Qn6im@<gIUUvFY$(%66D){e?d>q%D9`}h8)`1w}n!3dKEyR_Fzl`?E zTOT!<9>s4Ou<?i;{3hmJcyE-UC+5-)TF%2&(g~VAmNS;umgATUQ~E21>C47~vgUw< zQv>VveBc{eL56RlI2Xf-pqf`jY`*ufc-mk&j!#eHr0~cC796mS4V8$^lRT=2KYBKi zQ3&jZxAkgp_4Q)Ay}?wW0on1hoWMk=SBm98CXQmB_XZwK#PngrV-%Jjg3yOX@f|j2 zb>a=OAK*QgiVTHivm5ez`y~C-d6a(8zYk5o<<rM}gN$QWoW+W25*!<7M%AK0jYDAL z7?y}K+4?;BI=p&pUCaX4u{_7E@CSHfSH_kr+D&VJ_-G4W$)8%I(3qWk9g&6uPWjej zMPG`uw9cTO3`uFv>tMus?j$YGv)=oWWr#Lbh}n(~4P>GhL!CJ4r3qH*e!-CU>0@X^ zH|Ab=97<}iqHKZPSoT|V;n(aYkh#DfbwP@n=MW$0v3oOpOmT?eNqC<C8?!UXlC9Sf zPVro2QjIR7;Iz4kuOMadDAuQn^ovr7c6=~GE9XmKuP#a{7?u=*ZL(OIV|2zzt@tc7 zzV3kXk8OnGHKyq8#q`1a<_LS7Fh+ee?Ks26ovtoZ%K9c}mq)4)MbV*t`@e{I6z4`J z6pY3Yam0B~$Bz(<S0Wa-@Cc<pPz{%4?3Pp<M~v5wOb5$j{bqQX*!po}lxF`n{WRo% z@xI+Z6L}FvNMFD4w!mrbM$@cs`Utu4pt!IB)e@<U56nku$#DnRn|phEf|eJ(2Wsoj zSem>Ui#PI|zauj;|AdJi&dyIq*s>$6(+NYb_^zGT2{fr5Dc2mLQe5JMB5@(bTrvg! z6nx|Ej)1Y)*wX&4;c}_ur~?{)o)5L^+~9YSV(k4V`ZjVfG7v(xi6Ip00+bC6j(mZ# z-A2#pXVLkYu}u|M^BnI0C~K4rhRC9u;fAHFQ*2Y`sC_PRy<OtkyI>#yGw^u85Em3f z7U_W(4PW}Mlry?xq;9o6Mb4x4VM_i@?3gz=3HOwjT<R6dz&<6PBEYDXP7<~qG<t)* zqqjA11aRpd&XM%e=7BWRCmLMH_xM}Kwx%H`h<DCjpP>l1%Z*AAkgznnBuwvz;knC^ zmmq^$9uH{M`}tXoOx-Me)eA$3<ssUDeISZ+d7;!#4E@K3OnZY)&{N7D!qHrVLGdp3 zf~6J^U_FHa0J!^VydI!d5L+#NHUAdt294z@US5{lz0uZxoHxDIfMDd5s9p3#L3ziG zRLs|HMr_A7aTDL@ckHI|_mrp?1uSjZ)IgdtWR^2L9bPGE_of}CX=$1%fSY|cMvNWy zBJEyWi{fe5@}EJ8UlKf&t`v?eo`>6EaT8xy_C?(*2sJy!PJ9tQb!#<9B>!r$VF62u z1!J(U((d3xJT4wQmi&k8Q{V8o@bwL_4`Yljw&N2^3Ldki-Om5FB_L-s+4dY|Eoj*n zUdCeMf_$^muH_V!ne3aze+MWN2{{r=?Tg)h)ixI8<%8n%vv$G@2ifl_QpMwGIQb-N z>a^?1H2ovXxs*FD(+)D`OoRAM&tXMJORRpkx5()I9!|@|9-&bNOIH`=lN8~7Ahupy zVu_=8H?ow(kAT0h7@c`NvXp%9SJm~VzRw`xIo=>1z<YnGl%3_0*Tb}%mWTNtq-9#h zx!~|FOIO!Y7ozq!U~xrP=ZNK4PqC1!xZbq;bY5l3b<t9nVxh$qX%=@i4tsk#&LwjP zT*3_A-%{KGJbqjUjMC(fJ~+!U9N$sIHMVLcYv^}`{8(LVg|{X$BtKYs5Y*I$CYT#g zwZ{5p8g-HATAPZ|Po)|0)^E-i4J9tZPrRLnXvRihV%!^V!!*7Q^QV45u!VZ$gO#o= z_Uzz8eCX6+mqJmJg$@(dU|iD3opO*hI!V-bp?*LxcmlOqiimJUge#R=3PrfrPno61 zo@ja$ZY~7Lful7Jv^daB5^BGR<$+kbNR6By7+3^Q{a+(Sq;WL3jCL|}np*#IKS@$4 ziSLuflloy2!z(D!XU5G#oF9B2WDBZsmTfftS(P0GtSSU<!OtvPFZ@FmW@+uu(B7zl z^Z5G&4SXSEK^`@b#2UP8g3_07gi>PbS-+uCDtk&=#60_}1-%H7*K_mG2R)(;Asa#P zuJ(SZE7B0P*9Xna9<;Apg7CDxQ;D%ci0%&`LhGppll5ch2;sx5e)bqVl^AiZ4n>C% z<hMwDY+<sE$GAd&Z>sMF>iN)w4C3pL<JHki%`Erc-{L#Onmtkb9W*JJ(`?K1Gkzfn zq;{HHR9>|eKgM%Ikvmylc+s4cqqPruB^axi`d7p_|JP%}Q=1|zSwb62y1mUDi+%$o zfHc(*r*$<9Zx1~TR?c$w&MZRxA-!e~;>HFdi+*fPL`;K2E<i^m0chUrYE&Y&-dDOw zQxE0vN7<1n@8gJ^%9l=aSAJtR6V`9~DMe*39a`PtV|{`VH7+_R=E7e_Dj|Al2|7<X zLpqGGDy4X+fGy~+(|JmEi+w+sfeTs-7=kS#=$OR7s-d_Dw}FA!jyW8aG<cRqu{$K{ z{jx=LZ(*y-G8|A>QW&VR<DG1nenSd1a6QRy)B6-v+8mW3t9X)9^)MR}j*lN<+WA!Y z5^E2P^rmK8uM#Evt+HH^#$SDqk20_(nz;M(8CHy|wt5F~BJ1?g18P7JlcTjVY&~kP zfh_VL?HidUO&JDT*HK8M)h@}CbP!vQtnD^3LB1*)6x^=#>Co`DcpG|09r?^+DDr(6 z7G?PK*nS5z>s`mv>m_v)l<4(;YAG?$hINV33!i#SsgY`1jLqQpDKZNdi3C_=rL=SS zhY)-375CzrW+^wRgyO<IszFgbEa`aLNzE+9{jnz1JV~g^!dt<;W8SIjSXz8SAA#U0 z$!D(vg0+}ECC6=}pqrfb7r^ZeV$*Hi=w|aQTL)0ZOtLCvoUwnG<szr2IX%JY5l#<q zx|h>rPPcQqh0~3kuH$qqr)xM}$?0NF7jl}&={!!q=5!XP(VUt&oy2K4rz1HH<8&~m z{W%Tgv?r%sISt`7nA0|#w%{~~QzNGVoYv#ik5eB`y*c&d)Pqw4r*51&ary?8g}%@8 zf>W8(8=Pivn$GD7PLFVUfYZI4CUd%u)3pj!&l6qV2A(9x_g-L4!c0+ND*XXe9%cLn z-6vy9jHeY3MsONa!*iX%uu$t90^VOqjd5<uT{O{Hx(#1sSaF&TQo-;|Rz{BT2m5%% zKST}rK-9b(qE?(x#JFW;DCt>FQnNDNw+GAVHtwmgJQ(?jW$(w+C_e6{kOdm+Q_f2z z9-SeF<XeZJRiJIksBHylaty;{bZ$x%22KVl{TUa8oRl;3$`DR7k`ZrDcWiA^K^BhV zpe~BjigYE-_z+iC20is7J>}++brx?JcO6$y5^=apXp@Deh|^m}g5(UqD>@%9SWcpH z<S(mIl42)n`N6j>4}m;P1uEyl#w6paYq;0BLvSKSEDdx88qjT~r8+^lra5XC?458% zKC@2HXMgAq&c}WpE0zBW5@_oS_0W3$fUO&meDIC2&KUKGdL>5cVx1P8XoX0Piu6lH zXC)$|BZxDNc;OwA^1YYxjmBd6MKT(E`V-pz1<ew5r4S!MR;BH@XWu(OdBXW7usCa_ z<Iib0AjxH($=YrE%dCTH7ZZLe%g}V835lc8fh?l`UxI~=7MfO0oM)0jM*`K~ln3=U zUDJJ{bf2gSE<evx!Yo|#p$z&>&-^bkG<eR;k#*<tRSN!pgXB^6@s<DfOy0db4g5z9 z%+9l)|EQb)Ki!y_kT2}rhraE9$$myRdl;4eFJW>%Lp=aO+7(icsPcm@{x`sDES<UZ z55z1u%Z*slz;Ysuo8?5BYRidOz{gaib5(L8rh;fXNI{yZBg8Vf_lO00j1a3^-y;nO z5@Oqof+au+u{lOTdYL0E#Sz=Z7$Hp=x^XNEN_rxsWvK>^<v}X|D{}MztpuzLtisU~ z)C)*M6g0x;4Xh5Nj@K7JA0Vw9sR^tFq(QGbz`DSCK!0EZAiaDB0wtgk*a+AJ7zAtv zYz}M*Yz=G!YzGVmehKUd>;&ur>;~)s>;>!tGy(eo2LcBJhXTI>jsT7Vh6Bd}#{(w; zrvg<VU6XDo-;_Vf59NW<ULQzlru3?5rJ)8jovm<9>1+#Z52Unq0IKN?!8N71Gmz5V z6-a6C4y5$=<VgAG4Wzsfh5{*1gnfaOH^TlL2Y?b%eg|=+d=n1gNIFn)7_JG!IFfEu z9FA*3(v^xMajhchk8pGj9D{2WNw+yM0>4!xovRp$>zp_azjGp$jfxX+of9YGcW$I| z%!!lnJ10)T@7ze`uHtX`7n!yJcLR?BF95AT8Tb-N!nAlkxxl}-b4S1@9cX|mY*{y- zii{lry#Txk3|v3oG#=On*cjLW*csRy*aH{}8~_{&903dms`CCDmE9RTTOKQ>Dl+yO z6*dr+bU6&TYIVlW!-)T=$=K%FcuPVBYy~6EkQiIr1bi6pQ&g}CFxDn8&Q37KjeTHG zFsLvX$#E2RA_`^~6xDSmY;G<V@_ozL<0Qsr{LI)-8)0+17&~|fJ2uWTw)8su#6##h zi?MZuHS9n+4Lgh3pxcc!tRTJ?*>Q-59iO6M@e4F;-LD!Jn5tpzuW8uZcN*5GtOJ`D z=)ivI<G_wZIj|BxJFr!!9N5yg4$PxkJ{F3xr3rKLv88+Su~%>Nv0e2AR(_(uy6h6z zVx7pmLqyhUmB<>r7Fo;AT9&+7%bvLDSObfWJ$|iYlOr5i<7bZSw<-BqU3~%8bxi@b zpjAN@`K%zDzt)MFzbeG6{)Jg&Q9Zl$T+d$Lab{6>i?E(=i?ZS6T-f^H;;ia|672rn zlB{C4QaDzmG&?@VjotGo$BsU5XHU<RXId1%mRFV7#Q;y%7X{D}1#scq7pxgCfTg$V zvGXkh*rF>EyYovE=7a(mi2~R<KA7!o+=;CY>CXP#(1*qLw--PF3Sd*hI93w{aJtJ( zRtg1h<<7TkGzws5%+IVH3Sc-DfCBTR*1Kvq>OO0p^svT`=?#m|mtO9#H74!H`O@yM zE){4L7%v6xUh>Vl^mxg7r`?`5;}fJK+VMX%a!-`jMt*f}`=LZ>R@Z}r?oC`EeK)u7 zt9-S-k-9mqI8#&pMrxYe>CUekzLolpv|ays@<Qp+4)40Ac8jDPZ)f@zsQjH2vSo|o zRpEQdYAlvnA@h4_z?pW=`g4n=FK=WVx^--cG(6z$qI*Y{N(+h}Y%nBknN(%Mf{fr% zNz$|@;U`AEO_Hj(*1uJM&T^?$*~n{WEB+wW42eqrYUdA<rOIyqs=Zf8d;D8nt($M9 zboImo_r1Tal;SRLI`FpFDygCVr@-PaKT1~yc}@;E@uT#8$z@-xj$bV$Hr}vlc8@hu z@Xz<^l&kiWbkG0ty6-eUOM{oDXd7JlS=wA@ZIOVzzeq0*H(Y;l-CD_ajqPHuRliDO z4(#6K@WXFXnDdi`&Z~cy+BNUDXi)cc(izdS<=&g?q#~7XEZrNiUfOzOU&VO^{*cVo ztn1sa{6kuJWcJkRO*Tm5$E>N^>GlR`T8g~)@w|;vF>95Ky2ee?qoWVL>+p1wG`{M) zUq`RoEH$jVXZ*2Ie@fr{8SV0&{}yRd?T1~R9JflI;a@!Mb!n?~r~dE>2e<wuv7Il% zVwY@_w(3uZT${CBiuAg3tnj2AQuijQOFKsHlty*CpZs*fE~)$D8x5B>NtR{^%XZc~ zmMp#6Jo2lNy;7tZtwt>gdzd0EjX(aN)9l^S!=#seI(zPsYMU#zUvzkn<mlxyuXXrd z2}cx+`M$zFDd1(5vs=#YlWwmqUiHkp{nDW2Kg_DwAyqP7EVDDc<N@jJzT~deZXS?+ zO4{*f$E^pYZ&$1;{dM9YY2=%c>zyMHOVOqB{pxNyBJJHD82s|fqtdjat27yHj!8}r zmh^IMe_YzIWa-K$-X|p27uOt)Z9XAgDr2h9u<1$ZVda74!qQJlTdqX)F^@bY%{{&5 z$CZWBq-WZ1U4?aNQmGc(TORImTB<yAL@Q76jCAL#Z#J~raz^UCck_mRqs~gZd?Vd{ z^!ZydIwy>5_Uv!zX_cmrChSg^f|^zTW8#8y(wzevmrfsXUh3cZS;FDq3(}GD)x#3~ zFG@uM*EyH1dP!=qVoL1l3YVoqM?y=Dt9V6PZu)ZR&=MI^)h7YgsAU<_4{77(RIh$j zsvL4AV$QCs(zYVs96Q$eniTTgM0eN6*QE3ARXZ$5ye@U?_;Bm!1~;S;t6q3rzI{WQ z-z4q1_Pd*sq1n_z<-WWnr6;95?c{u0vc!bmxpw-t)W&iD)mO``QkkdGOV5n5N%^g9 zcdl)9NAkXS>fpAjnbNyi?oEwF?@9#=PEH=LxhFlDaMSkFi+j@aK&NFcFYZhBdM|Uj zPHMyLwWOlob=(iEe{Z*s6g{t(_A34$+kWRM`raVjQv5=;9hX$}zLEQfjZ$%L&vyN9 z;(lVYG?Cl2y&V3O8Y%uF+rFPG<*`MQ6~D1ns><!$rj*NHQU}F<Y?I#Zu-p4#rF^za zeHA~FZTEpnIql^BB-{RfP|7Qr`<3i^kffAbisYsEmlSCxuMhU}+b#JierC5M^Lk+~ z$34<+#oz3ew7h<dQp$5L_dD73#9b-Z{oMa#*OysJ`KEF|lwEJ!lyW{OJy877q4)Kt zx>DYUrHzVT%C1L_O1U59{^_U`&FhoB{Eu-zm0hpw{{Mt@TJcxe^~>H4pnfTS>y)&W z*RuvndvJ>TuQcg7uWyHycHy)%UGZb5rAoZs%~aZlGtv{qpJmrSdpmKK`?bHNM!X*O zQQC`iX|m$q&Ph#qecYzB8|Njf;^)pweR;jSsk9##q%DfS%dVfnN;`5%>ZbU;%Ti%p zPwnl=74H8sq-wmr+S`>3>9yhqv+HeZrG2?3Emr(tcKw~Dv@_QwKgBO**W(POy}2RP zQvBmhDW2EoK&9Qe#r<S<y<V)eKewfZiodkJuiqV%cF4y4rcElq>-kWnJ-WmFXQq_J z>-%%1UAimnQ~c;X=`pYOqm}mQKKG{&a@BuX8rAFR(z{r+5mNM<*5@>`bliGP-0vVu z#ecbY^pAY9G_Ydyie-W<6>vL0<7-ity7sveIbJJE>;Fs~J5VP}Q4d~C@8~E?%}y3w zV$3f~Q>$FsTfKlR?b_b`Rq2AVl+@$vKu0H8I&y6EoTs2qGYa3kR!El4_cV1oQCOCm z7aEqfLoZ83c6j&r#aWiz>aLa-7Llb+%`PO&C@M>vHXRHKFD6TkgU96S>mo~qucjYw zUtE@I*LwX^U<p~uC~{$bwUV+F)MEV1Qm(SJZ28&Qx>B+v*&cuY6m-I!lYd<=ElV3m zj=Fuaj4btPo>o5DO_uKazZmjcSy_5e?CP$?<z(qm(wvI1?y{7)R<mHdL6)XDG;kSQ zUY5QZ-e7s>3bIssd%l3C6_Kt#6K~Y=kfrC<9(-4!k}Tc0S*%Zy%1GDxe7>xTERF28 z%lQFlv0s|MyW|PIjb8Hdh?guyOh|FqUR9RN^EQ_HrJ5|6%#jVh^OmKaB?^wRRENIG zja)yjhAiD0usUnd7qV1m%laN&d}OJ@wYmG6`N~q2b&Uh-)Rd)@_Ydu^R15hT>eacp zAIeYe{amOmOMkWr`|$~=)aJ{6H|jv&+ltgUU00TT2mhkoTThl+mNVSj;4e$>eja&s zMSWRna$(8!ga)$YI%&=0r~p}--F<$M@IaJnlWu|i8_Lo;K@%Aw$<pSbmYqRHv=>bt z7pvV!mQHt<A}ckPrI@M1t;L(j(&#DE25Ez2Nmpt7lV_k?jh*M-ZYoPo%SzQtZ-z4} z3hljrpt&rick8@iYYSP5?{G5a=a$gx?%D&tZzW5f6QV=DZY@h+H`^IJxs5Che|o+9 z@U}=t$g|OX+M(QQK3f>v9{TTj<4B`m<S!|uaIFrqwEM`M-X34dQu6O@wioXxOMOee zsiF&!rHdz*EPnwy^4FSPcRI<^uyNaVUg#`Kl{Ef+k9LtIhZ1Xx?dmE^;W5S2)^$TU zmK~e)Lw8v!`rEOIi9KYghhP{mqbKzGU}(>Ay<|z#aGhyrZ^XA#4)56q_GGO7O}kKp zn?G=$(IiVHrY~`*)feS=<y6~B{bcFpc-`uf{jmtjJ)m%b0kGd?qoUq`PCvLt`(U6f zxrAN&_Ua&6`mVEk-P40*seRYb8~caI(j?=L%eD@cr7@Qu4qiJ<mKJD&jLX7gsqOeB zmEylb`if_{#tfIG!7GQ99ydakE<d~EHEg6TIbZDAy!R+sT2=A(=nkW0sl$@VYlFtf zQkrY|Cw0SR>Dho&EvrSyQbI`lujR%<&l^qdMI&KHof<6@$Duwr)~x;#)PJ$x!Mo#S zY3$XOV=^Yd{??4Hc6y>Ltw{d;Vd^Bvd8OIEZ8G#yW$2pUr^wQP61Igarpl7{!l~bW zYnCOS$u(BSPLri;3!d$qI$f6b{gHlqOccsx<(YDWqh;yK2KW2*jFF}KEh_#QJVTZa zd>`T3bSCUYduyiuELl3+EkdkeK|LJcF~7oWS-SW7an+Ksu=Be&P8Iwb<(~h=EEb1+ zRH)JRDQI&3S?+h{AilX;c4e+CRh;qj{j_<qv}H$l=7IU}3%Y^NcErn)t@c#?h6JRu zR7#ySiLz8E$~$by0@!oY-M`0w1ApZcrJ40D%CY1~)8vJ+)a{Vv_~=Elbf?V8)`P#3 zrN~Ro&i48q>CDI+-f=O0KTj^+atZw2<Nb#kE|sNiKfa6eTP92SuMh51HA$BGP0&h) z<+60NVY+vTAK)(>u6R1FfIt1VOf83%@LR{{w0;3<o8&+G{wmn}Xt&ijeuV#<UhmHN z)u<0s<}^6DMwUwXyMLehlPq<N$#mTLGs?C0ljx1V$kO66_4U83h5iccT)q5Pl-C(^ zyM@0&zwM&(&HWwuXt95P%sN?`v7pt$N$X+f`HPGj^M@>LA6t6h&<*ed>jw2TZImUw z<z-mcO|YxeCt})fmZd)Z@2_q4C(==<<F&vovea&QR;AioWvRuJCz0NNLI3A!rB~c0 zOOq?^XjW!B>dBAu_Y~bBOATuO(XPNwS(>xL-KyCoOUL$}pZgLtChSJjhsp5o!vhQ0 zQc#XdZe7gSjrwyeV@LWPSqeVw{p*Rnvh;TP;hzueLq31ou{n9aEY+wgoZONsOXCkM zd%5m_ELH6{-{+@;@K*=UMJzuA|8sQw!9|Br|C*1k7Jmf43+(-V_EA|{dS^uGsAKTo z+s3Y*cwCn9eR-~N_zAQN(-+<iJ1I+l88)pPa0+&&@fp@T4SIT&-`M3e{K4fW6@$;n zQqAd?U0R-%rKa1?yEOh=mhSfQuh<}6maa5>E%}{;U#?kxSoQO=bf)mym6b1`ey?79 z*Zra_$tNE-E_Dg^)bEegMK8k-d~vR{(-m0?EHq@Xm?2BwoapPF1^TpI>Y*1`;SYO# z8~Ny(Ed6jYt>)e9XlKlm-`u<beMt*WU%3f8xlv}@xm&1rO^U8dyA3~FYy5_zR$1C_ z>98-=274{D_-4u-S(>u5o6Gi0ly8gJ4x8`FlKWiWCF|~?yau;@{_}m*zn`x3S@i(+ z>Sa5-OopG?F|_A*50SqH1LVX<YX2YhI{sYz+{dU-XH)ll_w=Du{7>Hk@3fDl*wJw> zfAD-F^}Z`RPV4bhI@)0Bz@<sgq;<y!|Ly$pxfC!waMim3FQs48x-VL0eI<FNw9_@5 z{zht2%=va*zjwT!!HjnK%xIUdG1}$lGuq_~M!S5`XqT@w+U4tvfr|Y6M!Wn1M!S3` zV~`@hu+jb=<ILqd8+R$`FT&*)<MLgMy_ED9=kiM!*DL8SX|$)m6qjGxSXD{Co6(;B za$LTF%QtZO<+=QdT)qdFUx~}F%;i_%^1ZnHs$9M|mtTX+_c8WW^zUO#QPS_r<<~OK zR`l;@?4zW=HkV(=_`8z+y2gfze*C%o`bJMB{Q<_Nihde$`9?0^$mKWU@|$q^L0o=Q zF25O<-<->D$>q1=^4oCv?YR74E<c#d@4)4E<nlwf{7zhcXD+`Bm*0)c@6P4-<nnuS z`Jr5XD3@>I^80c5{ki-BT>d~Ve-M{Hgv%ew<%e<k!@2yC#sP}{M;do3`X9yRk1@t6 z`VTkuRP-Og<&QOPQ1l;Ztgq;QJeQANfujFOMx&ztDO|pp%QtiR)42R7E<c*fkKyuX zaQQR2d<&O9o6G;2%b&yL&*SpvaryJP`~)sPk;`Ae<$uHFf6K$O&jy;$4Gy0f@_lX) zJ~N1)8?>Jpbe|g>KR4w6%uwKSL&47sPM;eJeP$^9xk3M#!TA%R$frWlPlRHh2ri!r z#Xk{Bd?J+mL~#97DD{a@`V*ndCxY9jLfKD*a-Rt9p9qGJLHUnBg^xhRkATNVpwdU6 z@<*V`$H4O=;Pnxx`Vpx15%B&9RR0Ln_y~OQG4RO+zPX@gE~u3Y{Bl9<Tu>($)XfF; za)Ey?sGkcO<br@)5SSYp<^m}f7&$cJ(3nFL4nZ86a%je(IfoV;T5@Q`p*4p#9NKbd z$DuukU_b}Jmw=9d5I`qDXFwM~S3oyFcR&w7Pe3m~Z$KYFXsF55w{O3G{re9XFmT|Y zL4yYm9x`O;&|$;E!oK=y`0x=UMvfXiCOl$n<hbz@CQh0>CF|YWH?Lp4eDVC*(<hG~ zJ(M3jxPSlNy}NfaGw<B7*{s&vw{P9LdGp4N>({ScyLvSv;|kz1;1b{>-~!-0;2a<w z@HgNr;0)k2APsN|a1w9=aGb+24o5j0;c%G4Ar1#Q9N>`3VLyj`9QJb9qrz?uDIAhH z?8*f@bHR>Wuss)S%LRYsf~~n=OD^~`7i`W2n{vU%T(BV*{E-{h=Yn;);P;QfZy$kQ zKLTq%0>69&e*Osj^f6fT5m@~Z`0*pK>Lal7Be3El@WaPo`9~n>Be3ifVd*Erl23)j zp9tT7B7FCWu;^1^;U~hkp9tT4A}sh+Nc==d_(X{RM411nplp`>gnx5CH_Z9W5cj#^ z>(30apBrX>X0Uv2nDv=q=I4ePpBZ94H$;DCi2B?x{WHU~&kg3!4*&N(w>cLJOv~|u z_TdqzJPodiM^xp}_FCc*ReAY1kEqHMIFG2x6FHBl%5&yCqAJh8c|=uSdCnuM@+xp1 zQI%Jb^N6ZE+S5sCCaUs$IFG2x^W{9EDi7P|l(0lq9_<Syc|=v7ALkKOd389CsLHF$ zc|=v7k@JYEyhfZyROL11JfbSE3Fi@2c|n{<ROL10JfbR(_S#ZDh^o9`&LgVwI&dCQ zmG>p*5mk8|IghBy3*kJXDi7NYm3WD&yw03QRONNyJfbSEE9Vhad9;_7@<CMP(cW6( z5mkAioJUmUnK+NA%InK{L{(lt&LgVw`g0ypl{bL%h^oAioJUmUjp96_DsMFB5mk9( zIFG0qNZ<jaJ+eg2K!Qp@;t@3i2`U4LN7M`?r~)J&Q8SPLTSgTgQ8SRh3rNoqH3JFA zwuwj73?v8w5|5}ENYE5WJfdbG0ofSwh?;=}*n+C?h?;=}Er9eKQ8SQ$Y=?M6%|HUO z9pVu+0}04>h)2{6Bp}-%9#J!pfNY0&M9n|~vJ>JFH3JD~Z#MCWnt>Xi2XF$XW>Dgh z&WWe$o_M5l;;FhP9_gHTs_uzLIwzj0d*YGKiKptGc-Ydb@Q9j$#G`Vc=hX5bUTw}J zY6cRo4v?NBY6cRoE|7Rc%|PPS0}_v@8Av>TAn}NrfyAp1Bpy*Ska!J%#3O135-$Kq zJfdbG@dAOwBWeZ`uOX0lM9o0r1p$di)C?pZ*%R?pyCNRh6Y*5LA|BZj@l?Aa9@!J| zRJ$TxOU@%|1`>~KjGj|%jd)~Z#8YjJcw}S5Q*DiSWMjl5O1}w80jX@s4pd%g&Lh6c zE5mtY8!FF@^UCGmmBlpy$yJ}D`vjCemFKQ-K8)AEd1R;RbLBbDBL}Yn=jBW@l?}lF zpc+<P96T@w&xmV+K|p%W5tv&C#LKM%;^o!>@l+jn;#!qQI-q;14(OV6KvdNMU6T%o zs`;R61LvtaAYOUSQ*}T*(n0R9qyyrqI-qOP0Z~;4bZz83RR_-aom&UQ%dG?A<<<f5 za_fM2qywU=4(OV6KvdNMU6T%osyd)+1LvtaARg&}sHy|HCLIvX8J2WFJXHsDO*$Z| z>VU3|oTuu*6~A-qfOxreK)l>KARg&}Xn&xFUy}}qr|N*NNe4vrK=nD&0rAv)(6xc{ zR2>kHbU;+q0bP?0h~^ASIv}2^1G*+15LI<R*GA6EsRKI8grEpeO<#M3V?XbOc$A;q zx}x8?bw#|~x*{Iwim0k9x+Yx_B~;@eUD0n<S9DFfBC6(>t__^0>WX;fIZxFU@km#> z!{*K}-Ort00}tm3s>Vya-1#M5?)(xjcl{t9<(DYMNBN~|$}ds1e$X}LmuSv-={KR8 zU%D<2B&z0@t|`AnbA~0`Af9R)bWOHFbRbZ}uZ^6lwn2HPwC2<SUFX&T@p9{cc)4{z zJkkMCRR?rUIv}d*fUZdgM5_QPeROT$RMi3T%5$Eo1LBbmh^jhJuZiZAN7n>7dGw6> zyc#d{ZwQF0yc!C}e$J4}BRx}CRnK%ydM2vsnXZkTHwaV>OYJk=Bbo<!8pzW?o(A$X zkf(t>4diJcPXl=x$kRZc2J$qJr-3{T<Y^#J19=+A(?FgE@-&dAfjkZ5X&_Gnc^b&m zK%NHjG?1r(JPqV&AWs8%8pzW?o(A$Xkf(t>4diJcPXl=x$kRZc2J$qJr-3{Td|U%r zfQ5|~nii(bH_4#t_wMO8g;sylHQgsl&l6RFeutd?Fg*RH`~PeB@bnME)9?Q^d~nl+ zCdvnagPN%S12q<3WNHb_%EGsdK`CgkKHjwDO1$Yba0qY;use9;fONk*et!r23Al>$ zyfWfVA;6Kq1mN$$Q^5PcmRI9V1Ax<jOMoPUAZV>#Lq`})#`UP*<CQdMlsoo+zZfnV z^yNF0k12n+e6b3(EBswfboX^1?*5Cr&E3<`)vy-n-2_YnUIo4Yx|UdE3Iz59P6RFl zZU&wN%0QQri%boGU4f&4aln<pWS|T*xGpla07e710B-<YOD!_B0h)nZfER(R^dgft zFa$Uqm;_7)-Uj9?13AFPz@ETx;9}rj;9a1L+agmvU{|0Sm;~GlyaCjfU1ahA8iB;` z2|5k95cn7HH1Ix<<h}tdUhdz&4V*)b|M_wlKG!_J&^Ne`xhLyx>~bO`^h@X9<hJu# zhqerEZfqLdB(%{yDLK$Nz*v7>J!QM@hq7FKTbahiE#J8BbVlZrS8uc4zIu|GaeCjz z<#FRot$b-4+J6U4K0&L?U%;ubzDQA*;w4>6m2oTQZm3YvqjD8bud3eFYkcA3TeFs5 z?K*Yp*7NtT-=IN2Kwuya;pFFT8aV|gFfbsXL4*4K{`KnCsZ-mpR!v`@FKSfxuIlAk zrLsrG3I_LbZe>cjmMrd4w1~d2Q-S<Ct&mTXT-A|X@^oacDmyaQN{*~<MMu`Tyd#Tn zcVr97I<ie=9NF1Yj_i3!+%MtC>bp3yo<$wmRA)!_Lt#g@-^r2PDd5QT`5jp;og?ce z;$A*Swo2p3j%4Bczi)M{^cx*({7T1$zR<CRXF9h1iH_ZRq+`wxb*%ma9UE{@$L42( zZ__c`Z5=Cq3(w!sv60twY)OWW9l5MyuP*9X)eAb-?VOHT{?@UrXLRgNnvRt@rDJVR z=-AX_I`+pA9lLQz$6OEUSnE_BGw;)}je8(7MaRk|>sZK69h<#f$5Q^%u@_r(?2A8j zY|thhTed;R(%0))k#z|7n~ue-)v;YaBhEECR(mzlu}a6*u7I57I#wx3$NDbSv82U1 zcKJIUb6cciJ-*ek?-uCT`2^%OUdOu6)3NX8=-9=t5pS%Hh2lHNKg`szn=v}(6|G}o z({*f}S;wAE(J}wYNc%(`+dE#z3XIdS4r6s}VYrT68LeZLN9ow`5jytgS2}zYTE|)r z)v@@&kULPvstnMv(fxF6he^jALy@=MI<~y0j@|2y?=E-Ku~}Vo>})3;^9a$gF<<J~ z?qD4&+8$|d3q7^gv3#u%riG5JYNlh)gCM(!jxBDaV-F<gzM+nN69E0z*D=W-WmXq? zudQPZ{d8<WO&!bh!82dz*rMt>_OKelRz=*N&{t(0>sSf8s;Fby3OZ&o=-9S$I#!}A z(ppBxj+H_gy6V`B5;}I>MaLQy)3K#RbnJ~DIxMVXe>v$`se(E-K0nGs2i<6)S3$>K zJLp(XjgIZi(lWz4EsJ`iWw%~wS<9DN_Um&kEAmXsBA#g3`A1qNJ=C&Q545b{eJvYx zSIg4xfM?UPA8%_};agfZ_J)>SzNTf(uWH%)D_U0ivX(_()Ux~MwXiKM+xxec`JC0V z#izB*F-^<DPiooK<6744n3ionqGeSNYuUnsTBbVyS^JTWy;|03kCyFA(Xu+pTDE$p zmbvcGvf10T?9Em!8@>hM@jdL2O<I<^LCYHap=H0X)3S=cL(Z>SR%k8q^Rt${T%%<p zRzuz@E$g*X%TE8GWo?!tJ<GH#V5ydETC8O?zK8rpT2_9cmVN(?mX%nbW%ClW%qd>W zX3o>HeE5dj)HuW&t7YS7YuU3|NdHVNdlaK(BcrwK!E~f&nwH(0s%2kI0i6Uo5qTev zxW{SP!?9X6CPK@ej?uEn(OULuq?Sz{p=FxkS{4(gW%-9`S=<mUD>_)qz8$D#Wd~^4 zihf$=)mO{bg=$&dK3cZ3mzFi_sb$ByYgy-R_@-PJEgRe!vO~0NLPsqVzSOe0!CF?T zy_T(P3thL-vTdzU9xajQ=2{lo4Cx8dvWZO)Ut`2$)UryFmTe5wvL*pqcB;OX_4P-d z>T22aI$Bn&HssXOvf4GFUmuj=7h0BCUCX9;!!D}fo|l%@^VG5<l_9$l@>UULQ$fqz z%R{H`TGpx@%Et})Ed%=~4cl?mvcQsBcBVLV<DzBSVp_JW2xK^G*~!9MHms1AiB4LU zQ~+g}U(3$wU}svCqo`#+<wM>bwCox~Ib?~f>^qVD^+se}@m=)iFGaTCg~<G#i|q7M zk&SsGvSN=#w(+6JLS&IWy)UwF?uo44U6Gx?BeF?0k(INGEajHS`rj0p;|-Dha!q9I zuZrx+6_G8xEV95$BD;P;WV6nTtj0OW{aa)c&x)+V8Ic`K6WPd9B6B?{vgG3;8*)r! zMUEmphavBf$O;`4*`KK*>$_iMPWy1Z2iLnrRyYOE>=N0)ogyo`Lu9+Qi7f0dk(Jsi zveZ9C7O`1m6*r0O)CQ4F`$J?t>qU0ucahEgO=QxqB75+Q$dY~*S%;rQ=CB6&`w_BM zAss74cK8R8O<s;LNg}(kRAk>S5n1cSB4gj<xkX6hLge{d<YR%zW+#fwm>{xe^F{XS zJfwN9$jZzSS=!eki;Wdoli4DBJqzJxitMWyBC8xDvWzH^eK#HYoF+2889JCEvY5$` zGf8A`CWvgyc#(yV6Pa(M$nHfzpWz}KJO*J$BRwNU_QME~nTCtZ@D=hjOk_)kimdk# zq-n6oE)NvhvH>Cs?Ju(O{h)V~$X14mY)~JOdG!|A-JT-*t%t})cNbahZX$cxMPxfV zLr0xN)+|J11v`rDL<f{{u*iC}M;WyfnYE3`es2w(wnAC96q(RMWJj8bEU~G`dIpKC zQWKHgZ-lZjip(sDtW`sixdb9D4Mg@+edNU-I<F_P0(C`pwl>o5C$izSMAo3D$aKEY z;}_u75ZQ?8knfFht_IukLRe3cjjJNE=9NWOvXaPdRTSCg3L=|XUSwSiBJ*??*{iZB zFE^1bDTDB(Mb@Yk;&#QeC14-LMHc4*T@^!Ki;66N5s_Wei|miWkWmO}cM@66f=ELF zq}35+q(hl$@w_N9e?er<`H*)F?2^HbvjjHsoxobY6<CEg0(<>RU}s(m?DrP}vpg4A zzh?q#_*7t}o(Sy8BY_=%D6n5-fz5n?d-nw<-4mGGU4gy4Be1hJfo-%3EdDlR-V#{5 zn*ytTLtq833+&ESfgQ>a*iTm=_p-o-ToPETivs!-xPM+?chd!S>~F+-R$%kb2rT@x zz&fW1%>NYRpA=Zuae-YsCb0cS1@`k1fz3HAurY@O*7cyk0uLbVsRGmO7udbM0!!N? zu)lT-EGY%)OcvPiT>|U06VL4sSf%X(E3{2uPqzx}@)pSZ6LD@9*rH7Wo4!$CVH*(d z9|CK%USQSM39Q8L0@M74^sN<G`Y!_8`?J8-{Uor(YmkrC0vr1y^sq``!7HJs6$tYK zbhTVyj!6Q0wp3s@mk8|iVu9`XUSJ!(6WEGH0!vsZu&8g5$8QAIe*w~#D6r-U0;?Af zeauIG=LxLvT*Ny^V2{5R*sWNBotrJNqZWas%z}<*LXR^9wj>6+jz%7%1U6~9z(!3I z*dVjOdQBBr$0;b&$pY%0!0JpyIZQy_$3ylwfw@Eq%xSE^gb0DX9fNd^7TAMP0<(@3 z*wqmNyD%I!@D<8BOkf9xA<shvwrdD<I#^(v1_^BaK!N=_0BPtiuvPs8w!E*vmYM|i zeW<_|_7T`Oy^+UWD94@xo7)3r)m>m;cN17_SAos$0_+UkbpnO}I|9E1b^t#Z&$P$0 z?GUCd!nT2o){xaoU<+D8b_>MO9C0;6oJ|F`GDu)+nh0!dW0XlF=*1|ot&+fYHiW(d z1$H0+I%@!Xs1N=53+zfglt*2ZWgY0Xw!mKbLC3)SwFKr|Q(&&X0xRz$Ft0BJR<nk{ z>Q@(7khj3vR)bAc6<Da3z=nFF+^Ps{YGtIklE4x@1h%XqY_fvDHkTLJZUgMtU0~<S zq1?(M9ybAp6Ts%m2&{BzfmJCbu-dKyYf@5R9ZEpvDD%kV5gEe`!$ZF^hb0eV!;C}C zLy`xx!Nx)6fyo2d0Aqi1zl^?yzM-b%P!?+Jlhm8_Hug&D$$A=lBz0%qL%St)WnDwN zBzHD+Hg`%62@Of^Xy|DEGNVIihvZ-uY;Momo7-iy4Q-p;#@NQ(+R!?w6>DW~$y%CQ zWHdK6&uA9fETd^?(~O|dpo}KQCK-**jag%JBi6`lG#Jg2K}v3DY?vGv8kiAa4qyRE z4U7$v>xb6Q@HhJ#{FCY#>t)mpt;^~r)iKt|sQuqxw*KX=Lq1XKn7^P?Vdo;nTuPL5 zEnTK;IYaph9+fIr@v2%a$NN{^di6eh{Zc=50E(Be94}z?@B)_o{#C82SCz_@JSvno zlq*}Nv}?%{F2#yC7j`O`-%%^(b71e@zJB%M`O_zl<Olce-mzJ4-MoG+<I3fW7tWvi z`|O$1X{Sz}IDYKtk;8`$9ypM?f8V~nd-v?Y(fl}-KRFxl3%osh_U_%cZ-4560|yTs zK63Qf@e?OcrJX)=_V07&FI>EQCF9!lo42gCJ9qCrkRLsH`uxSK*Kglh=f|5=oZ3C! z<k%zLG!a;(SG;Lm?|9SpKJljN{o+mTq4B0;rg)QY-*}S^xDdR81L94?fz^h^n`Qxx zVeuyI@OaZ3;JXp=ruHM_O`fCTO$EkaoFp7HBHm;f8*jP=TpeeZUus;usbgfkX)36V zuE)ol4gecYh&ROp`%a8E^_&!MsyP{H0VYq4Hw~T!dB9=Q@f)}^D&CYCjpt*K{+aQn z-m~m^I%0`8)tVb`Iu9&15BUOK2X;Z8vn@e`b1DAse{`CK!~ZcHJ@0@&JJ{*?^hDFe zBZ)cElbtfUYT>@f)Cu?@_rqUi+>Zv1a!)Y1mQ65~@<=cx<N8k31XEDQwk-{9NA!;f z8(?TQV)R$0aDz_`pAW;YL|8||BGb)k38tRFS+x^P0p1Cw8jTW6-r)NJ>i~l~wrp*H z!0H1PLF~(x&6?q7vk#^H^H&3em4Fo*Czz5TGq`zzX*{mI+a;KqnMRw2_a6~9fHiCM z<-0-!=)9HOFb`o9DSUf`N0`hG38r{lm+O&WYCd52fYGKfL(q^xL)u1+8Pd<-TVvd~ z4<!VY$5;|Ds%L^}9>R?2pI|zL>x2;rrj}os28}SZA3bvLfCxI{@82Mx0>T4lk4!K* z0xynFFr5P(K0m<}0{&p&Okff)1(*(G8o|-oU<@^5Oz~qNR9s}z0gdqqrVPl`EK4vw z#q}3^5=?I3R{}ah2t4_}LMPlG3LJMh!L%VY!L<EEg6T(GC!J0(weJ^hYTGo(;Mulq z&^S8K?q6UF!fpqCdj|Fc47r+M(w$8(^^j3kqep~~HuW1eU^MF(ZW<jvdcZKcZe|)2 zuJYRt3pa(09|NxaY67l8Ov46*@Ngff7zt?~WUw2Mnw&?7+reXz>FARLQ(K_dn*`Hq z(0&eyrnVt%|0TsAvRo0?4H%FQbqQgd#Y9sAt}8g%>y=n(ktsirLM4LtMF~6qx6+9w z1NeTx5a2lAVqh|`FrFo(v$P2R8{Eh9kATg}B%1a@<_trkDGk?|-iaos%19fqA@D!R z*p7S2K+hV9rqJq%rV+IgO;d60RNtP?@G3|f@S6sSCNp?78YP-41|*uiS|^%1g`pS> zT-AoLF#dnWB6z}nfQ8y5nieC>1JIJd)1B<{LvgP^uxpn@(;uA^O~t=TH1);x$VmJB z_FjujUjj#r!*5{H|6}hxz@w<zKJE!bqza;lDCz=61ClVay>CJa1ky}GwJbw+lPo0J zxVxcPBVca{#fpkpQB*8oSDK27ii*7<_6jOCEPTH+vzu%}(C2xd_xj%NdoK3MKj+M8 zbLxHW`#xnBE>^F{oOaz}wFdXo!0BK<SPa&Hy>rpI%c^dr-F6+Y>;Oce10GI|rJ7TJ z?Yg$>#a$<NP4Bw9%a$&;b!qByau;WpBf9*NvMuH5l$9xqQ_f1MNhwdsO36$)Dy2`# zU(!w_?l+|8r6;8ar8}i%(pAzG(go5v+&_AnG*b#ner}bVAeBnvr7=<tw-mX#VbLNP zrBPA__Z+25Y0@z6Ryu~enFe#W(;)5<J4_lN9V#6n_2-_je%#L`dP3*FtgLHP6(oEO zyT4oSZ@BfFZ^dOut-m`T-V=WoYZO_yZ+L3Yp0&88#KVX;tbKrVa;{cajRu&-pJhFE z-=L>*<3aWtozy^WXnJ+!j10w;8K|w5{NrZ%%YxORXe=1Xsa2!VprGj`jWI*G%1{@q z3rFTk6Y8Ul4GrN)EEq7Tje$@&PK~t0vm_*KNxFZuB%PDP4Z}Hq8=5FZ1(W@G`T2P{ z73D?Qlgmr<@{*csTR3Y%eI!^JuC5QA&g-f|%)+s`4M9VCeK=;wX8ttPha(1i`NYY? zrO|3YcZ#ZY4Fs%;1W#)W)>qDL^C6m{yu3KqP+8MhKQk$c@W?4CDoXYcsfrgFCXUT5 z>(pa(N$!+{M{+^6jOn?ElJUJNP@OKy5jI4EWLdAnfEv@rKn`xP(5#?gVmMR@%Rz~? zDgE#2VPZ+naEX70a=qXYH5N34q6Q|Cuut=d*NEm(84d)ahCryQig`x!4N${@V8jrv zubpcM)zkJ3kzg!puxCsU#SB``MC!9cu^I!_Rv(^Suelnu!s%&5$!I+pPJUB73wz}t z;r`a_W_8nP&FZ>Xv-%piooC_pNuv(qtY+05ZC1t0MJ^0AR2S_L4L8;YhG_jw``5G} zGrK4>hZ2ZhF}*QV8`CqJU)vZ8l+Udv-|;>xbsDay)YKYaQuf3=Ni?9ywp21^jFexP zog?D;3&UyvZ-3b&J^A7Zg@uM_q*7!eTN??1;4IN<HEOi}cyba9)*HeNa9Dx8x<FE| z){4{Cw<WE@D<UB}Jbk30R-J254cfc3Ud!FC9sD$BJxi)#I(1YPQR{+IF(We)4AMc> z`ubpP)S%8%L$#vsNd=;j>tXwXkw`cqX^Hc>wqRw<P^s3|PKRL;(W8x(HHNr*Bu*A6 zOF{iCwKfz;By6Z}teY<SlK36CvRM@vdRMdR2GhX}AmRQA_H{t3=Awe}a5GXxK~X_& zLB$lQJh#waoLx~cG0$H#p}ZhR(jSCxQcIMYq=H<NloM{O4Tx&iMp0EHTxTeo6mE!W zY_*hMQdT6DR9BZvRfQ_eS5Xs?BGcO<iDoezpB6n{A}3IxT!8{<e0G^sR5}La@h=-% zq@`(S2y5d)j4DxC9hx&O3RO&M(K?Nhj&u2vB(G^!1?E4{tbVk*Sv?4hf3R775hVOB z#Xk8V9a{<e3D^bF<8H!lEU<$dRTNw67>VJizfq7z+MqNX4aGuXbP^1Qkf4QiK^mNX z0j*35x#;0$RbV%1_Q6a8m2o%WJ|9HEKlN=r$p$2mx*+|^Fk6k+Qjt~<A#E^-?1t*a zHHOmY$D37wWsfzhtH5*M7m#otj$c0!<_R5-VqXVd13x9X55oUIAg$Fg^eOrrP{GY0 z;r<c!^`L;6tEwtg8KO4gvzZuS(O}F_E=Wp#xIPxuIw8F$C(mDAGNCv(zofXLTyso% zl*H(0i^G72Vr#=)n{${x1C(<g?+Z~!f<lL9QCDq=Xje~*>fzGIE3)X7@umtl#u}J_ zMO#LN1VPe5aMXMFgg7}C!znQjx1X-t50f|r;r`6z{@P()6^RMiA}1{R&K!fDI0Qbb z=OQuvlZZYUXaO_|9q;oAkJ6kXopQI1g}-~Rpt?zOvX-lT&e*NK$<wwdm!74z*_Rn@ zuRQ2sYSc(zwi*d`WMjrA+#BJ43@|-OG&BY=HPng8rm8L`G4T08SETG%ELhhd1{pm{ zBQEuf2C6KoQT9wJ$9ZxqovVn5q0kzVRMMhO1BReMT6oPNIy2OuIrENk#FYB#;79}h z!C<YSHZ+rb*VcwBVHZd%Ent{FHx`U$8Y*faQVdBk|1fb(Z>-J~@xzhG+)P7jZ>ZDa zwnY==5WjLY)=2LZ)FaK9X{s`$rDaOl^|25XUybr6ry*ajTTfbO{Mgew_*FK>!c|qC zw5qf;Ex9b6ALOp}OXcmC&&?Cpp7PrUkJywYY=>v$R{TDs2X+HIqa^*De)1LTe==wN z`S^;l=iRs6cdhoRy0?83X8fFWg8ZN^1^l%~=uDm!;q~8?tU#o(P72jWV>nExuVtpz zY9&goo|G0CnHD(3kYRwMjTvav0Oh7q7@sks32HEnnSiNJpS2lCP=icqOukZ@U6C_Z zQDkPEVcMr@jcu-Sva4u7F+}MdA{TnHQhB~HZ?d?GUD9bbohJb6*PzBKYv@`UM@7rE z#nAdwyRb=qt>Gc1!AMj}Hx4&YZwCI+U)l<q7EMnJWRR{FPP8%Hds<+)lqY6;ZN3zh z6KB=Z0+L|_c{iY&s0-JINpVEN?leSa2ZIen9%*QRs|jkhK(GOhsx{uM&~$o?9xrZB zj#nA0Z68abCCYf!ERl&?z6eXD1xAsvD4kXf)wlBx*3SyoGM*@+aEI)Q7$Ye}Jb`#5 zk%pl)u)e7$9%oW86baNb5|d)JhSbxHC(>DfvLIxdf@>LtlrT!EpIPBrI*y?d3dsnq z5?Nz}h8h|~nJ7f9BswHBixdmjGc~C7Gtosh)-XI1%$w+=$t{naR;bSi&Jp4leKL*C zE2a^VcuWlHwyr==sIArd8)LjC2))wYC#EvOQ%Old>(qt@dOT!FOOS?)gsYjVNu08@ z5`+%f5rNb9iZGnCV^njvvAQN{2K^V~X43CPdD?zCS-O3vZmwMzf0p9r6x~D)l(gS_ zadTCcPB-T2^Z;V=UEFqNUW?izw?)kXjo=0#-2PQ;B>V?pByq~YW8+%XF=JcQs)82v zUSQx^xFsV_o1KP+V5G7!8WqGdsR0tBJU%52kxr^;QLjxxAjvM=>%c5<4!97sfNZ_J zgHgtE6_Q#j^Gz3-G`&T=6I55WsIOuk0DcD(f-UL>RX2NM7tcfE=6Qh@wJ9D(xc|3c zJ9W^DvYEii;6E)_GwF#m9*LVB(;I`|s_GW?geo2HV&?EX2OI%}UzfO<2xp3iE!A0K zLo8GmbQ;cvPDhc%>jP0S%4lgOQ;16-{!|-g@`{Dg71z$yoTckdYf*og(V~{lY*DWO zO|>m*psq#TQs1I(#rzmIH+B*3ChV7lThu%d0b?3;_b}!c#1moun{W$dd=dNvj*gf0 zKPg{->Qlsb#m$as{l+_V8YTY6=@y)P+-=h#37h7yN`G4GPq;RHouFizztr?qyXVqG zINcX|_etD8!5<|&$~6^GRFEP=AXpnyGqgTrNUwweM84M;J6M4+MTYXZ%rkX{l6t8K zzKHM>^+}B$H+f8wui!kR4PoZMxF&%<39~7B<``D0TT_u1&uvk^o<p63JwQAsqes&7 z<Rts_B)bS-3ubk26YfpmVsQKEE$Rc{DewY#6MPJIfZxGUXSArpfdyoPA}|F6!D&G7 zN|IpMgyz6s7Yc;@O!D=jqBQ<%k{YRJ9(NjsrbUN34dpc`JK^~Qp*Sm_uCeJt1sYd< zP!&R6N-qkcq|%bowUqLlG}$<3qyg1fwcwa)wO~?uu25$2!pK~fbIL~#*97z8veIIM z7GC@#FIwo%!*&)lJqPhM5*EysAP;0{#E21w1TP5>P!CrYgT0R$w0un-+1j4^v-ECL zi&}Xu^mAT|x(MvNphfL_QHwhM!WMP@eCQz09pPQjqJB=;g!_-!_ar?h-2YSamVLbc zKTY>vjo<5U-ain(VPF(+{Y|)k^<87)X_R-8*3s1WU${RBKIp{%Uwuc%aDLL78BcFE zrWhW2-_g`-(16OBg40A#oQXCqGE*BsIS`e`hM1vMZq1a^taLxrhG|AjeJnsO5J-^0 zhHHc+f3iU^$C};+t`<=%SQQdF(%ghA5!!h`jv_U4V>NY#nJA<?@ojTP-4%ud6G~1& z#H!|Ky!T$o%~B&FUCI@#IY~+t2|j(V^hH$&wpVQ{<`7*4qiGd|?B#6pidT}R8y90( z7t6IU3Ef0%ZN)V<;`RC3mH;tu4f<*%X$pI8XjVutl-i?I5u5}2t<x&)!D)blZ<rei zRo6hi&<u-a5}F4d3R>k*9tsIliCLsZSbxTn(})}@w3^uYUH0wjWxqVLN}pBY^U~Tq zA7&xzuo#dL32NM{kZyz$5lL5wf<i*jNuNlf(_apv?=T5HYVI&8Py5VS{xFsir7^># zY_ulBBu(m1MBR(8Pk1!_*ls>NJS*XW%2-$5;2`Xpnzl-<)byZ{@N{jd1r2+ovQ318 z$EpfdC)6B5k%UawqfgIe60(vM2t`Osv}rB9l2VG+XT3zso~(Zvs#%?>?<whN?iEf` zONj<Zgrjq-jkTKG(=JVPqbT$mf|a4FxrX2z6)|}(e0^LwptWJoRw1&J{3OPTu6$3t zt$lu42UJ2GG(8wYp078^nz*bOZ9OGjG;JS`@@m84@6v7?FMpGGyAnrPh*9V0OAb9n z`?d3Bql6}v{;R3AtG`wu+d$`RB`(v0^i_0V(1YrFq2}SO?cOQYN;F*z8atgciuROX zpgQJF@Khlb$2!I6Jcnt4o{|_A9ph?4rSm9S{WqxfQYCo{Mx@$cRZP-`a)*2pMld9; zT0IdEU4<C*OyXMPk)q^@=FL##cniyNPiZC^90`SoBvcrC)w}R*O_)$39TAWoE)*J) zrp)M&AI&E@5-g6Ul_9PO-!rc6YFn8}qhb^4Pk&DS7zvpNhAK8Uv$CpM8WoIHj%w$U zyqel>k-1f0q3KvfvK`l_`EJxkc)%nq!7d=&MEP0NGqAErDT1g$m}zJugTACSF&vqW zgYGqiu*JGgkCi0YW6e*`jvk`JIuPN<2<l)EONRQ2ULcGhC(=(0b>5rMyj7xRjG>3j zX@oUL;iJWhFI0+bY3s3q+$vU)Uo=d?NRUN6L9m2QcS3z)AvvxH4kqbjq7W+<nQK@> z7MaoWn;BODq5`T!A*Ly-5+O9oby8tTd4<1xN^#C9{~UI7cCLSHUUqI?8G-rf>cxGh zol}<MFDhW2ADya*@lW9=6qja~mFH!TF3i(j@Xz7L7ne*b*1~pDH(EW!*SfX*wuK4R zvtWjX`}B6Tg#e{3jAtg*bi8zJEv%*V|8BegQ$75*w4rD)zhCdU{&-vX;|<_v=!9zh z!TNwdT;*roQ5EY?>4;L$A9%@5<BDdEr`Hw|rlhm?)CXs`g=xQ}Rvrw_6hjBCy4I)k z9LC=)*oNu4Gr{7HnbJSR(IO=FVI<a1Mc4X=cuXv8*-VZg2BNerM=NSwLp5h#DTW9j zh>%#^4~l&>k*FX%$y8R`1EKF9f#k5yRceecr6u{W#Um^hR+vVGsC+m3t?s-=-PU!X zT7>KDjM-MRAtG7^{zo)KV<hP8DP;!&@Q-M-8^q2CGQy&?S{=+l+a+dQRxl=pBC$rb z_Qb{@43^%48lMS^sjX@m*mkS7rXot%8mE*EmSW#RJeH<x6{A)Nx$NaL7!q7}Lp0bJ z5PNR)H8WJGbfs9h5{X%8_;tldrkGFuE{>qXV%rORp%xZaNn65YqJSf04I($f3=lEQ zGO<gzUUw7urNWFXJ277+Y!dyXE;O?)97wN4;~yQK<bZg>v#4Y(d{kRv<Q4J#8rmeN zHK;ZVwyrsAQ$vS2DR(a1D18KGR_nC!@zJhFi^Ty=hp(%sMSkP{x&zH7)~%u)!|BSV zgcKt>SlcED(#Y3)fR?lvFBDa5qlV*RBCFq*w<c=t%Tt#?_wv=V8LF=eOYyzhdLP#6 zs9m1o-tlsE9!lFWq_t*z>P{?pBV8E8W?)@p5X<ADUo)WM$uVb#^t~~xw~EdX-wz~e zCcxH+O0jsKtM3tt^VVT~Z=JTdOQfopwjix7FegTkzDCp5+<HILla{pA-hkfc;;aK3 zw={M^h%YL;y7c`6f|;OAIt?G^FFK3RX?US6gb_(jxzlish3f1?sB}G3b>aH(NHREc z?CHZb28TSg&BJ0VhFAle&KT8tD_sUk0t=*bUGYK_2i=6IRTKx*eq$)6aYEWgm3-)b zJh)KNiLmYDy>vku;fI0^WT2{D!f_%(l#X!_88zM7-$v{39&NYAKfOrXe;jX7y%jaC zZ+18`Q*@>T>ld$av)Lfl-1#NNt7Q3)l}L6&X?=thL3*WF2y7!0dRCI+2nsF4+;(+e zE9j_Vg~VmVyF$BRlAInp8wlG*c=Ui7VqZ(U_jU}I==D_z-J{q!mEdBddT70=_0E;# zTTS0c^nz$5qKP(lB$W|=O;ueN(wE?-v)KnqtZh<kAB_ER)!MRuCw}oF$G0}ND>F)9 zdhe)sTTsPf=S7DQ@#tDbBu}r&?ydVv+Jpn0!nC%wAReq2C-$N26;2;ZTDPGM_Z=>g z)qhG)luO@MDf&b^+SSS$>%wn*`sh$<=#?Pwty{q2>&jYxtVGH}TO{^>iG78r{m`<Y zQb*~+udQJ^hSR&~-}u)E@v?myf_}8Vs38&xM-Vap<{f$$NzQG%6yl6fTOJadAlr6H zcH*b$=i2A1wGxx+A*Sa)v6(VHRp>LVpwrqg))iOGD{8GMEjvN=EkDd79U_JTh>$2L z7}m-CE>5H4B}wo?L2cV-Ti$j0kf^!Vq_tp>mOxO_hy{f@mUC*^)eF_x;4bhe_!yjA z!&$M=Lbly-&J2v2u~3bI`@wVIcOc@fjVx5Z=S*8i9E*D)5dLZ>xB|D8U@7O`#$CKn zy#Q<kDVK284HSWk!3yvh7<lPI^$zeU7*3o@Fp_g@>6b55i$Mdp9&7?Xf`0hDun_-6 z3)NkqYVkt#EN~UL4{QQofo@9{szZSnOa-Ey;kUB{Gr$sA#9*~Lq`Wz7;0VAMh=)*> zG_F{BW#}UH7jVR|MXCo(0cQdc0vK4mX-i<FVM0A^j=OfmCz~T;znK@Q=gN!J8-TEX z95*K^i_{os0e6Gvz)<5N^$c(o5Mdv{d=2aXHq#<?HFy(r$1e@s40wkjT|4ZS9hjxE zlRMD<)SJjic}ejYsi3&LLSkD~g+yop5sh<gn&MS#Db~B12>(RsB6T}B@I=mGfw5o) zcs`DclI+6mF2E@^agxoD-g>ajkf<50F2>{*{l(&CemUun=N#If{zd9x(>Ut|#sU>w z4juzr!MC8Bx=1|+*ujZl2B@i|K7mN%TFeK)OYvvn_ILP%aG8W5FA^}M?{$c7xKvQY zrZIj4<}6ajMLCNFE&$8Gi{LY`2OJ(-q$*$>m<^i2gWyGAX<Vd=_yUu#H-L-44@vGP z&C>m2nCF2Tz(ZgQIAAvU1Y^LVq){0+*LHYL_M3;_O+bVZcq48W6zJt)*Ic>S4mU~s zqhA6;db<;9l)bK@u{N4Gzh*FG8Vu0jR%W>~?+$LpOvT(_67{$5c=0fu#Weq8JTn<D zEt2x(e6fqKf<I9TE!+C?OE5BA%E=y|Hz~Vtyi`6lH&=?rGNkf~48eIJzA~d})1)S? zKy%wYD3*+*{Xe?cBZ+f+>57Gcg1$i8btpPC#|mZfPr<(X4bFAG-G*b|T%=CtSzsgf zZg1&+$6z9cNZPr?_yI*Nt<3SP%?%kp1dT?8lsB1!<Kru`rJP*5BIS%N22xJ3R31Z^ z6D(tLzD!C|z7RcG;wutheY%nIR)}>ah+ABG3Zl6UQ$hU18#KCr{kXo1)d%}5R$m0d zzAt=+e**govoH4n2kGe+WBTKE5%vu1Qg&UaS~awtqRbJe3(B*LN+ofyNGdPPE0#*N ze}aCMa(qWB7yl@PfFZp@0+g^^uqAczRyNGh&c?Ru?wXq+z1&pPO8Gi;q)tKzzFXge zoSbs|R2XUPJETGH@$Ex(8phl{OnDAxA^68Ob`utInywcs(bWwmtu5P^)yUXm^QCsq zi`^bnrLkOe2=OmL<0mzquF{R#J8G}{RbH(AG-|PWC}swj4$c6J!QJ2)@FD1`ELI1B z9I)`;KpkPp2_tf^(&%LoW#)H!)?#(GZ?SqMxEFi^{sf2NJ_?KlDmV{Z2c8Cpaz6B5 z#SX%g2PQx{)2P)0wKSPS)benVx4qpJ;XYYluU071lz9bWEl8|j8pelWT3L#+%l#9y zA?Tk7xsq-xU#wPDELP_MVJ7f&-2G78#())|kTa?^K$r<^io5T|%)osD)B+gNH32a` z)_L=UVp+;Aolu-YJ#L!3SbYV&13m`dfNZgW4cb=}nwc{zW<+0QNEe#MGzf_9W+IIO zEe*z&9(uU8^oTR0B{UO)!nWiDyQGsBZ9#h68H?3f;8yS~_!4wKbFq3X$N?d+5PS>1 zJA1L(?JV6Cc7bC$Jlo^XA7S>6hY{h@fH&z`xJ`;bH^j}0I`}W=S(J5hVju`*Ae(l? z{)Qs{1oIM&#p}^v)Y@=}KDdTRqvHcfnlxc*HufPMNQ_a;UH_wTCk1bT_TB((1v743 ztZoLMg1^APW%N^U1$Y5`0+gE;t7n6&z$)+@*ba_czF75vufeFB7ppVD0&qP@<sC-= zF}B2S{r8L2Z9w{=J(_V7xal8oEb%ISqD_Gj3<3SXPrJw?cnz!v_km>~i|`4|CR{0Q z4Z<BP$FCW)2?X&I&w4J~|No)y5;ddW67@|W>^Eah1@HG+qJDGe5;b<n67@bzVXpxL z!Rxqn8L&jXqSq4jRi1_YCCmYs&&HoS`hAMK@Dt}la?MLr8T13&OiNS=b7&mGz6vyh zrX(!GE+E`w%M#T9wqchrcVZrjDIn~tJWJHYV0B&_*77VM+#VcFT(AXf%q9-_0lR>( z>uVt86=iwZMgH8poDx>`{CQ<%C1w8ditLIB<^I-HrTBWu--T^k85A}D&uQnEWf$f7 zlh+6TwRlM@gk)3XUBv4?k~;}N04xQazJF3#K?O&=^s?oY6ju}!PY@eaw6&lPWos8U zdvr-zh4cyO_RH8u+OQa7D#j)fFB!kDI%pqGtL=T3yM5RR#pM%9OUZ~hE}ca_YQW-s z<)<RAurMh%ot7~<Ogtz57_MC|Bxwup-vtI|?xSAH^YX_3Q$CWz{9Qhh!*$5VWZr)! zxMg4Yprhm_^3m4xowt2**u3Ige@Q+u^`6#g{UnFiyNa}peDog0{TiUtI0eN8EV}Dm zk>2u;VUo)07x~XFD9$U}N8e3OyP$Ytc40xTKPS7eaCCOgc!cPGd{<FkQAybpKQT&j zIGS5htW$-3_S59|>GY$dG_Sazc#J>4pfK;B-<Mq|YH*5Qq*Fj{r-~lVJ=oOUVz3!V zGIa?WK&Sa<&p=tuSU;yY{Y7~d*}2(BLHs%mtF>2Ks7}KqrKeLWu|eYR($hk9{=R>u z53xZdQOo<t593H59G&`W{Z6m9PW}JgHicVj-x{Je_1{|B;2Y3Sp-sTapb0DkYr!_q z&&d7YoY)pW!AmBCt?YiyV;}$OqO&R^G5vB1|7_L(>Np{$MyjKPXQ4tUMUhKUmWgB8 zEZ(-du?baeP%F{@deRyVtfvH`!lErF3ri(?Dv`q3-IwqiDOSxyAl6)E`()VAG+Alf zN4}Ds4``COFH@4l+VPQ?M`Ioe4#sW*R_t!zz@Cnofq6U_ioFuE3bPi3u#4+w&cd7x zgwC}TOu+63Q?ZZ7EXEXrA{+Y#@C^3N;5qDXVZM*~CU_P5PVf`<JzzKXuQ9*F`~-Z2 zeHrGhnD>G^u|J0SB<6$QKJ1IYmDrbpYp`F4c^T#fU>^4Q=StG~H0Y(^BJ5XVUXOVd zScrWUSdIND@F@1XFz>;<1>A&v8|J5&JHS`if5-d_a~Jp?`)lA0?C*iMv2VhB5%XEF z9(xwZ!(IZ$VLu7;RLlx+BK9blh5bx07kdq69cDF{j(r&BahM~)aO`$W52g(mvG)T5 zupa}Cz}^e<Ak0*dg1zf}N$S>Bl6r$4*bm1%3UeUnk6i{9>^|VcegbAD=CNQ1_Gy?w z%rKaN{S3^rF=OB~?B!r0_LIRB>|-&DFvoz=*w=!mvA+zS$Nnzn2bf#IE7*SoKV$y` z{D%Dt%x^J22ivjVjCmX8O0WX^!<bKCJ_PQ^-VBytzY$!E{SwT}F&BVyu{U**r1R(q zSAdJLUx#@E=3>x-{Q<BB`{Upd>~~<^jd?p*j{RfI&oI9MUt<3i^H0oQzz^8BfY-5q z2;RZ|0_IDY8^Jp4IUpZ<At=B;8S@m(NuUgS18Bs44mchAOw4-B08p_TFw-zcff3kU zm|jdXP_Q2Y4#Pee48q<Wvk&HhpbK{Cz=L`WKC=G+yU(f|J8VQo!|b!?*3O(B99xo~ zT~R*ulx?4X_vIhI|M1gWAHMO*#tqNE*nHIu*IatZyz}n3_qLlJeBjY1o?ZLgOYgq- z`m1|>{r=~VKl%2nhgLoE<XtOoU4F%d=bpc4@%7gpZy28Ga$AhY9DeX&T~qt?oK!mH z)bWLRqr)|7RWx?i=@(soLDQ0j*Dbwo%~KEGedo=${Px!`J3rn2^*8IDd3n?O@4U8^ zWw~jMku%ObaiV{6(YT!4K}QelcR-h3y@wn(D&6BWnTrdu#*|Gs`J`E=%{gaAU7*tI zkZnWLMxM|urF-8ajym*^dsZyF{r=UDKXzry)i+*z*@F2WyuIbk^-php;j@pv*s=T1 zT|Y|em#EY3N49u!iQ2GwiMs9)o;M?_Y+9nu$IN<eiMr_dCF%~x?!QK7e#S2D_Vhj{ zHzPNjlWyD`QxjzMPTMJ~U8kUOY(@>BNX68S&xpnPm~dp{w6XQ598J(MjSlg&Bv};~ z>vHU|4rn{-#SJ`YwJdgfeDekqN~gI<yish;)|7RIbg`*Ydk2eaLb&hv{=LdTxOm+7 z`nO_}4e9cn>}*Xpkn~>edJ)?i;uWC3FCItU>pktf6Qxu#91gLEmsgOrz2YSDEsl|j zwa!Gef2y30Wz^sOZze*1+RCb@kW^R6HO;mTE}qcNC+rpHcyXly8`#iTi$L+}NfboZ z3cpvm^|$FU{@q-6%yaU4<5w+&>V=+|BXaa9p~{zv3X1adLttq8wargrzduX|`=hxO zNOVNjr+E?`F}pmcpg`=1K+TTw57m-9$0%pWb8JD;LAb9evEPC1ByFkDr}bUS6DsmE z>{1E+Qm_n?$vDSkG&FEY1(*IDukGs%@#f<V>7~VEw095J18W<Z48jkcli0PE&NVvq z^y&DMSg#*06$aI+TCuRso;|4u-M?x`4`x<pa=pOxU@iMA0^DU%Wyr}Dc_lDcT18^) zXd5N^nmC9kw8g>5s3?~U;4Ee9zO5cY-xX*Shby?Ki<<ySBI0rc8VnD8O;kU<B9e@W z12D5$)u*Io?9Pp7*E|$zw_s3;+(xZ-#Evh`C*cr(msr<igV?N4aMUbv&6WpRjqTcS zirjh;l(G%ewN3T3Q!Oj+tbtaAqBT-MZ7q$b--@AUQ7<4H+p5FbojawC)7isE^^Yo# zX%|7Y`iS=UyWa~gzQ+Q71>N1(sE2`JKnA5C3KoFN!S&!a@ECXrd<cF3eLQ^c1t=gN z=<;bnaefI4wYj;-UZ`M83k!7lO%jrGh1gWh4OeBO3(658i;D7!E2NwWdF5mC@>m%u z$f=l6hBgE~g7iKFpMxL4pP;vwZ^i&!7Al@lG#Xt|#gx)Kf3genvZmEZ_7`h0g?WD6 zNph3M$)KP(HxC&xSLC5EFCS63AUBT_R%6D-tsI!r-QYV2-wdt=w*tgp1ZN^n%qts> ze9D?$!DK|A!qOaRE&k7eSHW8#i}LgXV%iozSUA2kpqmF^rUG`HS0H$n6zApo%L;Px z_Hr<ihVL462snoDeSwIZh%eF*>5KP>J4eMkV3oAAg`a?M6F3O`#f*43=7DiH1LogB zq{*jbwD?)rMS{Yu9wgG8hF!R20g-mXZon=ee&QZQ@e}#Xio<}}1dauwJR;vhjuB}H zh_C_%kfRn>iJP?|LH1Z_H@_veJu8`}OvPZ76|<rkEt2*~gnj&$WnQT^gC@`brh!tB z1!Q0V{eT2^W?ZRm16#maunH^#&0zFMo(WUBoVY*+2G9>kVCPN51zW&cunH^#&7cW1 zfN7u<WPx2vcqU%c+xUTLpcG^Q85lr6Ac384kv7-@)`C@F8E6Jg;53l3g=Z1xfU8sq z>`c8%-3GRRwO|!k2AV+=XaLhdDaZmcFo1qQ0$YC}4<aq?zQuNx+r(2cG|z$c2drNG z@S^<7pPskpiKkwo*GU3W8(+4K-moLP)XV#T3=E(jkibq4`2}0RTCfT%1I?fbG=OQK z6l95KE6>Dhn2rfbK^BmK0rUeB*r}2(*aFsqRbUxt22G#=Oaogc@=W-K**t?%kOgF5 z0R4ajcFrO_um!9ItH3hQ44Oa#m<IYqcqY7Z2I0XLuokQW%Rn<|0u5jqC<R%d`E*g| z+K>7ZcU`Wf-agF6<z?X-Jx$wkif!#4a1LR>zJDor9R>u=5D;Tdm<(%e%!zT>2M9XV z0|+|N8;CJ2OyMR>p?eU1y+FcGq$}bIQ_v}qt{A_<?O@P94&goo2zLt*&!Rx$IVb*H ziYelh0pVUAHz#3=^rryv?ph%H>wp0?fWbg8CL*t*93p%Z5P3c~ZqCCL{_}zGUjRfp zEnqmfA^v<5rpVtdK)mmEAi_NaME+g^!v9Sm{P|pxRzFxZnkUTUUvQ4dVbeMKI5<D+ zL^<R2egzk-WdaxOt!>y4p3SppPtmTT-9@_!e|;PY_jdh&dyGVQzn_>PtZn^4#6PFB ztf06e-=8<Rl&Pk;!k=3(rht3qiq&Fv-&F}cQN7eiZPsd~Pp@yRtrgWE_3L-Fx-5>J zeRX?Q{Q1}<zf$a5;{K~Jo8$I|xS2@fe`03E(~#okmV?L#Xb>jv&5N7DE+^SLzUzmi z{3iUi^lmF(!mXpZpijKqm}|ij;!FcWfCPlwN4@kgYcX3u77%G~>)DomGxpIS`JD;7 za2NGWV~EY0bG4R{(a{XLTD|#j9b2(41GKGA%?VfDe!;802R2Q+B>m!Ne811VvGkDK z*L<nF&$|AwjKyx_)G-spv)*?M*^-o%h4u?91BpI_?ce+f`Y;Hb^>4;&AABeI62D`! zG$V0;3HK0c&lhgc%^AOHrnqlaxNqrSshJDjyh<~JFTN;DgMV3<(U@P%8fz2g^2JBg zVP<{0R9=qReDuc0-@r5<_tVVYIa1R$+uRLYu)6H6^Cp>R<w%=~tLxU?l_PmtrhPK` zqnxZuSI;@>-T}F#JGQ^^$r0mo7rtK9?d6?KxumQ89>3_VtL}ewsoQk>9j_1jxxnGM zeOK<EeQz~hf7PWgcYpMxw4CtDKzg@Lg4A^Wi@!fHKmPQa@5`<w_9Ej^@^52j&ztIg zDtgZQB?B5ek1Xh1RGKAKLf>LirWDXdEZSN`Yrnqr)*s(`>qmFp!D%0H{r=iYzu0su z1TKG7V|}I6&Z%|pkiLtTx3L`!*&~uZoI3-wQv>1#xayIHwCdpoLppc)A|`rxpcb+t z)%uNhfw0h|>j#S1!dX(pBGT|SZ*exXv6fpBV%$+uUN8nfsRR+Rsx~~^pq*ApL@j~y z&Mz#PG(53qnGIt?As-7PUx{l5#i=3fP=YuuBMvLGUx<q}6S2_Mic5_UrZ^&o94QWK zYlp4Hb;9WtEIXI;?ouIg?K4zqJQVuwf@{>i<M^&7C<F_@9bimOj?<7Hvf8Z~?9&a+ z$%xLVox!yRv*eM6(b|o{Vvkd(e$1qdNgQJ1XxI!+I1D$KGaZ?*{8Cc<*`a!q@!yGW z+8=*^{k8SK{rzYE_}NcC{tf!OpMLJ2fA-J6t^CV>I)D79{LlXQ{~7<dzyAJj>+e4u zKl|hF=im18Z~OVTe_4O9pMTxYzwYN>|JV4}{qyhs`FH>P`+qn8?w4QwZ{?T$^}oOV z|C9Br{rzWu|M^e)&;N-3+SmH|e)s?T8d!DaHxooIx@_nrrC=7sk-oN<RJg8})Udvn zbk#+i6<Wwf6*gi$yN+`*OE_N!etLxSIuCPR>srqGa7gU*C)lHOJ?GarM0PHlx2o5$ zFO@hu&fu)i9h@N}jVd;4eaiFOJTD-vt!p`#vz)VOH*r=D^G)#C&FuRECtt()B+||! z-IIu0vw|~eXL3FYtX)OA_jC3Qe0d3H#Lj2^pLgBPyMv_lCgzw$>_2;yy~yOL5AV62 zaQ(>Fq0RW6#XHzQ_5|tPcq8YO2>&$rc{=;s2>S!^{+LEt1DxF>jJ1ZdLge>({37K2 zE#k(m<_sBm%zK=4slPPf0As;aPz&aRMc_8@2zVa63%&(^f?gYYNrS*~zzK>$C5VAb z!7X47cpkhDz5~+Jy`;Y2XpjlKpb$(2HQ;P;0k{_21|9*Mz?<Mxumk)BdOX9sK_+m6 zv0w_Q26MqBU@^EIJO-WtZ-CFh&!F40y`&?-2;c+-;8f567J%!){oo1kA`rWjyRgeK zl^w?2*s<81U4K2<sn?rbd<U^hu^+qm`t#-ZL!|-i102X6$U)K(d{ut1bQI?*kC6=Q zR2<6p=8xs8^T$cYvrld~-=IH18p*flGx;LDEGc}M-XxjX$!L{ql3j90PCl*bmOPS| zZB|+AY#hz5#$1WB$b5)mtoUjK-vHu+p4uVPBEIvS9lv8Qhs*fHhm*O?WR5@nkk4)~ zHu?v2H}<RqwM$2}$2_&NM!N?}d`MPznbW{`BjQmtmwe8v7SzXGD!7GHPf2$!5*NTE z1=F5O!+Hipkdnq&$HZ_N6A3pqv_`|BT{>*!=@18(q!65d$Pr&d*Aw8W&2LPQ*Co6X z54rlK=vr{xw9uWojSYuqiVq#N3s@n(P%NsGn8l5CTI%u0dMS1H<V0KDTdTIsWo~_C zO(Z-~t!<2_DrzFT^)uJni-c2h1!%PucZjE?1>ufNz0tG)#lhJeF=<Vpq?SWCy7ySM zwp}BL=e8CQPi++_>Y$UScAcnz?S<Nl3b~;<81PTjFQe9-_(mjO!cMk}8srP)$xg|S ze2O>mSi&ct+B#>c%7;(2SemUZSK6cA3w3Lf7x(+bYpSiQifeq@2cbXd3FFhQZ)x{= zm-CGi&HKd0Q02@*O5`ug*7M)yLbelO^vWoUe{MWa`zpESSH|wK$gIR@(wh!9wzDO? zv9{%`EC{0#XnQUX#&S7Aq@Mwz2lA|W<`i+0TGBJ)P5XLw!m(8U_(tnvM{hpMNA!eu z{Bxn@+6~DG#|}N0H*>{w`<^Sli(F0if)S{XUTD39Z5~Ngp?|4OOJ29O4O9JDFE-Tn zpMJ}>2%4<_e*LhQH2Jk&(icf?lehJfmf_}pr7heX+;-tMImzv6-1=>0?n!bpf7DAd z;I=Et?ab}Hq?NeI#83QI;`YVsZO;jJVfK52G=L1UKq;sJXM#(?Qt%+y2;KwVfIq<C zH;Dssf%r|vtOZSAF<1sxg2%yT@E+I+q_-#sFaR?c3nqgaFb7-+mICoxiTN<t2;Kr; zfL%cRQr{*WFc^qmI;IumgHypQumCIvYrtl(9qa_sJH4bsK{{}PaUcL<pc&i(9tWGj zcJK%2{VsDbFoJwg0UE$Oun^n<o&@6e66Sm0E3g}Md#{&t1V{%)kPC{zWDo!iU=C;k zmx3$7a<CFS4Az4!;2rP@*a>!nZtwS!`h%mvaUc`eK^7PX%D~B>3e<x+pb1<E7J_TR zEnp>h5Ihbxf|tM>U>o=f>;hdrpbo%czyL-7GjM}kPz<Jm0H_CZz&vm%xEd@6E5RDD z7CaBOf)BtKU>6X-zc3GDoQwduU?QjibHL?bIS{}7{dRx9{r_XXO_lVIhWIN5Z!6B$ z#Gm<?C|@vuFONU-nd%t*{OH7Ue4D$W{j;Cj{7HrTH4^UC!B{*foOwJgal(QyS&3)9 zy&~d_OFWCOT=-$e`38k>FG;v-_l<MUN9%JfTiUe`ylD4ZPe{0n+t{PrqtW`z!DP}o zsqLAouPcLo{Wh7_Hw6>^QNHBj=hApMjYz8-ch6{V;l7T9o4B%E4~BFj<O;E~JfQJl zITI_8YlK@)o6tZW2I_A5jek0~hJ+)+<pyD=kZpuLPkYlS&7Kd74*$o`r#-_l>)sL< z)e@HH3K%WQTdzF}jw{X;5+@vYtDLF7tWkT0fr-C+w)Wh{I?mCaHO4R=LY&zW?<t#< z9|_lquPunY%-7wh*wJ~4Rh-|_!f4MXBlpF$J{RVR=PR{mIH7pnZ`PhC)Qb;4BwqBS z=0=ARA1~wAMGDWNU-D54amEe1_Q4NvjtsljN5uDS#G&;lawKjIm34mYi^<&KBA!M2 zlFre>F4~G?8o`<3e3{?Rtq_3_3-z<HbAnrYm@DjDZz?<%N*r~i8;SBx;xwB6RMg0U z^lUU360Jo(b2u--XX0whIXfV}Y_mhk6SsMGbd~}sq7@56(<5qRuCykFHscUH2jqj| zn#f@NXzkMloIMJ2(~0J*e<F;J-H7jYNl)+XRuGV$OLDEyZkNZAn{-HBWLuNHx_05I zkSjFe^*%s6>-TPs)dm=)IlQAAy)93;iPy(J=7SbTxRl2NdNgjX(Vn%h0SjRvJF2}C zn{<`%5q**i=aI3bue%7DNB`bd$ErE7Ye6)3bWXXrM_}~aSTJu6_w#h+3C6!e<x0c5 zioPAMMe;qNt9Dtjh*lAv!~uU~mx#2et0sn&>h}-`_Fu~e(%q9?%V;%jZP1z#T~#Xm zaYDULXaae2DudcLCMbuvZXlLgUMs$&H!rm!7^&kDs#q}59MVOp6}3?csY{|)rtUKl zX-#VUTSvqdAB5pnoP>*(O>Q+xour0h`Qb=8vQ%xbWV$$rBE6HEC{RVXwUpAgsguNA z2=Tr%34I4W8SO>AMxE{ANnA=Fsiz<1^Hew8U)dPpyb!e-<hdcl7eMJ`wb-LUJ`GIC z^s_|b<fUJ&i&pz}LcdM&$J6PO;;*7N>6fyEtY*%v>Mpz_wbeEZ8^Tsh_@A1>NDYaP z{?u{jl0OtizqUEWFNV7GI;I$fBB5v(e>~@_yNK*C^q?)@VUI-uXgGFhwos+`K;zi1 zd;v^Lp{A>UR<vHbOoMZi^Sk<ISJn_ydI?*VpbFA=*f^su$hWjZ*r_s3xTpGOCvrFd zJINt{Ly?7DPzQ2!OsYCvd_(5=R5cb3aeGs$pfKS|bb+aQy*N^<;xnZ)wJI1U2QEx~ zVsNKcRdI6!T0>82RW;u@l)ReB0*vI-Y*8sURnKF7YE`@lW3e?7cD!cJhK?7eR%w*0 zNSNfjRG6GwEl=eN7YJB|Fk>Rs38_`FU~R25IkhTY%2QH#u|_|GsiCM^%WWyr+*FF7 z@&y-W9Vm0EIHV=YbXjU$uuiMp%Z06uD?y|ygpJg>%}eubn9Et*)YGD(R&Gk=AQ%*8 zc`Dh{l30;SP(5+!p44c(L=U9WfR%hvOj@nkYM|e1G@EG2hc%l>_c39M*WDAsP9Nho zGGVJ1(bwuWBCXSHMA|59To@9Oo)I?w=v%@T3)7bGrN+?yaQlb!QR=Kj1xvrA&aRAV zX;(<%E0k!=N+X=Miv-6)bqFjt1>L=zF|B<S9SJhwHi6F8F7y=5r(FA-q&B;AQ=5pd zyNJ0|<2Bk`8e`I_Ng*HwWRWwbl0V56)kcg%Z_>0RxAK_w1y3QL|A!DCAJe`LmmzC< z&qGP?e-q69TDs|^+ZlNOEbV)mf|g{Mw6Jc%CV+o+Wu-sr*Y-Imntv(&|6joPyt3lF zLX%O;6#PVheC@}-Uk6EdJ4$n?!+*l0g5sj0%-q64!3^&I{qNU6zh*U&sQ9L1Ge|t| zH~*V!V5vG-TB=@p_ciL_JFnZ{=Ksx2{kLUH(e8&ioJ%U&2TRfR1<0Ma_eg~oC-CHc zy`}fMw8eU_3yeQ}R5?7&MAll%uoa-WDdxF=|M}R(?}^kMf9Y$&DLnN-#@EgGg%qq4 zr{dQB=f)w0^!Ql16hg~UO==-zm>?<FbDJ*04l=9=BeM=Hqh}K4bpDGwcSTup2vf)1 zG%De_+5@wW*omJTjY3Lmnz{HywHqEn#E9{xFtNn1oK@sP!L#8uhfpw%tT*>giaSwr zjV8rW(1aOSp%(uY)~SUl@@3ZEDe@oF;?$F;+N7Ly_O5AYGE&GvkQxx7MX4GnkEoSu zsfLuq{XHGs4AKfM2l`66fl`Rl8%RgghA5w?QI)v4tjMR(PI`L6UA!ex*WyX9wY~G! zb`wS!>-Q<#VjLkK0dBOZ<PFL7UC#SNONiDp@Wv1!gIcH}%mB}7Ja2P(7BwvHQWkaG zKFy9by{~%CC4LG$QYEcKN!ogixciI_EmhzvY9mU%RIN@DZQdhwl?d?P^XsSI(R7qN zR4$RH%hmD)a<lxVyjwm%IYi-ul*-A<xyoW?y|P((OWCe;F&=6>(m2F8)>vYkYCP9? zq45#p0P~6F>E;^qndbA%OU&<^e>Hct^tK#f8D>!|V=X6I{FWJ(vn-1(_xrx~(U{tO zP**8ilru~Zn(XFMVt(r#CI&nM0oo&7C_gC=HBL6ZYy8pJ3!R*}1p5<=Li0K1=gc3N zKQ@17?qca{8Dx<yg_cT7jU{5a%CgjQujK{HHp};x?$$f4_gSB?K4aZu?Plw5JJMEU zn`rafT5Q+aZnnK-d(*bf*4=)v{RsQ9_Q&lT?L8a^JH|W89hW<<biC*I#Bq@GFz0CJ zIOloJ%bbrm*EzR2zi{?<9pM`9DtDdbI?r{V>k-$BuGd|u?%wV^caeLp`&{=D_x0|V z+;6!1cm{aP9=E5))8M(uv%>S5=UvZkPZw{d*XphIhP~H$Z}zVDKJWd~`@MIlZ-j56 z?^NGezVm#Dc~UcFbj!JNp<E$1$aCa*^2PE(`C9pIdA0n6{IvWs?ed}gxx7RENj}SX zqwzK4x2D6*A6s^^)#V`Tk=7HePU{%!Bx{v5YMpOgXuZ*Tuk}gm3)Xk7e_748Gwh4( zOYMK!`#Od@+>TQmXE@e5UUKYk^l_FsuXpwL^zoX#Cwb?2KlYCE-Q{CQN=@XaQl2ZX zR|Xiz7%wsY%DtkunKI4AmIc-|)&aJyjxSxmxq7;XxMg>VdxCqayOO$Sa$n%S%zd|e zo%<7a56@8^tH<jp_V}rfb3GS(uBJ}z_pJ4#dXMow;eE#Yg7;PLTiyeF$NLI=wZ4me zcle(1?Gk-~m+!<lOm@nr$mh$q${Xa5<eo}~QmE7@7b{OHA1M8dMaF95)y56RBTadx zlTBxvmY5zhy>04ZR?OArb>?r)eJsb)1O1juEUPVVT7I((vdY#H>gPi1D(fTGr>tLD zf3kM5^|cMOW!TDX({1x?%WNxb>up<Y-`o1yGwkE-A^QdPTkRX{AKCZV4UTL_kz<M@ z=s3-BrsEdJJ&uRzEt2zK`pdCSqqD?W=e)$Z!uhQ8Q)gG#5SPz&it94hRj!-pF&kWO zxIT9M<?8P~%01nk>K#vAS9=@1XL`@~o+!#o<9AQt{&@K~d5Zk4JWv^`j8m>s?o>7@ zpD712-b#%P#yQ3&<Hg3yjn^CRH?A|jV0^>4!`R(4(R7CCTGOqjO{P~(ADB|iMst}t zV!pzB7o+8Kb1I|bY|G`A-z`U2)2w5yW!6UPZH$f2tX*x#*gUqAY!TZPw%cqQY#-VF zvK?l3*zdHjwm)s(V(;ph=V)=<N-z1w(bJjk%y*vRJl*+_^Ak#Eca3qK#AvwDwcho% z>u1-YZpD3~JM2E+{eruT=LpY8Prx(JbGzpO&y$|_JOjK2Z@#zOJJ)-s_hIik@5|n| zz1zKCdHeb@d_}$~zJPC@Z?o?^Q4h=5bBEDe9wvL_N_l~Nm3*7LN&Za!lREJz^OZZ4 zhoDBkDt(Rfj5isdr3Q{P6`D>nU17S%wAIwzoM9eso?&h_-)DXiN_2_EVD(woSzofg zWBtZD+qS^gY+G(S+@5Av>^b)L?cdt}vJY?^>&S5wIEo#U9J3t@9XB}caNOs3)Un?2 ztm9S3r;cA}<Dt$`PPenrIn`O^Jk5Egv&FgG`IPe&=R3}?ojqNHT^?7Z>onIHT77)# zn(jW!eS`Z$_gC&;*m%~*)1PrL3c4`bGsaWqsq<Xux!H4%=V8wWo?c$ro9DgNyTQjz zpsVygKR_NO7s)f_i{x!`7bRDzR?b$IC=V;|D!(iJjl+#u#?y>X8vimD(e7JJhg(W5 z^_JT#&s$8^v!Hx0(WeixU1VEmd&;)Ow##;$UA7n4ue5Kr@3i-G9O<w*B97&byBv>D zwo{$+oYy%YbiPO#hP!O8$*!pDLf5tQ*XLc^T)(;wc8_oux+Cs0-RHTNyB~C~cW-4> z|LpEg3!mVzdro9r*HD^8o^_s=J@0$I@a%%t_3<9zJ>Ki_mU>V2UhG}uUFm(y`>yvF zZ%^M~pT{>HYIloogKxV}TFZP(pEt<EWxre_&yuf`m&vQ--{b?8gOwwdk%~phQBF~& zD|O0c%C*XBWgVlwyK%7bWaC2Pb;etacN^DG6I+bijo%q3nwFYAG96_;&Mcc>Gk;<J z$-KvWv}KfKv}L*_Y&ioOaGm8I%SOw~mJcm|T8^@&TNP`$HD*1>+H73{t=wRJ%{szn zu}!v}Z~K~h`^z@ieu@2Md$r?d$6)70&U4+rc?NoydAE7L^Zwxd)%%CHi?5rnx38b? zFy9eAgYQ_Vd8W_ov-`Zh(Y~?1LSGrw{bb)XUzKl$ufZ4do$fo^x4?Iy?{eQl-_^dQ zzU98#d@Fscd~1A<`quh3`kwc_<lE|d%l83w^SN(_=n?4o*h@kk^^gyS66P`^EMh)b zBX5+qGY|A;hCYsqR<o7yO1W~9QmM>TqRL$5BIPz^rLsnOO?gN8M)^TWH4ZhNV00QU zGc7h<XIgGrVH#~-WnN?6WX`foummh~Ec2N?w_AoWbNpZ(Yde`y@{R3x+fnv1`xW+U z?T<naw%Nb7e{cW8p6VFEY&pfDI_5ggb=>550vh<UV~^uVXQtEc%yEuqd@OV>bKc=x z>)ho0&3S;Uk87lB2BYH@D8={87>YZ`9fMLVb^p!`ahPYCXEt-gMV`k!!@OfO3h^5= zLLc8zKAGBl)F*Az=c07kA{Rg%@00r~gB4lHQf`C_3^vM)h$Ya12aT^AzcLOtSxh;m z!Il#&QOh}&dDhFVzcc%}Y^N|1jP?udi<t$#u>WMwa9A9p9Zk&n4>?|gqLsU<TytD6 zlf&-rBbe7OqQ}4G{@zU+FcAqE=M4Jh<MKPuqT`jVQ003q&svsRZ@2cgjka9{RXNl? z&R*}F3&*h8X>nzd-ZIx+t{tx3uBY67-)XdFinNJz2FeCGORkmghmO6YJY-sL8f&hA zgK99(HeYPsVg3`E-PdxM#S3TCWVzOIzomzLp#5ljslCB|vqqgCwLfcr-Tt2aAZDS> zj#Or#LC&L{Bb|!V<;;RYUF=-reA4-z^H1jr*ZolFO|CCoUED{zM>0>JM$O;ke#ZT# z`wRC#kI9o8pPR4r+~s)=TK$u!yLYg6lsCsa$y@7P!|eR2_jq5iuLc^ul)g#<_$bDM z7*=__JWXz-Pu?IuByW~KW!xUBq%mI4R<2N%D-SSty{&wwbcJUeZgd&L#%ANK#?{76 z#<!r_-AuzwX44qcWYY}OeAD%&HH_Xt<}=I=%W0NJEwkZW2GD9(*f!e^vRBgsf3Z6p zs~m4QMljDValYU@+LhzF$n}xyK=(=T9M8D_aF=*uo<}_gdu`r3ye8im-$}l(Z@%wJ z-zOr^h7@Tr#$c$-mGW!y0HsM;raZ0mGEOqiHZFyNWSAC`hgVHsoA#IvF&}Ssn!C{g zODvl$J*?xc_ghnK!);BrS8c!8uCkACZ1w!^IndkJJHUIScNjE0%UkTN@J{tk_nzy$ z$@_r!Y44lxc)xjj`Hq1qjP{-A3qk=d^j*a$e}f$TB=RI9p)$4)ln<9j$S!EUU%p*l zE00s|RbEiOSLVWVU2pu@_y=6@F($W3HC=7GlR55VIGlr-<qOOc&C{r{i_O<D*KITZ zLXM4=9Lp(|S(Xbd*Ffnqt-02dt+mVxEl{|-nf1T39%xIqW!p+@r`iIx2HQEd^XR*` z*;d*fwmoZm5vn)bZh`MP*&eW;ZeK`$yUV_gp0>+=fTNFNn8WLs=%{vt9p^c&hyQuX z@wVej$M=o{oqe4SXN7YH{K3VH{rlh%c01EtE_miSuFGAIy0*Ad+ymXC-ILw(-PgD` zy5Dhk^9=ULp0S=O9+mNbKAgfv&sR{`;ofZTDR4%cyq|gd_=ftda0sezHgzXH_Tr|# zCd*ayxf|t&<>wfUKgz$$8A`q~70P!Bo4*e=TH#htrMI1HywbSRxZd~~^>?JnX&Psm zYKoc8GhIV1K4W^x^sebMxTQhVWRW?9Y_ZUMhxrlnOUxaAz&Q@HSS{nI%P4jE9o$n- z>tJi9HOD&9T4O!KdWm(Jb+z?*>xb6Qt-nyG18w7>nsb<UZ?HXJdl?BM#oohyn0<)d z2M;;NzQlfq{SEt<(9aQYkrNyZ(9WBggI{ud?D*AjsB;7(cN&y)p7VC+$Ic&|eO*Ic zrSKH9T(`JZyPkD@;QGNe$nA4ixNG1oTHLp}H@V+;4`B{I+w-*NV^50raIeE#;GF?) zwT)gk7|zP;D`nI+_-^v8^GT&Cl9{^eA`g^H>1XF4SFC`VJtx1-O!BSVhk3S^aeEoF z#<R+9c<bYgZuo1}*a*kD-1q?8=6lASaGQfnnbhP-rl@HF{c(lqQO3-lro$L9Uh@R= zJ?58@0QZ;&T83Mknsj!%Wu4^!>oL|!=GybES6NqBpSHed{mnYaR%M%Sd&Rb!c~-IK z+iRfB*V~VF_#CBh*iqz@MNsCg^sa-PM>%V$nd_Yoz+1mZ?O34JA=f#sC9XSMPr|Fb z3b*owtGD}5jbBmS=eVzR-{pQ9US+rY5csYso_fzYo@?N_)_A`2{0xN~?)7>nP+Jl2 zE#8N`uh7@}`_kb~ruxqDJ<L4(h3`*fvJ@#5JyL)9c-b!3%jZHlo~6g_kPV7SDT2=3 ztURG?M3UX6e4+fJbTjrh9&I!-&lVuP28=O!;AO_Uj1R%3zGnOonkPo`K<J*y<TH(@ z4r}O-3rsCgzq_f&XH0J}ws$~(dYcb7r<={@ETrR8=$muR=bIOqmz(c4Kh8*h53c@4 zWNgt#M_GJGI3<>emQ#_0W0tv=d6tVU3oSQV?zB8&S<ei$+473zb0oxJ*3s5Ndhe;$ zYFc8k^-=3a>x;C+XV#-_V{FAX)pok=0^0|+?`RK;y~ti=Ka=r)t9=b~|940~M<O?h z8FQ+m2Ki^UW4_~RXu!>m$B`pnbG!u?@D+SOFK0ibp<^^@q0|{>Hay4K?7WlN=ym5e z&L80iy1EW=8C)4iM<==_xm5Uqvt7-u<*s{Z$!CzNKXL7J{o(58KHPmgGDV)d*nO(I z8VUO{B<x$=kHCYz?EcdI6YY8oJhdANGT9UKoCXJRp{K=jD{cIk=XK9Vp6@-sA=4fP zb@q4*y_3BGZ_Im^_ag5#(C0g~Hh<syt@kImxWk~)BYpX_ebjfU?^fS^jF*>u@A$s* z{fr!(BIRo1roViQd;(N@EYf)Z`TQ*TQcX5_NPb3sMSh<#v>R@{JDiD8aVcXMPgP0; zPHd@ii?TvlMNfH7`BK@*j5EwQ4i0vP@qDP$8sk&+if*QUrXx(3Lz!+g-9cY?%Jib? zEz_4s_e0F1%yx6Oxx`#=KHI#~yaAr=74w_)fZmn?mS@m-Y=xiAL+Y<*Tzzj%h2~_~ z=h?5L<vz9_?l=Z&v(wQ9{-Dx%BeLmgxRV#1ZzG|84|g!Yb&Tr-`2HMM3DR6O-2WZ$ z{)62X_e{9{+03iAx$j|aeF;usisxP=mLAM=lh9+#_0IQR?!6NJ;7RWW?`H4o-jCq$ z_jr5w4)!^i?<$ezFJta~R?KrvDN;Ih*j-Me{&LW4TtM9|k=M(w%kRN8h|v^)$G=9o zLAhPIAFknDrMGba5^tq(F*D#t#sx^XYmskXH*GV0Vfu;VJ>AU%%m&7Yg}Ny<Pc;Y4 zVe<{p@As*h@6Em7{!Et1aQ?NH^DQlK{<m75LPFYV`M~lkW8q-5C27`C)_kZ^o%KxU z(j(T*(DCkQiw4_{Ln@wVn{B(@_N1*Bd{?1;g1woU@D=;J_D}7<+J{1+Cd2>Ea5Ouv zVGevAN$MEq@y?0Ne~r$woR2v-pfUQ@IRW{<ksAHc<wQHufL`Pd_fgDw)1ldqQj;-n z8nv{@cLTETCxYHIr)aY8A@Wd7>vo6opz@~j6LZ>0#yaCHG#yVEKY<1xVp8A+%1sf| zB6`eIrgu!cOkwi_=FR5c%>Ci#Pu0r&n?<(Ttfkg@)@!W~SdX>kLvJItFKsrv$3Dh> zqWvUh_>jHc9<|S<zg%Fy)ZW4zwGlr55BnjGOh$TzqslSIagpOX$K8$%@R>h2es>Ik z%QQPLWsYBg?EAAb#nl7J(Fi?08EwG%uJ>HqUEjD$+^RbS6~4^9#=RMtahH2ATA&>C zK$AR`o|&H87^Qu^1Cb8{-ub?}8EMk86e)|Y(ntPS9;9qH9*q=NZf>DXA2mN~9syrd zV!g@wf%P~zlXsjuohH|vr0IdKU*K6y?-L)I6TI~kjK#m;2bLrMJfs}XIC}^!$+wKK zlT5SF5j;#kdeiiw=`Yg&b0$1@o%vkzQuAu_5A+$KO`M1<bh%{(lyi^eaI42Ug&uMq z+}{iIjUmv<X*P#r8m;~zI)Osx6-YU|oV}563gNQfbsf(PJ<ENkdxLu?GP2Jz%X6n^ z1G95aZ@sq(t>1Uvzq~GAmTw#!O||b_-vz$wn4P!#K128MgKxKx_|~SNx#ymIxu@J; zK1@Cuz3gz=EKib8W(JC(jk}at=mBQ#=g|c2L;@6&@^OqHuTlWb>1!NlZnod+c;B_l zbvJz02T;mp`1YIN+@JNmhIIL@?>8|fx1>nlU>wLh(qu21-#Ym+`3z-&a;b79<M0#s z&jH9*LyQ(<zHvOd-YT?D7b9gog68QB#^jf1XMfiy*U`*kP1NoCrqAJ?zh`{@&K!1t zxre#0`4IT4qs&9iBg_tSuDQ^>!t#LS3CkvU(|0VRta;Xlt?9N4;R2qrZ(@AC1I_x{ z{yJLNj~$bdAJbiTGAF#~deilS`vkb_Ip`<P_g?C4hVopCEPe}={2uRv=#-vBtGWp~ z^s4s_?|X1SpF-RJ@E+*vE6TbpMOzD*3N`*#*>2iN>-RPvVP0Uq(tNA=LFUwrjGe8_ ztDl&^LH6>XQMr>`9&J4yeW8PSbDZ@da<;?ur>mEH5c5)|rv&|0E%L^ho&}yuJ&Qd{ z>CrEu>-`d4SDKf1?$q1yIAr!!NJs1BwaRzsZ2FszgxkCh>3hBTRe1KUmY!(JkEQR~ z=zS-m$vF#6_5+p+?DspqbDZFO#@UDYve0!ilH^lxfOomy^7MnJI~QH)Vo^3$$1a7o zJ_;@Uo!&4;@gx7=r)*GOMne4=ef?mgVjK-WG7D*9DLRvt#>b2wAXRiX9c~&9FK05j zOj)L}rV|+<DzexaaK%5G`on=_pv_;UY0<h_##kEREN(}C@`~j%%eU~ueXK*!po~Yl zI2&#Ag~%5x;VGVij(&ucvCBHd=CJvYGbTWHYHd;Ej4N!9ppp6t-O2#_@phBF#6B4w zW2yZ?`}6h>?7KOt+0D_{F~BhvO`Pgjf^56OaX&ordUSAIojs5-%uc6MbyhoPJFh{; zcoO}>$Ifq|w0}7db{*+5xg506!R}++X-K*kA?2=iKk9zn{gHbII;(D;A@B<pIEM4l zSKa7YjlA&|I;$hSir0q@uEJaCUFf~v`>3X$f7SbrrlI`7yBiLnr>{Rc9-*%{`kc&e z<9u~!axP=^uJo<;y~mh>dLtKik=~*$Qsn`RsgdX}N6X{nGPIa8<kRF!<fTY=_i9qh zR_48r<y~mHQj{Lb5y}uHT^Xf}W(1eQHOy8nP%cNeaj(XUZ${Vf9{qL~+P?vC<%-ck zdzK^NR52@@ZJbZLE}~uULMQx)aWkCeJ8+tPO=;-FgS6%f)BR`|Hk%x1g{MGKuZ53% z6ba{8O9nl?%yJTZ<C&K8kaTafY_ROm=EtL;e5b;z3oZF`=*2#;evI~Xm$e7;<51g3 zv}9h^RHoR1wlFeJlkF~M%1yNGJGSlUjefNWeZ?@i`f4;5P4*k?x7+Wvzli+v8FNc_ zhXGDfL4#Bs=kd28L;mIvT;uWRm`j{~X3=w<S37TFj@jb;60Y%g=TMgy{-nXx<htH< z8@%F+=+i%gPwY->r?dVr6^`W|<e?EBr{`2pwI@s)>)Pj+;RJU>ferBd3Os*}rjxwc z`#3WCi{2e*^1Azure&>Y>-<pVi_p$3M+VsF+kzHur|(zRth#95i9ARi1SNK$yD5bp zSHlCIF3*P^FP5*CS3;53p;vf^6`HSDpV=dKhcXXRj)EKXD#aQ%7^Y><fCgQ`dfM%9 zgipZ{eu(7oE2Fd*t7;}Bu3Td=8VSE~u5p3!Qez8q{`JP2jkhyuS0l;3V0@dA`z>_j zK;(!arV&WB1*S6O+JLFf)CdQ8yXhg*I@8Onf_#i@+Y|ab%xpFL%wx?bo1?7IT?);+ z(R?p+>K5}`=I!RMkt8yZbo1esRH)BvdcqZ!o6rWXfdX!{JZE{I6}41rAM0V(qpioW z#$<%6@FE9~V<lypb%ynH>jLWy)?4W-o2*~LL-nSIoPg$Ls;$yC({`@yV%s9tR35NB zhwfxMWB*Uv0j#_YgG;sA$HIrG^pUytbK$VAx8H`eA?AU%(Kq~MA4WgPM%P%O$s5ZY z+tD%}=oG7S1~gqZ`bx1ghNkN^=ey4B&aaq>ySRF~4t5Q44P!<wa!o`7cbV%-*9}M( zn_OFw5Pxv};_8YXVu<@V`ivXtq73a(rMr$<`)qeJnu!(e2i%Xtvkdi~;B`S2?(%MA zjp|o#im!)nh_8fkKg)MM<Ng*#{x;vIqIaOj>7waq50HByDLRl3rZZQcDLc?g9BLed zuKIS?D7<JTL$uL3=wNR)J!#qihySDLSJT1fk!BN8UIT4&m3am0R?nC}HSaVZU^&V% z6xnX3WszkSQrw%CZ)k@e@U5e%_cN`xSl1)JePj(fpJ0}FgLQ~q&Oe}o16g?*0Z*Up zDu5rm!gV#X=Qd=j?(Tz`yK>+|=W4X^PWSy##?R4k?sgyOIoLDEGf~s#htbA}HM&R8 z>HmSG+|N7II}N$1h1vBRZ&z08PDZ00rXJ4r-S2zc_cYw=R&+C6#PS9F+d$+buRKPc z3ZHV5{D}M-)ax5&qCM~?7NZw#qSQDAy~2yeqnLjzrfgG@X$q9;G}Bq8i&(+C3Hj#{ z)6=F`;3vL>lSnlmN*^AHG#r3in`OQQDR>Pt=eMlxbhjLA8Depu;~$5He}UyP%W~$X zAJ8}SwH|71vaYp$&1%RVjj#XG_9K1oK>I*=Au?LpMO$m0DX(NLai-C4zs&xf2lr`R zv^_BI%P!j?cAoiwY(I>zm4{6)S+F#9;S3btu$7CfeH^*Yp<=FY*3-&kP5fzNfB5lI z^XD$ymvv!(2X{@#N6P8&0VhH+wz*G7C%I7L#~$~+j+FT+oF9Q!>GODh>hD-NTRv5e zLR(sxF;=tk`vUUim&_J}lo4pX3!x_U$~ow2Ze}&?5#<@>E9&<TB+C<wr!Xg+VY~>s zaR)k^SB#$;zc%(Z{XfN>d3;Ux`tLVM2!bF8rBV%I-g~dT_gZ`HDJqJpiaA<CXsD?K zsWENM^E^}#6=PFlR1gF)))2%{G-!hug9f3f;rIT2<Mh||_T1mO_q^^s{ijZQnq;r_ z{XWlUdY+V0-c&T@T{MRXu-X`9qOwBSj8}Rbzc5F6rWB{!Tft{-dB(Ap<#hdh)Q3x! z+m@>MgX7h&cyfhcmbEpD=7bG(hBpkAtYHU?A)W4h1AVrDy@<WEy&~#XXL~=G!)W^y z6rAs24nNp0q2s)=`|5#uO`Otq^p-ej-SiRqSbeVkHJaBJSm{~)Cu;q3@N_wDuo(sY z14kRwf%zz4X`t&Dj$oK+7>;{e6oF{i>15}87^?844mlq<i@9o|^|U|>5H52H=l8Jd ziYo`D*2i7i{T3>%3*WVayBGX*0i8YrSL(4l(BnZT>jC$VrKd0UJOqR1zl&n{aGx93 z8&APe9~-Ng>QTu*lpf1ibo&RUa%epBWY4|CGcHTVZGbY?O6g0#%~T#M)h#jL%RTT> zZ@9Y28jU(L2`0Lp+WG@b^d7yo04LQ25B<OvZ5w8rWSe7)$HP0%y}o5Ds+LjT#+kOM zVJNl3sHJn&#p+fyjZS+7kLsaJF}x+;imtWMI%(atFJN->wWX-GXK**KX~paTxSREG z{UW4pGmLjK6Ku8AzRJGAzTbWVh3%64y8V&;xxFU%%7Z>|go>JpTJxJ;gg2o$bVnG@ z=4i)M$4<w7$8mh@+pvpnFubwODb5vO(u>Zk)R8C7ieRidcnXbO;phb)gO10z=D8NR zmbunaQ4Zh{{(}1EgF9Fsyw%D5Df-(Ccbt0_dQ3Vh+zs~&x3@=V<|b6%cKE{L7eGgI zJ;s?TTPpMPmXh$Oii$PZwis5n-Bv&?Lcghx1M@!m>qK=PE_N|(483HlR@km{@-lI+ z@7s&I%E+Ion`@wJiYwW*)3w*t5QnZSSb7|{G0C$V9!53KDrkrY!v%oey7KlD=<7d| zJ7|ZNGaWa6H=f!#(<Reo(+yJ&9O)6L?3KyKT*O?`T!va-8Fi<Ixh^P8#qnrhZUlE~ zVQx#s>w=omi`zK}zu|L~!3p5DS)89mBso@^zs0>u!OPr>JCbfb1;e^%&O*7q4d2f* zKcnM&E51qzr8KC$l2TQvuGCSCijDpss)TXsK2X|lw>vA{&=mWk3=CFc;bh~L$#9)= zmMWIo)XxY@AIliJOd{U+0n24NOfh=P25Sm^{urKUAzNv55f2H0ezqa<B&MP%T_z>* z(pC{P--(X?nK}YxySP?X3(`WgPeFH6anv^OwC{lIYLJg;je6V1-if<C2A^gzclti* znYYlg`_hfp;IRGRNXHp}iWX801~mqpw!xL_@^S~e>(FU>xfkOY-$PBR2qtUm8HOS| z3*Ur8kXz8ugm*I?ziAaXI?Y&Fx_~WAvv7wqsextXGjGk)9)ohU5KO#LKG7dhUvtfm zK~2S}gu!$j2YHcR)WLaVkoKS|-GvcWKxu141sp(nV6kL{hf%Y$EZ1>XURX+41FY51 zm7H{&*47SWnxg49i>(_$%|D>9KD8FZZE0)!2u3szMl=cCC4n5$R&ddAe1dDX$F}FT z%4#jODeBT^WKEW;>v3E%)u+_fYIu_^sjE}8IG*Kx*k&$Col15GZ0Hkv3|e>sN>jQ$ z$Nmt%;HAB!URJM;7URNkZ9^^XBfW!(@S-JpD*j^@D!DheH-y{U$?>UUlw*!#rDLn( zFm+V?mO=3xQ%Dt^BV!<VNLi{|V^b?rglPcmW14A>DGrRf&XkHrd79+cLr|(0r@XW| z5HHWkx$Z`v84pHXY2I#5qtl2i$|Dp3gHn=OScCJaDlU4?`${LyWIu4vL?wZ)bA-&o zRdCNs6oO)wa_E~MqTOYX>$+trOE))>R~cvh%9;r3*=c<U)AY4Dz?<Q=sc_6BP|p$D z54O^3MYS54u20ak)`Kn&s@HL=P3YEL$vRxuZ1@Q8(}}uq7Kfo#PqVK^r@Kws$wA(! zm;Qx52kmC3ehKbagWN-`W42=p{`4;-bl!HV_@vX}jxJdK5IEu!m&M(}J&qhhQBO^& z-s}_S(ceq*0ynO71l3{?iH+%?o<-<0JLuTI7|WOh25iPt?F9D!(lim|pMWy88IL8M zG+hyM6>~68v$44q3|-WR!K8cgpXdYg3v&^rK4(?uDT+HiM45tD@D(|iUCLqQG#LM9 z<pC(aFe-5k{HwLx>mB%4S8=c&&~pN;fz~&{kRjGOR*O}`&3p$u`97z&Bb=`nO2c^T zRFZS6tm{x5c1d1e7MCjwRzC<_zYMSDB)!O>7N){lsIV>Z3}a;<TB~kU_p2AFwt1=_ zS-N0wK?8bFUu}Rk7EZquR-X=%&xY|8pa<1~@rBtt!s}z~Q%M!AkiNl5nBP54b2<GD z&hk5C2O{A2{owaw$=)s0m+MI+@DA!HaDA?EqJPtU!S`=EYB($;Zr($6jKl{Tj1x2! zFKD@AE$a0a#}3fK0bHRIVE!L*&aQ&|@1nv!$Ac{7Eavogmc`+(;tY1ybk=h!PR;2e z<<i#K(HTWg6Iqwp&TpJ+(Y-G?eOy&Zx<ry?T8y`_+jYp5g~n6BT@+MY8x?8^8k0Y` zVG_Q<Y818%(i?&`%Irpvm-Kg=8ryL;rg1X9K?~XontOysS)7wG3TNPy>8N=bh~cGD zl`5^^>bA0cM1E_CWu#>~u1~yWHGD0FihUg2|5xcuhFY7V^L|GCS&3446mIaVwWO`C z&1!Sv_ja`nK#!ScTZCe|9_=^H_B~AD3@rWz%FHWUAn&rd+KUP_SJt4T;E7A>HT9Jm z%nh<@t-*HVz{B7027lB1$P9&0*IS``_O^dPUShR<6P4&9eYF}I%zZqaG9;ixeP6`W z-%W1lg+nl`hCEe~3GC|}?wsmuN$zQr>m=R3KAnF$ImjdKpWzcd$Q5kDZ{a=}^Xrlq z7+5!cU>sq*tK?YnEWcT*a(3sSi><Kku%^LD&sr~1Z(mvq+sfK1;%u30Hj-`4!37_K zqhhJN>%az?s1`5rX5UbQ)leL+)*ysl==xJgw=BT(PR8-hP=5qV-B-QoX{EI)oZ}Xp z;_3LcOSBc*I_*1cmv&q`4Z^*tJ<y(N1?`3Da&_!>obYBmlaK6CRG9Ic=gqiam%zBS z^v?Pq5@MtD>GZ!v<irl^mv!NI>73XIM;Av=M}MBwGRGd6*=@&f<Vedn?V#FrJgd>D zRvXDqUUBAtr+i40)^LTon&NR8+@;)MIJ|xE4W_$)f|GiC%1BPyfduJz&pfh|+dap` za}4zoRsy-IhN#B9i~~uLCV^sa8m%Pg+M6P!`tY;qrOAp{*_paC62>s!oB#^h3jWBT zmS@o|U!fvZ0BO`Fr_qp<VJ|AsWIW$B@UuNsplrJ4uZll9VMCPNj(9NRVP~h&QGaFq zS|z$=19(|SYj<luRHC`~DO;opkje9Y40bIppSM-haadYvAL9TI*S^Gs_=;yQp8O8& zFwg!RDE7AY5Oq+nixBFFj{njDj?srCTP!~MWcv&h`2=|`Q$Tzd(F^Z^XbVwQjCx0U z;|%<YgD{LN9E(@f5TOv%av0&q3moe>vFFK=JVV<JKp8MO8<1q|ivKl+Q+u48Ob^#E z(n%}vY;s&L$(JZ718v=%-QT#AIKeO7Ry4tOq)mpvAQqq<C3&`a_EHIc1X0T0tQqbl ztYpJh<1>0_F*NmBXgy7-`5&1Ff(9p1^XI=#v!#<^`iVaJ%<P3HSOKJ`NmkKS>7fjh z%q@}npRDXu_Tv$rr32jK4OHPBv?mMFlP)mUG7Z;cIo)6<8uL-h1(2S>>TfNNQ{0Ly z>`?Ly^R3A^!xu<=-Fw|(gFr2lsQ7D8<V9NYtnG=dm}*jWat&=zaQjOoXEmL6ulfVk z;+a}YYtI`SKt5~*`H;K3p<?7GBk8u2$WSgJL%G?0fVc4zm?h6Xo13tXe(U9^#!YBU zwqZV5$!)kMc_<V9`1T69*sq+6oLkXfe&qb;f)ES3{9Pd^wi8@4Nhc-ar3APuyX%sr zZbg1}3{Jpm_pkW$UWOQ+?+Cn{g_Z=6+g{K_HlMl>4tWTO!eb4yHb?1<1X~OtQ#D;y zlW$2@?XaGrdS=Pz@SKcCNn4;)xm>6$t!)w1(*C&R6K&IMUy<}$OD#QM`%zZXC$<;1 zQffKyTz$2n+5~jmO&tt6o}tEZ(zm0BUQ%zMhUTdSwW69z4rBzbY=X9lEYlv?*#$Di z*R@|zx(c9sm$C=itD<)qK`mWCd;{r`U)#U2@35b=U*;qiM;*1n&YEzZyQ6x|(pTtf z_3ipz6jIR_100o6zu&>f?Lu|=k`(7WbkYruR65})FyC#*1?MXqvs!p&tz11^BV04c zr*C$Bk7se0%%(4?DYv@`na%d-;62^Z?l0V5gLiJb3wg?VR8KSVOG7;iIo(3>p~gge z8T@$WC8^aWs&y~pV&gJ$`}^R^_l(b(9w>nm?vT3Ya8kRoapMl7QTU)>*GIkXXzs_! zpJ)EsoCJe@Vh&R}sYS^S)FNlw0A(+NtZ{!nr^w(Za&orl`>CU+xWU)-duRj&Q2NT_ zUW?D%(h&u|od|*xS?g7fByjF7GBfG2``<$QdggdVLb);>zYhArholK6qx5~}JV_2o zoU*MX(vP^#l3w+qt1GyYL-6ZnxR;^-CDW%);|2VRPF#hIh{+S?8Auu_-m{e~*GbPM zk71;j;R%l<0QFDkUW<&$#vD3)Rn!9EXdg5kN9FY+r`Sg7GlRj+Ghls*Fupw?=S*DP zyXId(&PA0nq(kc9?lw}|!shx>aVID<Np~+t72AS$c^K4p1=RPOQVd-zn0xQCyo&?g z!Sb=CFY4H2?*2C*g~t{nsqYDJJ8#<@)X^GbEe3&dg(A3s-m{kObJmf=V$34s0&CEJ z8lZ$mNgXtf9&`wXR=`yh$0SVZ>4V^DTVU|#WJW8N?!yP3=_P&r`Y7Uq@bkB!cz$O3 zoYZ;(>^Rp{h4&o6TaJ|~_BPmUCOoVFpE6Kt*ZGw#Lb^^vl~J;{EG3(jLU%cWI{E}` z8weiiOaf*gl}#wutI<=ASbo5#d&K=NZw<26!s#DujpHVNYCERB4FZiNNwfwJTX2AO zXvg!pMYrh(FG;6V)oYW47!EgG&h6QUfAox+RFxD&Ge<u-Qi?n)zNAmy<0<SRRTzlF zw-pbeI$FgP@Lsa}doqz%nBNG%H>g44SNF6=6YWm*ABCGA2M*jog5)4x>m^dWOfw{S z8M3)6h0uq^oQ?1h-oZm?i^|s*XK1)_qC|%)NMwBnt36;mjz4snWZM(zB2<Ls+Hr>> zOkGXA$t_NTo2?-wal&+#<k2<LFL*;Q=`4QcQsj@`HrJuMxbTSDn<JTz=m$@m08d+F zUQG_^4Bh3fxu|pxY;^UeC<lF*oEQT)+kzq}QYSB!!WKV#%K8=unqW_oCo?Up<WqkL z4}OEb-jHfKTGr4+I!PMp^m%JGb12W@Y5}$&TOEGSZW#VR8+4l4_(%eS9;R;Igaa2- zgJfT63L5J{#T-pi{TuR!Y3c!d;LGS*29k4us9HK~?n7|FKypZnwDsCf?Wjazd0IJp zZE!$GQglN>r17|fC((Is!;QUkKfRJ(O}Fap$<xJ<#+XL$-$eKS5k>12O2iwyYYU22 zb9iwN$sH0MHylaMG2H&vRKD5nc=Grn*K(Q!XE9Fz$!-<TKAbs)UflfAo+(oQPv#x} z0NTIjp#!1cdKu31H$Un9)sqT%douhnOfXENHm)MGy_*T1^PsT%xPE0#Z_1odBhvlR zI6@oAksX6$7r+M!CU@5kcdx(sOXjQM@Z2}Tv5(;F-2oYtl!%}idXMmYK1bvEiqy~s zZp|Sy^V@g|#iipTctkf8pAjH}x#$@}H9v@+aZ~1FEO>v7@wvNz1BPiu@y42SvNO;_ z4LBVNr#T(;@(eB1OT@1YrN{|Xm9t5$NDsz>D3@^G(@_q}nSz<hQJGe0NwtqM^*0TM z*NjJ17asIoQ#FZpno;?>oBNO<n1?EpYCepUb=_PF1<Q?Y)m2%m48;}Sh%=ea?Y_Y| z+e2RGXX{PtC+MQPU@&(%I|kIgG9+|rs%9L=`>4`o?TtvI#@n;(JM`mvN3iu2(q!x4 zA^W9AnC<B3T;jC5uDddsZ2AK2eZA~pCp|xt@gs$s;U)83UPeFMy&6U%`SMTkE%xE3 z-{c0qFcvcTo67OFsxyz!6eq8<sk>C)=aVtn##_szwpZdazQbFKVn%1Wtn3>|cJ1X; z=ECADNd&E<40l3z->p<b@0dlE-oSj$DN7X)N_#5UYB|4_fy;B>TEbQypQj#9TO*X= z_O|X)ksC*reLhaxdNid2xUtnxhP!cVR>Ml>@eKOwgY|JZUQ5u+cfo$oQ{P`WDmv>r zEzVFpt{Kj`xLZ4%$53nUIA7q1mv@=S&kcj!&XEa*tsvYgZZo><XYL8;aO;`XIqlAc zr4=P5*N{`u8>TzUvmAtb#B;%OHQ)En0t=9nEN`rf3ep?iHWseCgq;3%;{#)LYF8xB z>@(AF^0_ljOPNhbAq{r|U;7%)#c$-BN}0={n%0q3OZ1H1GQB%q_KgiFqX%(5&ydl+ zA)luY$hbPHNDEw}eyE(2m}yu+_1X<15!K7fQl4yB9au>dd^K?gVnK!?C7po3w%xLu z4BdH9@m(~MBG%HcF{0oq9mtEt;v>yK6Imm<=1I8bO+2Mn^ijbzYm*3RfL<SA>m-rk zINM}+w$S;ua7NQ@muy#T55dm9sz1Ebtg7THV{ky@@W?lDW`98MyQO;JrG&wG`r)An ztz?ImhChCd`HII(Bh{i~EeAgzmZ{2H_Gc*b^~m+N=KX%Ik7vegHag#O-0=-)eS0|f zr|Dz2Nk#pNnpFaQq@Kfu|JR<W3(@muIX1y>uH$~bWLi&5pefD{oQCD3Dbt+~o&I=# zAyTvNMv5}tb&VMSA7*&!x~*Ws)+n+A$=yt0c5wwYVyF8OSg5e4Jef%kDf@6v#RwD- zk%FL5<a!x8((8PvgLSEby=3xXB`(%c;{{OBV`D|r+ol*$!e}tzMlj(Cw8hf+f??dB zR&=RN;K55$Nvwun)soJ%lEltqsTQ_@Wex@jWZ{q&M7^$nx>XzhZx=pFbMD1aCil8& zpYv4b!AcIp9kbA-pE1eiZ+{csZXwmy3<YYU{h0j%iPc;%L18^Wq5@534~CL$JBp%F z*x`?+Q49A&xKQmum;>=ZW|2G)b>%ll33#IF40m=%FIqy*WS27o){+Bes*YY{0X4ND z*WQC1!k6Sy=aK{4gnIM?6JK{xkBZ=`Rs(UrC-Vs7aX^;SaZ*9sg_$U-<awKC>q7gE zgj0?NQLMrzyvft`HuUA$8o&`%jrEul?L-p(Q+muu5|!)G95ZnVAAlPC$%J)dhTxGY zgy-5DmN}KWdzJq2hSDD8dnkQFV9Jf8j`z_u@<5X<EP<%6HLao6M%EADN?pN^V@QQ8 zv@S>E-a>xz7+fjadJBKmVDn+(v=RxRT6B8hU$sVe>P{|xEWW`v%x<Kh(|&KuK&icg z>Qq?uqiVlJ-`AKuc#q`B2yy}Q$;z)#Q_*1VsLxRmD@hgHAyWaJ$&L)>Rz#!SuEs@7 zWAa0=`ht2fy&{VDV0{9);>G%U<`ECz9R4hETxr;4IH&$|-c%e_Fn{XuzN02@s~Oq( zMYvU`ou%;|?5^e{wmy<M)z7JD3(3dr1hZXXMp@3E`g_ZB><_nT0IKf+!i@#vuEcjZ zYCL27iS%6_eY_|c50R~!YF>cLpG?g^1;X-{j%y923#?tFG!w|*oK!CIl*?Lbl9O-D z<i;paRWd&74X}Deo_l9>lBM*#)7Hy)F#)#9)O>-S;%&=Ovyz!--Uo&fdhBJ}GwBTq zcHT<;LX9U`kxOb@C$l|POF}cbMe^5%<JSY<U?W=H4bZPR<qh?=%xA>$%#Kns?xKcN zb98WYb_|CxE@E0K$&ra#dLInzMOvUDO1R0XqvN%dI^F;@@%bpDNzUEQ>-3M3u0W}d zdgvh{b2Gp-+?5EAI!)s74z6nuounIjRV>Q6$XtsK{0P0o5ai8PL(wndaB_qTagZk} z<`912>=rNulA5W{RGU!F#q?hciMIUC@eTd<Fp8-_z4u^~1<Xb9BPzowEix4qj?>l| zlo5l&HkUWDnrf2D8@Ygw_QG5o_v{TihY3aHeQv=gN`Kt&5%?0*P_-7*L)O4N4x+1^ zL)m(uJf)KaFiUJBhu_%p0sdJRG_Ky{XofQBKACh}JpS%#IWuw&#o?Nzu<Rva<oG_s z9~uV#is$YKg*KBO@+*@>WyloPv4t|H-4drLn#r8;xEhIc^h>0-pQ0$#P>raS-N?>} zX_5tGXSSiaoKVlB(B5Mv&l|P<Ev*(aoqc4oYKt}+C-)MQ+=aOrRq@vwb30~mH&&sZ zABFq<q8EZIzYXebMB08LEIE}Lc7{|)c~tP~Fya^zA=|+P56FT9Fsmx^Q<Ge?;d}R8 z4rZI8=mF#5!;5ihH_!oo@feKWhBmyzv3Ny0Oyc>wP_zW&5cz|#IGcjs?vm{G7Ft$$ zo_QPC?B}4>c=W?v%J-zXGjW3MQ`=vGSw%9kCYf9n&e6)!gRUK88Eu&$y|`6irBn24 z(XB;p&4c>g$2tlfD?w^F$E;WJ(kp?POg!0eTNkn)<9Vk0xiQztfINA<2_O*eA+Vzz zCo@`|jt0C94fwix7nR1K71sRe%MF;~`xpg03B5M}-FqPJaT%0EtL~=e%%JOj$8?iO z8U>?db#Z)4PY_;14myKD>R1inj;&D;dpie7rC|<CavNSkHaX}QPCs(N{ar)l^IZ?K zyn**w&|S>Ud|;@zA(>}d$W#(9t~p7-zHq(iu<4bkC#k3irzK(%=e`W*z7|S~CeyiX zz}CIt*`r7T#&PO5per0?%I*@LT%Ng*QcQZrZl>*oiaQ=3X&!GuXbQ=6fZZ^M6EYQj zlj)NuOqZ48UDV^;H{rzhfd7rLOo2fp<1Xz-QM|#7;$!^KU^1&M=@fl%B8I~U=Yg5d z@+R)U1HElkr5o`s=rtBM^egEm2^M&b>g7d_P{U7ZLo#$UdVHKrH5`-ECoh@zD~}Fe zmwMKana2)PwZZ7Zi_pz})UJS$Zh(jipooQ$z;4Z4(05D)J<*Gy=W32t%rPv-VXi^G zOZX2RP!+!*dA~r;FYjb_<UBn(h)L{bXzE?rN-)i}f=-ak^yvXof@Ne*P-F6OFw-Jq zz&snsf88bpT9gE6EtpX#n+m$(N>7ICFJrEXbs)SmG5J`TY2^r0EbM2p)Ic`FfR2E2 zFPYw8{`P$m077S9!Q0sd6VJgb^+xZh3!jTnK9&spTi(PuFl>1_^YI?K$9Spa9<}@k zBYM+XgPd>+)XObsw^yZO-;R?$jg;nIsz(jnje(>wC(~6oP&2$Z&oi{W%<h!4*R_9& ze|*~BL?7gsO!_quHT#4sn;DrBOvq@=+_ff+-w)ku5)62Sd!2hXdFmTr|5xq`QvYis zQ(q$Wx{Uo0X`aJyU!lEvOYCm|@4abMj80Nc9~%3kXv~81ZeULN7<D~|Wiv(KP&G`A z&@jf5TH1&zc7l}oU739h!c%tRf_7)7e<iHxltlVI<Q;?>CQ>zB@Q}x|eIlK@{6eY0 zbU-Vd`tfWz_?lCh1*d(%^kcrxJCH2cOy(cgTenIEDUuDr)Z9;~w}L}0N5?%wy?wxB za0NJ2Cv=EG_?lv7eu<i>ZdPxSA*n=_t*yD4fQ}$pBjzMx@x+7@@hw`!R;Hqkpy6go z%wE{;2fnOL%BG>ch4h35GFd#Cl+CxytZuWPLz~F6zd(N~i;C-(o_#kx8W(yhy7*dL zv|~7&IVe%JQ8R~-aoy**<tT|S*@!dT36$BJ-n&40LWNwxuDYnWO+lDq`hEcHZJO&V zGB!!*x%+S^Pon7xm+~RLbs;KC1^1gID@4jU4BfoFyE}7lgE-v+)6XMEznr(7%=<n@ zcK&DgO__-;ND8McCqBeeAAPHZrww!apLjlFhJB)(>q)@xTu(|?V5YMqA#aJPf@tsG zxpYP2Tg<d7pr<gVgj?c|cVcQv<e-NbzknZ3;e3ehztXr`^29xylhdePH^BgQb{;f? zXU}4GYPl(mZhr%X>nS|Zhkjp%yQI=-deY@bkn>nB7334tx@<hFd=0e<*%%kq?qkr` z1erQWqr!>QK}pM-xU42L#UnUXm+2_}=vl%IIm=nOjt}t6T2O8V=)#_me&E?DIH?KX z+1=pTOSWtr)Ti9EhG5vKcv|bJT*pzZMDOs(M4WI9cQD0}$DB}YdrRi!ghM6vNeKK} z47O2SYTWNhB|pq@!?^*s=n7hd^o&R5<4&O^+l(GG!XD^@%kl3H@??tA8QPf^;Tmru zKk!WE2SS*46{+DqsC--4g>n*Ir2@&|rXZXlq=3Ex)trMFKTryi0&u}{`!FXsiY%4z zKMs@U{{>{?Pp;R2??0bOmov6pTWRivhYH>HH4+&`x13L1S%<T+Pr9bp)n7pEKDefD zkOVSuQyR+*T5o)gv2xdpaPV%BV<}-TZ?7gZXpOiXU)cTON1d458ALv89LmFDy5J$E zC(crj?!k`4Omz@xJu5pyno*Uya$bjWUdOxVlG|H`>$VwnPUOWhsZbB8P$fKXuz{f_ zc_F7Kf)w{)&q#EN`J{A3LiHdz>@_)G<!x9?t*!ujs?XC6#bX}KROi=hR7gd2Jq3Sy zX7nPDUzLptO+lW0WGxpO{$}dcS<_V#U%%mDRHN^{L$a#_DVRQFwa1XXPvOa*V<zUQ zxg0374hf@XRIMlyzr&TO<TjQw*(ZAKNnE>|;LBGeTScF(gUb4WbngVSoo-nw{r+v1 zT^0*EYj@nLani3^jQhQYik6D^ec76W+WHj#I}n~w1Eol?uvQ?-Zni$QQFH`>eX>x@ z3ah2q@?s%#)QS@u395`{(t8iNqYHSjI`6El)&+%CIIlCc6sp>3s#*@5xfIjhn!Pa! zdUqJ}QBY8My^-D=?$w<=Hv>^1w&FTflR3@z$maKF8h^IqlH(dUNF)G?$c#lD5}OV2 zwwJI6r7?V1%xK0_r+&g|DT<d@llR;h*Xc7<^}DzVMVVU;6*@wKw^)f}co#fBfUYnV zWK&g67%xNn?*pbjW_7?j-(XtLfo43L#9yLRh?m*(H?+*dHyYuHz`woX9Ey7}of^3a z{JO)PDD_%zIZK{`(s!I$jQd6(b8Xbf24v|`RV~w*hFD3TP38NXhV|Yihg5)kT%fHc zbAzFLXE8-Phsq!(UIfA{Ps*U78je#Mt1hC8d=F+ngW8jWPFYa%)hgh28_B#kM%C`j z?A>SFlQ@3nRQOsJSkv2Hj@!|Nr#%=~dm7Ab1<ZE`)3vA2fo_5C4SFFaBrIT_NTzD1 z>TC2A{hZv!<L{{NaDse#;`)hP!Ey2~&zKgfE)(tpKtPL`N;}Mcsz)Huf-YYapDIiu z+IT0;;cii`&u|2%g7}w{oIS`*yiNAI1h>#k&-esXFa_+tL8^h*+$>_2bzX2T;p7b? z;l762lZtnpW4@1*CFYz<DM4^86)#ID4xjK;MJ90?)%aUD*3T%_xk?eLaWKhaomsyQ zV9hAF)iAK;Otd<250Y?u(n0=L<y=+;YdtDhV-f}3NH6sVbIw8eIc>Gz)i#&u*&}e{ zJev>G_*Ixv>8AE3?Xix2zL$)hpH^9`j}IHhSsyKN(Gm2aGN^4X=8Ymr#}1-br!eVg z(0%nXB$T6=LlKC7Ay4^d^tE873RD!eIpF=Dc)le#*>j|pDm+BNhO6^Tb!HsDAT5xA zh8D~gjYuljLh`LY;iTF;{YVIGq1qcVybWilMSe{8wJ~;Qu5Xqx1K;#Z)X{A?XF8g~ zEKuSL^ZWF$g{b>)S>nKg-+^`xS<d3>KO`4Zkz`jm+VNx*%Xrj-9b^%O7jqd`{|Rok zU_<ZQqEIS_gA=E)1>$RT%41TK@ls2Wp$la$w3*so{hV3+i6{xn@M3mzax>LzCbe?G zkfnKQ6G(GyV++=4QZRQ(dKba1u0pO@xG-Uy+RifbIT*)!CCb_vvcz8aY-VzaUD=#7 zlXJRTzk&ba&9rDGc&MF;wkVQYv5vX8k!#V^4l_BL$8H!unaXma)pQ^?G!|YOPrh5| zl-W#uKZl)GAYmK^`sqk^ROB+2GEKV0bsW_pn>imZl(h=(>ST<ZOmB#kKu`AoyzB|| zj>Xc=-A3=&2ev)Ntl&9j1urxEp99W)1jhFw%T>Ws9n9nOG$I}R5&IJcFy}CVS-Zuc z-eh#|UF<G8M9$`v=Ny{nWo9>XNO{P89$DUOQ55rEer)RrM*q~=sn>>CkjZFs$Bk!E zjjrR4KQ``UBTpE7;9W~|_Dfv1t`nOL9IeTwzX{g9Ds@zEIcKog^tJgHM<$=kiR0=c zcSTO7Q|)J(;#2PW5l4S#2)%T(>t~lYI!ht8jkMz@UMaqYzmHg*XQ)a3tQ&g#Q=?8t zi^perVX8;=q(5%V7dX+2IA=ALM%Log`!1xz@7evqsMDEaen@Vq5Ec3(_f+xqf_&I- zX)r8B&B)<|MZ)Pe;OreG*IGd9U~l1=;(XxlMWT8Ld88>!Ic&=REJh#pD6+}lSj<$O zR6sC}fEyMthspR2CU2!2ncTNQYz{J_Gtu(TC^1Z9Zp00Imnn81n9D}0Uu{tGSv}P8 zE)K^W`pi{_8|7jsDV?ME_!Us1){6O!(EQIF#k}P>HhL_SiHlV2ggu1$Y%wYGNUzSU zax^N)TK1CcW+KQ36~xITP!zjyrcoz*F(J6vb(nL(*9-Sy-=uhk?=k`KE^5av(>!Wj zhPgX@BtdCo`3w$HP0mkUgJ(2n8nQbR6Ngm(qeve)J7NIo%mJMnqJ89y^BQ9%lhf1| zFXRA-;<;%!$e=3vUjjLlApZMZRIv|nM8(#w9rT9cu(#$+R2W9)zyHnLzxw2Y&yxf$ zMPed=_wy-SbslrCUbr-?IiJ_W`<m$^cP$nN+c?+`HPY0HeH80Z2KaXgK61Zb0==&q zTOJ$3TzlcrOvj%QlWE6ct#`mWcJ_aarS~qwgG_^$U6l@u@Q;Jh(S}pWvzQ+VKrLuO z0%05~!Dc2#uffL3S}QRvvYqZ0NM3FTa|dT(L9;lS_r=ea<ioB_;S;o^`fcPVEXC%a zQ)FTvzz9o&@A;Q$K5Y7AC!RQT8To(iBK~<+{(l?J8{SBFsA#>X29aBAMH+nx`;mUr zGVO-k{QrLiaVGdpqhf}qsOep6jHWmYGYiSD%icu3NB*DX{AO<cpEJa}GZtnitHJQA zsWNGPg{LrrJoyFsTP@OX8<cu5^vyU)R`Rqx(Z#d44TkW-^6T#A_um+z^Z)E;R;-4M z!g7DqXtdYabdzQ5!}v~ScaD%~$&|Be574iLrX==EE+EDFn0-wlP8*ZtSDaO0dJDvi zRaRknpY5jJaG%lUEHHg-X8S&+Gh84&-JbmhIiNxdIKG1|Pc2W~&a{tZp5u(Z0z9^e z%*#ivUZCx&Xc+9a$So{ujD<8pNz*b{I-F7bW*zaY#HJdzzRqFr_m$`Wm2o@T&uBI& zEYT*RBs{c#L{2wGAIT@WthXS!^&N?=vT)P6^tw9mMZQRoudEl5=F_%bXgIsHOtu5u zbW{N2IoY-m<>^DE7{flacuvJOD(Vds1z3>Lmkq4EFLDwM*^1PT6yp?<5l1+yCGcW} z&eGIWjoTeh-f$DDYbk3LSX?XeT`F33WxTDG===p-b-|X8n7AK@w&p8VsTr2RH^0M| z+{;%Jc>fC1nh)gWj-sa068YD{m)A*Kyhj@TLpVThCO?MbR!zpQT8QVnnhh1(NyQ)G zv}ST%Z*yXwab}BhYAeD`Ysn2T@37;e6;t!wr28_Qw>8VWiplFeOn3Z14kiax&W~FZ z#MF=()Y%dbJOx$s1PP4mOwfCijW3OlX|lY-ZZI*Wei;4pG5a0rk!9n9g!{5{n7@qP zMqm1kzcIjAiM?VWIM|_Z?k2cH;q;yeHgrXiGKpcUYaH1UgW`w7)5My_?9U;bfegC! zc@mR1K|KK^CxX~y8A2A@2+q{lco>Sx)&!j`9NZtF^ZjP}$}>LF$e+`E+1SgTV7cus zoOd39V->|tix~XCiR@CDN#Bg~B*<yWWF~44kt)cLJMOaBcyUKKEg8Os{d^5?`7?*} z^LCU!aZi3`u>&<0Z)+?wwln3FZ9MZhD~yRu+a{5*N=H@lX5)$<4t)TwK_#}~1v5!q zhrEo%q)}r-Q4*RkFBfiVLw)Or4;{t!(7q%tVoXC(>PFIqCbIEhCb|4LI%5JIDUp1B z5}P+tP+ZgS8xFy=Gf?r)Gsl>PVs(?cn2R3qgvxC&d&_#nX8_Cn|M+gcq<s9@aTUm1 ze-KHL5L|O3>U)}bKbhTZ6h&XomA?`o=Y+zT>wjMfm$N|~l}OlVPh5^f(iTZ5zbQ&8 zy1-544oEx?ZREKU%tn<uXloX#n-etNlT2AOI{Z)^^pWI9CNe!VlQhYGFlah68)xv* zFQUF><D~nt^VeU_98}_jiaCRDYa6DDJ2G8#2vnLubvh4s^|txi{A~W@gaUC8gW1Dq zv{}flhmsg-0$L3xH8hsQ<y7`E&b7tie<d*Mnh2jg1k=huojA|dqHMB6chD*FU|!GJ zZW03CH^Or@)ycG66O@Z^)a3{=Mp0@{ROV=0_@OYfk!%2+h;lO%?Per8MLK&<&uHg0 zL$0r(67Mh;jdm=lo2l%on~RnnPbxZ`8yJD}9QlVQ5=GVT%LGsidD>Vw`dI5kW+`T} z<v0!`o&Z-*w60}><vCvIpFeRBym2U+_{hKglxvxANk(l-1y}v~6KBcKoZ&u0`b=!N z$VREV18&WOH9se{<L&X4+b9D(fjG!wA7uzGvQciNbi%1)$Zy7?i~R9s#>>0;$9s7Z zEiW6d`3{&ik9oM~qK@-Bx}T8mF#Ms`1j=d?OueZ?#j&s-%lVhO)A0}YIOg}8Jn^60 z<rEZ{G}Pil-0BS6!1HK<S;lPiz&mU?$-@_X{%_v)f9*E^v-_nnr4tHfZ-R~=PL4AI z-Wy5Yr>D6unV%St^xvJF6?kB4(I=Bphf?JoJw*M_Aj@)I&i7@TZ{o@4;?X>TGaHmY z-`*fFRtQRx5yYXvqeGeWYofeQ+Vg)skAJ<ParDLnx?>_a@FYtz^CPL2w7<ExH(}Pf z7Qf%`W01U&b>yAY{&FiL@c1KPlRe3bNB>)=_|ES)*Pwc<zN7>E)c`e+j6e`7${+7? z=wEJg<p1VA$H89{&?pnZ&Phynq>wF0V@l}|J0vsEV$L(Klm)N7N!}nA$L|UHr9tyX zoAE=v4bc94vpDbmMI>f$;{S$OjO@qOU}2#sB2CyR7S04~1nOiY?r2Z^qG;wahT?UP zbdPmUlsjtXlIw_<TWS)SXiP$5Pa)%x#zq0LspkLoCikSjM!&wziE@8zGCF*!+#vhk z{q=9}aZnM1=9Pbs|M~6wckf~3|AQX;*IPLio;VlJJ{|_P;`e^`@7|36^Yfkcmp=4A zpXPt{REB7EPzx=ZhDI0<hh2eExE4=38I3lTT+Dv<Wc;IdU4$cMqs-hvYtLgp*>h%P zyzRbtQvOWd1u{h%gjN#*3p0{{`ftpaMFQ$3Q(U=tQ%}%r47xYUmmewo0Os`nj0Hpg zgabRGKt}03*~%CV2N=q<(?}-vCZb8sWS&1xk0*1x0{wL@34~<SpHy}^?Ppt0I@1bg z^z(RKc{sMub$(f%!`I<Q)+)deh%yv}ryhdJW<(>>P&7ly={7+t3TF>M1gt$0g|jc* zJ%+8KvFw5wOPXOSdC$3|ed5WltYF*PT2d^@<hWCr0^HBuk92mAo*@f)k-S4T?Bfpl zbRG)zbKH7wc9WfFdOgdjF=etJ7b4x2f3x#zK@|E=U-(E7!&I(K;%nR~dez_cf>5-@ zCd@L0<AX%7rz{eccO>cYi72Zx$$-V7d?(;GC!$m&;W($@Ij6n;t{J3dg54qbboq5g z)RBKwjEk?ky@hSahR`AgUwZLKQ1O4Rm;TSl+5c}a>VLL}CgJj>py#Lk1&?N-?%yP{ zkZa9DGyOZfCNS!Msv{a-W7<&lA2%lp#h=5N%kP)xZ+`3!t|Yh^tW5lG@7HWl{F8s> Gum1wxjP>*Y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/SDL_ttf.dll b/venv/Lib/site-packages/pygame/SDL_ttf.dll new file mode 100644 index 0000000000000000000000000000000000000000..afc32a230b8b4e77abefdfaa9b4cf11ab424a3a7 GIT binary patch literal 31232 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 WDBmaNwPu}JZ#EL-^Ur6Hz<&TbHtJOX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__init__.py b/venv/Lib/site-packages/pygame/__init__.py new file mode 100644 index 0000000..9237561 --- /dev/null +++ b/venv/Lib/site-packages/pygame/__init__.py @@ -0,0 +1,402 @@ +# coding: ascii +# pygame - Python Game Library +# Copyright (C) 2000-2001 Pete Shinners +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Pete Shinners +# pete@shinners.org +"""Pygame is a set of Python modules designed for writing games. +It is written on top of the excellent SDL library. This allows you +to create fully featured games and multimedia programs in the python +language. The package is highly portable, with games running on +Windows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux.""" + +import sys +import os + +# Choose Windows display driver +if os.name == 'nt': + + #pypy does not find the dlls, so we add package folder to PATH. + pygame_dir = os.path.split(__file__)[0] + os.environ['PATH'] = os.environ['PATH'] + ';' + pygame_dir + # Respect existing SDL_VIDEODRIVER setting if it has been set + if 'SDL_VIDEODRIVER' not in os.environ: + + # If the Windows version is 95/98/ME and DirectX 5 or greater is + # installed, then use the directx driver rather than the default + # windib driver. + + # http://docs.python.org/lib/module-sys.html + # 0 (VER_PLATFORM_WIN32s) Win32s on Windows 3.1 + # 1 (VER_PLATFORM_WIN32_WINDOWS) Windows 95/98/ME + # 2 (VER_PLATFORM_WIN32_NT) Windows NT/2000/XP + # 3 (VER_PLATFORM_WIN32_CE) Windows CE + if sys.getwindowsversion()[0] == 1: + + import _winreg + + try: + + # Get DirectX version from registry + key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, + 'SOFTWARE\\Microsoft\\DirectX') + dx_version_string = _winreg.QueryValueEx(key, 'Version') + key.Close() + + # Set video driver to directx if DirectX 5 or better is + # installed. + # To interpret DirectX version numbers, see this page: + # http://en.wikipedia.org/wiki/DirectX#Releases + minor_dx_version = int(dx_version_string.split('.')[1]) + if minor_dx_version >= 5: + os.environ['SDL_VIDEODRIVER'] = 'directx' + + # Clean up namespace + del key, dx_version_string, minor_dx_version + + except: + pass + + # Clean up namespace + del _winreg + +# when running under X11, always set the SDL window WM_CLASS to make the +# window managers correctly match the pygame window. +elif 'DISPLAY' in os.environ and 'SDL_VIDEO_X11_WMCLASS' not in os.environ: + os.environ['SDL_VIDEO_X11_WMCLASS'] = os.path.basename(sys.argv[0]) + + +class MissingModule: + _NOT_IMPLEMENTED_ = True + + def __init__(self, name, urgent=0): + self.name = name + exc_type, exc_msg = sys.exc_info()[:2] + self.info = str(exc_msg) + self.reason = "%s: %s" % (exc_type.__name__, self.info) + self.urgent = urgent + if urgent: + self.warn() + + def __getattr__(self, var): + if not self.urgent: + self.warn() + self.urgent = 1 + missing_msg = "%s module not available (%s)" % (self.name, self.reason) + raise NotImplementedError(missing_msg) + + def __nonzero__(self): + return 0 + + def warn(self): + msg_type = 'import' if self.urgent else 'use' + message = '%s %s: %s\n(%s)' % (msg_type, self.name, self.info, self.reason) + try: + import warnings + level = 4 if self.urgent else 3 + warnings.warn(message, RuntimeWarning, level) + except ImportError: + print (message) + + +# we need to import like this, each at a time. the cleanest way to import +# our modules is with the import command (not the __import__ function) + +# first, the "required" modules +from pygame.base import * +from pygame.constants import * +from pygame.version import * +from pygame.rect import Rect +from pygame.compat import PY_MAJOR_VERSION +from pygame.rwobject import encode_string, encode_file_path +import pygame.surflock +import pygame.color +Color = color.Color +import pygame.bufferproxy +BufferProxy = bufferproxy.BufferProxy +import pygame.math +Vector2 = pygame.math.Vector2 +Vector3 = pygame.math.Vector3 + +__version__ = ver + +# next, the "standard" modules +# we still allow them to be missing for stripped down pygame distributions +if get_sdl_version() < (2, 0, 0): + # cdrom only available for SDL 1.2.X + try: + import pygame.cdrom + except (ImportError, IOError): + cdrom = MissingModule("cdrom", urgent=1) + +try: + import pygame.cursors +except (ImportError, IOError): + cursors = MissingModule("cursors", urgent=1) + +try: + import pygame.display +except (ImportError, IOError): + display = MissingModule("display", urgent=1) + +try: + import pygame.draw +except (ImportError, IOError): + draw = MissingModule("draw", urgent=1) + +try: + import pygame.event +except (ImportError, IOError): + event = MissingModule("event", urgent=1) + +try: + import pygame.image +except (ImportError, IOError): + image = MissingModule("image", urgent=1) + +try: + import pygame.joystick +except (ImportError, IOError): + joystick = MissingModule("joystick", urgent=1) + +try: + import pygame.key +except (ImportError, IOError): + key = MissingModule("key", urgent=1) + +try: + import pygame.mouse +except (ImportError, IOError): + mouse = MissingModule("mouse", urgent=1) + +try: + import pygame.sprite +except (ImportError, IOError): + sprite = MissingModule("sprite", urgent=1) + +try: + import pygame.threads +except (ImportError, IOError): + threads = MissingModule("threads", urgent=1) + +try: + import pygame.pixelcopy +except (ImportError, IOError): + pixelcopy = MissingModule("pixelcopy", urgent=1) + + +def warn_unwanted_files(): + """warn about unneeded old files""" + + # a temporary hack to warn about camera.so and camera.pyd. + install_path = os.path.split(pygame.base.__file__)[0] + extension_ext = os.path.splitext(pygame.base.__file__)[1] + + # here are the .so/.pyd files we need to ask to remove. + ext_to_remove = ["camera"] + + # here are the .py/.pyo/.pyc files we need to ask to remove. + py_to_remove = ["color"] + + # Don't warn on Symbian. The color.py is used as a wrapper. + if os.name == "e32": + py_to_remove = [] + + # See if any of the files are there. + extension_files = ["%s%s" % (x, extension_ext) for x in ext_to_remove] + + py_files = ["%s%s" % (x, py_ext) + for py_ext in [".py", ".pyc", ".pyo"] + for x in py_to_remove] + + files = py_files + extension_files + + unwanted_files = [] + for f in files: + unwanted_files.append(os.path.join(install_path, f)) + + ask_remove = [] + for f in unwanted_files: + if os.path.exists(f): + ask_remove.append(f) + + if ask_remove: + message = "Detected old file(s). Please remove the old files:\n" + + for f in ask_remove: + message += "%s " % f + message += "\nLeaving them there might break pygame. Cheers!\n\n" + + try: + import warnings + level = 4 + warnings.warn(message, RuntimeWarning, level) + except ImportError: + print (message) + + +# disable, because we hopefully don't need it. +# warn_unwanted_files() + + +try: + from pygame.surface import * +except (ImportError, IOError): + Surface = lambda: Missing_Function + + +try: + import pygame.mask + from pygame.mask import Mask +except (ImportError, IOError): + Mask = lambda: Missing_Function + +try: + from pygame.pixelarray import * +except (ImportError, IOError): + PixelArray = lambda: Missing_Function + +try: + from pygame.overlay import * +except (ImportError, IOError): + Overlay = lambda: Missing_Function + +try: + import pygame.time +except (ImportError, IOError): + time = MissingModule("time", urgent=1) + +try: + import pygame.transform +except (ImportError, IOError): + transform = MissingModule("transform", urgent=1) + +# lastly, the "optional" pygame modules +if 'PYGAME_FREETYPE' in os.environ: + try: + import pygame.ftfont as font + sys.modules['pygame.font'] = font + except (ImportError, IOError): + pass +try: + import pygame.font + import pygame.sysfont + pygame.font.SysFont = pygame.sysfont.SysFont + pygame.font.get_fonts = pygame.sysfont.get_fonts + pygame.font.match_font = pygame.sysfont.match_font +except (ImportError, IOError): + font = MissingModule("font", urgent=0) + +# try and load pygame.mixer_music before mixer, for py2app... +try: + import pygame.mixer_music + #del pygame.mixer_music + #print ("NOTE2: failed importing pygame.mixer_music in lib/__init__.py") +except (ImportError, IOError): + pass + +try: + import pygame.mixer +except (ImportError, IOError): + mixer = MissingModule("mixer", urgent=0) + +try: + import pygame.movie +except (ImportError, IOError): + movie = MissingModule("movie", urgent=0) + +# try: +# import pygame.movieext +# except (ImportError,IOError): +# movieext=MissingModule("movieext", urgent=0) + +try: + import pygame.scrap +except (ImportError, IOError): + scrap = MissingModule("scrap", urgent=0) + +try: + import pygame.surfarray +except (ImportError, IOError): + surfarray = MissingModule("surfarray", urgent=0) + +try: + import pygame.sndarray +except (ImportError, IOError): + sndarray = MissingModule("sndarray", urgent=0) + +try: + import pygame.fastevent +except (ImportError, IOError): + fastevent = MissingModule("fastevent", urgent=0) + +# there's also a couple "internal" modules not needed +# by users, but putting them here helps "dependency finder" +# programs get everything they need (like py2exe) +try: + import pygame.imageext + del pygame.imageext +except (ImportError, IOError): + pass + + +def packager_imports(): + """some additional imports that py2app/py2exe will want to see""" + import atexit + import numpy + import OpenGL.GL + import pygame.macosx + import pygame.bufferproxy + import pygame.colordict + import pygame._view + +# make Rects pickleable +if PY_MAJOR_VERSION >= 3: + import copyreg as copy_reg +else: + import copy_reg + + +def __rect_constructor(x, y, w, h): + return Rect(x, y, w, h) + + +def __rect_reduce(r): + assert type(r) == Rect + return __rect_constructor, (r.x, r.y, r.w, r.h) +copy_reg.pickle(Rect, __rect_reduce, __rect_constructor) + + +# make Colors pickleable +def __color_constructor(r, g, b, a): + return Color(r, g, b, a) + + +def __color_reduce(c): + assert type(c) == Color + return __color_constructor, (c.r, c.g, c.b, c.a) +copy_reg.pickle(Color, __color_reduce, __color_constructor) + + +# Thanks for supporting pygame. Without support now, there won't be pygame later. +if 'PYGAME_HIDE_SUPPORT_PROMPT' not in os.environ: + print('pygame %s' % ver) + print('Hello from the pygame community. https://www.pygame.org/contribute.html') + + +# cleanup namespace +del pygame, os, sys, surflock, MissingModule, copy_reg, PY_MAJOR_VERSION diff --git a/venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8cc795570d21f060b394d3554a2ea4bcb58c62 GIT binary patch literal 8255 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 Dk)io+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/_camera_opencv_highgui.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/_camera_opencv_highgui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd8be209bf200c144676bddc686184934a2dd22e GIT binary patch literal 2607 zcmbtWTaVjB6rLGh;yBsuecLTinIZ&{AV__vDnJ$O0u`c)Xt#i5MYUYdY~o!fcE{tr zL|Lh#`$Lk){sAQZil2~p+P}aHoHNd?tA&?N<TGb(=X`T+lZR_-E`fIM`5(`JcL@0l z2lHkC^9_9Y2nZ*fCd99L>Qg;tK7*bmY+(2XCEVcV3Gq#CaT|Jz*SG_{{fO{7cTWg+ zUo*cZ9NySta$ifR`$W_P*>!`OFm;c#vFlEnQvwp{Hfc3aK|krVXj$vWy?(EVBb=Bw z3d|OKxebKV9v)#M%k`k0{sZj|ktQrH$=}_rFS|eILgw9H(_JO@x(~AK+faqw$7vKM z-DhHub+e<WAIib!Ss3kwy?EGznO-;$^Dc;BAj2Td#4y?qX2{yvQQ1u5T+NpA1|nlX zh$#`^`Opy`CjgvwmM~X13)V|B9>(etaFskNYwsxUWf7~ZEAk)!-p03x03TKaL9c_y zuXFJ53H1$b^P2Xz!|U4LE^nZ}d6Ta}U*qfi0`v~Q$S*-(=QsEjeicr-e3M_}8^AUA zWw`at(%#b6l<3SiEPe$Ri~oc{X*_-OFhcWS!yYkdci#d=kqI5sDIJr5jma*{Zz_Y+ z*Yr2a8OSw8bsYv63Zq+FX_0Vmm?{r_=2iY{d){^`<x#uSG9~)SzZUIpNf9bhLD~v4 zRY+0V)&A1`B}@wOos_9;nWdSFWCw06_TxyvC>{YFq+FbJo)ZM<z96^>I&`QKqe*Q# zx=^WU&(|X~0X77K{EzVEIzXz(US6q+l@^ohu%)#34no<>&nj-_0)jCeDw!tvZIp$A z2^(FRDPCQV(7M>LN9EemE6VR~3zd7SFTi}-E}j&5niMKdhi&iEgIM*`LU}w6leE`b z7=MP;sE}F*F<1T4?h8m~br$eC0$NJ_1W?QpXmo7_@^Z(*VhH#g(4A*mMT=_fXVo=c z7D65c@gVGp&lbAq=<-b0%JTmxTFKr2&|~H*&AwPs(3oEa=HE%Om8(#yI}6cl)Le*$ zg|}p*@3l{xz>LX+Od*4&8vW?rQvs1a%)QXdm4u4tVc3Kaw!osxWq9Ca@u5gO4#l#) z@NSEhjUG5HFXT=LY2f1EMX|FZ<oU*s?}7Ha3&6(c(hTtOU?<XH3VX1}aMZBzwL;jK z^txPv0?ep+64beX+KWKW`nis>wU@tw{j(A}y11fPFD}$#am9kI)t&$Y^@SWWMJH^` zru5ht8}gMhcFl=3HehTjdr})Cb;jmyeM)!elpR~hbGiwy<eniPE0-Hsom6ADIawQ5 ztL7%ryR1#J!?-;)j_om(<1wAAkD<a&8HMX^SMP(<IYoP%qCrL<VJ(BZ3h$sFDo>>z zPrdL3CZOuaxrf#06ca+1Rf$g#*l97*x*#zMs;bwF_Mc!Pd@rF8mv;54`A*0o%~P5C z^&hh2PNx|BbW~cyVvrsAHORnzn2EBM$&?q7DlI*hYaq0=tJku$v{ij~N2Y@+Bz*Hl z6026N%EtE*0mATEJn-4!p>G@lv9lgHt9QnU+ST`AbG`wDP@B1iNt@ONTc-~5kY6V5 zN<_Ad>ed)Nl^H1fo#?chC6whMTsR0yHwd6^7YXvsAb44XNwp&J$(2`-pjLSu$qgi% zNHCP;2S_juR{&$xl=yJVIuJaNUk2hZ*KsWP8Spb5%Qf^mA{jug1wm^~evGGXBl!>s zdR+f`&@aBkXIh_;SR4I~%F=Cd7!I;T<n5?>O0`j)`7FFjApJaerSo-l@%yMJN1zT^ R(_u~1u@U3?1E37%=)d_sEolG% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e697ae0928cee5716e89a41d24551b803efb38f1 GIT binary patch literal 4318 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 Z5Ag;eZ$M#_x>?@=72VdOI<_Gr`xkEyIOzZY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/_dummybackend.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/_dummybackend.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..673e6282eb696c72521c3844e86e584a6ae823e5 GIT binary patch literal 1324 zcmaJ>&2AGh5VrR(n@!RmehLQ;djN?&wCWKdgbJ<TLUSn<B8qA)J5I9gCcD@PRifPJ z%kT)i%3eA36*w{DO;S-(9Qhl2#+uLbc{Xobt$^WparX1fvKjkDo8`bgJHV-T5P)^q zdj=e=D+bngtHZ%QVUaU?3X|b*8Xo80QW+*$taX_7!Z^!9nQ0mJ;xyA?f*Dq0mG=N$ zl3^y+v0xJ{u&;Q>hAnWx!<7Ry@UK|Mg*pUiJ!n7^Z4Fwmfz}6(H`p#+!`)6OFAcI5 z&O@B~0AbGOOt86yh+K#kkjDn{I0jv?aqSs@&7cnsdg{QC!);$<8uqT^9-ST^f4=6p ziGtGarI{SXLs{1JMD^kX7lq0bsdedQd0uGTXYn*0^-HgaCt5<s7hmG!LXMzxFH;x~ zN^c<3{$NbWMyVc1i0snQGV3V^S(J<LgQ*QPzfTTdc2Biby89_VAIppGo1!?1$8q;V zp2S)AqZ}69VwwzMHQX(bCGI0Ldir?9r4i=27I)Yyrll_g5|4!-+4KVh#=U=jvkfEi z-tw>_ffE86WLJvQRp;!SHA!jg8`O`tBd&b(N0w@#Q8fZOSivT)N{6H(pEhavET|~S zosi-*$gY?k<K~75SKM&o8&{l`;Z$`zhWv*3Hm4rv#Wuz@iOqPhVx_=(*1PKa4~=Uc z{~_@#YHKWNqo!EjxLbJo@5WsgMPICHAVjt)s^pg?AKaGHQ&OihNg6GR^Z2Y;(N>}L z<xzI}0M6MC$!N7__2<uYxWBirBUF)ex<gFtBqa+a#1rCN6uRo0Dpa)s#iBa39(_GR zlz|Y#93~m9n?ih@#90+lB!i+CQuhe%6VU&WdPH#ZoMuIRq?RqBo4E6N&<Jeb@o}0+ cJF?1}5RfN$TROTfN9n(+uJf8sm{J`62k0vbAOHXW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/_numpysndarray.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/_numpysndarray.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f64aa13c0e20a029291ebdc499d171c6c8a6c4 GIT binary patch literal 2080 zcmbVN&2Hm15Vrgidj+S@K=c#?iJJyU5iAx(Q+I<N+8(+o3K+(^j5xNLNTfhgaUATi z*L{#aLSMz#p85hk^wgQ5R6C2^Vo?DSDQY-B-!~ui_2FUK!t3Jo@2@X#_6NN*R~si^ z;q71GL$#(Ym8f=}OcNg4MQ7Sc;#zmwRUOs+wKeUjo;twsK=suC$G&R6YK@-BU(i{( zS;_)LVO5obSXd`ymVx)$EQPm~QNqij#7{~FDJot!RZ(uz^r|vh(AIbntjMgn2N%Q* zgf)N>Y$K#|a^r<WH?P>4y}5-f__4TNX<tW8*E-LIHTed23wbYfE^jd6dWC-K{4!}U zIEb(U0S^J3k$D}Xl-ZqJ!Z=N12u_roO9jF%aEq-xX5i^17UM+;PI$ni)iGxWGF#Oj zQ`}2osB9go#tG&l?{PH<DN5;r&Z=BGETI4sgf=4R0><LXx)dH5vSV63J3G1i_K|=s zWH=U(1KT4!H<-eCOc31?P$EW7KM;9=WsCFA&dyFxPwV78R{e69Iypd~E>3QA5J=_c zU+_$u084PkLO}^e5w#Zc#Tpr_nA<qL6doght$AN)<X|NcjI|Z_GOwV9tuAi8A_IvC znEfp&6G{85K~nz2Hf{ZoB{bkgV;AoU-u@GOgw}2Hh8y-RHD%}VugLg#&K=~9Vra(v zJYt4N&xM0fITKM!Q-RmSmYcfA8ji7SOK?O7wV4AMun;K>tZUS%=?RS3?hFYvY-UT1 zmi&cF=B@>f7U|-?mHC=l96OhK0Nq45>l8tWg|h{3stYUh1Gw=L!dx32jz(ktcs)wC zT@1MywYNPkecR(GxZdN;erve{1nlqY$@AGy9-N>3Y;ObH%`VIG8x-g4JDbUTb`3>2 zD>vCny5b~i0}00!(s?ty18%u-M9PRrp#!Fs^83fLCeM-B_Y+sM@gLOv2n%dGlfnPw zFRW0MN;^DQ@Cb2@w<pvQIWqcZxZ^oA7T;T?7aLLpQMX4c;%Aoeyy2#!6Kmffw!z16 zUms!P_w#-=N*qBxYP${&k%z?fXijv;M;~X~ehuY0zBDuqaQ=iQaxx)<AwC*$y-iSB zZF%@Xk_veTbMCUE*mVC&jEiq17LWKwQiv%D?8(U<o0-9xu+;E7DXq-qh7Wc2CnEeT zjh#XnVMeL>F_5r}%F|y3gXy4Ut{+iSB+ngRwcr{<uM7NvprkF^u*1k!rL?W(8S_N! zx$jYOY&Pw2diC<V_@_IRE(zgUDfF)%4YvLHT-j_spB_XVOo#h=chAsj$FL*b9PQi- d!gMp!gBS6C{N<-;!Ay4BgJhTtI)mY0_zzd#aA*Jk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/_numpysurfarray.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/_numpysurfarray.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb5128dea35b0594e2013b4645f26c435dffc4a3 GIT binary patch literal 12416 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 E0XY(59smFU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/camera.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/camera.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a4e818d5afae1e389243c79654a2493b2d19303 GIT binary patch literal 2797 zcmb_d-HzKt6rQmi+i|i#-EEhGiWG?g8-7*@BtQtEZI@D2l(gy(rO~RE>zPfw>)7eo z*><CZi|#%E55Prx*+<|Fcn05c)mPw(?~Iddb}0g(I+-&wXJ*d#%{en?E-x&24BwXz zetYmmjj=zdGyP07Hc_%$5P}6vaA6#=HW#L_P#dBmY}BT3gnPsS>namf;T<vI9U4JJ z+M>2+sFq-&9y@JUy1Ug~?^*3R<Ivn@&4rh+%R&<LRZ(n|EtKpc2P79PX5+HvV}Oqh z6jPXEYs7aAVZr<-=$X)3$wg5i?VhbRX-0BZ*pvQE-M1i(5!*GNSw#4`F|Ld%q6!;{ z9;pZq?IGIc$Wp%oy%tw`_SoiZWbZnG1L+1XWHqRc3{@N~V@@4&ys^XCJ(etUYz>=Z zW9L3gjGx%ZQN_q9w>)z6YDcd&f8pwaUcZ3#^|5<uy*pX&(!7y7vEXV8aAQyvi@}0m zaN<%+!By<LJ4NMjlzjGSQHi5u@T9OsprB|k+`NDF(hpbsEr?r}3f8vMzD&aXwznUN zFzDw4C7Zl({4nTA6`;8`Y5L_vzZ-SBok4_=mFdXw(w79@Tr7+<E6nU5E8Kn@<U6VA z6^=~yBb6qF*^zl+_YXRRKoM?xVH&3@>j$AM>T#6i6T?|yZ)qCJ!L-7Pk|<X$HC;c- zeCjr<icYM;VTGMRCMPu8i_|_Q)~->1Vi$ngtPe_>fwr$LzhLStO#OL%>#Oa%nN->K zy>vI1d)t@#{cnRj*uI{ILA-rO_WIlXgRmQ@-pAm*7j&Ye0}X9zT9qIh{R6cEleE+9 z4g|B74U6MvdXTo^ahszUR%Ma9(4e>$uR~*#mK%JTW}xM2jXl%Yn2R}<#Wlk0>JSJ8 zLSG&7m*BXqbUcjmcr>|Mg<5ZQPMm|TupSMf{03T?1;GHT)=-}?Za|@pFQbvOte$hh z5BXEvPz^F%Z%HW{dD?)pVhB1*8x*hgX5*p6d611k29Iqt4b7zRehlJ)yrNX9<_J+J zlx9`)!>$bXbj<HUdra;;dMC)uc3zS@ge!7>$Uu%0xnad?;A;VymKLk6G{4sC$Fe7r zT#A3BpvYW%25s70YfeC$7~Z5Qlp-aiMoNq4ge59R9Es5u4icm#Tv0`h3?pi&ZBZ8s zs2#B=mQcH5O`H)cSWy*kh*fbGEl(_i{CRZ-hV>19VMLqQ>C4}tD9l?|FNZo@=u!P| zKB#IR%=<yTiDgZzure9%fRfyga2u^G8bbC`A?L!PBjWlx7`RhdScU^W87`GKc4Ib5 zKB15587<;C3CHKRWu7(iuEa6X>8GJ&md1lTN|TMo`r|0?rh~j8q99H?&12r0Pt#Oy z!xSYuk#`HbE0LY@(^MBTnfu39Bdo~i2s3kdZbJ9ujF5=ZNA;^n&-t(9!8MQ5z?Ccy zRGz>{iDwM!Q#=}YT`*Rbr+qbtQk$Wq{nrKJA#M8)2Rl1b?ax7-nLr(n&H%~9<h<`` z`dq~S<~*YeqP_PxP@U|w6YCV4Fimom#@TQVdUd+Xx$#!01B+Qx^sWDhUKJ7#Pc~3H zrwLSPZ&5Gk$e-uXm*+OF2mdd!YQpMi%o<@58N7*4=TKMXP$$E<1LS4(7KsZGP2Qq^ z4X>o1Aocow;rTx9@F1pk-S;02g18(}4O;aMiHjuOCGj4KbrK(t_>hE7#m9nDfKEmM z8X2WV*YIq&;^OV1pJ(Y&qR<PX#P?gxdimziTc}?Yoqlx=EwkE37-+ARPw0kx5>QUg uHbVV&s3jV7r`on%s*#ys{8iiv_v>=Q-_SYG1TD+G<`P9`@qO2Ht-k>JX-5qJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1d1fa8d73e3fb43ae466aca05830d1ba6846afb GIT binary patch literal 21343 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 XvUs-k{!efJ-6-~Pjf-dPIO9J7bqTMd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/compat.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c8fa3d45699f6b81e0dbbc9adb6be24a3647e3b GIT binary patch literal 2255 zcmaJ?OLN;c5GF{9qA1yp6Wj4CvEn#&)r{RH>2%UgnrR+BIFs6$IO&7q2}={O%$OoI zOQ^Oq?x{WW*q`7W`xE+CaP2Ago_gvoD9Ld~DL4x(mcU~1?E??T#ykVt-B*9TYSawl zZ<-7m&W&%7@+oE*-0%&~xS24Yaf{o$#2sGdF0XKpS9y((@$qKOHwAlbaW-f8HlN_u zZ-!qIHotIKg5QPXmxb$BP|IZEwW@xVk;aS2*ZdkY#F#%WCj1Lx(!VG!`BP%rpW&Cd zhdM6vDPF~KHhnDSP|JK@%R-?=RQ;M*#NAhL_XO^~>QABO>13%@_h;~wnZB0Gg%&=` z=TO@<KF=3$T;_}1!SOoUzQV5@n(z<5>fcDG3d{dsVDlxM+q~}I;Me#vuKkFcJ4WMr zZ~0kQ9%O0#_WJRsch-;VQPygQGTw`mSa$0&%aZ&p;kl*UrjP<4164}0v>B-KF@$MT z1j^2U<Fu2;(E$X?B_`we!-McBh|_jQqBP8dy{;6w@{sE<QH~Y`suZ`vcAzdi`!V?T z!ISOh!FL<acQ&`TB077}Ok^G*<>XjtoU%8F|D1vMFt^^Ki*Zy|-p!ROjw3vGKl{^w zNtEmE-=~kh+I^V|$alZbUQ2Pf`=H%^9LjL_X%>aa?hDas@3y<qK?tq2b{HLo%{XnM zq#3rvU?|{OZ+C%=8AHm6G1yxR`vz0)js)Dcxs81JA>DU#J0jbt(P$$LFL7d=>Y#i> z&aiqn>#O(n;xvSA9pM)cCihqCU*E6qjS%<B3Hm8ryQQ2QkBlT9=!lenCyr!k^X&F; z5zmDRb}LAQ(dKBwrf|WTVW*TWrZ&*-t<_=m-pj(h=S>_XR;4hH;uvO7p&B1Vg~+3@ zEgB|VCb7ds-{dlkwwdz#W2BsrGt6;@*Rv^H&RI{;YFKI23B?5KeewY~N1&;JYA~3^ z-J?Kzfb#zZjY9GaH0{mx4}#Shg%-@y*@P9^u}}<)BpOC=;X}e>18HCmvcq-`1*uWk zLT%Hy;2kwuA;p8LVonGBD1Cy0elWvT<RheE`+#B!m63{Tq<D}DTexbVc?tP*j&o6< z9k+~3*OiFkuWSd?M6yE<78xcD(+>RsOE|f8i?SRmj;g%qw#5cjB#a1_y<>-t^%ClP zj+E001~Zw<#+fP|#p#{fstlr?gpp7ac?UH#Ln(^5)D9RLNVz>s*w1iMRGnYg2|G2Z z`W!m2B8}J9sf{_pV1--w&p0ieFzFOIgXY2<?(B_+X&wj1ch)~&yY=N4cd?4bY3I0C z>d5`IyNxnT;374Rxb4S@z$zw1OQ$oYF;(0n0m?<2<$eY&<>fL2nIFaSpva@ivt5C% z(mBG!I=;7`545}okUF<T7mlCMgg#s@o3(5PYba@~s&WwUEDD0cNSuX95(KLDGgi|$ zOLeUUs)o8ODl1MUSU6QB{X_s^sLVJ69WWG*%EGq-9L-_gLs_rZuK`pwuip(I=P3)b z9Vo+e0RzeaWz!?1oZ<~qm1q!b%ArDY0L6QR)lgN2uaK%xRn?CgTp@K7=RhF|6fMx8 z?k06~?|1Mz%NX}wE90F++^5jUpJHd5uIXWLd8TK%w##h%YWUHpKhL$jav>ecSPi9a P3CVUHk2ws<w5|UDy>|qX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f47b82787c460568df419b4a197e29d228a7f2c0 GIT binary patch literal 7904 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 HuD|#nu8^Qf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd798a7cceb1e462e5add66c6976a0d8b76019f1 GIT binary patch literal 11869 zcmd5?+ix7#d7s<P&R$4S6eCd=I}=&4wKhe|isLwrqDa=ob`jHt#YX8?@_MyrNUpiu zU7i_QOJX){Lnk%@2XJ2s^u@4%JfwZ-L!R99r6}@81OpTZ+J{zvTLfvJ@{<03-`NY7 zQe>w<fl}IY&YU@O&iTIceZTKA^WxN0(Zb*JZ~pz8N3L1czw%=E=b~{DzxZ+6vXoV| zl&zeWz2Q_Hn{Bt{R^7;b+f&|pPCtvDTr0QXSN)BAHE&z(8Re_|yH?d#fhwTRtD-8Q z4pdo9p)ROtbpUlyT~G(r?7Mcgqz<V$^pw>X)M3<9>WG?0J*|$aW2g_P<JB2;qIyt0 zQk_+gRu8E!su2Bi>PzY*>My9rq&}=pNqt0pOFgchz|8aNw5njlQT3#H3iUCypw6H^ zt`^nPs86V~>KW9JsEg{H`U;+SR9#Zfs;{E;MfIY3PJIonP+eBftFNQ=C3Qu;puU0D zNp)U*6Hh*--0N25>ds%izP(!Ch{7wney7=94ePDdj&3Gv8*z9CbrQA1W;=X+J6Y?r z7sJyxI(l6?bZ1pZaa<`DU)kukqK&AXU=*i%A|6e4X*?MwsSl<J--&eG?6kv`jt-M3 zPOxsV-d3TCZf~uw;%c#YkEdF(vp_Z9X>#yV#l6Q9);L^KRGcig(&}_{<~5>btHB%m za|XZ5sN+*85-YWK?Y^B_slD#R^C_fZ-P0#h`#O4*GjD+t?vl)WkF#K1x7kjxfZfY- zXw`auV`)m>Z(qIq!p%R9vHzPlI&UY@`prw-?v;8{zxnM>qu#o?9Bp)OcDEaAb-i(> zTW_q_Ne+6*m|>;B>RNYuvAeB3%sGu;%!XwLw)A`sQb5dz6l+Y%kv*hnA5&IrooD6f z0F^GVAR(qGv6VwHi{E$;>>2HW3?bu%on<uA0Yimt_Ret~C0iPYsq2jd2UTx{-MUV~ z&Pv$B>Ld)6tUkGL=JAo^xF7S#EJt(piFNs~tUH5-0?p<q=Pg;=*?DZRcC$^9iXOO! zAsZgDkpR!vxS20vnc-%pxEVPXG+2)|Glz@R`WUj4Ix9}<-X*?}@%9oV$B(0=R!=Hk z=EYljMJUhg?JU>mv^sh}^LhAB;Ad8~HLsT&JURZ6Yy6S_@mnaikEJ<1H(va%-FB4S z_itG3InPS$^`c(1E&fx^b?duU;=E_A0Q!{oZjiXCoBF%X6(|GLA&*(S0SS2_0Z&wN zJ7*}KVW%C1w_8zLMJntzdr>RA15gN8o9_S+ZtLdiTGEF4FIK#<LXKNYqf_M0$+)lJ z7e9_7wQfCn)9KrN=Y2464vc#rr<po)))DJF*!L#r!9E;0wk2U##m$_>vzZG9R$Xj{ zOg38>OYv_D=U1b4)a&XC&u}S9lxOceVswoJES_&sMdJ&Lqmh+d)nAp<%8IXm)ZSIC z0Vla+3y7AvJI$_~M<vh)FrATMN}@i<f?|;6gh|yxCs~VhjXNx~qdRO2&Kk1Mftsq8 z7026o3fD1D+j1QHm_2R#cG;eB^fB}_sDS+A*|RM=pwLL2)LVC;?-W0X9>mWcil5xG z^#bb^r|qX6#S^^F_5I%CiJj(BU)e`2O2Dl-Ie#n7kLTEY`Gyf=XUXV{Bh+U(U2m^O zLne^)%<n;6IvbkI$h=-H>14S$f!1d(MCO6YK2;;_YaPAQYPO@V;lY^dPRyIJJ?Dfy zXX_Bx524+C2<^N_+EEW^2X8)ub|=jb`S*Kh*F>kilpAgKw}t%7+Xm(OQH;?<4q?YW z1<wrKfTx6XU&65a>3$5oBf6>k{K=W`puw}gYxQ%WE%&y)Zp9}}3s=q&3$D!L)EH>D zgC1|!={rddXOA|1{t+O-JkGrDnLa#!+l(}K@%)NB4?G|mkb}E9I!rW*MuEactJ&=W z32=PPolZLe#*>=GfuICgKsDkhBNFyn=5Ew`hFk7Nvz^&@<a8^(Q6*8J6Clp;>=CqJ z#rga`8*xNtt-(7G`Kb*B=v6!sQ~WG9fckh&**@&D)=#4Eb1;+4GR%|~t|pmDW|Nuj zXEIYpelBJn7ib+alQPi+B2BVVpTho)2AyV$m}!_qGoioCg7PxKN#cb55{r{8Dl9&O zkwb}m6Jv*rbS4-{gc2aQM=-rd6u-xXM%IZ^>f$GodKL{xkh2aOJ;#=}?j^wYBa|u^ zy@K#)=g{x6p9XX1va#TCSPvT=6@|%KJ%Jy%0_lpwZYOTir7*S!?q)Y?Bw^CQ;M<+8 zwxYj!yVHZIEqwdxwdLB?D=%Hmif_E~(#wN(u>9KVrnmIsYs<^8y($-AoiNOxS1Vcp zY$cs8fR1JjwxyFK0JnV%^rJR+xCJ_mr{tfsHF0cY>*y)*C;T9DQmbs-0+|bD%dYRA zH8|g@Z`@Y(3x9_3|An8WzmB3I9uXR>M{{yVsnzvUdtzQkKaU%keS6>JGSi>qmVN=n zgQp}TQmcb0c^m_KYbMm+;G>gVkSYISIOVmGDA176&lJ*I*f1Tn#NKt{>BRXy9JiZZ z-|y%9LB9Y8=49fwoy6-GKeT%npkF@B&=7k3ehEE6TG-Q5PW-f#mUkW9m9e<H;?av& z_79x%;_4*%!HDlMu1SKlv}^01U>@JGurlY%qm{?{<+OxWsbA*Zbyxor@68iHaSf=n zk6ZnzHloD-R9Z?37cKqo*k2L*!QFIf4kNyXnNql2n@?gy@uKyit;;e74%WmNcQB?T zV_q;TV)V11qX<C8y6Mz$Gb0RkKQA+uvF4Mbv2V#(7^{h~4#&b^^W1XvyI}b!*rJ92 zR~lQbdP0qgM))nDT`Y$9yMf-xF^Hs~QFtV#@6N}DemvWJG>oHF3H0a-BA`RR%(Yh; z!_!84Rd{<lq;4%>JKcp)bZY_XO5Lg~hRc}q4*ny?G?Q?V#{GMkSQnvKCp^inlMCU- zR$~p@S~nzKJ~N737Y%{*SKr!-qZ)$5dh%Adthb^CVMR?QZN}kNT!;TAai|PBBiJkf zsLb((gf{UDVS;DFrs2xOjv8A@EWDcJ!3rGBC={pgPBV@wGTYMfwN>Z{{(k+f%2ZZF zT-%1%)NVwX*J{Q|Hhn2ZXi3ByIHIyC3E%{2GXK)$%U54t&ips7{?XOTs9#yS{>qiB z`f1FmiNN|C3wpqnX-?XXG(B(qEQ_zQcn(EY7_lXDde3CeHh#TxsLxe%D%tKvj8;_i zjH%9L_I+qrAg6?n?_$FEA_}WG4HvfTc<!t{>lB?i+p~+d2m4%<e}R1%_X0S2KCVq^ zYL0;W_ifBELKHfOBR7Z{9lEt}eangUeOsJa7y1Afciy7@^x@h<Cw&D21ieQ;>X%tV z*XjJgeL~Bn8wE6g&Bp!jDhJ_{+b{HfkvN=R!3Plc_*}mTJg}gnL2B=MHXUVOv_3D{ zqZaxLxDL|1a-IhoY_<@BeNX1~^gljuU8i4EPU-_)e4)kCzZ|Sz>RrM5*wdc%8Ls{Q z^*_bVN?5-*TK`jEK@M2p?|enPjC$Daw9o8w*uvA)+|E`K*4s%F8q=&p23ISK1G$8J zkmvV)hrdDBufDYe`&#@?y|on?sdVeNV{wd4a8%yo(Ot#E`WlOuSiFn^fkCT7fr=Pg zi6?{1+IB5&uC~Pt<Em$_CQVING#(#?_~)1?rjfIP!0{+qPT(22^6VLR4&hTE|E6=p zUW65U`t=)lwvp!y_+z#sho6gId=4ho$PwfR(lKvN6`3Lpyhf%7bz;5mK<1oXN}juG zzb`Vu5F6)~N3W9xyY_kx$bMeV*3-!YWguUo<p@v)kf1zdq41vdp8cM);+h~`<PPif zOOS^Wr8_OqS%S54(h_9$7ilqpRPWlbV+B~P9NW9DZNWx*cy0=E!+JWMVwMX#vM>`Y zoXWu!o0^AnhS?54ex}m{=@g%A2kErRL7Jv}XT^?Aiw>OZ&v1=&CM^w~I*6xc(t|3; zr#`ed=OFXHF*1*JRz8zrP(DGi&$NV444w*wW%7SOF*#6Pr)~X&(k|3`<UVLdIiNW= zpqVx38PNRS;8p>rx0mMWeKa2snhyxg<@CUS=7U@*J(!jUG|x=X>}&?mGbT#%VsnkE zA+<SDCqzk<*hOPyY2`+CDco*GEft4Ng=DFC{%~oxS}-7zTN#VH7^Jc4E{OFQg$qcU zs%CvvGHqNcUcmAy9L|N@Bf|AKj5j*4KdtTX&KgoS(hF6Wsp{?Rp@~Ph-tEAw?lrxG zy)Sjddw@R<V;>JUA19Iy7%j&fF1EHE#@KKov|~fjU?Jl+Fjo+sKD!W}t<X1N>zN9O zZnZ*T;5n0G8W2(+KP0=|_u%62QOUf7&zudvjBJ(hS0quz@#o-S$itG8T53?!`NtrJ zF7F}y;wvcNr!pDlCieRd@Ya1FS`KYS-y9NCyFT=4aEGZAx$Ew|D|x?R!o-tor=)N+ z(}$AKM23tjR`X)aYulN>f<);63M;NY%7GFOOOi=IP?AN{<V`KP)2T@U?l5d%Omt?- z<e0s4%E(I{AP#XGCATIY5;%V-^|YOadeAkX9(@zkyQF<^7glL}_w!IcB)n&$*y|*h z40#CYdKvdGPST4k41)~g486t{5!^6*#A}nUnH^iCs!!Rg^#=8J)k`|KV!17xuR5xS z-?o08vvJ+3`w~W=*v>rYR8n=X^ZGg-;I<7FJf-^ykYg+FJ(vH)xcDXt>j(^#GvgkH z>6*m>(k1e3-+`Gb(o_Y`JX|C6!?;a5fjfh&*qmz|CmH9=z_iVvXD|*9({P;r4(6Xo zRdb^fiv0`?h&Yb+Z5uxbw$v`NLN<Wb^myiKHy58Jw52%iqb%K{c*mgM1l&rlQ906U z?s-QoW{KLbW1Q(n4@Q3gGj#uG%p{{v!o1vn7f+hisBR{p*=f_i6s4wk<Bbz=gAsy8 z1_1a5r(IqcF;xw>yd6bIR1a`#;Ixl?cAy=jmDO;q9*4IhfFX6H4UnRbE}r_L=!wZ+ z6Dsrq3P>D1(mkhsnwOG+3E6s#1sw~hICYou(nv&?k*7}LeX(<PXkRXil-;6~(;u<& z$KW-?o3S6|&p~qGyXYNdvM5_4fA|D^7G--#3if>-@8H025R6}?2P{WFSj!%~?RpM= zZVpi`B2x4t(fb38?&smpFhN5v#zP{IzHxqZw}5w|b{|$0|9s`Idi??-_Ky<y%=DFy zSqg$gyZNDg>xb|~%{~y>O4=u{?DK<zg<m!7bES_WGaiQ+-t2YHIPW}=cf2=v0ZZH+ zyc^7mrwc51Vdc4s^pfHNg;sj84*Vo|=hBN(da;u9QsfHcj`U)!6u$W!lUA1gU@sj| zlKbe8zI}8^-#$8|Zyz1{ga1n^Hb1ywr2)MY^EOlD*vK};x;gU%ieLZocfYITv|uPj z%=q%SW0H-Pl7Y_~>=3&|B*}7jnkreVdfUx*qw4io`gqd;F|P*DFi|PIkJWh3iNLed zxi6D@^a0XelS#YOffum|E!$~;qK7zg8qwo4Tk>jP4sbUIz3}YA<{$FCrjNe=u=kjw ziM1o0p@kShA@2;Ka0q^bn$QSI-UEk_@E`l}v&w^qKZL&=WM-&ozO?fwy<L1ez;Tse z@apV7Ul5>^+#&A3mWM-!D>j(3jQ2zIL-w8*j|w@;-wQs3dmNy+3zMg0oQZvL)ED+K z-gpduO{R0C<veQ7f`zASeG6A3<`Ha0fFs#mM-<PQumeymz(Nj;#lMg3y95)web{9v z>i(e&!In$_ir0VKi{!%hCc3ktm~-)1vj9e1T83&$>3+m5i8o{j{s{@D|7Ss>^joO^ zzmQ7FypL4P#JsMt_!AZnBCjCi(Tx1<1aWmdFba0*>N4=<1o4kBj!FQhFHc~@JF~gO z{ysi}SjAi7IfSLkQ@M9Bf^UiY1;GCJstCx$dBg0K@I(4k5%2(<(l>>^Y4qjKTfK`= zl)MUPV(_l<EZ)N%=+D5dE-}nPf)|0Ew94q4N@vi=u+{WUZ*~D<csGrAUI%+R$tmnq zf-}{hMQApwkO+n14OZWCjg@&{?$PuV2kipdJ`4!c$QD978=-fO{>bJh;*XdfdF!?L z3D$Nn_J^1$zi*}SwX7t1fCK?o8nlNiy|aI%_RRj36k)o!^E8hTc~yi^gEv8po{*%8 z^kh(pFst2377e1~6fJ!Q#pvAw-xE-{>0ZZt;k*hS-YVmx7h8c_f9Y%zqHN>hi1+Gf zx*eI*P4;QcZ;R)djcjx_x)**<x#HZuwG-Ah5Ue&O=@*X!j`83>cr%0-SseP#&FI_1 z4znftJi3A6AI94dYqq3a^j3n*#U~0`VHp`q$xZ2z6%&0jmQ9d^I#xL}4h%BC(dxvJ z%6x&4*eDrevCKDkk@=W=HCYqQtLA#-Nj104%H&ifohpe{=2Z8%iGs<0%D#O_T;9vU zpOK~u7{xc30RXt@Ov9GJsyT-xJSft^$0q>{1&~)oxG?L?IX<q&*Z5%IZOkx2vI&bv zF%V!Lyj#Kh66eRh0Q1@V#SR&Ob{qaH5*Q%5v$eWrVrpgw;>Bx_oi)sdiVF_SkN5{G z=+LVy1gZ8BZN7ORNX7p=JVt!$vySn9@V37>vF-Z|ZTxT=mLX;mZGSc)GHf3qWkFjb z9Pz*GA*Dr9#Im44rt?98+j*!?>gsuO3iyBtSzZDU<7Sgj?8A>%E&vx^GypdT_#I#Q zfJdKD4RB-)-#iTvWcAR`d{+VeteFv{;RR%+#o_$$)K9{9!4t!eKH#NK_e-mQZsfaZ zq-}unCwR*>rT>nZvw4djjj#rg`{^{|g9E6iP|qM&I0N7KS1|7EKZu(Bv+V`B<LQqE zPs|LSI4~GFI~aMe?QDKT10Y$_5G~C2p&g$^i!|}x49t;?f#*D%9%Kd%`NjkD)-k{~ zvX+O^^2dI9=&lXu{s=%_{y2XZZ%2F2!ARu5&+@LV{9Tx?TPI;q3{T43C+0>?KEUG# z|B<^)ZdjW?x?%N_5hvEj2|)kPAHWOJS^_U&_*_eJlD{$Z$~6tfZ$Jfel|OCcZ9#i} zu)1&ws|(i#EB_Q3M7|b=k4^v_p(Y{i0T2%3iI1gH+d%jjQjmTS%%p=mPD<<p&QFJ8 zO8gf2?RHw*$Q?cuzaPF6=YO@6{}}JY7@<LkO&rjQ#TdJv<Rw470T$!CleWUAbVx2% z=BjyqQde(8CNLRcPPN$H+Az*wT+IujBWE*cAnAiIP*~P`ri}y;+9n}YE%j<ZIDS6Z zNHV)w^_#V>j@~h^F<$0QuCjOuMHSyYaoG3}%x7H&83vsFHxl{=Mq9viMl1nPok$+= zhkyLsX&(K+`cZFD?(lBWahy~333=i$#>~6Zh<E~f0XYHP#jF(@F$3V3kptxia=_{u z5n8Ts=Tw%j)l{cZtKlt5ZDk7|XhyY~rXkPVcstI@@HhBXEl6MKWZ(uMpR#9?YGt-0 zsU|5mev+m`7LT!z(|L-mr&&zCc9i#&`bFNj$l?+UiDbwU$y7;RLjpD9<iEumbrx^4 z5P=}13blJ!O;k1f4$g0M)K)9HKyxQ)Tt<w6Q?zG2yca6q7X)6h92A3ca4?wlz-|0< da7{kD#pi-&gHCWLs05{=Ukr**6?4Vh{{RQN=qCUG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b7ece7fa667434febc7b4f89dfc31c7b68da0dc GIT binary patch literal 2187 zcmZuy&2rl|5GEx`qGii={1+#2TlCauCegXmNzyv8obik!yZ)JsF`jTB5|S7L1OtHf zDC3-xbKj$n(0Aw)@Y+*fp{MSWVyr``!3tOcyZe2+3%=}h+73KFzx(UmR?Bhz!A14d zVe%Uc^9P8?p-$vRHQ`bh{_CP9>$EOC>d6Le$R=&d7HvtN`f`CT$Tn@uMY<@L=#uQv zj$Ee8a)qwQRk|wg(R*@@uE}+}E;s0g+@zZ>+V;ejyif1TZMrQV(1(StAs)#cx&w1R zYDTRuE`1QyPMz+;$6x!&ge4)5$nkW{Bqvfunc!rkG!cqLaWW<>iHPPJx$CDY7u z4O<dx{smCZpu3)X`>@QHPR}k5`@!Jo<jwA3-YHi{FAooXKkrvBPtQ({2Cws#^5ywp zuYYoQFzDy)Qt|d+uV0<q>+kQLAD-o2oWwTwK4c*MF}Fdn_HUReXUnJySvcW=i9hmu z71t3Tu}s(i<IK0_HJTeGG8?NTUqC(ATIqZdr`KE?)Nh$N3v>HB!STiG-8cQ<Rj_+} zkS_<bH3k#}-Fn`Z%!ZTFX<@veDQ}%l4Kmbq^CmI~n;J+RJow*)@d}0^Aa1?Lz4G;H zREz3goKK#0Zk=2Awsu>;^*%QsZ65m@swyoK)*D&$(3{zRoInzv5M<#A87dJy-)F+W zJhn{4VYLcXVyw<WtMv1MN_dw%eL*n3HYuM_b7nbVr1Vm}BO|ROF;io?EV2((VN|9= zZratkvq@~oO)La4oat~v?1axBF-2veavWdtq%c#R#n5}?LS-am34yQ`;Rzc;H6joK z6<LBH#!dw{Pp~knvuKf}saC0uG4S~)i*SaZ<AR44N<AJCcFkgewtL?QorxPZHGs}$ z8Ui8LKwVT)poZ_kM&Y`ES@|C^A%-lxA}T2$53^X<IH~Bv6rtO10|&|yWr2$<iSFVV zU^{+g0^(=bdy)Z;lxYAN5fK|p)QBK+z(<@^;oMAO;67vqQQvJTGgDB3$w4X-;1xQ% zH|zh(KxViBheiUf$^?1`cm)<<1dOB45|l}K7?0wxI$vy>LMoZLDpEef_?35{5C~>Q zl^JFNu9SpXD2mF2WK#m6LL_sffIF39=Q06oB(oYOU>$OQ9Y;LEQYSJ4VhYMeSrX!Y zfNm$1X%mmZSEhmAyGD47F+*cc=G&)goGvLTEo;J5hFDn@F?18&qCIjjBG^xeuIf+C zxt*rGw~sYY)(^&8b{Igzh8u()G(J9f8`NQ(!Y~g(l->Wi_Q``AzzbZw1p=7CJ>U+y zbzOr!c@w%>C1cuBLlJ+-c(+0Q3Qq17ccO<)lsC&3$~}Dhr=!1z)Bg=#{c?G3;O4u0 ztKM6Fb-A0Sd(5)SLlrV{dB$aWnNGtA)ADHwMb5_XApi}2Fsi>%1v8!Ii*v00ggAT< zj@x#d@cXzkyQ+H61e!N5dUM<1e)NOchHfMGu(CDMpdX>wK|xSp;HCHhXZJy@!Z3J~ zI$OT$HwzsQ<bt9QgYI{ED+nSL20>nj8-lLRauih27i?<eUt>ZvW<#S%4WD&KBM!ZQ z0>Afq5ycXU4vJ+ID=07$eGkPNiggqlAn5YUAvnhb=uLdHg#rQSA8}8!+@rTqa|g4S aA=cb~R(_;kATooIcs1WWTi9@yYX1ZNW`&sm literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d75e89ba653e62530bd01f6e6f0597952efb0ff7 GIT binary patch literal 6652 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/locals.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/locals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b25a6e5c459330c2ecc448db6cc99b58f7256620 GIT binary patch literal 393 zcmX|6O-lnY5KZ=@Ewu%Y9&@c=&mtmf1uvzDtq5W160+HD+kBCv!uB8e6Z|WC_2ggh z<ZQLhkoP9T8|KaZaM(u>m&=dkEJ5hA{Tw5L;ufAC0~Cm&0vD0Qi<V;<shGyNtrMB3 zl%^Pobkm`oBAKI6x~Fpyh$%_A(>$z=_M~)1k*E5RDM3QT0%1;&is_;z!9ejQ$XfS9 zC5SYfNuojME#rce#*y0W98sp&N$~}K&<Hp993XiXJj_Pjrkm%5;dxF^ZM}lgF^8pr z>EP+fU&n#e#V||<{~BprlX3$@(@9J3$aO$+fbZ$#Dtqz5`Rvtfg4kwv);_SnvT18E uTL@({Tl0!JbpcklY_--a=(GlobhyTkZQb;)e-F4hg9W|^kVHK^fcyd48*=IZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13b37001223c0802fe16b167ccc38a3e70f1c6e4 GIT binary patch literal 872 zcmY*XO>fgM7`Br%$-1r-ZHK`r;?@J@iqM4E2S}BsB5i{~R4wviw{_z<k?k-#vD5eg z9QXn4k)Oa{@s-p5!cM$NH3?k3&+GSb{rLUJ!PZtA!FqY|`vSWN{i%b8<-q0*m_7iY zh+=`_wZ}1TVkdUMJHpMq*u(XiD_Xf9`>^+>I1Xrwdf!nTQhbW~{vGI`Q6JmQDKjTb z7nMp`9cn6a!evtEueSS<Q&uGVl_`djo3y@DFANrf9fIkf02CXvL@Si}>W9HgXNB~| zqGw#{+~TFTLO19f$$^JVD{HGg3<8jqdxJhBxeKfh?8$$u^9g}Y@C~gnMkZWtte}d_ z0rj@ooOf<9ZDk%r;d0A_^X~Fd%~Jmf{J*|I1E?{)-ajNlFd9u%kw<36qD!LLAdTjg zHqj-U6pBTZ>r#+KlozxTEaE!iP%0;aUo$$0{Uf5TxV-L_iz&%j!qY+y44+I!_xQzK z-3V2~S-)pP&@rHyE0`XNpPf`vayfkmj~`T$3U<!TY;?L`mV&3m@ItD3tkzSEP#X;2 zzg4PGc6(HqVO|QBGiexY$arTcwSi*(yKbFATOa0^UQz1`CatR%+ImDyzt~nfqg+|9 zBxYs<*h)yhkK@ObO-Ln7Q%ORJA-|B?hCJ?%4_}QxXr}b|yqFu7jUm$`I3FJuDG}o{ zmY3slk<N(9pO+-f$P}srrtZsw%Sj3!&Y)Z<4<t9h^ezB$Iyl4*?%^)@E^fo`Dc;5X z4Hdwt+N_}q5O>#lgEE`exiuY%{WaP2)doodjYyK_g(mZVU<Wj8xVIkW>v}S}0}#Ti LA@1Og<2!!=`E2X2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/midi.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/midi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae58c1a804d096edde331142c608ec321cf88a1e GIT binary patch literal 22834 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..317a4165e457772f532e0bb9e21962def9adb0d0 GIT binary patch literal 2416 zcmZuzO^+Kz5bYk1?eXkKBC@Om5~4w%wWW>ED9R#|K%|vmgGf+<vt-okZhL1vGwpQu zY+~fS#Q6~%liav-;h&(sa>`%eL{-mt?L>?<Jzrg~s$W&T_U)~$n85MXlfRz)9TD;m zJ}eJ-Cf~qm&S4N_Km;Ar0TqF0WWgZt*T$d$*Dwq7=AcQ5Y%a*4HQRxA&8(eAgDCF| zI+Q#l#TOxw@g&xQ68wplXul+bj)+7DuF)@~2p$o+F`^<C^d%i^ipG7?+u-AXka#*7 z3vM|}4dcwD`81RJOg^`=FzHDq*)u+4Bc<Wvln*C-ESXh|51*E)mdsm@QkWKNX;i6) z()8o_!Kq|pX@9C;u~AtJZK?`%BEj;UXR@#eWMQVUybxRqmWov6W}lgIc*?km@#9Ek znR=EMW0t2yn)8hL5Oc8S2zeuBaQFc}C~cXU0faKKe<$Q<J(6xJz%U)9QtvZZdBJme zkR*6Xl3s;{c<^b;?I}9|pg!L9MXGUD7ts5;5@jaM;~L=Cev%*ufZ%<4fOoCWR9bXv z(0y3vGKiIdmbTOdL!9o?XQ6bC&bv7D_8It<2YdQtuNTJ;Ph|l)Ns>%)A$5`<w^K+0 z5(`WtcU7EhoSwtnlNn5|777tq_AJdZ2J}cBucr!fl3IhDB~@8qL0q!UAXBUk6)-r~ z42FC?OD8f`CueeKS+~v~yKgll?(kl(AG?h;CvTzX$x)B`m&xs!l?EmS?#i-;5@WUG z`PvKlJT=w~p<w-iR|@AHI86wHpit4l(cM2_bh~w>CQ2t7>rML=xUEZk<UzN<&JX|o zaOcMH&qiu<{7{`)IXS*Hoqh{Vas0g+^6dD5%%{iG+3=L>{Cb5A>w-69fVsR>ebk@M zbQ6F-!N`2L)Ia}!=%@phyr6<W_!KF*cBJg#l5;7((^~0XFjy^Vw7w*b0IP-Q4n86u zpTfCxkI$Fx+wg!!p1D8a#*#UmlSQC+EUoVD6C0d0=JX?S5!i4Z2+*ZP<DxMKJ(@)N zwrz@rZOwxP-6ae9g4*_3^s3{>c;0voXs?5d5HL1GI3fCt$7p(t<{Yk*j(#)So;P1@ z&coOAq6G@J6B6451^c~HFi@=c5wTnI)&lZsw>|b1oGn_50H|v7o2XsbX}4-A;!u}d zaFndN4lC8Fs(-0nn0Q~rs~+rEFa<lj=h?10<3uveQzJo@M!uPrwZn$IV1=>_W{gx> z2+%u><1T2Ve9kd-D;>#azKIUr(V)G222y|@`e)PeUayaVccG^d2GS1-d&)r_p@ZKE zJ1<S;wal^^ds^}gg-k#<gT`TxSIX&OJOXyPDl>5zDoYEL$EASPksrcK1+)ygkszIG zjapGr_q!)J^X*<U+-D4I(Utd!_Fh_Y*fM~f(#TPnp~}OZSCxu=3$k!h;xZLFs~2id zJ%|RWlNv#b+Uz}*S@~XLe4ou!$-uA20N-FPaMSSgs}ZCSHZ69C-TLvc%D0P_qJ8w+ zwJ!}A7|1F}WToVv^@6tz=nlOJgNs)(>jHh!yXsroH=1hzp{`wT39bzb;;=y1uB*v~ zT28eKlyM=-xC?PFaP4|OahvBLJFt%>X)#hR0&}msu3gKb3)NH>E?Vvdy|#;2wd>mT z9^@JjfeS{3{tyFhRl9-<asBV>0}AKoa2f^!xf;_ri0LMc=vBH)tGj@1!><)Yw72Ej zNg~uRN$`eeS(4~0V5fIr7;IG{*dHp~skEo;WBA~<ATUs>`aglE%9G|cK;2-Q_N|6V rsJ0}HL9GSqwHejSMK>#Mzy1K8%q|RJ(1Kti2)PvmbO!>Bg6+nCxyZuw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..611a04b455eb73f6adcc86b45bb1daf1d5097811 GIT binary patch literal 3007 zcmbtW&u<$=7~OT^+Sw*SLPFxeVUDqsxNW4Os;UqnN#OtyN>h+RRBOC5wx`*hS!QPA zIw}|74{4A53H&R*a^l9B6YrbdjpK-xirVsyXLo*l@4fGRvtMj%BoRIjp8fvp=|&X& zL7nE)!k^Faa|gJH=rj_sXk~HUI$en)u_9J~jZRlZTiin179G(=drPc|1Z_v$7VBuc zVnb}AT@$S*QSSpTSE8txjd?CvZbX?$HZqp+G?mUNJ!a07S}@1+0*?guJV_pxI`ztE z$Gl;w(HGKsHk5uUrDnR!iy7nA@|j~CQ=iZRi5WhZsds&LGEuJCX{xe}8J*2AoAC>- zGCssE(+Sq8V@kPZrIXB0WFlX9X*JL4Jqn(l^RetFN!TI;$7pdbBr_vSF{MKUjye?p z#|mkglL%UDhv+0vC-uVwbFmF0sLGekB8Z1y;I3z!72JB2mKnEzkW1~E(#)$|_Ss`& z5n!Nco9^!J?wo&hNo3~SZ!?+6Fdp;_5yJf{KrBl{QPc$R4Lgqjo87;&yL<QU-8y&& z)Q5}EX#o)RU}va2gM9Zs4gZw(axCpO6S9z6kemkb0wW1o$JS5wn8Oaz)LM@eG?;LN zG&SskXQixZtHDhtG=PHveSJz2grs>!2T{tRFxE>^V{|j@k|RzllY~_oCdmmA9ysu` z0y3MRHmQ!3NGDv6X#vk{sflMiB@_e!SuqGRY2sEd$t47bst6B~TKQwCEFwoRS6mMb zgrwn!!U43!T21;mHdTJoFc<g<>4`ABl|0~Ztkh18HA1SXb=!%eOq0t#30Nou={!lR zpx2-9Y;=^y)ZjxctQYO$=g9ItdKJHnUdM1{eEC<E{(YxKz}OGht&r%whd}2`t1IG& zOvd&NTvz#^Np*y1C@ZQ3>R|y2;4>|!HSy&41%iN_e4Cm=fvE5#C?Cu#!){?o5C;45 zY)VcCO=JZSQDuA`BA6OklZQz)q+Gp_wm+7BptSN^y?%JuYt6f%bO7<Z9oFx~^R}bn z@mpluAn5O-{fB2yowV-kd-L4O^RvC8I6xwweQi>not?<MI4fpI8k_G_#R2-_4i&ei zxgxZfS)%_Q(NA?XS_}Pm(}&-Id^aVkd4G#Y$8rRp=~VttrThd=5J>CPqh{J>wIz{A z23{9kN{p)T_SrW^sL`x3&ou!nlLhHQ{!oc-JV^>yg1?K(b<OU-NnuMo&pS0wz1Xgz zAEd1=x2W5}<q>|3DAa#PQ9A!3O3u&aAY{>2l~h;e31A!ZRA*RY7IHVNQ>#=n7<dSm z{a~WnLq*1C;nWK2)pUoXUwAJt8d#}MzOYPQIyyG7nevKf>XIrQj7KJ_^r@}X40I~T z2??{BFeWTmsZ$DNuF5&7-fLB4Cky=Gn-cye-(B4M@*3aNU*elY+ou7a;PNth6}^sr zLM!6)75lNr3&=0=&#_oR*;>7{H$Aabq*)~a6~{#lJ3@i3R5&>N_V{pr@8s}+?No0C z%kL6aGHs^JHRnoIIOgpz>heRSaaO73w4qIoP*mEPnMylPzN2&O&{|`A@#$KimxkP6 zW4^Hz@G-%rtc=>-xEtGb{7b3Ze5i;AZYYxlmG0K%<R%AH>aI3qTMOtofZhkWUBjl= z08ouw7-_z-wC@jiSXruV@ml%cFwWl!!(GSWOS~Jt4-%y2+p%meVR6H2U^el;m&`kZ zfiUS{aQaal_n<jV0`;ex%l+Vv$`4dvEM<L=H;`j#(VNUt9?ZLss+Z)?cF=P)Y_+xC L>fR3DwQlDhLsEBF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc205a2d0932556ff2a096f659b2491292e21607 GIT binary patch literal 46067 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56f1e5581cc484b75e446a9874fef7ac76f5e86e GIT binary patch literal 10213 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95492862ddefcea8dcbbefc9b1911f7bd5b442a0 GIT binary patch literal 8757 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/__pycache__/version.cpython-37.pyc b/venv/Lib/site-packages/pygame/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d22e406220734850366920d4918322a828569b6 GIT binary patch literal 1899 zcma)6Pj4GV6rb5$+v{xt6>1}j5E=xcSrk_3r2-V9LMw3qtV%6KvfQqwI}>N!**~2b zC)lx1$r<qxk|PH`0AFRVoO0&Y6YuTXri~KOvFFXq?wjBH^LuZ<TVD?dj4z-4_3Y0M zA%EjxIXu|hgK4%v2+}9t6G4S@LWCpfvD<fq+jpfSJkb(uID4YgZwdbq3A_AvO30%$ zE7gSAeaVus)-ty&&5h+sNx{m=kY|z|NNv(0kJw|-S{y)Yuh1E{@Pef#Ft*TeBh70l zEr(;p^%5W}#8^qj4ZGbyMu2iVVn0Y(runeGvcL^q$K}ctj34k+@#k<Kz&SIr<eFQ_ zmY_-%hlWjxF|!4;(pZEG-gKQErgpy=Lu^@DXuGtTae!QCHgHi8V36em)bmSYHGrc8 z<LZ!43`>d(+>vakCHSPlGzTa12`jZcNQ<!vv{aHCX(G0{pJiKYoZD2fL%1Tr(_(4E zuw8a%I}8$_aW!1n-GgZ!f{>(7fnZ0_zAGFc(iPqb0WyJDSlgl_d{{fu7hMsYkYn2K z!v5M~AHaTXvA-tPp#a{g)*sdcKWX^=gM@C?%J`_zu%tOICAZ0bf<=Y{*EY=iFwJ`) zEIFk!GNUtR=I*&?4xrLr=u|B`E|si0ah%J;I1ataO_b3Xk46yPLg6gMtDo+FJ^0yx z8-rhpk(Dn7-<IVAZu#KHBH?QASZ3v*oFw~PXJ3>&dBKN3Aw0qITrP_Oipq(GCLtfg zG-!d)>CHFdj22!cQ2zBmtyNgtaA-Qnk{KC6c*o8INamah_tdd2Jo84aV=BDU_Kcp< zI_Oq!1%@$VbOz@~AZFz0#=x1=xg*GFovSnF38CaAFbVl`rmds-H%IecNUL_!Qb2<f zZTH<hB`WuTtN#+Ey8!sAyEBxz{I%4(pP~_T-y_rTVvt&vI*y|qg*i04(dyQ;eKg-Z znuk+oi-n!aou(z2PNfn?<Cms#jn!2*juXX=iQ~$Lj6tSh=Z%Uq2ZB8#)t-JAlrK1k zx{cva(6_pB=mwo`T<+Z}ZO8=%QkNDwA?OHF_Zz_!^``#OJgWa8tzCrW1}I%L4h09U z$MI+I?n?4&jmr)DaBl{tZ#8Dm;n>)?!k)jQc=lZI-Az#Z2emH-x>R^OdzghfrpxW= z_u+krI=4W)9V908{~$kKLiWNnjeT7Oaol_mf%COEemUl9Q2|gEMimyyqM;vqP2WVZ zffxN!7p2s8a%HnOoM9nr3>RC(TnFJ(4}QMmyS}qV*J%BA+PV{c72VYzfWkT6Imbq= zNH1*T*F_Ww_<@gVZRi%M`)v^UIICRv1iw}wbs`X=@^_lpc0YuZLC!tr`nm@;{{{4k B&I14d literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/_camera_opencv_highgui.py b/venv/Lib/site-packages/pygame/_camera_opencv_highgui.py new file mode 100644 index 0000000..6acf190 --- /dev/null +++ b/venv/Lib/site-packages/pygame/_camera_opencv_highgui.py @@ -0,0 +1,98 @@ + +import pygame +import numpy + +import opencv +#this is important for capturing/displaying images +from opencv import highgui + + + +def list_cameras(): + """ + """ + # -1 for opencv means get any of them. + return [-1] + +def init(): + pass + +def quit(): + pass + + +class Camera: + + def __init__(self, device = 0, size = (640,480), mode = "RGB"): + """ + """ + self.camera = highgui.cvCreateCameraCapture(device) + if not self.camera: + raise ValueError ("Could not open camera. Sorry.") + + + def set_controls(self, **kwargs): + """ + """ + + + def set_resolution(self, width, height): + """Sets the capture resolution. (without dialog) + """ + # nothing to do here. + pass + def query_image(self): + return True + + def stop(self): + pass + + def start(self): + # do nothing here... since the camera is already open. + pass + + def get_buffer(self): + """Returns a string containing the raw pixel data. + """ + return self.get_surface().get_buffer() + + def get_image(self, dest_surf = None): + return self.get_surface(dest_surf) + + def get_surface(self, dest_surf = None): + camera = self.camera + + im = highgui.cvQueryFrame(camera) + #convert Ipl image to PIL image + #print type(im) + if im: + xx = opencv.adaptors.Ipl2NumPy(im) + #print type(xx) + #print xx.iscontiguous() + #print dir(xx) + #print xx.shape + xxx = numpy.reshape(xx, (numpy.product(xx.shape),)) + + if xx.shape[2] != 3: + raise ValueError("not sure what to do about this size") + + pg_img = pygame.image.frombuffer(xxx, (xx.shape[1],xx.shape[0]), "RGB") + + # if there is a destination surface given, we blit onto that. + if dest_surf: + dest_surf.blit(pg_img, (0,0)) + return dest_surf + #return pg_img + + + +if __name__ == "__main__": + + # try and use this camera stuff with the pygame camera example. + import pygame.examples.camera + + pygame.camera.Camera = Camera + pygame.camera.list_cameras = list_cameras + pygame.examples.camera.main() + + diff --git a/venv/Lib/site-packages/pygame/_camera_vidcapture.py b/venv/Lib/site-packages/pygame/_camera_vidcapture.py new file mode 100644 index 0000000..7ee77b6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/_camera_vidcapture.py @@ -0,0 +1,133 @@ +"""pygame.camera.Camera implementation using the videocapture module for windows. + +http://videocapture.sourceforge.net/ + +Binary windows wheels: + https://www.lfd.uci.edu/~gohlke/pythonlibs/#videocapture +""" +import pygame + +def list_cameras(): + """Always only lists one camera. + + Functionality not supported in videocapture module. + """ + return [0] + + # this just cycles through all the cameras trying to open them + cameras = [] + for x in range(256): + try: + c = Camera(x) + except: + break + cameras.append(x) + + return cameras + +def init(): + global vidcap + try: + import vidcap as vc + except ImportError: + from VideoCapture import vidcap as vc + vidcap = vc + +def quit(): + global vidcap + pass + del vidcap + + +class Camera: + + def __init__(self, device =0, + size = (640,480), + mode = "RGB", + show_video_window=0): + """device: VideoCapture enumerates the available video capture devices + on your system. If you have more than one device, specify + the desired one here. The device number starts from 0. + + show_video_window: 0 ... do not display a video window (the default) + 1 ... display a video window + + Mainly used for debugging, since the video window + can not be closed or moved around. + """ + self.dev = vidcap.new_Dev(device, show_video_window) + width, height = size + self.dev.setresolution(width, height) + + def display_capture_filter_properties(self): + """Displays a dialog containing the property page of the capture filter. + + For VfW drivers you may find the option to select the resolution most + likely here. + """ + self.dev.displaycapturefilterproperties() + + def display_capture_pin_properties(self): + """Displays a dialog containing the property page of the capture pin. + + For WDM drivers you may find the option to select the resolution most + likely here. + """ + self.dev.displaycapturepinproperties() + + def set_resolution(self, width, height): + """Sets the capture resolution. (without dialog) + """ + self.dev.setresolution(width, height) + + def get_buffer(self): + """Returns a string containing the raw pixel data. + """ + return self.dev.getbuffer() + + def start(self): + """ Not implemented. + """ + + def set_controls(self, **kwargs): + """ Not implemented. + """ + + def stop(self): + """ Not implemented. + """ + + def get_image(self, dest_surf = None): + """ + """ + return self.get_surface(dest_surf) + + def get_surface(self, dest_surf = None): + """Returns a pygame Surface. + """ + abuffer, width, height = self.get_buffer() + if abuffer: + surf = pygame.image.frombuffer(abuffer, (width, height), "RGB") + + # swap it from a BGR surface to an RGB surface. + r,g,b,a = surf.get_masks() + surf.set_masks((b,g,r,a)) + + r,g,b,a = surf.get_shifts() + surf.set_shifts((b,g,r,a)) + + surf = pygame.transform.flip(surf, 0,1) + + # if there is a destination surface given, we blit onto that. + if dest_surf: + dest_surf.blit(surf, (0,0)) + else: + dest_surf = surf + return dest_surf + +if __name__ == "__main__": + import pygame.examples.camera + + pygame.camera.Camera = Camera + pygame.camera.list_cameras = list_cameras + pygame.examples.camera.main() diff --git a/venv/Lib/site-packages/pygame/_dummybackend.py b/venv/Lib/site-packages/pygame/_dummybackend.py new file mode 100644 index 0000000..49b3e30 --- /dev/null +++ b/venv/Lib/site-packages/pygame/_dummybackend.py @@ -0,0 +1,30 @@ +"""dummy Movie class if all else fails """ +class Movie: + def __init__(self, filename, surface=None): + self.filename=filename + self.surface = surface + self.process = None + self.loops=0 + self.playing = False + self.paused = False + self._backend = "DUMMY" + self.width=0 + self.height=0 + self.finished = 1 + def play(self, loops=0): + self.playing= not self.playing + + def stop(self): + self.playing=not self.playing + self.paused =not self.paused + + def pause(self): + self.paused=not self.paused + + def resize(self, w, h): + self.width=w + self.height=h + + def __repr__(self): + return "(%s 0.0s)"%self.filename + \ No newline at end of file diff --git a/venv/Lib/site-packages/pygame/_freetype.cp37-win32.pyd b/venv/Lib/site-packages/pygame/_freetype.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..ae9f6fbe7f27ce3fee08b545655de0799fa4c79c GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/_numpysndarray.py b/venv/Lib/site-packages/pygame/_numpysndarray.py new file mode 100644 index 0000000..f531a9a --- /dev/null +++ b/venv/Lib/site-packages/pygame/_numpysndarray.py @@ -0,0 +1,76 @@ +## pygame - Python Game Library +## Copyright (C) 2008 Marcus von Appen +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Library General Public +## License as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Library General Public License for more details. +## +## You should have received a copy of the GNU Library General Public +## License along with this library; if not, write to the Free +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## +## Marcus von Appen +## mva@sysfault.org + +"""pygame module for accessing sound sample data using numpy + +Functions to convert between numpy arrays and Sound objects. This module +will only be available when pygame can use the external numpy package. + +Sound data is made of thousands of samples per second, and each sample +is the amplitude of the wave at a particular moment in time. For +example, in 22-kHz format, element number 5 of the array is the +amplitude of the wave after 5/22000 seconds. + +Each sample is an 8-bit or 16-bit integer, depending on the data format. +A stereo sound file has two values per sample, while a mono sound file +only has one. +""" + +import pygame +import pygame.mixer as mixer +import numpy + + +def array (sound): + """pygame._numpysndarray.array(Sound): return array + + Copy Sound samples into an array. + + Creates a new array for the sound data and copies the samples. The + array will always be in the format returned from + pygame.mixer.get_init(). + """ + + return numpy.array (sound, copy=True) + +def samples (sound): + """pygame._numpysndarray.samples(Sound): return array + + Reference Sound samples into an array. + + Creates a new array that directly references the samples in a Sound + object. Modifying the array will change the Sound. The array will + always be in the format returned from pygame.mixer.get_init(). + """ + + return numpy.array (sound, copy=False) + +def make_sound (array): + """pygame._numpysndarray.make_sound(array): return Sound + + Convert an array into a Sound object. + + Create a new playable Sound object from an array. The mixer module + must be initialized and the array format must be similar to the mixer + audio format. + """ + + return mixer.Sound (array=array) + diff --git a/venv/Lib/site-packages/pygame/_numpysurfarray.py b/venv/Lib/site-packages/pygame/_numpysurfarray.py new file mode 100644 index 0000000..e6cf3d8 --- /dev/null +++ b/venv/Lib/site-packages/pygame/_numpysurfarray.py @@ -0,0 +1,356 @@ +## pygame - Python Game Library +## Copyright (C) 2007 Marcus von Appen +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Library General Public +## License as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Library General Public License for more details. +## +## You should have received a copy of the GNU Library General Public +## License along with this library; if not, write to the Free +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## +## Marcus von Appen +## mva@sysfault.org + +"""pygame module for accessing surface pixel data using numpy + +Functions to convert pixel data between pygame Surfaces and Numpy +arrays. This module will only be available when pygame can use the +external Numpy package. + +Note, that numpyarray is an optional module. It requires that Numpy is +installed to be used. If not installed, an exception will be raised when +it is used. eg. ImportError: no module named numpy + +Every pixel is stored as a single integer value to represent the red, +green, and blue colors. The 8bit images use a value that looks into a +colormap. Pixels with higher depth use a bit packing process to place +three or four values into a single number. + +The Numpy arrays are indexed by the X axis first, followed by the Y +axis. Arrays that treat the pixels as a single integer are referred to +as 2D arrays. This module can also separate the red, green, and blue +color values into separate indices. These types of arrays are referred +to as 3D arrays, and the last index is 0 for red, 1 for green, and 2 for +blue. + +In contrast to Numeric Numpy does use unsigned 16bit integers, images +with 16bit data will be treated as unsigned integers. +""" + +import pygame +from pygame.compat import bytes_ +from pygame.pixelcopy import array_to_surface, surface_to_array, \ + map_array as pix_map_array, make_surface as pix_make_surface +import numpy +from numpy import array as numpy_array, empty as numpy_empty, \ + around as numpy_around, uint32 as numpy_uint32, \ + ndarray as numpy_ndarray + +#float96 not available on all numpy versions. +numpy_floats = [] +for type_name in "float float32 float64 float96".split(): + if hasattr(numpy, type_name): + numpy_floats.append(getattr(numpy, type_name)) + +# Pixel sizes corresponding to NumPy supported integer sizes, and therefore +# permissible for 2D reference arrays. +_pixel2d_bitdepths = set([8, 16, 32]) + + +def blit_array (surface, array): + """pygame.surfarray.blit_array(Surface, array): return None + + Blit directly from a array values. + + Directly copy values from an array into a Surface. This is faster than + converting the array into a Surface and blitting. The array must be the + same dimensions as the Surface and will completely replace all pixel + values. Only integer, ascii character and record arrays are accepted. + + This function will temporarily lock the Surface as the new values are + copied. + """ + if isinstance(array, numpy_ndarray) and array.dtype in numpy_floats: + array = array.round(0).astype(numpy_uint32) + return array_to_surface(surface, array) + +def make_surface(array): + """pygame.surfarray.make_surface (array): return Surface + + Copy an array to a new surface. + + Create a new Surface that best resembles the data and format on the + array. The array can be 2D or 3D with any sized integer values. + """ + if isinstance(array, numpy_ndarray) and array.dtype in numpy_floats: + array = array.round(0).astype(numpy_uint32) + return pix_make_surface (array) + +def array2d(surface): + """pygame.numpyarray.array2d(Surface): return array + + copy pixels into a 2d array + + Copy the pixels from a Surface into a 2D array. The bit depth of the + surface will control the size of the integer values, and will work + for any type of pixel format. + + This function will temporarily lock the Surface as pixels are copied + (see the Surface.lock - lock the Surface memory for pixel access + method). + """ + bpp = surface.get_bytesize() + try: + dtype = (numpy.uint8, numpy.uint16, numpy.int32, numpy.int32)[bpp - 1] + except IndexError: + raise ValueError("unsupported bit depth %i for 2D array" % (bpp * 8,)) + size = surface.get_size() + array = numpy.empty(size, dtype) + surface_to_array(array, surface) + return array + +def pixels2d(surface): + """pygame.numpyarray.pixels2d(Surface): return array + + reference pixels into a 2d array + + Create a new 2D array that directly references the pixel values in a + Surface. Any changes to the array will affect the pixels in the + Surface. This is a fast operation since no data is copied. + + Pixels from a 24-bit Surface cannot be referenced, but all other + Surface bit depths can. + + The Surface this references will remain locked for the lifetime of + the array (see the Surface.lock - lock the Surface memory for pixel + access method). + """ + if (surface.get_bitsize() not in _pixel2d_bitdepths): + raise ValueError("unsupport bit depth for 2D reference array") + try: + return numpy_array(surface.get_view('2'), copy=False) + except (ValueError, TypeError): + raise ValueError("bit depth %i unsupported for 2D reference array" % + (surface.get_bitsize(),)) + +def array3d(surface): + """pygame.numpyarray.array3d(Surface): return array + + copy pixels into a 3d array + + Copy the pixels from a Surface into a 3D array. The bit depth of the + surface will control the size of the integer values, and will work + for any type of pixel format. + + This function will temporarily lock the Surface as pixels are copied + (see the Surface.lock - lock the Surface memory for pixel access + method). + """ + w, h = surface.get_size() + array = numpy.empty((w, h, 3), numpy.uint8) + surface_to_array(array, surface) + return array + +def pixels3d (surface): + """pygame.numpyarray.pixels3d(Surface): return array + + reference pixels into a 3d array + + Create a new 3D array that directly references the pixel values in a + Surface. Any changes to the array will affect the pixels in the + Surface. This is a fast operation since no data is copied. + + This will only work on Surfaces that have 24-bit or 32-bit + formats. Lower pixel formats cannot be referenced. + + The Surface this references will remain locked for the lifetime of + the array (see the Surface.lock - lock the Surface memory for pixel + access method). + """ + return numpy_array(surface.get_view('3'), copy=False) + +def array_alpha(surface): + """pygame.numpyarray.array_alpha(Surface): return array + + copy pixel alphas into a 2d array + + Copy the pixel alpha values (degree of transparency) from a Surface + into a 2D array. This will work for any type of Surface + format. Surfaces without a pixel alpha will return an array with all + opaque values. + + This function will temporarily lock the Surface as pixels are copied + (see the Surface.lock - lock the Surface memory for pixel access + method). + """ + size = surface.get_size() + array = numpy.empty(size, numpy.uint8) + surface_to_array(array, surface, 'A') + return array + +def pixels_alpha(surface): + """pygame.numpyarray.pixels_alpha(Surface): return array + + reference pixel alphas into a 2d array + + Create a new 2D array that directly references the alpha values + (degree of transparency) in a Surface. Any changes to the array will + affect the pixels in the Surface. This is a fast operation since no + data is copied. + + This can only work on 32-bit Surfaces with a per-pixel alpha value. + + The Surface this array references will remain locked for the + lifetime of the array. + """ + return numpy.array(surface.get_view('A'), copy=False) + +def pixels_red(surface): + """pygame.surfarray.pixels_red(Surface): return array + + Reference pixel red into a 2d array. + + Create a new 2D array that directly references the red values + in a Surface. Any changes to the array will affect the pixels + in the Surface. This is a fast operation since no data is copied. + + This can only work on 24-bit or 32-bit Surfaces. + + The Surface this array references will remain locked for the + lifetime of the array. + """ + return numpy.array(surface.get_view('R'), copy=False) + +def array_red(surface): + """pygame.numpyarray.array_red(Surface): return array + + copy pixel red into a 2d array + + Copy the pixel red values from a Surface into a 2D array. This will work + for any type of Surface format. + + This function will temporarily lock the Surface as pixels are copied + (see the Surface.lock - lock the Surface memory for pixel access + method). + """ + size = surface.get_size() + array = numpy.empty(size, numpy.uint8) + surface_to_array(array, surface, 'R') + return array + +def pixels_green(surface): + """pygame.surfarray.pixels_green(Surface): return array + + Reference pixel green into a 2d array. + + Create a new 2D array that directly references the green values + in a Surface. Any changes to the array will affect the pixels + in the Surface. This is a fast operation since no data is copied. + + This can only work on 24-bit or 32-bit Surfaces. + + The Surface this array references will remain locked for the + lifetime of the array. + """ + return numpy.array(surface.get_view('G'), copy=False) + +def array_green(surface): + """pygame.numpyarray.array_green(Surface): return array + + copy pixel green into a 2d array + + Copy the pixel green values from a Surface into a 2D array. This will work + for any type of Surface format. + + This function will temporarily lock the Surface as pixels are copied + (see the Surface.lock - lock the Surface memory for pixel access + method). + """ + size = surface.get_size() + array = numpy.empty(size, numpy.uint8) + surface_to_array(array, surface, 'G') + return array + +def pixels_blue (surface): + """pygame.surfarray.pixels_blue(Surface): return array + + Reference pixel blue into a 2d array. + + Create a new 2D array that directly references the blue values + in a Surface. Any changes to the array will affect the pixels + in the Surface. This is a fast operation since no data is copied. + + This can only work on 24-bit or 32-bit Surfaces. + + The Surface this array references will remain locked for the + lifetime of the array. + """ + return numpy.array(surface.get_view('B'), copy=False) + +def array_blue(surface): + """pygame.numpyarray.array_blue(Surface): return array + + copy pixel blue into a 2d array + + Copy the pixel blue values from a Surface into a 2D array. This will work + for any type of Surface format. + + This function will temporarily lock the Surface as pixels are copied + (see the Surface.lock - lock the Surface memory for pixel access + method). + """ + size = surface.get_size() + array = numpy.empty(size, numpy.uint8) + surface_to_array(array, surface, 'B') + return array + +def array_colorkey(surface): + """pygame.numpyarray.array_colorkey(Surface): return array + + copy the colorkey values into a 2d array + + Create a new array with the colorkey transparency value from each + pixel. If the pixel matches the colorkey it will be fully + tranparent; otherwise it will be fully opaque. + + This will work on any type of Surface format. If the image has no + colorkey a solid opaque array will be returned. + + This function will temporarily lock the Surface as pixels are + copied. + """ + size = surface.get_size() + array = numpy.empty(size, numpy.uint8) + surface_to_array(array, surface, 'C') + return array + +def map_array(surface, array): + """pygame.numpyarray.map_array(Surface, array3d): return array2d + + map a 3d array into a 2d array + + Convert a 3D array into a 2D array. This will use the given Surface + format to control the conversion. + + Note: arrays do not need to be 3D, as long as the minor axis has + three elements giving the component colours, any array shape can be + used (for example, a single colour can be mapped, or an array of + colours). The array shape is limited to eleven dimensions maximum, + including the three element minor axis. + """ + if array.ndim == 0: + raise ValueError("array must have at least 1 dimension") + shape = array.shape + if shape[-1] != 3: + raise ValueError("array must be a 3d array of 3-value color data") + target = numpy_empty(shape[:-1], numpy.int32) + pix_map_array(target, array, surface) + return target + diff --git a/venv/Lib/site-packages/pygame/base.cp37-win32.pyd b/venv/Lib/site-packages/pygame/base.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..858bc55fefdcb92b6e6e3ee71fdaf5ab1237ae64 GIT binary patch literal 25600 zcmeHw4}4VBmH(Y&5(XHY!6q6o%BZ1$0?uS6$t3e93Hb+>KNAurL?A;*Cd|bAbLNeJ zB4USBhDTa<i(S{HT`W{x>(*#p#D6##O2Ab_>K|J4*R-<hXt0e+Au4r#-*ex4lL^7r z-OuOu`|N(&hv&U}&pr3tbI(2Z+;i`H6BpgGgQYUY)PQ)LvHf_`Rl@Io{-#$kcG<LN zFJn)QfA!k^s)es!TkG=&4PAlGwSmTVLsMf%N2g#|<23|A9R`1gp?pb=p}n)&J9pBg z2{|(B4S&r1SI5pfzf{0-CiZ0^^64+%5iiEmbyRw$zq~$f=lD(WeEz(fKOg&(RQ}EJ z?|<n8-m&wJFYEB!{&JAhZ-4nt{(Su9Eniao?JsZO`KA6QAGLXL4_y_EEmWnm)2@Rn zm9hbra_vObWsKzmGgrb+`39bPfQ#q#Je|T=x>THavM3OwTwE!v1R6sns+V|5*{)@b z)dG76&+Syao3UYfUVQa3wla+|!&1hwFD^^Um!P~PDNl0tqV=!3<_g~R0t&CR;70OM zUuC(G;+KK3)pG;QjY1=1n~4TI+2w#DK+;u$rsqmzY(CL-0iZs%5Ri10FczJ=w#DBZ zWGsX5I{?rjyM;0%R|)Y81OrV#ah>c&g6I+>gfy-aPUmgw1R?2&^#W)>8URUG31jn; zvVYY{+az@t(|;05`K0fY4{G2EmWgM?3T-&X1amm15)5>kOt&<1v}Dj2`vOKWm==2z z58b}#;Iw#19}j6_S<qtrpgw$;p6Tw3qQn)u66RLF>Lo2})%%8OnLf6AJY%gaHVZ>j zza<(PXO4a_fNHU;z-w#8dp}ogUG;w0dx3==+wX=A3gcSG#fHW))}KasGTxXAq+6nb zH}<K9G2gGJfa_Bj;n=r{Or2Ao1;idg+$SNT)lBbu9=F)76VYmYcQiCBHh^w|iNUv@ zN}r<ADqbozM3$9%3bOQ9T=+5`kH^Y^*m6qOy^u2XU@Q)WolLmK9h)n4MfgTMq-{-s z9>jd{SnOXRTl}qfnr|c1Lus+!Bj2}e)%)?#d$I3OjlNc`PrnS!eitPV5?OcjZnZf& zxMcnw%EiV*!mSmjN0gDmmGK_+>{*nBr*jP{0$v3HTNw>QIkB%dAKenw-FHwt7z<L< zu}4uQ9y%QxuQYC?#wVjpyi40159taW)a>0fB5!~fZ#S+ICWPZDLYlZrKWM_OrjA;8 z7UkklBy_s_oNmjHkde^8_)|QdK;N4{A3=*89geF)*L9x@T~p&CF1^6lxGA+A6{XZ_ z)as54Y2kQkXuia?bA+pqC!xsKh(m)p;-WL6syc4;O@{B~MyMrrevDrDP*$JljhW9u zN?AqX;g}Bt*9Yr%i+KYWa>&9h`f}72k74|%_NP#A{H+EuT2O}X(yBsfF&}Jhq=5r4 ziSQw<OaiTE&UBFgns{ao629?j7L8}lM$#3}G~%&}8olRC4#uGM%GhBjy*nzTwWid+ zI%`kYT}&UD)JFGAAKkBRrhDFMx;s|l-m*P&D}PMd$RAfP=Z~~n{+RCKk2wqR*!8`% z&3K3vY>&X7>OJf6?5WV~*+Tj5cP_-^{b^AQw2G<NgH*U@BXa#|UAU9n{b>R(r75>r zPPM9+-x_88o3|iOGegRY+-*b_rVS&1aDa)E;N<m`_noHs^jm02{14uBu|ne(=i5_{ z=$<ak=&8<1J&r{BtwS?YKe4?fOc57pZ8vKJ6U2F%)OlLlk$^V*(oEZ1p%2Z`hE;vy zOM{=qwqWEiaZ_`nea#P&qj4YD0f!*E)Pri<aRGBoe0fOs#ATov%8fSk^{N{BVoP`> zVO;DHnA%`g%!a%xb{p<+0s`@hwIb82>Vr#q4NSL0>*2ZjV(Wp0cj6RnQhHph35mgv zK+NZVtX8UtfsMTnlR?8-+*r6VEy~~~{xF%%vW$2rJ08l4eFC!j`c-|gr#Zc#_3cC# zVxJMZFE$SRx}&-+=a40N&Jy~A-{a2BP{Tsw4yQdvPB8W>u#LTe63D2|je=vpl$n5f z&r`j@4|-Kx^WigEw;0lNpTnH`QWe@5v!NKBzX7)YO{x8MssI!?4c7T~lSsD!b^c`i z)aaMd!SV-bb?6D5tqTuKdyyn=HPqjDBzz?P%OmDADvMN{jZ_RrDlYuwCqH?S>PrYz z0j^gCtfzqtp*1Zw9p>{&tH$Rd=d+W%7<~QyMOf@x3Nc1ZA6oUG9glnVQ-%Vu(86aX z!tJ*dZpEnULr$2|GgNltL05I`LHGu8=)#Qf`W&|LT6w1Tss^Wt6=y_dK6;N8Y@@oJ zaD?O!WP;piY!w=(SsA+l1mK|Cd>2$a-W+{~?CM@gdz&4ka3-X0zDvtO7+Fnh70Bti z4A1&{S<75SBGf_Z3I7%gqUM)J!o%^<xY)Iz8=NR<n)_bp^{VLk<JVVc_y7^FXR)YA z=#%s1QOgK>&q6uFjI(yvy}0;4OP)J`rsKALVN&;DVf^{yduYB5w)9k-g`3g4Xx<N- zX)G?pGc%AiQ6fu9^i-SyQ8p1R8tSRIU|w{_yy$}Yi0!q|xM!At_n^M}SV$`#oHV(L zv4aEpiAN%QexH9m!soR#gxnP25ibur$bmv(kUyTO1z)Uk<Pd$mP(eIX156)J$KHje z>-+Za2flBAl<u)Vpu^&Pby%a0%vZ<WS8^%H_3ba;3=%XX`O6wNJSJHR#wbl(q<M9g z`CJe8W4>2lOm0^s?+AFt?jmD4q>XgbViM`uO85J=(EW#->HcpU>Hflc+*`Kax0gS9 z?&psm3jERC#UDRu<Bxy!;j!y`-MjD*E7Xzhok;XhVmA`~Tmtf;V#$S8SEPFfFMY)A zik*d2r~p~|D;~*2IND$F7{x7-il^e4YN*BCvpjzOR8Petm^4yPrk=u>ec2~1BRv(v z7%5su;8G^(_Vt}Vc~$h<H0or-3YtbW?gOV0N<Bw6+o!>-I?;(GbG-Ok%!+2>Z-)=7 zZJ!1{^fas>(lbO#x6!1NE+&mn@5O+=LYME>sZ8G-&jSe)%X9RRwj6yA;KqR(cOAD! zSeE%0u821l4-JbI7vxz*{izsg-b3|1>4Tj$!*p=fdmsxWul|IFH6DUL#9~Q{tq&%o z_mK~Y^+88iv?cSO{t9}_!e?gIm`|0BzgiE1)(Nrif`mL|JCS;am^m7rL`5m)qwc!M z)l{eFu9G#oAB&%^h>VM@Q%9C)B6V7^;-t9fG=#h7V}FNtfmkt+*CBY@CLR$h-f30k zRe3u?6OSx!W%XlfhRRTP`cQFP=ZL1Om~g#gb$SXDvK?LY$aJ{UQ<-oXka&y(GL?lU zi;m-vBm9~w!V`n(GUBe`abg9eh@pLqcBJCW#@yC%%gslnR(n>RjHE__>d3b=ks65n z&cD#^CQ>m3^$O#|ucb)rJPrQ>-^YY@spsncH0m`d8SqRaETe~BSZqG3QynKaybR-W zR$Me39!NJI4G*V>%-u&rH$6yd3m?%))iHC}xr!mf9>NNjhmRN}JUkcUICGR69%gu- zIa-*O0Ww-9`(BApH@Gm{r?>HYGr#-zeHXv4=l6~LzM0>*@cUMN-_Gwl_<bk8-;X;M zSaY<G8=`y*pV2H6=j=zB+kCFBFmDK54i)=icaWpm0;?5=!-v#}VaIzK%+XchLz+I{ z5DM$!Zz7FAeH^S!T%xWM7i7g>C(?7mo4!Ay+rEu=5|5|Ans{h1kDf<}nVCaOC;4!1 zWs&lnthmW{fw%TNQJxGR(s!Q<O{M794Bdy*<GSt}Xxdk*-5*RrqQ<8s#sX?)E(8~H zOyxNl;ZzDVzoo9>f?#T8kuXt#bNYa+nm7$0!8yH##DlxI5QuRzxTqw6%QsWvp0j5F zs!*E90w<F=iBMq`^|(}BEtX`(kMkbuwro`zxLawUgBl?ER_3#SrEeJN$klZ3PrHD7 zR~e-k9P*B0N~w`D@RWvdPQq!CD&Z+TQc(xtGLSOzR2EVLcEV*NwVJ04NbM*hTn<t$ zo|;K18{uXnHB>+;BT~IQWkG7-Cc;^fI?hveq+GKQzm^~o&wPZ23?rk($V{M-`8KR~ zu(QVJl63X;Mj{=iv2d`kRpncaYOsVI(&$08RAd^wChQ>dW4i9oz~9%#sotc9HE6gD z0|>>#3>3wG#dwfO2E{6vq&z^FVx9(Wx~;S+$~=y7MrXvB#Bnh=%En7Zq!r6xM9SEH z6v~xMJc-{|w2MaM84|8Q7z0P6UZ(Kz=}SqGdfsDo>@D<<wl+B7(Ys(E0_ibxr6ku1 zvA;i!6afojvfzm++n+|*Ie`7-TAsm#V4vzXu@>E1sur<C(-JAwJXnin;*38=O?Gez zJI;`bg{m6yY60!J>-y6;27Ju%18gZ7Y&<{yODNspx)wf5<C3#gVfzbI&U!5T8G4JB z!GvT|LgpX3m_JD^^Y;;3nJ32nzsBEPCvMEqwlbIxi4Q5magA`@{$1;kiBCK*gr}~2 zDAs%p;+J^l5l*A_H1r)fgp$~zi_uth#m~&A#7|%_=SylKrCzua%<W|I!wJ`ih<rs~ zd>jfkQ^64w=nkmDF}pA|97_@O;h0m<SNn3%#s@z~U!SA?>JF5u!qG>=!_##4-VcOs z-{#ZTqw6`{Z{UH_lyLO5@UTXA?>~bYXmt+LA5NdgD-U*cpL&i)7psBVu{FK&aQghg zm50;K&(XLKE=H+(ROy02=i&6c=V)OWG#*aRe-8T$Hu%lM=>^YW_rnIWQ3IRfB!1O{ z+QaFE&*9XFf&2Q+8&rN>_hBMAknW0S?v-@6HT{Dpfvfh}sdHqx-KP|pww0#XEy5JL zRhU@qtEKXNC_kLu%v&0~>u`DtmvS(e+}kanL2qaB-kPM|E<T)|%ey;Rp6FxI;dF~s z9sQAehW^Ms%TDy{^26y?sX<M0f5y&R#9N-jl`7T{$%0SltM;`)<iYf6-xfR{w9>3G z#xpH=!aa<s?rGpw(6U2=(R<@Mrk@Jfi!@6eeW_AYQ<5+#CeYacO91tNcECEoJpd8# z&wy#*GYen_H~>|EYQPGB7tjfy8CG2*)@znwt&Y^@XzRL931)GQ0D*fpXm!)dq1S?V z=2kM%g;){~sUzwqXseVSe-i<(zB1g8@HKP_P6hq1?<3~|!>&)7#5K#rwwx^S*KYA+ znrT_$-J1SNGBnm-Ig=jU9|_kL-lY+)=KAufZ<mx-!j-0xIrd@w&5mr!h<9n@nK8+Z zBIyue0;Vk}k$RIz;$3ii7v%CvJwz2=IM;_$QTT;ypM`kmNz1UzAL62k6@5MGKao(d zQVn&MFT*E7m&G#&z$_sIbkH+T9jVOjsZ#Z*za4SUj8qzWDz&bNJ1drg;~JXZQC)W> zZIayC&{<aOpK!85xLn}S*DFM~L3}mV&9TC~1na)=K$bl#bc49q&{G!|D-nY{bD{f$ zU=Y!Qc86G*Evk3u9#=(5FN8l-g+3S@*I#KM{fV10#KqeF${fl>79%X$GzD$zrfnev z(>*?+XQ>+a@E=s6PejLR>R#XU`%z@SKXgTFsT-RRtcTIid|xy4^T8=P34%0MyA{P{ ziQ-wlEmZuxT)f=A9L1H1;t9UJRQyA^7=01GF;ZJ7P^29U|A!`|ODdTW>Bv6Urw*Y% zStM}xN1@b6M+Ou_Q_6RUxK@Fy?<}PpNR3({#Mi}nvZGapQW1>0#el|q6zl(0;g_^6 zJH!;RL@rkey3+7VYTL2Uhx^H$HXwFwNHSH<SA5+Kt=}}lRG6VKoC=1c`Dqn?#7MH= zcS57=7xp!}2}JZ$Budv9%05Ja(wd=Gh`PoSg*RwY1ewS7vBhGkcBID&o2SOo$#Fa8 zB~F*d`3?#2T+0y+i6yntzGQBAQw9r7z@oRF&qcL}2{o|VzB-g9R%!-QVVL3JRN*RL zjH+HO?P(^5H)&FZaXu{?9K-=lL!ZxxWWpDYOgmXE;_KZf6e;I}5jo5eqCSj+TULos zs0_q(41{9eqsI42WjuJ7c9L9@3~fkWT88SHWjJ6yjag3aDcd&_ly&j9d`5a=A7DV* zN@?*VQYAbUi@$}bZ44hWh{G`(&Fg4rvH0(?UKl5mWtiWYQqqcz{-Zc;0CtXu9fo*J ztj#ghEu-B=f2DCXg5#RluRbTo0Ust@E>;@dd=DV|1@2P0YgLTitve9V^i)bgzzb3k zz-B{lIo)S&#MGXrpH7?6^Czc9)y}OdajCXvUOYTJZe0N=3?MvQs#;@?9xhFR{Uhy5 zO8b-2w<+nRzP2DH-f}ec=b4vC%;zZ;!F+yFdO=dUT1hYU?I7k~U^b3nK2IASRtwpP zXM~9^-+rR|CFsDmS*eb6i;@<Je*7kozComqfV9UI4}Xqm=(|YAbM9MB0;)_@LA731 zfGT%%);v0E8J*1=oy{MeEf}4(j?NY)XI;J_2sxPU_Gw{J3CmO>1#%j?X>1Ax^j9}v zEeC7_97CR|M_($nIwc8{S_-;FfZG7|@{`g8Uciq4j{=SX_Q_956TAc{MjML(s{n0) zI|17O{|I;l@H9ZNMS9kVD|56wh}MfABj)YV{(=@#u}Xh1HsSnnd94o*sO04yQ%X-O z@-&$HRld!EORvZ)`bO5MN$0BcsUfqk7qo*Xl%<KVs?gQG<Ai;lu(To(HU-{nh_DYW ztCpAZ7_G}6Da-jPIq-^f%*4VYOsy8*#*E!FvV5OG2O=F=w8ZiyNvz6_q>EMBNTn7* zMn<F(J<tfV&|C9~NM!~cG*)I8x-&M-#d=eP<(Ss$i2Cp5+1wc$e?OQ-qDp(*{>lvS zM(C4GkMMh0o4?2k&A@So`2<$@9`#nl6U69Ru__CZz$i9c4}w)$NZnfVQDxP4YYLaB zH(jBdRszLmi0ZASy2p=4+#1^w^~T?$yL=@rA&X1%>G8NI2vQV6<LQQL(uyC`U3O5h zDez@HL=Y}Z_$R)uk$ZR7`3z9@Qt`8RCY}1=1P9T?xlrDN^Ra4>H#bPD2aR_;GYS%E z`Lm!_lC$@4j#z&rZ*K_YLcIw0B;xrpu`)p}-nmP)Bbb5MnNc?qmsm<iEm^t)EF8NQ zFGyoo2@|oy3Z?T9;NsIO^dD|oBUa8trOAi}PeNW8k8Hf+Vs-aXA#2Qujcn!Av{e5u z(<uVNpwyTXSayx^0U+@Xh^ABq@yV|1FVE3(gMr!cXQgpB9jH{&#*5)#0R(!UEOF6k zYZU3QmFc!TjReLp$6XW8e2n)&OF`(v<i!_fiJ5H}l!)6%d(P-@u%TS1!)Ee=2}6?8 zeHM?>Z7RD-(9X`ak6Skm8@cr%RVgPv5FXB7R|MjmTuz*g2g=dpbnte^Pe=oH{I=xL z)$%ZV1vWu_35wpYqUb@F#D917)aK}82hdNNyU|b^^+r4<+axj>v3tHy>~gkbmspf( zurNHj?iZkd<U_R)2|%Tdr$!ox4(B>a2XACOTu9MDb{c<M{ACY9{#cf@g1fi~*u&Jh zW4}00Z9}IBGjTk$6vmo39vW#%YKEU^CYAH~NV-4+Wg|9zR#u2?<C2pivK?!UIPL>5 z)mL8Vt%~ggO*BCV4BmO*8dD9V^zWi_#!V91(O?9IagK`-P`mhhSUv<oI?nKMTq|mG z+_5wq1|XE716zDXp%rgdFICRG#KR3lCL1{7OT>+QEx;mx8Fha(pHZ&(?b-3ncU)4& z_ZW3Pb0sg+CQsoS@mF>6pgNxELYZ=alImH}M|;-7pnB6ZaZWQ8m1V^(y>y67hqRL; z<xguXZ9(<M_ZwD;{U9H+`)*j}A-9NdIXtY|q!+982S3!DKN0?2O88~_VA``Ap;8x4 z88oh?zP(&JEtgKO^i1mD*OxEjzbPO2FZDJyn9@5hyg{oHvULZJgb)5E{MpiV8M=KD ztA*xa&rCdeoqfF<`+DsZJ7goD1DFQ54sh|ALehDHDisF|qfQu-3KPkc<Rb{8PLb@T zIt%+H^|lFvDNoGP9XKevlgaQ9F*FNzGJwann^n9F-s7fqSE4K{kC$oi==JyYhWdJ2 z`g+}cEj#vs`Wce<D@`4S3*&tgG$#Nj0jG$b3(D}|sWIJELFANF6?#gYO;yR}34i@@ z{C1dL!YuQXta3LW_fb|Ujd#XZ*<;3tJsK`C-Wh+<9=|^S?Ee;j-d}C30&BYNKvX>D ziah}DhNR1Pf3lS;bC8ZR_mi`DhT$YId^b+hD~=#Kfl*FLUR3b~8UioAs1Bx>qvjI_ zXdBWUZ7tJPd{Q^@<9H^WJV;?gYWSF{wGwBaqfjXxcn*9_0WXWU)Y%d>EsgQ%v<k}u z#?MzpPezaWT{`iAL*WNDh&u452=6K70~<cIU+c%KKZJ4(>ew=La%-hVd`$}DV$-o} zLmU^rJDUkt_f+QaK(71Lrpbu)#Kj1qr1<TZ8~+f#+rR`vPuY0$i5~TLB9&PZm4TMg z5h`&ULO}7bM~==$&avT7)$SNS5E{av#5CVPKAnhTSN#a@A(oJk7CAZ47;_>)$7dQh zzT`@_(GZUM6RvZVk&3U1IG)qSyohGuC#n(HK8t0NlB35LghO?{)fn>FEa=AN^C1ap zdh_n`bs^*St;fAJ)wdZB-&Wid2R$3RQ^gA|BLh*Q{fj*Ox=VX_u}+I+4R1?6C%?Ny zfA9m%`Pak0O$i@`-+hMsuI@mUW~r-swBN<p4K4GX>4L=Xe?~%{MH2h#JFtCr`7R*i z_NgU_wIp#yLSl+ZXG8h<=d1J#5rxnoR^dc2G<(b&ASrmsp_<0TIRt+V)93On2O1+K zzazv1xN=N=iIfakQ4r$ey%4Qh{CsqLeC;LTW3Ln+`}U*4;CyZ*+pCpHa~;pi(*liO z9=4{0CQ&dGDeyEzR5;HWBaZJ4aN>PR?hcQ%75~?2z`F?-UxlHOt0`NeWCc1;YgNTF ztrA8GnU$K-b5wm{JZ0yDI&lPC-J{OIhn^Tz=JM_8f?^T6;Y%0ZFEaj=`o6d&$G4k` zGF_<3Uo*i`$S<4{oTT<}SW^q4_**?L743JnX-c*n4SjawOTI1O;EKQHif48um|rPt zbUSgUq6|r&ig%Oa^}58qLyZGh$17-nA8e`-8iaJ>?evyVIhgxTn7|t#;DJUc75fc( z1-Ki0>BXYD=UaaYf2Pvi`xrV*ku2WExnmC_!=pvrmYql<=GQy$?LO1p+fCVxIT>5W zNyI8Q-jvJ4!mSCyb*s1H#F?{8amSV?C>D%RIJZ`%guhUSW=UkJ?wBb-cHIcsm0PP) zd&>TVcZ+>14p*hd`Iu4$(GcIiV0^S3GB;A6Fm>pIG*2BmIiz%3up)OBIXNH`X2O~8 zByya1LkSVpm~iVwTDGw=#K#yZ!n354SiXO{bX$^-7iOYVZi@y1ZC$(@<b9HP%KJHG z_=M}~{?hn*z&|m-f*m;;T(lG(P6^E+)zFYy63U$ll)e=McWnYCt%FIu8ksZIw85rH z0BcWH@M==<ay0ZSoTq%M)0gMKNvd^o)AUR6Lg(C}@;jy~uQ~+0^q~ETIX?IePN~80 zW^o07s+&yTC0z7c8w#$cvu>J7)o2>atK5>B*T?ryqgt9Wrln|oA1Kv1Xb8ehW?aL3 zX8uppFF(IP9}x*8tG9~OyO%7K-ob|B^kI|y<|s*>6Vbnnh?T4Il4>0L#(>&`J~?YL z(D0X+VvVUqs*4z9(;Tsfc;0EeKTpJ;eRz!?1EN2T&@d=^IlAR>Jn>$g3J4XucL3jD z$1}^7{@_!X1^DXb42;4pmT8xWmi_3iS~6R#75LQD&A+c1%!Vhkr455HG}*VYi!W&M zni4;buW}CJ4PI*8Gy0>2(LR2n;^V2ej(12VVRC;OPe8a8@#zb}UU`upyAhGrpZS2m zcLK+S@yupPR(z$DS&rJeee+YQaZ~B`v1*rZJp@&PkBjzSe_1x@Qjtv(O$lB2AYh*> zH7Oq1HhJ^sDqZ&ucq*J|r0BZ8gH(;%r$P@gV<6V~lhU}5FS{yQvWNKMLqHmaAt>C) zJE0Lz(kCq@5YgDp!gJXuDMQy#c4U=Rn?D+a14%5ibgIwll=1x|Lg1|MITf^Rjz{1( zaE|lcpMs)=zn{f$W3;Kkt-xV)@ntu}upJb1)h>M3E{OyiXoG+`$oW=7nJA%G9^~D% z@b0cr)-sPr8e~k0_n(Y%`K>BArB)2e9w?3#3DqZ$nJZN`tZBOK9*jNCvGik2%Dv3j z1v!*K)vlt07Y(9+e7v$exj@3}_LZi%a8u#-lIuYq`q8RuO~I!>Sww79Ua}jcBZ`sf z^~!@ZX%J@M8}H0s7x&|PWR$9p<}UDufWIi}NZ3f&!Dn44gFder%|NhWPSa_F*$t^( z5Cps^swZQ}qiPcC@S%(`3Q7bZql_=4CBswBCjSea?!(ys?fPrb!1JpZ8)#tcWx&q> zI{}*jKEPr?F5oz5&HyGLeGP!FA0TMl3J?GdfSUnM00YbgTnEro9@ljq#%2Rj0CcUv zb3NcYfcpVY0^R@&0ko?b%K_v9+K{Jfx%}L_g0W`-M*!~t&H=P58Jh~Y0Z;^33EVAs zb^ta4{vNOw@I2r+;6DMw01f&x6)+oM2e<&+QCGloGvEP0Ir29Et^i!X&lF;SlYk?D zrvMKCwgT<|tO48%umf%YTmeW2{JtKt0uBRKgXhoi+y(d!pbM}PP!2ExvH>Z8523e{ zfJ1;M0UOc&&5)TcYqqpzOS!Lir=R!G&wl6xg<*N52OYuC-W9)lqX)kTh2Fo&A4xam zx3Kg<w;h%D;<u%H?Gk}3Ruc8sPtv#FyAh63yS?ypqiRaRFno^As>*5?QYrm5mH$pP zr@e#Ix}@K<&h^ueO>_7+>)=COWOI$irk1rBCnaCDv^HmXSt-@qKN^Qof_;p_E#P#~ z(Kt?bXcW%H>5h!Xak^JV;c7YEap0(vbGa<FoNfTPDB<Ma)j}VV{5+o%TrdBQmUK?K zm*{ftxZ{rIHRv82s8#5Nrkn+(ydC^FK;}WXTX;LMWL&L8hhGMa(A7$G_@O4-O!DxC zbJioty6~H1pxIonBn<sVnF?gR=Ms(GE&Ya9#+eD{0<Kq;ptBH;{KIA#oJ^O`ab55? zcrT^=W*EOkWCQq$aPFEQei@8whs>M*Rybz^$L+>^LW2J;ILBxr-0I!%CnGp67vYmH zoKware_VbldH-a|{*?S17nPs>Gv&`*j&oxG@m1=dOsfCp6*yx8P&r-7eEKo;2=yf3 ze&lxnb`xYXwhvEumd2oWZc~@JV9q*!hdFm{*M?^1+OVL*FL<a36kDNZ<$4tQ#qkQe zkc9gg{LW**(Re7=S@Pq+J(Yy3gr98&?rajyz8Z5KxI;;}2H*tXE_MBFJ;7XnzW=wZ zCqG~{<qJJEUZElo=nUX+o9CB$*ZPBkH&BY8x{hPW-WV(9>8b?vT|8eMqOwhibWLbY z%?4C&XMT=b=<m4I+w5_B13`Z$Joj>rC5|JMPjg&dV~{sAi{~mj8rQUWmn~jUwxqm* zFms#R+St()*M=JJZ6R+*lh;$@zr)KeU_Ml=Z}Q9wwX}ExQb+LV`i6O(oo$}VKxg~H z&W^S036*ODB|N3UWgS8P+753s$A1d^qR!?}o7Yp?+`OPeDC_J93XL5Cn-3mkja@-1 zS`c(Mw)vak&k|f}f@s`>p5F`Hg7&V?fZ&lH5<51FWY{2hgJ`lw2>2lcJCH0r6uE%Z z#9C8b8<utWoAAdmxOhB;zr}%m1p=NWO--Rdz}w8&wj{c8FOe^+t+X<BJtQCvEDd!C z{&ufCmQO3PCUkHWNyN2;4xyide{HBU6lBN17wYr3HKUgyFRMV!%C^o%0n(IrhA;|@ zy_V(y(c;byFZvQ{LceFDR&A&Y+F9&f$9@dn<^CptjEQ=s^mv$h0oh6gs9;S<P^5c^ zq=S`7V|YUDD=Nzs>y!Fg8Z50TTd+Vb$&-7_WtIEdE7z~=474{wwucmHI8l&UN!ATr zG>|Yl0V$k{f{#3I7zt_6s0WOFjuP1>P$J=eCbxjTc)J7`@}fqe$>+riRf!VCPC)MJ z^y4>Xm`gPn>m_Siz0gTnV_REgsH2JM0aY4Ui+VpL4M-NrEpbm$k7>x1zO;_;0eflu z82d5RCjF7}*|`yk%L3j;!Hd<;KdK(-Um269<i4P4qB~e4WNcZRw=ux}N#PGC;O%H; zry!lD5`k8mr1G0cqkQ!FBxDPcv_K*~oowl4K5x^ljJ-`#dfPE6z0iM@TA=<@XWgCt zW|si1?Nemy1Z8IctNs1JaLYpPlP&Atl=`K?L~Zv-pGoJE`q?C47l+!{cmp0;62l0F z>wa;P^kgUa@$m?!1;N??W<@G6vQ==BdAv?r8+j>(@2}(@E<)q<cSy29BhR>{Ug(t; z>{m&Xr9#DexXrth#$1}w3p<+{X}(QFP1uRY)ffnRxuOw?Z4i8&9p(b=2w8gy6e0;U zzp<ma&5P*ofwW~EKAve#jBKU9joagjG|aBAEWVt$m64<A5L|)ICNF}o4QaLBK)b&K z_N1WLov90ga;7s-2~!INQ0NV!8gr_vL*Bp!mp9Nt^AH}otP?H?li?d<xi4sDS0-U= zeX!eRAlYvTE3F{4@Mfh!bihj~HdR&b50bhi;)VV-fyMylUK_qCU7kuyhaX=04sQ)j zjQL>41V~%%T@zZn)*Dcy{8q)%#T5$?O3`w{rZbNxC^UP>CwTlFEuEfbZ%_zyZt%2$ z3BxMT?rjfxk;-EpFQ5D#Ny7n)r>V2O9ZQ<KZ0WMawF?$im@Gz#>pw7|v#oO-dfvil zv1vq0RtEll0qSUHg(GQ?mz6S4(ChQG@PYD>SW_5yceKDi2fUt+Ml8<jJdJ_1w{t0o zi_}r2$lGzdKhW9HPJ@6y-NW0FDd4bSXdZ#ohCMp-1mwltBbT(ueu?E!|GZ6b(Mpk2 zX&Pj~+6E&ai@g##o?wk#{yFVI3QOmpd=8X`C2mfeX^v@*tc8mx@OPkSc^XA>sUY%i zxc_e&cw)+n<@DzTuwCK%B4s~<Xv+ZO?!wG#HmvgtKEv%&_-2^iJeU7B+t9}2I)l)e zz%h0kj|CZ<>G#i~PIx@7`l`}J6=bp=>@O6&-|tV*lHt&*8-(-eTnjVv2Adk;f@$+N z9XAgwKhU@Vvy|cv;)3&?PD2@491sRxia#)hiPh5B<YoSj+bLEXgO|6`jM~E-XF(se zg1ro8K5$I#A-gl^4=$Ge-9>GcQtJk}F<)cQfXYn)LrYuZS_2$|0YQxc@^GxbOQ0~C z@eDorU&}(@{)=r+Z^A!6&fpe92T5s!uAwdpH8Ctwzp<*&v^P*MWLblT&K5%e@nN7j z2r923G*SyPO-DHoOAO7O-XKI54Bqv`)6m!<GhM@jM9?a_PiPnFM_(^iIRgX4IS^{b zC2Gtd8wq%^Qh>jq8G~J9Sc_IMxB*1+en_}3;OEW;%A_EEHdm@&F!+P0*w{R$v!jjg z`=w$7sg=q|cKAspj>T@7S07bgmP~Pp^2)zZo?L&nfg6pX!|QFPfLv*Bj3^+KMtp>n zC6Ar70pUiAmB~O`3CtqA+8G%s8a2L68A~;qu7x7?5f-C(+>Wp+sp#vM(LR9Nlwrp7 zrWs@A%Efjqk0ZvPD`<wnk1YU=P`f`E<U1cWVk3<PfdWUeQrK0{fM7wX2bGS{DZF4k z_$z|wBLz@`0qfSBW~?JnPbV#`BW=qw`4X*<*k^)9;@alzSPSoF9@XyGplRd-+_6>? zUa62I3u$PqAPG4X9q_($+L3-YqN7}@Tv<^`M9Feux<Y?k0<LZ&X>^9fY!uxk^)1=w z48{~SBW%Pl$Y}02XnF}guOZmj?v-T%-~WAccJx%dgb(<$b3Dm=@)-dYk?Ugrukkax zHmoJZcQpnYn|uh%W*KU{YsuL+(mv8q*%-nP(XghDrQ@4-OgjVLj2aSKflJXY>$tU} zb6tm_Mh;UMt<_-5*XNnD40D_Y+VxKeb&SNF287%Ox!HDpcmjQ_^$I-jq`E{Z)t%W9 zYVT?c24@?PXleAf&6;o#A3r}k!P;>VLnW3-1gtWG+VM)qRf#sGw$|XpXM(iQ1P!!j zGx%E+uJA?t7^OpK+kk1KM9}cLSi=+iMzu8)J2Aey8&QH%j&)3ln`v=_dm>tjm3-a~ zrAd-k)(e+c5|SrjLle*sKD%VG47|Y5j*VC2T8c{&a?Ru=p7!9{5kV;MpsD#4l}Sgz z<~ENK(_EC7Bx!GK?Zi@x4IVwZ=sY7KloIY?(6DVL$AXYh8e`(S2IpD`FR;J41Ww`( z*OcH!<OWWk;3U=Kfds5ZiQSYaK?y{lCkpWr1O|j(lG~GlJswTaGJu1Epm%MHJSA9D zpfTu!Z1NE~lQ%E$UDC-WikM_>bGdRUuOwvrJRV9^NQRc2k<0nPyd2(o$~>j61>kXU zetxOD!n3%dZr-xWM7%52m(KmE-Q;Tke`@9=z3Ru+i@&;&Tt?}P_4q8Hl<Cz-FGqS8 zptnTIXCu83aJ*Q`N0HtOFqSbrz2nnwVEU(!XEv$48F@9J7k`C?;{IJop9BoZ{9;HO zA<uC+Uyk%f!0KFy-wvc-0k{kjzmrIV&8RCxFJ%69{g2f^J|wFG+zh}gI5q+Bx9hJ} z11gq<t^+oY)_{tCGhn;~9)C6zCuGvQ*S{NGiRbLa>)YFuvjfKr(_G^W1K!+pHX}H3 z%)r}=Io277q!D^Hwjs!H%-G-!&M0<HnqWuB;B8-nwHgdMf{q#3JQf9U;NIRCoYU@a z3UmfLTZB0{qbO<&w$HuYG{b-cM}G@;@^0y*LTZgz-K6kB<`OdgRiogs?}zhGF|IZK z!1$2y1>-T}Z;Ypne=??+bf%T24W_W^?@W74`%ULen%tLi|Cn25UTCf}H<&k>x0tt? zcbI=*-eulne$@PgdB6EZ^I`L=<~Pmnn*YQ6vH5dz+?;07S*BQKSqd!+EK4m<TkgpF zY2N2~lkyGuv-9owi}Hi{Tl2q{e_#H?`A_8Q3bG5z3cgj)T=1iUX9|8%@J7MA1s@hn zv0iJ<x6ZRJw$@s2v9?&-tlzUnt+y6#E8JQ5lfowppDuj2@OOpdiY6D$ExNO4bJ6#U z9xQsksK025ZMki=?P1$K+Y7c&Z5M3g?HTr~?MA!ZKF>bizSv%Czs0`V-ePaF2kh(Z zo9tWc+w2e7d+kr#U$DPn|H7_vT<*wnOn2PqsC6_re&~3}@tEUD$8(N@j$@859cj)9 zPQCLA=TxV`nd7{{IoD}%TAfbkJm-ApLg!Ma+qu%Y+S%f4b#^%g=N-;X&MnTZ&hI+^ z-g&=sm-ENYhn$Z&d!757&pKap{=)fxoH1u+adz=d#kS&x;+@5B6*B|A`@y(qjF%a& zF@DoH+h{e0j2n%AZ`@_vYkVBz^qTQ)<0r-oMm5GM!*r9Wz_h~TGj*BnHf=Ng0OR$# z>GvjG?iIOna-Yln_uRqUtIR(#KV<%?`RC?0%qPw7m<P;ii^ih0=q(wREK9b<V9Bw} zw9K{`Ef$N_Vz-o7$}RIP%@)CO$}(VySyJ;Z&$~X)o;NRVeqLi<S6)f}%KSU?AIKld z|2+Sn3U(Jff)RVU-~>kO4+ZB7##=A5USTz1<eb*!R>Asx>%-P3txsEDw7zY9$9md& zV_|-wt+1@nUAVf?S11&2Dtxstqv)z4M^UiofuiF@!$sHIY_=n|<F+?#@7m7ThHPhT z!x%+_J;y%NJ{#j`v0E{gCH8WR=0dv*<GI|v5+mAd_hC%C>;gu0qkXge7)JBg_RsBl z$2T2DN3o;GS?a8EE^>A_zmJi4)cGVv;E?mE^L6LP&U4N$ot?!Dj?M+$tBhu2m2su9 z$rv&2F#g#1F!X-Nc+~hh=Ehpno2FlzerGys8a8F;8gdWj9?N|@_ubsjax=^!^PT2@ zG(TmY481BE{i)?iOTXn9G<n*h$<yZP^D^?5=QZcG=LPd3d3*Cd$W!O9$ZyPlHviT9 zSpFaLFE6;Z;2`vQvfu)AdAT*qYO|JN4%G7*5VWqhZnEyN_FA8TMnAHCYGs8J3$qHZ zDV$z-L!q(IQ`lVCR(NOOw+nw>_<Z5Zg(nJsQ+T@Y4~6l<xkct8TTyLMQ&FgBXVIRb z7cf&!7X6>1_liC$O0`Y3<=9NNd|R=t+173Q2ivXC;5PdM_L%*gJ>606XmJRRR~+v; zK6d=cF%DW>;auyy&AHck*!hO@#$tQ%!eV#vKNLS){6z7I;*-Vi6@O5Cp%~t^MEZXk zXpPy%8;uplg~l4=dgHy&=|94j_raFmHvZ1|N8=a94Ab?d*`_>Gv1u7R&poCd)Avog zOwXE*n%*&;F<qZ~Q?4U-Uhab2`dokRhTKT*%elvM-^=|VH_fa!XPHfAySdz4Ypypp znFHp#%-tA;-R6HWKW;t&UzBE<WPvO$MpKLRnogTyrj5CqbGPPd@@D3h!>XI}e0lh@ zx(wSKw!^m5w#(LQd&>5_EowVtdj*#GhV32OfbFzwjTdapuC{CKdia%WJK3dVm6A;^ Nl)sMytN+p0{{;|!E;;}J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/bufferproxy.cp37-win32.pyd b/venv/Lib/site-packages/pygame/bufferproxy.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..c9076c5a678b02defdb1944ee7fb6efbe4375f9d GIT binary patch literal 15360 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 VX+3MbVx38R&moq7dH!?_{68%6>HPoz literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/camera.py b/venv/Lib/site-packages/pygame/camera.py new file mode 100644 index 0000000..3f18350 --- /dev/null +++ b/venv/Lib/site-packages/pygame/camera.py @@ -0,0 +1,146 @@ + +_is_init = 0 + + + +def init(): + global list_cameras, Camera, colorspace, _is_init + + + import os,sys + + use_opencv = False + use_vidcapture = False + use__camera = True + + + if sys.platform == 'win32': + use_vidcapture = True + use__camera = False + + elif "linux" in sys.platform: + use__camera = True + elif "darwin" in sys.platform: + use__camera = True + else: + use_opencv = True + + + + # see if we have any user specified defaults in environments. + camera_env = os.environ.get("PYGAME_CAMERA", "") + if camera_env == "opencv": + use_opencv = True + if camera_env == "vidcapture": + use_vidcapture = True + + + + # select the camera module to import here. + + # the _camera module has some code which can be reused by other modules. + # it will also be the default one. + if use__camera: + from pygame import _camera + colorspace = _camera.colorspace + + list_cameras = _camera.list_cameras + Camera = _camera.Camera + + if use_opencv: + try: + from pygame import _camera_opencv_highgui + except: + _camera_opencv_highgui = None + + if _camera_opencv_highgui: + _camera_opencv_highgui.init() + + list_cameras = _camera_opencv_highgui.list_cameras + Camera = _camera_opencv_highgui.Camera + + if use_vidcapture: + try: + from pygame import _camera_vidcapture + except: + _camera_vidcapture = None + + if _camera_vidcapture: + _camera_vidcapture.init() + list_cameras = _camera_vidcapture.list_cameras + Camera = _camera_vidcapture.Camera + + + + _is_init = 1 + pass + + +def quit(): + global _is_init + _is_init = 0 + pass + + +def _check_init(): + global _is_init + if not _is_init: + raise ValueError("Need to call camera.init() before using.") + +def list_cameras(): + """ + """ + _check_init() + raise NotImplementedError() + + +class Camera: + + def __init__(self, device =0, size = (320, 200), mode = "RGB"): + """ + """ + _check_init() + raise NotImplementedError() + + def set_resolution(self, width, height): + """Sets the capture resolution. (without dialog) + """ + pass + + def start(self): + """ + """ + + def stop(self): + """ + """ + + def get_buffer(self): + """ + """ + + def set_controls(self, **kwargs): + """ + """ + + def get_image(self, dest_surf = None): + """ + """ + + def get_surface(self, dest_surf = None): + """ + """ + + + +if __name__ == "__main__": + + # try and use this camera stuff with the pygame camera example. + import pygame.examples.camera + + #pygame.camera.Camera = Camera + #pygame.camera.list_cameras = list_cameras + pygame.examples.camera.main() + + + diff --git a/venv/Lib/site-packages/pygame/cdrom.cp37-win32.pyd b/venv/Lib/site-packages/pygame/cdrom.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..53a9a65bc765208e180e3c377694ddbb4c9d6fbc GIT binary patch literal 18432 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 D2V!js literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/color.cp37-win32.pyd b/venv/Lib/site-packages/pygame/color.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..d314b4c8f69d1a169c67e3947b87804d7833979e GIT binary patch literal 26112 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/colordict.py b/venv/Lib/site-packages/pygame/colordict.py new file mode 100644 index 0000000..52b1166 --- /dev/null +++ b/venv/Lib/site-packages/pygame/colordict.py @@ -0,0 +1,684 @@ +## pygame - Python Game Library +## Copyright (C) 2000-2003 Pete Shinners +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Library General Public +## License as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Library General Public License for more details. +## +## You should have received a copy of the GNU Library General Public +## License along with this library; if not, write to the Free +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## +## Pete Shinners +## pete@shinners.org + +from pygame.compat import unicode_ + +THECOLORS = { +'gray17' : (43, 43, 43, 255) , +'gold' : (255, 215, 0, 255) , +'gray10' : (26, 26, 26, 255) , +'yellow' : (255, 255, 0, 255) , +'gray11' : (28, 28, 28, 255) , +'grey61' : (156, 156, 156, 255) , +'grey60' : (153, 153, 153, 255) , +'darkseagreen' : (143, 188, 143, 255) , +'grey62' : (158, 158, 158, 255) , +'grey65' : (166, 166, 166, 255) , +'gray12' : (31, 31, 31, 255) , +'grey67' : (171, 171, 171, 255) , +'grey66' : (168, 168, 168, 255) , +'grey69' : (176, 176, 176, 255) , +'gray21' : (54, 54, 54, 255) , +'lightsalmon4' : (139, 87, 66, 255) , +'lightsalmon2' : (238, 149, 114, 255) , +'lightsalmon3' : (205, 129, 98, 255) , +'lightsalmon1' : (255, 160, 122, 255) , +'gray32' : (82, 82, 82, 255) , +'green4' : (0, 139, 0, 255) , +'gray30' : (77, 77, 77, 255) , +'gray31' : (79, 79, 79, 255) , +'green1' : (0, 255, 0, 255) , +'gray37' : (94, 94, 94, 255) , +'green3' : (0, 205, 0, 255) , +'green2' : (0, 238, 0, 255) , +'darkslategray1' : (151, 255, 255, 255) , +'darkslategray2' : (141, 238, 238, 255) , +'darkslategray3' : (121, 205, 205, 255) , +'aquamarine1' : (127, 255, 212, 255) , +'aquamarine3' : (102, 205, 170, 255) , +'aquamarine2' : (118, 238, 198, 255) , +'papayawhip' : (255, 239, 213, 255) , +'black' : (0, 0, 0, 255) , +'darkorange3' : (205, 102, 0, 255) , +'oldlace' : (253, 245, 230, 255) , +'lightgoldenrod4' : (139, 129, 76, 255) , +'gray90' : (229, 229, 229, 255) , +'orchid1' : (255, 131, 250, 255) , +'orchid2' : (238, 122, 233, 255) , +'orchid3' : (205, 105, 201, 255) , +'grey68' : (173, 173, 173, 255) , +'brown' : (165, 42, 42, 255) , +'purple2' : (145, 44, 238, 255) , +'gray80' : (204, 204, 204, 255) , +'antiquewhite3' : (205, 192, 176, 255) , +'antiquewhite2' : (238, 223, 204, 255) , +'antiquewhite1' : (255, 239, 219, 255) , +'palevioletred3' : (205, 104, 137, 255) , +'hotpink' : (255, 105, 180, 255) , +'lightcyan' : (224, 255, 255, 255) , +'coral3' : (205, 91, 69, 255) , +'gray8' : (20, 20, 20, 255) , +'gray9' : (23, 23, 23, 255) , +'grey32' : (82, 82, 82, 255) , +'bisque4' : (139, 125, 107, 255) , +'cyan' : (0, 255, 255, 255) , +'gray0' : (0, 0, 0, 255) , +'gray1' : (3, 3, 3, 255) , +'gray6' : (15, 15, 15, 255) , +'bisque1' : (255, 228, 196, 255) , +'bisque2' : (238, 213, 183, 255) , +'bisque3' : (205, 183, 158, 255) , +'skyblue' : (135, 206, 235, 255) , +'gray' : (190, 190, 190, 255) , +'darkturquoise' : (0, 206, 209, 255) , +'rosybrown4' : (139, 105, 105, 255) , +'deepskyblue3' : (0, 154, 205, 255) , +'grey63' : (161, 161, 161, 255) , +'indianred1' : (255, 106, 106, 255) , +'grey78' : (199, 199, 199, 255) , +'lightpink' : (255, 182, 193, 255) , +'gray88' : (224, 224, 224, 255) , +'gray22' : (56, 56, 56, 255) , +'red' : (255, 0, 0, 255) , +'grey11' : (28, 28, 28, 255) , +'lemonchiffon3' : (205, 201, 165, 255) , +'lemonchiffon2' : (238, 233, 191, 255) , +'lemonchiffon1' : (255, 250, 205, 255) , +'indianred3' : (205, 85, 85, 255) , +'violetred1' : (255, 62, 150, 255) , +'plum2' : (238, 174, 238, 255) , +'plum1' : (255, 187, 255, 255) , +'lemonchiffon4' : (139, 137, 112, 255) , +'gray99' : (252, 252, 252, 255) , +'grey13' : (33, 33, 33, 255) , +'grey55' : (140, 140, 140, 255) , +'darkcyan' : (0, 139, 139, 255) , +'chocolate4' : (139, 69, 19, 255) , +'lightgoldenrodyellow' : (250, 250, 210, 255) , +'gray54' : (138, 138, 138, 255) , +'lavender' : (230, 230, 250, 255) , +'chartreuse3' : (102, 205, 0, 255) , +'chartreuse2' : (118, 238, 0, 255) , +'chartreuse1' : (127, 255, 0, 255) , +'grey48' : (122, 122, 122, 255) , +'grey16' : (41, 41, 41, 255) , +'thistle' : (216, 191, 216, 255) , +'chartreuse4' : (69, 139, 0, 255) , +'darkorchid4' : (104, 34, 139, 255) , +'grey42' : (107, 107, 107, 255) , +'grey41' : (105, 105, 105, 255) , +'grey17' : (43, 43, 43, 255) , +'dimgrey' : (105, 105, 105, 255) , +'dodgerblue4' : (16, 78, 139, 255) , +'darkorchid2' : (178, 58, 238, 255) , +'darkorchid3' : (154, 50, 205, 255) , +'blue' : (0, 0, 255, 255) , +'rosybrown2' : (238, 180, 180, 255) , +'honeydew' : (240, 255, 240, 255) , +'gray18' : (46, 46, 46, 255) , +'cornflowerblue' : (100, 149, 237, 255) , +'grey91' : (232, 232, 232, 255) , +'gray14' : (36, 36, 36, 255) , +'gray15' : (38, 38, 38, 255) , +'gray16' : (41, 41, 41, 255) , +'maroon4' : (139, 28, 98, 255) , +'maroon3' : (205, 41, 144, 255) , +'maroon2' : (238, 48, 167, 255) , +'maroon1' : (255, 52, 179, 255) , +'gray13' : (33, 33, 33, 255) , +'gold3' : (205, 173, 0, 255) , +'gold2' : (238, 201, 0, 255) , +'gold1' : (255, 215, 0, 255) , +'grey79' : (201, 201, 201, 255) , +'palevioletred1' : (255, 130, 171, 255) , +'palevioletred2' : (238, 121, 159, 255) , +'gold4' : (139, 117, 0, 255) , +'gray41' : (105, 105, 105, 255) , +'gray84' : (214, 214, 214, 255) , +'mediumpurple' : (147, 112, 219, 255) , +'rosybrown1' : (255, 193, 193, 255) , +'lightblue2' : (178, 223, 238, 255) , +'lightblue3' : (154, 192, 205, 255) , +'grey57' : (145, 145, 145, 255) , +'lightblue1' : (191, 239, 255, 255) , +'lightblue4' : (104, 131, 139, 255) , +'gray33' : (84, 84, 84, 255) , +'skyblue4' : (74, 112, 139, 255) , +'grey97' : (247, 247, 247, 255) , +'skyblue1' : (135, 206, 255, 255) , +'gray27' : (69, 69, 69, 255) , +'skyblue3' : (108, 166, 205, 255) , +'skyblue2' : (126, 192, 238, 255) , +'lavenderblush1' : (255, 240, 245, 255) , +'darkgrey' : (169, 169, 169, 255) , +'lavenderblush3' : (205, 193, 197, 255) , +'darkslategrey' : (47, 79, 79, 255) , +'lavenderblush4' : (139, 131, 134, 255) , +'deeppink4' : (139, 10, 80, 255) , +'grey99' : (252, 252, 252, 255) , +'gray36' : (92, 92, 92, 255) , +'coral4' : (139, 62, 47, 255) , +'magenta3' : (205, 0, 205, 255) , +'lightskyblue4' : (96, 123, 139, 255) , +'mediumturquoise' : (72, 209, 204, 255) , +'gray34' : (87, 87, 87, 255) , +'floralwhite' : (255, 250, 240, 255) , +'grey39' : (99, 99, 99, 255) , +'grey36' : (92, 92, 92, 255) , +'grey37' : (94, 94, 94, 255) , +'grey34' : (87, 87, 87, 255) , +'gray26' : (66, 66, 66, 255) , +'royalblue2' : (67, 110, 238, 255) , +'grey33' : (84, 84, 84, 255) , +'turquoise1' : (0, 245, 255, 255) , +'grey31' : (79, 79, 79, 255) , +'steelblue1' : (99, 184, 255, 255) , +'sienna4' : (139, 71, 38, 255) , +'steelblue3' : (79, 148, 205, 255) , +'lavenderblush2' : (238, 224, 229, 255) , +'sienna1' : (255, 130, 71, 255) , +'steelblue4' : (54, 100, 139, 255) , +'sienna3' : (205, 104, 57, 255) , +'aquamarine4' : (69, 139, 116, 255) , +'lightyellow1' : (255, 255, 224, 255) , +'lightyellow2' : (238, 238, 209, 255) , +'lightsteelblue' : (176, 196, 222, 255) , +'lightyellow4' : (139, 139, 122, 255) , +'magenta2' : (238, 0, 238, 255) , +'lightskyblue1' : (176, 226, 255, 255) , +'lightgoldenrod' : (238, 221, 130, 255) , +'magenta4' : (139, 0, 139, 255) , +'gray87' : (222, 222, 222, 255) , +'greenyellow' : (173, 255, 47, 255) , +'navajowhite4' : (139, 121, 94, 255) , +'darkslategray4' : (82, 139, 139, 255) , +'olivedrab' : (107, 142, 35, 255) , +'navajowhite1' : (255, 222, 173, 255) , +'navajowhite2' : (238, 207, 161, 255) , +'darkgoldenrod1' : (255, 185, 15, 255) , +'sienna' : (160, 82, 45, 255) , +'blue1' : (0, 0, 255, 255) , +'yellow1' : (255, 255, 0, 255) , +'gray61' : (156, 156, 156, 255) , +'magenta1' : (255, 0, 255, 255) , +'grey52' : (133, 133, 133, 255) , +'orangered4' : (139, 37, 0, 255) , +'palegreen' : (152, 251, 152, 255) , +'gray86' : (219, 219, 219, 255) , +'grey80' : (204, 204, 204, 255) , +'seashell' : (255, 245, 238, 255) , +'royalblue' : (65, 105, 225, 255) , +'firebrick3' : (205, 38, 38, 255) , +'blue4' : (0, 0, 139, 255) , +'peru' : (205, 133, 63, 255) , +'gray60' : (153, 153, 153, 255) , +'aquamarine' : (127, 255, 212, 255) , +'grey53' : (135, 135, 135, 255) , +'tan4' : (139, 90, 43, 255) , +'darkgoldenrod' : (184, 134, 11, 255) , +'tan2' : (238, 154, 73, 255) , +'tan1' : (255, 165, 79, 255) , +'darkslategray' : (47, 79, 79, 255) , +'royalblue3' : (58, 95, 205, 255) , +'red2' : (238, 0, 0, 255) , +'red1' : (255, 0, 0, 255) , +'dodgerblue' : (30, 144, 255, 255) , +'violetred4' : (139, 34, 82, 255) , +'lightyellow' : (255, 255, 224, 255) , +'paleturquoise1' : (187, 255, 255, 255) , +'firebrick2' : (238, 44, 44, 255) , +'mediumaquamarine' : (102, 205, 170, 255) , +'lemonchiffon' : (255, 250, 205, 255) , +'chocolate' : (210, 105, 30, 255) , +'orchid4' : (139, 71, 137, 255) , +'maroon' : (176, 48, 96, 255) , +'gray38' : (97, 97, 97, 255) , +'darkorange4' : (139, 69, 0, 255) , +'mintcream' : (245, 255, 250, 255) , +'darkorange1' : (255, 127, 0, 255) , +'antiquewhite' : (250, 235, 215, 255) , +'darkorange2' : (238, 118, 0, 255) , +'grey18' : (46, 46, 46, 255) , +'grey19' : (48, 48, 48, 255) , +'grey38' : (97, 97, 97, 255) , +'moccasin' : (255, 228, 181, 255) , +'grey10' : (26, 26, 26, 255) , +'chocolate1' : (255, 127, 36, 255) , +'chocolate2' : (238, 118, 33, 255) , +'chocolate3' : (205, 102, 29, 255) , +'saddlebrown' : (139, 69, 19, 255) , +'grey15' : (38, 38, 38, 255) , +'darkslateblue' : (72, 61, 139, 255) , +'lightskyblue' : (135, 206, 250, 255) , +'gray69' : (176, 176, 176, 255) , +'gray68' : (173, 173, 173, 255) , +'deeppink' : (255, 20, 147, 255) , +'gray65' : (166, 166, 166, 255) , +'gray64' : (163, 163, 163, 255) , +'gray67' : (171, 171, 171, 255) , +'gray66' : (168, 168, 168, 255) , +'gray25' : (64, 64, 64, 255) , +'coral' : (255, 127, 80, 255) , +'gray63' : (161, 161, 161, 255) , +'gray62' : (158, 158, 158, 255) , +'goldenrod4' : (139, 105, 20, 255) , +'grey35' : (89, 89, 89, 255) , +'gray89' : (227, 227, 227, 255) , +'goldenrod1' : (255, 193, 37, 255) , +'goldenrod2' : (238, 180, 34, 255) , +'goldenrod3' : (205, 155, 29, 255) , +'springgreen1' : (0, 255, 127, 255) , +'springgreen2' : (0, 238, 118, 255) , +'springgreen3' : (0, 205, 102, 255) , +'springgreen4' : (0, 139, 69, 255) , +'mistyrose1' : (255, 228, 225, 255) , +'sandybrown' : (244, 164, 96, 255) , +'grey30' : (77, 77, 77, 255) , +'seashell2' : (238, 229, 222, 255) , +'seashell3' : (205, 197, 191, 255) , +'tan' : (210, 180, 140, 255) , +'seashell1' : (255, 245, 238, 255) , +'mistyrose3' : (205, 183, 181, 255) , +'magenta' : (255, 0, 255, 255) , +'pink' : (255, 192, 203, 255) , +'ivory2' : (238, 238, 224, 255) , +'ivory1' : (255, 255, 240, 255) , +'lightcyan2' : (209, 238, 238, 255) , +'mediumseagreen' : (60, 179, 113, 255) , +'ivory4' : (139, 139, 131, 255) , +'darkorange' : (255, 140, 0, 255) , +'powderblue' : (176, 224, 230, 255) , +'dodgerblue1' : (30, 144, 255, 255) , +'gray95' : (242, 242, 242, 255) , +'firebrick1' : (255, 48, 48, 255) , +'gray7' : (18, 18, 18, 255) , +'mistyrose4' : (139, 125, 123, 255) , +'tomato' : (255, 99, 71, 255) , +'indianred2' : (238, 99, 99, 255) , +'steelblue2' : (92, 172, 238, 255) , +'gray100' : (255, 255, 255, 255) , +'seashell4' : (139, 134, 130, 255) , +'grey89' : (227, 227, 227, 255) , +'grey88' : (224, 224, 224, 255) , +'grey87' : (222, 222, 222, 255) , +'grey86' : (219, 219, 219, 255) , +'grey85' : (217, 217, 217, 255) , +'grey84' : (214, 214, 214, 255) , +'midnightblue' : (25, 25, 112, 255) , +'grey82' : (209, 209, 209, 255) , +'grey81' : (207, 207, 207, 255) , +'yellow3' : (205, 205, 0, 255) , +'ivory3' : (205, 205, 193, 255) , +'grey22' : (56, 56, 56, 255) , +'gray85' : (217, 217, 217, 255) , +'violetred3' : (205, 50, 120, 255) , +'dodgerblue2' : (28, 134, 238, 255) , +'gray42' : (107, 107, 107, 255) , +'sienna2' : (238, 121, 66, 255) , +'grey72' : (184, 184, 184, 255) , +'grey73' : (186, 186, 186, 255) , +'grey70' : (179, 179, 179, 255) , +'palevioletred' : (219, 112, 147, 255) , +'lightslategray' : (119, 136, 153, 255) , +'grey77' : (196, 196, 196, 255) , +'grey74' : (189, 189, 189, 255) , +'slategray1' : (198, 226, 255, 255) , +'pink1' : (255, 181, 197, 255) , +'mediumpurple1' : (171, 130, 255, 255) , +'pink3' : (205, 145, 158, 255) , +'antiquewhite4' : (139, 131, 120, 255) , +'lightpink1' : (255, 174, 185, 255) , +'honeydew2' : (224, 238, 224, 255) , +'khaki4' : (139, 134, 78, 255) , +'darkolivegreen4' : (110, 139, 61, 255) , +'gray45' : (115, 115, 115, 255) , +'slategray3' : (159, 182, 205, 255) , +'darkolivegreen1' : (202, 255, 112, 255) , +'khaki1' : (255, 246, 143, 255) , +'khaki2' : (238, 230, 133, 255) , +'khaki3' : (205, 198, 115, 255) , +'lavenderblush' : (255, 240, 245, 255) , +'honeydew4' : (131, 139, 131, 255) , +'salmon3' : (205, 112, 84, 255) , +'salmon2' : (238, 130, 98, 255) , +'gray92' : (235, 235, 235, 255) , +'salmon4' : (139, 76, 57, 255) , +'gray49' : (125, 125, 125, 255) , +'gray48' : (122, 122, 122, 255) , +'linen' : (250, 240, 230, 255) , +'burlywood1' : (255, 211, 155, 255) , +'green' : (0, 255, 0, 255) , +'gray47' : (120, 120, 120, 255) , +'blueviolet' : (138, 43, 226, 255) , +'brown2' : (238, 59, 59, 255) , +'brown3' : (205, 51, 51, 255) , +'peachpuff' : (255, 218, 185, 255) , +'brown4' : (139, 35, 35, 255) , +'firebrick4' : (139, 26, 26, 255) , +'azure1' : (240, 255, 255, 255) , +'azure3' : (193, 205, 205, 255) , +'azure2' : (224, 238, 238, 255) , +'azure4' : (131, 139, 139, 255) , +'tomato4' : (139, 54, 38, 255) , +'orange4' : (139, 90, 0, 255) , +'firebrick' : (178, 34, 34, 255) , +'indianred' : (205, 92, 92, 255) , +'orange1' : (255, 165, 0, 255) , +'orange3' : (205, 133, 0, 255) , +'orange2' : (238, 154, 0, 255) , +'darkolivegreen' : (85, 107, 47, 255) , +'gray2' : (5, 5, 5, 255) , +'slategrey' : (112, 128, 144, 255) , +'gray81' : (207, 207, 207, 255) , +'darkred' : (139, 0, 0, 255) , +'gray3' : (8, 8, 8, 255) , +'lightsteelblue1' : (202, 225, 255, 255) , +'lightsteelblue2' : (188, 210, 238, 255) , +'lightsteelblue3' : (162, 181, 205, 255) , +'lightsteelblue4' : (110, 123, 139, 255) , +'tomato3' : (205, 79, 57, 255) , +'gray43' : (110, 110, 110, 255) , +'darkgoldenrod4' : (139, 101, 8, 255) , +'grey50' : (127, 127, 127, 255) , +'yellow4' : (139, 139, 0, 255) , +'mediumorchid' : (186, 85, 211, 255) , +'yellow2' : (238, 238, 0, 255) , +'darkgoldenrod2' : (238, 173, 14, 255) , +'darkgoldenrod3' : (205, 149, 12, 255) , +'chartreuse' : (127, 255, 0, 255) , +'mediumblue' : (0, 0, 205, 255) , +'gray4' : (10, 10, 10, 255) , +'springgreen' : (0, 255, 127, 255) , +'orange' : (255, 165, 0, 255) , +'gray5' : (13, 13, 13, 255) , +'lightsalmon' : (255, 160, 122, 255) , +'gray19' : (48, 48, 48, 255) , +'turquoise' : (64, 224, 208, 255) , +'lightseagreen' : (32, 178, 170, 255) , +'grey8' : (20, 20, 20, 255) , +'grey9' : (23, 23, 23, 255) , +'grey6' : (15, 15, 15, 255) , +'grey7' : (18, 18, 18, 255) , +'grey4' : (10, 10, 10, 255) , +'grey5' : (13, 13, 13, 255) , +'grey2' : (5, 5, 5, 255) , +'grey3' : (8, 8, 8, 255) , +'grey0' : (0, 0, 0, 255) , +'grey1' : (3, 3, 3, 255) , +'gray50' : (127, 127, 127, 255) , +'goldenrod' : (218, 165, 32, 255) , +'grey58' : (148, 148, 148, 255) , +'grey59' : (150, 150, 150, 255) , +'gray51' : (130, 130, 130, 255) , +'grey54' : (138, 138, 138, 255) , +'mediumorchid4' : (122, 55, 139, 255) , +'grey56' : (143, 143, 143, 255) , +'navajowhite3' : (205, 179, 139, 255) , +'mediumorchid1' : (224, 102, 255, 255) , +'grey51' : (130, 130, 130, 255) , +'mediumorchid3' : (180, 82, 205, 255) , +'mediumorchid2' : (209, 95, 238, 255) , +'cyan2' : (0, 238, 238, 255) , +'cyan3' : (0, 205, 205, 255) , +'gray23' : (59, 59, 59, 255) , +'cyan1' : (0, 255, 255, 255) , +'darkgreen' : (0, 100, 0, 255) , +'gray24' : (61, 61, 61, 255) , +'cyan4' : (0, 139, 139, 255) , +'darkviolet' : (148, 0, 211, 255) , +'peachpuff4' : (139, 119, 101, 255) , +'gray28' : (71, 71, 71, 255) , +'slateblue4' : (71, 60, 139, 255) , +'slateblue3' : (105, 89, 205, 255) , +'peachpuff1' : (255, 218, 185, 255) , +'peachpuff2' : (238, 203, 173, 255) , +'peachpuff3' : (205, 175, 149, 255) , +'gray29' : (74, 74, 74, 255) , +'paleturquoise' : (175, 238, 238, 255) , +'darkgray' : (169, 169, 169, 255) , +'grey25' : (64, 64, 64, 255) , +'darkmagenta' : (139, 0, 139, 255) , +'palegoldenrod' : (238, 232, 170, 255) , +'grey64' : (163, 163, 163, 255) , +'grey12' : (31, 31, 31, 255) , +'deeppink3' : (205, 16, 118, 255) , +'gray79' : (201, 201, 201, 255) , +'gray83' : (212, 212, 212, 255) , +'deeppink2' : (238, 18, 137, 255) , +'burlywood4' : (139, 115, 85, 255) , +'palevioletred4' : (139, 71, 93, 255) , +'deeppink1' : (255, 20, 147, 255) , +'slateblue2' : (122, 103, 238, 255) , +'grey46' : (117, 117, 117, 255) , +'royalblue4' : (39, 64, 139, 255) , +'yellowgreen' : (154, 205, 50, 255) , +'royalblue1' : (72, 118, 255, 255) , +'slateblue1' : (131, 111, 255, 255) , +'lightgoldenrod3' : (205, 190, 112, 255) , +'lightgoldenrod2' : (238, 220, 130, 255) , +'navy' : (0, 0, 128, 255) , +'orchid' : (218, 112, 214, 255) , +'ghostwhite' : (248, 248, 255, 255) , +'purple' : (160, 32, 240, 255) , +'darkkhaki' : (189, 183, 107, 255) , +'grey45' : (115, 115, 115, 255) , +'gray94' : (240, 240, 240, 255) , +'wheat4' : (139, 126, 102, 255) , +'gray96' : (245, 245, 245, 255) , +'gray97' : (247, 247, 247, 255) , +'wheat1' : (255, 231, 186, 255) , +'gray91' : (232, 232, 232, 255) , +'wheat3' : (205, 186, 150, 255) , +'wheat2' : (238, 216, 174, 255) , +'indianred4' : (139, 58, 58, 255) , +'coral2' : (238, 106, 80, 255) , +'coral1' : (255, 114, 86, 255) , +'violetred' : (208, 32, 144, 255) , +'rosybrown3' : (205, 155, 155, 255) , +'deepskyblue2' : (0, 178, 238, 255) , +'deepskyblue1' : (0, 191, 255, 255) , +'bisque' : (255, 228, 196, 255) , +'grey49' : (125, 125, 125, 255) , +'khaki' : (240, 230, 140, 255) , +'wheat' : (245, 222, 179, 255) , +'lightslateblue' : (132, 112, 255, 255) , +'mediumpurple3' : (137, 104, 205, 255) , +'gray55' : (140, 140, 140, 255) , +'deepskyblue' : (0, 191, 255, 255) , +'gray98' : (250, 250, 250, 255) , +'steelblue' : (70, 130, 180, 255) , +'aliceblue' : (240, 248, 255, 255) , +'lightskyblue2' : (164, 211, 238, 255) , +'lightskyblue3' : (141, 182, 205, 255) , +'lightslategrey' : (119, 136, 153, 255) , +'blue3' : (0, 0, 205, 255) , +'blue2' : (0, 0, 238, 255) , +'gainsboro' : (220, 220, 220, 255) , +'grey76' : (194, 194, 194, 255) , +'purple3' : (125, 38, 205, 255) , +'plum4' : (139, 102, 139, 255) , +'gray56' : (143, 143, 143, 255) , +'plum3' : (205, 150, 205, 255) , +'plum' : (221, 160, 221, 255) , +'lightgrey' : (211, 211, 211, 255) , +'mediumslateblue' : (123, 104, 238, 255) , +'mistyrose' : (255, 228, 225, 255) , +'lightcyan1' : (224, 255, 255, 255) , +'grey71' : (181, 181, 181, 255) , +'darksalmon' : (233, 150, 122, 255) , +'beige' : (245, 245, 220, 255) , +'grey24' : (61, 61, 61, 255) , +'azure' : (240, 255, 255, 255) , +'honeydew1' : (240, 255, 240, 255) , +'slategray2' : (185, 211, 238, 255) , +'dodgerblue3' : (24, 116, 205, 255) , +'slategray4' : (108, 123, 139, 255) , +'grey27' : (69, 69, 69, 255) , +'lightcyan3' : (180, 205, 205, 255) , +'cornsilk' : (255, 248, 220, 255) , +'tomato1' : (255, 99, 71, 255) , +'gray57' : (145, 145, 145, 255) , +'mediumvioletred' : (199, 21, 133, 255) , +'tomato2' : (238, 92, 66, 255) , +'snow4' : (139, 137, 137, 255) , +'grey75' : (191, 191, 191, 255) , +'snow2' : (238, 233, 233, 255) , +'snow3' : (205, 201, 201, 255) , +'snow1' : (255, 250, 250, 255) , +'grey23' : (59, 59, 59, 255) , +'cornsilk3' : (205, 200, 177, 255) , +'lightcoral' : (240, 128, 128, 255) , +'orangered' : (255, 69, 0, 255) , +'navajowhite' : (255, 222, 173, 255) , +'mediumpurple2' : (159, 121, 238, 255) , +'slategray' : (112, 128, 144, 255) , +'pink2' : (238, 169, 184, 255) , +'grey29' : (74, 74, 74, 255) , +'grey28' : (71, 71, 71, 255) , +'gray82' : (209, 209, 209, 255) , +'burlywood' : (222, 184, 135, 255) , +'mediumpurple4' : (93, 71, 139, 255) , +'mediumspringgreen' : (0, 250, 154, 255) , +'grey26' : (66, 66, 66, 255) , +'grey21' : (54, 54, 54, 255) , +'grey20' : (51, 51, 51, 255) , +'blanchedalmond' : (255, 235, 205, 255) , +'pink4' : (139, 99, 108, 255) , +'gray78' : (199, 199, 199, 255) , +'tan3' : (205, 133, 63, 255) , +'gray76' : (194, 194, 194, 255) , +'gray77' : (196, 196, 196, 255) , +'white' : (255, 255, 255, 255) , +'gray75' : (191, 191, 191, 255) , +'gray72' : (184, 184, 184, 255) , +'gray73' : (186, 186, 186, 255) , +'gray70' : (179, 179, 179, 255) , +'gray71' : (181, 181, 181, 255) , +'lightgray' : (211, 211, 211, 255) , +'ivory' : (255, 255, 240, 255) , +'gray46' : (117, 117, 117, 255) , +'gray74' : (189, 189, 189, 255) , +'lightyellow3' : (205, 205, 180, 255) , +'lightpink2' : (238, 162, 173, 255) , +'lightpink3' : (205, 140, 149, 255) , +'paleturquoise4' : (102, 139, 139, 255) , +'lightpink4' : (139, 95, 101, 255) , +'paleturquoise3' : (150, 205, 205, 255) , +'seagreen4' : (46, 139, 87, 255) , +'seagreen3' : (67, 205, 128, 255) , +'seagreen2' : (78, 238, 148, 255) , +'seagreen1' : (84, 255, 159, 255) , +'paleturquoise2' : (174, 238, 238, 255) , +'gray52' : (133, 133, 133, 255) , +'cornsilk4' : (139, 136, 120, 255) , +'cornsilk2' : (238, 232, 205, 255) , +'darkolivegreen3' : (162, 205, 90, 255) , +'cornsilk1' : (255, 248, 220, 255) , +'limegreen' : (50, 205, 50, 255) , +'darkolivegreen2' : (188, 238, 104, 255) , +'grey' : (190, 190, 190, 255) , +'violetred2' : (238, 58, 140, 255) , +'salmon1' : (255, 140, 105, 255) , +'grey92' : (235, 235, 235, 255) , +'grey93' : (237, 237, 237, 255) , +'grey94' : (240, 240, 240, 255) , +'grey95' : (242, 242, 242, 255) , +'grey96' : (245, 245, 245, 255) , +'grey83' : (212, 212, 212, 255) , +'grey98' : (250, 250, 250, 255) , +'lightgoldenrod1' : (255, 236, 139, 255) , +'palegreen1' : (154, 255, 154, 255) , +'red3' : (205, 0, 0, 255) , +'palegreen3' : (124, 205, 124, 255) , +'palegreen2' : (144, 238, 144, 255) , +'palegreen4' : (84, 139, 84, 255) , +'cadetblue' : (95, 158, 160, 255) , +'violet' : (238, 130, 238, 255) , +'mistyrose2' : (238, 213, 210, 255) , +'slateblue' : (106, 90, 205, 255) , +'grey43' : (110, 110, 110, 255) , +'grey90' : (229, 229, 229, 255) , +'gray35' : (89, 89, 89, 255) , +'turquoise3' : (0, 197, 205, 255) , +'turquoise2' : (0, 229, 238, 255) , +'burlywood3' : (205, 170, 125, 255) , +'burlywood2' : (238, 197, 145, 255) , +'lightcyan4' : (122, 139, 139, 255) , +'rosybrown' : (188, 143, 143, 255) , +'turquoise4' : (0, 134, 139, 255) , +'whitesmoke' : (245, 245, 245, 255) , +'lightblue' : (173, 216, 230, 255) , +'grey40' : (102, 102, 102, 255) , +'gray40' : (102, 102, 102, 255) , +'honeydew3' : (193, 205, 193, 255) , +'dimgray' : (105, 105, 105, 255) , +'grey47' : (120, 120, 120, 255) , +'seagreen' : (46, 139, 87, 255) , +'red4' : (139, 0, 0, 255) , +'grey14' : (36, 36, 36, 255) , +'snow' : (255, 250, 250, 255) , +'darkorchid1' : (191, 62, 255, 255) , +'gray58' : (148, 148, 148, 255) , +'gray59' : (150, 150, 150, 255) , +'cadetblue4' : (83, 134, 139, 255) , +'cadetblue3' : (122, 197, 205, 255) , +'cadetblue2' : (142, 229, 238, 255) , +'cadetblue1' : (152, 245, 255, 255) , +'olivedrab4' : (105, 139, 34, 255) , +'purple4' : (85, 26, 139, 255) , +'gray20' : (51, 51, 51, 255) , +'grey44' : (112, 112, 112, 255) , +'purple1' : (155, 48, 255, 255) , +'olivedrab1' : (192, 255, 62, 255) , +'olivedrab2' : (179, 238, 58, 255) , +'olivedrab3' : (154, 205, 50, 255) , +'orangered3' : (205, 55, 0, 255) , +'orangered2' : (238, 64, 0, 255) , +'orangered1' : (255, 69, 0, 255) , +'darkorchid' : (153, 50, 204, 255) , +'thistle3' : (205, 181, 205, 255) , +'thistle2' : (238, 210, 238, 255) , +'thistle1' : (255, 225, 255, 255) , +'salmon' : (250, 128, 114, 255) , +'gray93' : (237, 237, 237, 255) , +'thistle4' : (139, 123, 139, 255) , +'gray39' : (99, 99, 99, 255) , +'lawngreen' : (124, 252, 0, 255) , +'hotpink3' : (205, 96, 144, 255) , +'hotpink2' : (238, 106, 167, 255) , +'hotpink1' : (255, 110, 180, 255) , +'lightgreen' : (144, 238, 144, 255) , +'hotpink4' : (139, 58, 98, 255) , +'darkseagreen4' : (105, 139, 105, 255) , +'darkseagreen3' : (155, 205, 155, 255) , +'darkseagreen2' : (180, 238, 180, 255) , +'darkseagreen1' : (193, 255, 193, 255) , +'deepskyblue4' : (0, 104, 139, 255) , +'gray44' : (112, 112, 112, 255) , +'navyblue' : (0, 0, 128, 255) , +'darkblue' : (0, 0, 139, 255) , +'forestgreen' : (34, 139, 34, 255) , +'gray53' : (135, 135, 135, 255) , +'grey100' : (255, 255, 255, 255) , +'brown1' : (255, 64, 64, 255) , +} + +for k,v in THECOLORS.items(): + THECOLORS[unicode_(k)] = v diff --git a/venv/Lib/site-packages/pygame/compat.py b/venv/Lib/site-packages/pygame/compat.py new file mode 100644 index 0000000..58e5c54 --- /dev/null +++ b/venv/Lib/site-packages/pygame/compat.py @@ -0,0 +1,103 @@ +# coding: ascii +"""Python 2.x/3.x compatibility tools""" + +import sys + +__all__ = ['geterror', 'long_', 'xrange_', 'ord_', 'unichr_', + 'unicode_', 'raw_input_', 'as_bytes', 'as_unicode', + 'bytes_', 'imap_', 'PY_MAJOR_VERSION'] + +PY_MAJOR_VERSION = sys.version_info[0] + + +def geterror(): + return sys.exc_info()[1] + +# Python 3 +if PY_MAJOR_VERSION >= 3: + long_ = int + xrange_ = range + from io import StringIO + from io import BytesIO + unichr_ = chr + unicode_ = str + bytes_ = bytes + raw_input_ = input + imap_ = map + + # Represent escaped bytes and strings in a portable way. + # + # as_bytes: Allow a Python 3.x string to represent a bytes object. + # e.g.: as_bytes("a\x01\b") == b"a\x01b" # Python 3.x + # as_bytes("a\x01\b") == "a\x01b" # Python 2.x + # as_unicode: Allow a Python "r" string to represent a unicode string. + # e.g.: as_unicode(r"Bo\u00F6tes") == u"Bo\u00F6tes" # Python 2.x + # as_unicode(r"Bo\u00F6tes") == "Bo\u00F6tes" # Python 3.x + def as_bytes(string): + """ '<binary literal>' => b'<binary literal>' """ + return string.encode('latin-1', 'strict') + + def as_unicode(rstring): + """ r'<Unicode literal>' => '<Unicode literal>' """ + return rstring.encode('ascii', 'strict').decode('unicode_escape', + 'strict') + +# Python 2 +else: + long_ = long + xrange_ = xrange + from cStringIO import StringIO + BytesIO = StringIO + unichr_ = unichr + unicode_ = unicode + bytes_ = str + raw_input_ = raw_input + from itertools import imap as imap_ + + # Represent escaped bytes and strings in a portable way. + # + # as_bytes: Allow a Python 3.x string to represent a bytes object. + # e.g.: as_bytes("a\x01\b") == b"a\x01b" # Python 3.x + # as_bytes("a\x01\b") == "a\x01b" # Python 2.x + # as_unicode: Allow a Python "r" string to represent a unicode string. + # e.g.: as_unicode(r"Bo\u00F6tes") == u"Bo\u00F6tes" # Python 2.x + # as_unicode(r"Bo\u00F6tes") == "Bo\u00F6tes" # Python 3.x + def as_bytes(string): + """ '<binary literal>' => '<binary literal>' """ + return string + + def as_unicode(rstring): + """ r'<Unicode literal>' => u'<Unicode literal>' """ + return rstring.decode('unicode_escape', 'strict') + + +def get_BytesIO(): + return BytesIO + + +def get_StringIO(): + return StringIO + + +def ord_(o): + try: + return ord(o) + except TypeError: + return o + +if sys.platform == 'win32': + filesystem_errors = "replace" +elif PY_MAJOR_VERSION >= 3: + filesystem_errors = "surrogateescape" +else: + filesystem_errors = "strict" + + +def filesystem_encode(u): + fsencoding = sys.getfilesystemencoding() + if fsencoding.lower() in ['ascii', 'ansi_x3.4-1968'] and sys.platform.startswith('linux'): + # Don't believe Linux systems claiming ASCII-only filesystems. In + # practice, arbitrary bytes are allowed, and most things expect UTF-8. + fsencoding = 'utf-8' + return u.encode(fsencoding, filesystem_errors) + diff --git a/venv/Lib/site-packages/pygame/constants.cp37-win32.pyd b/venv/Lib/site-packages/pygame/constants.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..886b8f10ac7c27cd16e257d23fffcb6b25bd02ba GIT binary patch literal 18944 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 WHPO38EJ1e4dfIvhfBpXd`ue|Uqpmps literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/cursors.py b/venv/Lib/site-packages/pygame/cursors.py new file mode 100644 index 0000000..944fc73 --- /dev/null +++ b/venv/Lib/site-packages/pygame/cursors.py @@ -0,0 +1,309 @@ +## pygame - Python Game Library +## Copyright (C) 2000-2003 Pete Shinners +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Library General Public +## License as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Library General Public License for more details. +## +## You should have received a copy of the GNU Library General Public +## License along with this library; if not, write to the Free +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## +## Pete Shinners +## pete@shinners.org + +"""Set of cursor resources available for use. These cursors come +in a sequence of values that are needed as the arguments for +pygame.mouse.set_cursor(). to dereference the sequence in place +and create the cursor in one step, call like this; +pygame.mouse.set_cursor(*pygame.cursors.arrow). + +Here is a list of available cursors; arrow, diamond, ball, + broken_x, tri_left, tri_right + +There is also a sample string cursor named 'thickarrow_strings'. +The compile() function can convert these string cursors into cursor byte data. +""" + +#default pygame black arrow +arrow = ((16, 16), (0, 0), + (0x00,0x00,0x40,0x00,0x60,0x00,0x70,0x00,0x78,0x00,0x7C,0x00,0x7E,0x00,0x7F,0x00, + 0x7F,0x80,0x7C,0x00,0x6C,0x00,0x46,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x00,0x00), + (0x40,0x00,0xE0,0x00,0xF0,0x00,0xF8,0x00,0xFC,0x00,0xFE,0x00,0xFF,0x00,0xFF,0x80, + 0xFF,0xC0,0xFF,0x80,0xFE,0x00,0xEF,0x00,0x4F,0x00,0x07,0x80,0x07,0x80,0x03,0x00)) + +diamond = ((16, 16), (7, 7), + (0, 0, 1, 0, 3, 128, 7, 192, 14, 224, 28, 112, 56, 56, 112, 28, 56, + 56, 28, 112, 14, 224, 7, 192, 3, 128, 1, 0, 0, 0, 0, 0), + (1, 0, 3, 128, 7, 192, 15, 224, 31, 240, 62, 248, 124, 124, 248, 62, + 124, 124, 62, 248, 31, 240, 15, 224, 7, 192, 3, 128, 1, 0, 0, 0)) + +ball = ((16, 16), (7, 7), + (0, 0, 3, 192, 15, 240, 24, 248, 51, 252, 55, 252, 127, 254, 127, 254, + 127, 254, 127, 254, 63, 252, 63, 252, 31, 248, 15, 240, 3, 192, 0, 0), + (3, 192, 15, 240, 31, 248, 63, 252, 127, 254, 127, 254, 255, 255, 255, + 255, 255, 255, 255, 255, 127, 254, 127, 254, 63, 252, 31, 248, 15, 240, + 3, 192)) + +broken_x = ((16, 16), (7, 7), + (0, 0, 96, 6, 112, 14, 56, 28, 28, 56, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 48, 28, 56, 56, 28, 112, 14, 96, 6, 0, 0), + (224, 7, 240, 15, 248, 31, 124, 62, 62, 124, 30, 120, 14, 112, 0, 0, 0, + 0, 14, 112, 30, 120, 62, 124, 124, 62, 248, 31, 240, 15, 224, 7)) + + +tri_left = ((16, 16), (1, 1), + (0, 0, 96, 0, 120, 0, 62, 0, 63, 128, 31, 224, 31, 248, 15, 254, 15, 254, + 7, 128, 7, 128, 3, 128, 3, 128, 1, 128, 1, 128, 0, 0), + (224, 0, 248, 0, 254, 0, 127, 128, 127, 224, 63, 248, 63, 254, 31, 255, + 31, 255, 15, 254, 15, 192, 7, 192, 7, 192, 3, 192, 3, 192, 1, 128)) + +tri_right = ((16, 16), (14, 1), + (0, 0, 0, 6, 0, 30, 0, 124, 1, 252, 7, 248, 31, 248, 127, 240, 127, 240, + 1, 224, 1, 224, 1, 192, 1, 192, 1, 128, 1, 128, 0, 0), + (0, 7, 0, 31, 0, 127, 1, 254, 7, 254, 31, 252, 127, 252, 255, 248, 255, + 248, 127, 240, 3, 240, 3, 224, 3, 224, 3, 192, 3, 192, 1, 128)) + + + +#here is an example string resource cursor. to use this; +# curs, mask = pygame.cursors.compile_cursor(pygame.cursors.thickarrow_strings, 'X', '.') +# pygame.mouse.set_cursor((24, 24), (0, 0), curs, mask) + +thickarrow_strings = ( #sized 24x24 + "XX ", + "XXX ", + "XXXX ", + "XX.XX ", + "XX..XX ", + "XX...XX ", + "XX....XX ", + "XX.....XX ", + "XX......XX ", + "XX.......XX ", + "XX........XX ", + "XX........XXX ", + "XX......XXXXX ", + "XX.XXX..XX ", + "XXXX XX..XX ", + "XX XX..XX ", + " XX..XX ", + " XX..XX ", + " XX..XX ", + " XXXX ", + " XX ", + " ", + " ", + " ", +) + +sizer_x_strings = ( #sized 24x16 + " X X ", + " XX XX ", + " X.X X.X ", + " X..X X..X ", + " X...XXXXXXXX...X ", + "X................X ", + " X...XXXXXXXX...X ", + " X..X X..X ", + " X.X X.X ", + " XX XX ", + " X X ", + " ", + " ", + " ", + " ", + " ", +) +sizer_y_strings = ( #sized 16x24 + " X ", + " X.X ", + " X...X ", + " X.....X ", + " X.......X ", + "XXXXX.XXXXX ", + " X.X ", + " X.X ", + " X.X ", + " X.X ", + " X.X ", + " X.X ", + " X.X ", + "XXXXX.XXXXX ", + " X.......X ", + " X.....X ", + " X...X ", + " X.X ", + " X ", + " ", + " ", + " ", + " ", + " ", +) +sizer_xy_strings = ( #sized 24x16 + "XXXXXXXX ", + "X.....X ", + "X....X ", + "X...X ", + "X..X.X ", + "X.X X.X ", + "XX X.X X ", + "X X.X XX ", + " X.XX.X ", + " X...X ", + " X...X ", + " X....X ", + " X.....X ", + " XXXXXXXX ", + " ", + " ", +) +textmarker_strings = ( #sized 8x16 + "ooo ooo ", + " o ", + " o ", + " o ", + " o ", + " o ", + " o ", + " o ", + " o ", + " o ", + " o ", + "ooo ooo ", + " ", + " ", + " ", + " ", +) + + + +def compile(strings, black='X', white='.',xor='o'): + """pygame.cursors.compile(strings, black, white,xor) -> data, mask +compile cursor strings into cursor data + +This takes a set of strings with equal length and computes +the binary data for that cursor. The string widths must be +divisible by 8. + +The black and white arguments are single letter strings that +tells which characters will represent black pixels, and which +characters represent white pixels. All other characters are +considered clear. + +This returns a tuple containing the cursor data and cursor mask +data. Both these arguments are used when setting a cursor with +pygame.mouse.set_cursor(). +""" + + #first check for consistent lengths + size = len(strings[0]), len(strings) + if size[0] % 8 or size[1] % 8: + raise ValueError("cursor string sizes must be divisible by 8 %s" % + size) + for s in strings[1:]: + if len(s) != size[0]: + raise ValueError("Cursor strings are inconsistent lengths") + + #create the data arrays. + #this could stand a little optimizing + maskdata = [] + filldata = [] + maskitem = fillitem = 0 + step = 8 + for s in strings: + for c in s: + maskitem = maskitem << 1 + fillitem = fillitem << 1 + step = step - 1 + if c == black: + maskitem = maskitem | 1 + fillitem = fillitem | 1 + elif c == white: + maskitem = maskitem | 1 + elif c == xor: + fillitem = fillitem | 1 + if not step: + maskdata.append(maskitem) + filldata.append(fillitem) + maskitem = fillitem = 0 + step = 8 + return tuple(filldata), tuple(maskdata) + + + + +def load_xbm(curs, mask): + """pygame.cursors.load_xbm(cursorfile, maskfile) -> cursor_args +reads a pair of XBM files into set_cursor arguments + +Arguments can either be filenames or filelike objects +with the readlines method. Not largely tested, but +should work with typical XBM files. +""" + def bitswap(num): + val = 0 + for x in range(8): + b = num&(1<<x) != 0 + val = val<<1 | b + return val + + if type(curs) is type(''): + with open(curs) as cursor_f: + curs = cursor_f.readlines() + else: + curs = curs.readlines() + + if type(mask) is type(''): + with open(mask) as mask_f: + mask = mask_f.readlines() + else: + mask = mask.readlines() + + #avoid comments + for line in range(len(curs)): + if curs[line].startswith("#define"): + curs = curs[line:] + break + for line in range(len(mask)): + if mask[line].startswith("#define"): + mask = mask[line:] + break + #load width,height + width = int(curs[0].split()[-1]) + height = int(curs[1].split()[-1]) + #load hotspot position + if curs[2].startswith('#define'): + hotx = int(curs[2].split()[-1]) + hoty = int(curs[3].split()[-1]) + else: + hotx = hoty = 0 + + info = width, height, hotx, hoty + + for line in range(len(curs)): + if curs[line].startswith('static char') or curs[line].startswith('static unsigned char'): + break + data = ' '.join(curs[line+1:]).replace('};', '').replace(',', ' ') + cursdata = [] + for x in data.split(): + cursdata.append(bitswap(int(x, 16))) + cursdata = tuple(cursdata) + + for line in range(len(mask)): + if mask[line].startswith('static char') or mask[line].startswith('static unsigned char'): + break + data = ' '.join(mask[line+1:]).replace('};', '').replace(',', ' ') + maskdata = [] + for x in data.split(): + maskdata.append(bitswap(int(x, 16))) + maskdata = tuple(maskdata) + return info[:2], info[2:], cursdata, maskdata diff --git a/venv/Lib/site-packages/pygame/display.cp37-win32.pyd b/venv/Lib/site-packages/pygame/display.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..e3e2b32d9ef7580ed0e23b17e441946f75bf7d09 GIT binary patch literal 25088 zcmeHvdwf*Ywf|0-z<`4@U?NeYj5<h=M`z|to|8#}Ng!x|frJF)F-($4&V;<2Im5%o z8l9vP52*Ji-qK#%Lb12hOZ%g}Tm|)~LxT`ns`w~!)wWo<c5Lu>bCnCJmpZ@i+UJ~^ zNdi^df9~&dd-B<5zt&!B?X}ikd+j|lS$y|nY#d`uhZKu3b`Uu|rTqQpU-}fruActf z)$G8;U*3E$rRtYA*NFb0xiiqw9PqZ88@%o99g?};XAXqg&Hi?C`O<20TSudB-sH)X zEGp_BO63(FW!!$Pmd>^vx^@utQ+Lgt_V38ME0z4zU9+a0<LzIW_5si5@w}@`>A$e` znQQ+q+CR#eeeEO2*W7grhhKBo?L5E#u3ueC<Ja7k&Fjnk4I<IhX6UY9tSV(Z`#1OD zHCo#lmU{D5DOWQ#4=oO*_3mqsn~+L*-NehOjE(2jM9y}hfrN@Dm6bwL7)0aZxl*-) z?n<<7MZSx=yBQm%eDw1e;L;d7GoP`n(S6DFJ2ckR#!|+1g8G%7d6I9lgw9vz;6?n= zTvfhN;*XiJ_45LaUdhYYb4E0kA`z?|Dd{Oi&pZW;xvxWq8;K+go|2zZ#v=2YoBWMI z#?q;y6A3cpf}pzkloGx`FwlTHmq|AY1a~)5(o@Ree61Y-BpI>CkVqkMO`?pabPOlF z`G555V5Og#`cK54?d2AOyM@Ihi>W1scY5^gSS%*%W1YJ2@swq;jA$t{g^$O=N3wb& z#>&I}&dEAAGkqLN{kZ?*53AuyR><e%3PU)`Bq1D4k<9d(La#I-QaWgj{uiukFfIBk zWX5MAgVSRnQ!J#9W<m|C22J7nOw9O11U>HPG}!H`wLdek7L&NYoSCBEoyb@Vi_U_M zSM@|f6NJczXD}>!18{Avc>kYMwyyns*msGAUFVx&pwfhv3DG}HVC+~L)oB$(-2m;0 zNWSPtdd9?z>w)zEOeOjtf$1#Y%0$B+YIsy>*gKz@#Ha9zwp<0Ot9m1$S<y3?CXkrL zUDW#|^)BGO3L!F4`#a#}SjDB!AiZcg8hYL__Eu4)8i?hga50l^s*TQ5rXpPv3mIBc zAqP2EekJ+?@D@82OFP-fOb{C9wg2I@zmJ99kA9s-^tTwqlO&PtfZR=By^;HMLS%4h z<sPa<CxXMR6=xH|Nae!#HO=ff^o3_|326-800yCSsG*$DuM&>;M2t@ymJde*AkZIu z8be~Cv(bqf@gX8^LZ5t}p*I#X7PyG){iKmMfs50PrAU*)u~aEdUTYe(;Z<En6rMxB zJk%FD+k3&-^Bq)_=9m8jGt-(MiZ>5{B5w}IQbM=%UI^V(?ItYy(Oz9krEM6fl-6TZ zZ%j%H$Hs*!6|5ZztWu8BR0t?}XwV`rJ}1MVt>SVxac+bLLg$C}!bdXuWnWad04`M# z$w#BjP+UK(yH?JLK;__tTl7?nm0yAWX!J)AaO~7NGFm`}?=z%?(xM`4E<xZ$m_+!9 zK?Q--Gv;7PVQ?%19?B$6)Uik`BO66`EW?6qEfIa-oCP{)nHGH+Lhp@8X)UR%emQH; zX&*E7O@5Q!87Jv|;|Y4_4A9$k1n;J88ACjqe3oZ7MtGL?0?%d~<k{Q<$ew&OEs9L8 zV0+%>xo*!H<l8Isd(Kh4_uWge*s-*1lv7v=+fAK&&O+_S(oW+|d>>1D7bRL~$I_x| zsYSPPLxdgcK8HH345cn}x6xOXHjMh=GfbY0-NHn5@d&M__aG(t-}uz!3Vp3ySu}3I z`0V`j?aMO9okU^$hN0|nA3IM;*U5_w&N~f(N%9@~ad#M;0|7($XW7nEp+5+bb!+?O zpAG&o8iwYuaL3sr{f)cH(bT>;42K}Qb%Q$RNeOFA{`rvcCszYz$R1hOzdvPNe{=~S zBu$9^0H!vW87)NJ9qq&$PCz1DQ9mmCQ~KeOUIo&g$SQcQ{^%yO!aH$@4N7@Jv>t`Q zj{qE9i4u1Ls6esN4`4DNoXL%a8`I)+ZsNPiY*wVlLRqm;X7oP*wrbVd{^&CtUNVT6 zFoozaHTOry11bD*&wrvy{Cq;qACfh4Gt{%tgrjNcB6Jfy4YbiW&;uTI_6RT@RVtG( z?s*zF_~HH(F8S~|L#-Ur_g=u7`Ya{X6)i+JCVx9@|2BnwD-A#sFb&p;dQgb2Les_5 ztFDiH78xwxO}oSP(D}OXndvVP$1Ubnvj@Thu{Q>UH0tZCINw(>+*fhw```cmOEg|- zz!0?UPeH3^9T`GPT68+h=R}KMG*y7g<K)HQ>klqQG|*H49WhgA?d~FE4;-WlMRcL6 zLs!8Xn+mo<>!wgKOz9By%|7g27TpcsKn`7+8QyGRT{o*MeSgZ}bh+Z3%!K0)<O6NQ zxC4%m{DBH!k3`piI9DERMZjR}z7HavC`1mCT|J~ouiHfeXVUoY`wT1u&FZ6T08V)g z@>Q!;DRU9Y5C@4T{2n$${Tl<};aF%w)C{=6s}xD=X$<6gL*(MgTPyTjL4@l$Y${6g z=}J{=>0#e_2xpja)U|alE%~7I`4>St<~$}%?ma3^ym)dCt+&CZ?G@+YW=y5D?uP}^ z#idwAI;u7*WGaR273TnyML>&(wpUyd7M~LqUlInKuZAWZS_<5QrruXV2Kn&hDGM1p ze8zOuKp$V<7hmh+>snEv<`JicUF1L^Fz_GCFaR%hIdX_%CL|Wi(4(cFm!t1O(yRIp zn$g}LU3w8tp;8yt>-s8n(ce>GLbX)X`VW>;AQShL)wS@I-^5^OCrw_g|K%*<!glV# z#1k;1T6bSgHgHBCBr`f<=<B6zq;LCHdOy)a?{9b0`(L`~{eL#&-L&nAr+Bt~C(phu z@vOI#XWwt-*^fkIPd?iFBr>@|*VnrPh3!<>g~Bn;0eMfk^iqqvulF(DySLUI{Uf-- z0Pu3GVs8e5)ngU=$dUF{9EfG;AduSaD`OYm*<P_1%SD;V_3uDipY<yn$o7h1=!gLj z&SbLjnf{BXZ;0HSMw48(nif!X?Tb&9Gt=|*a()ubtdoneSx%H+jpl<)?5*%oo%55x zA3W<;6X-qyrPoN%$)iDIGj>9i@$m74_)iF_8e=(tV{*C0)Yob;ZAY4Yrn<I{n<ETM zc-h_Oi^f93a>XTeQPHF-h8p+KxR3i`W{t2MJgYol2<$KWm~<Np!5w0+q`g+0Z^CX# zE+pCyL1E8UtbfKFOqqqxWmgODluf+R1b~)F(MJG64zi6veM3x$geOy1s&KrvuJ1+~ zv;Dr))yD71pRDei(6>p~w^ZL(XOJsS%Ztx~xd;Bk-|kx^SDeXdmwc^P4agPmwxr}N z^tFes8d%xFR*e}MD#O?rLnSezD>6QXNw>Pzk56S%maCJp43~TSI3`_<Mr0GvIF5y; z$Sy1R2)~-r#|wkw)rR|qC&(4xA`1FYd0)l3E_=&_mBMj_>h`s#`^NPJb$xf~`>Mh6 zyFa8;QeVXo#4Ak<znZF`^Q`+JBY)JU%v^UYjb;r<hIXcxR#0Y=mI%j<DJRJbuYi8e z%ZrD@XT}T1!^7i4Lhtd=S9X)w!UK9`IF=8)P%&iQL#@)(@PJuqhqGe5O^9&o!vgOY zA_Zyb0Ha;9|3qwt8O9o$v6sJ};_qGjeT2VX;O_{3zsuhP{C$GIPxAMh{C$SMPvea( zRfr^=W=@=_ULnuzhK1JFi8?RH{YuWUpehfCkLY@1#-4A0Ptk;)y4b1k5j_I)2{12t zsjg05lo@-Cpe{%q@&cVRZ7arwszoz^YhxKjs9^xyOQ{h@mMLj&2-9dPHKDj(DVkC2 zREky<yHWha__fl~CgZ8J$54?=EBEX~9v)957wBr`(#+UNkW_iRaWiPd-hkQmMq##M z5h!B<3hUBpu@dz^$96%2?Hk3F03N~iB!%rKFUNpFG)P2o=uaZ*7kfC-3=-lM<yDp- zJX72;ns7RVz(@v1xD51rPF#tF(7ob;5#(FMBVT}gd4hbl_~vNx8Opp*f~cylGgqW9 ziNg(;en$3unys!kvbkRTPnf)Dsi)>SXokhW3NA>CAl!1)TbOtrB*lDeNAl@oX_OO^ zV`)VwMFbjGMdP4G6OK-qW3=yCw-$@0zfMdCk?L5+8bD)PkWY^_&38hFJ@V0YYgfl@ zzQr8Na9|~HZbQ?=^K~GYL$(>qsNsn8SRt_t2{70wu8U=~qU0V6;*MqPM2~PB=J&*5 z9Q<3A(Q!(O&mT?i%`4Dbc^O<f;99m_X90CG1@R<}l`NUDjA1~NcyPv!WptqrtX_X5 zR#)}QIt$KGoroniW8m&ah0|kcr5FhtW--RwR)HSi?or{Ow*-hbt?)TLu0V8d{)%Pv z03Wt7J?S_it?15YlDirQ!1HLYbK{JT8xnaqc1j+qt;6{}Ba@R(zl^Rfqh`5(HSi)_ zk7caq<FNbdHAd7emH5$Fa5I5vFt>ORBH~vxVgw~|K#`b5lUOF?#F0QEy%D*_qLY7a ztQc6fJeDDXV{mIgbOl<8k}55eDx=XH)Yi$a0~jjOmJ)l5tQ{UPG|scGzglZMO>OUl z$i3_bC~B}@0Ibjeq6F|!=voMl0Ai=Axw91_YZWl_tuS<v-nINKKBmmeq0P%orkXr@ z1tBn~2u9lA4dPB3J=*3KQn)C{*aj9<T%<bi0&GGAyTOhKtX{G6EDnF-#0t69VgT>g z?e2uw#PhX4ZB1HAh^yo^76X>4Nl_tL>TX7`W?~~5b~S)OUV(EV2xQXryDJH_=rW+S z!iBn~$7(U63n1h!^w^dz&aZ(Xq)0+tEF)jR)YMlVVv28Ah;2*VLl!*n8ByqZ5%JSO zS_EtR6<Up>X#rqu-0E=TqZJ7o)6>i37EjQWB}?4K(y<U0klo`%pfC^~P6<u<#Aw2p zPmEJ^7QD(Wx{+GBUVM}AjMfU2*pHDq3+VD;zyLhhCkX{FW4i!OI9I5Rd!ro*Zv<O2 z#98MnCVVb)G~r7tE=xGGpC&41Dbvf=OwEAlol*RwJkVEVNk_~xK{Nwu@Hu(DuC{w~ zT8eBn_Wm9+r5mi@B8P{--VnMqmg|mf)U~9-TULQvb!nxmOKTlnE5X1LhLWXdWF@hX zY$zPETE3A?Wd$u&d0y-dtRZK#>ngr-sUk<W8-7Gy0n})P!si^(^{ug(uoNe(UCnXS z39;UfjE@`uRJcFYIK7nBDVpOZHH5{WFoQ`Od)@&QEe}np<BYunXo3}F;zk%fYv4{H zaDt^9c64O9TT+rcq_3jU>~2XN(b!~s1~|5seMWiK*0LDo=B?w#xWt9wex37A#%*<U zvRh+GU(v#<;Z-FI903UwYk~ZSD%VU^t{!!=%BtHnT9{h*7;1_nI6}T&yGD$JbJ0eM z`P4Jobh&`xAI^o(4u#KE^0SR_q_5mkjyn^Bu`W{AVm8hyC*B=k8p?r*%oMXOXN@=? zS6Rx16VV?>F>@T&6axe@+W97`JKx~33oKQx)Wa&X<w^rGi!?zj0>Z%`$u3%qwK&Fc zIuqS^KAZ`kEiW)Q(`ZM8W~|1Z_h7DWXlF0iB{nr<?+a*(Wtii`v7DtTie;`LX00DC zCw*)*^huUEWb*f708qs3*w`Z~Eo3@;hX7>y19bImG(L0_vh9Zdgu#%d4k@C*%(xw; zpi_tmk-jdA9&Kizf8;GdLL4-|tjFBY5|)NyuW*6R9GXk$8q(&L<d}JI15Ge#YVt6m zvMGwzmms#*!g&P!4}n7XetpV)<HPqGQo82Kk|j%i729QYEy!g@XJR^XmjybbU4QDr z@KHTy5MYBkbm+0*&85Vzv)q!d*elM`H$!V+4k!%r5G^!BGBublWOa#8J89d6nm&92 zY!I-rB`Xp?!6mM3Fl2<9X*~XcVj2qE4n;Eu>HeU~Vs##tD4v%Oli#$`OwgLXjAkPb zMC)k2d@eJL&z4)Rchft|ZG5TRaua`>Nz4efc5pV+`2vFqsyyprOgO=-(Q8!tiL*YH zs#hRFD3ITF{@49A@-iKE%XH_j?q4L|qaSy%_rljo<@ttjKkJQrEzkLhvFbO@myK0X z2rpB(fbDkaMd9_PKC8S)*L&P!T>9GV-^~6)Q{PJ6x~4vH{Mx2Ick1eXH5iT)ZAsB~ zXo?;Y&w=a2@|q@|t+~un?S}>=Oidm_=#nYwNOohEb3b-eQs0H~sq(Od7;!5`3{Jw( zQZ5x8`bmwd_t9zIXWfVmi2H-#@Hyq;lly~Gxx%!aLb1gL+<`1d(R2(88#?KxiWwEU zlV((@M5S^Y=CE8mfVX=Y>T8}v3HkbcO5RAoN8wnoYIR_ke-tO(I#LqZ;tPNtGfTQm zsj`&9)0Cf8%&EHz)N!YhQA7eN)jwRS+X{xrF0r68v0u5VgTjw+40q9JXyrt830%YP zE4V0<wW5=6MZNDxk77~O$j08|Qk8Lf53$YY>K^7dU*{IzB?dD@f*+!7<$_d5(avKW zyMBzjM(`6p21^OOAj2xOY22rh4v(WVbeXPNi+{*`Y4xneTvw_<u$S<;ISEglU5k~U zUxyW4+CpkD5QoS~H<a@ar;(e@isUU;CC@HZ@;PoLw-S7^9nKV2qGy!!J@`NZTxEly zW51)%fadf=!X^r{4D?E;mziGK^s>6e%|KEI15~t(h+cZ04kOqSro{DSe5O<fPoyV> z(JIbDLbTKcrKzd{&GPV(bk8~vUZN6?ucz?2{DeFlz+O)FNj5^}sK?~-d6QzBBP!|W ziCb+}a>aoPKdmem_f@MVTrQ!6_R1b5uiByH?x&QTV%oShW1hyIRBT=0E@;HK?R|J- z6!j>cMscK_Pj$PamH6xx=1IeTL7rP@sjb_aYV3I)NadXMkObXql}eLmV7GaRgw>KV znA*Zx(r|Et-1%4uAA66F*C9kbNt4!rIhIkWE&&|ajXnPeWY7;{pESha=)rjKmxY`D z2l%%m(8(ic9Bj1%WVS*h4F|~3H6nvvMLk&vKbD~{meCDFyUY1eSL*EBtRK9WPd_w~ zu0c&)!`kkGTPm<+8p&QQ&NAvYlMXI>H({=7+%U=x)jh=lb0|4Oc9>7DZ-55`x;?}~ z*hMF27FrekXc9z7Uh^g;Lf{<It^f-m1fTs@L4aEi3}CU1m`NiSi2<KuKRSfo(U)5s zMU3%%jZi$Vq7V<l7DlnksYC$u_bL$9uYRNfTrXCR9f#XpoTPbtFH&#Pr2>!dp&=cq zSC>#AK5vP~SwB&_R6j?klGe)@`j#uwCn}tjSgvr9rJXY9YU6DfYIry%(TW8(8DyxS zg{A~2Kj6Df(%D=!k<jGij{X?aIDFuo4og5=(mfVB1CA8fY*BYPhUIM>7P7wmH?i0Q zM+gl`P$UfCu2bO-zUSs-(urZ8{5p9UMx4h8bQ2;(J3#ze0wPJChLP;yptyXD9gsc^ z{k2VSA-a^*qve+IMtn-ecMjNQ8bWac`BIYN8qOzTZD|dKU<j^Ajq-4vcpiA+OxN)J z#Wd!?3}90N_|l&Trdu~6Iwt-&a5?5F{@~jyt)wg7W3B5~ZX0v-jpP}6IG;2n2QN`5 z`nJ(D-Z-UHFE26mRc2D;K|2_(AOAwE@&F7D+w*CTcfMX;VCtKnDIZS6G_WV#2zx?J z-eJ)rtBnOR<vUHWK)M{z8=sj!(T$g$UK8krZT^}0lj&uk*H!eI<c{5wg*+{GPiE|% z^w>QnYSp>rqlcqchtH(&!ep&r&<a;+g-KdrA{Al*gM2jnLCR}Us@1{(MA5wrTTV3h z9fZZ@mQDyywL%FDhmUm99(X4@Vc%#_<!3mw8J|i}7yx_^n+m6duJ3tWn)<LirEpnF z=<0AJHGDX==k?H8e8DE|hDdlI1*_m1d7+*&kqC$S4|M_07e|o+6bkQ2F;)MeZjQt_ zy&I07eNlF<1+K$UMJ&l2ZT(UlDOk9aN3gU*WvTQ_^1~H30@JQ9!;i7&wpc87XfGer zWSn09h2>%FvD3%{UyfQOjfs4jF(E}_#xa&~LgD$bFRDLdY?JD$;45)=dgwGq@P)^x z%L`2u3c}*!;d%d|Ghb>hDvq>~IL>`39A@wl>&%LEX2v?xW1YA$#c(Cc=P_vip-W#1 zU$(py^BU_%L>(6T2)qU~eDSrX;vM6&#Prd4v%VBw=n<#>gbEI3WB9{Y7wX|tj>D%c zNhz!(pK>%6Zl&k=NS}hixK&LI-n|l@Uvv;hR_#gvAK$<{;`?W8Mk!$8)e|^BVFNrI zO&wv833zR@rEdpZJRR3`Ji>{8+;ZhlhQyPFB>Eaee2LRI?N09}2L>uhd?W)nc`}b| zk4tmHDY0Yo`H=$0wfVYb+Hvhz8bOf9Q$CZS(q+({xIFR1{QfdZiSf9HrYjBM9pNJ} z8<vXi0OBH2Kq%d<?8k`2@hOY3XEDMWu@VrFp+(uC(S^%#V-J0aLCoiNPlIIT;}2tx zOzkyjU!e@4W3nE{<c(q`8nJgltaO0OaMLLDOuR~LMLPlrBEpa1I8@&r|0KX9SrBNS z0_HJ+wtP{D4USiD_CyI-aJnYc2wcD_eXf-m#@CSy_!5m<yB<TtjT>*=o25`kl7f0a z!l(Nc9K1reLQ@;KpEBm?ow#>P`b-;KPZ<+)fdvz8c<?cpLA~kWK~=(>@p+xN9-QOm z&_MG?ykY=*Q^&B^kFOH|0CM=-^JOIPW))*+7c=$>(od0gB0Y%IinJUl7wHzHtC5BP zOV95rQAQfSh_UODZbQmNI*GPM<Py@?k-mfU9NP9G?Lg{5ir@=k?a0?4-HDWsWI?(b z=~MJYkxn7qiLvxpmjFM~cqDo@BLA9N-hupkNL!I!K^j6bEM+VkX$jH+)Ju`mvj$~) z0+_>tNZ&&GF;X#-8EGogrMo~M>20KX)SpBCB+`RO0i<<EZlqEqD^ezs9_jp@_+19l z&ru#g{tVK0kiL$z8L0`W7O5O*9@6zldZdpr$G4FNkldj64DzRegPzS<U)-4K+qd+s zT=GWbv&fr}n;{oOxU}E2Oh&l~_bQEdAUUW9a#6Cs=uO|fT7QS~5&O>3ix2LR9()~) zEi9|4B2MTxCj9p%mbP}@S*rXtWuBjYG-Bc383P{v^OJd2YeQ2r<geAsme*KTmZ65< z$&75fo7$cl(YA=g?H$?1;r5MagEz#pe`FhnJ20ZHhQl4iTMzhooR=C77eU)DYEyq7 z19>R?^SULtS^Yf>$(&@bz*+9S_uj^OOponCOpB8U+NB1|qWPQ-zM+@Yb~mT9H@U4w zfy3AH5^yyN9DXOkx(OdAY}t$=(|%(#&!;d$zct!MFpAvm1e3l%`7MsxCQw^8+UU1K zY8$s0TECx8h_~eu9CKss<E~Wu?GJtmz`Av)*9Y+nA3U8ZZvLAe%NE|&&DeSr`0slx zRvWdg?*_d@8|RDKlOOs}iRvfST&q7lMX`0Q{^qFu8B?#^|0(*eyJlqn>7?=3PGhE7 zNE#p7da8#UA)a_ziTWC(^+;#%BdsmSvC{m(&Q|Z1c@3RH-rP<8cELWcb4w$0Z&}pt zmpp1OTLW2Z&yV2;9HsCtkhS(4g?|`A8|g%QhT)T0Df~xL+nw-pyU=Dz8oLrcFp9R* zNpPFdwjXV0liGHo?FF=5?)lq3@!xZwc$!t0S9xmvjlPcZfPbSeu*BQuV?W@nD>|{> zean3f5@Sx@vd|~Z@9eCW(9FKcTdIB1LT_7}ce%F>t2AGMs`6BC@^;=4YHIQYu!4Wg zTk95kFucs$Dfv6v*;jd+JJi-$vC-Eq0csy_;hZeSk35&&#eS-d1Cd1y7{nIy7NFr^ z)uBL>x539swAPA1pd-N8Pm;!I^d9GJKvdSz+7Y<Rw}s^?qrfXBB}oB)eF(F9QiF4Q zTYVB5*s}^YZ;;j-6SPqziukB1rB&r?QF~JdV{>`if>uA|vXhrJSz&kA>hb9^_RqWx zQmW}_Zf^B02(`9WHw1jXcKou6bX4UJN+g&d+so?-?F89=Z7hk&-?XL9-`?1<2~iAh z2dj09Ia9zhud%h29Zz*{srKCy^0hbkJk|bteQYyYme#jG*Pg}RR{AOALn&}EZJiwf z$)jW-9%}Wm7n8>V^&-jFM!)-YZ-MwdOB)(Ofq)Ml{9|g_=xy~>dpG)O#DLG+$ZiGB zip>q4<)L=T-{w>G^(<PeI@+5(3j!T&RA8@+b8qq75%RY-)_Pk*KK5#w2MtR)+I`hh zAVl^!2M{%(&Q_miiEk789%z;O!8=(B_yLq3Xz;5~g<f1!D#h1TZUL@>E>FzA4D(+Q zYH#3nnxk^e`A|oHiZ(?UWYI*IF;8Or0w|3w00r1y5E3IGcZVO}`-W})lQ!4+K|a%a z663gieUJK~X+AA>Awj7O0+f7q#tLcXTRMH7<&Y@$LVp4S2+>Tn+3!<lS=Q?F2G~Dn zn6ZL=?Tzd!aS3t*V2hGCCYgQ*buLq?uxCLfZZTz|uVDjYH3`Zjv&BA1>}X_f5zoFh zC=+5}24I;VX!f|hfuN5oY<_zqmfxn10DitZ7qDaxG#^E{OOm*tR;;5qpKdQv{Z|#g zYNl*2`d7638?ZFE0co?pY7Aw@{sV2?CYSqyQb#~DOV+ssthWn!d~vXErLAZez3q*y zzD6+T;|^<qzm@B6bsB8uirrIFp@K460PT`H(9z&S0J9~n#usSww?lhc6Z`78MM1UF z5m*4lh63pH1u={j>z0Llfh}%dps6F!=EVvv>%ek>@mw<&`=UlREvZ#mW@u#ZQET;< zAQnRnR@(d^Cg7tIyFR7dAN1Cv#@A$(zdqm%z*bvZgKXtEGD5$%6)vHg%&?MHtpsk% zef6Q{W?w+#@~(>IODd`mi;z2EGnmH{lo~w}*`*)u&jUXt1v<8PT7iVIO4jCU3;IyX zVICissYj7;z~O1=XlsLWuPs}?VoA-S#T7P(Rlz!0!Rqf&K|C9SomkgW6U$^x+`6t~ zZHlwP&I7uBIP5?hD@c?*J~p3uf<DpH#1-fvcCTYV*xuxChSWXnUThkhJl;U_M$R2! zQ3RlM`Pw)710C&cq#Ty3;8r2vkTxR-lSrI63o=i@*Nh4K0v@%eN%JEXnzye3Ta4DF z44MvJ;9+4LK*Xk@#tY2b>7Uycq<C*G`sYHp{*Jk=wz;;sif~5ti#~5>a`))*_zw!? za7Tb#E=>E<Z9lp0rE>ap7{Xm1S8MTX=ayy!5*{qe_IdRP4V3!4&JE4V8A7f5+q}(? z9AnKs32U+=6u^Go+Tm^V)O&;e2F4m%JAwp22Z449P4FPhWFmahChR-)t&l$|YVIj3 zi??~`FvQz~YJYH3q95gWKWqa=%r;UK<bkEqIKLF6eX)Lv<l_ajwRwXZh>vVPo>|~Y z^fyuDqSe7_5ZiOS&UeCgu!k{P8Emu04qwnr|Jnko4odW&EkK!84f=|BL_nK$wz$dc zGS6t7W8T!J6yp5x>Lj!FsB>4L6OtI!Fkh*U8W+^4sFH$≦yl#*9;BW7gnQ5se1p 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 Ue-|3iIZTdB2mUw1|0mD?0|l5;9smFU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/docs/__init__.py b/venv/Lib/site-packages/pygame/docs/__init__.py new file mode 100644 index 0000000..0d02f17 --- /dev/null +++ b/venv/Lib/site-packages/pygame/docs/__init__.py @@ -0,0 +1,12 @@ +# Make docs a package that brings up the main page in a web brower when +# executed. +# +# python -m pygame.docs + +if __name__ == '__main__': + import os + pkg_dir = os.path.dirname(os.path.abspath(__file__)) + main = os.path.join(pkg_dir, '__main__.py') + exec(open(main).read()) + + diff --git a/venv/Lib/site-packages/pygame/docs/__main__.py b/venv/Lib/site-packages/pygame/docs/__main__.py new file mode 100644 index 0000000..5fa3d2d --- /dev/null +++ b/venv/Lib/site-packages/pygame/docs/__main__.py @@ -0,0 +1,28 @@ +# python -m pygame.docs + +import os +import webbrowser +try: + from urllib.parse import urlunparse, quote +except ImportError: + from urlparse import urlunparse + from urllib import quote + +def iterpath(path): + path, last = os.path.split(path) + if last: + for p in iterpath(path): + yield p + yield last + +pkg_dir = os.path.dirname(os.path.abspath(__file__)) +main_page = os.path.join(pkg_dir, 'index.html') +if os.path.exists(main_page): + url_path = quote('/'.join(iterpath(main_page))) + drive, rest = os.path.splitdrive(__file__) + if drive: + url_path = "%s/%s" % (drive, url_path) + url = urlunparse(('file', '', url_path, '', '', '')) +else: + url = "https://www.pygame.org/docs/" +webbrowser.open(url) diff --git a/venv/Lib/site-packages/pygame/docs/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/docs/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3450bf28f40fe7f912aac5838b2ae5428951d464 GIT binary patch literal 356 zcmXv|Jx{|h5VcdcF)d|cXYK$qLI^=YOo*i*q{yme;v;qQVJi+2W$hnnMt%Z+#VZqk zfr(3`o^<c-y?461`E)ua80X9H<q0L^rz86qVsnk@?-77#l1KGiQympFp+MKsZqOrx zVM|+@jCvNsNDta5;cx(B;9I(zv}8*u(b0m;Sm08Y%2ZPR;#TtbIob0wx0xMwcBM*? zGDOw~=2Wu^u{L!lhFHD&Ucsq1Q{Yq*yF8QV2e!7R3ar~57<@n)n00`C4N8BJ`UtP} z@VB_V5YHZJFJA1rfn3};cc&U99&D-#@dTw4Zj-K5U7k9X<|;E)hDwGn?2ERk7gCza aG*aT{fnSzZzZY;d!aJTLaLVa1J)-|0ENVCa literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-37.pyc b/venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27ce653ab6d73127ffb901c03c4968d673a3e1c7 GIT binary patch literal 885 zcmYjP%We}f6!o2%B-2UKcf$s;K<XkABoYgRDuj5H1rn-|3KXoNqe<*0lgz`lC#0>? zRr!!)$tS>9u=WyGZ1{k#xOS+7E#H@q@4Y_u^JX(3I368;JO1Mk^2<0k!$;#OF7*=y zBMeePml`OXZ)3zsoy?_f=1~vG5y|g)gjdFad;`QxM7U|yAgt}BwI%W+$(;{`Rao^4 zp*|<0m3d%goi`S+0NS+PDsQsd!l7%{Tjy&FkUzM`{P`;P`PvmCuYhjY-A!{cbm$h{ z=3DYRTj5)L<HTtZ+;>^P>U@LM%{-~%nVsBY4Z6c&-r_q8!0zCXw41;2p5&nI=wKq# zNiJfkxUQT|ijucMB0U6^i>eO>iNiQHfLc97QIZkNof$FBT#`$efqZb*D%}~mf_?HS zxO8UDd!**{&Jme`u^7S9aM1R&Qz-3;xE$(=5@}LuKPkC1fwn6vm|S~ltV#{yE0N~e zt`A@Ah3^!XDm*GiB_D^+gxHVEIDB37<1~EBGZBjO{xFu=eG&J^@gT_u7#YMFzfr8{ zt1ybPILV`^BhF<FGuLq``!ir2JXnPQZ2Tffa>ma(!!k>+p?gu;Roz|e`XouYCKtDd zWhvBNw>zCqF_kIPDdeDQYINJTq=#u~Fy+0TET-7EZXnTV((72NEyI>yU4NB{LY6P3 zETr}kw0w)|5^h^rGE!rS%(0BF#XV)Y^P|Xg6GgNp#)Am=wKpn~oUYg_ig>_vm7gW5 zRMcdS?5V&q&Sdf#Uwo-N$&qXqA=)bh&n@Nu3B!^0A7=%dr2L8b1?nyeAAE3N8#!yh QrsLQCS(e8Jv>Xrq0@xVmjsO4v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/docs/logos.html b/venv/Lib/site-packages/pygame/docs/logos.html new file mode 100644 index 0000000..0c08249 --- /dev/null +++ b/venv/Lib/site-packages/pygame/docs/logos.html @@ -0,0 +1,44 @@ +<html> <title>Pygame Logos + + + + + +

pygame logos
+ +These logos are available for use in your own game projects. +Please put them up wherever you see fit. The logo was created +by TheCorruptor on July 29, 2001. + + +
+ +

+There is a higher resolution layered photoshop image +available here. +(1.3 MB)

+ +
+
+ pygame_logo.gif - 676 x 200
+

+
+ pygame_small.gif - 338 x 100
+

+
+ pygame_tiny.gif - 200 x 60
+
+ +

+
+pygame_powered.gif - 250 x 100
+


 
+ + + + + + + diff --git a/venv/Lib/site-packages/pygame/docs/pygame_logo.gif b/venv/Lib/site-packages/pygame/docs/pygame_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..63d2e77273839ba1a50bb5d146a1323c4dce1b28 GIT binary patch literal 25116 zcmWh!cRbYpAOGAo?%dgDpS{aoMQ6*Xv$xKkafl?}I(vtV6mrO3M-f72WmbepsuRj+ z97#y}^?U#O{^$LAKAx}F`|*B0pKsIiCR*B_55QxJgrXIzmZAI^ z{WGURxwMUpH7?le+B)hvczOU3BOQo=E*D-;Gl+!)e-3}%72TOXsm5vBW^{|CYZ}wha&x*!G5lsfj&$DzMS5%D9`^mq5~k& zL7dkk5Z5C)Ow5cgTp(E3SQdg< zBAV#o>g(qke8ts2(BD5aJUAjGFzQNpXmCW-<>;8`p#R9RH_5PDobXm&!N-c)8CcCc zF^xJQoknrQGC%8z0BQrLwk)EzC?T~jtoB*d>^84qk*GzpkX481<=dERbzHFtu{R2? zIt>Xsy_B%tmJFW~_Ie{3_)R7>De+oL%FVpYbSdV$%2Mq}SdS>SMOi-41Bed=(xSns zv0V9aK<-WU#`BuFE|wW#my+Y6nr$pvLY-xSpJUwK?J1 zoiS|ThEVRFSoLeZ{v*NO-?-T_y@f8&c#qh}e$a55+u{h<;x1DcIT(J7Zq3Dr&Lyzb=MWv*4NcFQ=8hF8y~h)TbkP1n)~|tntN&e{j}bJzTT1H zCzI2C)1yzOXUFf~8*VBYY^WRfx7Saj(fa@F=lnTr8yFZEeK9>TGc_?gKQs4YcJcM% zyN~bbOG_&sS3a!%KAisZ=a1+i6a)Z!fWrSf;r~4WFr5IK%z|cA%0MC$r<~guwPGk0 zBW_-5)>b)^iB%0+9&4)_&A}OF2%c|$FrF`C+u%0dUOjn7$$O&o{KJ~(C0dbN%i|Ag zUzXz&S%l0V)y-6y<;%HGJgT3qB~+Q0nRhhIH#$8GdN#d~$7=N6=!YqWf0#Ig))>PL!TIe(E!0+)Kd+?X z24NR4W(-7@tjZN2nfsE{fB}ofqroLo4T%9uWwnZgBe)L;Eb{gCJeEp*k9LjFyo7kT zrl`i|TE2DOj$!V*fe1sU07Cx7bAR^|Uuya)kdoquI@zZvXG9Je0$9j7EcN z7mLX$U+sjySAMCJX{l@$fQOZ|_%(j* zBOfj+mpF5(IFUgJvt00G*7OTivJbn)_8^fy!*2a=b(JEWPVmK z0C7C6Orza~BIM%Y)6}MXl);FLdj^6kyJLx2vO;GcGM;ONO`Z}S{^Yl&XB4&_xeQ{|+ch0g+Uw-gVm4p;o`|@+)=8ZhVu5)v^j_Jos;sdhN6RIzt zwJ1J!AGj0}x!-(P5Dz+e{bB-{i9{qS9?35=O0VP3rJ zdIf>8^+~B-=CIE-JlJ^f!7l}!FR*Ha+E=)7ieDv{?{aX2tHWVs%Uez(4j^%X6){n8 z>X?y{Ee@7%fN>_O6hApZYYR3RY$+dGa|~*}P~FOgV_6+7(f*jzCkLTr;X`4~0pyGO zUHhtusM*K`R@emfgCxK1-V(p8XYTjEf1N-EO$w1&Qg#*B-aG_@fM;zV)&Q2@)DJ)Q z9puD9AY|+m(YBxs|_PljcYXl%wCq?u+2<^y8U&13b7Z}Yl`E!zb>F<)bwu-bj3HkG8;1} zO5)RGP|9w3X2`B3-ulawDkKnaS86WfmTNB8ldKAe6yI(>WjRetiNG>{Af{D7P0+(> z-{J_ej?k?W5t=8GMS4CVUNKdlx~k2tv`37nx}78^+KmD>E_xKLzz|X;Sz6S_e9Zt7+17gIJPapU76YK>! z`Dik$K36UD*p^9|$9X}>X(gL*GOiIs0O|GafLxzh-N52Z&)H#I(2J4bA2xs>*IB4+ z+O5ZQNq03Lj0Dl6$a&d*;DYRHw3;9hfE?hbhpC{sN~LT3#c(|x%o2n=6g5GlopU#2 zfyzktGQmr@Zje0ap>67Y(`4S{*Es={74+(csg@DldgW|m^e{zEPk8#$8x}SS*8yvU1R%9^ha)Kz4DoMY@{ zou&d1?U+Fcr*rPcK;~N1s_f zPtaPvBh>pv+=$LZ1yYu=#oun0Gr0A%0K|z;p0}y;5cmO&vpzu?LOOfAE}Rilefr%! zC!+xFy)CvL-4{P{&gsMT)8L;vXX2&y+!_purKaw92t`0W$*M(Mg@0Oqk!8sqFU>#@{iW?kb@lF}7m+A= z@saoEeh?>AVA?UYVpK3pg>bri-rGg#cF~TICb2!1?J^+6-J;(2B z1~7+<%qz#z?Y@PS?Y4e6{H%*aN+8LO4^zFl%wArfhI)dYs#iC7vxCgL^nOvLU(nyE zH%kxGxF#2R9(l08dG9Ksyvn2x6*~ca@?I3!DjffB@7jIjO^HMsDtaX<#$hKHew6E5k)HGP3xykrYb`e}Id0G*XK&DxJa zj^u`((b5&H^%^1EP|1htt%vUtZ#0t=Qii20&Cq9S5}H*|01;3ofV^$_@+lCHn%Mq9 z)?PZxC8iW26H;LD=5RRj2l2)L33P!GHbO?8(9xp|D1ni5VHo8=fT${g;}%oZiLmd8 zd{$p2_QZt=0-Zil_|aTs_AXB^!@6q17toLCDD`@ z$(I{ZbTvr@g2dwC3VFhF09=#|zzBd-b=Jv2P6amrBLPeR*qVZTixH9pvCYuHJS3on z8-U{STIWH2RI)gT&4CO6n>mnN8@;^D_jJ@t3NnDq96-7qK!MMYGlzem#OqIxFEzkI zL{RHksuva2WtMeDH2Xb{?LCmMuYLOij%}tQQ*sB}LTAar0~$1_HjU-S#~A4=1{Q|5 z#AW=r>U_*iF2l5RRp?qV;M7kDQ=Vxr3H{qX1VHFbQRthZsXF9Kii03Kil_vHU95C|{dF5sa$pU|wU}r&W?Rc+H?L6&t&VDTFC8IcJvpDwrL#_hbmTaq1}cHO05b((bi;#j!xO4AIFk!+_P_ZK#+B-6S>$E2Cg^UUm|I zpaMetr*wavx^$RGTsIlgj#*uClU8G4WdNm1ccv)S6+iDw;>uHFn-?>hBXgVm@6}0? z$}it_`^d+>N`|-Hv-dEs@#|@hpu$;bwZJqeGL}6EsMo9pf@#f*6L6MX$D~b40IpeM z>n;ocJK*lTC0F_>HG8m>2lv!`SZck-4ZLvTsFsBbky_ey+8l_DM(n8B&HL_0)n0Nn zAxkxXV}R;=9IKQQr0{gnLVfM!hT5>DA_xxllHSIbSI>b1J1DV|m00bGzJUm$hd6ViPAd~_n z>)@#4+dW5)NcP7X%~Fhxg^7P8a;zG|yi^Jh*v^wnsG1?)(JTaZ0&9|cT3nwrhgk&t zIAWi{!6oorq1|O*dX4+N?uEk~^t7}|JiMU9@jG962p-{f{U2&w=^5n{THpb14nIu0 zlSTVhY+ayECqt((fbx)g03}2R1(4W2zDDoSkg^1jYjK?KMxtfVgE&W!jhx>DDo7Lu zmpTcD^RoghgvSxNUD3b$K3E`cpCr}DuqXH!P`q5-)7S27X9!qIXGe;Uj@=87smGteYOcb zg@HTa0PX2Cx75q+h$MR2)mPGjtu#=(xczMs1k3=v++u$Z!1#loO7@PpDU|b{Z4?Z_ zIFMSvv_8oYa9oh~B0H=y_?f#x8>Vg$Aqua!-t8Im`0?AC*M~(cQG7G;fvxYmx!=x{M=mAo!DVR(<%-lGconK?XlC|BJny{&-uU z-1YZ(s!P9bFnqTJ;{d>5qv*o|^sij>3IXn!3x?pBBYaaVdV6(wk>|+J;T;xpyf8q3 z*vjan#D+gUd}5F=yIXxH%k`K^04ROtd=I9b~S{v)R(- zVB&MA5?rJWwjbMicyEF|yH1MuTvHveCRd{M*{pG}>D&`^N66$MaZ)D%#)bj4Qc8@! zB;v=S`lz59oUk!DO&bG&QC^C%qiW)8C8uZ1-gR72nyy%Hg6Ok3V_ZzLN0)UFq_e>D zCd_*V*|`t^^^F|F+5UCG+{Czqo_${LS{KwXdd+??g!1&d1$z)r&$erGMDD~5!I^+k z$Gt`NWgPrX$sGb=WEJ1N{-y8y<(l`$&js0=C!CtEy_>0D?&6%hfM#d2Rsye5Un#zO zbwr$8Co#Fx8nt-+{Ofu(nrHER4K81v?<>l3Eq z`OnDF_lG?bq?S*;tsj2BcJ_UP0=c+bJ?}jEJvuh;HAAUhFI}vA+Z-gfyxdTyX%A@) z!MrEHnWl51zP?NEgU7`Jo^k9e7-~vZt$WYtL>jOqi@B8RINtm&g1X?G{G6w)sA9e| zqv<^d>J^9qJIuzc0&qp@o6fk&$03vD&FJl1Cj2w75kV$jddl?4(no8MCJq9ng7Rpr z4H$?hVI=Cj`&!)76W!HC7W#W;6dl*>-#kHT0<$Tz`C%G8$`+^ovlX6hh`wikMsKyg zq{qF~9!h57SV3Ky9(1+`|FK$Kn0Viu-p^Zs)L6d{E*Qn!9VXd}uLNJmFJlNe(DB!|<$|vPiqsnZ zvk7XO(!U(HwT{wfOZt+N;@Z>wqPhJB5OJ0rBvrSQzD0Dc%M=21EYZ&i5aw*U&~rGW z=QA4g33lqs5L@To`DH)}pf_RG$bdiPRaxIR&Kv&_Wb>tfh4JX$IFt&GnV+}GH|=s? zE)-4&IVeHepR-zGK$WH(HuS;QH$HduFE{iyX9~SLpZ!9!+7ubSd~M{@Qu9+0y0@w+( zhCG=`Xl)&K-(??o(feoo{aN76-@$UwkIL$=do)zstGz=q`hbM~ zNmx0aMz80>kW`sN97vo7uunr&BGLt7hFjWL_;DZ`2I^=U{R;<&55@|OVgljE3DNA66_Tf$uO+qd-A)+38Hjtb-k3gEvq z&n#G+a1jwH@|aC@kLBf;&C`fs6b3?@7I&I{e~16~uA)yG`h)KEU*Fa(7La+o81%*; zfmGV0h&%!*5g+vhtKuzXe@~&)#&@z%$^8W~S|TBp=k%ioqP4Bd1z=z}OWtX2!}`Jb zdVSFJqk3lT$TiDs9s35m2Ir2@^`-f3N2&|A77S4T;@l8vsa2L&;Grr59n_PqgZUMK}q@~nU8rtBFdP5n!>JkVc7H|<7`S|*yTUPev0E$GCrkE8QR z)bo`-fa{>ctqb~wzm)aDHog-Y+<4nH=Y@IfmP;+DDOY~$@~}wqAw%&>K&yvt+|O?n zJAfCN%>MJJOmrq0S!rm)X0$jXw`jSyIp2zW4K-szpKh7Dxg$1Xq%N#ung32C@DbZu zggMa6B!Fyv8u!p*02~Fe(AOY9C@pZ;67QxOidjbI+&!1XTd%szl^#<$%r1ApWgE9> zttL&m0}nsNG|Q?ibBL3>Er~<4ar4M4LqSa#~&GM~h9shZa^ZM5T546y#?>w+#XgmubK@>?2N_bi`JJyFdO&pz9jR_N>$l6A*C!1LYMyT2 zU$ulO8Qa+_;l|frzpc99S)jJ7HV-n9RdAbE=HL7u508PcQfm z3KJgLX)fpaKt%;>h_sQ@ua*NOI13=jc#B zzE`yPo(qlxLbEDOGNPaED{f1bCqKCiR}MCZy_q8|z4L?l6{^RAx(dUat8ekHd>Ff( zQ1_sTsmp-+^S;X%#$ED>EVvWXFjcyz*TF%dPVG5@u68SrSO z3Y8e2j9{bEQp6>c*SU>(bua!VCTv#UakM;NnaYABWn^SCc8DyLRz~IBiqD2dBLBhv z`UQ>@Fl)RWTDkG+TY~$yo4p|V{Da+lHq|Z8C()7id2lLURh|B2${U_7yAe&1`f7J# zK5wtfV_I`ZGtoVHf+YjG zAR^1}Gy|SpW%e|hvY^x%D2^>2#)`uM5E(qQ&cDwd+Roj~^g!a?bRxDm>=bl*`rO70 zNFDhV=7ArcUUIw@$4G=u(k|KD+X2ZMTLtSXc*%mCsuQ}$oSI)*z-;TakY34b__5p=X zUhQ5Xw<{&yGN_56LpbJ=c17O%yUFF5UM_+NKqjq9W(|{wxG!bSX1-JSyJ=a;-`5z3 z1E4z_UV3t$1h11JPy_=23s1+hrBP&^X$Yo%0_uuc(glv0RGn#Sl!QNs zbN{{8ne-7D5*aLr&l%*Wf#3vK?B1#XD5gAaOI+lLBr5n<%SiD|AQzk|_}-?3w6g2` z3-DG$v0Xt>sD|nDdNEZwhrL4UAf*9N1!oD>($BUwf&U?PI?-3xUU`!Hl+8!0A~heZ z{xrF&=B!kZGS|sMS8W{r+A zgWfu<8#S#JMFkQJ`JWS?iLiyID2Ir$I#LH&b&|;ZmJ1Mxv3eC8KG8p>;=kg17g=A? zt>tka>x>5+Qd`XDFS``AXTrV&RLKn0k0@_XCtd4K;gE?Y z`~Al_$(ai@t}tz6#H8oZxdXmNi z_H(;l69PwgBc9j6jvWlC;hu~ln+aPL~A8)zbY5>#J2^Ng!@3vA}&lG-ARpkLH~L3XUAetqq{@~Ae|a;g8t zQG^&5Cklkm^`{*4{fJU_E<2+8wz{wxbAYr9O3%b87<$VA159>G;Ok%<>#45*S*&LW6F`l(99DQS>iqD+}F#Xe&*%@zyJ}|(9 zR!XwvwF;5-I(?2E(_0T%$-?eFd7f<>)9O$V}1#P&gr|m6Z^KUdI>EaFp@l~{QC|)DSUyG*qpgOXlW*0;;2>B9;@34-i@cuv(Kj( z=i_v1+b1<9s@F&(V4>x!H4BMtLJqK5RF4FbT-N*7aQ0l34R6kHwjA9%OR>vd$9f%y zGjpF_u-7`wsUKX{e__>J`Vo{+9C})kCcQk;vK5u`XU4{~S}70<5LK1S=Oy$YPm}-f zUApXx1XAC9|0X#6FqMQ)QlS>GnZF;lvI)yl=XldI|gO}l0%An<+bYNixZ9*;8Udd2r5FB zrgOZR_L{TfMfjurs;2>MecpzJ(AmxfTcz4u@CS$TX?4E9Q^u%146bQPl`;tBHYAoCrlUsYOr`EtgA#1SpiMn(a_4T#dzG>=kxS{VW z>CWpqKg9(Cx}Go(pNXnVjijUo8~||KV>Gsqy%@|*1o<)H0V70Eal(c^8H7)Y{Ws1VsJ)5?5FM1NIp<=Fw2@Nx9-VC03k8*;G9$@Q!E~Fg_3%X3a|q4TmT3jL-y55eXlQbo!A~Zov_hHW}7Y!i@9}$ z0+)}e-w1@SG-w?Lz+H$?*EOgKEy>6Xl#K^uuzkw(lu#zvMFy1r7^28Xm~l;s!z8L` zH9WE|*_GD|KBJ-IWQw%~x@C1Z4=~{@0$+X@klOk#8K55OvxHF%<`)~E_H-&g5C|4S zS#wA>kuo&B)Y9?ykXmEoy@umQ=K>XyaJv9H!Ciq3+Xyth#YaAMZ)S zFGKOmy470~2bE91mGqr|t9@c%sSTpZ>fEJ$Y)3>DTPd+XHf0}YUDLdoXr)tuh@+%{ zHUPBNKgl>gzzmUNo|qC#wumDq{#K;q<@g?qQ|zFYT9B$FMV=VYg&+ih$^0S-eo984 z*DNVcCQ+Pkux2|~J*&E&YFb|c(a=IABZo(eD?J*Xb@b>3>D)PuyH%BT4y+2Y&KHyB z=U5mr_476b&no>aIoGIUc{AyyzC`7##i{E?N-_nB%=a|LAM`~TNWKtM4~aYD>!J>K z7dRFyPW8dHjAw>RoH>h};bZ^-jHf!(x%jw?4Md2&Z)cbHJgap{UjED}%WmBV zovDI`fpI*lS6G~b4eNsKAIG;rF#yPn%t1I~JEGea41wbziCb20maVVTpzP%Hh&Xb< z#@Lm`vG;p*u^0%?G&lf{cvh7fOGrV)kniw=e(LmoUIg#%fk|~x%G$q*lEaIKAlP`B zlZ|t6lvHz~?S<(i;nD;ir<7Qk#1)!|D%S2|b=J9&>G}#wt6BNeA%kC3v7-fY(Sjf~ zCc%UQ2>mVl;96ezvfiaW`{uinJzVypuU;N;p}bYC95yF=7Y(|ZQ3YjvL0neVAC=gj zSj-R41;{ow*b;cIH}%D|f^4i{@fR`5@kdCFt4U^3bJ;G3iz&W!bSx=SqmpXd$O zw&RUje7&H?l+yrz_V#s*JVFLbW;aXxE$SGXo2Iy!zGIYhc@b(sg+?>rszAJA1za1n zsE#tfER)DXp7o=oDl8^kSTgq%J!hY(H!_#8TLsA|)7IbXdF0bprE7QNP38$C7vRP~ zR58^wPn@u zU)L4<+lSSurpI+r8)ix>3$bIV4VH~k6XqCNXZ%|csV*NF0?4I}g+SrxH z@l8NXq9Ao~mnsU9ja{Fz<9i00v=|27nHd+)0Qh0;v{+BrZ2-Z~%NZGMEoC23l!(|{iU}Bwp;=Q;n!TxIDFJoFj7_VHNvoQj zh%hD}q5_eZ6fYZ)5;~o9p%~z*8@Y7g7z-f$Xi#TLiXT28xf2nHjW6CtlPHFH+Y?uA zSB&^nFS##qOB(*3csco~rmb|TdrW(Vr0i?rr538>%a*qfohytc#Lp3;YPcsPFnp)( zyxiJ!^h&hl@pg`Ego;)R_$~4AVCS8EACLQWF8Ow5yk{1#y(&g1_}2O-PWc|&l!fHH z%d>mxOn?G5wblL7hX>oO*(nN4VCbU+-#U8y4R0lbv$W`25i$_oF@2(hPjV>SdINfa zkYrkCY}Ms|Mh_8)PfF@vJ6D&gs-$*&*ynaH=)`H<&1=;itw$+*pQ(XOIy1c~o$|RX zx*=cavdxW)80&d;hBigMheON4-o5`!SK=kfuLr#rql1CJtFrv|mo+w8zkJ=Se{a{$ z89_R)GiJ6a5_x`xVohB=tn5EVBq=$!bT+N83 zr0{5k2yyu&Uq~X5zFZ)MT&PPT<#L8Hz*<%TmhZtqGO3~j-D7D5L)*QNJrZVt4CTZ=wKi(>SS++8Z&=?(Z0QdA3Di zMyfV{-5ui|YQ+iYVZQwdwI7uE{3!BkFq?Y^X7{Y*8}FXw@K8TZnO*(qmEe*@`hB}P zG0*Z(L%P`TiB--};IRKWo-73_E5|0~KnK{!EV19k}q zw?V*d(~?T^0QOw4G68<=W7cJ3#E{+>aQ~VS1!hW|wd|s*C^_*+-;*_iM&T3LwHo&C zQO=4a9ZG#y98J_$O44=ollnEQnR}&uEYffze0D$bY;HtA>b`L6NB`95QwYU#QPH|D z1C2#Eg;PVL`dOqF_N7C)@h2BUJuupjvR;(+>!NblaV{%eln+K4u~ z`RnqQoBS7L$CaJfzgyRD?sG3@;t%#i9IyJm57*7vZ#CJJKz|FB4jZ-E-*^Twtb-uC z8&0SCsf18!wfw|vEoEyDAMfe~BeGdp4&z!`+WE)`e4@wibJP(;SZ;#&2FynKr?oWv z5(DNTlPppPpr~XSp?EnAL=B&K?jY8ekaA9I{7N1C6oX;#Izd(j5=u=msdKzYO$l2B zkGu#;zBNn2BQOVvRYwW@snN=*@>dpqq?bbqO%L^PKbA(K3sSiYPe+WU#+?Ojho>G( znf?f`NE|yIaqa5W6H@qoIB#fp-Y&c6ZZ6#QrMYQsRx@$9*Cg;#;vI%3}ZBUsG- zIJ&8c7%_7xPk;yb2li`^s}T|VoQsECPcjC=cE7+r4`?Q7k+LQhB4A@- z7|Im4|7E4hG1r5Sxiw9BZzQ*PD0RTgx?LXt05CrYN>9tHYKqwFx4ITSVtmgp%}tH9 zHqg3?uvcjnZaoXTP@>o~T~+I6^pawb%2Ca`F8=BPu#8nnGJPSaO{g*un%k4RukBLt zzAbh>=mcEtHJULW`IF7A-uiQl`rK>z`)96vqX#bWY%e`>+4dMQH$6>kxc+@p>ZWeoLSCuP|Q?@Nj?I zb^l;uU+JcXvGvj8MQDha#fu}SuuuAsT%FwID?e7}BCwn_A=+}`gQ4Ym(YgV@+^5an zka*7WUW`~>_)KJzzyl%w+@2n(xHAmF9ojE%g`LN8F57Ka5$=h|2!UwnxVd;1AthY0 z$}&^bElu&WAodirkhi7s2-a{)d6bLO@^ssy-HG((rd=b>#@<&+OgAZs7gSGM&KQ`d zKTG54C=y^U+>_~EV^o_9fSdbEqeE0KRX~2GRweOpBYsh@u64>a z$6Oe>6F>eu#g5tToy({DrO*8fam)pn&64Jh!@{V*cb=wB?bnc3V z#i;@Ob9SD|OhN^32M{7xlxPNMSU)H0AGHAD;L` zruIggbT8xepm530CF3+c`m$qJ_@{rq4>`TlHtgALzCUhhweRql9wrsXo%EUCd7kU)S&FW zKVJXV`7$llxNe*S8}9RX0sC*}-0C z0YO10$+|xGX3TGk450rpzv4AxOkJfQ>5+fUF!tF+kDb@!k2JM1m4p0zU-84vnBm7s z7OuBN3vB2Z%9zqio4W#*whj!9UZFmFpY%;r0|?_@!~04nrSJhEAv8waC2u;VVT?@FwPLHx5)*hA)?b@F-rc=%WUG%tO^HOG8&7h+UlKL`)p9(Ju+!%uKZ zkkLh@EM6%Gs+X^g6kwg>_w@Xs|_APaA>hlhZ~=q&a|;gH-IGovqs##+1 zs}D-QG#(qiXZW8PGOvODGJ8uM&BLzcKn}3HzBNDO(Sj$L5F6*l#;%IOV|{&A#ExEl zmWm6C;ctCZ(GQ+-^=ZT`rqE3{wjemqfml^-D@`?!VfqgTzw*@2JE zGOS~>RsnV*j986LpI4U1{Igtp_Edw3AR-bI7-5_|LP68Y0{5T0HF{JB&D-#j5z z_ns(BB}Tkz^tT9!5%aisX)YD3ZJ0l1twLwoX~`BJ0;*cQOq=r|GD<( zT4qdA)Qu;zoyTgjj$ajLgl7%>d@XN_j+{Or>t=L5ndShlkC-Bm1QuHRAd}q{-ZbRo z#l`2DnPVF;4l#NnRsjbk7C-YzjbN)ts(>hvY6Hbh*q~kQU1z>dT8q#hC;+w4$0(}1 zppu86Ykr4T(f4^V=jT^qt1;mu+V$LzR-66U);PD%j|53z&Ebj(c`bcNZ+e0jQ)Oq8 zY!dDx8N7BQXjEVCv%PTF@*Uy2r%Uk>kuvG_pr_XqSPAQsH4V1HBD;?t*j2~fd}e-2 zrb?PgiY9@bN@AfUP=Cj%^{t7beTKylaJ+#;F%^VzBEka*CSsIOwZ!#T6;f<8kZ9Tqbr zT(IOOod4A}|7}DVtLM9R82g(P{0j2s@*NJhHSx`k#xMcmXV2>|pZE7E=caFaiTzqq zL>`z`oZ|(9@d*PB)Ob!6qpYC|#e=Pe&y-!-fNMvCyuEaod~t4~;35tT#p?4^;$X6t zE9j;dGTN2!Qm2;%@0wy;KBuT;zbWE=b9HC6JATT|x2j}8e|O0QubuMyW{N9i;=5$^yNpUVt9IP?#M@$eu#NtYM)r~D;o-b2<8wV zls&;^8z+<-0DJ)lL)T7L7+s?Pu%b0KYWro2=c?}K|K2Q_f^o1)qbk71IrhWM*+>0- zzqTSj9X%2fiHg1c_T_(?q6O!eqx61wPW|oa+gZ-3YR-%tV*oTI;T@0X$~AqxN`h{my^Do!(}dz1xuJKi~G7X`A~$caND39SU}| zRFiS4KIM)$XMv(=JJ02d#hy ziD19?kFL17j+Y9@+z0LBa^C0z62OUMMIE8+wzlZ44lA1tp68$n-W#Hz8^cH}S}zL# zhRNTRog@~?s5-FHS!nM@{*LF2TnHK6l`xb?AL0Xn7F}3suv%DQ(i)EYQ=W(<42%b5 zro%*I1q#%~unry)Cv=ITm%rEV9UFV$y5cnpX`eQi|2hkmqrj{;hPThZ&sH3D@~Py# zFY;R!NB%R1OdI-~1%Q0;{OyBhtqjJR-TPGHf*2tx_Jb z1aHi%s>grkn6MXhjZpj!M53}j+>QoU(?1Pe_2e#3dt?B|iT@aR$JAp0Bhwm;#f6&b zH}D^iHuYm9d0D2s_eaDd7pu%}tx055+2BOa{|h0KZT8*0Y!m<;9{c!1E6bV(R`6nl zS7N#h?^6zRiDGx?9*uL);PjYKDsD|VcT8@X23G>ft36Pe5K=G#gM0=At$mD(DxK_B zC3wIyq6^?AvT4gDY1w4f_Yy8OzDLCpHq-|$?NzS*#G|PPARRGh1sYfXNwo)${e^v_ zaRTL>15p-lfV3l<1mMwTV98;F)6hh3j_P!38r+V|Zj>NDEM)h|Q}$opWKF<9I7f@= zW7x2y7E6NghQ8q1IxoMdN!GeYzn^*gy7GXOWX1$D(T7~`6*2Ggd+~#*7CGou4M`(e zn2Sa6R^rM!o_Mr+O2-Kw3Iz$`+4g8K3>g-JhYge2C6;WxYJ_(a&{!Ii(zw6yOU(e^ zdDQ2lLn&bIc5J`2?u1m}pucq)El$kUHZNIbzX={!!Phe0w9Z(+!TX>8Gh+40a~|U z8*Kr?;f`Riuye1sLV`%vU=0~eQ#dj*&3cyrm*UzK%WFu;JGJ5Ki>u=cdhKhe`#Naclro zLM9;heSNN!x3JFIka9e*=3QVum9aBg@>-gNBxmz9oJh)@R|&HIx?#F;uafO~AxLy9 z59YYf6YDj6=YpJ;@H}#gol}(meo;`aRG^=V$X*l;0uLJg^6o~A+#c6p`YmtC=(}dG zTxt`%YdQ;s4?a7`ZVAxIyao+UR4>;Vm%y>06Z2;SjUX~N_NDc4VcET)`pO1j9XE-X z4WphQYh+N9$4H?{@Z-5HCn(U_T#oAnF$v;<-t8y%$--T-IWsP;OWvZzfjZpu8yOQ_ z2`f)e8Xre3@U}~vq{-fB`((PY?QvhqjeD@=hWNux5EBx=tt+cb82V;S&vn@@i&h{? zuHM!um0tt^rNqbmTMtidPcwbd>f+v&0 z44YLrKY7~ZqW}@e(U;S_y*3qOI+r3Ic;PacZ~HvhX_t zYWm8hd5*1lH6wUZrL5iNf+-Hq(nRakFrMNc?9ve6DFDC+O-@euVU^HBw@sESNma2W zn-QTmZ_C{J)6l&>GZ)(O$sqLTQOi>>cA)*#H-3Ycvc>=|SokmmfKGp#P-uVCvdd<5 z6Fj;w*tjPQfCb67u90v3M}|DWGe5xZdz^;MHSY~>--scP{v1Z}LdFt?>~BFvlIR`nr-{{ac1JW&>GxwE<3He0*4lhX?V94)Dbm_&VQ2ylYJeM_ z7j7c=?2MxRKFb7)PAUR(y2?3Un-;u=0g2NrzeavHxA2|W+1(mcOd}n|gh^Bey7Lqw zEHe?B-*;>Bh0kz{=8r(;$SQ8WY6X^T3dNX9^5r@omh~lYlFHUh9Hc9D0*<7$!B1jE zCXlAk(XIg#9u@KSwigW~K#MFK^QP-t*vW-20!$$AZ|N^^r!6q;jarKfOVg?2U8QN| z8=H$FtB#^|)Dy;1-Pa2(nOmnZpW0z5}>RHvq$&3iwlW6i0rPLW62=1$s;x4}0&flb|0v+L5%UH(UV-<{}w+bK%zt_ zs!TG8d=6ysbGxIbybWKxgI@tMk{=SXe&BW^!rmDu{Z-lHQZ)U1N_vunGF5xarXnhB zBXs7GAa9iIlqy@!X?xo!dLhd2_qOrBEQt6Q+f~Q&SKGUe_KaC0T?@0IX!Y_ARX_<} zYaX7xd!l9>dBxUN&8_y)nMBUJ=V^b}@EwC{ZzMObPL#Ovof%NQ4^|PEQ-X+ma zn#Mq{s<%b6-z8ZQ00Ggeu*)~*l>Y7(*6IACHo*49^`vT~^Nt=XSaff|#3PBFrZ#r! zbIJ>~d=45HPQzMh=EkzWEw3g^aA#n7G-0;GsXTNvE~5G4x?^yv%^lPr_=lfq^MA8D zQyzgJ767ve5+U=6E+&W^#0z)D-%`he$HcTn(KvIk1<}f=XTmYvCb# zF%Sw_;6QWOpsCJD?bKfB5jffs5xTri1MrZm=n-CkJ2Wy{>3;#~voW2=_R#Qw6r8{Z#H|K>xR$$ko9A}tcEnjSI+mvs zeOok#Pw^XAaThS*Z(Km`YW7cWIV!_*c{lWkYkKgebOX3SKG)Ww)9$0!0@qXkcbe+{ zJhkt2KV(f`Wt5{Ye{}FzTlt6&!-bdih|lb1b2ibsx<%LStJ`>AptvVR!7@Za>#YEB zYkG{6H>_iA**HKTJUWK!E{4N;Uw9JsiFj;tcBBtFf8=1DU$k~$z<8ClefK%FyDT3( zfPbzsmu7i+$F_MpJZHPO?9Qi%|MY#kczFN&wxhI1;5Y!_fVV5}qyKcQ%Pd)!^@LCS zV;jO`<8=TuBEWmOX%E8%e8dJQ`JF~G3Hm}L7yvjgdrw&Nez>>hvV6Ydx8}lo(nmb! zs=J*x^~A@veNVl<6GmCu@CaDJ$}Rvdy!y6#`P3J87bEuy1YM@n`?UMHs9gS!(JwvH z+qtO3x0l>IhHrHVGe9EE`U&TE&71d?vVie^fGhhe(?dMEKl@{Ib{}8_=)JO)C%(8| zbTXX#;=6bu@O#-TL50(}nj?N^Q?R&lHZrJrw;MjkYq|x9wwW@0i-)(XgS}(p0M6@t zkVf*7a;D)5eNX&>mjvC#%l^4LHZo*7qCY*glQ`7Zdgl*q+!KZiB!wA_z=?8xtwa3K zjQYf1#U4OV{K@#=1GCkZ{4XcN%$9mw#(vT_Ka9h<$#}RSP&?xHMIjsjQ;_wcGw$b) zdc@c4-2wz3LjwsKx;5|?vRlJ+F=VK#VZ?(7BR*_6Oh^C#1_~M+_WseKu7U?|C0hs) zCCY~n5AFf*5@t-9Gik=`15($moGCw6yg0Gr$Xm4(UR?Q+q|TiYeKIt}r)E^CFa-$g zs5B+So*;2H9fkvD3|3>wmNk18?O9j8c(HBE>#Z+W7Y>M{cNcG7y?gog^?TRZ)R=@k za%CElrNxyOk!4ls_;E;slW$>lh!ao(nPQ^QG{Ez5PNAVwR(2y;rhpZJ44zz!STw<; z$sC)6SQ()qEHL#DjC|NB(1Lt4qOK`mk8IE(wc;*xfRHX>up8pOs`Ynl5CV(`STR!e z<;6ZB8g$GY!%G9WD;s4h94qAU3@17;e*a}HoL#ePZ7f{2{*r1*0Xycn8m6&}3dAlV zm+%wpJE1J%>9VH0y5J=OY)Fg44%LFotq|ej1qlGQAm^_XRa}vtXb3PakcIXmuP66l zn@~Q;7Ss{6h-wjnJD38HB8uWkk}6Fx(5y4$ zgqH*mWT4Oxv#7G93@T)S2W29_N~O9y>Y-W=s3jL+cC0bY_Og0SB;xS%ZZh8(w2-Mo zAu#W6`l4W!hlT83a2 z00E#tgIkzVVa~Nf4YM^QKTwD&ffe>Bgd$o!z45$xSN%vK3o`U`L3H=)2}4+4Y5*Y_ zsdI9eS_aTBTBG>8x1w88aFft@S#1)~&{7!yrasPtcEXIK#mPR@Y%szA)XeQS)IS>= z#xgvYb{%B%~m$)2JmQ&R`bC{4^ z?zcHHX8EC1UX98CNL*n;W!9N%n8%Nb000HNRn`452zTlet6vM3vhpwonv1RJ0KeKcGa7kr|2RNoF05!&eA}S;e zH+_Al+luo z$G*o1Ato32m<2D0F_ArFT~Z-{55{5y!32PK=u+CBhQTocv<_6ATN>nWkg_)!zy_1Z zo)0#qp3UX(bj1rv3;_^<>}@YxQe2Ji7g7-dak*;{tdKqnWgo|3B z!Vg18!2<$tzLP7j4Ixd{f%*sozIFeU`3Kn!xg zga}LpY?UhHMV6pBGYRsHj;n>h03d`MolS`DjCC&V&FNXyQvK_bK-ol97i|SXh>aMP9jLi{9gfDi$yUZ-fz? zc0`#A~WQe|MQh`V~?~;OnA|V0#7>T}wZV!ZLM5eV-kkq1x#vy>m5N1w-RwRTk zfrK@CMK$lq#R&u;LpZrQ0^?B7l^d0!LOW-RA#h*-_mqi7jAX~C1fT}rpvM`eBDh=q z5p4pE-$?Pw$bq^ruLf0U!ir-6hsqMAj~hnnHgc9_!ejv-JyT2%G>r84Go%GgEGQd- zi{rV8kN=viSN7VFRB$VOqD8Dh|2a_W)%2#$d+bac>Q~kd);)<-q+ekHFUA_C&WZDW_(M$==m6BylsTz$B{4ic%2QCVo_DfyCN?m^2`z2&`N* z-BXJt98*k1s2f9aAs!$5IG{WoMjv95gAzX%Ezzx-TaZA25nwl*R#2)xmCNFPc?Bf9 zA@5Y)h8HvlMzXP#uS^@%^c-KM-HRMu(a1IGZX_R_#gtaML{chO5fi` zL?f%yTYUZ#TWGvSqzEXciDcQ^S}a3^rjb1Cl^gt5yoDsv03ZMo&JqdZr1o+AJ(p-t zE0aa`70YX`FivoR3qSaw4;8eLbQlufN?W>76P+rO(}K+lV9we?YdH z+y1-i#X`F#1K5H+@DdHT0+W#_caOc(Y{(wJ+vK!fcTe&}>xMVFzC|#SVbKQl>72aG z&#nmyn)$$YyU#{L78g#wp7sx-&Cjkz0g7?3L=WPKbv0LY-*V@UFBl7dS&5znK++W$bRk#F6gZ397v7u*Q8opzUPAnkYOA+2jesD zlRk(L8t)K?+|dPw09oke*n%m->)||%b-Ua56$X6or<121v)kR@*2VFQZ)WMhUh)=( zTzb&0AaI-9-Da+O@VBC;TquDi3qXMq@C1=K`~LUc=602}{*u(vI#1jeH_0!U{!m@G zx(Fz^zyb`gfCk_IQkHE-+zv}T0w(hDT z7)vI=s<@B_(Ah$IZ?K;XRc!mB2zZmRCvrcn8=Po-d^_`dDwo-a?5uLZx3 z3ahZ{-mT9*>>@Z200O|Do{kEokP4qK47+goQUM3_4+VU{59|uga)Aw>?hE&j-E2!2 zN(!vtaNWAl(g@JCim)r(NY+4R0q^EAHYO@Oh6U$K+a8XPW>5mvq5@I=Lxp^g4H;0> zE+fNaV)w|5gi@~7rjQGh5BR0S9VbKt)a2AU%r##OFKO_f9&lhY!07d{Dez1JJ zVT`8YhiH)n6)_PnV+VllB?16$_JSOeQ7Xm-_)bs^lW+Sl2p79h4&zS?xA7IH&<(e6 z`x*_Ts4vA1aSB^79hvX}As=D{ z7joo!F66{cCJK%pY0bl2Y1NE^6DP2S?n3}>;tjKp6$uF!q(Tkh&c0l$uR?Mg-O%0o zupYzk_qq@k%MtyaEeB%j2A@mj+~Ru{AONz!7|UlI_$imr56=FigACIqxpZL$$twUx zU>f>@8?Z4df@dbdO$zzZ6}_=5Y4H_rQ7M&=Cd+Xw>2dzd&>uacRrLM|R>7LQ3 znC&t+t`p6|6+RIZmoG8l5Hfw@6lcN%L6EcPrTD&(4P%fp+fWX*kTqfQ5D~E!GG*d= zkuyh6n@T|d7{FMDl6*wqKE~zg__7%dva}i^!l2Rvg0nB8A-zz80JPB-weT#@au3H6 z4rwwm3o|CeF)w8j9ZAl?bfNQ7NZt65`Q*_aTe2VdasDvr^7xR_F+-9)4UzlU66s{q zC6SZ+-s@k=k~SSvFO#!!Oz2a_te{6z1RI1bk_@fNG}F)PcN7*tFKvpczy z87uNVsZ=J7k43{!DcN*B6OuwD4JpfUE6q_)5XLUS@av?sCi}4kLGJ39Lk6I51yj)b z{O-|yYZxSF@R-Lea0frQ4ol;)AFu7~a6)o0{>cRU&OGtTMS-syuP;prb3?O~OaBzV zTF$w2lX*t(7bC#{I^Yjd&queWGmK;RytGm~H1qyN81!x`0^k5VAPbbiR#ikgC(H{4 zl0&O>KKXD(+pqQYtE z3&|Dba3V(8v<>TWOFU`0|F zlHfk7Q|f?kWPt2Mj}spIRA9F>4&m@D!}Htx%V{`Gdn`2OtP0p-z+0N(R=FnkPyJr|RgQgD{0q61jq3zVS=k7Zf@E7m%n6=}7yI}3AL?KMVaas{{WCHZtqp^ny` zawhr!Euoe?^${+i^#FO}R2^;nf@2Fk5SpL)rH1Qtd!~z&QAh zYeSMC56&nu_1#QX(|mxy&H@q!ZYEHGJy-K#^|QyY777hB`#$wCE>#QJvmv8aZZ9_> z7T=qF^Ed1nkIs<#eIz*S2UB4B!L607YUpS(M>Ez=|^C6gC%Tfl!Lw_<@>;_c5yi1jv#>V54j2B5CRAuj|I~7`wMyl4 zZy$7QU-K2!E-H2pO_@<$LpS~|Ta@^oHx|RzQZW}x6GnU0YcS^%PY><<_dbFO5zm$RCYUSlGiu#eD_PQrx6yh} zG!F5$t`rg%MYSeDmlmm)e&6tYWs(bfOd?}K0MwT&t5f12Q=sv)d^Z%_&JB-Ul`ODHx^5H&4&e4cd26gPebvoQ zr`2AGSWEd)q3eRHya5XIczX$%ib2;;_i&j@b)BOWe%VwzKewA7DSvB%yLi`L_3=gH zFhv)+V}*F5{`(mghZ%YZIbO|@KwVmwk9u+K)Fz+yI2BTt4H?H!Lvc6OpTRkcu)sM=<6;evzjw^z#pVj#JivAm@@y{J^lDQrxsP&ls~u255)LQ zi8R8$SSf2wT1A_`P5f=oTehVmdj)0zOwdksySdFcws-uxclZJ}-~zrI+CH+lMf;H5 zGl)&RMf*^(Z~Q%9d{YhJ^Wyte1shn1!3hjN1(Nl?S;P!HQa=P7winy3FFY5h2#?B# z8u+OOUBTkWYpM7f#5;P16`L=EI5eBv%4hp?#rd|$h@XA=a_Ly5gZRAHyU?Y4&!7J8 z(A~Jh&0EUJQov2TQX%|ptM~F0y+teC0s;J)A^m2_TZ@aF)unNk%^1CbJD~A%Mb&&O z-*mKr4;PNwffWqk0G71OkLAnmW5sLPjO9|D1ze@Q5d2;u&bfve9v}jp zOBLo>U<6>67v0Iz^iIXw`xYI&pWPc(`n6v&as);RGP*_K9j52ev&|8--xk-|G>}1& za$NeSZ~QnPeZ4t1wk=%E;cVZH!vNAe%A4ES175a?ywxY3!Bb&M5qaPP{I^4!!pB>H z(|gweQ!ISl*GNy3dBGLt&Xte-Sc33A-u;lj`M<>-xLK~+lZ6?k)5szf=>8(W4`{GOWQ z_54}|d zy!6@r+frQaqrY}z&BtL~_)$ORN#D`=F%>+&0xY=~Z#0vu1_`(${tL)_@l`}_jAP#* z|Mr<5(`WGVSA-k*De%!^5|H0B>TdY4AMyc0SgwHt3mQC_OJKr;xNrb?2r;6>i4qO? zL1<7H#*G|17Q{h-qR5dE7xclU@L)=h0#^=HsL|!dJ|Riklt`ctL74@G$!uAx!p)&X ziyA!|aYL$vJ{RtE>d|1+s6PEfn3$mytF2tSdi@HvE3dJSCNh+fTNaAo_}9f-Y8Is0mmeZT>e~H zSgi}3Z!Rc;613`$Notm!m~&W5(71%YzKt9AhKmYQQntMQdM7R=A|pUjj669jS7@7` zjP34@Cb07jJ4YPDprV1yFFR>2au7oFKZDXu67;#SO!m6lm0 zj-?7|A1ISui!Np-i%|qfh9NS41r}e%1$sL-L5)R7ZN$ z#|BGIgn|+m%J*b0e%Lo*lb4;cz?5PxxWIr}s)S1s8^VSJdLbr9)^jJKcmV+iobh6w zdfGM3Q8qm3LqsEhL*7G1q_^gf1VpezDkxz&pFsYpD3R!dkQsR(Y>U{?I;KzkW3RDXc0t`h!1(3M;=8tib2<%y|*g${*QtXLrvf?0c z6biMZ=3OmPLNq`bEm{FU1e1KF%CxOMBtQi?fGX>exYVM=1^=~5zy(D@`(!Pt*bwHo z6d7=V5{{lp>bhdK8|za9;etyl8&qmB};OiAs|J74Y4{|S(@t(FdlZ^8~}g~A9CeNDO^T002F0(Fy^9Fl3QTQsq|q3 zX$s?%!MKi!+L63U#6a=V5-qSn9|6yYOa7Dy|2woFr1;T?43*d0_OrF@{&wqqD1k!+cgqf2 zzFI#Fu|WhwUPQgbKM%cx5kyb{^}_SGAnB3tik!y3J}2i`tk@v@0aT2Gc>35~j$5(R zUtog`IN;y|{To~mLDdH^^P&_0RNxgzZ0G=1@CIGPAv&}XASAb1VDw(IKmmXZWcf1y z0dDm`2nwKB3%J1jVh}$RYybrp{-}TfFqpv<9wh*5IRFC=aDV`)a7hu!!S=fMJ@EOB zEKH~q0VIG01FCO`dBFzS9$*Iaxo9sja7AKV!GsM#fg5-+%nYxH#Vl%3i!KBK32FcZ zDOh2QRe*vDK+pjM9AE%jR9gm+;319SY-4enlZkxc3s?9+Isg!XEGkFDK;DIB2^)YF z_?IV|8R2G8j7SHfVI4Bau#J?gq$Mwz8v+af0V=3M8JMvRZ;WG1YnXQ1%M2t8WLt+m68GI=>s|d)((JR1YrDP4M+fj zrp9nc2Y3ctyul4wkYNjD3_%BAIHUm-fB`eu0x*Xdg>!1Nsv|9INlRMTUM|o87We`p zRSH>p?37gpFx>v0)bNlTK*Bx*fTW(r!O=GE6$DmLMl`$uQ@W629N_?mGOS=tEFRzk zDu99&vXBKRus{VQU;z}ssM|0?VYtKv!BbTjfDViR3R#dvG^R0)=WYX)-asWdyx|R^ zp1}$v0NR2cNtcXfG?jk<0~AIOf(N{?t5Ov}RHrIc01QB@EbQt44$y(GeqaPr$buTM zky`aZV+4YQrD6}9SOhEh02T;B5+e&?_Kj%(V<1_Kc(ksV?I|2)VB-~+YlgqRh#OY$ z@B`bDg=XNiMbW52fuBbLF>oWm%KXCcic$c#W(SqiPzD;xAOs6Yi-FoP^U2jMi2!@E;Dz#mG+ z4T^vueQ2oi^8zq~Gekoi8r4%YKoC6wh(Q_D=yS5hAqF9M#$*>HO>LI}x3chO(yb7JYg-Bd4Nqw~WKjdAOK1QeIKwy6>B;$G|V7{yE1cyQhmS(zTj};OMjTt5CaqtAbXJ%fYd;rzKh7=4P~4G44A+5s}EaM z8AkO02p9ns#DIorNL{7kc*Ys5{{acicVV3GzznP)2C~3xfJY9|fCgeP0|;<>L;-wN zpa%07NCXFE;2;j-F}Z+wcs`pbWAg3u*v` z${>Z$@C-zFggQ7E;D8NOXa-gg1v4-LV@QT%I0I2227mAj1E_^<=!RHt2!|yza2Yjl zG!}<OUGjp&Gv2#Jv>iIYf)m1v2V gh>4k~iJQoYo#=_52#TR7ila!1rD%$Q6c7LaJ2T3AyZ`_I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/docs/pygame_powered.gif b/venv/Lib/site-packages/pygame/docs/pygame_powered.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a2bb5f96dc72a4feac9eef8bbef158ed8f4332c GIT binary patch literal 10171 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/docs/pygame_small.gif b/venv/Lib/site-packages/pygame/docs/pygame_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..4916dbf7a87fabbca307032243439db6243f315c GIT binary patch literal 10286 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/docs/ref/docscomments.json b/venv/Lib/site-packages/pygame/docs/ref/docscomments.json new file mode 100644 index 0000000..09a646a --- /dev/null +++ b/venv/Lib/site-packages/pygame/docs/ref/docscomments.json @@ -0,0 +1 @@ +[{"content": "How To Get ALL The Mouse Clicks.\n\nTook me hours to figure this out. Also note that button 1 and 3 pressed at the same time shows up as button 2, at least on my ubuntu computer.\n\ne=pygame.event.wait()\nif e.type == MOUSEBUTTONDOWN and e.button == 4 : do something mousey", "user_title": "Douglas Smith", "datetimeon": "2005-11-11T14:05:52", "link": "pygame.mouse.get_pressed", "id": 3}, {"content": "If you're trying to create a surface with per-pixel alphas, and\n\n my_surface = pygame.Surface((w, h), SRCALPHA)\n\ncreates a regular surface instead, try\n\n my_surface = pygame.Surface((w, h)).convert_alpha()", "user_title": "Marius Gedminas", "datetimeon": "2006-01-05T16:07:06", "link": "pygame.Surface", "id": 39}, {"content": "Interestingly, pygame.font.get_default_font() returns a font name ('freesansbold.ttf') which is not among the 189 listed by pygame.font.get_fonts().", "user_title": "Dave Burton", "datetimeon": "2011-01-03T08:47:41", "link": "pygame.font.get_fonts", "id": 3698}, {"content": "The font name is not a list! It is a single string.\n\nThe string can contain multiple font names with commas between them,\nbut if you pass a Python list (or tuple) you'll get an error.", "user_title": "Dave Burton", "datetimeon": "2011-01-03T09:13:14", "link": "pygame.font.SysFont", "id": 3699}, {"content": "Re: \"During its lifetime, the PixelArray locks the surface, thus you explicitly have to delete it once its not used anymore and the surface should perform operations in the same scope.\"\n\n1. Grammer: s/its/it's/\n\n2. s/you explicitly have to delete/you have to explicitly delete/\n\n3. I assume that to explicitly delete it you can either use \"del pxarray\"\nor else simply exit the function to which pxarray is local. Is that correct?\n\n4. What does \"and the surface should perform operations in the same scope\" mean?\nIs it saying something about the surface returned by px.make_surface(), i.e.,\nthat it should be a local variable in the same function to which pxarray is local?\nOr is it saying something about the surface that is passed to pygame.PixelArray()\nto create the pxarray object, and if so WHAT is it saying?", "user_title": "Dave Burton", "datetimeon": "2011-01-07T03:08:20", "link": "pygame.PixelArray", "id": 3703}, {"content": "On my Windows Vista machine running Python 3.1.2 and pygame 1.9.1, pgame.font.get_fonts() returns a list of 189 fonts. All the font names are lower case, and there are no special characters (like hyphens) in the names. The expected 'timesnewroman', 'arial', 'arialblack', 'couriernew', 'veranda', 'microsoftsansserif', 'symbol' and 'wingdings' are there (but not 'times' or 'roman' or 'helvetica'), but also many obscure fonts that I've never heard of.", "user_title": "Dave Burton", "datetimeon": "2011-01-03T08:43:54", "link": "pygame.font.get_fonts", "id": 3697}, {"content": "Pretty cool demo Mr. Anony", "user_title": "Robert Leachman", "datetimeon": "2010-12-10T22:09:50", "link": "pygame.key.get_pressed", "id": 3683}, {"content": "If you want to see a list of attributes, do a help(pygame) and it'll show you", "user_title": "Alex Polosky", "datetimeon": "2010-12-15T23:46:38", "link": "pygame.locals", "id": 3686}, {"content": "Works fine for me on OS X 10.6.5, though yes it does need to brought up to Quartz", "user_title": "Robert Leachman", "datetimeon": "2010-12-04T21:54:48", "link": "pygame.display.init", "id": 3675}, {"content": "See tutorials. \nAfter each line \n pygame.image.load(\"<>\")\nMake it\n pygame.image.load(\"<>\").convert()\nNo matter what, this will increase your speed by 600%!\nThanks to whoever put in that tutorial!\n -P.Z.", "user_title": "Ian Mallett", "datetimeon": "2007-03-05T00:13:41", "link": "pygame.draw", "id": 403}, {"content": "see:\nhttp://www.pygame.org/docs/tut/newbieguide.html\n#4", "user_title": "Ian Mallett", "datetimeon": "2007-03-17T13:13:59", "link": "pygame.draw", "id": 439}, {"content": "Dear readers, here is a working example of MPEG playing.\n-tgfcoder\n\n\nimport pygame, time\n\npygame.init()\n\ncine = pygame.movie.Movie('a-movie.mpg')\nsz=cine.get_size()\npygame.display.set_mode(sz)\nscreen = pygame.display.get_surface()\ncine.set_display(screen)\ncine.play()\nwhile True:\n time.sleep(1)", "user_title": "Jordan Trudgett", "datetimeon": "2008-01-01T09:40:25", "link": "pygame.movie", "id": 1349}, {"content": "Oh, please replace pygame.init() with pygame.display.init()\nBecause we don't want the mixer to be initialised.", "user_title": "Jordan Trudgett", "datetimeon": "2008-01-01T09:46:24", "link": "pygame.movie", "id": 1350}, {"content": "Well, actually it's not even that (x,y) needs to be in the referential of the Rect, because if it was true, then (0,0) would return 1, and it doesn't. It is really a bug.", "user_title": "Guillaume Rava", "datetimeon": "2007-04-20T18:04:08", "link": "Rect.collidepoint", "id": 503}, {"content": "# Ellipse example:\n# When border=0 ellipse is filled\n# (screen, (rgb colour) (Xpos,Ypos,width,height),border width)\npygame.draw.ellipse(screen, (0, 127, 0), (300, 150, 80, 40), 0)", "user_title": "Miroslav Cika", "datetimeon": "2008-01-10T10:08:04", "link": "pygame.draw.ellipse", "id": 1392}, {"content": "# Circle example:\n# When border=0 circle is filled\n# (screen, (rgb colour), (Xpos,Ypos),Diameter,border width)\npygame.draw.circle(screen, (0, 127, 255), (300, 140), 50, 4)", "user_title": "Miroslav Cika", "datetimeon": "2008-01-10T10:20:38", "link": "pygame.draw.circle", "id": 1393}, {"content": "thank you Trudget for the working code", "user_title": "vishwanath", "datetimeon": "2008-01-13T13:38:10", "link": "pygame.movie", "id": 1407}, {"content": "\"\"\"It seems that this method does not detect point collisions that fall anywhere \nalong the right wall or bottom wall of the rect used. The following program\ncreates a rect with a width and height of 4, and a topleft corner at [0,0]. \nThe program then moves along each row of the rect area from left to right and\ntop to bottom by 1 unit, creating a new point and checking to see if the point\ncollides with the rect. If the point collides, a 1 is printed, and if the\npoint doesn't collide, a 0 is printed.\"\"\"\n\n# import\nimport pygame\n\n# main\ny = 4\nr = pygame.Rect(0,0,y,y)\np = [0,0]\npList = []\nwhile p != [0,y+1]:\n\tfor n in range(0,y+1):\n\t\tp[0] = n\n\t\tif r.collidepoint(p):\n\t\t\tpList.append(1)\n\t\telse:\n\t\t\tpList.append(0)\n\n\tprint '%d %d %d %d %d' % (pList[0],pList[1],pList[2],pList[3],pList[4])\n\t\n\tpList = []\n\tp[0] = 0\n\tp[1] += 1\n\n# wait for user to manually exit program\ninput('press enter to exit')\n\n\"\"\"Here is the output:\"\"\"\n1 1 1 1 0\n1 1 1 1 0\n1 1 1 1 0\n1 1 1 1 0\n0 0 0 0 0\npress enter to exit\n\n\"\"\"Even if you were to directly reference the topright, bottomleft, or bottomright\npoint of the rect as the argument to the collidepoint function, the rect still \nwould not detect a collision. The rect does, however, detect collision with its\ntopleft point:\"\"\"\n\n>>>r.collidepoint(r.bottomleft)\n0\n>>>r.collidepoint(r.topright)\n0\n>>>r.collidepoint(r.bottomright)\n0\n>>>r.collidepoint(r.topleft)\n1", "user_title": "Tim Winter", "datetimeon": "2008-01-16T15:33:48", "link": "Rect.collidepoint", "id": 1420}, {"content": "To use the scrollwheel:\nfor event in pygame.event.get():\n if event.type == MOUSEBUTTONDOWN:\n if event.button == 4:\n #Zoom Out\n elif event.button == 5:\n #Zoom In", "user_title": "Ian Mallett", "datetimeon": "2008-01-25T15:59:11", "link": "pygame.mouse", "id": 1442}, {"content": "Use the following class to generate a bezier curve that can be drawn with aalines:\n\n## Class begins here\nclass Bezier:\n\n\tclass SmoothnessError(Exception): pass\n\tclass CurveError(Exception): pass\n\n\tdef __init__(self):\n\t\t\"\"\"\n\t\tA Python class for generating bezier curves\n\t\t\n\t\tAn implementation of an algorithm presented by Nils Pipenbrinck\n\t\thttp://www.cubic.org/docs/bezier.htm\n\t\t\"\"\"\n\t\n\tdef __lerp(self, ptA, ptB, t):\n\t\t\"\"\"\n\t\tReturns the linear interp between two points as a list\n\t\tptA and ptB are a list of xy coords, t is the point on the curve\n\t\t\"\"\"\n\t\tdest = []\n\t\tdest.append(ptA[0]+float(ptB[0]-ptA[0])*t)\n\t\tdest.append(ptA[1]+float(ptB[1]-ptA[1])*t)\n\t\treturn dest\n\t\n\tdef bezierPt(self, ctrlPts, t):\n\t\t\"\"\"A recursive function for finding point t along a bezier curve\"\"\"\n\t\tif len(ctrlPts) == 1:\n\t\t\t#print \"Len is 1\", ctrlPts\n\t\t\treturn ctrlPts[0]\n\t\tlerpList = []\n\t\tfor i in xrange(len(ctrlPts)-1):\n\t\t\tptA = [ctrlPts[i][0],ctrlPts[i][1]]\n\t\t\tptB = [ctrlPts[i+1][0],ctrlPts[i+1][1]]\n\t\t\tlerpList.append(self.__lerp(ptA,ptB,t))\n\t\t#print len(lerpList)\n\t\treturn self.bezierPt(lerpList, t)\n\t\n\tdef makeBezier(self, ctrlPts, smoothness):\n\t\t\"\"\"\n\t\tReturns a list of points on a bezier curve\n\t\t\n\t\tctrlPts is a list of 2d Points that define the curve, in most cases these\n\t\tconsist of control point locations and their handles, except in a 3 point\n\t\tcurve where it's just defined by the three control points.\n\t\t\n\t\tsmoothness is the number of points on the curve that should be generated.\n\t\tThis should always be more than two points or generating the bezier curve is\n\t\tpointless and the script dies in a fire (or throws an exception)\n\t\t\"\"\"\n\t\t\n\t\tif len(ctrlPts) < 2:\n\t\t\traise self.CurverError(\"Curve list must contain more than one point\")\n\t\tif smoothness < 3:\n\t\t\traise self.SmoothnessError(\"Smoothness must be more than two\")\n\t\titeration = smoothness\n\t\tbezierList = []\n\t\tsubtract=1.0/smoothness\n\t\tfor i in xrange(0,iteration):\n\t\t\tt = 1.0-(subtract*i)\n\t\t\tif t < subtract:\n\t\t\t\tt = 0\n\t\t\tbPt = self.bezierPt(ctrlPts,t)\n\t\t\t#print bPt\n\t\t\tbezierList.append(bPt)\n\t\treturn bezierLis\n## Class ends\n\n###################\n# An example of how to use the class with pygame\n\n\n## Pygame Example\nimport math, pygame\nfrom pygame.locals import *\nimport bezier\n\ndef main():\n pygame.init()\n screen = pygame.display.set_mode((640,480))\n clock = pygame.time.Clock()\n \n b = bezier.Bezier()\n \"\"\"\n\tA bezier curve definition, a list of 2d poins, simple innit\n\tIt's basically control points with control handle locations before or\n\tafter the control point.\n\t\n Read http://www.cubic.org/docs/bezier.htm for more info\n \"\"\"\n bezierPts = [[40,100],[80,20],[150,180],[260,100]]\n bLine = b.makeBezier(bezierPts, 10)\n screen.fill((255,255,255))\n pygame.draw.aalines(screen, (1,1,1), False, bLine, 1)\n pygame.display.flip()\n bounce = False\n \n while True:\n clock.tick(60)\n pygame.event.pump()\n event = pygame.event.poll()\n if event.type == QUIT:\n return\n if event.type == KEYDOWN:\n if event.key == K_ESCAPE:\n return\n setTo = pygame.time.get_ticks()/20\n bezierPts[1][1] = setTo\n bLine = b.makeBezier(bezierPts,20)\n screen.fill((255,255,255))\n pygame.draw.aalines(screen, (1,1,1), False, bLine, 1)\n pygame.display.flip()\n\nif __name__ == \"__main__\":\n m = main()\n## End example", "user_title": "Jeiel Aranal", "datetimeon": "2008-02-06T10:50:10", "link": "pygame.draw.aalines", "id": 1502}, {"content": "Play can return None. So be sure to check the channel before using it. Something like this...\n\n channel = self.bounce_sound.play()\n if channel is not None:\n channel.set_volume(1.0 - stereo, stereo)", "user_title": "Will McGugan", "datetimeon": "2007-06-14T12:13:28", "link": "Sound.play", "id": 635}, {"content": "Should have an optional option \nfor sound playback speed...", "user_title": "Ian Mallett", "datetimeon": "2007-06-30T19:41:18", "link": "Sound.play", "id": 676}, {"content": "When antialias is enabled, rendering it on a black background makes it look bold.", "user_title": "Ian Mallett", "datetimeon": "2007-07-03T01:18:12", "link": "Font.render", "id": 689}, {"content": "Should have an Anti-alias option...", "user_title": "Ian Mallett", "datetimeon": "2008-02-25T23:09:09", "link": "pygame.draw.circle", "id": 1646}, {"content": "mods = pygame.key.get_mods()\nif mods & KMOD_LSHIFT: #use whatever KMOD_ constant you want;)\n print \"left shift pressed\"", "user_title": "Isaiah Heyer", "datetimeon": "2008-03-29T16:22:04", "link": "pygame.key.get_mods", "id": 1716}, {"content": "I would like to have a method of telling which side of a rect a point collides. \nIn other words, which side is the point closest to?", "user_title": "Ian Mallett", "datetimeon": "2008-03-29T23:08:21", "link": "Rect.collidepoint", "id": 1718}, {"content": "Right. Unfortunately, That's the way it is. A width or height of 0 should also\nbe allowed, for rectangles of changing sizes (think progressbar at 0%)", "user_title": "Ian Mallett", "datetimeon": "2007-08-01T17:48:16", "link": "pygame.draw.rect", "id": 785}, {"content": "Instead of drawing a circle with zero radius, you can use the method set_at on the surface to set the color of a single pixel: http://www.pygame.org/docs/ref/surface.html#Surface.set_at", "user_title": "Victor Blomqvist", "datetimeon": "2007-09-23T08:07:45", "link": "pygame.draw.circle", "id": 873}, {"content": "'dummy' driver is missing ;-)", "user_title": "DR0ID", "datetimeon": "2007-09-23T12:08:05", "link": "pygame.display.init", "id": 875}, {"content": "please able my display mode with opengl acceleration", "user_title": "aaron pedralvez", "datetimeon": "2007-09-27T02:05:16", "link": "pygame.display.init", "id": 882}, {"content": "In the event MOUSEBUTTONDOWN, if you're using a mouse with a rotating wheel,\nevent.button returns 4 when it is rotated forward (counterclockwise) and 5 when\nit is rotating backward (clockwise). I used a print statement to discover this.", "user_title": "Andy Hanson", "datetimeon": "2007-10-02T20:43:15", "link": "pygame.event", "id": 900}, {"content": "In the event MOUSEBUTTONDOWN, if you're using a mouse with a rotating wheel,\nevent.button returns 4 when it is rotated forward (counterclockwise) and 5 when\nit is rotating backward (clockwise). I used a print statement to discover this.", "user_title": "Andy Hanson", "datetimeon": "2007-10-02T20:43:21", "link": "pygame.event", "id": 901}, {"content": "You can request fullscreen, but there doesn't seem to be a way to\ndetermine whether it's on. Meaning, there ought to be a 'get_mode()'.", "user_title": "Andy Sommerville", "datetimeon": "2007-12-04T14:43:28", "link": "pygame.display.set_mode", "id": 1206}, {"content": "http://www.pygame.org/docs/ref/sndarray.html#pygame.sndarray.make_sound\ncan be used to synthesize a sound object from sound samples.", "user_title": "Ian Mallett", "datetimeon": "2008-05-26T20:16:58", "link": "pygame.mixer.Sound", "id": 1953}, {"content": "The movie module in Pygame 1.8 works on Windows.\nThe statement that it doesn't work is out-of-date.", "user_title": "Jason M. Marshall", "datetimeon": "2008-05-21T14:15:44", "link": "pygame.movie", "id": 1917}, {"content": "return bezierLis -> return bezierList (line 65)", "user_title": "Jordan Trudgett", "datetimeon": "2008-06-18T02:46:43", "link": "pygame.draw.aalines", "id": 2060}, {"content": "pygame.mixer.get_num_channels(): return count", "user_title": "Jordan Trudgett", "datetimeon": "2008-07-10T13:15:18", "link": "pygame.mixer.get_num_channels", "id": 2150}, {"content": "Calling Surface.lock() before many calls to Surface.set_at() and Surface.unlock() after is a great and easy optimization.", "user_title": "Ian Mallett", "datetimeon": "2008-07-11T23:25:11", "link": "Surface.set_at", "id": 2156}, {"content": "Just set the delay to something really big.", "user_title": "Ian Mallett", "datetimeon": "2008-08-19T06:01:04", "link": "pygame.key.set_repeat", "id": 2265}, {"content": "Is this thread-safe? Can I safely post messages from a different thread\nfrom the one that's processing events and rendering?", "user_title": "Weeble", "datetimeon": "2008-11-28T19:09:39", "link": "pygame.event.post", "id": 2339}, {"content": "''' Change alpha for surfaces with per-pixel alpha; only for small surfaces '''\ndef change_alpha(surface,alpha=0.5):\n\tsize = surface.get_size()\n\ttry:\n\t\tfor y in xrange(size[1]):\n\t\t\tfor x in xrange(size[0]):\n\t\t\t\tr,g,b,a = surface.get_at((x,y))\n\t\t\t\tsurface.set_at((x,y),(r,g,b,int(a*alpha)))\n\texcept:\n\t\treturn surface\n\treturn surface", "user_title": "Josef Vanzura", "datetimeon": "2010-11-19T09:47:18", "link": "Surface.set_alpha", "id": 3245}, {"content": "You can also do it with surfarray (faster).", "user_title": "Josef Vanzura", "datetimeon": "2010-11-19T09:49:02", "link": "Surface.set_alpha", "id": 3246}, {"content": "Sorry. I didn't read the previous comment, which is a better way.", "user_title": "Josef Vanzura", "datetimeon": "2010-11-19T09:56:18", "link": "Surface.set_alpha", "id": 3247}, {"content": "present in pygame 1.9.1 but not in pygame 1.8.1, which is currently the last binary release on Linux.", "user_title": "Shanti Pothapragada", "datetimeon": "2010-11-22T17:04:34", "link": "Rect.copy", "id": 3249}, {"content": "Also includes the attributes: x, y.", "user_title": "Sam Bull", "datetimeon": "2010-10-26T07:40:18", "link": "pygame.Rect", "id": 3225}, {"content": "Works like a charm. Thanks whoever you are.", "user_title": "Bartosz Debski", "datetimeon": "2010-09-29T19:26:57", "link": "Surface.fill", "id": 3211}, {"content": "The code snippet works perfectly; thanks!\nI think the documentation is sorely in need of an update.\nWishlist: other video formats, like .avi?", "user_title": "Ian Mallett", "datetimeon": "2009-01-01T16:05:17", "link": "pygame.movie", "id": 2360}, {"content": "An example to use this:\nscreen = pygame.display.set_mode(SCREENRECT.size) # SCREENRECT is a rect variable...\n # ...with screen dimension\n\ndoggie = pygame.sprite.RenderUpdates() #We create the group\nDog.containers = doggie \n# class Dog: Needs 'pygame.sprite.Sprite.__init__(self,self.containers)'\n# inside def __init__(self, ...):\n\ndog1 = Dog(...) #Class Dog\ndog2 = Dog(...)\n...\ndogN = Dog(...)\n\n... #Some move actions and things\n\n#Now, time to re-paint them all\ndoggie.clear(screen, Background)\nchanges = doggie.draw(screen)\npygame.display.update(changes)\n#Now we have all dogs updated in screen\n\n#---------\nEasy, quick and effortless", "user_title": "Patata", "datetimeon": "2009-01-07T12:38:26", "link": "pygame.sprite.RenderUpdates", "id": 2366}, {"content": "# A better loading script:\n\nimport os, pygame\n\ndef load_image(file_name, colorkey=False, image_directory='images'):\n 'Loads an image, file_name, from image_directory, for use in pygame'\n file = os.path.join(image_directory, file_name)\n _image = pygame.image.load(file)\n if colorkey:\n if colorkey == -1: \n # If the color key is -1, set it to color of upper left corner\n colorkey = _image.get_at((0, 0))\n _image.set_colorkey(colorkey)\n _image = _image.convert()\n else: # If there is no colorkey, preserve the image's alpha per pixel.\n _image = _image.convert_alpha()\n return _image", "user_title": "Nekody Lenkner", "datetimeon": "2009-03-20T21:58:08", "link": "pygame.image.load", "id": 2399}, {"content": "what does it mean by font name? can it be a path to a font?", "user_title": "Mad Cloud Games", "datetimeon": "2010-07-02T01:21:30", "link": "pygame.font.SysFont", "id": 3151}, {"content": "You can use multiple screens, but you'll need to make a separate process for each.", "user_title": "Ian Mallett", "datetimeon": "2009-08-01T23:26:07", "link": "pygame.display.set_mode", "id": 2900}, {"content": "VIDEORESIZE size, w, h\nsize == (w, h) # same data, different access", "user_title": "DR0ID", "datetimeon": "2009-04-04T12:27:05", "link": "pygame.event", "id": 2411}, {"content": "je ne sais pas pourquoi, mais; si vous utiliser une surface pour effacer le display au lieu d'utiliser un 'fill',\nil sera beaucoup plus rapide de blitter une copie du display :\n\ndisplay = pygame.display.set_mode((500,500))\nbackground = pygame.image.load('blablabla...')\ndisplay.blit(background,(0,0))\nbackground = display.copy() ----> utiliser cette copie pour multi-blitter plus rapidement une image de fond.", "user_title": "josmiley", "datetimeon": "2009-08-03T01:50:34", "link": "Surface.copy", "id": 2902}, {"content": "This doesn't say anything about the type attribute.\nYou can compare it to MOUSEBUTTONUP, KEYDOWN, etc to find out what the events\ntype is.", "user_title": "Daniel Westbrook", "datetimeon": "2009-07-29T00:20:38", "link": "pygame.event.Event", "id": 2896}, {"content": "is it a Rect object???", "user_title": "Alex", "datetimeon": "2010-05-04T17:47:38", "link": "pygame.display.update", "id": 3117}, {"content": "TIP:\nIf sound has noise/noisy is choppy or has static, the solution:\n\npygame.mixer.quit() #Make sure you all this before .init()\npygame.mixer.init()", "user_title": "Chris Goldie", "datetimeon": "2009-08-11T05:44:03", "link": "Sound.play", "id": 2911}, {"content": "The convert_alpha function prepares a surface for usage with per-pixel alphas. That is, for example, if you have a PNG or TGA image with an alpha channel controlling opacity of individual pixels, you would want to use this function on your surface after loading the image to speed up the blitting process.", "user_title": "Brad Smithee", "datetimeon": "2010-04-29T02:55:18", "link": "Surface.convert_alpha", "id": 3113}, {"content": "This will be extremely useful!", "user_title": "Ian Mallett", "datetimeon": "2009-08-15T19:21:45", "link": "pygame.transform.average_surfaces", "id": 2917}, {"content": "Some basic sample code for (approximately) constraining a bunch of text to a given width:\n\nwordsToWrite = toWrite.rstrip().split(\" \") #Get rid of the newline char and split on spaces\ncurrLine = \"\"\nnumLines = 0\nmaxWidthFound = 0\nfor word in wordsToWrite:\n currLine = currLine + \" \" + word #Add the next word to the line\n\n if ((textFont.size(currLine))[0] > maxAllowedWidth): #Check if the width of the line exceeds the set limit\n\n if (textFont.size(currLine))[0] > maxWidthFound: #Get the maximum line width found\n maxWidthFound = (textFont.size(currLine))[0]\n\n lines.append (textFont.render(currLine, 1, color, bgcolor)) #Add the rendered line to a list\n currLine = \"\"\n numLines = numLines + 1\n\nif currLine != \"\": #Once we exit the loop, we will probably still have a line to be rendered\n lines.append (textFont.render(currLine, 1, color, bgcolor))\n currLine = \"\"\n numLines = numLines + 1\n\nself.image = pygame.Surface((maxWidthFound + 20, numLines * textFont.get_height() + 20)) #Create a surface of the appropriate size\n\nfor lineNum in range(numLines): \n self.image.blit(lines[lineNum], (10,lineNum * textFont.get_height() + 10))", "user_title": "Aditya Keswani", "datetimeon": "2009-07-20T07:29:06", "link": "Font.render", "id": 2887}, {"content": "For all of these drawing functions, the coordinates are relative to the surface\nyou are drawing to. i.e. if you are drawing to a surface somewhere in the middle of\nthe screen, and you draw a circle at (0,0), its center will be the top-left corner\nof the surface being drawn to, not the top-left corner of the screen", "user_title": "Aditya Keswani", "datetimeon": "2009-07-20T07:23:36", "link": "pygame.draw", "id": 2886}, {"content": "The messages here:\nhttp://www.mail-archive.com/pygame-users@seul.org/msg10616.html\n\nimply that GL_SWAP_CONTROL can also be passed to gl_set_attribute to control whether\ndisplay swaps honor vsync.", "user_title": "Jonathan Hartley", "datetimeon": "2010-03-25T15:42:06", "link": "pygame.display.gl_set_attribute", "id": 3087}, {"content": "Pygame THECOLORS as HTML\nhttps://sites.google.com/site/meticulosslacker/pygame-thecolors", "user_title": "Meticulos Slacker", "datetimeon": "2010-03-18T03:10:26", "link": "pygame.Color", "id": 3078}, {"content": "Should be \"buffer\", not \"buffersize\"", "user_title": "Ian Mallett", "datetimeon": "2010-03-19T00:36:48", "link": "pygame.mixer.pre_init", "id": 3079}, {"content": "Put this first:\nfor e in pygame.event.get()", "user_title": "Ian Mallett", "datetimeon": "2010-03-20T19:51:20", "link": "pygame.key.set_repeat", "id": 3080}, {"content": "mod is the bitfield of KMOD_* constants:\npygame.KMOD_NONE\t0\npygame.KMOD_LSHIFT\t1\npygame.KMOD_RSHIFT\t2\npygame.KMOD_SHIFT\t3\npygame.KMOD_LCTRL\t64\npygame.KMOD_RCTRL\t128\npygame.KMOD_CTRL\t192\npygame.KMOD_LALT\t256\npygame.KMOD_RALT\t512\npygame.KMOD_ALT\t\t768\npygame.KMOD_LMETA\t1024\npygame.KMOD_RMETA\t2048\npygame.KMOD_META\t3072\npygame.KMOD_NUM\t\t4096\npygame.KMOD_CAPS\t8192\npygame.KMOD_MODE\t16384", "user_title": "Vladar", "datetimeon": "2010-03-23T06:16:44", "link": "pygame.event", "id": 3081}, {"content": "If you try to use fadeout, the queued sound will begin, as opposed to stop and pause.", "user_title": "Andy Hanson", "datetimeon": "2009-07-12T22:43:31", "link": "Channel.queue", "id": 2875}, {"content": "I ran into that problem -- the solution is to initialize pygame first :)\n\nimport pygame\npygame.init()\nprint pygame.key.name(pygame.K_UP)", "user_title": "Jared", "datetimeon": "2009-08-29T04:11:27", "link": "pygame.key.name", "id": 2928}, {"content": "It appears that when the delay is set to zero, \nkey.set_repeat is returned to the default, disabled state.\nTo set it to a minimum, essentially no delay, just set it to 1.\n\npygame.key.set_repeat(0,50) #Doesn't work.\npygame.key.set_repeat(1,50) #Works with essentially no delay.", "user_title": "David Khono Hackland", "datetimeon": "2010-03-02T22:20:03", "link": "pygame.key.set_repeat", "id": 3065}, {"content": "It appears that when the delay is set to zero, \nkey.set_repeat is returned to the default, disabled state.\nTo set it to a minimum, essentially no delay, just set it to 1.\n\npygame.key.set_repeat(0,50) #Doesn't work.\npygame.key.set_repeat(1,50) #Works with essentially no delay.", "user_title": "David Khono Hackland", "datetimeon": "2010-03-02T22:19:26", "link": "pygame.key.set_repeat", "id": 3064}, {"content": "Does it matter if you tick at the start or at the end?", "user_title": "Mitchell K", "datetimeon": "2009-09-12T21:09:15", "link": "Clock.tick", "id": 2944}, {"content": "The example's .flip(..) below won't work - maybe I should have checked it before posting...\nHere is a better Version, it should work now.\n\nfrom pygame import Rect, Surface\nclass Sprites():\n def __init__(self, spritesheet, size):\n self.sheet = spritesheet\n self.sheet.convert_alpha()\n self.size = size\n \n self.sprites = []\n for x in xrange(spritesheet.get_width() / size[0]):\n list = []\n for y in xrange(spritesheet.get_height() / size[1]):\n list.append(spritesheet.subsurface(Rect((x*size[0], y*size[1]) , size)))\n self.sprites.append(list)\n def flip(self, xbool, ybool):\n new = Surface(self.sheet.get_size())\n new.fill((0, 0, 0, 0))\n for row in self.sprites:\n for sprite in row:\n new.blit(flip(sprite, xbool, ybool), sprite.get_offset())\n self.sheet.fill((0, 0, 0, 0))\n self.sheet.blit(new, (0, 0))\n def __getitem__(self, x=None, y=None):\n # not very tested, .flip(y=7) won't work\n # the if conditions should allow you to access a sheet with one row/col more easily .flip(5, 0) == .flip(5)\n if x is not None:\n if y is None:\n if len(self.sprites) > x:\n y = 0\n else:\n y = x\n x = 0\n elif y is None:\n raise IndexError\n \n return self.sprites[x][y]\n\n@any Developer/Moderator - it would be nice if my wrong post, \"The example below won't work\" and this Notice would be removed.", "user_title": "Rolf Sievers", "datetimeon": "2009-11-06T11:31:59", "link": "Surface.subsurface", "id": 2998}, {"content": "Here is a simple Sprite-sheet Class I wrote for an application, maybe someone can use it.\n\nfrom pygame import Rect\nclass Sprites():\n def __init__(self, spritesheet, size):\n self.sheet = spritesheet\n self.sheet.convert_alpha()\n self.size = size\n \n self.sprites = []\n for x in xrange(spritesheet.get_width() / size[0]):\n list = []\n for y in xrange(spritesheet.get_height() / size[1]):\n list.append(spritesheet.subsurface(Rect((x*size[0], y*size[1]) , size)))\n self.sprites.append(list)\n print list\n print self.sprites\n def flip(self, xbool, ybool):\n self.sheet.fill((0, 0, 0, 0))\n for row in self.sprites:\n for sprite in row:\n sprite.blit(flip(sprite, xbool, ybool), (0, 0))\n def __getitem__(self, x=None, y=None):\n if x is not None:\n if y is None:\n if len(self.sprites) > x:\n y = 0\n else:\n y = x\n x = 0\n elif y is None:\n raise IndexError\n \n return self.sprites[x][y]", "user_title": "Rolf Sievers", "datetimeon": "2009-11-06T11:14:23", "link": "Surface.subsurface", "id": 2997}, {"content": "Is there anyway to get the rect of a polygon without having to create a surface greater than or equal to the polygon, and then gather the rect from the polygon?", "user_title": "Luke Endres", "datetimeon": "2009-08-08T21:50:46", "link": "pygame.draw.polygon", "id": 2907}, {"content": "This is twice the work because the image is rotated and then resized (subrect\nis copied) but it doesn't hurt my math-addled brain.\n\ndef rot_center(image, angle):\n \"\"\"rotate an image while keeping its center and size\"\"\"\n orig_rect = image.get_rect()\n rot_image = pygame.transform.rotate(image, angle)\n rot_rect = orig_rect.copy()\n rot_rect.center = rot_image.get_rect().center\n rot_image = rot_image.subsurface(rot_rect).copy()\n return rot_image", "user_title": "Gummbum", "datetimeon": "2010-01-17T01:17:23", "link": "pygame.transform.rotate", "id": 3034}, {"content": "Use pygame.transform.rotate(Surface, angle)", "user_title": "Francesco Pasa", "datetimeon": "2010-01-17T09:30:05", "link": "pygame.Surface", "id": 3035}, {"content": "Does the returned Boolean value indicate success/failure at toggling fullscreen mode,\nor current status of the display (e.g., fullscreen = True, windowed = False)?", "user_title": "Chris L", "datetimeon": "2010-01-27T16:33:12", "link": "pygame.display.toggle_fullscreen", "id": 3041}, {"content": "set_blocked() clear queue from ALL events", "user_title": "ploutos", "datetimeon": "2009-10-23T11:07:21", "link": "pygame.event.set_blocked", "id": 2980}, {"content": "If they play in a CD player, they were burned properly.", "user_title": "Jeffrey Aylesworth", "datetimeon": "2009-10-21T19:51:47", "link": "pygame.cdrom", "id": 2975}, {"content": "This is very important for mac because it shows the icon in the dock.. when I use this, it flashes the snake image for a second before changing, and it also gets smaller then the application icon which is the same (using py2app).", "user_title": "Mitchell K", "datetimeon": "2009-09-24T16:05:59", "link": "pygame.display.set_icon", "id": 2959}, {"content": "\"\"\"\n\t # This is a get_ticks() function simple example\n\t # This script should return 10 as a result\n\"\"\"\n# Standard library imports\nimport time\n# Related third party imports\nimport pygame\n#Pygame start function\n\npygame.init()\n# Create the clock\nclock = pygame.time.Clock()\n# A simple loop of 10 stages\nfor i in range(10):\n\t# Update the clock\n\tclock.tick(1)\n# Print the seconds\nprint int(round(pygame.time.get_ticks()/1000))", "user_title": "Sergio Milardovich", "datetimeon": "2010-06-08T15:33:04", "link": "pygame.time.get_ticks", "id": 3138}, {"content": "Note that pygame.scrap seems to be unimplemented in pygame-1.9.1.win32-py3.1.msi\n\nDefine testscrap.py, like this:\n\nimport pygame\npygame.init()\npygame.scrap.init()\n\n\nRun it, like this:\n\nC:\\Users\\Dave\\Documents\\Python>testscrap.py\nC:\\Users\\Dave\\Documents\\Python\\testscrap.py:3: RuntimeWarning: use scrap: No module named scrap\n(ImportError: No module named scrap)\n pygame.scrap.init()\nTraceback (most recent call last):\n File \"C:\\Users\\Dave\\Documents\\Python\\testscrap.py\", line 3, in \n pygame.scrap.init()\n File \"C:\\Python31\\lib\\site-packages\\pygame\\__init__.py\", line 70, in __getattr__\n raise NotImplementedError(MissingPygameModule)\nNotImplementedError: scrap module not available\n(ImportError: No module named scrap)", "user_title": "Dave Burton", "datetimeon": "2011-01-16T00:15:21", "link": "pygame.scrap", "id": 3731}, {"content": "BTW, the same error occurs if you have initialized a display surface, too:\n\nimport pygame\npygame.init()\nscreen=pygame.display.set_mode((640,360),0,32)\npygame.scrap.init()", "user_title": "Dave Burton", "datetimeon": "2011-01-16T00:18:19", "link": "pygame.scrap", "id": 3732}, {"content": "Hey, July 7 2009 Anonymous, that's a nice demo!\n\nFor Python 3 compatibility, just change the last line to:\n\n pygame.time.delay(1000//50)", "user_title": "Dave Burton", "datetimeon": "2011-01-24T10:00:06", "link": "Surface.subsurface", "id": 3746}, {"content": "Note that the order of the tuple members in virtual attributes like .topleft\nis always (x,y) [or (left,top) or (width,height)] even if the name of the\nvirtual attribute seems to suggest the opposite order. E.g.,\nrect1.topleft == (rect1.left,rect1.top)", "user_title": "Dave Burton", "datetimeon": "2011-01-25T01:19:14", "link": "pygame.Rect", "id": 3747}, {"content": "There's no 'code' member for type USEREVENT, unless you create one yourself\nwhen you create the event.", "user_title": "Dave Burton", "datetimeon": "2011-01-25T21:33:33", "link": "pygame.event", "id": 3750}, {"content": "July 15 2010 Anonymous, here's your example of a resizeable pygame window.\n\nI don't know what you mean by \"window itself as well as the display.\"\nIf you want to resize something WITHIN the pygame window, just blit something\ndifferent onto it.\n\nDave\n\n\nimport sys, os, pygame\npygame.init()\n\nclock = pygame.time.Clock()\n\nscrsize = width,height = 600,400\nblack = 0,0,0\nbgcolor = (240,240,220) # light grey\n\n# to get the true full-screen size, do this BEFORE pygame.display.set_mode:\nfullscreen_sz = pygame.display.Info().current_w, pygame.display.Info().current_h\nprint( 'screen size =', fullscreen_sz )\n\n\n# ---------- This works under Windows Vista, no promises elsewhere! ----------\n# initially center the pygame window by setting %SDL_VIDEO_WINDOW_POS%\nwin_pos_left = 1 + ((fullscreen_sz[0] - width) // 2)\nwin_pos_top = 1 + ((fullscreen_sz[1] - height) // 2)\nos.environ['SDL_VIDEO_WINDOW_POS'] = '{0},{1}'.format(win_pos_left, win_pos_top)\n# ----------------------------------------------------------------------------\n\nscreen = pygame.display.set_mode(scrsize, pygame.RESIZABLE)\n\n# ----------------------------------------------------------------------------\nos.environ['SDL_VIDEO_WINDOW_POS'] = ''\n# if you don't clear the environment variable, the window will reposition\n# every time pygame.display.set_mode() gets called due to a VIDEORESIZE event.\n# ----------------------------------------------------------------------------\n\narial = pygame.font.SysFont( 'arial,microsoftsansserif,courier', 14 )\ntxt2display = arial.render( \"This window is resizeable\", True, black )\ntxt2display_w = txt2display.get_size()[0]\n\nwhile True:\n changed = False\n for event in pygame.event.get():\n if event.type == pygame.QUIT:\n pygame.quit()\n sys.exit(0)\n elif event.type == pygame.VIDEORESIZE:\n scrsize = event.size # or event.w, event.h\n screen = pygame.display.set_mode(scrsize,RESIZABLE)\n changed = True\n\n screen.fill( bgcolor )\n screen.blit( txt2display, ((scrsize[0]+1-txt2display_w)//2,1) ) # at top-center of screen\n pygame.display.update()\n if not changed:\n clock.tick(60) # limit to 60 fps", "user_title": "Dave Burton", "datetimeon": "2011-01-25T23:10:35", "link": "pygame.display.init", "id": 3751}, {"content": "Oops! Tiny correction... the 8th-to-last line should be\n\n screen = pygame.display.set_mode(scrsize,pygame.RESIZABLE)\n\n(Or else you can \"from pygame.locals import *\")", "user_title": "Dave Burton", "datetimeon": "2011-01-25T23:16:00", "link": "pygame.display.init", "id": 3752}, {"content": "from pygame.locals import *\n\n_evnames = {} # from SDL-1.2.14\\include\\SDL_events.h\n_evnames[NOEVENT] = 'NOEVENT' # 0 SDL_NOEVENT\n_evnames[ACTIVEEVENT] = 'ACTIVEEVENT' # 1 SDL_ACTIVEEVENT\n_evnames[KEYDOWN] = 'KEYDOWN' # 2 SDL_KEYDOWN\n_evnames[KEYUP] = 'KEYUP' # 3 SDL_KEYUP\n_evnames[MOUSEMOTION] = 'MOUSEMOTION' # 4 SDL_MOUSEMOTION\n_evnames[MOUSEBUTTONDOWN] = 'MOUSEBUTTONDOWN' # 5 SDL_MOUSEBUTTONDOWN\n_evnames[MOUSEBUTTONUP] = 'MOUSEBUTTONUP' # 6 SDL_MOUSEBUTTONUP\n_evnames[JOYAXISMOTION] = 'JOYAXISMOTION' # 7 SDL_JOYAXISMOTION\n_evnames[JOYBALLMOTION] = 'JOYBALLMOTION' # 8 SDL_JOYBALLMOTION\n_evnames[JOYHATMOTION] = 'JOYHATMOTION' # 9 SDL_JOYHATMOTION\n_evnames[JOYBUTTONDOWN] = 'JOYBUTTONDOWN' # 10 SDL_JOYBUTTONDOWN\n_evnames[JOYBUTTONUP] = 'JOYBUTTONUP' # 11 SDL_JOYBUTTONUP\n_evnames[QUIT] = 'QUIT' # 12 SDL_QUIT\n_evnames[SYSWMEVENT] = 'SYSWMEVENT' # 13 SDL_SYSWMEVENT\n # 14 SDL_EVENT_RESERVEDA\n # 15 SDL_EVENT_RESERVEDB\n_evnames[VIDEORESIZE] = 'VIDEORESIZE' # 16 SDL_VIDEORESIZE\n_evnames[VIDEOEXPOSE] = 'VIDEOEXPOSE' # 17 SDL_VIDEOEXPOSE\n # 18 SDL_EVENT_RESERVED2\n # 19 SDL_EVENT_RESERVED3\n # 20 SDL_EVENT_RESERVED4\n # 21 SDL_EVENT_RESERVED5\n # 22 SDL_EVENT_RESERVED6\n # 23 SDL_EVENT_RESERVED7\n_evnames[USEREVENT] = 'USEREVENT' # 24 SDL_USEREVENT\n_evnames[NUMEVENTS] = 'NUMEVENTS' # 32 SDL_NUMEVENTS\n\n\ndef event_name(evtype):\n '''return a displayable name for a pygame/SDL event type number'''\n try:\n result = _evnames[evtype]\n except:\n if evtype in range(USEREVENT,NUMEVENTS):\n result = 'USEREVENT+' + repr(evtype-USEREVENT)\n elif evtype >= NUMEVENTS:\n result = 'ILLEGAL_EVENT_' + repr(evtype)\n elif evtype == 14:\n result = 'EVENT_RESERVEDA'\n elif evtype == 15:\n result = 'EVENT_RESERVEDB'\n else:\n result = 'EVENT_RESERVED' + repr(evtype-16)\n return result\n\n\nfor i in range(0,33):\n print(repr(i) + ' = ' + event_name(i))\n\n\n# It's all gonna change in SDL 1.3:\n#\n# SDL_FIRSTEVENT = 0 # Unused\n#\n# SDL_QUIT = 0x100 # User-requested quit\n#\n# SDL_WINDOWEVENT = 0x200 # Window state change\n# SDL_SYSWMEVENT = 0x201 # System specific event\n#\n# # Keyboard events\n# SDL_KEYDOWN = 0x300 # Key pressed\n# SDL_KEYUP = 0x301 # Key released\n# SDL_TEXTEDITING = 0x302 # Keyboard text editing (composition)\n# SDL_TEXTINPUT = 0x303 # Keyboard text input\n#\n# # Mouse events\n# SDL_MOUSEMOTION = 0x400 # Mouse moved\n# SDL_MOUSEBUTTONDOWN = 0x401 # Mouse button pressed\n# SDL_MOUSEBUTTONUP = 0x402 # Mouse button released\n# SDL_MOUSEWHEEL = 0x403 # Mouse wheel motion\n#\n# # Tablet or multiple mice input device events\n# SDL_INPUTMOTION = 0x500 # Input moved\n# SDL_INPUTBUTTONDOWN = 0x501 # Input button pressed\n# SDL_INPUTBUTTONUP = 0x502 # Input button released\n# SDL_INPUTWHEEL = 0x503 # Input wheel motion\n# SDL_INPUTPROXIMITYIN = 0x504 # Input pen entered proximity\n# SDL_INPUTPROXIMITYOUT = 0x505 # Input pen left proximity\n#\n# # Joystick events\n# SDL_JOYAXISMOTION = 0x600 # Joystick axis motion\n# SDL_JOYBALLMOTION = 0x601 # Joystick trackball motion\n# SDL_JOYHATMOTION = 0x602 # Joystick hat position change\n# SDL_JOYBUTTONDOWN = 0x603 # Joystick button pressed\n# SDL_JOYBUTTONUP = 0x604 # Joystick button released\n#\n# # Touch events\n# SDL_FINGERDOWN = 0x700\n# SDL_FINGERUP = 0x701\n# SDL_FINGERMOTION = 0x702\n# SDL_TOUCHBUTTONDOWN = 0x703\n# SDL_TOUCHBUTTONUP = 0x704\n#\n# # Gesture events\n# SDL_DOLLARGESTURE = 0x800\n# SDL_DOLLARRECORD = 0x801\n# SDL_MULTIGESTURE = 0x802\n#\n# # Clipboard events\n# SDL_CLIPBOARDUPDATE = 0x900 # The clipboard changed\n#\n# # Obsolete events\n# SDL_EVENT_COMPAT1 =0x7000 # SDL 1.2 events for compatibility\n# SDL_EVENT_COMPAT2 =0x7001\n# SDL_EVENT_COMPAT3 =0x7002\n#\n# # SDL_USEREVENT thru SDL_LASTEVENT are for your use\n# SDL_USEREVENT =0x8000\n# SDL_LASTEVENT =0xFFFF", "user_title": "Dave Burton", "datetimeon": "2011-01-27T04:08:06", "link": "pygame.event.Event", "id": 3753}, {"content": "This function seems to me little bit buggy, so I wrote my own:\n\na and b are surfarrays of some surfaces that you want to compare\n\n def comparray(self,a,b):\n c = abs(a.__sub__(b))\n c = c.__ge__(self.tolerance)*255\n surface = pygame.surfarray.make_surface(c)\n return surface", "user_title": "Kaan Ak\u00c3\u009fit", "datetimeon": "2011-01-27T18:49:33", "link": "PixelArray.compare", "id": 3756}, {"content": "There's an error in this documentation w/r/t the final (width) argument:\n\n pygame.draw.rect(self.image, color, self.image.get_rect(), width=1)\nTypeError: rect() takes no keyword arguments\n\nLeave off the \"width=\" to make it work:\n\n pygame.draw.rect(self.image, color, self.image.get_rect(), 1)\n\nThis is with either pygame-1.9.1.win32-py2.6.msi or pygame-1.9.1.win32-py3.1.msi", "user_title": "Dave Burton", "datetimeon": "2011-01-28T03:12:31", "link": "pygame.draw.rect", "id": 3757}, {"content": "There's an error in this documentation w/r/t the final (width) argument:\n\n pygame.draw.line(self.image, (0,0,0), (x,y), (x,y+h), width=2)\nTypeError: line() takes no keyword arguments\n\nLeave off the \"width=\" to make it work:\n\n pygame.draw.line(self.image, (0,0,0), (x,y), (x,y+h), 2)\n\nThis is with either pygame-1.9.1.win32-py2.6.msi or pygame-1.9.1.win32-py3.1.msi", "user_title": "Dave Burton", "datetimeon": "2011-01-28T04:54:01", "link": "pygame.draw.line", "id": 3759}, {"content": "Rect.center rounds UP:\n\nr0x0 = pygame.Rect(0,0,0,0) # a 0x0 rect\nprint('center of 0x0 rect is ' + repr(r0x0.center)) # result is (0,0) = not in the rect!\nr1x1 = pygame.Rect(0,0,1,1) # a 1x1 rect\nprint('center of 1x1 rect is ' + repr(r1x1.center)) # result is (0,0) = correct\nr2x2 = pygame.Rect(0,0,2,2) # a 2x2 rect\nprint('center of 2x2 rect is ' + repr(r2x2.center)) # result is (1,1) = rounded up!\nr3x3 = pygame.Rect(0,0,3,3) # a 3x3 rect\nprint('center of 3x3 rect is ' + repr(r3x3.center)) # result is (1,1) = exact\nr4x4 = pygame.Rect(0,0,4,4) # a 4x4 rect\nprint('center of 4x4 rect is ' + repr(r4x4.center)) # result is (2,2) = rounded up!\nr5x5 = pygame.Rect(0,0,5,5) # a 5x5 rect\nprint('center of 5x5 rect is ' + repr(r5x5.center)) # result is (2,2) = exact\nr6x6 = pygame.Rect(0,0,6,6) # a 6x6 rect\nprint('center of 6x6 rect is ' + repr(r6x6.center)) # result is (3,3) = rounded up!\nr7x7 = pygame.Rect(0,0,7,7) # a 7x7 rect\nprint('center of 7x7 rect is ' + repr(r7x7.center)) # result is (3,3) = exact", "user_title": "Dave Burton", "datetimeon": "2011-01-29T20:46:36", "link": "Rect.collidepoint", "id": 3761}, {"content": "(Oops, I added that comment in the wrong place.)", "user_title": "Dave Burton", "datetimeon": "2011-01-29T20:47:58", "link": "Rect.collidepoint", "id": 3762}, {"content": "Rect.center rounds UP:\n\nr0x0 = pygame.Rect(0,0,0,0) # a 0x0 rect\nprint('center of 0x0 rect is ' + repr(r0x0.center)) # result is (0,0) = not in the rect!\nr1x1 = pygame.Rect(0,0,1,1) # a 1x1 rect\nprint('center of 1x1 rect is ' + repr(r1x1.center)) # result is (0,0) = correct\nr2x2 = pygame.Rect(0,0,2,2) # a 2x2 rect\nprint('center of 2x2 rect is ' + repr(r2x2.center)) # result is (1,1) = rounded up!\nr3x3 = pygame.Rect(0,0,3,3) # a 3x3 rect\nprint('center of 3x3 rect is ' + repr(r3x3.center)) # result is (1,1) = exact\nr4x4 = pygame.Rect(0,0,4,4) # a 4x4 rect\nprint('center of 4x4 rect is ' + repr(r4x4.center)) # result is (2,2) = rounded up!\nr5x5 = pygame.Rect(0,0,5,5) # a 5x5 rect\nprint('center of 5x5 rect is ' + repr(r5x5.center)) # result is (2,2) = exact\nr6x6 = pygame.Rect(0,0,6,6) # a 6x6 rect\nprint('center of 6x6 rect is ' + repr(r6x6.center)) # result is (3,3) = rounded up!\nr7x7 = pygame.Rect(0,0,7,7) # a 7x7 rect\nprint('center of 7x7 rect is ' + repr(r7x7.center)) # result is (3,3) = exact", "user_title": "Dave Burton", "datetimeon": "2011-01-29T20:48:50", "link": "pygame.Rect", "id": 3763}, {"content": "This documentation is incorrect. A point along the right or bottom edge IS\nwithin the Rect, and points at coordinates on the bottom or right edge DO\ncollide with the Rect.\n\nHere's proof:\n\nr = Rect(0,0, 4,4) # a 4x4 rectangle\nprint('0,0: ' + repr(r.collidepoint(0,0)))\nprint('1,1: ' + repr(r.collidepoint(1,1)))\nprint('2,2: ' + repr(r.collidepoint(2,2)))\nprint('3,3: ' + repr(r.collidepoint(3,3)))\nprint('4,4: ' + repr(r.collidepoint(4,4)))\n\nWith pygame 1.9.1 under both Python 3.1 and 2.6, it prints:\n\n0,0: 1\n1,1: 1\n2,2: 1\n3,3: 1\n4,4: 0\n\nNote that the bottom-right pixel within the 4x4 rect is at (3,3) and\ncollidepoint((3,3)) does return 1 (meaning true).\n\nA second (minor) documentation error is that it actually returns an integer\n1 or 0 instead of boolean True or False.", "user_title": "Dave Burton", "datetimeon": "2011-01-29T22:35:18", "link": "Rect.collidepoint", "id": 3764}, {"content": "This class is a bit odd. Event objects have no event.__dict__ attribute,\nand the dir(event) function doesn't work. However, repr(event) returns a\nnice, thorough description of an event object and its attributes, and the\nevent.dict attribute lists all the important attributes except .type and\n.dict itself.", "user_title": "Dave Burton", "datetimeon": "2011-02-07T04:48:40", "link": "pygame.event", "id": 3774}, {"content": "With a Microsoft IntelliMouse p/n X05-77975, under Windows Vista,\nwith either Python 2.6 or 3.1, the button numbers are:\n1 = left button\n2 = center button/wheel press\n3 = right button\n4 = wheel roll forward/up\n5 = wheel roll backward/down\n6 = left side extra button\n7 = right side extra button", "user_title": "Dave Burton", "datetimeon": "2011-02-23T21:04:46", "link": "pygame.event", "id": 3794}, {"content": "There's a cursor missing! sizer_xy_strings defines an upper-left-to-lower-right\nresizer cursor, suitable for dragging the upper-left or lower-right corner.\nBut there's no sizer_yx_strings to make the upper-right-to-lower-left cursor.\nHere's how I made one:\n\nsizer_yx_strings = [ x[12::-1]+x[13:] for x in pygame.cursors.sizer_xy_strings ]", "user_title": "Dave Burton", "datetimeon": "2011-02-24T02:08:27", "link": "pygame.cursors", "id": 3795}, {"content": "Or, equivalently:\n\nsizer_yx_strings = ( #sized 24x16\n \" XXXXXXXX \",\n \" X.....X \",\n \" X....X \",\n \" X...X \",\n \" X.X..X \",\n \" X.X X.X \",\n \"X X.X XX \",\n \"XX X.X X \",\n \"X.XX.X \",\n \"X...X \",\n \"X...X \",\n \"X....X \",\n \"X.....X \",\n \"XXXXXXXX \",\n \" \",\n \" \",\n)", "user_title": "Dave Burton", "datetimeon": "2011-02-24T02:13:59", "link": "pygame.cursors", "id": 3796}, {"content": "The Sound function now accepts 'buffer', 'file', and 'array' keyword arguments\nto remove any ambiguity in how to treat an argument. The 'array' keyword is new,\nand tells Sound to look check the argument for an array struct interface or\nthe new buffer protocol if supported. This allows Sound to function like\nsndarray.make_sound.\n\nSound also exposes an array struct interface and the new buffer protocol.", "user_title": "Lenard Lindstrom", "datetimeon": "2011-03-01T13:26:33", "link": "pygame.mixer.Sound", "id": 3799}, {"content": "I'm not sure which version of Pygame is being used here, 1.9? At the time it was\nreleased NumPy was unavailable for Python 3.1. Python 1.9.2 alpha from SVN\ncertainly does support NumPy for Python 3.1, and 3.2.", "user_title": "Lenard Lindstrom", "datetimeon": "2011-03-01T13:35:12", "link": "pygame.surfarray", "id": 3800}, {"content": "That should be \"which version of Pygame is being used here, 1.9.1?\"", "user_title": "Lenard Lindstrom", "datetimeon": "2011-03-01T13:37:12", "link": "pygame.surfarray", "id": 3801}, {"content": "New to Pygame 1.9.2 for NumPy: pixels_red, pixels_green, and pixels_blue.", "user_title": "Lenard Lindstrom", "datetimeon": "2011-03-01T13:38:40", "link": "pygame.surfarray.pixels_alpha", "id": 3802}, {"content": "For the KEYDOWN and KEYUP event \"scancode\" is also a member and can be used \nfor the unknown keys", "user_title": "Daniel Kaminsky", "datetimeon": "2011-03-23T05:51:58", "link": "pygame.event", "id": 3872}, {"content": "The wheel generates pygame.MOUSEBUTTONUP events too, not just pygame.MOUSEBUTTONDOWN event.", "user_title": "Dan Ross", "datetimeon": "2011-04-02T23:30:45", "link": "pygame.mouse", "id": 3884}, {"content": "Forget what the functions do, check out Mr. Brown's naming style. Its pure genius!\n1) angle_times_WOW_pi_divided_by_180\n2) HE_HE_strange_popper_z\n3) buffy_the_fat2\n4) they_did_touch\n5) while Grr < LIN_collide_max:\n6) Rotated_Relate_ball1_z__PLUS__Rotated_ball1_zol\n7) write_to_file_WEEE_STRANGE()\n8) freaky_rect_switcharoo_2D()", "user_title": "Mad Cloud Games", "datetimeon": "2011-04-03T18:28:23", "link": "pygame.draw.circle", "id": 3885}, {"content": "If you like to receive the inner rectangle, the blit is a much better setup. \nThe following comparing examples show how-to cut a (centered) 150x150 frame out of a 250x250 image:\norig_surf = pygame.Surface((250,250),flags=pygame.SRCALPHA)\npygame.draw.circle(orig_surf,(255,0,0),(50,50),25)\npygame.draw.circle(orig_surf,(0,255,0),(50,200),25)\npygame.draw.circle(orig_surf,(0,0,255),(200,50),25)\npygame.draw.circle(orig_surf,(0,255,255),(200,200),25)\n\ncrop_surf = pygame.transform.chop(pygame.transform.chop(orig_surf,(0,0,50,50)),(150,150,250,250))\npygame.image.save(crop_surf, 'test-crop.png')\n\n\ncrop_surf = pygame.Surface((150,150),flags=pygame.SRCALPHA)\ncrop_surf.blit(orig_surf, (0,0),(50,50,200,200))\npygame.image.save(crop_surf, 'test-blit.png')", "user_title": "Rick van der Zwet", "datetimeon": "2011-05-05T04:36:44", "link": "pygame.transform.chop", "id": 4045}, {"content": "It all seemed simple and working properly, then I noticed... \"The area covered by a Rect does not include the right- and bottom-most edge of pixels. If one Rect's bottom border is another Rect's top border (i.e., rect1.bottom=rect2.top), the two meet exactly on the screen but do not overlap, and rect1.colliderect(rect2) returns false.\"\n\n*mutter* good to know.", "user_title": "Anonymous", "datetimeon": "2011-01-10T19:28:58", "link": "Rect.colliderect", "id": 3725}, {"content": "Note that when the user resizes the game window, pygame does not automatically update its internal screen surface. You must call set_mode() every time VIDEORESIZE is sent. This really should be more clear in the documentation.", "user_title": "Anonymous", "datetimeon": "2011-01-11T15:55:57", "link": "pygame.display", "id": 3726}, {"content": "Is it possible to set this mode transparent?\nI mean without changing the transparency with set_alpha or ... but from the beginning.", "user_title": "Anonymous", "datetimeon": "2011-01-13T08:28:22", "link": "pygame.display.set_mode", "id": 3727}, {"content": "Draw a normal thick line, then draw two aa lines either side. Not exactly what you want but it will work.", "user_title": "Anonymous", "datetimeon": "2011-01-13T15:22:43", "link": "pygame.draw.aaline", "id": 3728}, {"content": "This code fixes the bad rect given by the line function.\n\ntemprect=(pygame.draw.line(screen,color,firstpos,newpos,thick))\ntemprect.inflate_ip(thick*2, thick*2)\ndirty.append(temprect)", "user_title": "Anonymous", "datetimeon": "2005-11-22T22:22:44", "link": "pygame.draw.line", "id": 8}, {"content": "if your rect contains a negative width or height you need to rect.normalize() your rect before passing it to this function", "user_title": "Anonymous", "datetimeon": "2005-11-27T22:45:10", "link": "pygame.draw.ellipse", "id": 13}, {"content": "Rotates image about its center.", "user_title": "Anonymous", "datetimeon": "2005-11-28T19:22:44", "link": "pygame.transform.rotate", "id": 14}, {"content": "Make sure you blit according to the center of the newly formed surface, and not what the center of the orginal image is.", "user_title": "Anonymous", "datetimeon": "2005-11-28T19:24:48", "link": "pygame.transform.rotate", "id": 15}, {"content": "This probably goes without saying, but always rotate the orginal image, not a rotated copy.", "user_title": "Anonymous", "datetimeon": "2005-11-28T19:26:45", "link": "pygame.transform.rotate", "id": 16}, {"content": "Before calling pygame.key.get_pressed(), one should call pygame.event.pump() to get the lates state of the keyboard.\n\nThis is so because the get_pressed() function wraps the SDL_GetKeyState() function and in the SDL_GetKeyState() documentation it is written that one should use SDL_PumpEvents() to update the state array and pygame.event.pump() just happens to be a wrapper for SDL_PumpEvents() :-)", "user_title": "Anonymous", "datetimeon": "2005-12-01T10:30:49", "link": "pygame.key.get_pressed", "id": 18}, {"content": "When I tryed to use this, he couldn't find the key K_t I wanted\n untill I used:\n\nfrom pygame.locals import *\n\nSo be sure to use it - Shefy", "user_title": "Anonymous", "datetimeon": "2005-12-07T04:09:33", "link": "pygame.key.get_pressed", "id": 19}, {"content": "if you pass in None as the background argument, you get the error\n\"TypeError: Invalid background RGBA argument\"", "user_title": "Anonymous", "datetimeon": "2005-12-10T19:21:13", "link": "Font.render", "id": 22}, {"content": "pygame.event.pump()\n m = pygame.key.get_mods()\n if m & KMOD_SHIFT:\n print 'shift pressed'", "user_title": "Anonymous", "datetimeon": "2005-12-25T19:36:47", "link": "pygame.key.get_pressed", "id": 32}, {"content": "Rotated objects tend to move around because bounding rectangle changes size.\nStore the center in a temporary variable, then rotate the original image, and finally reset the center before you blit or update\nThis code comes from a sprite class:\n\n def turn(self, amount):\n \"turn some amount\"\n oldCenter = self.rect.center\n self.dir += amount\n self.image = pygame.transform.rotate(self.baseImage, self.dir)\n self.rect = self.image.get_rect()\n self.rect.center = oldCenter", "user_title": "Anonymous", "datetimeon": "2006-01-03T09:48:09", "link": "pygame.transform.rotate", "id": 36}, {"content": "This effect (1 + 3 = 2) is caused by your X.org/XServer mouse configuration section, which allows to emulate the middle button by clicking both the left and right mouse button at the same time.", "user_title": "Anonymous", "datetimeon": "2006-01-04T09:16:25", "link": "pygame.mouse.get_pressed", "id": 37}, {"content": "This does not result in 'truly' transparent text, as the area between the letters is filled in with the background color. For truly transparent text with an invisible background behind the letters, use Numeric:\n\ndef RenderTransparent(font, text, antialias=1, color=(255, 0, 0, 0)):\n 'Render text with transparency underneath the letters'\n 'Requires Numeric'\n\n # Create a colored block big enough to hold the text\n w, h = font.size(text)\n surface = pygame.Surface((w, h), pygame.SRCALPHA)\n surface.fill(color)\n \n # Create an alpha channel that contains the shapes of the letters\n alpha = pygame.Surface((w, h), pygame.SRCALPHA)\n WHITE = (255, 255, 255, 0)\n BLACK = (0, 0, 0, 0)\n a = font.render(text, antialias, WHITE, BLACK)\n alpha.blit(a, (0, 0))\n \n # Combine the alpha channel with the colored block\n pic = surface.convert_alpha()\n mask = alpha.convert(32)\n mskarray = pygame.surfarray.pixels3d(mask)\n pygame.surfarray.pixels_alpha(pic)[:, :] = mskarray[:, :, 0]\n\n # Return the 'truly' transparent text.\n return pic", "user_title": "Anonymous", "datetimeon": "2006-01-17T14:45:02", "link": "Font.render", "id": 41}, {"content": "LOL", "user_title": "Anonymous", "datetimeon": "2011-01-03T19:03:40", "link": "PixelArray.replace", "id": 3700}, {"content": "FUCKING SPAMMER MOTHER FUCKERS WHO OWNS THIS SHIT THEY SHOULD BURN IN HELLL", "user_title": "Anonymous", "datetimeon": "2011-01-03T19:05:09", "link": "pygame.locals", "id": 3701}, {"content": "On my Windows Vista machine running Python 3.1.2 and pygame 1.9.1,\nthe 'black=' and 'white=' parameters are swapped.\n\nSo, to make the example work (with a black arrow outline\naround a white center), you have to do this:\n\nthickarrow_strings = ( #sized 24x24\n \"XX \",\n \"XXX \",\n \"XXXX \",\n \"XX.XX \",\n \"XX..XX \",\n \"XX...XX \",\n \"XX....XX \",\n \"XX.....XX \",\n \"XX......XX \",\n \"XX.......XX \",\n \"XX........XX \",\n \"XX........XXX \",\n \"XX......XXXXX \",\n \"XX.XXX..XX \",\n \"XXXX XX..XX \",\n \"XX XX..XX \",\n \" XX..XX \",\n \" XX..XX \",\n \" XX..XX \",\n \" XXXX \",\n \" XX \",\n \" \",\n \" \",\n \" \")\n\ndatatuple, masktuple = pygame.cursor.compile( thickarrow_strings,\n black='.', white='X', xor='o' )\npygame.mouse.set_cursor( (24,24), (0,0), datatuple, masktuple )", "user_title": "Anonymous", "datetimeon": "2011-01-04T09:45:11", "link": "pygame.cursors.compile", "id": 3702}, {"content": "I'm using this generator to get a channel id for each sprite:\n\ndef free_sound_channel():\n \"\"\"Get next available sound channel\n Usage:\n free_channels=free_sound_channel()\n id=free_channels.next()\n \"\"\"\n id=0\n while id<pygame.mixer.get_num_channels():\n yield id\n id+=1\n return # or: raise StopIteration()", "user_title": "Anonymous", "datetimeon": "2006-01-29T16:18:15", "link": "pygame.mixer.Channel", "id": 49}, {"content": "COLORKEY and ALPHA should have 'SRC' prefixed to them. Here is a more-complete list of flags revelvant to surface.get_flags():\n,\"SRCCOLORKEY\"\n,\"RLEACCEL\"\n,\"RLEACCELOK\"\n,\"PREALLOC\"\n,\"HWACCEL\"\n,\"SRCALPHA\"\n,\"UYVY_OVERLAY\"\n,\"YV12_OVERLAY\"\n,\"YVYU_OVERLAY\"\n,\"YUY2_OVERLAY\"\n,\"HWPALETTE\"\nSWSURFACE - not really usable as a surface flag, equates to 0 and is always default\nANYFORMAT - used to create surfaces, pygame defaults to this flag if you don't specifya bit depth\nHWACCEL - surface is hardware accelerated, readonly\nSRCCOLORKEY- surface has a colorkey for blits, readonly\nSRCALPHA - surface has alpha enabled, readonly\nRLEACCELOK - surface is rle accelerated, but hasn't been compiled yet, readonly\nPREALLOC - not even sure?\nHope this helps....", "user_title": "Anonymous", "datetimeon": "2006-02-07T21:37:24", "link": "Surface.get_flags", "id": 52}, {"content": "I wish all the possible flags were documented here...", "user_title": "Anonymous", "datetimeon": "2006-02-07T22:02:57", "link": "pygame.Surface", "id": 53}, {"content": "I don't know what is wrong with you two. I tested the following and it worked as expected. Perhaps it is because I tested it on windows, if you tested it somewhere else (of course that's not the likely cause but I really can't see what else is wrong).\n\nIt is true that passing None for the final argument causes \"Invalid RGBA argument\". This is a bug in the documentation, not the code. The proper way to get transparency is to simply omit the last argument.\n\n$python\n>>>import pygame\n>>>pygame.init()\n>>>screen = pygame.display.set_mode((300,300))\n>>>screen.fill((255,0,0))\n>>>pygame.display.flip()\n\n>>>font = pygame.font.SysFont(\"Times New Roman\",30)\n>>>s = font.render(\"Eggs are good for you, but not on the eiffel tower\",True,(0,255,255))\n>>>s.get_flags() #-> 65536 [SRCALPHA].. good, implies the image has per-pixel transparency\n>>>[s.get_at((i,j)) for i in range(20) for j in range(20)]\n[.... #here we see that indeed each\n(0,255,255,68) #pixel is a full RGBA pixel with 4\n....] #components.\n>>>screen.blit(s, (0,0))\n>>>pygame.display.flip()\n>>>pygame.event.pump() #in order to bring the window back to life...\n\nAnd the result is turquoise text with red in the background, clearly showing transparency. Phew, you had me worried there, thinking I couldn't do transparency with this... until I looked closer. These docs are shiny but can be very hard to read sometimes.", "user_title": "Anonymous", "datetimeon": "2006-02-08T02:29:13", "link": "Font.render", "id": 54}, {"content": "Here's another solution for creating surfaces with per-pixel-alpha:\n\nimage = pygame.Surface((width,height),pygame.SRCALPHA,32);\n\nAdding the depth argument '32' seems to make this work every time.", "user_title": "Anonymous", "datetimeon": "2006-02-21T15:49:19", "link": "pygame.Surface", "id": 58}, {"content": "In the documentery it says \"The antialias argument is a boolean, if true the \ncharacters will have smooth edges.\". If you pass a string as the antialias \nargument it raises an exception saying \"TypeError: an integer is required\". This\nis very confusing. It should raise \"TypeError: a boolean is required\". \nIf antialias is enabled it will greatly drop the framerate (from 100 to 33 on my\nmachine). Font.render should be called only for as many times as you need fonts.\nDo not call this function every gameloop for it will greatly drop the framerate.\n(this cost me about 2 houres of debugging to find out.)\nIf any admins read this: Please change the script so that long lines will be seperated to shorter lines. Those 500+ words lines are uncomfortable to read with all that scrolling. mfg nwp.", "user_title": "Anonymous", "datetimeon": "2006-03-05T13:28:14", "link": "Font.render", "id": 61}, {"content": "you may want to initalise the \ndifferent modules seperately\nto speed up your program. Of \ncourse, then you would need \nto know which modules you have\ninitalised and which ones you\nhave not.", "user_title": "Anonymous", "datetimeon": "2006-03-08T22:55:41", "link": "pygame.init", "id": 64}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-30T07:59:42", "link": "Hope to find some more useful information on your site! It is really great!", "id": 196}, {"content": "format of music files\non cds are (usualy) in\nCD Digital Audio, except\nsometimes a program will\nmake a cd useing a \ndifferent format, so \npygame.cdrom.CD(n).play()\nwill maby not play it.", "user_title": "Anonymous", "datetimeon": "2006-03-08T23:02:35", "link": "pygame.cdrom", "id": 67}, {"content": "import pygame\nfrom pygame.locals import *\n\npygame.init()\npygame.display.set_mode((300,200))\npygame.display.set_caption('Mouse Input Demonstration')\nrunning = True\nwhile running:\n for event in pygame.event.get():\n if event.type == QUIT:\n running = False\n if event.type == KEYDOWN and event.key == K_ESCAPE:\n running = False\n if event.type == MOUSEBUTTONDOWN:\n print event.button\n\npygame.display.quit()", "user_title": "Anonymous", "datetimeon": "2006-04-02T00:38:08", "link": "pygame.mouse.get_pressed", "id": 82}, {"content": "# An Example from perldude69@gmail.com www.wachadoo.com/forum/\n# CONSTANTS\nSCREEN_WIDTH = 800\nSCREEN_HEIGHT = 600\n#Initialise Game\npygame.init()\nscreen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT))\npygame.display.set_caption('Space Invaders')\nbackground = pygame.image.load('./pics/background1.jpg').convert()\nbackground = pygame.transform.scale(background,( SCREEN_WIDTH, SCREEN_HEIGHT))\nscreen.blit(background, (0,0)) \npygame.display.flip() \ndone = False\nwhile not done:\n\tfor e in pygame.event.get():\n\t\tif e.type == KEYDOWN:\n\t\t\tdone = True\nif __name__ == \"__main__\":\n main()", "user_title": "Anonymous", "datetimeon": "2006-04-07T18:04:11", "link": "pygame.transform.scale", "id": 84}, {"content": "Don't specify flags unless you absolutely *must* (that is, don't specify HWSURFACE, depth=32 just because you think it's a good idea). This will reduce the portability of your game.", "user_title": "Anonymous", "datetimeon": "2006-06-13T21:27:25", "link": "pygame.display.set_mode", "id": 98}, {"content": "Could someone please post the integer values corresponding to the various shift/ctl/alt keys? Or provide a link.\nthank you!", "user_title": "Anonymous", "datetimeon": "2006-12-18T16:29:25", "link": "pygame.key.get_mods", "id": 183}, {"content": "numpy is fine in Python 3.1.2. However, pygame.surfarray doesn't work\nat all in pygame-1.9.1.win32-py3.1.msi with python-3.1.2.msi and\nnumpy-1.5.1-win32-superpack-python3.1.exe under Windows Vista.\n\nTo see the problem, just run the test that comes with it; 4 of 14 tests fail:\n\nC:\\>cd \\python31\\lib\\site-packages\\pygame\\tests\n\nC:\\Python31\\Lib\\site-packages\\pygame\\tests>\\python31\\python surfarray_test.py\nEE.EE.........\n======================================================================\nERROR: test_array2d (__main__.SurfarrayModuleTest)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"surfarray_test.py\", line 147, in test_array2d\n arr = pygame.surfarray.array2d(surf)\n File \"C:\\python31\\lib\\site-packages\\pygame\\surfarray.py\", line 104, in array2d\n return numpysf.array2d (surface)\n File \"C:\\python31\\lib\\site-packages\\pygame\\_numpysurfarray.py\", line 77, in array2d\n data = ''.join (pattern.findall (data))\nTypeError: can't use a string pattern on a bytes-like object\n[...snip...]", "user_title": "Anonymous", "datetimeon": "2011-01-07T03:47:28", "link": "pygame.surfarray", "id": 3704}, {"content": "no fill?", "user_title": "Anonymous", "datetimeon": "2006-11-19T14:38:36", "link": "pygame.draw.arc", "id": 163}, {"content": "works perfectly fine for me... question: what's the name of the overloaded operator that does the pxarray[x,y] subscripting?", "user_title": "Anonymous", "datetimeon": "2010-12-23T18:28:10", "link": "pygame.PixelArray", "id": 3689}, {"content": "pygame.cursors.ball is also a cool one.", "user_title": "Anonymous", "datetimeon": "2010-12-28T16:21:48", "link": "pygame.cursors", "id": 3690}, {"content": "Its a success/failure scenario. It returns True (1) if it went well.", "user_title": "Anonymous", "datetimeon": "2010-12-30T05:47:55", "link": "pygame.display.toggle_fullscreen", "id": 3691}, {"content": "These appear to be in degrees rather than radians (different than how draw.arc()'s are specified) which is kind of inconsistent. Are these documented better elsewhere?", "user_title": "Anonymous", "datetimeon": "2011-01-01T15:04:01", "link": "pygame.gfxdraw.pie", "id": 3694}, {"content": "You need to put\nimport pygame\nat the top of your program, anonymous.", "user_title": "Anonymous", "datetimeon": "2011-01-02T07:03:47", "link": "pygame.display", "id": 3695}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-28T17:27:45", "link": "Looking for information and found it at this great site...", "id": 188}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-29T02:41:08", "link": "I love the whiiite suits! Great show!", "id": 189}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-29T10:09:22", "link": "Thank you for your site. I have found here much useful information...", "id": 190}, {"content": "I had this weird thing where blue/red was inversed, but not the other colours, when I was mapping some pixels from one image to a blank surface.\nIt was caused by copying the color integer directly to one pixel to the other, so the trick is to always surface.unmap_rgb(pixel) before setting the color to a new pixel", "user_title": "Anonymous", "datetimeon": "2010-12-13T21:22:42", "link": "pygame.PixelArray", "id": 3685}, {"content": ".", "user_title": "Anonymous", "datetimeon": "2010-12-17T14:01:47", "link": "Movie.play", "id": 3687}, {"content": "import pygame, sys\nfrom pygame.version import ver\nprint (\"pygame \", ver)\nstartstate = pygame.init()\nprint (\"{pygame.init()}\", startstate)\nscreen = pygame.display.set_mode([640, 480])\nprint (\"{pygame.display.set_mode([640, 480]}\", screen)\nwhile True:\n for event in pygame.event.get():\n if not event:\n print (\"Event processing error: cannot find event.\")\n elif event.type == pygame.QUIT or event.type == pygame.K_ESCAPE:\n print (\"{for event in pygame.event.get():} : \", event)\n sys.exit()\nsys.exit() command does not run when I press escape, all it does is the same as if not event.", "user_title": "Anonymous", "datetimeon": "2010-12-18T17:09:49", "link": "pygame.key", "id": 3688}, {"content": "It the range for H should only be [0, 360); at exactly 360 the expression throws an OverflowError. The other ranges are not affected as such.", "user_title": "Anonymous", "datetimeon": "2010-12-08T17:55:35", "link": "Color.hsva", "id": 3677}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-30T22:35:22", "link": "Very cool design! Useful information. Go on!", "id": 202}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-31T05:52:59", "link": "Very interesting! site. A must bookmark! I wait for continuation", "id": 203}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-31T13:03:40", "link": "Very interesting! site. A must bookmark! I wait for continuation", "id": 204}, {"content": "", "user_title": "Anonymous", "datetimeon": "2006-12-31T19:55:09", "link": "Just wanted to say you have some happyY looking walkers. All natural!", "id": 205}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-01T16:59:55", "link": "You have an outstanding good and well structured site. I enjoyed browsing through it.", "id": 208}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-02T00:19:19", "link": "I love the whiiite suits! Great show!", "id": 211}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-02T15:12:24", "link": "Hope to find some more useful information on your site! It is really great!", "id": 212}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-02T22:17:19", "link": "Just wanted to say you have some happyY looking walkers. All natural!", "id": 213}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-03T05:35:22", "link": "You have a great site. All in your web is very useful. Please keep on working.", "id": 214}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-03T12:53:55", "link": "Pretty nice site, wants to see much more on it! :)", "id": 215}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-03T20:02:38", "link": "You have an outstanding good and well structured site. I enjoyed browsing through it.", "id": 216}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-04T18:10:07", "link": "This site is asomeee, well done, thanks for all!", "id": 218}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-01-05T01:15:13", "link": "Very nice site. Keep up the great work.", "id": 219}, {"content": "Left:\nctrl 4160 \nshift 4097 \nalt 4352 \n\nRight:\nctrl 4224\nshift 4098\nalt 4608\n\nLeft:\nc+s 4161\nc+a 4416\na+s 4353\n\nRight:\nc+s 4226\nc+a 4736\na+s 4610\n\nDone by hand ;)\n\n-Jabapyth", "user_title": "Anonymous", "datetimeon": "2007-01-29T17:22:04", "link": "pygame.key.get_mods", "id": 316}, {"content": "Depending on your keyboard there may be limitations of how many simultaneous keypresses can be detected by this command. Some combinations will work on one keyboard and not on another.", "user_title": "Anonymous", "datetimeon": "2007-02-08T19:53:05", "link": "pygame.key.get_pressed", "id": 335}, {"content": "Just use the same line width as your radius.\nThis of course dosn't solve your problem if you want a border on your arc, but then you can just paint twice.", "user_title": "Anonymous", "datetimeon": "2007-02-26T18:27:17", "link": "pygame.draw.arc", "id": 374}, {"content": "It looks like width is not a keyword argument, but a required/positional/whatever one instead.\n\n>>> pygame.draw.line(surf, color, (x1, y1), (x2, y2), width=width)\nTraceback (most recent call last):\n File \"\", line 1, in ?\nTypeError: line() takes no keyword arguments\n>>> pygame.draw.line(surf, color, (x1, y1), (x2, y2))\n\n>>> pygame.draw.line(surf, color, (x1, y1), (x2, y2), 1)", "user_title": "Anonymous", "datetimeon": "2007-03-01T11:28:42", "link": "pygame.draw.line", "id": 386}, {"content": "first number = top left rectangle x coordinate\nsecond number = top left rectangle y coordinate\nthird number = width of rectangle\nfourth number = length of rectangle", "user_title": "Anonymous", "datetimeon": "2007-03-03T16:39:29", "link": "pygame.draw.rect", "id": 400}, {"content": "If you want to make a deep copy of a Rect object (without importing the copy module)\nthen you can do so by calling move with the arguments (0,0).", "user_title": "Anonymous", "datetimeon": "2008-01-04T00:22:04", "link": "Rect.move", "id": 1359}, {"content": "the forth numer is the height of the rect", "user_title": "Anonymous", "datetimeon": "2007-03-11T20:32:13", "link": "pygame.draw.rect", "id": 434}, {"content": "The documentation is incorrect. pygame.mixer.music(5) will indeed play the music five times, not six. Perhaps the function used to behave differently, but I can find nothing in the documentation for either pygame or SDL_mixer that suggests so.", "user_title": "Anonymous", "datetimeon": "2007-03-19T15:33:19", "link": "pygame.mixer.music.play", "id": 440}, {"content": "I meant to say pygame.mixer.music.play(5), of course. I left out the \"play\" part.", "user_title": "Anonymous", "datetimeon": "2007-03-19T15:34:19", "link": "pygame.mixer.music.play", "id": 441}, {"content": "Properties in the object returned by get_rect():\n\nbottom\nbottomleft\nbottomright\ncenter\ncenterx\ncentery\nclamp\nclamp_ip\nclip\ncollidedict\ncollidedictall\ncollidelist\ncollidelistall\ncollidepoint\ncolliderect\ncontains\nfit\nh\nheight\ninflate\ninflate_ip\nleft\nmidbottom\nmidleft\nmidright\nmidtop\nmove\nmove_ip\nnormalize\nright\nsize\ntop\ntopleft\ntopright\nunion\nunion_ip\nunionall\nunionall_ip\nw\nwidth\nx\ny", "user_title": "Anonymous", "datetimeon": "2007-03-23T00:10:38", "link": "Surface.get_rect", "id": 446}, {"content": "i've noticed the loop functionality to be iffy for certain wave files (an audible gap between each loop). from what i can tell, it looks like this happens with stereo wave files, but i'm not completely sure. the mono waves i try to loop play as expected", "user_title": "Anonymous", "datetimeon": "2008-01-04T23:39:18", "link": "pygame.mixer.music.fadeout", "id": 1365}, {"content": "i've noticed the loop functionality to be iffy for certain wave files (an audible gap between each loop). from what i can tell, it looks like this happens with stereo wave files, but i'm not completely sure. the mono waves i try to loop play as expected (i accidentally added this comment to fadeout(), sorry)", "user_title": "Anonymous", "datetimeon": "2008-01-04T23:39:59", "link": "pygame.mixer.music.play", "id": 1366}, {"content": "what about osx? is macosx working?", "user_title": "Anonymous", "datetimeon": "2007-03-25T15:39:01", "link": "pygame.display.init", "id": 448}, {"content": "omg, you should really use the KMOD_ constants here", "user_title": "Anonymous", "datetimeon": "2007-03-28T15:20:15", "link": "pygame.key.get_mods", "id": 451}, {"content": "In 1.7.1, the behaviour when None is passed in is NOT reversed. pygame.event.set_allowed(None) will BLOCK all events.", "user_title": "Anonymous", "datetimeon": "2007-04-01T20:22:29", "link": "pygame.event.set_allowed", "id": 457}, {"content": "just do:\nimg = pygame.image.load(\"<>\").convert()\n\n-harry666t", "user_title": "Anonymous", "datetimeon": "2007-04-03T12:22:16", "link": "pygame.draw", "id": 463}, {"content": "BTW, Those values gotten below are if num-lock is on\nKMOD_NUM == 4096\nKMOD_LSHIFT == 1\nKMOD_RSHIFT == 2\nKMOD_NUM | KMOD_LSHIFT == 4097\nThe simpler way is to use the bitwise AND (&)\n\nkeymods & KMOD_LSHIFT \n\nreturns true (actually 1 in this case) if left shift is pressed, no matter what else is pressed or if num lock is on, or if the planets are aligned correctly.", "user_title": "Anonymous", "datetimeon": "2007-04-03T19:15:04", "link": "pygame.key.get_mods", "id": 466}, {"content": "What is the definition of the key and mod members of KEYDOWN?", "user_title": "Anonymous", "datetimeon": "2007-04-07T05:35:39", "link": "pygame.event", "id": 475}, {"content": "who do i get a reference to a reserved channel? its not channel 0 nor num_channels-1", "user_title": "Anonymous", "datetimeon": "2007-04-07T11:19:42", "link": "pygame.mixer.set_reserved", "id": 476}, {"content": "\"does not work with current release\". Which release is that? Is the information valid?", "user_title": "Anonymous", "datetimeon": "2007-04-18T13:12:55", "link": "pygame.movie", "id": 497}, {"content": "FLAC support would be cool", "user_title": "Anonymous", "datetimeon": "2007-11-19T06:00:08", "link": "pygame.mixer.Sound", "id": 1142}, {"content": "fadeout does not block in linux either", "user_title": "Anonymous", "datetimeon": "2008-01-01T21:41:36", "link": "pygame.mixer.music.fadeout", "id": 1351}, {"content": "Watch out for this one, it has a major twist:\n(x,y) are coordinates in the referential of the rectangle.\nFor instance:\n>>> import pygame\n>>> r = pygame.Rect(32,32,132,132)\n>>> r.collidepoint(140,140)\n1", "user_title": "Anonymous", "datetimeon": "2007-04-20T17:57:54", "link": "Rect.collidepoint", "id": 502}, {"content": "Music will be resampled in some cases, not in others. When playing a 44.1kHz MP3, the default 22050 frequency works, but a 48kHz mp3 plays in less than half speed - 48000 or 24000 works then.\nTo handle this behaviour, you have to know the sample rate of your music files before playing them, and can't switch smoothly. Big bummer.", "user_title": "Anonymous", "datetimeon": "2008-01-13T07:45:26", "link": "pygame.mixer.music.play", "id": 1406}, {"content": "# This should draw a square with a hight of 20 pixels on a Surface:\nheight = 20\npygame.draw.rect(Surface, (255, 255, 255), (0, 0, height, height))", "user_title": "Anonymous", "datetimeon": "2007-12-06T15:43:11", "link": "pygame.draw.rect", "id": 1220}, {"content": "Anonymous[0], that's nonsense. The x,y coords are absolute coordinates. To illustrate:\n\n>>> r = pygame.rect.Rect(32, 32, 132, 132)\n>>> r.collidepoint(1,1)\n0\n>>> r.collidepoint(32,32)\n1", "user_title": "Anonymous", "datetimeon": "2007-11-23T19:43:53", "link": "Rect.collidepoint", "id": 1153}, {"content": "A little black cross. Mouse cursor is 8*8 Pixel, hotspot is at (4, 4). \nthe cross is (Read Binary):\n00011000 => 24 \n00011000\n00011000\n11100111 => 231\n11100111\n00011000\n00011000\nand has no AND-Mask. \n\npygame.mouse.set_cursor((8, 8), (4, 4), (24, 24, 24, 231, 231, 24, 24, 24), (0, 0, 0, 0, 0, 0, 0, 0))", "user_title": "Anonymous", "datetimeon": "2007-11-26T11:20:04", "link": "pygame.mouse.set_cursor", "id": 1157}, {"content": "excellent comments!\njorgen", "user_title": "Anonymous", "datetimeon": "2007-11-26T19:56:49", "link": "Surface.fill", "id": 1158}, {"content": "True. set_allowed(None) blocks all event types.\n\n- Another (initially skeptical) pygame user.", "user_title": "Anonymous", "datetimeon": "2007-11-26T22:35:30", "link": "pygame.event.set_blocked", "id": 1159}, {"content": "The first channels are reserved.\nFor example: pygame.mixer.Channel(0)", "user_title": "Anonymous", "datetimeon": "2007-11-27T12:11:21", "link": "pygame.mixer.set_reserved", "id": 1160}, {"content": "I have found that just watching for joystick events may not provide enough \ngranularity for fast-paced arcade games that require 100 millisecond changes.\nInstead of events, consider polling the status of the axes in the main game loop\n(or whatever your local equivalent is)", "user_title": "Anonymous", "datetimeon": "2007-12-08T11:08:32", "link": "pygame.joystick", "id": 1230}, {"content": "Actually, on my system [Ubunty Gutsy] it returned a list of None:\n>>> import pygame\n>>> pygame.font.get_fonts()\n[None]", "user_title": "Anonymous", "datetimeon": "2007-12-12T08:11:00", "link": "pygame.font.get_fonts", "id": 1242}, {"content": "How do you draw squares in pygame??", "user_title": "Anonymous", "datetimeon": "2007-11-29T13:19:20", "link": "pygame.draw.rect", "id": 1171}, {"content": "\"... will only effect the smaller area\" is probably meant to read \"... will only affect the smaller area\"", "user_title": "Anonymous", "datetimeon": "2007-12-20T07:32:23", "link": "pygame.Surface", "id": 1290}, {"content": "# Matthew N. Brown copyright 2007\n\n# Here is an example program in wich\n# balls hit walls and other balls:\n#\n# This program draws circles using: pygame.draw.circle\n#\n# You can copy this program on to\n# your own computer and run it.\n#\n\nimport os, sys\n\n ## INIT STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\ndef HE_HE_init():\n global screen, big_black_rect, APPLICATION_w_size, APPLICATION_z_size\n global WOW_pi_divided_by_180, WOW_180_divided_by_pi\n pygame.init()\n random.seed()\n APPLICATION_w_size = 700\n APPLICATION_z_size = 500\n ##### To close window while in fullscreen, press Esc while holding shift. #######\n screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size))\n #screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), FULLSCREEN)\n pygame.display.set_caption(\"They bwounce off bwalls? Matthew N. Brown copyright 2007\")\n pygame.mouse.set_visible(1)\n big_black_rect = pygame.Surface(screen.get_size())\n big_black_rect = big_black_rect.convert()\n big_black_rect.fill((0, 0, 0))\n screen.blit(big_black_rect, (0, 0))\n #fonty = pygame.font.Font(None, 36)\n fonty = pygame.font.SysFont(\"Times New Roman\", 25)\n fonty.set_bold(0)\n IMAGEE = fonty.render('Loading . . .', 1, (0, 250, 10))\n screen.blit(IMAGEE, (100, 200)); del IMAGEE\n pygame.display.flip()\n pygame.mixer.init(22050, -16, True, 1024)\n WOW_pi_divided_by_180 = math.pi / 180.0\n WOW_180_divided_by_pi = 180.0 / math.pi\n set_up_key_variables()\n Lets_ROLL()\n ## INIT STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\n\n ## SAVE LEVEL?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\ndef write_to_file_WEEE_STRANGE(file_namey, data):\n noq = '\\n'\n filey = open(file_namey, 'w')\n for d in data:\n filey.write( str(d) + noq)\n ## SAVE LEVEL?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\n\n ## SMALL FUNCTIONS STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\n ### some functions: ###\ndef distance_2D (w1, z1, w2, z2):\n return math.sqrt(math.pow(float(w1) - float(w2), 2) + math.pow(float(z1) - float(z2), 2))\ndef rect_touching_rect(w1, z1, wol1, zol1, w2, z2, wol2, zol2):\n w2 -= w1\n z2 -= z1\n ww1 = -wol2\n zz1 = -zol2\n return (w2 > ww1 and w2 < wol1 and z2 > zz1 and z2 < zol1)\ndef rect_touching_rect2(w1, z1, wol1, zol1, w2, z2, wol2, zol2):\n w2 -= w1\n z2 -= z1\n ww1 = -wol2\n zz1 = -zol2\n return (w2 >= ww1 and w2 <= wol1 and z2 >= zz1 and z2 <= zol1)\ndef positive(n):\n if n < 0: n = -n; return n\ndef int_randy(range, add):\n return int((random.random() * range) + add)\ndef randy(range, add):\n return (random.random() * range) + add\ndef freaky_rect_switcharoo_2D(pw, pz, pwol, pzol, buffy_the_fat):\n buffy_the_fat2 = buffy_the_fat * 2\n if pwol > 0:\n gw = pw; gwol = pwol\n else:\n gw = pwol + pw; gwol = pw - gw\n if pzol > 0:\n gz = pz; gzol = pzol\n else:\n gz = pzol + pz; gzol = pz - gz\n return [gw - buffy_the_fat, gz - buffy_the_fat, gwol + buffy_the_fat2, gzol + buffy_the_fat2]\ndef points_rotated_by_angle_2D(points_wz, axis_w, axis_z, angle):\n rotated_points_wz = []\n angle = -angle -90\n angle_times_WOW_pi_divided_by_180 = angle * WOW_pi_divided_by_180\n c1 = math.cos(angle_times_WOW_pi_divided_by_180)\n s1 = math.sin(angle_times_WOW_pi_divided_by_180)\n for pointy in points_wz:\n xt = pointy[0] - axis_w\n yt = pointy[1] - axis_z\n rotated_points_wz += [(-xt * s1) + (yt * c1) + axis_w, (-xt * c1) - (yt * s1) + axis_z]\n return rotated_points_wz\ndef point_rotated_by_angle_2D(point_w, point_z, axis_w, axis_z, angle):\n angle = -angle -90\n angle_times_WOW_pi_divided_by_180 = angle * WOW_pi_divided_by_180\n c1 = math.cos(angle_times_WOW_pi_divided_by_180)\n s1 = math.sin(angle_times_WOW_pi_divided_by_180)\n xt = point_w - axis_w\n yt = point_z - axis_z\n return (-xt * s1) + (yt * c1) + axis_w, (-xt * c1) - (yt * s1) + axis_z\ndef arc_tangent_2D(point_w, point_z):\n return math.atan2(point_w, point_z) * WOW_180_divided_by_pi + 180\ndef arc_tangent_2D_2(point_w, point_z):\n return -math.atan2(point_w, point_z) * WOW_180_divided_by_pi + 180\ndef ball_to_ball_wzkol_bounce(V1, m1, V2, m2, ball1_is_to_the_left):\n if (ball1_is_to_the_left and V1 >= V2) or (not ball1_is_to_the_left and V1 <= V2):\n Rv1 = V1 - V2\n Rv2 = 0 #V2 - V2\n NewV1 = ((m1 - m2) / float(m1 + m2)) * float(Rv1) + V2\n NewV2 = (( 2 * m1) / float(m1 + m2)) * float(Rv1) + V2\n return NewV1, NewV2\n else:\n return V1, V2\ndef Find_where_ball_stops_on_line_w(ball_w, ball_z, ball_wol, ball_zol, ball_rad, line_w, line_rad):\n did_collide = False\n totally = ball_rad + line_rad\n b1 = line_w + totally\n b2 = line_w - totally\n New_ball_w = ball_w + ball_wol\n New_ball_z = ball_z + ball_zol\n if ball_w >= b1 and ball_wol < 0 and New_ball_w < b1: New_ball_w = b1; did_collide = True\n elif ball_w <= b2 and ball_wol > 0 and New_ball_w > b2: New_ball_w = b2; did_collide = True\n else:\n if ball_w > b2 and ball_w < b1:\n if ball_w > line_w and ball_wol < 0:\n New_ball_w = ball_w; New_ball_z = ball_z\n did_collide = True\n elif ball_w < line_w and ball_wol > 0:\n New_ball_w = ball_w; New_ball_z = ball_z\n did_collide = True\n return New_ball_w, New_ball_z, did_collide\n New_ball_z = (float(ball_zol) / float(ball_wol) * float(New_ball_w - ball_w)) + float(ball_z)\n return New_ball_w, New_ball_z, did_collide\ndef find_where_ball_collides_on_a_wall(\n ball_w, ball_z,\n ball_wol, ball_zol,\n ball_rad,\n wall_type,\n wall_w1, wall_z1,\n wall_w2, wall_z2,\n wall_rad):\n toetoadly = ball_rad + wall_rad\n did_collide = False\n New_ball_w = ball_w + ball_wol\n New_ball_z = ball_z + ball_zol\n angle_hit_at = None\n Relate_ball_w = ball_w - wall_w1\n Relate_ball_z = ball_z - wall_z1\n Relate_wall_w2 = wall_w2 - wall_w1\n Relate_wall_z2 = wall_z2 - wall_z1\n arc_tangeriney = arc_tangent_2D(Relate_wall_w2, Relate_wall_z2)\n Rotate_Relate_ball_w, Rotate_Relate_ball_z, Rotate_Relate_wall_w2, Rotate_Relate_wall_z2 = points_rotated_by_angle_2D(((Relate_ball_w, Relate_ball_z), (Relate_wall_w2, Relate_wall_z2)), 0, 0, arc_tangeriney)\n Rotate_ball_wol, Rotate_ball_zol = point_rotated_by_angle_2D(ball_wol, ball_zol, 0, 0, arc_tangeriney)\n Rotate_Relate_ball_collide_w, Rotate_Relate_ball_collide_z, did_hit_weird_line = Find_where_ball_stops_on_line_w(Rotate_Relate_ball_w, Rotate_Relate_ball_z, Rotate_ball_wol, Rotate_ball_zol, ball_rad, 0, wall_rad)\n if Rotate_Relate_ball_w > -toetoadly and Rotate_Relate_ball_w < toetoadly:\n HE_HE_strange_popper_z = Rotate_Relate_ball_z\n else:\n HE_HE_strange_popper_z = Rotate_Relate_ball_collide_z\n Rotate_angle_hit_at = None\n if HE_HE_strange_popper_z < Rotate_Relate_wall_z2:\n if ball_is_going_towards_point(Rotate_Relate_ball_w, Rotate_Relate_ball_z, Rotate_ball_wol, Rotate_ball_zol, 0, Rotate_Relate_wall_z2):\n p1_touched, p1_collide_w, p1_collide_z, p1_angle_hit_at = find_where_ball_collides_on_another_ball(Rotate_Relate_ball_w, Rotate_Relate_ball_z, Rotate_ball_wol, Rotate_ball_zol, ball_rad, 0, Rotate_Relate_wall_z2, wall_rad)\n if p1_touched:\n Rotate_Relate_ball_collide_w = p1_collide_w\n Rotate_Relate_ball_collide_z = p1_collide_z\n Rotate_angle_hit_at = p1_angle_hit_at\n did_collide = True\n elif HE_HE_strange_popper_z > 0:\n if ball_is_going_towards_point(Rotate_Relate_ball_w, Rotate_Relate_ball_z, Rotate_ball_wol, Rotate_ball_zol, 0, 0):\n p2_touched, p2_collide_w, p2_collide_z, p2_angle_hit_at = find_where_ball_collides_on_another_ball(Rotate_Relate_ball_w, Rotate_Relate_ball_z, Rotate_ball_wol, Rotate_ball_zol, ball_rad, 0, 0, wall_rad)\n if p2_touched:\n Rotate_Relate_ball_collide_w = p2_collide_w\n Rotate_Relate_ball_collide_z = p2_collide_z\n Rotate_angle_hit_at = p2_angle_hit_at\n did_collide = True\n else:\n if did_hit_weird_line:\n did_collide = True\n if Rotate_Relate_ball_collide_w < 0: Rotate_angle_hit_at = 90\n else: Rotate_angle_hit_at = 270\n if did_collide:\n arc_tangeriney_2 = -arc_tangeriney\n angle_hit_at = Rotate_angle_hit_at + arc_tangeriney\n New_ball_w, New_ball_z = point_rotated_by_angle_2D(Rotate_Relate_ball_collide_w, Rotate_Relate_ball_collide_z, 0, 0, arc_tangeriney_2)\n New_ball_w += wall_w1\n New_ball_z += wall_z1\n return did_collide, New_ball_w, New_ball_z, angle_hit_at #, is_moving_towards\ndef zol_at_angle(wol, zol, angle):\n rotated_wol, rotated_zol = point_rotated_by_angle_2D(wol, zol, 0, 0, angle)\n return rotated_zol\ndef wzol_bounce_at_angle(wol, zol, angle, multi):\n rotated_wol, rotated_zol = point_rotated_by_angle_2D(wol, zol, 0, 0, angle)\n if rotated_zol > 0: rotated_zol = -rotated_zol * multi\n return point_rotated_by_angle_2D(rotated_wol, rotated_zol, 0, 0, -angle)\ndef ball_is_going_towards_point(ball_w, ball_z, ball_wol, ball_zol, point_w, point_z):\n angley = arc_tangent_2D(ball_w - point_w, ball_z - point_z)\n rotated_wol, rotated_zol = point_rotated_by_angle_2D(ball_wol, ball_zol, 0, 0, angley)\n return rotated_zol > 0\ndef find_where_ball_collides_on_another_ball (\n ball1_w, ball1_z,\n ball1_wol, ball1_zol,\n ball1_rad,\n ball2_w, ball2_z,\n ball2_rad\n ):\n totally = ball1_rad + ball2_rad\n dis_from_each_other = math.sqrt(math.pow(float(ball1_w) - float(ball2_w), 2) + math.pow(float(ball1_z) - float(ball2_z), 2))\n if dis_from_each_other < totally:\n angley = arc_tangent_2D(ball1_w - ball2_w, ball1_z - ball2_z)\n return True, ball1_w, ball1_z, angley\n else:\n they_did_touch = False\n New_ball1_w = ball1_w + ball1_wol\n New_ball1_z = ball1_z + ball1_zol\n angle_hit_at = None\n Relate_ball1_w = ball1_w - ball2_w\n Relate_ball1_z = ball1_z - ball2_z\n Relate_ball2_w = 0\n Relate_ball2_z = 0\n arcy_tangeriney = arc_tangent_2D(ball1_wol, ball1_zol)\n Rotated_Relate_ball1_w, Rotated_Relate_ball1_z, Rotated_ball1_wol, Rotated_ball1_zol = points_rotated_by_angle_2D(((Relate_ball1_w, Relate_ball1_z), (ball1_wol, ball1_zol)), 0, 0, arcy_tangeriney)\n did_collidey = False\n if Rotated_Relate_ball1_z > 0 and (Rotated_Relate_ball1_w > -totally and Rotated_Relate_ball1_w < totally):\n Rotated_Relate_ball1_collide_w = Rotated_Relate_ball1_w # + Rotated_ball1_wol\n HE_HE = math.pow(Rotated_Relate_ball1_w, 2) - math.pow(totally, 2)\n if HE_HE < 0: HE_HE = -HE_HE\n Rotated_Relate_ball1_collide_z = math.sqrt(HE_HE)\n Rotated_Relate_ball1_z__PLUS__Rotated_ball1_zol = Rotated_Relate_ball1_z + Rotated_ball1_zol\n if Rotated_Relate_ball1_collide_z < Rotated_Relate_ball1_z__PLUS__Rotated_ball1_zol:\n collision_wol = Rotated_ball1_wol\n collision_zol = Rotated_ball1_zol\n Rotated_Relate_ball1_collide_z = Rotated_Relate_ball1_z__PLUS__Rotated_ball1_zol\n angley_to_hit = None\n else:\n did_collidey = True\n they_did_touch = True\n angley_to_hit = arc_tangent_2D(Rotated_Relate_ball1_collide_w, Rotated_Relate_ball1_collide_z)\n else:\n angley_to_hit = None\n collision_wol = Rotated_ball1_wol\n collision_zol = Rotated_ball1_zol\n Rotated_Relate_ball1_collide_w = Rotated_Relate_ball1_w + Rotated_ball1_wol\n Rotated_Relate_ball1_collide_z = Rotated_Relate_ball1_z + Rotated_ball1_zol\n if did_collidey:\n arcy_tangeriney_2 = -arcy_tangeriney\n angle_hit_at = angley_to_hit + arcy_tangeriney\n New_ball1_w, New_ball1_z = point_rotated_by_angle_2D(Rotated_Relate_ball1_collide_w, Rotated_Relate_ball1_collide_z, 0, 0, arcy_tangeriney_2)\n New_ball1_w += ball2_w\n New_ball1_z += ball2_z\n return they_did_touch, New_ball1_w, New_ball1_z, angle_hit_at #, New_ball1_wol, New_ball1_zol\n ### some functions: ###\n\n ## GRAPHICS STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\ndef chilly_font(size):\n fonti = pygame.font.SysFont(\"Times New Roman\", size)\n return fonti\ndef chilly_font_Italicy(size):\n fonti = pygame.font.SysFont(\"Times New Roman\", size)\n fonti.set_italic(1)\n return fonti\ndef draw_loading_messagey(stringy): # Draw loading message\n pygame.mouse.set_visible(1)\n fonty = chilly_font(26)\n IMAGEE = fonty.render(stringy, 0, (0, 255, 0), (0, 0, 0))\n screen.blit(IMAGEE, (200, 250))\n del IMAGEE\n pygame.display.flip()\n ## GRAPHICS STUFF: ##\n#########################################################################################\n\n ## KEYS AND MOUSE STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\ndef set_up_key_variables():\n global ky_held, ky_first_held, ky_time_last_pressed\n global mowse_w, mowse_z, mowse_inn\n global mowse_left_pressed, mowse_right_pressed, mowse_left_held, mowse_right_held\n mowse_left_held = False\n mowse_right_held = False\n mowse_left_pressed = False\n mowse_right_pressed = False\n mowse_w = 0\n mowse_z = 0\n mowse_inn = 0\n ky_held = []\n ky_first_held = []\n ky_time_last_pressed = []\n m = -1\n while m < 500:\n m += 1\n ky_held += [0]\n ky_first_held += [0]\n ky_time_last_pressed += [0]\ndef clear_all_kys():\n global mowse_left_pressed, mowse_right_pressed, mowse_left_held, mowse_right_held\n mowse_left_held = False\n mowse_right_held = False\n mowse_left_pressed = False\n mowse_right_pressed = False\n m = -1\n while (m < 500):\n m += 1; ky_held[m] = 0; ky_first_held[m] = 0; ky_time_last_pressed[m] = 0\ndef clear_these_ky_first_held(list_keys_numbers):\n for k in list_keys_numbers:\n ky_first_held[k] = 0\ndef clear_first_held_kys():\n m = -1\n while (m < 500):\n m += 1; ky_first_held[m] = 0\ndef old_style_ky(n):\n return (ky_first_held_CEV(n) or (ky_held[n] and ky_time_last_pressed[n] < time.time() - .3))\ndef ky_first_held_CEV(n):\n if (ky_first_held[n]):\n ky_first_held[n] = 0; return 1\n else:\n return 0\ndef mowse_in_rect (w, z, wol, zol):\n return (mowse_w >= w and mowse_z >= z and mowse_w <= w + wol and mowse_z <= z + zol)\ndef mowse_in_circle (w, z, rad):\n dia = rad * 2\n if mowse_in_rect(w - rad, z - rad, w + dia, z + dia):\n return (distance_2D(mowse_w, mowse_z, w, z) < rad)\n else:\n return 0\n ## CHECK FOR: KEYBOARD, MOUSE, JOYSTICK, AND OTHERY INPUTY: ##\ndef check_for_keys():\n global mowse_w, mowse_z, mowse_inn, mowse_left_pressed, mowse_right_pressed, mowse_left_held, mowse_right_held, APPLICATION_w_size, APPLICATION_z_size\n global loopy\n global unicodey\n mowse_left_pressed = False\n mowse_right_pressed = False\n unicodey = ''\n for e in pygame.event.get():\n if e.type == QUIT:\n loopy = 0\n elif e.type == ACTIVEEVENT:\n mowse_inn = (e.gain and (e.state == 1 or e.state == 6))\n elif e.type == KEYDOWN:\n ky_held[e.key] = 1\n ky_first_held[e.key] = 1\n ky_time_last_pressed[e.key] = time.time()\n unicodey = e.unicode\n elif e.type == KEYUP:\n ky_held[e.key] = 0\n elif e.type == MOUSEMOTION:\n mowse_w = e.pos[0]\n mowse_z = e.pos[1]\n if mowse_w >= 0 and mowse_w <= APPLICATION_w_size and mowse_z >= 0 and mowse_z <= APPLICATION_z_size:\n mowse_inn = 1\n else:\n mowse_inn = 0\n elif e.type == MOUSEBUTTONUP:\n if e.button == 1: mowse_left_held = 0\n if e.button == 3: mowse_right_held = 0\n elif e.type == MOUSEBUTTONDOWN:\n mowse_left_pressed = (e.button == 1)\n mowse_right_pressed = (e.button == 3)\n mowse_left_held = mowse_left_held or e.button == 1\n mowse_right_held = mowse_right_held or e.button == 3\n elif e.type == JOYAXISMOTION:\n pass\n elif e.type == JOYBALLMOTION:\n pass\n elif e.type == JOYHATMOTION:\n pass\n elif e.type == JOYBUTTONUP:\n pass\n elif e.type == JOYBUTTONDOWN:\n pass\n elif e.type == VIDEORESIZE:\n print e\n print \"What happened!?\"\n #global big_black_rect, screen\n #APPLICATION_w_size = e.size[0]\n #APPLICATION_z_size = e.size[1]\n #screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size))#, RESIZABLE)\n #big_black_rect = pygame.Surface(screen.get_size())\n #big_black_rect = big_black_rect.convert()\n #big_black_rect.fill((0, 100, 200))\n elif e.type == VIDEOEXPOSE:\n pass\n elif e.type == USEREVENT:\n pass\n if ky_held[27] and (ky_held[303] or ky_held[304]): loopy = 0\n ## CHECK FOR: KEYBOARD, MOUSE, JOYSTICK, AND OTHERY INPUTY: ##\n ## KEYS AND MOUSE STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\n\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n\n\n ## MAIN LOOPY STUFF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#########################################################################################\ndef ball_is_going_towards_ball(Bn1, Bn2):\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_mass, ball_RECT\n arc_tangerine = arc_tangent_2D(ball_w[Bn1] - ball_w[Bn2], ball_z[Bn1] - ball_z[Bn2])\n woly1, zoly1 = point_rotated_by_angle_2D(ball_wol[Bn1], ball_zol[Bn1], 0, 0, arc_tangerine)\n return zoly1 > 0\ndef ball_is_relatively_going_towards_ball(Bn1, Bn2):\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_mass, ball_RECT\n arc_tangerine = arc_tangent_2D(ball_w[Bn1] - ball_w[Bn2], ball_z[Bn1] - ball_z[Bn2])\n woly1, zoly1, woly2, zoly2 = points_rotated_by_angle_2D(((ball_wol[Bn1], ball_zol[Bn1]), (ball_wol[Bn2], ball_zol[Bn2])), 0, 0, arc_tangerine)\n return zoly1 > 0 and zoly1 > zoly2 # zoly2 < zoly1 or zoly2 > zoly1 # zoly1 + zoly2 > 0\n #return zoly1 > 0 or zoly1 > zoly2\ndef Make_two_balls_hit_at_angle(Bn1, Bn2, angle):\n global bounce_friction\n #print angle\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_mass, ball_RECT\n woly1, zoly1, woly2, zoly2 = points_rotated_by_angle_2D(((ball_wol[Bn1], ball_zol[Bn1]), (ball_wol[Bn2], ball_zol[Bn2])), 0, 0, angle)\n V1 = zoly1 * bounce_friction\n V2 = zoly2 * bounce_friction\n zoly1, zoly2 = ball_to_ball_wzkol_bounce(V1, ball_mass[Bn1], V2, ball_mass[Bn2], True)\n ball_wol[Bn1], ball_zol[Bn1], ball_wol[Bn2], ball_zol[Bn2] = points_rotated_by_angle_2D(((woly1, zoly1), (woly2, zoly2)), 0, 0, -angle)\n updatey_ball_quick_rect(Bn1)\n updatey_ball_quick_rect(Bn2)\ndef updatey_ball_quick_rect(B):\n dia = ball_rad[B] * 2 + 4\n ball_squar[B] = [ball_w[B] - ball_rad[B] - 2, ball_z[B] - ball_rad[B] - 2, dia, dia]\n ball_RECT[B] = freaky_rect_switcharoo_2D(ball_w[B], ball_z[B], ball_wol[B], ball_zol[B], ball_rad[B] + 4)\ndef minus_ball_thing(n):\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_angle, ball_angleol, ball_squar, ball_mass, ball_RECT\n if ball_max >= 0:\n del ball_w [n]\n del ball_z [n]\n del ball_wol [n]\n del ball_zol [n]\n del ball_rad [n]\n del ball_color [n]\n del ball_squar [n]\n del ball_angle [n]\n del ball_angleol[n]\n del ball_mass [n]\n del ball_RECT [n]\n ball_max -= 1\ndef add_ball_thing(w, z, wol, zol, rad, color, angle, angleol, mass_thing, rect_thing):\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_squar, ball_angle, ball_angleol, ball_mass, ball_RECT\n ball_max += 1\n ball_w += [w]\n ball_z += [z]\n ball_wol += [wol]\n ball_zol += [zol]\n ball_rad += [rad]\n ball_color += [color]\n ball_angle += [angle]\n ball_angleol += [angleol]\n dia = rad * 2\n ball_squar += [[w - rad, z - rad, dia, dia]]\n if mass_thing == True:\n ball_mass += [4 / 3 * math.pi * rad * rad * rad]\n else:\n ball_mass += [mass_thing]\n if rect_thing == True:\n ball_RECT += [None]\n updatey_ball_quick_rect(ball_max)\n #ball_RECT += [freaky_rect_switcharoo_2D(w, z, wol, zol, rad)]\n else:\n ball_RECT += [rect_thing]\ndef minus_wall_thing(WAL):\n global wall_max, wall_type, wall_w1, wall_z1, wall_w2, wall_z2, wall_rad, wall_color, wall_RECT\n if wall_max >= 0:\n del wall_type [WAL]\n del wall_w1 [WAL]\n del wall_z1 [WAL]\n del wall_w2 [WAL]\n del wall_z2 [WAL]\n del wall_rad [WAL]\n del wall_color [WAL]\n del wall_RECT [WAL]\n wall_max -= 1\ndef add_wall_thing(type, w1, z1, w2, z2, rad, color_thing, rect_thing):\n global wall_max, wall_type, wall_w1, wall_z1, wall_w2, wall_z2, wall_rad, wall_color, wall_RECT\n wall_max += 1\n wall_type += [type]\n wall_w1 += [w1]\n wall_z1 += [z1]\n wall_w2 += [w2]\n wall_z2 += [z2]\n wall_rad += [rad]\n if color_thing == True:\n if type == 1: color_thing = (220, 220, 220)\n elif type == 2: color_thing = (240, 140, 130)\n elif type == 3: color_thing = (100, 255, 100)\n elif type == 4: color_thing = (255, 100, 100)\n elif type == 5: color_thing = (100, 100, 255)\n wall_color += [color_thing]\n if rect_thing == True:\n wall_RECT += [freaky_rect_switcharoo_2D(w1 - 2, z1 - 2, w2 - w1 + 4, z2 - z1 + 4, rad)]\n else:\n wall_RECT += [rect_thing]\ndef reset_stuff():\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_angle, ball_angleol, ball_squar, ball_mass, ball_RECT\n global wall_max, wall_type, wall_w1, wall_z1, wall_w2, wall_z2, wall_rad, wall_color, wall_RECT\n global levely\n if levely == 1:\n ball_max = -1\n ball_w = []\n ball_z = []\n ball_wol = []\n ball_zol = []\n ball_rad = []\n ball_color = []\n ball_angle = []\n ball_angleol = []\n ball_squar = []\n ball_mass = []\n ball_RECT = []\n #add_ball_thing(350, 300, 0, 0, 18, (230, 230, 250), 0, 0, True, True)\n #add_ball_thing(150, 400, 0, 0, 40, (220, 210, 255), 0, 0, True, True)\n #add_ball_thing(300, 150, 0, 0, 62, (110, 106, 255), 0, 0, True, True)\n add_ball_thing(220, 200, 0, 0, 50, (180, 226, 255), 180, 0, True, True)\n wall_max = -1\n wall_type = []\n wall_w1 = []\n wall_z1 = []\n wall_w2 = []\n wall_z2 = []\n wall_rad = []\n wall_color = []\n wall_RECT = []\n add_wall_thing(1, 160, 250, 300, 270, 1, True, True)\n add_wall_thing(1, 500, 270, 600, 310, 1, True, True)\n add_wall_thing(1, 200, 450, 600, 450, 10, True, True)\n add_wall_thing(1, 300, 350, 400, 370, 5, True, True)\n add_wall_thing(1, 300, 100, 400, 100, 20, True, True)\n add_wall_thing(1, 650, 140, 700, 200, 6, True, True)\n add_wall_thing(1, 650, 140, 600, 40, 6, True, True)\n add_wall_thing(1, 150, 340, 150, 340, 30, True, True)\n add_wall_thing(1, 40, 200, 40, 200, 30, True, True)\n add_wall_thing(1, 30, 30, 30, 30, 10, True, True)\n add_wall_thing(1, 30, 30, 30, 30, 10, True, True)\n add_wall_thing(1, 30, 30, 30, 30, 10, True, True)\n add_wall_thing(1, 30, 30, 30, 30, 10, True, True)\n add_wall_thing(1, 30, 30, 30, 30, 10, True, True)\n add_wall_thing(1, 0, 0, APPLICATION_w_size, 0, 5, True, True)\n add_wall_thing(1, 0, 0, 0, APPLICATION_z_size, 5, True, True)\n add_wall_thing(1, 0, APPLICATION_z_size, APPLICATION_w_size, APPLICATION_z_size, 5, True, True)\n add_wall_thing(1, APPLICATION_w_size, 0, APPLICATION_w_size, APPLICATION_z_size, 5, True, True)\n elif levely == 2:\n ball_max = 1\n ball_w = [323.62638473709342, 384.72135876760257]\n ball_z = [298.67896746658624, 109.24043981044279]\n ball_wol = [-0.27396932987421913, 7.133321987715842]\n ball_zol = [-0.38420912894762504, 1.6564147490246901]\n ball_rad = [15, 28]\n ball_color = [(137, 244, 234), (138, 221, 217)]\n ball_angle = [51.908780125668613, 294.77431504891717]\n ball_angleol = [-1.2400074168431123, 17.698615258690229]\n ball_squar = [[306.62638473709342, 281.67896746658624, 34, 34], [354.72135876760257, 79.240439810442794, 60, 60]]\n ball_mass = [10602.875205865552, 68964.24193160313]\n ball_RECT = [[304.35241540721921, 279.2947583376386, 38.273969329874205, 38.384209128947646], [352.72135876760257, 77.240439810442794, 71.133321987715846, 65.656414749024691]]\n wall_max = 17\n wall_type = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n wall_w1 = [189, 290, 166, 14, 697, 562, 643, 3, 0, 223, 117, 695, 497, 497, 0, 0, 0, 700]\n wall_z1 = [284, 316, 436, 499, 446, 0, 128, 225, 106, 310, 155, 210, 159, 159, 0, 0, 500, 0]\n wall_w2 = [222, 446, 697, 157, 377, 681, 679, 49, 383, 287, 5, 448, 376, 546, 700, 0, 700, 700]\n wall_z2 = [301, 314, 478, 432, 487, 99, 98, 416, 171, 324, 225, 323, 147, 179, 0, 500, 500, 500]\n wall_rad = [1, 1, 10, 5, 20, 6, 6, 30, 30, 10, 10, 10, 10, 10, 5, 5, 5, 5]\n wall_color = [(220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220)]\n wall_RECT = [[186, 281, 39, 23], [287, 313, 162, 4], [154, 424, 555, 66], [7, 429, 157, 73], [359, 424, 356, 85], [554, -8, 135, 115], [635, 94, 52, 38], [-29, 193, 110, 255], [-32, 74, 447, 129], [211, 298, 88, 38], [-3, 143, 128, 94], [440, 198, 263, 137], [368, 139, 137, 28], [485, 147, 73, 44], [-7, -7, 714, 14], [-7, -7, 14, 514], [-7, 493, 714, 14], [693, -7, 14, 514]]\n elif levely == 3:\n ball_max = 2\n ball_w = [425.0, 492.31837629165733, 98.512856261065167]\n ball_z = [126.0, 422.24553778829392, 430.4902396760661]\n ball_wol = [-12.0, 2.6816237083426699, 6.487143738934833]\n ball_zol = [-3.0, -1.245537788293916, -21.490239676066096]\n ball_rad = [15, 28, 21]\n ball_color = [(137, 244, 234), (138, 221, 217), (136, 235, 236)]\n ball_angle = [93.833857527468922, 75.681742520058592, 323.2915629772819]\n ball_angleol = [-0.87655530207419896, 0.30220691772972269, 1.1825329351046094]\n ball_squar = [[408.0, 109.0, 34, 34], [462.31837629165733, 392.24553778829392, 60, 60], [75.512856261065167, 407.4902396760661, 46, 46]]\n ball_mass = [10602.875205865552, 68964.24193160313, 29094.28956489508]\n ball_RECT = [[394.0, 104.0, 50.0, 41.0], [460.31837629165733, 389.0, 66.68162370834267, 65.245537788293916], [73.512856261065167, 384.0, 56.487143738934833, 71.490239676066096]]\n wall_max = 17\n wall_type = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n wall_w1 = [189, 290, 166, 14, 697, 562, 643, 3, 0, 223, 117, 695, 497, 497, 0, 0, 0, 700]\n wall_z1 = [284, 316, 436, 499, 446, 0, 128, 225, 106, 310, 155, 210, 159, 159, 0, 0, 500, 0]\n wall_w2 = [222, 446, 697, 157, 377, 681, 679, 49, 383, 287, 5, 480, 376, 546, 700, 0, 700, 700]\n wall_z2 = [301, 314, 478, 432, 487, 99, 98, 416, 171, 324, 225, 325, 147, 179, 0, 500, 500, 500]\n wall_rad = [1, 1, 10, 5, 20, 6, 6, 30, 30, 10, 10, 10, 10, 10, 5, 5, 5, 5]\n wall_color = [(220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220)]\n wall_RECT = [[186, 281, 39, 23], [287, 313, 162, 4], [154, 424, 555, 66], [7, 429, 157, 73], [359, 424, 356, 85], [554, -8, 135, 115], [635, 94, 52, 38], [-29, 193, 110, 255], [-32, 74, 447, 129], [211, 298, 88, 38], [-3, 143, 128, 94], [472, 198, 231, 139], [368, 139, 137, 28], [485, 147, 73, 44], [-7, -7, 714, 14], [-7, -7, 14, 514], [-7, 493, 714, 14], [693, -7, 14, 514]]\n elif levely == 4:\n ball_max = 15\n ball_w = [60.722554805471077, 452.1573538490178, 80.244575784959252, 38.90004863123329, 526.62934623960155, 561.76077439217966, 51.00641675327735, 476.21179724447387, 74.019911348330012, 104.13986580489509, 77.672785567417591, 97.908669417930454, 492.31309851379422, 107.55531577343871, 25.677250467589708, 408.28461679522843]\n ball_z = [123.53309256655999, 426.85562864865636, 446.98025958602022, 145.55077237791539, 432.36880616921724, 419.52605372165829, 185.76812996010321, 398.60172712183214, 227.90675893521163, 330.14246403509031, 280.7917430301959, 382.77488932204739, 431.7008452670733, 426.72875393133694, 108.86075181750218, 420.07030113046562]\n ball_wol = [0.58974898201312453, 0.29357826379544644, -0.7453458908661944, -0.26977452024547638, -0.13077525550683244, 0.35703289164546842, 0.25581836770201244, -0.16968524576896582, -0.96858759109981474, 0.020541831638986374, 0.21623640500730243, 0.16869582232640204, -0.32778500262837312, -1.0423733543425631, 0.078384075232750969, 0.070169924397188832]\n ball_zol = [2.5202528491916918, -0.067935899483811957, 1.0209651395893582, 1.5519551597452736, 0.37674466231734333, 0.7179102343171756, 1.2098558443319702, -0.21937811619009639, 1.6292902773669935, 0.95366629391114355, 0.99836183708718151, 0.65985328138026611, 0.72997687518744558, -0.33325230167901332, 1.8584237502130836, 1.1180771215980612]\n ball_rad = [12, 20, 14, 19, 14, 23, 23, 13, 25, 28, 28, 25, 20, 20, 20, 24]\n ball_color = [(132, 202, 208), (130, 220, 228), (133, 230, 241), (133, 200, 224), (138, 244, 248), (134, 176, 212), (132, 246, 206), (136, 191, 201), (130, 247, 204), (135, 190, 248), (136, 196, 244), (137, 246, 211), (132, 176, 232), (139, 200, 204), (135, 204, 206), (137, 234, 248)]\n ball_angle = [250.64218161257492, 228.50285566079282, 169.93029421257162, 93.92451866434908, 160.53385135173758, 101.81391124171368, 58.682544988047297, 42.833392250734839, 278.96920717602609, 157.52451729820555, 104.82808146227505, 319.29094377305643, 8.3988066326588289, 61.303383965779759, 262.01723832271352, 187.75853100116501]\n ball_angleol = [-11.145052526574146, 0.73910476098485844, -1.916370769365741, 7.8109934129380036, 1.2564621818214414, -0.21633250902344123, 0.96094866236460608, 18.696614939999161, -2.7765510174821686, -0.46915418861267033, 1.3615127061730832, 0.55215997018655683, 0.83188571652892485, -2.1096665563746759, 4.3536534603644128, 0.77565328887569629]\n ball_squar = [[46.722554805471077, 109.53309256655999, 28, 28], [430.1573538490178, 404.85562864865636, 44, 44], [64.244575784959252, 430.98025958602022, 32, 32], [17.90004863123329, 124.55077237791539, 42, 42], [510.62934623960155, 416.36880616921724, 32, 32], [536.76077439217966, 394.52605372165829, 50, 50], [26.00641675327735, 160.76812996010321, 50, 50], [461.21179724447387, 383.60172712183214, 30, 30], [47.019911348330012, 200.90675893521163, 54, 54], [74.139865804895095, 300.14246403509031, 60, 60], [47.672785567417591, 250.7917430301959, 60, 60], [70.908669417930454, 355.77488932204739, 54, 54], [470.31309851379422, 409.7008452670733, 44, 44], [85.555315773438707, 404.72875393133694, 44, 44], [3.6772504675897082, 86.860751817502177, 44, 44], [382.28461679522843, 394.07030113046562, 52, 52]]\n ball_mass = [5428.6721054031623, 25132.741228718347, 8620.5302414503913, 21548.184010972389, 8620.5302414503913, 38223.757816227015, 38223.757816227015, 6902.0790599367756, 49087.385212340516, 68964.24193160313, 68964.24193160313, 49087.385212340516, 25132.741228718347, 25132.741228718347, 25132.741228718347, 43429.376843225298]\n tempy = [[24.00641675327735, 158.76812996010321, 54.255818367702012, 55.209855844331969], [459.04211199870491, 381.38234900564203, 34.16968524576896, 34.219378116190114], [44.051323757230193, 198.90675893521163, 58.968587591099819, 59.629290277366991], [72.139865804895095, 298.14246403509031, 64.02054183163898, 64.953666293911141], [45.672785567417591, 248.7917430301959, 64.216236405007308, 64.998361837087188], [68.908669417930454, 353.77488932204739, 58.168695822326399, 58.659853281380265], [467.98531351116583, 407.7008452670733, 48.327785002628389, 48.729976875187447], [82.512942419096149, 402.39550162965793, 49.042373354342558, 48.333252301679011], [1.6772504675897082, 84.860751817502177, 48.078384075232748, 49.858423750213085], [380.28461679522843, 392.07030113046562, 56.070169924397192, 57.118077121598063]]\n ball_RECT = [[44.722554805471077, 107.53309256655999, 32.589748982013127, 34.520252849191692], [428.1573538490178, 402.78769274917255, 48.293578263795446, 48.067935899483814], [61.499229894093062, 428.98025958602022, 36.74534589086619, 37.020965139589357], [15.630274110987813, 122.55077237791539, 46.269774520245477, 47.551955159745276], [508.49857098409473, 414.36880616921724, 36.130775255506819, 36.376744662317343], [534.76077439217966, 392.52605372165829, 54.357032891645467, 54.717910234317173]] + tempy\n del tempy\n wall_max = 17\n wall_type = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n wall_w1 = [189, 196, 166, 14, 697, 562, 643, 0, 326, 51, 18, 695, 497, 497, 0, 0, 0, 700]\n wall_z1 = [284, 221, 436, 499, 446, 0, 128, 201, 62, 9, 182, 210, 159, 159, 0, 0, 500, 0]\n wall_w2 = [220, 297, 697, 157, 377, 681, 679, 49, 304, 139, 0, 480, 376, 524, 700, 0, 700, 700]\n wall_z2 = [244, 218, 478, 432, 487, 99, 98, 416, 161, 315, 126, 325, 147, 176, 0, 500, 500, 500]\n wall_rad = [1, 1, 10, 5, 20, 6, 6, 30, 30, 10, 10, 10, 10, 10, 5, 5, 5, 5]\n wall_color = [(220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220)]\n wall_RECT = [[186, 245, 37, 38], [193, 218, 107, 3], [154, 424, 555, 66], [7, 429, 157, 73], [359, 424, 356, 85], [554, -8, 135, 115], [635, 94, 52, 38], [-32, 169, 113, 279], [276, 30, 78, 163], [39, -3, 112, 330], [-8, 118, 34, 72], [472, 198, 231, 139], [368, 139, 137, 28], [485, 147, 51, 41], [-7, -7, 714, 14], [-7, -7, 14, 514], [-7, 493, 714, 14], [693, -7, 14, 514]]\n elif levely == 5:\n ball_max = 15\n ball_w = [563.2380017184845, 135.5091931534665, 435.09697027584525, 132.51126304855137, 158.80356877160969, 486.49890666361813, 28.0454597909272, 469.94449157610796, 253.77058846375945, 33.311743878553251, 651.08671805489632, 467.4560139814393, 420.90145867058521, 248.83956419449743, 98.267666685148598, 670.85536291962285]\n ball_z = [340.3499477728684, 192.53572614832325, 274.00276170743837, 474.72360924550071, 248.04392629767023, 199.66234253741388, 291.77486188629132, 98.828156873677884, 261.79870802935454, 452.90721309179793, 434.31611085503482, 422.84067516142846, 143.71750465032488, 474.55563009909457, 63.407930077910926, 97.5392796541895]\n ball_wol = [-0.12736934788998625, -0.34670289908297647, -0.62730956112551528, -0.01316352118701539, -0.36875760413492498, 0.3253705975573648, -0.43186646985168864, 0.029829055857965088, -0.051399766840351885, 0.31143213467472303, 0.91261705660387604, -0.39289683694945782, 0.6973192899270082, -0.026739395385515136, 0.47773812365404217, -0.14449244329674141]\n ball_zol = [0.2651067487506561, 0.33747092449158278, -0.20330004911815291, 0.11263669365628809, 0.62183969591811039, 0.220324713577495, 0.12382039798193512, -0.062689280803922554, 0.13756798955280808, 0.8702172500111478, -0.031277763984301599, 0.28378328194527458, 0.1666190295210413, 0.056074468995401638, 0.75422143538357722, 0.14790083350095956]\n ball_rad = [12, 20, 14, 19, 14, 23, 23, 13, 25, 28, 28, 25, 20, 20, 20, 24]\n ball_color = [(132, 202, 208), (130, 220, 228), (133, 230, 241), (133, 200, 224), (138, 244, 248), (134, 176, 212), (132, 246, 206), (136, 191, 201), (130, 247, 204), (135, 190, 248), (136, 196, 244), (137, 246, 211), (132, 176, 232), (139, 200, 204), (135, 204, 206), (137, 234, 248)]\n ball_angle = [103.32400188884675, 316.71158855283181, 66.797426175129175, 35.509394217326573, 15.886531654813545, 0.61656478963343941, 195.33151301725019, 152.08747184390086, 199.80989069184068, 131.62120808048311, 339.38767654500623, 158.21789358507957, 322.31233400906359, 97.437869538449633, 179.6312883714439, 134.41162557033078]\n ball_angleol = [0.54118695268280415, -1.0009948706990461, -0.42583251039327935, -0.049119552546591096, -1.7234897593393199, 0.1278122582140804, -0.33925087348758332, 0.98916269599321738, 0.054177225060088277, 0.93648329222661952, 2.0855948904138386, -1.2792816321392795, 1.9343475351789952, -0.094694117658838645, 1.3328174529019678, 1.0390947956294083]\n ball_squar = [[549.2380017184845, 326.3499477728684, 28, 28], [113.5091931534665, 170.53572614832325, 44, 44], [419.09697027584525, 258.00276170743837, 32, 32], [111.51126304855137, 453.72360924550071, 42, 42], [142.80356877160969, 232.04392629767023, 32, 32], [461.49890666361813, 174.66234253741388, 50, 50], [3.0454597909272003, 266.77486188629132, 50, 50], [454.94449157610796, 83.828156873677884, 30, 30], [226.77058846375945, 234.79870802935454, 54, 54], [3.3117438785532514, 422.90721309179793, 60, 60], [621.08671805489632, 404.31611085503482, 60, 60], [440.4560139814393, 395.84067516142846, 54, 54], [398.90145867058521, 121.71750465032488, 44, 44], [226.83956419449743, 452.55563009909457, 44, 44], [76.267666685148598, 41.407930077910926, 44, 44], [644.85536291962285, 71.5392796541895, 52, 52]]\n ball_mass = [5428.6721054031623, 25132.741228718347, 8620.5302414503913, 21548.184010972389, 8620.5302414503913, 38223.757816227015, 38223.757816227015, 6902.0790599367756, 49087.385212340516, 68964.24193160313, 68964.24193160313, 49087.385212340516, 25132.741228718347, 25132.741228718347, 25132.741228718347, 43429.376843225298]\n tempy = [[140.43481116747478, 230.04392629767023, 36.368757604134913, 36.621839695918112], [459.49890666361813, 172.66234253741388, 54.325370597557367, 54.220324713577497], [0.61359332107551268, 264.77486188629132, 54.431866469851684, 54.123820397981937], [452.94449157610796, 81.765467592873961, 34.029829055857967, 34.062689280803923], [224.7191886969191, 232.79870802935454, 58.051399766840348, 58.137567989552807], [1.3117438785532514, 420.90721309179793, 64.311432134674718, 64.870217250011152], [619.08671805489632, 402.28483309105053, 64.912617056603878, 64.031277763984292], [438.06311714448987, 393.84067516142846, 58.392896836949433, 58.283783281945276], [396.90145867058521, 119.71750465032488, 48.697319289927009, 48.166619029521044], [224.81282479911192, 450.55563009909457, 48.026739395385505, 48.056074468995405], [74.267666685148598, 39.407930077910926, 48.477738123654042, 48.754221435383577], [642.71087047632614, 69.5392796541895, 56.144492443296713, 56.147900833500962]]\n ball_RECT = [[547.11063237059454, 324.3499477728684, 32.127369347889953, 32.265106748750654], [111.16249025438353, 168.53572614832325, 48.34670289908297, 48.337470924491583], [416.46966071471974, 255.79946165832024, 36.627309561125514, 36.203300049118127], [109.49809952736436, 451.72360924550071, 46.01316352118701, 46.112636693656285]] + tempy\n del tempy\n wall_max = 17\n wall_type = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n wall_w1 = [135, 120, 230, 14, 531, 562, 441, 128, 403, 51, 504, 518, 377, 447, 0, 0, 0, 700]\n wall_z1 = [265, 216, 439, 499, 339, 0, 217, 104, 306, 9, 441, 210, 168, 127, 0, 0, 500, 0]\n wall_w2 = [227, 288, 697, 157, 456, 665, 476, 432, 61, 139, 633, 547, 435, 537, 700, 0, 700, 700]\n wall_z2 = [262, 200, 478, 432, 302, 141, 228, 77, 334, 315, 295, 193, 178, 114, 0, 500, 500, 500]\n wall_rad = [1, 1, 10, 5, 20, 6, 6, 30, 30, 10, 10, 10, 10, 10, 5, 5, 5, 5]\n wall_color = [(220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220), (220, 220, 220)]\n wall_RECT = [[132, 262, 98, 3], [117, 201, 174, 14], [218, 427, 491, 63], [7, 429, 157, 73], [438, 284, 111, 73], [554, -8, 119, 157], [433, 209, 51, 27], [96, 49, 368, 83], [33, 274, 398, 92], [39, -3, 112, 330], [492, 287, 153, 162], [506, 185, 53, 33], [365, 156, 82, 34], [435, 106, 114, 29], [-7, -7, 714, 14], [-7, -7, 14, 514], [-7, 493, 714, 14], [693, -7, 14, 514]]\ndef draw_walls_on_big_black_rect():\n global wall_max, wall_type, wall_w1, wall_z1, wall_w2, wall_z2, wall_rad, wall_color, wall_RECT\n global big_black_rect\n global LIN_selected, CLICKER, CLICKER2\n if CLICKER:\n if LIN_selected != -1:\n nnn = LIN_selected[0]\n if LIN_selected[1] == 1:\n wall_w1[nnn] = mowse_w\n wall_z1[nnn] = mowse_z\n else:\n wall_w2[nnn] = mowse_w\n wall_z2[nnn] = mowse_z\n w1 = wall_w1[nnn]\n z1 = wall_z1[nnn]\n w2 = wall_w2[nnn]\n z2 = wall_z2[nnn]\n rad = wall_rad[nnn]\n wall_RECT[nnn] = freaky_rect_switcharoo_2D(w1 - 2, z1 - 2, w2 - w1 + 4, z2 - z1 + 4, rad)\n wl = -1\n while wl < wall_max:\n wl += 1\n w1 = wall_w1[wl]\n z1 = wall_z1[wl]\n w2 = wall_w2[wl]\n z2 = wall_z2[wl]\n rad = wall_rad[wl]\n collyu = wall_color[wl]\n pygame.draw.line(big_black_rect, collyu, (w1, z1), (w2, z2), rad * 2)\n pygame.draw.circle(big_black_rect, collyu, (w1, z1), rad)\n pygame.draw.circle(big_black_rect, collyu, (w2, z2), rad)\n #pygame.draw.rect(big_black_rect, (200, 200, 200), wall_RECT[wl], 1)\n if CLICKER2:\n if mowse_in_rect(wall_RECT[wl][0], wall_RECT[wl][1], wall_RECT[wl][2], wall_RECT[wl][3]):\n if mowse_in_circle(w1, z1, rad+3): selected = -1; LIN_selected = [wl, 1]\n elif mowse_in_circle(w2, z2, rad+3): selected = -1; LIN_selected = [wl, 2]\ndef Lets_ROLL():\n global loopy\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_angle, ball_angleol, ball_squar, ball_mass, ball_RECT\n global wall_max, wall_type, wall_w1, wall_z1, wall_w2, wall_z2, wall_rad, wall_color, wall_RECT\n global bounce_friction, air_friction, gravity, rock_and_ROLLY\n global LIN_selected, CLICKER, CLICKER2\n global levely\n levely = 3\n bounce_friction = 0.8\n #bounce_friction = 1.0\n air_friction = 0.999\n #air_friction = 1.0\n gravity = 0.5\n rock_and_ROLLY = math.pi / 8 * 180 #24\n reset_stuff()\n fontyyy = chilly_font_Italicy(24)\n PRESS_SPACE_BAR_TO_MOVE_immy = fontyyy.render('Press SPACE BAR to start motion.', 0, (100, 200, 100))\n PRESS_SPACE_BAR_TO_STOP_immy = fontyyy.render('Press SPACE BAR to stop motion.', 0, (200, 100, 100))\n PRESS_ENTER_TO_RESET_immy = fontyyy.render('Press ENTER to reset.', 0, (150, 150, 150))\n PRESS_MINUS_TO_MINUS_immy = fontyyy.render('Press - to delete a ball.', 0, (150, 150, 150))\n PRESS_ADD_TO_ADD_immy = fontyyy.render('Press + to add a ball.', 0, (150, 150, 150))\n LEFT_CLICK_TO_immy = fontyyy.render('Left click on a \"ghost ball\" to change its speed.', 0, (150, 150, 150))\n RIGHT_CLICK_TO_immy = fontyyy.render('Right click on a ball to stop its motion.', 0, (150, 150, 150))\n PRESS_S_TO_immy = fontyyy.render('Press S to stop all balls.', 0, (150, 150, 150))\n PRESS_PAGE_UP_TO_immy = fontyyy.render('Press Page Up to change the level.', 0, (150, 150, 150))\n #message_1_immy\n del fontyyy\n #calculate_for_sure = True\n selected = -1\n LIN_selected = -1\n move_stuff = True\n t = time.time() + .01\n CLICKER = False\n CLICKER2 = False\n loopy = 1\n while loopy:\n big_black_rect.fill((0, 0, 0))\n draw_walls_on_big_black_rect()\n screen.blit(big_black_rect, (0, 0))\n check_for_keys()\n CLICKER = mowse_left_held\n CLICKER2 = mowse_left_pressed\n CLICKER_2 = mowse_right_held\n CLICKER2_2 = mowse_right_pressed\n if ky_first_held_CEV(32): move_stuff = not move_stuff\n if ky_first_held_CEV(13): reset_stuff()\n if ky_first_held_CEV(280):\n levely += 1\n if levely > 5: levely = 1\n reset_stuff()\n if ky_first_held_CEV(115): # S\n M = -1\n while M < ball_max:\n M += 1\n ball_wol[M] = 0\n ball_zol[M] = 0\n updatey_ball_quick_rect(M)\n if ky_first_held_CEV(45) or ky_first_held_CEV(269): # -\n minus_ball_thing(0)\n if ky_first_held_CEV(61) or ky_first_held_CEV(270): # +\n add_ball_thing(350 + randy(40, -20), 400 + randy(40, -20), randy(40, -20), randy(40, -20), int_randy(20, 10), (int_randy(10, 130), int_randy(80, 170), int_randy(50, 200)), 0, 0, True, True)\n if ky_first_held_CEV(49):\n listy = ['Level_save']\n listy += ['ball_max = ' + str(ball_max)]\n listy += ['ball_w = ' + str(ball_w)]\n listy += ['ball_z = ' + str(ball_z)]\n listy += ['ball_wol = ' + str(ball_wol)]\n listy += ['ball_zol = ' + str(ball_zol)]\n listy += ['ball_rad = ' + str(ball_rad)]\n listy += ['ball_color = ' + str(ball_color)]\n listy += ['ball_angle = ' + str(ball_angle)]\n listy += ['ball_angleol = ' + str(ball_angleol)]\n listy += ['ball_squar = ' + str(ball_squar)]\n listy += ['ball_mass = ' + str(ball_mass)]\n listy += ['ball_RECT = ' + str(ball_RECT)]\n listy += ['wall_max = ' + str(wall_max)]\n listy += ['wall_type = ' + str(wall_type)]\n listy += ['wall_w1 = ' + str(wall_w1)]\n listy += ['wall_z1 = ' + str(wall_z1)]\n listy += ['wall_w2 = ' + str(wall_w2)]\n listy += ['wall_z2 = ' + str(wall_z2)]\n listy += ['wall_rad = ' + str(wall_rad)]\n listy += ['wall_color = ' + str(wall_color)]\n listy += ['wall_RECT = ' + str(wall_RECT)]\n ##write_to_file_WEEE_STRANGE(\"Level_Save.dat\", listy)\n del listy\n if CLICKER2:\n allow_selectey_thing = True\n else:\n allow_selectey_thing = False\n if not CLICKER:\n selected = -1\n LIN_selected = -1\n to_be_selected = selected\n M = -1\n while M < ball_max:\n M += 1\n if move_stuff:\n move_ball(M)\n wwol = int(ball_w[M] + ball_wol[M])\n zzol = int(ball_z[M] + ball_zol[M])\n pygame.draw.circle(screen, ball_color[M], (int(ball_w[M]), int(ball_z[M])), ball_rad[M])\n blpw, blpz = point_rotated_by_angle_2D(0, -ball_rad[M], 0, 0, ball_angle[M])\n pygame.draw.line(screen, (100, 100, 100), (int(ball_w[M] + blpw), int(ball_z[M] + blpz)), (int(ball_w[M]), int(ball_z[M])))\n if not move_stuff:\n pygame.draw.circle(screen, (100, 100, 250), (wwol, zzol), ball_rad[M], 1)\n pygame.draw.circle(screen, (100, 100, 150), (wwol, zzol), int(ball_rad[M] * 1.0), 1)\n pygame.draw.circle(screen, (150, 150, 200), (wwol, zzol), int(ball_rad[M] * 0.8), 1)\n pygame.draw.circle(screen, (200, 200, 250), (wwol, zzol), int(ball_rad[M] * 0.5), 1)\n pygame.draw.line(screen, (100, 160, 250), (int(ball_w[M]), int(ball_z[M])), (wwol, zzol))\n pygame.draw.rect(screen, (130, 130, 130), ball_RECT[M], 1)\n pygame.draw.rect(screen, (140, 140, 140), ball_squar[M], 1)\n if allow_selectey_thing:\n if mowse_in_rect(ball_RECT[M][0], ball_RECT[M][1], ball_RECT[M][2], ball_RECT[M][3]):\n if mowse_in_circle(wwol, zzol, ball_rad[M]):\n to_be_selected = M\n LIN_selected = -1\n if CLICKER_2:\n if mowse_in_rect(ball_squar[M][0], ball_squar[M][1], ball_squar[M][2], ball_squar[M][3]):\n if mowse_in_circle(ball_w[M], ball_z[M], ball_rad[M]):\n ball_wol[M] = 0\n ball_zol[M] = 0\n ball_angleol[M] = 0\n updatey_ball_quick_rect(M)\n if CLICKER:\n if selected == M:\n if move_stuff:\n mowseyy_w = mowse_w\n mowseyy_z = mowse_z\n bw1 = ball_rad[M]\n bz1 = ball_rad[M]\n bw2 = APPLICATION_w_size - ball_rad[M]\n bz2 = APPLICATION_z_size - ball_rad[M]\n if mowseyy_w < bw1: mowseyy_w = bw1\n if mowseyy_w > bw2: mowseyy_w = bw2\n if mowseyy_z < bz1: mowseyy_z = bz1\n if mowseyy_z > bz2: mowseyy_z = bz2\n ww = mowseyy_w - ball_w[M]\n zz = mowseyy_z - ball_z[M]\n #dissy = distance_2D(0, 0, ww, zz)\n ball_wol[M] = ww # / 2.0 # / dissy\n ball_zol[M] = zz # / 2.0 # / dissy\n else:\n ball_wol[M] = mowse_w - ball_w[M]\n ball_zol[M] = mowse_z - ball_z[M]\n updatey_ball_quick_rect(M)\n selected = to_be_selected\n if not move_stuff:\n screen.blit(PRESS_SPACE_BAR_TO_MOVE_immy, (10, 10))\n else:\n screen.blit(PRESS_SPACE_BAR_TO_STOP_immy, (10, 10))\n screen.blit(PRESS_MINUS_TO_MINUS_immy, (10, 30))\n screen.blit(PRESS_ADD_TO_ADD_immy, (10, 50))\n screen.blit(PRESS_ENTER_TO_RESET_immy, (10, 70))\n screen.blit(LEFT_CLICK_TO_immy, (10, 90))\n screen.blit(RIGHT_CLICK_TO_immy, (10, 110))\n screen.blit(PRESS_S_TO_immy, (10, 130))\n screen.blit(PRESS_PAGE_UP_TO_immy, (10, 150))\n pygame.display.flip()\n while t > time.time(): pass\n t = time.time() + .01\n # Try_Again_HE_HE Is weird!! maybe It should be deleted!!\ndef move_ball(M):\n ball_angle[M] += ball_angleol[M]\n if ball_angle[M] > 359: ball_angle[M] -= 360\n elif ball_angle[M] < 0: ball_angle[M] += 361\n #movey_bally_speciality(M, ball_wol[M], ball_zol[M], 10)\n movey_bally_speciality(M, ball_wol[M], ball_zol[M], 10)\n ball_zol[M] += gravity\n updatey_ball_quick_rect(M)\ndef movey_bally_speciality(M, wol_special, zol_special, Try_Again_HE_HE):\n global loopy\n global ball_max, ball_w, ball_z, ball_wol, ball_zol, ball_rad, ball_color, ball_angle, ball_angleol, ball_squar, ball_mass, ball_RECT\n global wall_max, wall_type, wall_w1, wall_z1, wall_w2, wall_z2, wall_rad, wall_color, wall_RECT\n global bounce_friction, air_friction, gravity, rock_and_ROLLY\n distance_is_supposed_to_be_at = distance_2D(0, 0, wol_special, zol_special)\n wa = ball_w[M]\n za = ball_z[M]\n #will_be_w = wa + ball_wol[M]\n #will_be_z = za + ball_zol[M]\n will_be_w = wa + wol_special\n will_be_z = za + zol_special\n LIN_collide_max = -1\n LIN_collide_w = []\n LIN_collide_z = []\n LIN_collide_ang = []\n LIN_collide_dis = []\n LL = -1\n while LL < wall_max:\n LL += 1\n if rect_touching_rect2(ball_RECT[M][0], ball_RECT[M][1], ball_RECT[M][2], ball_RECT[M][3], wall_RECT[LL][0], wall_RECT[LL][1], wall_RECT[LL][2], wall_RECT[LL][3]):\n #print 'weee'\n did_collide, New_ball_w, New_ball_z, angle_hit_at = find_where_ball_collides_on_a_wall(wa, za, wol_special, zol_special, ball_rad[M], wall_type[LL], wall_w1[LL], wall_z1[LL], wall_w2[LL], wall_z2[LL], wall_rad[LL])\n if did_collide:\n #print 'collide'\n #print str(New_ball_w), str(New_ball_z)\n LIN_collide_max += 1\n LIN_collide_w += [New_ball_w]\n LIN_collide_z += [New_ball_z]\n LIN_collide_ang += [angle_hit_at]\n LIN_collide_dis += [distance_2D(wa, za, New_ball_w, New_ball_z)]\n HEH_collide_max = -1\n HEH_collide_w = []\n HEH_collide_z = []\n HEH_collide_ang = []\n HEH_collide_dis = []\n HEH_collide_ball_hit = []\n M2 = -1\n while M2 < ball_max:\n M2 += 1\n if M2 != M:\n if rect_touching_rect2(ball_RECT[M][0], ball_RECT[M][1], ball_RECT[M][2], ball_RECT[M][3], ball_squar[M2][0], ball_squar[M2][1], ball_squar[M2][2], ball_squar[M2][3]):\n #they_did_touch, New_ball1_w, New_ball1_z, angle_hit_at = find_where_ball_collides_on_another_ball(wa, za, ball_wol[M], ball_zol[M], ball_rad[M], ball_w[M2], ball_z[M2], ball_rad[M2])\n they_did_touch, New_ball1_w, New_ball1_z, angle_hit_at = find_where_ball_collides_on_another_ball(wa, za, wol_special, zol_special, ball_rad[M], ball_w[M2], ball_z[M2], ball_rad[M2])\n if they_did_touch:\n HEH_collide_max += 1\n HEH_collide_w += [New_ball1_w]\n HEH_collide_z += [New_ball1_z]\n HEH_collide_ang += [angle_hit_at]\n HEH_collide_dis += [distance_2D(wa, za, New_ball1_w, New_ball1_z)]\n HEH_collide_ball_hit += [M2]\n current_dis = distance_is_supposed_to_be_at\n Wall_to_hit_at_angley = None\n Grr = -1\n while Grr < LIN_collide_max:\n Grr += 1\n #print LIN_collide_dis[Grr], current_dis\n if LIN_collide_dis[Grr] < current_dis:\n #print 'weee!'\n Wall_to_hit_at_angley = LIN_collide_ang[Grr]\n current_dis = LIN_collide_dis[Grr]\n will_be_w = LIN_collide_w[Grr]\n will_be_z = LIN_collide_z[Grr]\n Ball_to_hit = None\n Ball_to_hit_at_angley = None\n Heh = -1\n while Heh < HEH_collide_max:\n Heh += 1\n if HEH_collide_dis[Heh] < current_dis:\n if ball_is_going_towards_ball(M, HEH_collide_ball_hit[Heh]):\n if ball_is_relatively_going_towards_ball(M, HEH_collide_ball_hit[Heh]):\n Ball_to_hit = HEH_collide_ball_hit[Heh]\n Ball_to_hit_at_angley = HEH_collide_ang[Heh]\n else:\n Ball_to_hit = None\n Ball_to_hit_at_angley = None\n current_dis = HEH_collide_dis[Heh]\n will_be_w = HEH_collide_w[Heh]\n will_be_z = HEH_collide_z[Heh]\n if Ball_to_hit != None:\n Make_two_balls_hit_at_angle(M, Ball_to_hit, Ball_to_hit_at_angley)\n else:\n #if bouncey == 1: ball_wol[M] = -ball_wol[M] * bounce_friction\n #elif bouncey == 2: ball_zol[M] = -ball_zol[M] * bounce_friction\n if Wall_to_hit_at_angley != None:\n ball_wol[M], ball_zol[M] = wzol_bounce_at_angle(ball_wol[M], ball_zol[M], Wall_to_hit_at_angley, bounce_friction)\n ball_angleol[M] = zol_at_angle(ball_wol[M], ball_zol[M], Wall_to_hit_at_angley + 90) / ball_rad[M] * rock_and_ROLLY\n ball_w[M] = will_be_w\n ball_z[M] = will_be_z\n if ball_w[M] < 0 or ball_w[M] > APPLICATION_w_size or ball_z[M] < 0 or ball_z[M] > APPLICATION_z_size:\n #print str(M) + \" \", str(wa), str(za)\n print str(M) + \" \", str(ball_w[M]), str(ball_z[M]), str(ball_rad[M])\n ball_wol[M] *= air_friction\n ball_zol[M] *= air_friction\n updatey_ball_quick_rect(M)\n if current_dis < distance_is_supposed_to_be_at:\n if Try_Again_HE_HE > 0:\n distance_to_travel_next = distance_is_supposed_to_be_at - current_dis\n disy_HE_HE = distance_2D(0, 0, ball_wol[M], ball_zol[M])\n next_wol = ball_wol[M]\n next_zol = ball_zol[M]\n movey_bally_speciality(M, next_wol, next_zol, Try_Again_HE_HE - 1)\n\n ## Woah... Finally! Were near the end of the program! ##\nif __name__ == '__main__':\n import math\n import pygame\n import random\n import time\n import gc\n import copy\n from pygame.locals import *\n if not pygame.font: print 'Warning, fonts disabled?'\n if not pygame.mixer: print 'Warning, sound disabled?'\n HE_HE_init()\n ## THE END! ##", "user_title": "Anonymous", "datetimeon": "2007-12-23T15:46:20", "link": "pygame.draw.circle", "id": 1320}, {"content": "Guillame was confused on the nature of the last two arguments to Rect().\nhe thought that they were absolute coordinates, not width-height.\nThere isn't a bug with collidepoint.\nsee the pygame mailing list archives for the discussion with Guillame where this topic arose.", "user_title": "Anonymous", "datetimeon": "2007-04-25T17:52:17", "link": "Rect.collidepoint", "id": 524}, {"content": "I'm guessing they're key pressed (eg, the A or J keys) and the modifiers (Shift, Ctrl, Alt, Meta, Super, etc). Experiment to find details.", "user_title": "Anonymous", "datetimeon": "2007-04-26T17:03:55", "link": "pygame.event", "id": 528}, {"content": "I, too, get a list with a single item, None. This on Mac OS X 10.4 (Tiger) and Python 2.4.4; \npygame.ver returns '1.8.0pre'", "user_title": "Anonymous", "datetimeon": "2008-01-20T04:04:36", "link": "pygame.font.get_fonts", "id": 1428}, {"content": "The params units are in pixels.\nThe smallest unit for Pygame I think.\nIt doesn't make sense to change this to float.", "user_title": "Anonymous", "datetimeon": "2008-01-21T10:48:00", "link": "Rect.move_ip", "id": 1430}, {"content": "this resource is perfect for games with controls options\nbecause through it you can show the current input without creating a whole database of inputs\ntxt = font.render(pygame.key.name(current_key),True,(0,0,0))\nscreen.blit(txt,(0,0))", "user_title": "Anonymous", "datetimeon": "2008-01-21T20:04:03", "link": "pygame.key.name", "id": 1431}, {"content": "#!/usr/bin/python\nimport pygame\nfrom pygame.locals import *\n\ndef main():\n pygame.init()\n pygame.display.set_mode((300,200))\n pygame.display.set_caption('Testing')\n running = True\n while running:\n for event in pygame.event.get():\n if event.type == QUIT:\n running = False\n if event.type == KEYDOWN and event.key == K_ESCAPE:\n running = False\n if event.type == MOUSEBUTTONDOWN:\n #print event.button\n print pygame.mouse.get_pos()\n pygame.display.quit()\n\nif __name__ == '__main__':\n main()", "user_title": "Anonymous", "datetimeon": "2008-01-23T15:43:49", "link": "pygame.mouse.get_pos", "id": 1436}, {"content": "Once you draw something, how do you delete it??", "user_title": "Anonymous", "datetimeon": "2007-05-04T00:39:15", "link": "pygame.draw.rect", "id": 548}, {"content": "Hi,\n\nI was having a problem when trying to jump from one movie to another. Even with the fist one stopped the second movie played at half speed with no volume. A solution was to keep a reference to the old movie, which I assume stops the garbage collector trying to delete it before its finished doing whatever it was doing. \n\nThis would cause problems:\n\ncurrentMovie.stop()\ncurrentMovie = pygame.movie.Movie(fullname)\ncurrentMovie.play()\n\nAnd this fixes it:\n\ncurrentMovie.stop()\noldMovie = currentMovie\ncurrentMovie = pygame.movie.Movie(fullname)\ncurrentMovie.play()\n\nMaybe need a method for unloading the memory and stopping all its threads.", "user_title": "Anonymous", "datetimeon": "2007-05-09T10:27:03", "link": "pygame.movie", "id": 554}, {"content": "Does anyone know how to make multiple screens? I've tried making a different variable with different dimensions, but it only changes original\n\nsize=400,400\nscreen=display.set_mode(size)\n\nsize1=200,200\nnew_screen=display.set_mode(size1)", "user_title": "Anonymous", "datetimeon": "2008-01-29T10:33:27", "link": "pygame.display.set_mode", "id": 1456}, {"content": "The first two arguments to Surface.blit() seem to be reversed. To draw Surface \"source\" onto Surface \"dest\" the correct call is:\n\n pygame.Surface.blit(dest, source, position)\n\nor\n\n dest.blit(source, position)\n\n\nExample:\n\n screen = pygame.display.set_mode((100,100))\n screen.fill((255,255,255)) # white background\n red_block = pygame.Surface((50,50))\n red_block.fill((255,0,0))\n\n # draw red block onto white background\n screen.blit(red_block, (25,25))\n\n pygame.display.update()", "user_title": "Anonymous", "datetimeon": "2007-05-16T08:51:09", "link": "Surface.blit", "id": 572}, {"content": "Actually, on re-reading the method description, I realize that the \"dest\" argument means the position to where the source Surface should be copied too. So the call synopsis is equivalent to the second case in my comment.\n\nThe naming of the arguments is a bit confusing, IMHO, and also that it is not (visually) clear that the documentation describes the methods of a Surface object instance and makes no mention of the class methods.", "user_title": "Anonymous", "datetimeon": "2007-05-16T09:15:43", "link": "Surface.blit", "id": 573}, {"content": "Only the \"systems with multiple choices\" are listed there.", "user_title": "Anonymous", "datetimeon": "2007-05-20T19:04:19", "link": "pygame.display.init", "id": 578}, {"content": "Yeah the doc could be improved. The wrong comment below should be removed, it's only confusing. I did find another problem, though: It's important to note that when you cut out an area from the source, then the dest argument does _not_ specify where the origin of the source would be on the surface that is blitted on, but instead dest specifies the top left corner of just the area that is actually blitted. This is not quite clear from this doc, I think.", "user_title": "Anonymous", "datetimeon": "2007-05-24T07:20:10", "link": "Surface.blit", "id": 588}, {"content": "Pygame (and SDL) doesn't support multiple windows.", "user_title": "Anonymous", "datetimeon": "2008-02-09T15:29:56", "link": "pygame.display.set_mode", "id": 1525}, {"content": "you can't \"delete\" something you have drawn, you have to draw something over it instead.\nyou can make classes that wrap the different draw function and have both a \"show\" and a \"hide\" function and the hide function has to draw the background over the shape you created in \"hide\", but this can have weird results if shapes overlap and are not correctly redrawn.\ncheers", "user_title": "Anonymous", "datetimeon": "2007-06-02T10:44:48", "link": "pygame.draw.rect", "id": 607}, {"content": "destination.blit(source (distination location),(source location x,y and size x,y)", "user_title": "Anonymous", "datetimeon": "2007-06-05T09:13:28", "link": "pygame.Surface", "id": 609}, {"content": "destination.blit(source (distination location),(source location x,y and size x,y)", "user_title": "Anonymous", "datetimeon": "2007-06-05T09:13:56", "link": "Surface.blit", "id": 610}, {"content": "use events to save and release keystates to use it only for some:\n\nif event.type == pygame.KEYDOWN: if event.key == MYKEY: i = True\nelif event.type == pygame.KEYUP: if event.key == MYKEY: i = False\nif i: do stuff.", "user_title": "Anonymous", "datetimeon": "2008-02-11T16:09:33", "link": "pygame.key.set_repeat", "id": 1541}, {"content": "Is there a way to make the collision box of the line accurate to the line itself?", "user_title": "Anonymous", "datetimeon": "2008-02-12T18:09:15", "link": "pygame.draw.line", "id": 1549}, {"content": "Is there a way to produce small line segments that have accurate collision boxes\nso that one could have two lines that would be parallel to each other with out them colliding?", "user_title": "Anonymous", "datetimeon": "2008-02-12T18:13:18", "link": "pygame.draw", "id": 1550}, {"content": "Yes, actually it would be quite useful for it to be float, if it could store the\ndecimals and increment them as such but not display it until it would take effect...", "user_title": "Anonymous", "datetimeon": "2008-02-12T20:21:41", "link": "Rect.move_ip", "id": 1552}, {"content": "Clearly, more documentation about the event properties should be written.", "user_title": "Anonymous", "datetimeon": "2007-06-10T10:28:36", "link": "pygame.event", "id": 628}, {"content": "MOUSEBUTTONDOWN/UP:\n pos: tuple of x and y coordinates of the click\n button: 1 - left 2 - middle 3 - right button", "user_title": "Anonymous", "datetimeon": "2007-06-10T13:16:50", "link": "pygame.event", "id": 630}, {"content": "MOUSEMOTION\n pos: tuple of x and y coordinates\n rel: tuple of relative x and relative y change from previous position\n buttons: tuple of three values (left,middle,right). 0-not pressed 1-pressed", "user_title": "Anonymous", "datetimeon": "2007-06-10T13:18:03", "link": "pygame.event", "id": 631}, {"content": "While thick arcs do get filled, they also get moire holes - at least on Debian's 1.7.1release-4.1. For now, I've been using a rather ugly workaround where one draws the arc several times with the start angle offset by 0.01 to cut the moires back.", "user_title": "Anonymous", "datetimeon": "2008-02-16T15:39:17", "link": "pygame.draw.arc", "id": 1580}, {"content": "I have noticed that with my analog joystick square shaped information is returned\nfrom this function. For example, pressing fully down and right would return 1.0\nfor both axis directions, instead of 0.7071... as one might expect (since analog\njoysticks have a circle shaped socket for the stick to move in.)\n\nTo correct this one might want to use a function similar to the following\njoystick_transform function:\n\ndef length(v):\n\treturn math.sqrt(v[0]*v[0] + v[1]*v[1])\n\n# Transforms the square info of an analog joystick into circular info\ndef joystick_transform(j):\n\t# If joystick is not centered:\n\tif (j[0],j[1]) != (0,0):\n\t\t# Check if x axis is larger than y axis\n\t\tif abs(j[0]) > abs(j[1]):\n\t\t\t# Since x>y we will check for line intersection with wall\n\t\t\t# Get slope (m = y/x) for y = m * x (line equation)\n\t\t\tm = abs(j[1] / j[0])\n\t\t\t# At x=1.0 (intersecting right wall), y would equal m\n\t\t\t# scaler = length of normalized vector / length of line intersecting box\n\t\t\ts = 1.0 / length((1.0, m))\n\t\telse:\n\t\t\t# Since y>=x we will check for line intersection with ceiling\n\t\t\t# Get slope (m = x/y) for x = m * y (line equation)\n\t\t\tm = abs(j[0] / j[1])\n\t\t\t# At y=1.0 (intersecting ceiling), x would equal m\n\t\t\t# scaler = length of normalized vector / length of line intersecting box\n\t\t\ts = 1.0 / length((m,1.0))\n\telse:\n\t\t# Since the joystick is centered, the scaler will be 0\n\t\ts = 0\n\t\t\n\t# Simply scale the joystick axis data by the scaler\n\treturn (j[0] * s, j[1] * s)\n\n-----\n\nHere is a full example illustrating the difference between raw joystick input\nand transformed joystick information:\n\n#!/usr/bin/python\n\n# In this example the function joystick_transform will transform the\n# square shaped joystick axis information into a circular shape.\n# This will make the new joystick axis information easier to use while\n# moving around a character or cursor.\n\n# The RED dot represents the actual joystick information.\n\n# The BLUE dot represents the transformed joystick information.\n\n# The GREEN dot is a cursor that moves by the transformed joystick\n# information in a motion relative to it's previous location.\n\n\nimport pygame\nimport math\n\ndef norm(v):\n\tl = length(v)\n\tif l != 0:\n\t\treturn (v[0] / l, v[1] / l)\n\treturn (0,0)\n\t\ndef length(v):\n\treturn math.sqrt(v[0]*v[0] + v[1]*v[1])\n\n# Transforms the square info of an analog joystick into circular info\ndef joystick_transform(j):\n\t# If joystick is not centered:\n\tif (j[0],j[1]) != (0,0):\n\t\t# Check if x axis is larger than y axis\n\t\tif abs(j[0]) > abs(j[1]):\n\t\t\t# Since x>y we will check for line intersection with wall\n\t\t\t# Get slope (m = y/x) for y = m * x (line equation)\n\t\t\tm = abs(j[1] / j[0])\n\t\t\t# At x=1.0 (intersecting right wall), y would equal m\n\t\t\t# scaler = length of normalized vector / length of line intersecting box\n\t\t\ts = 1.0 / length((1.0, m))\n\t\telse:\n\t\t\t# Since y>=x we will check for line intersection with ceiling\n\t\t\t# Get slope (m = x/y) for x = m * y (line equation)\n\t\t\tm = abs(j[0] / j[1])\n\t\t\t# At y=1.0 (intersecting ceiling), x would equal m\n\t\t\t# scaler = length of normalized vector / length of line intersecting box\n\t\t\ts = 1.0 / length((m,1.0))\n\telse:\n\t\t# Since the joystick is centered, the scaler will be 0\n\t\ts = 0\n\t\t\n\t# Simply scale the joystick axis data by the scaler\n\treturn (j[0] * s, j[1] * s)\n\npygame.init()\npygame.joystick.init()\n\nscreen = pygame.display.set_mode((640,480))\n\njs = pygame.joystick.Joystick(0)\njs.init()\n\npx = 320.0\npy = 240.0\n\nmove_speed = 2.0\n\ndone = False\nwhile not done:\n\tkey = pygame.key.get_pressed()\n\tscreen.fill((255,255,255))\n\t\n\t# Outer box boundry\n\tpygame.draw.rect(screen, (200,200,200), ((10,10),(180,180)), 1)\n\t\n\t# Circle boundry\n\tpygame.draw.circle(screen, (0,0,0), (100,100), 90, 1)\n\t\n\t# Center point\n\tpygame.draw.circle(screen, (200,200,200), (100,100), 2, 1)\n\t\n\tjx = js.get_axis(0)\n\tjy = js.get_axis(1)\n\tn = norm((jx,jy))\n\t\n\t# Line representing normalized joystick information\n\tpygame.draw.line(screen, (200,200,200), (100,100), (100 + int(n[0] * 90.0), 100 + int(n[1] * 90.0)))\n\t\n\t# Raw joystick information\n\tx = 100 + int(jx * 90.0)\n\ty = 100 + int(jy * 90.0)\n\tpygame.draw.circle(screen, (255,0,0), (x, y), 5)\n\t\n\t# Transformed joystick information\n\ttj = joystick_transform((jx,jy))\n\tx = 100 + int(tj[0] * 90.0)\n\ty = 100 + int(tj[1] * 90.0)\n\tpygame.draw.circle(screen, (0,0,255), (x, y), 5)\n\t\n\t# Cursor moved by transformed joystick information\n\tpx = px + tj[0] * move_speed\n\tpy = py + tj[1] * move_speed\n\tpygame.draw.circle(screen, (0, 255, 0), (int(px), int(py)), 5)\n\t\n\tpygame.display.flip()\n\t\n\tfor event in pygame.event.get():\n\t\tif event.type == pygame.QUIT: \n\t\t\tdone = True\n\t\t\t\n\t\tif key[pygame.K_ESCAPE]:\n\t\t\tdone = True", "user_title": "Anonymous", "datetimeon": "2008-02-16T23:25:56", "link": "Joystick.get_axis", "id": 1584}, {"content": "the playback doesnt work, the music stops for a second and then starts again\nHELP ME", "user_title": "Anonymous", "datetimeon": "2010-11-27T14:29:59", "link": "pygame.mixer.music.play", "id": 3415}, {"content": "An example of the Color object is an rgb tuple like (100,0,200).", "user_title": "Anonymous", "datetimeon": "2008-02-27T10:13:22", "link": "Surface.set_at", "id": 1657}, {"content": "It might be convenient to have this particular documentation within the\nhelp(pygame.display.init) documentation, as of this writing it is not.\n\nAdditionally, information pertaining to Mac-OS X is not present; it may also be\nnoteworthy to document the methods by which Pygame renders its surfaces, as OSX,\nlike Windows, has its own various subsystems to draw views(surfaces).", "user_title": "Anonymous", "datetimeon": "2008-03-01T23:13:53", "link": "pygame.display.init", "id": 1680}, {"content": "All the keyboard event.key constants:\n\nLetters:\n K_a ... K_z\n\nNumbers:\n K_0 ... K_9\n\nControl:\n K_TAB\n K_RETURN\n K_ESCAPE\n K_SCROLLOCK\n K_SYSREQ\n K_BREAK\n K_DELETE\n K_BACKSPACE\n K_CAPSLOCK\n K_CLEAR\n K_NUMLOCK\n\nPunctuation:\n K_SPACE\n K_PERIOD\n K_COMMA\n K_QUESTION\n K_AMPERSAND\n K_ASTERISK\n K_AT\n K_CARET\n K_BACKQUOTE\n K_DOLLAR\n K_EQUALS\n K_EURO\n K_EXCLAIM\n K_SLASH, K_BACKSLASH\n K_COLON, K_SEMICOLON\n K_QUOTE, K_QUOTEDBL\n K_MINUS, K_PLUS\n K_GREATER, K_LESS\n\nBrackets:\n K_RIGHTBRACKET, K_LEFTBRACKET\n K_RIGHTPAREN, K_LEFTPAREN\n\nF-Keys:\n K_F1 ... K_F15\n\nEdit keys:\n K_HELP\n K_HOME\n K_END\n K_INSERT\n K_PRINT\n K_PAGEUP, K_PAGEDOWN\n K_FIRST, K_LAST\n\nKeypad:\n K_KP0 ... K_KP9\n K_KP_DIVIDE\n K_KP_ENTER\n K_KP_EQUALS\n K_KP_MINUS\n K_KP_MULTIPLY\n K_KP_PERIOD\n K_KP_PLUS\n\nSHF,CTL,ALT etc:\n K_LALT, K_RALT\n K_LCTRL, K_RCTRL\n K_LSUPER, K_RSUPER\n K_LSHIFT, K_RSHIFT\n K_RMETA, K_LMETA\n\nArrows:\n K_LEFT\n K_UP\n K_RIGHT\n K_DOWN\n\nOther:\n K_MENU\n K_MODE\n K_PAUSE\n K_POWER\n K_UNDERSCORE\n K_HASH\n\n K_UNKNOWN", "user_title": "Anonymous", "datetimeon": "2008-03-11T11:07:08", "link": "pygame.event.Event", "id": 1682}, {"content": "key is one of the K_* constants in the pygame package level -- it indicates the key pressed. For example, K_UP or K_ESCAPE.\nmod is the modifier. I'm assuming it's either a bitfield or a list. Shouldn't be hard to figure it out.", "user_title": "Anonymous", "datetimeon": "2008-03-16T02:36:10", "link": "pygame.event", "id": 1685}, {"content": "can anyone give me just a small script about how can i play a movie, please?\n\ni used this script but nothing happened. just a window but blank :(\n\nimport pygame\n\n\npygame.init()\n\n\ncine = pygame.movie.Movie('film.mpg')\nsz=cine.get_size()\npygame.display.set_mode(sz)\nwhile 1:\n cine.play(1)\n\nthe movie loads because i tried to find the length and worked and the movie is at the same location. please HELP!!", "user_title": "Anonymous", "datetimeon": "2007-07-12T09:58:26", "link": "pygame.movie", "id": 716}, {"content": "JOYBUTTONDOWN/JOYBUTTONUP\nbutton -- the ID of the button which fired the event.", "user_title": "Anonymous", "datetimeon": "2007-07-14T15:07:03", "link": "pygame.event", "id": 719}, {"content": "Is there a way to draw an anti aliased line with a thickness?", "user_title": "Anonymous", "datetimeon": "2008-03-28T14:12:55", "link": "pygame.draw.aaline", "id": 1713}, {"content": "I've notice that passing any negative number will cause the music to loop forever, not just -1.", "user_title": "Anonymous", "datetimeon": "2008-03-30T20:55:44", "link": "pygame.mixer.music.play", "id": 1722}, {"content": "It seams that you can't read the axes or button positions if you don't start the event loop.\nThis is a little different from what the docs are saying but actually expected since the joystick \nbroadcasts the position (is this right for all drivers?)", "user_title": "Anonymous", "datetimeon": "2008-04-02T23:40:29", "link": "pygame.joystick.Joystick", "id": 1727}, {"content": "Can I draw just one pixel with this? \nApparantly the smallest rect one can draw is 2 pixels big, I guess?", "user_title": "Anonymous", "datetimeon": "2007-07-16T21:15:36", "link": "pygame.draw.rect", "id": 726}, {"content": "the fade_in parameter seems to be missing. Using 1.7: \nTypeError: function takes at most 2 arguments (3 given)", "user_title": "Anonymous", "datetimeon": "2008-04-04T23:21:49", "link": "Sound.play", "id": 1732}, {"content": "The algorithm used will probably ruin the edges in your images. Makes them kinda blurry.", "user_title": "Anonymous", "datetimeon": "2008-04-05T17:52:43", "link": "pygame.transform.smoothscale", "id": 1734}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-07-18T19:04:17", "link": "Very cool design! Useful information. Go on!", "id": 733}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-07-18T19:04:17", "link": "Pretty nice site, wants to see much more on it! :)", "id": 734}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-07-18T19:04:17", "link": "Thanks for the enjoy to have you on my site ! Good luck.", "id": 735}, {"content": "How about creating a sound from a string of raw samples? I shouldn't have to construct a fake WAV header just to get Pygame to accept sound data.", "user_title": "Anonymous", "datetimeon": "2008-04-09T23:10:47", "link": "pygame.mixer.Sound", "id": 1742}, {"content": "Here are attributes of the different events (as best I can tell):\n\nACTIVEEVENT:\n\tgain\n\tstate\nKEYDOWN:\n\tunicode\nKEYUP:\n\tkey\n\tmod\nMOUSEMOTION:\n\tpos\n\trel\n\tbuttons\nMOUSEBUTTONDOWN and MOUSEBUTTONUP:\n\tpos\n\tbutton\nJOYAXISMOTION:\n\tjoy\n\taxis\n\tvalue\nJOYBALLMOTION:\n\tjoy\n\tball\n\trel\nJOYHATMOTION:\n\tjoy\n\that\n\tvalue\nJOYBUTTONUP and case JOYBUTTONDOWN:\n\tjoy\n\tbutton\nVIDEORESIZE:\n\tsize\n\tw\n\th\nSYSWMEVENT (WIN32 only):\n\thwnd\n\tmsg\n\twparam\n\tlparam", "user_title": "Anonymous", "datetimeon": "2007-07-19T13:22:47", "link": "pygame.event", "id": 740}, {"content": "> It is true that passing None for the final argument causes \"Invalid RGBA argument\". This is a bug in the documentation, not the code.\nI'd suggest replacing 'None' with 'NULL' in the documentation, then - it also indicates no value, but is not one you can enter in Python (hence there's no confusion).", "user_title": "Anonymous", "datetimeon": "2007-07-19T16:32:03", "link": "Font.render", "id": 741}, {"content": "There seems to be a typo in the sentence \"The blit routines will attempt to use hardware acceleration when possible, otherwise will use highly optimized software blitting methods.\"", "user_title": "Anonymous", "datetimeon": "2007-07-22T04:31:03", "link": "pygame.Surface", "id": 748}, {"content": "hey thanks for the tip ive been searchin in vain for days", "user_title": "Anonymous", "datetimeon": "2007-07-22T10:05:15", "link": "Surface.get_rect", "id": 749}, {"content": "Yes, it's particularly an issue for when a sprite wants to move diagonally in a low resolution.\n\nWhen you're only moving sideways 1 pixel at a time, it's impossible to move diagonally without breaking conservation of momentum.", "user_title": "Anonymous", "datetimeon": "2008-04-23T19:32:47", "link": "Rect.move_ip", "id": 1782}, {"content": "# Mattew N. Brown copyright 2007\n# This is an example program for key input:\n\n ## IMPORT THEN EXECUTE IMPORTED MODULE ('*.py'): ##\nimport os, sys\nimport random\nimport pygame\nfrom pygame.locals import *\n ## UH!? WHAT IF IT ISN'T EXISTANT!?: ##\nif not pygame.font: print 'Warning, fonts disabled'\nif not pygame.mixer: print 'Warning, sound disabled'\n\n ## LOAD IMAGE AND SOUND: ##\ndef image_file_data(file_name, colorkey=None):\n try:\n image = pygame.image.load(file_name)\n except pygame.error, message:\n print 'ERROR: Image did not load:', file_name\n raise SystemExit, message\n image = image.convert()\n if colorkey is not None:\n if colorkey is -1:\n colorkey = image.get_at((0,0))\n image.set_colorkey(colorkey, RLEACCEL)\n return image, image.get_rect()\ndef sound_file_data(file_name):\n class NoneSound:\n def play(self): pass\n if not pygame.mixer:\n return NoneSound()\n try:\n sound = pygame.mixer.Sound(file_name)\n except pygame.error, message:\n print 'ERROR: Sound did not load:', file_name\n raise SystemExit, message\n return sound\ndef HEHEHE_font(size):\n fonti = pygame.font.Font(None, size)\n fonti.set_bold(0)\n return fonti\n ## IMAGE STRETCH AND ROTATE: ##\ndef HEHEHE_stretch_image (IMAGEY, wol, zol):\n #return pygame.transform.scale(IMAGEY, (wol, zol))\n return pygame.transform.scale(IMAGEY, (wol + IMAGEY.get_width(), zol + IMAGEY.get_height()))\ndef HEHEHE_rotate_image (IMAGEY, angle):\n center = (0, 0)\n rotate = pygame.transform.rotate\n IMAGEY = rotate(IMAGEY, angle)\n recty = IMAGEY.get_rect(center=center)\n return IMAGEY, recty\n ## DRAW IMAGE: ##\ndef draw_HEHEHE_image (IMAGEE, w, z):\n screen.blit(IMAGEE, (w, z))\ndef draw_HEHEHE_image_stretch (IMAGEE, w, z, wol, zol):\n IMAGEE = HEHEHE_stretch_image(IMAGEE, wol, zol)\n screen.blit(IMAGEE, (w, z))\ndef draw_HEHEHE_image_stretch_rotate (IMAGEE, w, z, wol, zol, angle):\n IMAGEE = HEHEHE_stretch_image(IMAGEE, wol, zol)\n IMAGEE, recty = HEHEHE_rotate_image(IMAGEE, angle)\n screen.blit(IMAGEE, (w + recty.x, z + recty.y))\n ## DRAW TEXT IMAGE: ##\ndef draw_HEHEHE_text (t, special, size, w, z, colory):\n fonty = HEHEHE_font(size)\n IMAGEE = fonty.render(t, special, colory)\n screen.blit(IMAGEE, (w, z))\ndef draw_HEHEHE_text_stretch (t, special, size, w, z, colory, wol, zol):\n fonty = HEHEHE_font(size)\n IMAGEE = fonty.render(t, special, colory)\n IMAGEE = HEHEHE_stretch_image(IMAGEE, wol, zol)\n screen.blit(IMAGEE, (w, z))\ndef draw_HEHEHE_text_stretch_rotate (t, special, size, w, z, colory, wol, zol, angle):\n fonty = HEHEHE_font(size)\n IMAGE = fonty.render(t, special, colory)\n IMAGE = HEHEHE_stretch_image(IMAGE, wol, zol)\n IMAGE, recty = HEHEHE_rotate_image(IMAGE, angle)\n screen.blit(IMAGE, (w + recty.x, z + recty.y))\n ### AAAH! FREAKY!! ###\nclock = pygame.time.Clock()\nImage_directory = \"PNG/\"\nSound_directory = \"SOUND/\"\n ### WHAT IN THE WORLD IS THIS!!??: ###\npygame.init()\nAPPLICATION_w_size = 700\nAPPLICATION_z_size = 500\nscreen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), RESIZABLE)\n#pygame.display.set_icon(image_file_data(Image_directory + \"ICON.PNG\", 0)[0])\npygame.display.set_caption('Mattew N. Brown copyright 2007')\npygame.mouse.set_visible(1)\n ### WHAT IN THE WORLD IS THIS!!!!!!!!!!!!??: ###\nbackground = pygame.Surface(screen.get_size())\nbackground = background.convert()\nbackground.fill((0, 0, 0))\n ### THIS IS DRIVING MY CAR CRAZYs!!!\nscreen.blit(background, (0, 0))\npygame.display.flip()\nrandom.seed()\n\n ## LOAD ALL IMAGES AND SOUNDS: ##\nimage_MAX = 0\nimage_file_name = [];\nimage = []\nimage_rect = []\nwhile (image_MAX <= (-1) ):\n I = image_MAX\n Itemp1, Itemp2 = image_file_data(Image_directory + image_file_name[I], 0)\n image += [Itemp1]\n image_rect += [Itemp2]\n image_MAX += 1\nsound_MAX = 0\nsound_file_name = [];\nsound = []\nsound_rect = []\nwhile (sound_MAX <= (-1) ):\n I = sound_MAX\n Itemp1, Itemp2 = sound_file_data(Sound_directory + sound_file_name[I])\n sound += [Itemp1]\n sound_rect += [Itemp2]\n sound_MAX += 1\n ## LOAD ONE AND ONLY MUSIC FILE: ##\n#pygame.mixer.music.load(d + 'PCDV0043.WAV')\n\n # QUIT\t none\n # ACTIVEEVENT gain, state\n # KEYDOWN\t unicode, key, mod\n # KEYUP\t key, mod\n # MOUSEMOTION pos, rel, buttons\n # MOUSEBUTTONUP pos, button\n # MOUSEBUTTONDOWN pos, button\n # JOYAXISMOTION joy, axis, value\n # JOYBALLMOTION joy, ball, rel\n # JOYHATMOTION joy, hat, value\n # JOYBUTTONUP joy, button\n # JOYBUTTONDOWN joy, button\n # VIDEORESIZE size, w, h\n # VIDEOEXPOSE none\n # USEREVENT code\n\n\n\n ## MAIN: ##\nif __name__ == '__main__':\n EE = ['', '', '', '', '', '', '', '', '', '',\n '', '', '', '', '']\n b = (190, 130, 110)\n COLORY = [b, b, b, b, b, b, b, b, b, b,\n b, b, b, b, b]\n angy = 0\n loopy = 1\n while (loopy == 1):\n angy += 1\n if angy > 360:\n angy = 1\n clock.tick(70)\n screen.blit(background, (0, 0))\n for e in pygame.event.get():\n if e.type == QUIT:\n loopy = 0\n #elif e.type == KEYDOWN and e.key == K_ESCAPE:\n # loopy = 0\n else:\n nnnnnn = -1\n if e.type == QUIT: nnnnnn = 0\n if e.type == ACTIVEEVENT: nnnnnn = 1\n if e.type == KEYDOWN: nnnnnn = 2\n if e.type == KEYUP: nnnnnn = 3\n if e.type == MOUSEMOTION: nnnnnn = 4\n if e.type == MOUSEBUTTONUP: nnnnnn = 5\n if e.type == MOUSEBUTTONDOWN: nnnnnn = 6\n if e.type == JOYAXISMOTION: nnnnnn = 7\n if e.type == JOYBALLMOTION: nnnnnn = 8\n if e.type == JOYHATMOTION: nnnnnn = 9\n if e.type == JOYBUTTONUP: nnnnnn = 10\n if e.type == JOYBUTTONDOWN: nnnnnn = 11\n if e.type == VIDEORESIZE:\n nnnnnn = 12\n APPLICATION_w_size = e.size[0]\n APPLICATION_z_size = e.size[1]\n screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), RESIZABLE)\n if e.type == VIDEOEXPOSE: nnnnnn = 13\n if e.type == USEREVENT: nnnnnn = 14\n if nnnnnn != -1:\n EE[nnnnnn] = str(e); COLORY[nnnnnn] = (190, 200, 255)\n WOW = 0\n while (WOW < 14):\n draw_HEHEHE_text(\"E\" + str(WOW) + \" = \" + EE[WOW], 1, 24, 30, 20 + (WOW * 22), COLORY[WOW])\n if COLORY[WOW] == b:\n COLORY[WOW] = COLORY[WOW]\n else:\n COLORY[WOW] = (200, 240, 200)\n WOW += 1\n # QUIT\t none\n # ACTIVEEVENT gain, state\n # KEYDOWN\t unicode, key, mod\n # KEYUP\t key, mod\n # MOUSEMOTION pos, rel, buttons\n # MOUSEBUTTONUP pos, button\n # MOUSEBUTTONDOWN pos, button\n # JOYAXISMOTION joy, axis, value\n # JOYBALLMOTION joy, ball, rel\n # JOYHATMOTION joy, hat, value\n # JOYBUTTONUP joy, button\n # JOYBUTTONDOWN joy, button\n # VIDEORESIZE size, w, h\n # VIDEOEXPOSE none\n # USEREVENT code\n #I = 0\n #www = 0\n #while (www < 2):\n # www += 1\n # zzz = 0\n # while (zzz < 10):\n # zzz += 1\n # #if (I < image_MAX): draw_HEHEHE_image(I, www * 40, zzz * 40)\n # if (I < image_MAX): draw_HEHEHE_image_stretch_rotate(I, www * 40, zzz * 40, 40, 40, angy)\n # I += 1\n #draw_HEHEHE_text_stretch(\"BOOM!\", 1, 40, 330, 400, (255, 255, 255), 20, 20)\n #draw_HEHEHE_text_stretch_rotate(\"BOOM!\", 1, 40, 140, 400, (255, 255, 255), 0, 0, angy)\n #draw_HEHEHE_text_stretch_rotate(\"WEEEE!\", 1, 30, 450, 470, (255, 255, 255), 0, 0, angy)\n pygame.display.flip()", "user_title": "Anonymous", "datetimeon": "2007-07-28T12:28:50", "link": "pygame.event", "id": 779}, {"content": "# Matthew N. Brown copyright 2007\n# Here is an example program that\n# draws: polygons, circles, and rectangles:\n#\n# You can copy this program on to\n# your own computer and run it.\n#\n\nimport os, sys\nimport random\nimport pygame\nfrom pygame.locals import *\nif not pygame.font: print 'Warning, fonts disabled'\nif not pygame.mixer: print 'Warning, sound disabled'\nimport time\nimport gc\nimport math\n\npygame.init()\nAPPLICATION_w_size = 700\nAPPLICATION_z_size = 500\nscreen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), RESIZABLE)\n#screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), FULLSCREEN)\npygame.display.set_caption(\"HEHE test draw thingie program Matthew N. Brown copyright 2007\")\n#pygame.mouse.set_visible(0)\nglobal background\nbackground = pygame.Surface(screen.get_size())\nbackground.fill((0, 0, 0))\nscreen.blit(background, (0, 0))\npygame.display.flip()\nrandom.seed()\n\nplayer_w = 3\nplayer_z = 2\n\nx = -1\nmap_w_size = 10\nmap_z_size = 10\nmap = [[x, x, x, x, x, x, x, x, x, x, x],\n [x, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1],\n [x, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1],\n [x, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1],\n [x, 1, 1, 0, 0, 1, 0, 0, 4, 0, 0],\n [x, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0],\n [x, 1, 1, 0, 0, 2, 0, 1, 1, 0, 1],\n [x, 1, 1, 1, 0, 2, 0, 1, 0, 0, 1],\n [x, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1],\n [x, 1, 0, 4, 0, 1, 0, 0, 0, 0, 1],\n [x, 1, 0, 2, 2, 2, 2, 2, 2, 2, 1]]\n\nmap[player_z][player_w] = 3\n\n ## IMAGE STRETCH AND ROTATE: ##\ndef chilly_font(size):\n fonti = pygame.font.Font(None, size)\n fonti.set_bold(0)\n return fonti\n ## DRAW TEXT IMAGE: ##\ndef draw_chilly_text (t, special, size, w, z, colory):\n fonty = chilly_font(size)\n IMAGEE = fonty.render(t, special, colory)\n screen.blit(IMAGEE, (w, z))\n\n\n ### some functions: ###\ndef in_repeating_boundy (n, b1, b2):\n if n < b1: n = b2\n if n > b2: n = b1\n return n\ndef in_boundy (n, b1, b2):\n if n < b1: n = b1\n if n > b2: n = b2\n return n\ndef in_boundy2D ((w, z), (w1, z1, w2, z2)):\n if w < w1: w = w1\n if w > w2: w = w2\n if z < z1: z = z1\n if z > z2: z = z2\n return w, z\ndef chilly_distance (w1, z1, w2, z2):\n return math.sqrt(math.pow(w1 - w2, 2) + math.pow(z1 - z2, 2))\ndef chilly_rect_touching_rect(w1, z1, wol1, zol1, w2, z2, wol2, zol2):\n w2 -= w1\n z2 -= z1\n ww1 = -wol2\n zz1 = -zol2\n return (w2 >= ww1 and w2 <= wol1 and z2 >= zz1 and z2 <= zol1)\n\n ## keys and mouse stuff: ##\nglobal ky_held, ky_first_held, ky_time_last_pressed\nglobal mouse_w, mouse_z, mouse_inn, mouse_left_pressed, mouse_right_pressed, mouse_left_held, mouse_right_held\nnot_mouse_left_or_right_held = 1\nmouse_left_held = 0\nmouse_right_held = 0\nmouse_w = 0\nmouse_z = 0\nmouse_inn = 0\nky_held = [0]\nky_first_held = [0]\nky_time_last_pressed = [0]\nm = -1\nwhile (m < 500):\n m += 1\n ky_held += [0]\n ky_first_held += [0]\n ky_time_last_pressed += [0]\n\n ## MOUSE AND KEY FUNCTIONS: ##\ndef clear_kys():\n m = -1\n while (m < 500):\n m += 1\n ky_held[m] = 0\n ky_first_held[m] = 0\n ky_time_last_pressed[m] = 0\ndef mouse_left_pressed_CEV():\n global mouse_left_pressed\n if mouse_left_pressed: mouse_left_pressed = 0; return 1\ndef mouse_right_pressed_CEV():\n global mouse_right_pressed\n if mouse_right_pressed: mouse_right_pressed = 0; return 1\ndef old_style_ky(n):\n return (ky_first_held_CEV(n) or (ky_held[n] and ky_time_last_pressed[n] < time.time() - .3))\ndef ky_first_held_CEV(n):\n if (ky_first_held[n]):\n ky_first_held[n] = 0\n return 1\n else:\n return 0\ndef mouse_in_rect (w, z, wol, zol):\n return (mouse_w >= w and mouse_z >= z and mouse_w <= w + wol and mouse_z <= z + zol)\ndef mouse_in_circle (w, z, rad):\n dia = rad * 2\n if mouse_in_rect(w - rad, z - rad, w + dia, z + dia):\n return (chilly_distance(mouse_w, mouse_z, w, z) < rad)\n else:\n return 0\n\n ## CHECK FOR: KEYBOARD, MOUSE, JOYSTICK, AND OTHERY INPUTY: ##\ndef check_for_keys():\n global mouse_w, mouse_z, mouse_inn, mouse_left_pressed, mouse_right_pressed, mouse_left_held, mouse_right_held\n global loopy, letter_hitty\n global not_mouse_left_or_right_held\n for e in pygame.event.get():\n if e.type == QUIT:\n loopy = 0\n if e.type == ACTIVEEVENT:\n mouse_inn = (e.gain and (e.state == 1 or e.state == 6))\n if not mouse_inn:\n mouse_w = 0\n mouse_z = 0\n if e.type == KEYDOWN:\n ky_held[e.key] = 1\n ky_first_held[e.key] = 1\n ky_time_last_pressed[e.key] = time.time()\n if (e.key >= 97 and e.key <= 122):\n letter_hitty = e.unicode.lower()\n if e.type == KEYUP:\n ky_held[e.key] = 0\n #ky_first_held[e.key] = 0\n if e.type == MOUSEMOTION:\n mouse_w = e.pos[0]\n mouse_z = e.pos[1]\n if e.type == MOUSEBUTTONUP:\n if e.button == 1: mouse_left_held = 0\n if e.button == 3: mouse_right_held = 0\n if not mouse_left_held and not mouse_right_held: not_mouse_left_or_right_held = 1\n if e.type == MOUSEBUTTONDOWN:\n mouse_left_pressed = e.button == 1\n mouse_right_pressed = e.button == 3\n mouse_left_held = mouse_left_held or e.button == 1\n mouse_right_held = mouse_right_held or e.button == 3\n if mouse_left_held or mouse_right_held: not_mouse_left_or_right_held = 0\n if e.type == JOYAXISMOTION: nnnnnn = 7\n if e.type == JOYBALLMOTION: nnnnnn = 8\n if e.type == JOYHATMOTION: nnnnnn = 9\n if e.type == JOYBUTTONUP: nnnnnn = 10\n if e.type == JOYBUTTONDOWN: nnnnnn = 11\n if e.type == VIDEORESIZE:\n global background, Dimage_editing_screen, screen, APPLICATION_w_size, APPLICATION_z_size\n APPLICATION_w_size = e.size[0]\n APPLICATION_z_size = e.size[1]\n screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), RESIZABLE)\n background = pygame.Surface((APPLICATION_w_size, APPLICATION_z_size))\n if e.type == VIDEOEXPOSE: nnnnnn = 13\n if e.type == USEREVENT: nnnnnn = 14\n\n ### MORE STUFF: ###\nHE_HE_surfacey = pygame.Surface((40, 40))\ncolor1 = (200, 200, 200)\ncolor2 = (200, 0, 0)\ncolor3 = (0, 200, 0)\ncolor4 = (130, 180, 180)\nblack_colory = (0, 0, 0)\nHE_HE_surfacey.fill(black_colory)\n\ndef try_to_push_block(w, z, wo, zo):\n if map[z][w] == 1:\n w_pushed = w + wo\n z_pushed = z + zo\n w_pushed, z_pushed = in_boundy2D((w_pushed, z_pushed), (0, 0, map_w_size, map_z_size))\n if map[z_pushed][w_pushed] == 0:\n map[z][w] = 0\n map[z_pushed][w_pushed] = 1\n\ndef draw_map():\n ww = 0\n while ww < map_w_size:\n ww += 1\n zz = 0\n while zz < map_z_size:\n zz += 1\n n = map[zz][ww]\n screen.blit(HE_HE_surfacey, (ww * 40, zz * 40))\n if n == 1:\n pygame.draw.rect(screen, color1, (ww * 40, zz * 40, 40, 40), 2)\n elif n == 2:\n #pygame.draw.rect(screen, color2, (ww * 40, zz * 40, 40, 40), 2)\n pygame.draw.circle(screen, color2, (ww * 40 + 20, zz * 40 + 20), 17, 2)\n elif n == 3:\n #pygame.draw.rect(screen, color3, (ww * 40, zz * 40, 40, 40), 2)\n locy_w = ww * 40\n locy_z = zz * 40\n point1 = (20 + locy_w, 10 + locy_z)\n point2 = (40 + locy_w, 12 + locy_z)\n point3 = (30 + locy_w, 19 + locy_z)\n point4 = (30 + locy_w, 30 + locy_z)\n point5 = (20 + locy_w, 20 + locy_z)\n points = (point1, point2, point3, point4, point5)\n pygame.draw.polygon(screen, color3, points, 2)\n elif n == 4:\n pygame.draw.rect(screen, color4, (ww * 40, zz * 40, 40, 40), 4)\n\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n\n# NOTE: w = x\n# NOTE: z = y\n# -- HE, HE, Bad habit of mine . . .\n\n ## MAIN: ##\nif __name__ == '__main__':\n\n # THE MAIN, MAIN, MAIN LOOP:\n loopy = 1\n while (loopy == 1):\n\n\n mouse_left_pressed = 0\n mouse_right_pressed = 0\n check_for_keys()\n\n draw_map()\n draw_chilly_text('Press the arrow keys to move . . .', 0, 20, 0, 0, (255, 255, 255))\n\n wa = player_w\n za = player_z\n map[player_z][player_w] = 0\n if old_style_ky(276): player_w -= 1\n if old_style_ky(273): player_z -= 1\n if old_style_ky(275): player_w += 1\n if old_style_ky(274): player_z += 1\n player_w, player_z = in_boundy2D((player_w, player_z), (0, 0, map_w_size, map_z_size))\n try_to_push_block(player_w, player_z, player_w - wa, player_z - za)\n if map[player_z][player_w] != 0:\n player_w = wa\n player_z = za\n map[player_z][player_w] = 3\n\n #if ky_first_held[27]: loopy = 0\n pygame.display.flip()", "user_title": "Anonymous", "datetimeon": "2007-07-29T17:05:04", "link": "pygame.draw", "id": 781}, {"content": "# Matthew N. Brown copyright 2007\n# Here is an example program that\n# draws a bouncing ball using: pygame.draw.circle\n#\n# You can copy this program on to\n# your own computer and run it.\n#\n\nimport os, sys\nimport random\nimport pygame\nfrom pygame.locals import *\nif not pygame.font: print 'Warning, fonts disabled'\nif not pygame.mixer: print 'Warning, sound disabled'\nimport time\nimport gc\nimport math\n\npygame.init()\nAPPLICATION_w_size = 700\nAPPLICATION_z_size = 500\nscreen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), RESIZABLE)\n#screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), FULLSCREEN)\npygame.display.set_caption(\"HEHE test circle thingie program Matthew N. Brown copyright 2007\")\n#pygame.mouse.set_visible(0)\nglobal background\nbackground = pygame.Surface(screen.get_size())\nbackground.fill((0, 0, 0))\nscreen.blit(background, (0, 0))\npygame.display.flip()\nrandom.seed()\n\n\n ## IMAGE STRETCH AND ROTATE: ##\ndef HEHEHE_font(size):\n fonti = pygame.font.Font(None, size)\n fonti.set_bold(0)\n return fonti\n ## DRAW TEXT IMAGE: ##\ndef draw_HEHEHE_text (t, special, size, w, z, colory):\n fonty = HEHEHE_font(size)\n IMAGEE = fonty.render(t, special, colory)\n screen.blit(IMAGEE, (w, z))\n\n\n ### some functions: ###\ndef in_repeating_boundy (n, b1, b2):\n if n < b1: n = b2\n if n > b2: n = b1\n return n\ndef in_boundy (n, b1, b2):\n if n < b1: n = b1\n if n > b2: n = b2\n return n\ndef in_boundy2D ((w, z), (w1, z1, w2, z2)):\n if w < w1: w = w1\n if w > w2: w = w2\n if z < z1: z = z1\n if z > z2: z = z2\n return w, z\ndef HEHEHE_distance (w1, z1, w2, z2):\n return math.sqrt(math.pow(w1 - w2, 2) + math.pow(z1 - z2, 2))\ndef HEHEHE_rect_touching_rect(w1, z1, wol1, zol1, w2, z2, wol2, zol2):\n w2 -= w1\n z2 -= z1\n ww1 = -wol2\n zz1 = -zol2\n return (w2 >= ww1 and w2 <= wol1 and z2 >= zz1 and z2 <= zol1)\n\n ## keys and mouse stuff: ##\nglobal ky_held, ky_first_held, ky_time_last_pressed\nglobal mouse_w, mouse_z, mouse_inn, mouse_left_pressed, mouse_right_pressed, mouse_left_held, mouse_right_held\nnot_mouse_left_or_right_held = 1\nmouse_left_held = 0\nmouse_right_held = 0\nmouse_w = 0\nmouse_z = 0\nmouse_inn = 0\nky_held = [0]\nky_first_held = [0]\nky_time_last_pressed = [0]\nm = -1\nwhile (m < 500):\n m += 1\n ky_held += [0]\n ky_first_held += [0]\n ky_time_last_pressed += [0]\n\n ## MOUSE AND KEY FUNCTIONS: ##\ndef clear_kys():\n m = -1\n while (m < 500):\n m += 1\n ky_held[m] = 0\n ky_first_held[m] = 0\n ky_time_last_pressed[m] = 0\ndef mouse_left_pressed_CEV():\n global mouse_left_pressed\n if mouse_left_pressed: mouse_left_pressed = 0; return 1\ndef mouse_right_pressed_CEV():\n global mouse_right_pressed\n if mouse_right_pressed: mouse_right_pressed = 0; return 1\ndef old_style_ky(n):\n return (ky_first_held_CEV(n) or (ky_held[n] and ky_time_last_pressed[n] < time.time() - .3))\ndef ky_first_held_CEV(n):\n if (ky_first_held[n]):\n ky_first_held[n] = 0\n return 1\n else:\n return 0\ndef mouse_in_rect (w, z, wol, zol):\n return (mouse_w >= w and mouse_z >= z and mouse_w <= w + wol and mouse_z <= z + zol)\ndef mouse_in_circle (w, z, rad):\n dia = rad * 2\n if mouse_in_rect(w - rad, z - rad, w + dia, z + dia):\n return (HEHEHE_distance(mouse_w, mouse_z, w, z) < rad)\n else:\n return 0\n\n ## CHECK FOR: KEYBOARD, MOUSE, JOYSTICK, AND OTHERY INPUTY: ##\ndef check_for_keys():\n global mouse_w, mouse_z, mouse_inn, mouse_left_pressed, mouse_right_pressed, mouse_left_held, mouse_right_held\n global loopy, letter_hitty\n global not_mouse_left_or_right_held\n for e in pygame.event.get():\n if e.type == QUIT:\n loopy = 0\n if e.type == ACTIVEEVENT:\n mouse_inn = (e.gain and (e.state == 1 or e.state == 6))\n if not mouse_inn:\n mouse_w = 0\n mouse_z = 0\n if e.type == KEYDOWN:\n ky_held[e.key] = 1\n ky_first_held[e.key] = 1\n ky_time_last_pressed[e.key] = time.time()\n if (e.key >= 97 and e.key <= 122):\n letter_hitty = e.unicode.lower()\n if e.type == KEYUP:\n ky_held[e.key] = 0\n #ky_first_held[e.key] = 0\n if e.type == MOUSEMOTION:\n mouse_w = e.pos[0]\n mouse_z = e.pos[1]\n if e.type == MOUSEBUTTONUP:\n if e.button == 1: mouse_left_held = 0\n if e.button == 3: mouse_right_held = 0\n if not mouse_left_held and not mouse_right_held: not_mouse_left_or_right_held = 1\n if e.type == MOUSEBUTTONDOWN:\n mouse_left_pressed = e.button == 1\n mouse_right_pressed = e.button == 3\n mouse_left_held = mouse_left_held or e.button == 1\n mouse_right_held = mouse_right_held or e.button == 3\n if mouse_left_held or mouse_right_held: not_mouse_left_or_right_held = 0\n if e.type == JOYAXISMOTION: nnnnnn = 7\n if e.type == JOYBALLMOTION: nnnnnn = 8\n if e.type == JOYHATMOTION: nnnnnn = 9\n if e.type == JOYBUTTONUP: nnnnnn = 10\n if e.type == JOYBUTTONDOWN: nnnnnn = 11\n if e.type == VIDEORESIZE:\n global background, Dimage_editing_screen, screen, APPLICATION_w_size, APPLICATION_z_size\n APPLICATION_w_size = e.size[0]\n APPLICATION_z_size = e.size[1]\n screen = pygame.display.set_mode((APPLICATION_w_size, APPLICATION_z_size), RESIZABLE)\n background = pygame.Surface((APPLICATION_w_size, APPLICATION_z_size))\n if e.type == VIDEOEXPOSE: nnnnnn = 13\n if e.type == USEREVENT: nnnnnn = 14\n\n ### MORE STUFF: ###\nball_w = 30.0\nball_z = 20.0\n\nball_wol = 4.0\nball_zol = -1.0\n\ngravity_w = 0.0\ngravity_z = 1.0\n\nradius = 11.0\n\nmakes_ball_slower_per_bounce = 1.2\n\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n#######################################################################################\n\n# NOTE: w = x\n# NOTE: z = y\n# -- HE, HE, Bad habit of mine . . .\n\n ## MAIN: ##\nif __name__ == '__main__':\n\n # THE MAIN, MAIN, MAIN LOOP:\n loopy = 1\n while (loopy == 1):\n\n t = time.time()\n while t > time.time() - .03:\n pass\n mouse_left_pressed = 0\n mouse_right_pressed = 0\n check_for_keys()\n\n ball_wol += gravity_w\n ball_zol += gravity_z\n\n if old_style_ky(276): ball_wol -= 12\n if old_style_ky(273): ball_zol -= 22\n if old_style_ky(275): ball_wol += 12\n if old_style_ky(274): ball_zol += 22\n if ky_held[115]: ball_wol = 0; ball_zol = 0\n if ky_held[99]: ball_wol = (random.random() * 400) - 200; ball_zol = (random.random() * 400) - 200\n\n ball_w += ball_wol\n ball_z += ball_zol\n\n if ball_w < radius: ball_w = radius; ball_wol = -(ball_wol / makes_ball_slower_per_bounce)\n if ball_z < radius: ball_z = radius; ball_zol = -(ball_zol / makes_ball_slower_per_bounce)\n if ball_w > APPLICATION_w_size - radius: ball_w = APPLICATION_w_size - radius; ball_wol = -(ball_wol / makes_ball_slower_per_bounce)\n if ball_z > APPLICATION_z_size - radius: ball_z = APPLICATION_z_size - radius; ball_zol = -(ball_zol / makes_ball_slower_per_bounce)\n\n screen.fill((0, 0, 0))\n draw_HEHEHE_text('Press the arrow keys to move ball.', 0, 25, 0, 0, (255, 255, 255))\n draw_HEHEHE_text('Hold S to stop ball.', 0, 25, 0, 30, (255, 255, 255))\n draw_HEHEHE_text('press C to make ball go crazy.', 0, 25, 0, 70, (255, 255, 255))\n pygame.draw.circle(screen, (200, 200, 200), (int(ball_w), int(ball_z)), int(radius))\n\n #if ky_first_held[27]: loopy = 0\n pygame.display.flip()", "user_title": "Anonymous", "datetimeon": "2007-07-29T19:02:50", "link": "pygame.draw.circle", "id": 782}, {"content": "", "user_title": "Anonymous", "datetimeon": "2007-08-08T10:35:27", "link": "You have a great site. All in your web is very useful. Please keep on working.", "id": 796}, {"content": "Is this fast ? What is better for software systems ?", "user_title": "Anonymous", "datetimeon": "2007-08-12T18:03:51", "link": "Surface.blit", "id": 800}, {"content": "I have not tried photoshop or something to create alpha channels in bitmaps directly. Instead, I use a mask color in a 'normal' bitmap, and make that look transparant in the icon.\ncreate a bitmap in mspaint, black areas will be transparant, size 32x32 pixels, save it as 'icon.bmp'.\n \nthen create a file named icon.py and put this in it:\n###\nimport pygame\n\ndef seticon(iconname):\n \"\"\"\n give an iconname, a bitmap sized 32x32 pixels, black (0,0,0) will be alpha channel\n \n the windowicon will be set to the bitmap, but the black pixels will be full alpha channel\n \n can only be called once after pygame.init() and before somewindow = pygame.display.set_mode()\n \"\"\"\n icon=pygame.Surface((32,32))\n icon.set_colorkey((0,0,0))#and call that color transparant\n rawicon=pygame.image.load(iconname)#must be 32x32, black is transparant\n for i in range(0,32):\n for j in range(0,32):\n icon.set_at((i,j), rawicon.get_at((i,j)))\n pygame.display.set_icon(icon)#set wind\n\npygame.init()\nseticon('icon.bmp')\nwindow=pygame.display.set_mode((250,250))\nbackground=pygame.Surface(window.get_size())\nbackground.fill((50,50,50))\n \nwhile 1:\n for event in pygame.event.get():\n if not event.type == pygame.MOUSEMOTION:#print all events, but not the mousemoves :) for feedback info\n print str(event)\n if event.type == pygame.QUIT: # close window cross (upper right corner) pressed: exit\n raise SystemExit\n elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: #escape pressed: exit\n raise SystemExit\n window.blit(background, (0, 0))#fresh background \n #insert other blitty things here onto the window \n pygame.display.flip()#show completed window\n###\nto see the effect: a transparant icon, based on a normal bitmap with a mask color. \nYou can easily modify the code to use an different mask color or filename if needed.", "user_title": "Anonymous", "datetimeon": "2007-08-12T20:35:22", "link": "pygame.display.set_icon", "id": 803}, {"content": "This function's resume is wrong, it says:\nGroup.has(*sprites): return None\nshould say\nGroup.has(*sprites): return Boolean", "user_title": "Anonymous", "datetimeon": "2007-08-13T03:15:52", "link": "Group.has", "id": 805}, {"content": "In other words, this returns the area in which 2 Rects overlap.\nThis implies that rectA.clip(rectB) == rectB.clip(rectA).", "user_title": "Anonymous", "datetimeon": "2007-08-17T03:35:39", "link": "Rect.clip", "id": 809}, {"content": "There should be more types of sounds loadable. Also a way to save them.", "user_title": "Anonymous", "datetimeon": "2007-08-25T14:44:46", "link": "pygame.mixer.Sound", "id": 815}, {"content": "if you want to use the same function but from module PIL\n\n from PIL import Image\n im = pygame.image.load (\"image.png\")\n s = pygame.image.tostring (im, \"RGBX\")\n temp = Image.fromstring (\"RGBX\", im.get_size (), s)\n tu = (0,0, im.get_size () [0]-1, im.get_size () [1] - 1)\n temp = temp.transform (size2, Image.EXTENT, tu, Image.BICUBIC)\n mode = temp.mode\n size = temp.size\n data = temp.tostring()\n res = pygame.image.fromstring (data, size, mode)", "user_title": "Anonymous", "datetimeon": "2007-08-26T09:36:23", "link": "pygame.transform.rotate", "id": 817}, {"content": "if you want to use the same function but from module PIL\n\n from PIL import Image\n im = pygame.image.load (\"image.png\")\n s = pygame.image.tostring (im, \"RGBX\")\n temp = Image.fromstring (\"RGBX\", im.get_size (), s)\n tu = (0,0, im.get_size () [0]-1, im.get_size () [1] - 1)\n temp = temp.transform (size2, Image.EXTENT, tu, Image.BICUBIC)\n mode = temp.mode\n size = temp.size\n data = temp.tostring()\n res = pygame.image.fromstring (data, size, mode)", "user_title": "Anonymous", "datetimeon": "2007-08-26T09:37:15", "link": "pygame.transform.scale", "id": 818}, {"content": "Numbers greater than 1.0 seem to be interpreted as 1.0.\nNegative numbers are made positive (absolute value)\n\n-4.0 = 4.0 = 1.0", "user_title": "Anonymous", "datetimeon": "2007-08-26T21:15:03", "link": "Sound.set_volume", "id": 820}, {"content": "If you try to use the alpha in [Color] its not applied, \nbut Draw.lines applies alpha in [Color]", "user_title": "Anonymous", "datetimeon": "2007-08-27T12:19:45", "link": "pygame.draw.aalines", "id": 821}, {"content": "Is it possible to use this on only certain keys,\nor to use different values for different groups of keys?\n\nFor example, say you wanted to have a certain value assigned to the player movement keys,\nbut a different value assigned to the attack keys, and no value set for the menu keys.", "user_title": "Anonymous", "datetimeon": "2007-08-31T04:29:56", "link": "pygame.key.set_repeat", "id": 823}, {"content": "That depends on a number of things. For digital D-pads (like on a SNES controller)\nthe values reported will always be \"full blast\" because that's how the gamepad\nhardware reports the direction of the D-pad. For analog sticks, like the ones in\nthe middle of a PS2 controller, they will usually report a value in the range of\na 32-bit integer (or maybe a 16-bit integer, or even a float--I don't really know).\nIt all depends on the hardware, not to mention the drivers of your OS.", "user_title": "Anonymous", "datetimeon": "2007-09-04T04:16:59", "link": "pygame.joystick.Joystick", "id": 825}, {"content": "This will make one single pixel a Color at coordanates x, y on a Surface:\npygame.draw.rect(Surface, Color, (x, y, 1, 1))", "user_title": "Anonymous", "datetimeon": "2007-09-05T21:50:41", "link": "pygame.draw.rect", "id": 826}, {"content": "Hi Tim,\n\nMaybe you realised your error by now, but here is a little clarification for the\npeople reading your comment.\n\nYou created a square with a side of 4 pixel at the position (0, 0). \n\n 0 1 2 3 4\n0 x x x x .\n1 x x x x .\n2 x x x x .\n3 x x x x .\n4 . . . . .\n\nSo of course any position with x or y >= 4 will be outside the square.", "user_title": "Anonymous", "datetimeon": "2008-05-04T00:13:13", "link": "Rect.collidepoint", "id": 1821}, {"content": "How to draw a single pixel: draw a circle with radius zero! Took me a while to find this.\n\ncircle( ..., 0 ) will give you a single pixel", "user_title": "Anonymous", "datetimeon": "2007-09-08T02:17:09", "link": "pygame.draw.circle", "id": 837}, {"content": "It seems to be true that None will cause set_allowed to BLOCK all events.\n...even though it was April 1st.\n\nset_blocked(None) doesn't seem to have any effect like described above.", "user_title": "Anonymous", "datetimeon": "2007-09-09T17:05:37", "link": "pygame.event.set_allowed", "id": 847}, {"content": "set_blocked(None) doesn't seem to have this effect at all, see the comment in set_allowed after April 1st.", "user_title": "Anonymous", "datetimeon": "2007-09-09T17:06:19", "link": "pygame.event.set_blocked", "id": 848}, {"content": "Antialised text *does* work on black backgrounds, you just have to be careful only to\nblit it once, because the parts with less than full alpha will build up \n(very quickly if you are blitting over and over.)", "user_title": "Anonymous", "datetimeon": "2007-09-12T21:29:31", "link": "Font.render", "id": 851}, {"content": "There is an alternative to setting pixels one-at-a-time that is much, much faster. Pygame's Surfarray module will allow you to access the pixels like an array.\n\nIf you need to manipulate pixels on an individual level, it is strongly recommended that you use Surfarrays instead of set_at.", "user_title": "Anonymous", "datetimeon": "2008-05-07T10:56:34", "link": "Surface.set_at", "id": 1842}, {"content": "fade out does NOT block till it is finished in windows!!!!", "user_title": "Anonymous", "datetimeon": "2007-11-12T00:14:47", "link": "pygame.mixer.music.fadeout", "id": 1084}, {"content": "There is no explanation of 'color' argument...?", "user_title": "Anonymous", "datetimeon": "2007-10-09T13:57:03", "link": "pygame.draw.rect", "id": 913}, {"content": "colors are usually done as a tuple\n(red light out of 255,green light out of 255, blue light out of 255).", "user_title": "Anonymous", "datetimeon": "2007-10-09T20:01:34", "link": "pygame.draw.rect", "id": 915}, {"content": "OGG is a container format... They probably meant only OGG/Vorbis.", "user_title": "Anonymous", "datetimeon": "2007-10-17T11:20:52", "link": "pygame.mixer.Sound", "id": 932}, {"content": "You can use Surface.set_at((x,y), colour) to set a pixel.", "user_title": "Anonymous", "datetimeon": "2007-10-17T16:49:42", "link": "pygame.draw.rect", "id": 933}, {"content": "It is a dissapointment to discover that \\n does not\nwork with the default font and merely shows a box.", "user_title": "Anonymous", "datetimeon": "2007-10-18T18:45:51", "link": "Font.render", "id": 937}, {"content": "# This is an example that uses pygame.draw.rect:\nimport os, sys\nimport random\nimport pygame\nfrom pygame.locals import *\npygame.init()\nAPPLICATION_x_size = 400\nAPPLICATION_y_size = 300\nscreen = pygame.display.set_mode((APPLICATION_x_size, APPLICATION_y_size))\npygame.display.set_caption('Fun Boring Example comes with Source Code too!!')\npygame.mouse.set_visible(True)\n#pygame.mouse.set_visible(False)\nblack_square_that_is_the_size_of_the_screen = pygame.Surface(screen.get_size())\nblack_square_that_is_the_size_of_the_screen.fill((0, 0, 0))\nscreen.blit(black_square_that_is_the_size_of_the_screen, (0, 0))\npygame.display.flip()\nWeeee = True\nwhile Weeee:\n # a color can be: (0 to 255, 0 to 255, 0 to 255)\n My_red_color = (255, 0, 0)\n My_blue_color = (0, 0, 255)\n My_green_color = (0, 255, 0)\n My_yellow_color = (255, 255, 0)\n WHITE_WHITE_HOORAY = (255, 255, 255)\n My_light_red_color = (255, 180, 180)\n My_light_blue_color = (190, 190, 255)\n # \"screen.set_at((x, y), Color)\" and \"pygame.draw.rect(screen, Color, (x, y, x_size, y_size))\" draw colors on to an \"in computer memory image\" called: \"screen\"\n screen.set_at(( 1, 1), My_yellow_color)\n screen.set_at(( 2, 2), My_yellow_color)\n screen.set_at(( 3, 3), My_yellow_color)\n screen.set_at(( 4, 4), My_yellow_color)\n screen.set_at(( 5, 5), My_yellow_color)\n screen.set_at(( 6, 6), My_yellow_color)\n screen.set_at(( 7, 7), My_yellow_color)\n screen.set_at(( 8, 8), My_yellow_color)\n screen.set_at(( 9, 9), My_yellow_color)\n screen.set_at((10, 10), My_yellow_color)\n screen.set_at((11, 11), My_yellow_color)\n screen.set_at((12, 12), My_yellow_color)\n screen.set_at((13, 13), My_yellow_color)\n screen.set_at((14, 14), My_yellow_color)\n screen.set_at((15, 15), My_yellow_color)\n screen.set_at((16, 16), My_yellow_color)\n screen.set_at((17, 17), My_yellow_color)\n screen.set_at((18, 18), My_yellow_color)\n screen.set_at((19, 19), My_yellow_color)\n screen.set_at((20, 20), My_yellow_color)\n pygame.draw.rect(screen, My_red_color, (50, 50, 10, 10))\n pygame.draw.rect(screen, My_red_color, (50, 120, 20, 20))\n pygame.draw.rect(screen, My_blue_color, (50, 150, 30, 30))\n pygame.draw.rect(screen, My_blue_color, (50, 1000, 1000, 10))\n pygame.draw.rect(screen, My_green_color, (200, 10, 40, 40))\n pygame.draw.rect(screen, My_light_red_color, (10, 200, 50, 50))\n pygame.draw.rect(screen, My_light_blue_color, (200, 200, 60, 60))\n pygame.draw.rect(screen, My_light_blue_color, (100, 200, 10, 2))\n pygame.draw.rect(screen, WHITE_WHITE_HOORAY, (0, 100, 50, 52))\n # If you delete the below line you should no longer see the vibrant colors.\n pygame.display.flip()\n # if the 'X' button is pressed the window should close:\n Geesh = pygame.event.get()\n if len(Geesh) > 0:\n if Geesh[0].type == QUIT: Weeee = False\n## Once this line is reached the window should close", "user_title": "Anonymous", "datetimeon": "2007-10-18T19:23:51", "link": "pygame.draw.rect", "id": 938}, {"content": "If your program has sources of events that are not managed by pygame, such as\nnetwork socket data, or large files, you must either add a thread that selects\non the source and injects pygame events, or poll the source briefly and rapidly.", "user_title": "Anonymous", "datetimeon": "2007-10-23T23:20:11", "link": "pygame.event", "id": 955}, {"content": "It never seems to be able to load this (error reported, cannot read). But when I run a script that directly runs it(without the loop), it works fine\n\n(songs is a list of filenames loaded form a .txt file)\n\ncurrent_song = 0\nwhile 1:\n if pygame.mixer.music.get_busy() == False:\n print songs[current_song]\n pygame.mixer.music.load(songs[current_song])\n pygame.mixer.music.play() \n current_song += 1", "user_title": "Anonymous", "datetimeon": "2007-10-25T21:19:18", "link": "pygame.mixer.music.load", "id": 965}, {"content": "When you make an icon make a 16x16 icon and then scale it to 32x32 pixels.\nIf you make it 16x16 pixels it looks distorted.\n\nI usally have a transparent 32x32 .gif icon for my games.", "user_title": "Anonymous", "datetimeon": "2007-11-01T18:47:48", "link": "pygame.display.set_icon", "id": 1002}, {"content": "When you make an icon make a 16x16 icon and then scale it to 32x32 pixels.\nIf you make it 16x16 pixels it looks distorted.\n\nI usally have a transparent 32x32 .gif icon for my games.", "user_title": "Anonymous", "datetimeon": "2007-11-01T18:49:22", "link": "pygame.display.set_icon", "id": 1003}, {"content": "Always set the icon before you call pygame.display.set_mode", "user_title": "Anonymous", "datetimeon": "2007-11-01T18:50:24", "link": "pygame.display.set_icon", "id": 1004}, {"content": "Here's a quick script for loading images:\n\ndef load_image(file, colorkey=False):\n file = os.path.join('data', file)\n try:\n image = pygame.image.load(file)\n colorkey = image.get_at((0, 0))\n if colorkey is True:\n image.set_colorkey(colorkey, pygame.RLEACCEL)\n except:\n print 'Unable to load: ' + file\n return image.convert_alpha() #Convert any transparency in the image", "user_title": "Anonymous", "datetimeon": "2007-11-01T18:56:17", "link": "pygame.image.load", "id": 1005}, {"content": "I agree that it is a dissapointment about \\n, but anti-aliasing works fine for me!", "user_title": "Anonymous", "datetimeon": "2007-11-01T19:00:33", "link": "Font.render", "id": 1006}, {"content": "this gives me 6 modules initialised OK, 0 failed.\nbut i only know of 5 modules that have to be inited:\ncdrom, display, font, joystick, mixer. which one did i miss?", "user_title": "Anonymous", "datetimeon": "2007-11-03T04:27:28", "link": "pygame.init", "id": 1013}, {"content": "Yeah, it is fast, but what do you want to compare it to when you\nask \"what is better\"? Within PyGame, there's no alternative to\nusing Surface.blit. I'd suggest you either use that, or if you find\nit too slow (but really make sure it's too slow for you, i.e. test\nif the real problem might be using flip instead of update), use\nOpenGL.", "user_title": "Anonymous", "datetimeon": "2007-11-05T05:06:25", "link": "Surface.blit", "id": 1032}, {"content": "Rects do not move to floating point numbers. Only integers.\n\n\nSo if you do:\n\nself.rect.move_ip(4.5, 0)\n\nit will actually execute:\n\nself.rect.move_ip(4, 0)\n\n\nThis limitation is really bad if you're making a small screen platformer.\nI hope that Rects will move to floating point numbers in pygame 1.8.", "user_title": "Anonymous", "datetimeon": "2007-11-05T09:47:30", "link": "Rect.move_ip", "id": 1034}, {"content": "Copy this to your computer and save it as a .py file to run a little trig demo.\n\n\n\n#! usr/bin/env python\n\nimport pygame, math\nfrom pygame.locals import *\n\nclass Ship:\n def __init__(self):\n self.image=pygame.Surface((40, 40))\n self.rect=self.image.get_rect(center=(320,240))\n self.x=200\n self.y=150\n self.x_vel=0\n self.y_vel=0\n self.angle=0\n self.point_list = [(0, -20), (2.25, -20), (3.0, -6), (4.05, -20)]\n def update(self):\n self.rect.centerx=self.x\n self.rect.centery=self.y\n self.x+=self.x_vel\n self.y+=self.y_vel\n key = pygame.key.get_pressed()\n if key[K_RIGHT]:\n self.angle -= 4\n if key[K_LEFT]:\n self.angle += 4\n if key[K_UP]:\n self.accel(0.1)\n if key[K_DOWN]:\n self.accel(-0.1)\n def draw(self, surface):\n surface.blit(self.image, self.rect)\n self.image.fill((0, 0, 0))\n\tpoint_list = []\n\tself.angle2 = math.radians(self.angle)\n\tfor p in self.point_list:\n radian, radius = p\n x = int(math.sin(radian+self.angle2)*radius)\n y = int(math.cos(radian+self.angle2)*radius)\n\t point_list.append((x+self.image.get_width()/2,y+self.image.get_height()/2))\n\tpygame.draw.polygon(self.image, (255,255,255), point_list, 1)\n def accel(self, accel_speed):\n self.x_vel += math.sin(self.angle*2*math.pi/360)*-accel_speed\n self.y_vel += math.cos(self.angle*2*math.pi/360)*-accel_speed\n def wrap(self, surface):\n if self.x >= surface.get_width() + self.image.get_width()/2:\n self.x = -self.image.get_width()/2\n if self.x <= -self.image.get_width()/2 - 1:\n self.x = surface.get_width() + self.image.get_width()/2\n if self.y >= surface.get_height() + self.image.get_height()/2:\n self.y = -self.image.get_height()/2\n if self.y <= -self.image.get_height()/2 - 1:\n self.y = surface.get_height() + self.image.get_height()/2\n\ndef main():\n pygame.init()\n pygame.display.set_caption('trig demo.py')\n screen = pygame.display.set_mode((400, 300))\n ship = Ship()\n clock = pygame.time.Clock()\n\n while 1:\n clock.tick(60)\n event = pygame.event.poll()\n if event.type == QUIT:\n return\n if event.type == KEYDOWN:\n if event.key == K_ESCAPE:\n return\n\n screen.fill((0, 0, 0))\n ship.draw(screen)\n ship.update()\n ship.wrap(screen)\n pygame.display.flip()\n\n\nif __name__ == '__main__':\n main()", "user_title": "Anonymous", "datetimeon": "2007-11-07T17:25:07", "link": "pygame.draw", "id": 1050}, {"content": "Here is a neat little trig demo:\n\n\n\n#! usr/bin/env python\n\nimport pygame, math\nfrom pygame.locals import *\n\nclass Ship:\n def __init__(self):\n self.image=pygame.Surface((40, 40))\n self.rect=self.image.get_rect(center=(320,240))\n self.x=200\n self.y=150\n self.x_vel=0\n self.y_vel=0\n self.angle=0\n self.point_list = [(0, -20), (2.25, -20), (3.0, -6), (4.05, -20)]\n def update(self):\n self.rect.centerx=self.x\n self.rect.centery=self.y\n self.x+=self.x_vel\n self.y+=self.y_vel\n key = pygame.key.get_pressed()\n if key[K_RIGHT]:\n self.angle -= 4\n if key[K_LEFT]:\n self.angle += 4\n if key[K_UP]:\n self.accel(0.1)\n if key[K_DOWN]:\n self.accel(-0.1)\n def draw(self, surface):\n surface.blit(self.image, self.rect)\n self.image.fill((0, 0, 0))\n\tpoint_list = []\n\tself.angle2 = math.radians(self.angle)\n\tfor p in self.point_list:\n radian, radius = p\n x = int(math.sin(radian+self.angle2)*radius)\n y = int(math.cos(radian+self.angle2)*radius)\n\t point_list.append((x+self.image.get_width()/2,y+self.image.get_height()/2))\n\tpygame.draw.polygon(self.image, (255,255,255), point_list, 1)\n def accel(self, accel_speed):\n self.x_vel += math.sin(self.angle*2*math.pi/360)*-accel_speed\n self.y_vel += math.cos(self.angle*2*math.pi/360)*-accel_speed\n def wrap(self, surface):\n if self.x >= surface.get_width() + self.image.get_width()/2:\n self.x = -self.image.get_width()/2\n if self.x <= -self.image.get_width()/2 - 1:\n self.x = surface.get_width() + self.image.get_width()/2\n if self.y >= surface.get_height() + self.image.get_height()/2:\n self.y = -self.image.get_height()/2\n if self.y <= -self.image.get_height()/2 - 1:\n self.y = surface.get_height() + self.image.get_height()/2\n\ndef main():\n pygame.init()\n pygame.display.set_caption('trig demo.py')\n screen = pygame.display.set_mode((400, 300))\n ship = Ship()\n clock = pygame.time.Clock()\n\n while 1:\n clock.tick(60)\n event = pygame.event.poll()\n if event.type == QUIT:\n return\n if event.type == KEYDOWN:\n if event.key == K_ESCAPE:\n return\n\n screen.fill((0, 0, 0))\n ship.draw(screen)\n ship.update()\n ship.wrap(screen)\n pygame.display.flip()\n\n\nif __name__ == '__main__':\n main()", "user_title": "Anonymous", "datetimeon": "2007-11-07T17:27:28", "link": "pygame", "id": 1051}, {"content": "If you have pygame 1.8 (which is in pre or something) the scrap module has to init.", "user_title": "Anonymous", "datetimeon": "2007-11-08T08:55:27", "link": "pygame.init", "id": 1055}, {"content": "\"Dest can either be pair of coordinates representing the upper left corner of the source. A Rect can also be passed as the destination and the topleft corner of the rectangle will be used as the position for the blit.\"\nEw.\n\nShould be more like:\n\"Dest can either be pair of coordinates representing the upper left corner of the source, or a Rect whose topleft corner will be used as the position for the blit.\"", "user_title": "Anonymous", "datetimeon": "2008-05-19T20:16:05", "link": "Surface.blit", "id": 1907}, {"content": "Do they ever update this docs?", "user_title": "Anonymous", "datetimeon": "2008-05-26T20:11:33", "link": "Group.has", "id": 1952}, {"content": "You could use draw.rect() instead of draw.aaline()", "user_title": "Anonymous", "datetimeon": "2008-05-29T07:54:18", "link": "pygame.draw.aaline", "id": 1966}, {"content": "Why does not it explain the format?", "user_title": "Anonymous", "datetimeon": "2008-05-31T16:06:06", "link": "pygame.mixer.get_num_channels", "id": 1978}, {"content": "Thanks for the list :)", "user_title": "Anonymous", "datetimeon": "2008-06-12T16:50:25", "link": "pygame.event.Event", "id": 2036}, {"content": "Under pygame 1.7.1 it returns the number of currently busy channels (under pygame 1.7.1)", "user_title": "Anonymous", "datetimeon": "2008-06-19T12:27:34", "link": "pygame.mixer.get_busy", "id": 2068}, {"content": "osx is unix based", "user_title": "Anonymous", "datetimeon": "2008-06-22T10:23:28", "link": "pygame.display.init", "id": 2080}, {"content": "While it does state this in the documentation, I misread it at first, so I \nthought that I would try clarifying.\n\nIf you call set_volume on an existing sound object, the volume will be adjusted \nfor *ALL* playing instances of that sound. For instance, say that you are playing\nsound object 'foo' five times. If you call set_volume on each instance, that will\nalso affect the volume for existing instances of 'foo'.\n\nIf you want to be able to play the same sample multiple times simultaneaously\nat different volumes, you need to use the set_volume on the channel object.\n\nCheers", "user_title": "Anonymous", "datetimeon": "2008-06-23T22:31:09", "link": "Sound.set_volume", "id": 2088}, {"content": "after executing pygame.mixer.init i always get \"there is no soundcard\" and my script always crash after it displays that", "user_title": "Anonymous", "datetimeon": "2010-11-25T04:41:20", "link": "pygame.mixer.init", "id": 3324}, {"content": "currently have a :\narning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.\n\non OS X.5 and pygame 1.8.0", "user_title": "Anonymous", "datetimeon": "2008-07-06T23:39:04", "link": "pygame.display.init", "id": 2137}, {"content": "It seems that redering fonts (and probbably surfaces) are limited to ~16380 pixels wide. An example of this is\n\nimport pygame\npygame.init()\n\ncharList = ['a','A','b','B','q','Q']\n\nfont = pygame.font.Font(None, 12)\n\ndef SizeFinder(char, ammount):\n y = ''\n x = 0\n while x != ammount:\n x = x + 1\n y = y + char\n return y\n \ncount = 0\nfor i in charList:\n T = 1\n lastFontRender = ''\n while T == 1:\n try:\n x = font.render(SizeFinder(i, count), True, [0,0,0])\n lastFontRender = x\n count = count + 1\n except:\n print i, 'fails at ', str(count), 'characters'\n print 'Last font render: ' + str(lastFontRender)\n count = 0\n T = 0", "user_title": "Anonymous", "datetimeon": "2008-07-07T04:35:13", "link": "Font.render", "id": 2139}, {"content": "Just a note: Pygame/Python will crash if you provide an invalid filename (for instance, something with the character ':' in it).", "user_title": "Anonymous", "datetimeon": "2008-07-13T18:20:08", "link": "pygame.image.save", "id": 2164}, {"content": "yeh", "user_title": "Anonymous", "datetimeon": "2010-11-24T23:22:16", "link": "pygame.transform.flip", "id": 3308}, {"content": "Alternately, instead of using sprite.rect.move_ip(...) on each update, reset \nsprite.rect.center (or the locational anchor of your choice). Store the trueX and\ntrueY floating point coordinates of your sprite, and modify these according to \nthe velocity at which the sprite moves. When it's time to redraw the sprite in\nthe new location, set ....center = (round(trueX),round(trueY)) and blit. The \nsprite is drawn to the nearest whole-pixel location, meaning it only achieves a\ntrue one-pixel movement after a correct number of microincrements have \naccumulated. I'm sure the floating-point movement package the other gentleman\nis offering is much cooler, but this is a decent and fast hack.", "user_title": "Anonymous", "datetimeon": "2008-07-16T07:04:06", "link": "Rect.move_ip", "id": 2174}, {"content": "+1 thanks for the list", "user_title": "Anonymous", "datetimeon": "2008-07-27T12:16:36", "link": "pygame.event.Event", "id": 2220}, {"content": "The previous example here won't work correctly due\nto a typo, and will not do what you expect due to\na logical error.\nTry the following:\n\nfor event in pygame.event.get() :\n if event.type == pygame.KEYDOWN :\n if event.key == pygame.K_SPACE :\n print \"Space bar pressed down.\"\n elif event.key == pygame.K_ESCAPE :\n print \"Escape key pressed down.\"\n elif event.type == pygame.KEYUP :\n if event.key == pygame.K_SPACE :\n print \"Space bar released.\"\n elif event.key == pygame.K_ESCAPE :\n print \"Escape key released.\"", "user_title": "Anonymous", "datetimeon": "2008-07-29T23:08:09", "link": "pygame.event.get", "id": 2229}, {"content": "while I try :\nol = pygame.Overlay(YVYU_OVERLAY,(600,480))\nprint ol.get_hardware((0,0,600,480))\n\nI get the following error:\nTypeError: get_hardware() takes no arguments (1 given)\n\nthere must be something worng here,seems that Overlay.get_hardware takes NO arguments \n\nchange above code into :\nol = pygame.Overlay(YVYU_OVERLAY,(600,480))\nprint ol.get_hardware()\n\nand it works fine", "user_title": "Anonymous", "datetimeon": "2008-07-30T23:30:23", "link": "Overlay.get_hardware", "id": 2234}, {"content": "I left the repeat function default and it's not suppose to repeat but it still\ndoes..\ncan someone help me?", "user_title": "Anonymous", "datetimeon": "2008-07-31T23:36:27", "link": "pygame.key.set_repeat", "id": 2239}, {"content": "for event in pygame.event.get():\n if event.type is pygame.QUIT:\n pass\n\n if event.type is KEYDOWN:\n\n _ = pygame.key.name(event.key)\n print _\n\n if _ is \"left\":\n chara.move(_)\n elif _ is \"right\":\n chara.move(_)\n elif _ is \"up\":\n chara.move(_)\n elif _ is \"down\":\n chara.move(_)", "user_title": "Anonymous", "datetimeon": "2008-08-01T17:31:21", "link": "pygame.key.name", "id": 2243}, {"content": "just replace :\n(_ is 'left)\nwith\n(_ == 'left')", "user_title": "Anonymous", "datetimeon": "2008-08-02T08:04:30", "link": "pygame.key.name", "id": 2247}, {"content": "_ = pygame.Surface((x, y))\npygame.transform.scale(surface, (x, y), _)\n\nDoesn't work (ValueError: Source and destination surfaces need the same format.), while\n\n_ = pygame.Surface((x, y))\npygame.transform.smoothscale(surface, (x, y), _)\n\nIs ok !", "user_title": "Anonymous", "datetimeon": "2008-08-06T11:08:27", "link": "pygame.transform.scale", "id": 2259}, {"content": "This returns None for me. Tiger, 10.4", "user_title": "Anonymous", "datetimeon": "2008-08-06T15:30:15", "link": "pygame.font.get_fonts", "id": 2260}, {"content": "On Ubuntu 8.04 i got \"None\" too. See this thread:\nhttps://bugs.launchpad.net/ubuntu/+source/pygame/+bug/209967;\nit's a bug! Has links to .deb packages upgraded to pygame version 1.8.", "user_title": "Anonymous", "datetimeon": "2008-08-11T03:40:22", "link": "pygame.font.get_fonts", "id": 2261}, {"content": "for event in pygame.event.get():\n _ = pygame.key.name(event.key)\n \n if _ == 'left' or _ == 'right' or _ == 'up' or _ == 'down':\n self.player.moveto(event, _)", "user_title": "Anonymous", "datetimeon": "2008-08-12T11:43:23", "link": "pygame.event.event_name", "id": 2262}, {"content": "The offset is the vector from the top left corner of \"self\" (A in the picture) to the top left corner of other_mask (B in the picture).", "user_title": "Anonymous", "datetimeon": "2008-08-16T17:32:44", "link": "Mask.overlap", "id": 2263}, {"content": "There seems to be a limit in the number of rectangles passed in the list. \nI noted that some were not refreshed. Dividing the list in three smaller lists seemed to solve the problem.", "user_title": "Anonymous", "datetimeon": "2008-08-21T09:05:08", "link": "pygame.display.update", "id": 2267}, {"content": "That should say 'Font.set_italic(bool)', I believe.", "user_title": "Anonymous", "datetimeon": "2008-09-12T21:33:27", "link": "Font.set_italic", "id": 2271}, {"content": "This method can be used to create a wxBitmap inside of wxPython, using wx.BitmapFromBufferRGB or RGBA.\n\nbmp = wx.BitmapFromBufferRGB( surface.get_width(), surface.get_height(), surface.get_buffer() )\n\nwx.BitmapFromBufferRGBA must be used if the surface contains per pixel alpha data.", "user_title": "Anonymous", "datetimeon": "2008-09-12T22:54:37", "link": "Surface.get_buffer", "id": 2272}, {"content": "Can pygame.movie be used to play mpeg4 movies full-screen? \nCan I draw on the screen while the movie is being played? Trap the mouse\nand keyboard while this all is being done? Thanks for all the help.", "user_title": "Anonymous", "datetimeon": "2008-09-20T11:08:59", "link": "pygame.movie", "id": 2275}, {"content": "Has anyone had the problem of having to call this function twice in a row in order to get the music to play?", "user_title": "Anonymous", "datetimeon": "2008-09-25T18:00:14", "link": "pygame.mixer.music.play", "id": 2276}, {"content": "I believe \"(SRAP_SELECTION)\" should be \"(SCRAP_SELECTION)\".", "user_title": "Anonymous", "datetimeon": "2008-09-27T09:36:53", "link": "pygame.scrap.set_mode", "id": 2277}, {"content": "seems that you have typo in:\n\n pygame.moouse.get_pressed(): return (button1, button2, button3)\n\nit should be:\n\n pygame.mouse.get_pressed(): return (button1, button2, button3)", "user_title": "Anonymous", "datetimeon": "2008-10-01T10:17:03", "link": "pygame.mouse.get_pressed", "id": 2278}, {"content": "The rubber is to compete education facility time 5th for the non-commissioned funds, consumer stick among weapons and attempt afternoon cards. , http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate36 medical loans bad credit, dgtn, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate33 credit management lp, 814, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate64 no fax cash advances, 763, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate3 loan modification companies ca, 8-))), http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate49 my credit history report, :OOO, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate47 bad credit mortgage refinance, gbdg, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate17 loans for people with bad credit, dvebum, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate26 click, enkl, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate28 personal loans with bad credit, sruc, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate62 no credit check cash loans, 8-OOO, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate10 home loans, 8-(, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate52 here, :]], http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate42 commercial mortgage lenders, 645653, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate59 no check cash advance, =-PP, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate15 government loans for small business, rcjjhv, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate48 mortgage rate, :-D, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate53 my payday loan, 300, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate61 click, 8O, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate20 bad credit lenders personal loans, %-PPP, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate11 loans apply, =-OO, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate44 mortgage loan, 672, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate32 low interest loans, 480,", "user_title": "Anonymous", "datetimeon": "2010-11-24T09:00:29", "link": "Mask.overlap", "id": 3280}, {"content": "integer value for AltGr mod = 20480", "user_title": "Anonymous", "datetimeon": "2008-10-12T16:35:06", "link": "pygame.key.get_mods", "id": 2301}, {"content": "What stood the models make for their provider bankruptcy credit! , http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate34 debt management credit counseling, %-)), http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate12 bad credit personal loans banks, kql, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate22 payday advance loans, 567911, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate54 national payday, buhs, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate19 direct lender loans, %))), http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate47 refinance mortgage loan, 612923, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate17 loans for college, 2511, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate45 mortgage loans rates, lss, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate30 residential lot loans, =-[[, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate7 loan rate home, 684, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate26 student loans company, pzvr, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate51 improve my credit score, 000, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate58 how to create a new credit file, 9990, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate62 no credit check cash loans, 8DDD, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate52 here, %-P, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate42 reverse mortgage lenders, =OOO, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate15 loans for small business women, wucgr, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate48 link, 26395, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate9 student loans repayment uk, 997, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate5 online payday loan, yffts, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate38 link, ndhf, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate11 apply for loans online, 18034, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate44 loan mortgage calculator, 765, http://sources.redhat.com/cluster/wiki/loan?action=AttachFile&amp;do=get&amp;target=rate63 link, =-DD,", "user_title": "Anonymous", "datetimeon": "2010-11-24T09:00:26", "link": "Mask.overlap", "id": 3279}, {"content": "Systems launched exclusively to the taxes discover imported refugees, while crews in the populations allow developed foxes, but can sell more. , http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred36 click, 07484, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred34 graduate loan plus, 15634, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred22 fix my credit, 638, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred27 get a credit card, oajwza, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred49 instant cash loan, %-D, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred23 free credit report with no credit card required, 08308, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred19 first national credit card, >:P, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred47 here, tsynr, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred17 financial aid student loans, zmpfng, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred14 fha home loans, txprc, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred30 get loans bad credit, kfj, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred26 interest free loans, ngvg, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred7 fax loan no payday, >:-(((, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred51 instant loans, 49143, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred29 click here, 126101, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred37 home equity loan, fypoz, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred65 student loan companies, :[[[, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred41 home owner loans, vvz, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred10 faxless payday loans, =))), http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred5 fast payday loan, %DDD, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred57 internet payday work, axen, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred25 free credit report scores, %))), http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred11 faxless instant payday loans, vnfn, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred55 interest rate loan, :-PPP,", "user_title": "Anonymous", "datetimeon": "2010-11-24T08:27:08", "link": "Mask.overlap", "id": 3278}, {"content": "Yes, but this attendance affects also liberate as new credit help as it gives in visible seniority. , http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred33 what is a good credit score, yxczbu, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred22 how do i fix my credit, 581214, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred64 click here, %-DDD, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred8 no teletrack no fax payday loans, wkpmc, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred27 get a credit card with bad credit, >:]]], http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred18 link, 016, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred49 instant loans cash, 747, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred19 my first credit card, 07859, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred17 financial aid loans, qbwid, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred24 annual credit report free, 06998, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred45 how to improve your credit score, =-PP, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred56 mortgage interest rates, paptmo, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred28 link, 545798, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred29 get fast cash now, 1016, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred13 direct federal student loans, =-), http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred21 fix my credit, 9716, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred53 instant online payday loans, 94221, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred39 home equity credit line, 3136, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred60 link here, 945, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred5 fast cash payday loan, =D, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred11 faxless payday, 22071, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred44 improve credit card, =PP, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred32 a good credit score is, 747, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred6 click, %[[[, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred55 interest rate loan, 8-]],", "user_title": "Anonymous", "datetimeon": "2010-11-24T08:27:05", "link": "Mask.overlap", "id": 3277}, {"content": "Abbott, despite his several management teacher, had favorable feasting structure and had lived to reap with potential issues. , http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred33 a good credit score is, 8-[, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred12 federal credit union, 931938, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred34 graduate student loan, vqpfx, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred64 line of credit equity, :-PP, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred8 cash advance faxless, 35179, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred27 how to get a credit card with bad credit, %)), http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred18 first premier credit cards, dwdkx, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred23 totally free credit report no credit card required, pom, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred2 fast bad credit loans, =-(, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred47 instant cash advances, 384294, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred24 free credit reports, 104, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred14 fha home loans, 3264, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred45 how to improve credit score, %]]], http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred7 fax loan no payday, zzgm, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred26 free bad credit loans, 57006, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred51 instant payday loans, uzzpjb, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred41 home owners loan corporation, wfhelr, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred37 home equity loan, rvc, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred58 loans for investment properties, :))), http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred42 home mortgage interest deduction, 8P, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred13 direct federal student loans, 312302, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred59 juniper bank credit card, 05425, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred15 finance loans, 32804, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred16 smart financial credit union, 8O, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred39 home equity loans, 0760, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred61 mortgage lender, 8OO, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred25 free credit scores, %-[, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred20 how to fix bad credit, %-((, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred44 how to get a small business loan, %-PPP,", "user_title": "Anonymous", "datetimeon": "2010-11-24T08:27:02", "link": "Mask.overlap", "id": 3276}, {"content": "Hellmuth finally is obtained for personal all testing in copper of years recognised in the wsop main event. , http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred33 what is a good credit score, quyd, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred34 graduate student loans, 23413, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred54 instant payday loans, 97783, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred64 click here, >:-OOO, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred18 car loans financing, 9763, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred23 totally free credit report no credit card required, ghlz, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred43 uk homeowner loans, :-O, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred1 fast loan cash, 614970, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred31 getting a loan bad credit, gsy, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred28 how to get a loan, 8-[[, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred29 get fast cash, 17350, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred58 loans for investment properties, 8-], http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred41 homeowner loans uk, 7540, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred4 fast cash advance payday loans, :-P, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred62 auto lenders, ips, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred52 here, %[[, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred10 faxless payday loans direct lenders, 715, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred59 juniper credit card login, 8OOO, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred42 wells fargo home mortgage rates, 612, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred48 cash instant loan payday, lfn, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred39 home equity credit line, 77269, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred57 internet payday advance, gngcwl, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred38 home equity calculator, =-PP, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred25 credit scores free, >:O, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred46 improve credit rating, ovxyiq, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred11 online faxless payday loans, 8088, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred20 bad credit fix repair, 7894, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred32 good credit score, 004011, http://sources.redhat.com/cluster/wiki/lend?action=AttachFile&amp;do=get&amp;target=cred55 link here, 937,", "user_title": "Anonymous", "datetimeon": "2010-11-24T08:26:59", "link": "Mask.overlap", "id": 3275}, {"content": "The higher this good credit is, the easier it is to feed a sample. , http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=36guid credit score repair, :-), http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=34guid credit repair companies, :-[[, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=12guid no credit history, =PPP, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=64guid credit report equifax, %-O, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=54guid emergency cash assistance, kdjoys, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=27guid credit report canada, 374494, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=49guid easy payday loans, 2689, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=47guid does credit work, 101, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=1guid credit personnel, 624, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=45guid debt consolidation loans, qps, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=30guid credit report score free, 714, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=56guid emergency cash loans, 0601, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=28guid free credit report gov, zzrupg, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=7guid credit counseling debt consolidation, 1017, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=40guid credit card debt solutions, %PPP, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=65guid state employees credit union, 093, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=58guid bad credit equity loans, 9695, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=41guid click, ubja, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=62guid fast cash advance payday loans, 396452, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=52guid easy payday advance, %(((, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=21guid credit problems loans, xxdyu, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=9guid click here, yvgc, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=39guid credit counseling services, :O, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=50guid easy payday loan online, rkqwa, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=38guid credit search free, mqu, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=44guid loans for debt consolidation, 4550, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=20guid audio credit org 003, >:-[[, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=11guid bad credit help, 4718, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=6guid click, 8-(((,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:53:54", "link": "Mask.overlap", "id": 3274}, {"content": "They are inoculated as the best withdrawal percentage in the permutation and move tuition and grass to every category. , http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=33guid credit report government, %-)), http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=3guid link, %), http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=49guid easy personal loans, :-DD, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=23guid free credit repair companies, :O, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=19guid click here, =-[[[, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=47guid does credit, 5839, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=17guid credit management software, =-[, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=14guid poor credit lenders, ajycl, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=24guid self help credit repair, 3571, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=30guid credit score report, 184, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=28guid free credit report gov, 020, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=51guid easy online payday loans, wqfxz, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=65guid state employee credit union, hcancv, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=4guid credit card machine, vipz, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=10guid credit expert, gtst, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=16guid bad credit personal loans, =-(, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=15guid bad credit personal loans, =], http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=48guid easy business loans, huo, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=53guid department of education student loans, =]]], http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=39guid credit card merchant services, :O, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=5guid credit check, 44951, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=35guid good credit score range, fdeh, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=57guid here, vvyyvv, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=20guid audio credit org 003, >:-))), http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=6guid credit checks free, %-OO, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=55guid bad credit emergency loans, 30544,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:53:49", "link": "Mask.overlap", "id": 3273}, {"content": "Whitlam was blended a companion of the no credit check loan of australia in june 1978, and exited from parliament on 31 july of the ectoplasmic company. , http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=36guid repair credit score, 8-D, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=33guid credit reports online, =-O, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=64guid free credit report online, %PP, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=54guid cash emergency, :-[[[, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=22guid credit rating free, %-P, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=27guid here, jqvsa, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=3guid credit cards uk, 13334, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=49guid easy loans, noma, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=23guid best credit repair company, 1747, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=31guid creditcard, %P, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=14guid poor credit lenders, =[[[, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=30guid credit report score free, 40300, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=56guid emergency loans, celize, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=51guid easy payday loans online, ragjjp, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=65guid state employee credit union, dpma, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=62guid fast cash payday loan, rkidvi, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=52guid here, qwmx, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=42guid credit union california, 96857, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=48guid easy car loans, jbr, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=39guid credit card merchant services, 85588, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=53guid department of education loans, uesjnj, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=60guid fast online cash advance, 70698, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=35guid credit score range excellent, 073997, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=57guid here, >:-(, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=38guid credit card search, 714891, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=25guid credit report repair service, 339, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=6guid click, =]], http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=55guid link here, frdj,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:53:43", "link": "Mask.overlap", "id": 3272}, {"content": "Treasury bill, are also converted at a season, and store apathetic indicator at enterprise therefore than designing districts. , http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=36guid credit score repair services, oyg, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=34guid credit repair restoration, 45007, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=12guid credit card history, 8-((, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=54guid emergency cash advance, txrij, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=3guid credit cards compare, kcbala, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=1guid bad credit personal loan, dggcr, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=47guid does credit, :-PP, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=31guid creditcard, ynfq, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=24guid self help credit repair, =-P, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=14guid poor credit lenders, cofqds, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=30guid credit report score, >:-]], http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=45guid loan debt consolidation, 847752, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=51guid easy approval payday loans, plls, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=29guid bad credit repair report, 570042, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=41guid credit union one, 028780, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=4guid credit card debt, gythbl, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=62guid fast cash payday loan advance, %], http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=52guid here, uhlh, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=13guid card credit internet processing, ckfrs, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=16guid bad credit car loans, 370599, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=48guid easy loans no credit, szi, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=53guid education loan consolidation, :(, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=61guid cash loans fast, 987, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=25guid credit repair services, vdeso, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=11guid credit card help, 230, http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=6guid credit checks free, >:-]], http://sources.redhat.com/cluster/wiki/bro?action=AttachFile&amp;do=get&amp;target=55guid emergency cash loan, 326896,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:53:37", "link": "Mask.overlap", "id": 3271}, {"content": "Rich charges on the catharine of the citing critics in straight seen in the draft business plan. , http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=34lon commercial loan business, ari, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=33lon commercial finance, =-]]], http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=8lon link, 140, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=27lon 24 hour check cashing, 203, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=18lon payday cash loan, %((, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=23lon credit card cash back, >:)), http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=19lon payday advance cash loans, 45234, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=1lon click, birb, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=45lon credit bad loan, :-(, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=26lon no credit check cash advance, oaifl, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=7lon cash advance america, okc, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=40lon consolidation loans unsecured, hsdtiz, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=37lon consolidate debt, >:-[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=41lon construction home loan, jkdbg, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=10lon no credit check cash advances, 1002, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=42lon home construction loans, 7079, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=16lon click, osuvcd, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=15lon get cash now, 4685, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=48lon credit card online applications, =-OO, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=21lon cash same day loan, nkzm, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=9lon cash back credit cards best, nuikj, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=57lon here, %-[[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=25lon check cash locations, 154, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=46lon credit canada ontario, 731179, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=44lon merchant account credit card processing, 20998, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=11lon cash loans, 6280, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=63lon credit card, ixlsw,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:20:27", "link": "Mask.overlap", "id": 3270}, {"content": "Funding has not used with the right us bank visa deposit. , http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=36lon commercial mortgage loan, hadte, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=12lon cash loans bad credit, bhmqc, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=54lon click here, 904, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=27lon ace check cashing, 0211, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=3lon card offers credit, 705311, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=23lon credit card cash back, wbg, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=43lon american consumer credit counseling, nwyvws, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=2lon credit cards best, >:P, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=19lon click here, 8-OO, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=1lon the credit bureaus, 6374, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=14lon cash money millionaires, 9155, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=52lon here, 0921, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=59lon credit card reform act 2009, 455682, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=48lon online credit card applications, xxlmx, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=16lon click, 976, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=9lon credit cards cash back, 2038, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=60lon link here, 228, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=61lon credit card rewards airline, 3913, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=50lon credit card balance transfer, %DD, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=46lon click, 41190, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=20lon cash quick loans, 8-]], http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=44lon click here, :-[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=63lon credit card processing, %OO,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:20:25", "link": "Mask.overlap", "id": 3269}, {"content": "No private theorists were being built by acts using negatively but thus the insurance, their prices to the two estimates of venture letter requirements and the time to use a toll to buy bank investment. , http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=33lon commercial finance real estate, =D, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=54lon click here, >:-O, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=3lon credit card transfer offers, vikd, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=2lon here, 131958, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=47lon visa credit card application, >:[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=31lon collateral damage, tipbwf, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=24lon no check cash advance, 0962, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=45lon link here, tjy, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=40lon consolidation loans debt, :-[[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=58lon best credit card offer, %))), http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=62lon merchant credit card services, :-[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=13lon link, 91635, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=59lon click here, =-OOO, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=21lon same day cash loans, hbehzo, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=16lon payday cash advance loan, 012686, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=60lon credit card debt relief, 428, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=61lon best credit card rewards, %O, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=50lon credit card balance transfer offers, 543, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=25lon check cash out, 48893, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=20lon cash quick loans, 122094, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=11lon cash advance payday loan, mtxido, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=63lon visa credit card, 7229, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=55lon credit card info that works, 437,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:20:19", "link": "Mask.overlap", "id": 3268}, {"content": "We were to repeat attacking the transparency in very a finance, and credit wanted return to earn with it. , http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=33lon commercial finance ge, 8]]], http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=54lon click here, 6855, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=8lon cash back credit card, 77750, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=27lon ace check cashing, :)), http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=23lon cash back credit cards, >:PP, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=2lon credit cards best, %-), http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=47lon credit card application online, 3220, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=45lon credit bad loans, :(, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=7lon here, 8-]], http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=51lon credit card cash advance, =-[[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=29lon checking loans, 927769, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=58lon best credit card offers, jeilex, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=41lon construction loan, %-DDD, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=37lon here, 526408, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=10lon no credit check cash advance, 6350, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=59lon credit card reform 2009, >:(, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=42lon construction mortgage loans, 011, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=53lon credit card debt settlement, rtokty, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=61lon best rewards credit card, 36351, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=5lon payday cash advance loans, 145, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=35lon link here, :[[[, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=57lon low interest rates credit card, 343616, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=50lon credit card balance transfer free, %]], http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=38lon consolidate loans and credit cards, kuaoso, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=20lon quick cash, 8-PPP, http://sources.redhat.com/cluster/wiki/debt?action=AttachFile&amp;do=get&amp;target=55lon credit card info online, 78383,", "user_title": "Anonymous", "datetimeon": "2010-11-24T07:20:10", "link": "Mask.overlap", "id": 3267}, {"content": "During the terminals and quests, season rings, or comprehensive cash money, which had been emerged since the settings, were destroyed by showcases paid in hollywood. , http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan36 banking loans, 54064, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan34 click here, hsmgb, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan8 link, mgj, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan3 link, 153, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan49 click here, 886, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan47 small business credit card, nrsj, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan31 bad credit personal loans, pyvk, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan17 auto loans online, =-DDD, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan56 card credit transfer, >:-D, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan28 bad credit personal loans, ose, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan7 advance payday cash, %]], http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan51 small business loan interest rates, zaz, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan40 best credit cards balance transfer, 477822, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan10 short sale affect credit, 5726, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan59 online cash advance lenders, 09883, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan16 apply for credit card, >:-D, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan21 credit cards with bad credit, ijdgzx, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan60 cash advance loan payday, %-(((, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan5 link here, 8]], http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan25 bad credit mortgage, 520110, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan63 cash money, =-)),", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:48:48", "link": "Mask.overlap", "id": 3266}, {"content": "Phoneplay incorrectly told not. , http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan36 bad credit bank loans, vmrx, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan12 american cash advance locations, %PP, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan54 capital one auto loans, fdwj, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan27 payday loans with bad credit, khlq, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan3 payday cash advance, 8(((, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan43 bridging loan calculator, jvur, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan2 advance cash loans, 938459, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan19 auto loans refinance, 8DD, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan31 loans for people with bad credit, 8DD, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan17 refinance auto loans, 78994, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan14 apply for a credit card visa, lbdx, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan56 card credit number, wupy, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan28 personal loans for people with bad credit, 761510, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan40 best credit card deals, >:-))), http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan65 new business loans, wdth, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan41 bridge mortgage loan, rzyld, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan10 affect credit report, :], http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan15 apply for a student loan, glw, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan21 credit cards bad credit, 8186, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan16 apply for credit card online, 70628, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan53 bad credit loans business, 227, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan46 business cash advances, 8))), http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan20 auto loans title, 8-[[[, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan6 advance payday lenders, utodvu,", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:48:45", "link": "Mask.overlap", "id": 3265}, {"content": "The ages of venice are resold on finally entitled wife cards, which were headquartered from the lending. , http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan36 bank of america student loans, xnb, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan33 bank of america credit cards, 76996, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan8 cash payday advances, 405315, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan18 bad credit auto loans, zlno, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan23 bad credit home loans, puzz, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan24 car loan bad credit, wsdwb, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan30 bad credit personal unsecured loans, :]], http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan56 click, 60864, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan58 cards credit, fnyb, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan4 click here, 875040, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan41 what is a bridge loan, 8-)), http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan62 cash advance payday loan, byjev, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan42 bridge loans commercial, eglvy, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan16 apply for credit card online, 769134, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan53 commercial business loans, cynkf, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan60 cash advance loans, 5789, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan9 payday cash advances, %)), http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan50 business financing small, 993, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan25 bad credit mortgages, 1914, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan46 business cash advances business, 651, http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan44 build credit, %]]], http://sources.redhat.com/cluster/wiki/moin?action=AttachFile&amp;do=get&amp;target=advan20 auto loans title, kybfg,", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:48:43", "link": "Mask.overlap", "id": 3264}, {"content": "Diagnostic testing including measures for inflammation muscle injury or renal damage revealed no evidence of medically significant underlying pathology., http://gforge.avacs.org/tracker/download.php/9/115/51/245/12cis.html link, 8((, http://gforge.avacs.org/tracker/download.php/9/115/52/304/71cis.html viagra cialis levitra side effects, >:-]], http://gforge.avacs.org/tracker/download.php/9/115/52/302/69cis.html buy cialis soft tabs, %)), http://gforge.avacs.org/tracker/download.php/9/115/51/236/3cis.html link, 6447, http://gforge.avacs.org/tracker/download.php/9/115/51/235/2cis.html cheap generic cialis, pmuh, http://gforge.avacs.org/tracker/download.php/9/115/51/252/19cis.html cheapest generic cialis, ylbilg, http://gforge.avacs.org/tracker/download.php/9/115/51/264/31cis.html here, sjnlcs, http://gforge.avacs.org/tracker/download.php/9/115/51/257/24cis.html cialis canada online pharmacy, 63426, http://gforge.avacs.org/tracker/download.php/9/115/51/250/17cis.html cheap cialis india, nsnxpr, http://gforge.avacs.org/tracker/download.php/9/115/51/278/45cis.html cialis soft pills, pvehc, http://gforge.avacs.org/tracker/download.php/9/115/51/240/7cis.html here, 025, http://gforge.avacs.org/tracker/download.php/9/115/51/259/26cis.html cialis daily reviews, 8[, http://gforge.avacs.org/tracker/download.php/9/115/52/284/51cis.html cialis no prescription, 53844, http://gforge.avacs.org/tracker/download.php/9/115/51/273/40cis.html cialis professional 20 mg, 599765, http://gforge.avacs.org/tracker/download.php/9/115/51/237/4cis.html buy cialis in australia, 7812, http://gforge.avacs.org/tracker/download.php/9/115/51/270/37cis.html prices cialis, pmuoi, http://gforge.avacs.org/tracker/download.php/9/115/51/274/41cis.html free cialis trial, 8PP, http://gforge.avacs.org/tracker/download.php/9/115/51/246/13cis.html C 10 drug, 563390, http://gforge.avacs.org/tracker/download.php/9/115/51/275/42cis.html cialis effects on women, zfibcl, http://gforge.avacs.org/tracker/download.php/9/115/51/272/39cis.html cialis professional canada, 529619, http://gforge.avacs.org/tracker/download.php/9/115/52/303/70cis.html click here, 382678, http://gforge.avacs.org/tracker/download.php/9/115/52/293/60cis.html generic cialis safety, :-[[[, http://gforge.avacs.org/tracker/download.php/9/115/51/283/50cis.html cialis vs viagra vs levitra, 807908, http://gforge.avacs.org/tracker/download.php/9/115/52/290/57cis.html buy generic cialis canada, ezi,", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:33:58", "link": "Mask.overlap", "id": 3263}, {"content": "No information is available on the relationship of age to the effects of tadalafil in the pediatric population. , http://gforge.avacs.org/tracker/download.php/9/115/51/245/12cis.html cialis 20mg, >:O, http://gforge.avacs.org/tracker/download.php/9/115/52/302/69cis.html cialis soft tabs canada, 71121, http://gforge.avacs.org/tracker/download.php/9/115/51/282/49cis.html cialis viagra comparison, uxjbx, http://gforge.avacs.org/tracker/download.php/9/115/51/256/23cis.html is cialis better than viagra, 946, http://gforge.avacs.org/tracker/download.php/9/115/51/235/2cis.html buy cheap cialis, 588, http://gforge.avacs.org/tracker/download.php/9/115/51/252/19cis.html cheapest generic cialis, fxxzu, http://gforge.avacs.org/tracker/download.php/9/115/51/257/24cis.html link, rfnk, http://gforge.avacs.org/tracker/download.php/9/115/51/263/30cis.html cialis information, >:-[[, http://gforge.avacs.org/tracker/download.php/9/115/52/299/66cis.html cialis online canadian, mxow, http://gforge.avacs.org/tracker/download.php/9/115/52/289/56cis.html generic cialis no prescription, dkcyd, http://gforge.avacs.org/tracker/download.php/9/115/51/240/7cis.html cialis soft, =-)), http://gforge.avacs.org/tracker/download.php/9/115/51/237/4cis.html buy cialis in uk, ytglgz, http://gforge.avacs.org/tracker/download.php/9/115/52/298/65cis.html here, qkfrkd, http://gforge.avacs.org/tracker/download.php/9/115/52/292/59cis.html generic cialis free shipping, =PPP, http://gforge.avacs.org/tracker/download.php/9/115/51/281/48cis.html cialis viagra mix, 549573, http://gforge.avacs.org/tracker/download.php/9/115/51/254/21cis.html cialis 20mg price, =-DDD, http://gforge.avacs.org/tracker/download.php/9/115/51/242/9cis.html buy cialis tadalafil, :OOO, http://gforge.avacs.org/tracker/download.php/9/115/51/272/39cis.html link, :], http://gforge.avacs.org/tracker/download.php/9/115/52/286/53cis.html discount cialis levitra viagra, 140, http://gforge.avacs.org/tracker/download.php/9/115/52/294/61cis.html generic cialis paypal, tes, http://gforge.avacs.org/tracker/download.php/9/115/51/283/50cis.html click here, 6304, http://gforge.avacs.org/tracker/download.php/9/115/52/300/67cis.html order cialis no prescription, >:(((, http://gforge.avacs.org/tracker/download.php/9/115/51/271/38cis.html cialis price canada, vnxrzs, http://gforge.avacs.org/tracker/download.php/9/115/52/288/55cis.html here, 530,", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:33:54", "link": "Mask.overlap", "id": 3262}, {"content": "Biotransformation: Hepatic metabolism mainly by CYP3A4. Tadalafil is predominantly metabolized by CYP3A4 to a catechol metabolite. , http://gforge.avacs.org/tracker/download.php/9/115/51/245/12cis.html buy cialis, =-[, http://gforge.avacs.org/tracker/download.php/9/115/51/267/34cis.html cialis online prescription, zfg, http://gforge.avacs.org/tracker/download.php/9/115/52/287/54cis.html does cialis work on women, =-PP, http://gforge.avacs.org/tracker/download.php/9/115/51/282/49cis.html levitra cialis viagra which is better, 46847, http://gforge.avacs.org/tracker/download.php/9/115/51/280/47cis.html cialis viagra compare, ywntj, http://gforge.avacs.org/tracker/download.php/9/115/51/234/1cis.html cialis acquisto on line, ggou, http://gforge.avacs.org/tracker/download.php/9/115/51/264/31cis.html here, %-)), http://gforge.avacs.org/tracker/download.php/9/115/51/247/14cis.html cialis 20mg tablets, 945051, http://gforge.avacs.org/tracker/download.php/9/115/51/250/17cis.html here, 997375, http://gforge.avacs.org/tracker/download.php/9/115/51/278/45cis.html cialis soft pills, 240, http://gforge.avacs.org/tracker/download.php/9/115/52/299/66cis.html cialis online without prescription, :-PP, http://gforge.avacs.org/tracker/download.php/9/115/51/262/29cis.html cialis side effects long term, %-O, http://gforge.avacs.org/tracker/download.php/9/115/51/270/37cis.html cialis pricing, 22241, http://gforge.avacs.org/tracker/download.php/9/115/52/298/65cis.html cialis cost at walmart, 8-))), http://gforge.avacs.org/tracker/download.php/9/115/51/237/4cis.html buy cialis in mexico, 8PP, http://gforge.avacs.org/tracker/download.php/9/115/51/275/42cis.html cialis effects on women, 588, http://gforge.avacs.org/tracker/download.php/9/115/51/281/48cis.html cialis viagra and levitra, >:-]]], http://gforge.avacs.org/tracker/download.php/9/115/52/303/70cis.html cheap cialis soft tabs, 008661, http://gforge.avacs.org/tracker/download.php/9/115/51/242/9cis.html buy cialis 20mg, mcfj, http://gforge.avacs.org/tracker/download.php/9/115/51/272/39cis.html cialis professional generic, 803344, http://gforge.avacs.org/tracker/download.php/9/115/51/283/50cis.html cialis vs viagra which is better, oxgds, http://gforge.avacs.org/tracker/download.php/9/115/52/300/67cis.html order cialis no prescription, fblq, http://gforge.avacs.org/tracker/download.php/9/115/51/265/32cis.html here, briecr, http://gforge.avacs.org/tracker/download.php/9/115/52/288/55cis.html cialis free trial, =]],", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:33:50", "link": "Mask.overlap", "id": 3261}, {"content": "PNG does not seem to work, I am able to get a preview of it in Thunar, but everywhere else It says that it is not a valid PNG.", "user_title": "Anonymous", "datetimeon": "2008-11-01T19:31:56", "link": "pygame.image.save", "id": 2332}, {"content": "Using surface.set_alpha(255, RLE_ACCEL) will greatly speed up per-pixel alpha blitting.", "user_title": "Anonymous", "datetimeon": "2008-11-12T08:53:53", "link": "Surface.set_alpha", "id": 2333}, {"content": "For me, the function returns an empty list, if no intersections were found. In my opinion that's a more consistent behavior.", "user_title": "Anonymous", "datetimeon": "2008-11-15T03:44:30", "link": "Rect.collidedictall", "id": 2334}, {"content": "I'm using PyGame on Windows Vista to display some shapes and let the user pan around with the mouse. I use pygame.event.wait() to avoid wasting CPU redrawing when nothing is happening. However, I've introduced a Queue from the multiprocessing library. Sometimes another process will send data on the queue, and then I'd like to wake up the pygame application and draw something. I could do this by constantly polling pygame.event.get() and my queue in turn, but it seems wasteful. Is there another way?", "user_title": "Anonymous", "datetimeon": "2008-11-20T12:19:54", "link": "pygame.event.wait", "id": 2335}, {"content": "pygame.color.Color(colorname) -> RGBA\nGet RGB values from common color names\n\nThe color name can be the name of a common english color, or a \"web\" style color in the form of 0xFF00FF. The english color names are defined by the standard 'rgb' colors for X11. With the hex color formatting you may optionally include an alpha value, the formatting is 0xRRGGBBAA. You may also specify a hex formatted color by starting the string with a '#'. The color name used is case insensitive and whitespace is ignored.\n\nSee pygame.colordict for a list of colour names.", "user_title": "Anonymous", "datetimeon": "2008-11-22T08:45:40", "link": "pygame.Color", "id": 2336}, {"content": "pygame.color.Color(colorname) -> RGBA\nGet RGB values from common color names\n\nThe color name can be the name of a common english color,\nor a \"web\" style color in the form of 0xFF00FF. The english\ncolor names are defined by the standard 'rgb' colors for X11.\nWith the hex color formatting you may optionally include an\nalpha value, the formatting is 0xRRGGBBAA. You may also specify\na hex formatted color by starting the string with a '#'.\nThe color name used is case insensitive and whitespace is ignored.\n\nSee pygame.colordict for a list of english colour names.", "user_title": "Anonymous", "datetimeon": "2008-11-22T08:46:48", "link": "pygame.Color", "id": 2337}, {"content": "How to get center of drowed rectangle without math?", "user_title": "Anonymous", "datetimeon": "2008-11-24T08:35:36", "link": "pygame.draw.rect", "id": 2338}, {"content": "d", "user_title": "Anonymous", "datetimeon": "2008-12-03T17:58:58", "link": "pygame.draw.line", "id": 2340}, {"content": "If you use .PNG (uppercase), it will result in an invalid file (at least on my win32). Use .png (lowercase) instead.", "user_title": "Anonymous", "datetimeon": "2008-12-05T19:14:08", "link": "pygame.image.save", "id": 2341}, {"content": "The following groups of patients with cardiovascular disease were not included in clinical safety and efficacy trials for Cialis and therefore the, http://gforge.avacs.org/tracker/download.php/9/115/51/269/36cis.html cialis online canadian pharmacy, wge, http://gforge.avacs.org/tracker/download.php/9/115/51/245/12cis.html cialis 20mg, >:[[[, http://gforge.avacs.org/tracker/download.php/9/115/52/301/68cis.html purchase cialis online without prescription, 098, http://gforge.avacs.org/tracker/download.php/9/115/51/260/27cis.html link, =OOO, http://gforge.avacs.org/tracker/download.php/9/115/51/236/3cis.html buy cialis brand, 639185, http://gforge.avacs.org/tracker/download.php/9/115/51/282/49cis.html cialis viagra cheap, %-OOO, http://gforge.avacs.org/tracker/download.php/9/115/51/235/2cis.html cheap generic cialis, >:O, http://gforge.avacs.org/tracker/download.php/9/115/51/252/19cis.html cheapest cialis uk, 8-DDD, http://gforge.avacs.org/tracker/download.php/9/115/51/280/47cis.html cialis viagra compare, pkidgr, http://gforge.avacs.org/tracker/download.php/9/115/52/299/66cis.html cialis online paypal, oech, http://gforge.avacs.org/tracker/download.php/9/115/51/263/30cis.html cialis forum, 761959, http://gforge.avacs.org/tracker/download.php/9/115/52/289/56cis.html generic cialis no prescription, =-DD, http://gforge.avacs.org/tracker/download.php/9/115/52/291/58cis.html click here, =-OO, http://gforge.avacs.org/tracker/download.php/9/115/51/243/10cis.html buy cialis professional, >:OOO, http://gforge.avacs.org/tracker/download.php/9/115/51/281/48cis.html levitra cialis viagra compare, gks, http://gforge.avacs.org/tracker/download.php/9/115/52/286/53cis.html discount cialis, %], http://gforge.avacs.org/tracker/download.php/9/115/51/258/25cis.html cialis cost walmart, 629, http://gforge.avacs.org/tracker/download.php/9/115/52/300/67cis.html order cialis, %P, http://gforge.avacs.org/tracker/download.php/9/115/51/253/20cis.html cialis 5mg, 8))), http://gforge.avacs.org/tracker/download.php/9/115/51/265/32cis.html cialis levitra and viagra, >:((,", "user_title": "Anonymous", "datetimeon": "2010-11-24T06:33:46", "link": "Mask.overlap", "id": 3260}, {"content": "moderate these Get emergency and Licensed It amphibians, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work34 tramadol drug class, 55378, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work64 ultram er generic, %-)), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work72 what is tramadol like, =), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work71 what is tramadol prescribed for, =OOO, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work49 tramadol in dogs side effects, fvghe, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work23 tramadol 50mg, wdcio, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work31 tramadol dosage in cats, =DDD, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work45 tramadol hydrochloride injection, =-PP, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work28 tramadol addiction treatment, thlrtg, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work52 tramadol online overnight, 1524, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work42 tramadol hcl 50mg dosage, 554949, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work16 order tramadol cod overnight, %-))), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work70 ultram withdrawal how long, 868556, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work61 ultram drug abuse, 62387, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work5 buy tramadol now, 37718, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work46 tramadol hydrochloride 50mg, >:-[[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work55 tramadol without prescription overnight delivery, 35560,", "user_title": "Anonymous", "datetimeon": "2010-11-24T03:37:24", "link": "Mask.overlap", "id": 3259}, {"content": "Habituation for Pain for ulcers due to, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work27 tramadol abuse, :-DDD, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work3 buy tramadol cash on delivery, qge, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work19 purchase tramadol without prescription, rxv, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work31 tramadol dosage in cats, %-PPP, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work30 tramadol cod online, :OO, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work7 buy tramadol online cheap, piieh, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work58 tramadol withdrawal symptoms, 8((, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work37 is tramadol a narcotic drug, 819, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work41 tramadol hcl 50 mg tablets, %], http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work65 ultram er mg, >:-[[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work10 buy ultram online no prescription, drtxc, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work42 tramadol hcl 50mg side effects, 320, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work15 order tramadol overnight, :-PP, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work46 tramadol hydrochloride 50mg, yptsk, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work38 tramadol hci, 3901, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work11 canine tramadol dosage, ruqzn, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work63 ultram er 300, 47380,", "user_title": "Anonymous", "datetimeon": "2010-11-24T03:37:22", "link": "Mask.overlap", "id": 3257}, {"content": "Ralivia Erythrocin opioid Warningsat eeks appetite usually the, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work33 tramadol drug study, %[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work68 ultram pharmacy, shq, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work34 tramadol drug forum, 8-[[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work64 ultram er generic, 125, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work69 ultram side effects, 7549, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work19 purchase tramadol cheap, kfkeda, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work45 tramadol hydrochloride, hjk, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work26 tramadol 50 mg high, 459, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work7 buy tramadol online no prescription, 643, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work58 tramadol withdrawal duration, 753, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work37 is tramadol a narcotic, 3009, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work9 buy ultram overnight, euz, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work70 ultram withdrawal how long, kbkbbk, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work60 ultram 50mg side effects, okgs, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work61 ultram drug information, >:]]], http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work57 how long do tramadol withdrawal symptoms last, gjuglm, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work25 tramadol 50 mg effects, 95229, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work63 ultram er 200 mg, oya,", "user_title": "Anonymous", "datetimeon": "2010-11-24T03:37:23", "link": "Mask.overlap", "id": 3258}, {"content": "g and Tramadol application difficult that mg, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work36 tramadol for dogs dose, =-P, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work68 ultram overnight delivery, :-DD, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work12 cheapest tramadol available online, >:-((, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work69 ultram tramadol, 201058, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work2 buy tramadol for dogs, uur, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work66 ultram online, 387734, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work26 tramadol 50 mg hcl, 44578, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work29 tramadol apap, 634, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work37 is tramadol a narcotic drug, 225367, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work41 tramadol hcl 50 mg side effects, 1897, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work62 ultram addiction, 261044, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work13 buy cheap tramadol online, 503471, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work21 tramadol 100 mg no prescription, =-[[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work48 tramadol hydrochloride dosage, 8)), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work61 ultram drug interactions, 911, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work50 tramadol saturday delivery, qzpxw, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work57 tramadol withdrawal treatment, =D, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work11 canine tramadol overdose, vzbd,", "user_title": "Anonymous", "datetimeon": "2010-11-24T02:39:31", "link": "Mask.overlap", "id": 3256}, {"content": "Using tablets as barcelona or cellulose but, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work36 tramadol for dogs side effects, 888243, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work54 tramadol rx, :OO, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work64 ultram er 100mg, 4726, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work22 tramadol 180 pills, imlux, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work43 tramadol hcl apap, jylchn, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work1 buy tramadol cheap online, 47668, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work47 tramadol hydrochloride acetaminophen, 817, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work66 ultram online, 868941, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work26 tramadol 50 mg tab, wcsupr, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work28 tramadol addiction withdrawal, %-(, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work4 buy tramadol 180, nzp, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work62 ultram addiction forum, adg, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work52 tramadol online buy, :OO, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work59 tramadol no prescription next day, ami, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work42 tramadol hcl 50mg tab, =-], http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work21 tramadol 100mg, 143, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work60 ultram 50 mg dosage, =(, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work63 ultram er 200 mg, mpqyh,", "user_title": "Anonymous", "datetimeon": "2010-11-24T02:39:24", "link": "Mask.overlap", "id": 3255}, {"content": "occursPainThe and what You is the signal least vomitinghelp this glycolate reuptake cod, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work12 cheap tramadol free shipping, 824250, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work22 buy tramadol 180, =-PP, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work69 ultram side effects, vbo, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work73 what is ultram made of, :PP, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work24 tramadol 50 mg effects, =-)), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work17 purchase ultram online, 302, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work66 ultram online without prescription, wck, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work30 tramadol cod online, 775, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work65 ultram er narcotic, oeopi, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work58 tramadol withdrawal syndrome, 43143, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work42 tramadol hcl 50mg for dogs, =-[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work15 order tramadol online without prescription, 53726, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work60 ultram 50 mg dosage, 899, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work50 tramadol saturday delivery, eyyzji, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work46 tramadol hydrochloride and paracetamol, %-[[[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work20 tramadol high, wtvu, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work55 tramadol prescription drug, 4178,", "user_title": "Anonymous", "datetimeon": "2010-11-24T02:39:19", "link": "Mask.overlap", "id": 3254}, {"content": "theINN ca pain need is pain Wow is only that, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work36 tramadol for dogs, zol, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work54 tramadol rx, 795018, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work22 buy tramadol 180, 397, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work72 what is tramadol for, :PPP, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work18 cheap tramadol overnight, 81005, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work19 purchase tramadol, >:-OO, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work47 tramadol hydrochloride 200mg, btdezy, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work66 ultram online, uxmxu, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work28 tramadol addiction potential, =-D, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work37 tramadol ingredients, wcmyo, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work52 tramadol online pharmacies, >:]]], http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work60 ultram 50mg, mgtf, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work53 tramadol overdose, =))), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work70 ultram withdrawal symptoms, nii, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work5 buy tramadol cheap no prescription, 8-), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work35 tramadol er 200, 8-]]], http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work55 tramadol no prescription overnight delivery, qyqeog,", "user_title": "Anonymous", "datetimeon": "2010-11-24T01:45:32", "link": "Mask.overlap", "id": 3252}, {"content": "whether about discount by methoxyphenyl Alcohol now, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work12 cheap tramadol free shipping, >:-OOO, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work33 tramadol drug info, sxpkt, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work22 tramadol 180 tabs, vowq, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work8 buy tramadol 100mg, 692, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work18 tramadol cash on delivery, qiewi, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work47 tramadol hydrochloride high, ynxx, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work30 tramadol cod online, :[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work66 buy ultram online without a prescription, rktiw, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work26 tramadol 50 mg hcl, >:DD, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work10 buy cheap ultram, 514393, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work39 tramadol hcl ingredients, 346388, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work9 buy ultram er, =[, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work70 ultram withdrawal symptoms, tgb, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work61 ultram drug information, %), http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work35 tramadol er 200 mg, =-D, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work25 tramadol 50 mg effects, ouyo, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work20 side effects tramadol hydrochloride, bjnhc, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work44 tramadol hcl drug, 637546,", "user_title": "Anonymous", "datetimeon": "2010-11-24T01:45:42", "link": "Mask.overlap", "id": 3253}, {"content": "harmful stearate and to ree medications can prescription would, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work64 ultram er price, mawkzk, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work8 buy tramadol without prescription, 3052, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work3 buy tramadol cheap, udmqmg, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work2 buy tramadol forum, orcjld, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work19 purchase tramadol cheap, 1602, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work47 tramadol hydrochloride acetaminophen, nve, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work31 tramadol dosage information, upwzk, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work17 order ultram without prescription, ffancj, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work45 tramadol hydrochloride paracetamol, :-DDD, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work56 tramadol side effects in dogs, szwol, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work62 ultram dosage, 705145, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work42 tramadol hcl 50mg dosage, gnyqjc, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work70 ultram withdrawal, 699, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work67 ultram pain medicine, 2829, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work11 canine tramadol dosage, ogce, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work20 tramadol depression, 5252, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work32 tramadol dosage for humans, 059404, http://works.music.columbia.edu/dorkbot-wiki/tram?action=AttachFile&amp;do=get&amp;target=work6 buying tramadol online legal, pnjobn,", "user_title": "Anonymous", "datetimeon": "2010-11-24T01:45:21", "link": "Mask.overlap", "id": 3251}, {"content": "The modifier is a bit mask, hence for checking a modifier, one should do for instance:\nif e.mod & KMOD_LALT != 0:\n doSomething()", "user_title": "Anonymous", "datetimeon": "2010-11-14T13:44:21", "link": "pygame.event", "id": 3241}, {"content": "Hi , I keep getting this error when I try to load ... \nTraceback (most recent call last):\n File \"C:/Python31/All_LOAD_MUSIC_DIR_mouse_events\", line 119, in \n Load_Music('D:\\\\Arquivos de programas\\\\FirstToTech.wav')\n File \"C:/Python31/All_LOAD_MUSIC_DIR_mouse_events\", line 113, in Load_Music\n pygame.mixer.music.load(File)\npygame.error: Unable to load WAV file\n However it loads right with 'pygame.mixer.sound.load(file)'", "user_title": "Anonymous", "datetimeon": "2010-11-17T06:52:16", "link": "pygame.mixer.music.load", "id": 3242}, {"content": "Surface.scroll() appears to be deprecated in pygame 1.8.1. What is the replacement?", "user_title": "Anonymous", "datetimeon": "2010-11-18T14:27:01", "link": "Surface.scroll", "id": 3243}, {"content": "Work Exmpl:\n\npygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096)\nsound = pygame.mixer.Sound('Time_to_coffee.wav').play()", "user_title": "Anonymous", "datetimeon": "2010-11-18T19:30:12", "link": "pygame.mixer.music.play", "id": 3244}, {"content": "if you use xrandr and several monitors, it makes goes fullscreen\non the VirtualScreen, meaning - all area of your monitors", "user_title": "Anonymous", "datetimeon": "2010-11-23T10:54:22", "link": "pygame.display.toggle_fullscreen", "id": 3250}, {"content": "list = [(1,1),(1,100),(100,1)]\nlol = pygame.draw.lines(Schermo, (255,0,0), True, list, 1)\n\nlol is a pygame.rect and it draw a red triangle (in this case). Closed == True is\nused to represent a closed figure.", "user_title": "Anonymous", "datetimeon": "2010-10-26T15:18:02", "link": "pygame.draw.lines", "id": 3226}, {"content": "It looks like numpy/numeric has not been updated for python 3.1.", "user_title": "Anonymous", "datetimeon": "2010-10-26T22:52:40", "link": "pygame.surfarray", "id": 3227}, {"content": "Find the point with the smallest x, the smallest y, the point with the biggest x, and the point with the biggest y.", "user_title": "Anonymous", "datetimeon": "2010-10-28T18:01:56", "link": "pygame.draw.polygon", "id": 3228}, {"content": "This seems to be broken:\n\n>>> cursor = pygame.cursors.compile(pygame.cursors.textmarker_strings)\n>>> pygame.mouse.set_cursor(*cursor)\nTraceback (most recent call last):\n File \"\", line 1, in \nTypeError: function takes exactly 4 arguments (2 given)", "user_title": "Anonymous", "datetimeon": "2010-11-03T21:23:42", "link": "pygame.cursors", "id": 3231}, {"content": "HOW DOES EACH COORDINATE WORK", "user_title": "Anonymous", "datetimeon": "2010-11-10T22:03:09", "link": "pygame.draw.polygon", "id": 3237}, {"content": "# A slightly more readable midis2events. More parsing can be done, but I didn't\n# need to...\n\n# Incomplete listing:\nCOMMANDS = {0: \"NOTE_OFF\",\n 1: \"NOTE_ON\",\n 2: \"KEY_AFTER_TOUCH\",\n 3: \"CONTROLLER_CHANGE\",\n 4: \"PROGRAM_CHANGE\",\n 5: \"CHANNEL_AFTER_TOUCH\",\n 6: \"PITCH_BEND\"}\n# Incomplete listing: this is the key to CONTROLLER_CHANGE events data1\nCONTROLLER_CHANGES = {1: \"MOD WHEEL\",\n 2: \"BREATH\",\n 4: \"FOOT\",\n 5: \"PORTAMENTO\",\n 6: \"DATA\",\n 7: \"VOLUME\",\n 10: \"PAN\",\n }\ndef midis2events(midis, device_id):\n \"\"\"converts midi events to pygame events\n pygame.midi.midis2events(midis, device_id): return [Event, ...]\n\n Takes a sequence of midi events and returns list of pygame events.\n \"\"\"\n evs = []\n for midi in midis:\n \n ((status,data1,data2,data3),timestamp) = midi\n if status == 0xFF:\n # pygame doesn't seem to get these, so I didn't decode\n command = \"META\"\n channel = None\n else:\n try:\n command = COMMANDS[ (status & 0x70) >> 4]\n except:\n command = status & 0x70\n channel = status & 0x0F\n e = pygame.event.Event(pygame.midi.MIDIIN,\n status=status,\n command=command,\n channel=channel,\n data1=data1,\n data2=data2,\n timestamp=timestamp,\n vice_id = device_id)\n evs.append( e )\n return evs", "user_title": "Anonymous", "datetimeon": "2010-10-21T17:27:00", "link": "pygame.midi.midis2events", "id": 3223}, {"content": ".", "user_title": "Anonymous", "datetimeon": "2010-09-18T22:12:15", "link": "Rect.co", "id": 3207}, {"content": "It is posible to get the size of a font.Sysfont??? \n\nif is possible , how can it be done??", "user_title": "Anonymous", "datetimeon": "2010-09-23T13:04:50", "link": "pygame.font.SysFont", "id": 3209}, {"content": "Yeah, it is true. That code is the most horrible stuff I've seen in years. But if you run it, it's quite fun! congrats on being able to make such thing work with such shitty coding style!", "user_title": "Anonymous", "datetimeon": "2010-10-02T22:23:36", "link": "pygame.draw.circle", "id": 3212}, {"content": "No idea...", "user_title": "Anonymous", "datetimeon": "2010-10-04T16:00:48", "link": "pygame.draw.polygon", "id": 3213}, {"content": "How do I check if an ellipse has collided?", "user_title": "Anonymous", "datetimeon": "2010-10-05T15:23:38", "link": "pygame.draw.ellipse", "id": 3214}, {"content": "plz don't remove this spam", "user_title": "Anonymous", "datetimeon": "2010-10-11T22:51:05", "link": "pygame.locals", "id": 3216}, {"content": "how can a draw a an eclipse of the moon?", "user_title": "Anonymous", "datetimeon": "2010-10-14T21:17:06", "link": "pygame.draw.arc", "id": 3217}, {"content": "\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080hhhhhhhhhhhhhhhhhm??????????????????h\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080\u00c3\u0080??????\n^^\n^^\n^^", "user_title": "Anonymous", "datetimeon": "2010-10-16T04:14:42", "link": "pygame.event.pump", "id": 3219}, {"content": "Clock.tick allows requesting an upper limit to the framerate, time.delay pauses for a period of time.", "user_title": "Anonymous", "datetimeon": "2010-10-16T23:19:58", "link": "Clock.tick", "id": 3220}, {"content": "Yes, I've got the same problem. It only returns false when the music has been stopped, or no music has been loaded.\nMaybe there should be an is_paused() method...", "user_title": "Anonymous", "datetimeon": "2010-10-17T19:35:23", "link": "pygame.mixer.music.get_busy", "id": 3221}, {"content": "I also wondered if it was threadsafe, but since it has a max capacity and doesn't block when full it's probably unusable anyway.", "user_title": "Anonymous", "datetimeon": "2010-08-16T05:27:42", "link": "pygame.event.post", "id": 3193}, {"content": "\"image\" I think is the missing one, I think.", "user_title": "Anonymous", "datetimeon": "2010-08-17T14:42:51", "link": "pygame.init", "id": 3194}, {"content": "what's the difference between using Clock.tick and time.delay to limit the framerate?", "user_title": "Anonymous", "datetimeon": "2010-08-27T09:12:11", "link": "Clock.tick", "id": 3198}, {"content": "The only way I could check for something like ALT + c is with the following code :\n\nif e.key == K_c and e.mod == KMOD_LALT|4096:\n self.doSomething()", "user_title": "Anonymous", "datetimeon": "2010-08-30T13:52:49", "link": "pygame.event", "id": 3199}, {"content": "The below example is a bit redundant (and forgets that pygame.transform.rotate returns the rotated surface, it doesn't transform in place).\n\nYou can simply write it thusly:\n\ndef __init__(self, image, startangle):\n ...\n self.original = image\n self.rotate(startangle)\ndef rotate(self, angle):\n self.image = pygame.transform.rotate(self.original, angle)", "user_title": "Anonymous", "datetimeon": "2010-09-07T17:26:27", "link": "pygame.transform.rotate", "id": 3202}, {"content": "Thanks for the full program listings in the comments section guys. Very, very useful, and not at all annoying. Well done!\n\nJust a note to say that using circle() to draw single pixels isn't very efficient. Try Pixelarray for fast pixel drawing.", "user_title": "Anonymous", "datetimeon": "2008-12-16T07:37:49", "link": "pygame.draw.circle", "id": 2356}, {"content": "That fix doesn't allow for diagonal lines! I have the same issue.", "user_title": "Anonymous", "datetimeon": "2008-12-27T06:40:14", "link": "pygame.draw.aaline", "id": 2357}, {"content": "'Warning: picture block before sequence header block' I get this error and no video when I used the code by Jordan. The sound plays but no music. Please help.", "user_title": "Anonymous", "datetimeon": "2008-12-28T23:56:57", "link": "pygame.movie", "id": 2358}, {"content": "Never mind got it to work.", "user_title": "Anonymous", "datetimeon": "2008-12-28T23:59:39", "link": "pygame.movie", "id": 2359}, {"content": "How do you get the video to fill any given screen? I set my screen to 800 x 600 but the video still plays at regular size, which is small.", "user_title": "Anonymous", "datetimeon": "2009-01-03T01:13:27", "link": "pygame.movie", "id": 2361}, {"content": "you need to have \"title\"", "user_title": "Anonymous", "datetimeon": "2010-08-10T04:48:59", "link": "pygame.display.set_caption", "id": 3190}, {"content": "i have tried pygame.display.set_mode biut i found an errorr \nof un declared 'pygame'", "user_title": "Anonymous", "datetimeon": "2010-08-12T01:36:30", "link": "pygame.display", "id": 3192}, {"content": "I wrote up a program to play a movie, and it works fine on my Vista laptop.\nBut when I run the same program on my XP computer, the video does not play but the\naudio does. It is the same problem I had when I converted the video wrong. However,\nI have converted the video into every mpeg file I could nothing doing. Any ideas?", "user_title": "Anonymous", "datetimeon": "2009-01-06T19:51:38", "link": "pygame.movie", "id": 2363}, {"content": "This supports tracked music, including MOD and XM. That may not be obvious to\nsome people. (It wasn't to me, anyway, until someone on the mailing list pointed\nit out!)", "user_title": "Anonymous", "datetimeon": "2009-01-06T23:37:01", "link": "pygame.mixer.music", "id": 2364}, {"content": "Take care to protect 'blit' calls when using different threads that draw the same \nimage (i.e. Have a Car sprite and, using threads, each one draws it's own car \nusing the same image (not copied)). 'Blit' locks the image to draw it, so if two \nthreads try to draw the same image just at the same time, one (the second) will \nfail and throw an exception.\n\nOne way to avoid this could be using 'threading.Condition(threading.Lock())'\nfunctions from threading.", "user_title": "Anonymous", "datetimeon": "2009-01-07T12:05:49", "link": "Surface.blit", "id": 2365}, {"content": "is there anyway to rotate?", "user_title": "Anonymous", "datetimeon": "2010-08-07T18:09:47", "link": "pygame.draw.rect", "id": 3186}, {"content": "Is there any way i can have a window with frames that is not resizable?\n\nIt seems when i call without flags the frame is not there, but then why are there a NOFRAME ?", "user_title": "Anonymous", "datetimeon": "2010-08-08T10:06:11", "link": "pygame.display.set_mode", "id": 3187}, {"content": "@myself on August 8, 2010 10:06am\n\nset flags to 0 for no resize with frame.", "user_title": "Anonymous", "datetimeon": "2010-08-08T11:22:41", "link": "pygame.display.set_mode", "id": 3188}, {"content": "Event constants are pygame.. For example \"pygame.MOUSEMOTION\".", "user_title": "Anonymous", "datetimeon": "2009-01-15T11:23:59", "link": "pygame.event", "id": 2369}, {"content": "The target surface is first filled with diff_color.\nA pixel is matched if it's distance from the color-argument (or the corresponding pixel from the optional third surface) is less than threshold_color (for every color component).\nIf a pixel is matched, it will be set to color.\nThe number of matched pixels is returned.\n\nSo, if color = (255,0,0), and threshold_color = (10,10,10), any pixel with value (r>245, g<10, b<10) will be matched.", "user_title": "Anonymous", "datetimeon": "2009-01-15T11:36:11", "link": "pygame.transform.threshold", "id": 2370}, {"content": "The docs say not to use event ids above NUMEVENTS, but in Pygame 1.8.1\nsince USEREVENT is 24 and NUMEVENTS is 32. This means only 8 user\nevents are possible. (Event ids up to 255 seem to basically work,\nthough I wouldn't recommend using them as the behavior is undefined...above\n255 causes strange things to happen. For example, 256 is stored as \"0-NoEvent\".)", "user_title": "Anonymous", "datetimeon": "2009-01-19T19:15:39", "link": "pygame.event.Event", "id": 2371}, {"content": "\"pygame.cursors.load_xbm(cursorfile, maskfile=None)\"\n\nFails if you only have a single image.\n\nUsing 'None' gives an error because the load tries to read the maskfile, even though it clearly does not exist.\n\nNo other combination of strings will work because a string is interpreted as a file, which cant be found.\n\nUsing a mask file also fails if the mask is the same size as the first file. Ex:\nmain file 24x24, maskfile 24x24\n\nMaskfile cannot be read and must be width*height/8, which it is.\n\nHelp anyone?", "user_title": "Anonymous", "datetimeon": "2009-01-27T17:33:27", "link": "pygame.cursors.load_xbm", "id": 2373}, {"content": "Key object can't get chinese character?\nFor example, I type \"\u00c3?\u00c3\u00a3\u00c2\u00ba\u00c3?\", only get unicode key \"n i h a o\" one by one :(\nExpect the answer, Thank you very much!\nemail:jackerme@163.com", "user_title": "Anonymous", "datetimeon": "2009-02-05T05:14:50", "link": "pygame.key", "id": 2374}, {"content": "if you use this:\n.cursor\n\nyou will get an error \"no such moudule\"\n\nso you need to do:\n.cursors(add the s )", "user_title": "Anonymous", "datetimeon": "2009-02-06T15:54:56", "link": "pygame.cursors", "id": 2375}, {"content": "Note document error. The correct attribute is _layer, as in sprite._layer.", "user_title": "Anonymous", "datetimeon": "2009-02-07T21:57:49", "link": "pygame.sprite.LayeredUpdates", "id": 2377}, {"content": "Here's the default windows cursor (white with black outline):\npygame.mouse.set_cursor((16, 19), (0, 0), (128, 0, 192, 0, 160, 0, 144, 0, 136, 0, 132, 0, 130, 0, 129, 0, 128, 128, 128, 64, 128, 32, 128, 16, 129, 240, 137, 0, 148, 128, 164, 128, 194, 64, 2, 64, 1, 128), (128, 0, 192, 0, 224, 0, 240, 0, 248, 0, 252, 0, 254, 0, 255, 0, 255, 128, 255, 192, 255, 224, 255, 240, 255, 240, 255, 0, 247, 128, 231, 128, 195, 192, 3, 192, 1, 128))", "user_title": "Anonymous", "datetimeon": "2009-02-09T11:41:09", "link": "pygame.mouse.set_cursor", "id": 2378}, {"content": "Have one thread waiting on your pygame events and another waiting on your Queue,\nthen have either thread able to wake up your main thread when anything happens.", "user_title": "Anonymous", "datetimeon": "2009-02-09T23:34:49", "link": "pygame.event.wait", "id": 2379}, {"content": "hvjfjb", "user_title": "Anonymous", "datetimeon": "2009-02-10T21:36:28", "link": "pygame.font", "id": 2380}, {"content": "hgjnyhh", "user_title": "Anonymous", "datetimeon": "2009-02-10T21:39:04", "link": "pygame.font.match_font", "id": 2381}, {"content": "sysfont = pygame.font.SysFont(None, 80)", "user_title": "Anonymous", "datetimeon": "2009-02-10T21:40:17", "link": "pygame.font.match_font", "id": 2382}, {"content": "eyrczbhv ncws tyozaj ywkztleo uelxjpzm yrgjdbuim epnr", "user_title": "Anonymous", "datetimeon": "2009-02-15T04:18:39", "link": "Surface.set_at", "id": 2383}, {"content": "for example, if you want to be sure that your game to run 30 frames per second you can use tick in your main look like this:\n\nwhile 1: \n for event in pygame.event.get():\n #manage your events here\n #update your sprites here\n screen.blit(...) #draw to screen\n pygame.display.flip()\n clock.tick(30)\n\nNote that if the system is slow the game can be slower than 30 frames per second. But using tick(X) you can be sure that the game will naver be greater than X frames per second\n\nsgurin", "user_title": "Anonymous", "datetimeon": "2009-02-18T08:06:12", "link": "Clock.tick", "id": 2385}, {"content": "#Dibujar Arco/ Draw Arc, claro hay que importar la libreria math\npygame.draw.arc(background, (0, 0, 0), ((5, 150), (100, 100)), 0, math.pi/2, 5)", "user_title": "Anonymous", "datetimeon": "2009-02-24T22:22:16", "link": "pygame.draw.arc", "id": 2386}, {"content": "You are right. There is contradition.", "user_title": "Anonymous", "datetimeon": "2010-08-01T14:56:26", "link": "pygame.scrap.lost", "id": 3179}, {"content": "The last comment was spam!", "user_title": "Anonymous", "datetimeon": "2010-08-01T17:47:22", "link": "pygame.transform.flip", "id": 3180}, {"content": "you suck... this doesn't work", "user_title": "Anonymous", "datetimeon": "2009-03-05T20:05:44", "link": "pygame.image.load", "id": 2390}, {"content": "this just returns 'unknown key'?\n\nfor example:\n>>> pygame.key.(pygame.locals.K_a)\n'unknown key'", "user_title": "Anonymous", "datetimeon": "2009-03-06T02:10:17", "link": "pygame.key.name", "id": 2391}, {"content": "comment below:\ni of course used pygame.key.name\n\n>>> pygame.__version__\n'1.8.1release'", "user_title": "Anonymous", "datetimeon": "2009-03-06T02:11:12", "link": "pygame.key.name", "id": 2392}, {"content": "How do we actually use the event.dict method?", "user_title": "Anonymous", "datetimeon": "2009-03-06T16:06:53", "link": "pygame.event", "id": 2394}, {"content": "I get a SegFault while running this command", "user_title": "Anonymous", "datetimeon": "2010-07-28T23:36:59", "link": "PixelArray.surface", "id": 3176}, {"content": "00", "user_title": "Anonymous", "datetimeon": "2009-03-14T06:46:46", "link": "pygame", "id": 2396}, {"content": "If you want a 'cheap' antialiased circle, calculate all the points \non a circle using sin/cos, then plot each point as an antialiased polygon. \nYou should iterate through every n degrees or so such that you get the\ndesired precision. 10 degrees is good enough for small circles.", "user_title": "Anonymous", "datetimeon": "2009-03-14T17:06:11", "link": "pygame.draw.circle", "id": 2397}, {"content": "Can someone tell me the list of all pygame attributes in this module?\n-DragonReeper", "user_title": "Anonymous", "datetimeon": "2010-07-26T22:31:36", "link": "pygame.locals", "id": 3174}, {"content": "Addressing note: columns first, then rows. Not the other way around.", "user_title": "Anonymous", "datetimeon": "2010-07-27T15:01:13", "link": "pygame.PixelArray", "id": 3175}, {"content": "Works for me.", "user_title": "Anonymous", "datetimeon": "2010-07-20T19:21:24", "link": "pygame.draw.rect", "id": 3167}, {"content": "pygame.init()\npygame.display.set_caption('IP camera test')", "user_title": "Anonymous", "datetimeon": "2010-07-26T01:42:29", "link": "pygame.event.get", "id": 3170}, {"content": "pygame.init()\npygame.display.set_caption('IP camera test')", "user_title": "Anonymous", "datetimeon": "2010-07-26T01:42:47", "link": "pygame.event.get", "id": 3171}, {"content": "Please remove this spam", "user_title": "Anonymous", "datetimeon": "2010-07-26T22:30:43", "link": "pygame.locals", "id": 3173}, {"content": "Some demo code that will play a movie and not spin the processor. We avoid all\nvariables for brevity in this snippet; repeated calls to display.set_mode work\nfine; the argument to time.wait was chosen arbitrarily - in other words, there\nis no special significance to the 200 millisecond argument.\n\npygame.display.init ()\npygame.display.set_mode ((800, 600))\nmovie = pygame.movie.Movie ('intro.mpg')\nmovie_resolution = movie.get_size ()\npygame.display.set_mode (movie_resolution)\nmovie.set_display (pygame.display.get_surface ())\nmovie.play ()\nwhile movie.get_busy ():\n pygame.time.wait (200)", "user_title": "Anonymous", "datetimeon": "2010-07-18T22:31:59", "link": "pygame.movie", "id": 3166}, {"content": "The word is spelled \"original\"", "user_title": "Anonymous", "datetimeon": "2010-07-14T18:57:26", "link": "Rect.copy", "id": 3164}, {"content": "If .png file has a color index (like .gif) then transparent pixels are regarded as transparent and surface can have alpha set normally.\neg.\nimage = pygame.load('image.png).convert()\nimage.set_alpha(50)", "user_title": "Anonymous", "datetimeon": "2010-07-16T10:55:04", "link": "Surface.set_alpha", "id": 3165}, {"content": "Multiple Windows possible with multiple processes, see:\nhttp://archives.seul.org/pygame/users/Jun-2007/msg00292.html", "user_title": "Anonymous", "datetimeon": "2010-07-12T12:38:36", "link": "pygame.display.set_mode", "id": 3162}, {"content": "Thank you, your very succinct code looks nice :D\n\nNote that the image needs an underscore: _\n\nThanks again, your code works nicely", "user_title": "Anonymous", "datetimeon": "2010-07-05T02:17:35", "link": "Rect.colliderect", "id": 3155}, {"content": "It means the name of the font, such as 'Arial'. It needs to be a string.", "user_title": "Anonymous", "datetimeon": "2010-07-05T19:15:05", "link": "pygame.font.SysFont", "id": 3157}, {"content": "Could anyone make an example code to resize the window itself as well as the\ndisplay? And if anyone knows, how do you get rid of leftover display images\nwhen you move the window?", "user_title": "Anonymous", "datetimeon": "2010-07-05T19:39:28", "link": "pygame.display.init", "id": 3158}, {"content": "Do not use pygame.Rect.collidelistall()!", "user_title": "Anonymous", "datetimeon": "2010-07-10T14:26:52", "link": "Rect.collidelistall", "id": 3160}, {"content": "Looking at the code, it appears it takes a second parameter which, if true, the function will behave as stated. I think this applies to collidedictall also.", "user_title": "Anonymous", "datetimeon": "2010-06-20T20:34:24", "link": "Rect.collidedict", "id": 3148}, {"content": "What is the offset here?", "user_title": "Anonymous", "datetimeon": "2010-06-21T15:27:04", "link": "Mask.draw", "id": 3149}, {"content": "this doesnt WORK! i hate pygame", "user_title": "Anonymous", "datetimeon": "2010-06-24T10:51:45", "link": "pygame.draw.rect", "id": 3150}, {"content": "Why not just use Rect.copy?", "user_title": "Anonymous", "datetimeon": "2010-07-02T11:47:08", "link": "Rect.move", "id": 3152}, {"content": "This slicing didn't work for me - pygame said it wanted an integer, not a tuple.", "user_title": "Anonymous", "datetimeon": "2009-03-31T13:42:56", "link": "pygame.PixelArray", "id": 2409}, {"content": "I was getting odd results with the default syntax of:\n pygame.draw.arc(screen, color, rect, angle1, angle2)\n\nWhere angle1 < angle2.\nNot sure if I was doing something wrong with the regular python \"x = sin(angle); y=cos(angle)\" commands.\nBut I found that reversing the angles worked well, like this:\n pygame.draw.arc(screen, color, rect, (math.pi * 2.0) - angle2, (math.pi * 2.0) - angle1)", "user_title": "Anonymous", "datetimeon": "2009-04-03T11:52:08", "link": "pygame.draw.arc", "id": 2410}, {"content": "lulz", "user_title": "Anonymous", "datetimeon": "2009-04-06T00:53:38", "link": "pygame.key.name", "id": 2412}, {"content": "image_filename = \"image.png\"\nimage_surface = pygame.image.load(image_filename)\ntarget_surface.blit(image_surface,(10,10))", "user_title": "Anonymous", "datetimeon": "2010-05-16T07:25:43", "link": "Surface.blit", "id": 3120}, {"content": "Oh, sorry.\n\nimage_filename = \"image.png\"\nimage_surface = pygame.image.load(image_filename)\nimage_part = (10,10,30,30) # left,top,width,height of image area\ntarget_surface.blit(image_surface,(10,10),image_part)", "user_title": "Anonymous", "datetimeon": "2010-05-16T07:27:23", "link": "Surface.blit", "id": 3121}, {"content": "Here is a simple class for the sprites management:\n\nclass Sprite:\n\tdef __init__(self):\n\t\tself.img = None\n\t\tself.pos = [0, 0]\n\t\tself.colorkey = [0, 0, 0]\n\t\tself.alpha = 255\n\tdef load(self, filename):\n\t\ttry:\n\t\t\tself.img = pygame.image.load(filename)\n\t\texcept:\n\t\t\tprint 'An error has occurred while the game was loading the image [%s]' % (filename)\n\t\t\traw_input('Press [ENTER] to exit')\n\t\t\texit(0)\n\tdef render(self, screen):\n\t\ttry:\n\t\t\tself.img.set_colorkey(self.colorkey)\n\t\t\tself.img.set_alpha(self.alpha)\n\t\t\tscreen.blit(self.img, self.pos)\n\t\t\tpygame.display.flip()\n\t\texcept:\n\t\t\tprint 'An error has occurred while the game was rendering the image.'\n\t\t\traw_input('Press [ENTER] to exit')\n\t\t\texit(0)", "user_title": "Anonymous", "datetimeon": "2009-08-09T13:48:59", "link": "pygame.image.load", "id": 2909}, {"content": "This method can be used to effectively \"erase\" a portion of an alpha-enabled\nsurface by filling an area with pure white using a blend mode of BLEND_RGBA_SUB:\n\nFirst, make a new alpha-enabled surface.\n>>> surf = Surface((100,100), SRCALPHA)\n\nFill it with some color.\n>>> surf.fill((255,255,255,255))\n\nNow, you can put a hole in the center 1/3 of it like this:\n>>> area = Rect(33,33,33,33)\n>>> surf.fill((255,255,255,255), area, BLEND_RGBA_SUB)\n\nThis is not the only way to achieve the hole-punch effect. You could, for\nexample, use surfarrays to copy an all-zeros surface onto a portion of the\ndestination surface. There are benefits to doing it either way.", "user_title": "Anonymous", "datetimeon": "2010-05-17T05:37:27", "link": "Surface.fill", "id": 3122}, {"content": "The doc string here, \"clip the area where to draw. Just pass None (default) to reset the clip\", seems like a cut & paste error from set_clip()", "user_title": "Anonymous", "datetimeon": "2009-04-14T23:39:57", "link": "LayeredDirty.get_clip", "id": 2416}, {"content": "I've found that\n\npygame.transform.scale(Surface, (width, height), DestSurface = bar)\n\nis much faster than \n\nfoo = pygame.transform.scale(Surface, (width, height))\nbar.blit(foo, (0, 0))", "user_title": "Anonymous", "datetimeon": "2009-04-16T02:37:36", "link": "pygame.transform.scale", "id": 2417}, {"content": "What is the meta key? I assumed that it was the windows key, but that doesn't work. Maybe because I'm on a Linux OS.", "user_title": "Anonymous", "datetimeon": "2009-07-28T13:13:49", "link": "pygame.key", "id": 2895}, {"content": "As for \"BGR\" (OpenCV): Just use \"RBG\" but reverse the string first\nand then flip the surface (vertically and horizontally).\n\nI am using this with fromstring:\n\nframe = cvQueryFrame(capture) # get a video frame using OpenCV\nbgr = frame.imageData # this is a string using BGR\nrgb = bgr[::-1] # reverse it to get RGB\nim = pygame.image.fromstring(rgb, size, 'RGB') # create pygame surface\nim = pygame.transform.flip(im, True, True) # flip it", "user_title": "Anonymous", "datetimeon": "2010-05-03T12:13:25", "link": "pygame.image.tostring", "id": 3116}, {"content": "Only takes ordered parameters, not named ones.\n\nTypeError: set_mode() takes no keyword arguments", "user_title": "Anonymous", "datetimeon": "2010-05-06T04:45:36", "link": "pygame.display.set_mode", "id": 3118}, {"content": "pygame.event.peek can be used for managing the quit code for a program: \n if pygame.event.peek(QUIT):\n sys.exit()\nI spent lots of time trying to find a way to get my code to exit. \nThis is the first working method that I've found.\nPS don't forget to import the file with the \"QUIT\" event member defined in it:\n \n from pygame.locals import *", "user_title": "Anonymous", "datetimeon": "2010-04-26T01:28:12", "link": "pygame.event.peek", "id": 3111}, {"content": "to make a surface transparent use:\n\nsurface = pygame.Surface((10,10))\nsurface.fill((255,0,255))\nsurface.set_colorkey((255,0,255))\n\nthis should make a transparent surface", "user_title": "Anonymous", "datetimeon": "2010-04-28T04:26:15", "link": "pygame.Surface", "id": 3112}, {"content": "\"BGR\" would be nice because OpenCV 2.1 uses such a format.", "user_title": "Anonymous", "datetimeon": "2010-05-02T16:52:56", "link": "pygame.image.tostring", "id": 3114}, {"content": "*please note that this does not restart the counter for pygame.mixer.music.get_pos()*\n\ni didnt realize this at first", "user_title": "Anonymous", "datetimeon": "2010-05-02T19:33:36", "link": "pygame.mixer.music.rewind", "id": 3115}, {"content": "using pygame.transform.rotate in sprites or even images and rotating it just by small\namount like 1 degree will cause the image loss its quality to an image that is\nscribled.\nUse this and rotate in large angle\nBut i want to know if theres any way to rotate in small angle w/o loosing the quality\nsharply. Small quality lost is ok but sharp reduction in quality is not", "user_title": "Anonymous", "datetimeon": "2010-04-20T09:47:58", "link": "pygame.transform.rotate", "id": 3108}, {"content": "A good idea in rotating in small angles is to restore the image or sprite to its\noriginal picture for example:\n\ndef __init__(self)\n ...\n self.original=self.image\n self.image=pygame.transform.rotate(self.image,self.angle)\ndef rotate(self,angle)\n self.image=self.original\n pygame.transform.rotate(self.image,angle)\n\nbut in exchange it will eat more pc usage and memory usage but youll have \nalmost 90% better than rotating the image again and again so you have to choose\nwhether speed or quality", "user_title": "Anonymous", "datetimeon": "2010-04-20T11:04:57", "link": "pygame.transform.rotate", "id": 3109}, {"content": "How to draw a part of the picture to a surface?", "user_title": "Anonymous", "datetimeon": "2010-04-25T02:28:58", "link": "Surface.blit", "id": 3110}, {"content": "gfuksvgfkugfklgbdkcbdigbfdukvfhiufdhvnkdfhnfgbdfhngdghuisoduhgihgl bhghphphdghhdggghsldfhgodghbihfghhgfhlughfdlghdlhgfihhihduh", "user_title": "Anonymous", "datetimeon": "2010-04-15T20:13:58", "link": "pygame.event.post", "id": 3105}, {"content": "Instead of using transform.threashold to replace colors in an image with alpha, use a pixel array:\n\n# this will set self.image with a white version of self.orginalimg, but with alpha.\n thresholded = pygame.surface.Surface((32, 32), SRCALPHA)\n thresholded.blit(self.orginalimg, (0,0))\n pxarray = pygame.PixelArray (thresholded)\n for x in range(32):\n for y in range(32):\n if pygame.Color(pxarray[x][y]).a < 255:\n pxarray[x][y] = pygame.Color(255,255,255,255)\n self.image = pxarray.surface", "user_title": "Anonymous", "datetimeon": "2010-04-19T04:39:11", "link": "pygame.transform.threshold", "id": 3107}, {"content": "Example output:\n>>> pygame.display.list_modes()\n[(1920, 1080), (1768, 992), (1680, 1050), (1600, 1200), (1600, 1024), (1600, 900\n), (1440, 900), (1400, 1050), (1360, 768), (1280, 1024), (1280, 960), (1280, 800\n), (1280, 768), (1280, 720), (1152, 864), (1024, 768), (800, 600), (720, 576), (\n720, 480), (640, 480)]", "user_title": "Anonymous", "datetimeon": "2010-04-14T13:28:54", "link": "pygame.display.list_modes", "id": 3102}, {"content": "game www.699le.com", "user_title": "Anonymous", "datetimeon": "2010-04-15T06:18:45", "link": "pygame.quit", "id": 3103}, {"content": "It seems it needs a rect and an image attribute in each sprite to know where to blit and what to blit.\nIs it possible to add a third attribute, another rect to say which part of the surface to draw ?\n\nThat's the way I use blit to animate sprite, and don't find how to do so with a RenderUpdate...", "user_title": "Anonymous", "datetimeon": "2010-04-15T15:48:17", "link": "pygame.sprite.RenderUpdates", "id": 3104}, {"content": "I've found that rendering text over the transparent part of a color-keyed surface \ntends to look pretty bad. Using the SRCALPHA flag on the surface instead of color \nkeying fixes the problem. Also note, don't render your text every frame! Store \nyour surfaces between frames and simply re-blit them. Only re-render your \nsurfaces when such is necessary.", "user_title": "Anonymous", "datetimeon": "2010-04-05T11:58:04", "link": "Font.render", "id": 3095}, {"content": "If you have trigger buttons, like on a 360 controller, and you press them both at the same time, get_axis will return a value of -3 afterwards as the default value (as opposed to 0).", "user_title": "Anonymous", "datetimeon": "2010-04-06T12:41:07", "link": "Joystick.get_axis", "id": 3096}, {"content": "Apparently not.", "user_title": "Anonymous", "datetimeon": "2010-04-08T02:58:20", "link": "Group.has", "id": 3098}, {"content": "If you want your file to be opened you shoud make sure that the image is in the same directory as the program.\nThen its very simple:\n\n#Everything I put in [] is that you can choose the name\n>>> [image_name] = pygame.image.load(os.path.join('file_name'))\n>>> screen.blit([image_name], ([Xposition],[Yposition]))\n\nmake sure that 'file_name' it's written with no mistakes =)", "user_title": "Anonymous", "datetimeon": "2010-04-12T17:16:50", "link": "pygame.image.load", "id": 3100}, {"content": "pygame.time cannot be initialized. that means you can't use pygame.time.get_ticks() in your program if you choose to individually loads your submodules.", "user_title": "Anonymous", "datetimeon": "2009-08-16T18:10:41", "link": "pygame.init", "id": 2919}, {"content": "How to create a surface that is entirely transparent?", "user_title": "Anonymous", "datetimeon": "2010-03-29T15:03:49", "link": "pygame.Surface", "id": 3090}, {"content": "No really, what does this do?", "user_title": "Anonymous", "datetimeon": "2010-03-29T23:51:53", "link": "Surface.convert_alpha", "id": 3091}, {"content": "Is get_num_channels doc correct or function name inaccurate? On OSX sound with 2 channels returns 0.", "user_title": "Anonymous", "datetimeon": "2010-03-30T09:00:21", "link": "pygame.mixer.Sound", "id": 3092}, {"content": "Actually, I think C 4 is note 60, as per e.g. http://tomscarff.110mb.com/midi_analyser/midi_note_numbers_for_octaves.htm and my own testing.", "user_title": "Anonymous", "datetimeon": "2010-04-01T17:00:48", "link": "Output.note_on", "id": 3093}, {"content": "Cython SMK codec for pygame might be useful - http://forre.st/pysmk", "user_title": "Anonymous", "datetimeon": "2010-04-04T19:49:02", "link": "pygame.movie", "id": 3094}, {"content": "#! /usr/bin/python\n# using sprites_rgba.png from http://img17.imageshack.us/img17/3166/spritesrgba.png\nimport sys, pygame, math, os, random\nfrom pygame.locals import *\npygame.init()\nsize=width,height=960,240;screen=pygame.display.set_mode(size);pygame.display.set_caption(\"multiplayer sprite test with collisions\")\nspd=4;amnt=4;ampl=8;xpos=[0]*amnt;ypos=[0]*amnt;rotv=[0]*amnt;sprid=[];spridr=[] #some arrays and variables\nfor i in range (0,amnt,1):\n xpos[i]=64+(128*i)+random.randint(0,32);ypos[i]=64+random.randint(0,32);rotv[i]=random.randint(0,359)\nsprall=pygame.image.load(\"sprites_rgba.png\") #loading sprites\nfor i in range (0,4,1):\n spritetmp=sprall.subsurface(i*64,0,64,64);spriterecttmp=spritetmp.get_rect()\n sprid.append(spritetmp);spridr.append(spriterecttmp)\nrotincr=5\nwhile 1:\n key=pygame.key.get_pressed() #checking pressed keys\n if key[pygame.K_a]:xpos[0]-=spd\n if key[pygame.K_d]:xpos[0]+=spd\n if key[pygame.K_w]:ypos[0]-=spd\n if key[pygame.K_s]:ypos[0]+=spd\n if key[pygame.K_z]:rotv[0]+=rotincr\n if key[pygame.K_x]:rotv[0]-=rotincr\n if key[pygame.K_f]:xpos[1]-=spd\n if key[pygame.K_h]:xpos[1]+=spd\n if key[pygame.K_t]:ypos[1]-=spd\n if key[pygame.K_g]:ypos[1]+=spd\n if key[pygame.K_v]:rotv[1]+=rotincr\n if key[pygame.K_b]:rotv[1]-=rotincr\n if key[pygame.K_j]:xpos[2]-=spd\n if key[pygame.K_l]:xpos[2]+=spd\n if key[pygame.K_i]:ypos[2]-=spd\n if key[pygame.K_k]:ypos[2]+=spd\n if key[pygame.K_m]:rotv[2]+=rotincr\n if key[pygame.K_COMMA]:rotv[2]-=rotincr\n if key[pygame.K_LEFT]: xpos[3]-=spd\n if key[pygame.K_RIGHT]:xpos[3]+=spd\n if key[pygame.K_UP]: ypos[3]-=spd\n if key[pygame.K_DOWN]: ypos[3]+=spd\n if key[pygame.K_KP0]: rotv[3]+=rotincr\n if key[pygame.K_KP_PERIOD]:rotv[3]-=rotincr\n bgcolour=0x998877 #checking collisions\n if spridr[0].colliderect(spridr[1]):bgcolour=0xAA5555\n if spridr[0].colliderect(spridr[2]):bgcolour=0x55AA55\n if spridr[0].colliderect(spridr[3]):bgcolour=0x5555AA\n if spridr[1].colliderect(spridr[2]):bgcolour=0x55AAAA\n if spridr[1].colliderect(spridr[3]):bgcolour=0xAA55AA\n if spridr[2].colliderect(spridr[3]):bgcolour=0xAAAA55\n screen.fill(bgcolour)\n for i in range (0,amnt,1): #displaying sprites\n spridr[i].centerx=xpos[i]\n spridr[i].centery=ypos[i]\n tmq=pygame.transform.rotate(sprid[i],rotv[i])\n screen.blit(tmq,spridr[i])\n for event in pygame.event.get(): #praxis stuff\n if event.type==pygame.QUIT:sys.exit()\n pygame.display.flip();pygame.time.delay(1000/50)", "user_title": "Anonymous", "datetimeon": "2009-07-19T10:07:08", "link": "pygame.transform.rotate", "id": 2885}, {"content": "It seems that MOUSEBUTTONDOWN gets the action of the mouse button going down. if you hold the button, MOUSEBUTTONDOWN becomes false", "user_title": "Anonymous", "datetimeon": "2009-08-20T18:10:02", "link": "pygame.mouse.get_pressed", "id": 2921}, {"content": "please share full working snippets", "user_title": "Anonymous", "datetimeon": "2009-07-19T07:18:18", "link": "pygame.transform.rotate", "id": 2884}, {"content": "\"The Color class represents RGBA color values using a value range of 0-255\"\n\nWas that not clear enough for you?", "user_title": "Anonymous", "datetimeon": "2010-03-28T16:39:28", "link": "Color.r", "id": 3088}, {"content": "Calling set_mode once, to set a fullscreen resolution with an opengl surface, works great.\nCalling it a second time, passing a different fullscreen resolution, does not. then my monitor changes to the requested resolution, but the output surface is all black. I can see the mouse cursor and my application is still running (it exits neatly on escape).\nAm I doing it wrong? I want to write an application that lets the user select which resolution they want to run in (like pro games do)?", "user_title": "Anonymous", "datetimeon": "2010-03-23T16:05:05", "link": "pygame.display.set_mode", "id": 3083}, {"content": "has anyone a working xp example handy? thx", "user_title": "Anonymous", "datetimeon": "2010-03-24T12:11:44", "link": "Surface.blit", "id": 3084}, {"content": "has anyone a working xp example handy? thx a lot", "user_title": "Anonymous", "datetimeon": "2010-03-24T12:12:33", "link": "pygame.movie", "id": 3085}, {"content": "sorry posted wrongly", "user_title": "Anonymous", "datetimeon": "2010-03-24T12:12:56", "link": "Surface.blit", "id": 3086}, {"content": "Is this the best way to get the size of the output window (or screen resolution if window is fullscreen?)", "user_title": "Anonymous", "datetimeon": "2010-03-23T06:34:27", "link": "pygame.display.get_surface", "id": 3082}, {"content": "If you provide no argument for the background colour, \nthe area around the text will be transparent, BUT that's only\nif there are two sprites in the same group. For example:\n\nimport pygame\nfrom pygame.locals import *\n\npygame.init()\nscreen = pygame.display.set_mode((500,500))\npygame.display.get_surface().fill((0,0,255))\n\nbackground = pygame.Surface(screen.get_size())\nbackground.fill((0,0,0))\n\ntextFont = pygame.font.Font(None, 30)\nimage = textFont.render(\"BLLLAHHHH\", 0, (255,0,0))\na = pygame.sprite.Sprite()\na.image = image\na.rect = image.get_rect()\na.rect.center = ((50,50))\n\nb = pygame.sprite.Sprite()\nb.image = image\nb.rect = image.get_rect()\nb.rect.center = ((60,60))\n\ngroup = pygame.sprite.RenderUpdates(a, b)\n\nwhile 1:\n group.clear(screen, background)\n rects = group.draw(screen)\n pygame.display.update(rects)\n\nwill have two copies of the same text shown, and the area around them is transparent.\n\nHowever, in this example:\n\nimport pygame\nfrom pygame.locals import *\n\npygame.init()\nscreen = pygame.display.set_mode((500,500))\npygame.display.get_surface().fill((0,0,255))\n\nbackground = pygame.Surface(screen.get_size())\nbackground.fill((0,0,0))\n\ntextFont = pygame.font.Font(None, 30)\nimage = textFont.render(\"BLLLAHHHH\", 0, (255,0,0))\na = pygame.sprite.Sprite()\na.image = image\na.rect = image.get_rect()\na.rect.center = ((50,50))\n\nb = pygame.sprite.Sprite()\nb.image = image\nb.rect = image.get_rect()\nb.rect.center = ((60,60))\n\ngroupA = pygame.sprite.RenderUpdates(a)\ngroupB = pygame.sprite.RenderUpdates(b)\n\nwhile 1:\n groupA.clear(screen, background)\n rects = groupA.draw(screen)\n groupB.clear(screen, background)\n rects.extend(groupB.draw(screen))\n pygame.display.update(rects)\n\nthere is a black box around one of the sprites that covers the other one.\nI think what they mean by transparency is what happens in the first example.", "user_title": "Anonymous", "datetimeon": "2009-07-18T04:03:26", "link": "Font.render", "id": 2881}, {"content": "when i try this it says that the 'e' in e.type is undefined? any suggestions?", "user_title": "Anonymous", "datetimeon": "2010-03-16T15:33:05", "link": "pygame.key.set_repeat", "id": 3075}, {"content": "good", "user_title": "Anonymous", "datetimeon": "2010-03-17T23:46:58", "link": "pygame.event.Event", "id": 3076}, {"content": "#! /usr/bin/python\n# using sprites_rgba.png from http://img17.imageshack.us/img17/3166/spritesrgba.png\nimport sys, pygame, math, os, random\nfrom pygame.locals import *\npygame.init()\nsize=width,height=1024,256;screen=pygame.display.set_mode(size);pygame.display.set_caption(\"multiplayer sprite test with collisions\")\nspd=4;amnt=4;ampl=8;xpos=[0]*amnt;ypos=[0]*amnt;sprid=[];spridr=[] #some arrays and variables\nfor i in range (0,amnt,1):\n xpos[i]=64+(128*i)+random.randint(0,32);ypos[i]=64+random.randint(0,32)\nsprall=pygame.image.load(\"sprites_rgba.png\") #loading sprites\nfor i in range (0,4,1):\n spritetmp=sprall.subsurface(i*64,0,64,64);spriterecttmp=spritetmp.get_rect()\n sprid.append(spritetmp);spridr.append(spriterecttmp)\nwhile 1:\n key=pygame.key.get_pressed() #checking pressed keys\n if key[pygame.K_a]:xpos[0]-=spd\n if key[pygame.K_d]:xpos[0]+=spd\n if key[pygame.K_w]:ypos[0]-=spd\n if key[pygame.K_s]:ypos[0]+=spd\n if key[pygame.K_f]:xpos[1]-=spd\n if key[pygame.K_h]:xpos[1]+=spd\n if key[pygame.K_t]:ypos[1]-=spd\n if key[pygame.K_g]:ypos[1]+=spd\n if key[pygame.K_j]:xpos[2]-=spd\n if key[pygame.K_l]:xpos[2]+=spd\n if key[pygame.K_i]:ypos[2]-=spd\n if key[pygame.K_k]:ypos[2]+=spd\n if key[pygame.K_LEFT]: xpos[3]-=spd\n if key[pygame.K_RIGHT]:xpos[3]+=spd\n if key[pygame.K_UP]: ypos[3]-=spd\n if key[pygame.K_DOWN]: ypos[3]+=spd\n bgcolour=0x998877 #checking collisions\n if spridr[0].colliderect(spridr[1]):bgcolour=0xAA5555\n if spridr[0].colliderect(spridr[2]):bgcolour=0x55AA55\n if spridr[0].colliderect(spridr[3]):bgcolour=0x5555AA\n if spridr[1].colliderect(spridr[2]):bgcolour=0x55AAAA\n if spridr[1].colliderect(spridr[3]):bgcolour=0xAA55AA\n if spridr[2].colliderect(spridr[3]):bgcolour=0xAAAA55\n screen.fill(bgcolour)\n for i in range (0,amnt,1): #displaying sprites\n spridr[i].left=xpos[i];spridr[i].top=ypos[i];screen.blit(sprid[i],spridr[i])\n for event in pygame.event.get(): #praxis stuff\n if event.type==pygame.QUIT:sys.exit()\n pygame.display.flip();pygame.time.delay(1000/50)", "user_title": "Anonymous", "datetimeon": "2009-07-14T09:12:03", "link": "Rect.colliderect", "id": 2879}, {"content": "#! /usr/bin/python\n# using sprites_rgba.png from http://img17.imageshack.us/img17/3166/spritesrgba.png\nimport sys, pygame, math, os, random\nfrom pygame.locals import *\npygame.init()\nsize=width,height=1024,256;screen=pygame.display.set_mode(size);pygame.display.set_caption(\"multiplayer sprite test with collisions\")\nspd=4;amnt=4;ampl=8;xpos=[0]*amnt;ypos=[0]*amnt;sprid=[];spridr=[] #some arrays and variables\nfor i in range (0,amnt,1):\n xpos[i]=64+(128*i)+random.randint(0,32);ypos[i]=64+random.randint(0,32)\nsprall=pygame.image.load(\"sprites_rgba.png\") #loading sprites\nfor i in range (0,4,1):\n spritetmp=sprall.subsurface(i*64,0,64,64);spriterecttmp=spritetmp.get_rect()\n sprid.append(spritetmp);spridr.append(spriterecttmp)\nwhile 1:\n key=pygame.key.get_pressed() #checking pressed keys\n if key[pygame.K_a]:xpos[0]-=spd\n if key[pygame.K_d]:xpos[0]+=spd\n if key[pygame.K_w]:ypos[0]-=spd\n if key[pygame.K_s]:ypos[0]+=spd\n if key[pygame.K_f]:xpos[1]-=spd\n if key[pygame.K_h]:xpos[1]+=spd\n if key[pygame.K_t]:ypos[1]-=spd\n if key[pygame.K_g]:ypos[1]+=spd\n if key[pygame.K_j]:xpos[2]-=spd\n if key[pygame.K_l]:xpos[2]+=spd\n if key[pygame.K_i]:ypos[2]-=spd\n if key[pygame.K_k]:ypos[2]+=spd\n if key[pygame.K_LEFT]: xpos[3]-=spd\n if key[pygame.K_RIGHT]:xpos[3]+=spd\n if key[pygame.K_UP]: ypos[3]-=spd\n if key[pygame.K_DOWN]: ypos[3]+=spd\n bgcolour=0x998877 #checking collisions\n if spridr[0].colliderect(spridr[1]):bgcolour=0xAA5555\n if spridr[0].colliderect(spridr[2]):bgcolour=0x55AA55\n if spridr[0].colliderect(spridr[3]):bgcolour=0x5555AA\n if spridr[1].colliderect(spridr[2]):bgcolour=0x55AAAA\n if spridr[1].colliderect(spridr[3]):bgcolour=0xAA55AA\n if spridr[2].colliderect(spridr[3]):bgcolour=0xAAAA55\n screen.fill(bgcolour)\n for i in range (0,amnt,1): #displaying sprites\n spridr[i].left=xpos[i];spridr[i].top=ypos[i];screen.blit(sprid[i],spridr[i])\n for event in pygame.event.get(): #praxis stuff\n if event.type==pygame.QUIT:sys.exit()\n pygame.display.flip();pygame.time.delay(1000/50)", "user_title": "Anonymous", "datetimeon": "2009-07-14T09:09:26", "link": "pygame.key.get_pressed", "id": 2878}, {"content": "This creates a mask from the surface which has all the pixels set which have color values above or equal to those in color, but below (and not equal to) the values in threshold. So no pixel with a 255 value can possibly be considered. And the default threshold doesn't let the mask have any set pixels for any given surface.", "user_title": "Anonymous", "datetimeon": "2010-03-13T06:03:20", "link": "pygame.mask.from_threshold", "id": 3073}, {"content": "It appears if you end up rotating your sprites, you need to regenerate their masks when collision is detected via the rect test, or the masks won't match with the corresponding imagery.", "user_title": "Anonymous", "datetimeon": "2009-07-13T01:08:45", "link": "pygame.sprite.collide_mask", "id": 2876}, {"content": "This didn't seem clear in the documentation. I checked the source (v. 1.8.1).\n\nThis takes a sequence of (R, G, B) triplets. This is currently the only way the palette can be defined.", "user_title": "Anonymous", "datetimeon": "2009-07-12T13:50:36", "link": "Surface.set_palette", "id": 2874}, {"content": "A less look at me demo:\n\nimport pygame.font\nimport pygame.surface\n\ndef gameprint(text,xx,yy,color):\n font = pygame.font.SysFont(\"Courier New\",18)\n ren = font.render(text,1,color)\n screen.blit(ren, (xx,yy))", "user_title": "Anonymous", "datetimeon": "2009-08-28T19:19:15", "link": "Font.render", "id": 2927}, {"content": "how to fadein() ?", "user_title": "Anonymous", "datetimeon": "2010-03-09T06:18:13", "link": "pygame.mixer.music.fadeout", "id": 3068}, {"content": "cfadsfsadgfdh hHAHAHAH", "user_title": "Anonymous", "datetimeon": "2010-03-10T08:48:11", "link": "pygame.event.pump", "id": 3070}, {"content": "This function, at least on my system using Windows XP, \nonly one key is repeated at a time. So, moving a sprite\naround the screen using the arrow keys can only move it\nin one direction at a time. No diagonal by using two arrows\nat the same time...\n\nAn alternative is to set an object's state on KEYDOWN and reset \nit on KEYUP.\n\nExample:\n\n\tif e.type == KEYDOWN:\n\t\tif e.key == K_LEFT:\n\t\t\tship.xspeed -= SPEED\n\t\telif e.key == K_RIGHT:\n\t\t\tship.xspeed += SPEED\n\t\telif e.key == K_UP:\n\t\t\tship.yspeed -= SPEED\n\t\telif e.key == K_DOWN:\n\t\t\tship.yspeed += SPEED\n\t\telif e.key == K_SPACE\n\t\t\tship.firing = True\n\telif e.type == KEYUP:\n\t\tif e.key == K_LEFT:\n\t\t\tship.xspeed += SPEED\n\t\telif e.key == K_RIGHT:\n\t\t\tship.xspeed -= SPEED\n\t\telif e.key == K_UP:\n\t\t\tship.yspeed += SPEED\n\t\telif e.key == K_DOWN:\n\t\t\tship.yspeed -= SPEED\n\t\telif e.key == K_SPACE:\n\t\t\tship.firing == False", "user_title": "Anonymous", "datetimeon": "2010-03-12T11:41:32", "link": "pygame.key.set_repeat", "id": 3072}, {"content": "Only if you do not import all the pygame locals:\n\nfrom pygame.locals import *", "user_title": "Anonymous", "datetimeon": "2009-07-10T23:11:01", "link": "pygame.mouse.get_pressed", "id": 2871}, {"content": "Note that\nmyrect.move(x,y)\ndoes not change the Rect myrect. Only\nmyrect = myrect.move(x,y)\ndoes.", "user_title": "Anonymous", "datetimeon": "2010-03-03T13:42:28", "link": "Rect.move", "id": 3066}, {"content": "My copy of pygames uses numeric as default, not numpy (as stated above).\nThe best thing is probably to explicitly state the array type used (e.g. pygame.sndarray.use_arraytype('numpy')) to avoid problems with future convention changes.", "user_title": "Anonymous", "datetimeon": "2010-03-08T09:27:57", "link": "pygame.sndarray", "id": 3067}, {"content": "The docs are faulty here. scroll() takes two integers and not a tuple or a list.", "user_title": "Anonymous", "datetimeon": "2009-08-30T08:39:48", "link": "Surface.scroll", "id": 2930}, {"content": "What about Duel screen displays?", "user_title": "Anonymous", "datetimeon": "2009-07-09T13:26:59", "link": "pygame.display.set_mode", "id": 2869}, {"content": "are yoh sure that sign are correct", "user_title": "Anonymous", "datetimeon": "2010-03-02T18:18:51", "link": "pygame.key", "id": 3063}, {"content": "import pygame\nfrom pygame.locals import *\n\ndef timerFunc():\n print \"Timer CallBack\"\n\npygame.init()\npygame.time.set_timer(USEREVENT+1, 100)\nwhile 1:\n for event in pygame.event.get():\n if event.type == USEREVENT+1:\n timerFunc() #calling the function wheever we get timer event.\n if event.type == QUIT:\n break", "user_title": "Anonymous", "datetimeon": "2009-08-31T04:50:51", "link": "pygame.time.set_timer", "id": 2932}, {"content": "this is helpful thanks son", "user_title": "Anonymous", "datetimeon": "2009-08-31T22:47:55", "link": "pygame.font", "id": 2933}, {"content": "Wouldn't the center simply be X = X2 - X1 Y = Y2 - Y1 ? Bottom right minus top left. That doesn't require any special math functions, yes?", "user_title": "Anonymous", "datetimeon": "2009-04-22T14:45:07", "link": "pygame.draw.rect", "id": 2557}, {"content": "#! /usr/bin/python\n# using sprites_rgba.png from http://img17.imageshack.us/img17/3166/spritesrgba.png\nimport sys, pygame, math, os, random\nfrom pygame.locals import *\npygame.init()\nsize=width,height=1024,256;screen=pygame.display.set_mode(size)\namnt=64;ampl=8;xpos=[0]*amnt;ypos=[0]*amnt;xdif=[0]*amnt;ydif=[0]*amnt;snum=[0]*amnt\nfor i in range (0,amnt,1):\n xpos[i]=random.randint(0,width)\n ypos[i]=random.randint(0,height)\n xdif[i]=random.randint(0,ampl*2)-ampl\n ydif[i]=random.randint(0,ampl*2)-ampl\n snum[i]=random.randint(0,3)\nball=pygame.image.load(\"sprites_rgba.png\");ballrect=ball.get_rect()\nsprite00=ball.subsurface(( 0,0,64,64));spriterect00=sprite00.get_rect()\nsprite01=ball.subsurface(( 64,0,64,64));spriterect01=sprite01.get_rect()\nsprite02=ball.subsurface((128,0,64,64));spriterect02=sprite02.get_rect()\nsprite03=ball.subsurface((192,0,64,64));spriterect03=sprite03.get_rect()\nwhile 1:\n for event in pygame.event.get():\n if event.type==pygame.QUIT:sys.exit()\n for i in range (0,amnt,1):\n xpos[i]+=xdif[i];ypos[i]+=ydif[i]\n if xpos[i]>width:xpos[i]-=(width+64)\n if ypos[i]>height:ypos[i]-=(height+64)\n if xpos[i]<-64:xpos[i]+=(width+64)\n if ypos[i]<-64:ypos[i]+=(height+64)\n screen.fill(0x998877)\n for i in range (0,amnt,1):\n if snum[i]==0:\n spriterect00.left=xpos[i];spriterect00.top=ypos[i];screen.blit(sprite00,spriterect00)\n if snum[i]==1:\n spriterect01.left=xpos[i];spriterect01.top=ypos[i];screen.blit(sprite01,spriterect01)\n if snum[i]==2:\n spriterect02.left=xpos[i];spriterect02.top=ypos[i];screen.blit(sprite02,spriterect02)\n if snum[i]==3:\n spriterect03.left=xpos[i];spriterect03.top=ypos[i];screen.blit(sprite03,spriterect03)\n pygame.display.flip()\n pygame.time.delay(1000/50)", "user_title": "Anonymous", "datetimeon": "2009-07-07T10:21:37", "link": "Surface.subsurface", "id": 2867}, {"content": "Usage of the event queue for USEREVENT-style events is limited by the maximum size of the SDL event queue, which is 256.\nSo, if more events (of any sort) get posted to the queue, you will get an exception stating \"error: Event queue full\".\nIf you expect to generate more than a few user events before they are posted, consider a separate queue.", "user_title": "Anonymous", "datetimeon": "2009-05-03T10:30:15", "link": "pygame.event.post", "id": 2560}, {"content": "Is this the same as pygame.surface.fill(color, rect)?", "user_title": "Anonymous", "datetimeon": "2009-05-05T15:48:33", "link": "pygame.draw.rect", "id": 2561}, {"content": "Just a note, Nautilus, the default file browser in GNOME sets copied files as 'x-special/gnome-copied-files', if you retrieve it, it holds the location as plain text.", "user_title": "Anonymous", "datetimeon": "2009-08-02T21:50:25", "link": "pygame.scrap", "id": 2901}, {"content": "so someone can share some Surface.subsurface snippet? (one about sprites is very welcome)", "user_title": "Anonymous", "datetimeon": "2009-07-06T22:14:24", "link": "Surface.subsurface", "id": 2866}, {"content": "test\ntest", "user_title": "Anonymous", "datetimeon": "2009-07-03T15:37:54", "link": "Surface.copy", "id": 2864}, {"content": "test <br /> test", "user_title": "Anonymous", "datetimeon": "2009-07-03T15:37:38", "link": "Surface.copy", "id": 2863}, {"content": "somewhere in the pygame google-group i found it's possible to have multiple sprites based on just one picture plenty of sprite drawings, without having to have them cropped file by file - how can we do this?", "user_title": "Anonymous", "datetimeon": "2009-07-03T15:37:10", "link": "Surface.copy", "id": 2862}, {"content": "missing commands for drawing bezier lines - some gpl sources can be find at http://nitrofurano.linuxkafe.com/sdlbasic - just needed to be recoded to Pygame, but it's not that difficult task at all...", "user_title": "Anonymous", "datetimeon": "2009-07-03T13:28:41", "link": "pygame.draw", "id": 2861}, {"content": "What does the error 'text has zero width' mean?\nI was simply printing 'Hello World!' to the screen.\nI was fiddling with text size, jumped from 32 to 12 and I got the above error\nNow the only way to stop the error is to have no text ('')", "user_title": "Anonymous", "datetimeon": "2009-07-03T07:24:30", "link": "Font.render", "id": 2860}, {"content": "It would be handy if the range of values was given. It appears to be 0 to 255.", "user_title": "Anonymous", "datetimeon": "2009-07-02T12:01:48", "link": "Color.r", "id": 2859}, {"content": "don't you know its a bad idea to leave your email on the internet?\n-wekul", "user_title": "Anonymous", "datetimeon": "2009-06-29T09:02:53", "link": "pygame.key", "id": 2857}, {"content": "With event.type == MOUSEBUTTONDOWN - Error! \nWrite it - event.type == pygame.MOUSEBUTTONDOWN", "user_title": "Anonymous", "datetimeon": "2009-07-02T06:50:36", "link": "pygame.mouse.get_pressed", "id": 2858}, {"content": "In Pygame 1.9 Surface.copy() does not preserve the original image's alpha. If\nyour image has an alpha you need to:\n\ns1 = s0.copy()\ns1.set_alpha(s0.get_alpha())", "user_title": "Anonymous", "datetimeon": "2010-02-21T12:03:18", "link": "Surface.copy", "id": 3059}, {"content": "In the comment on February 21, 2010 10:32am, in the last sentence I meant,\n\"for a sample i, the value of the left channel is a[i][0], the right channel\na[i][1],\" of course.", "user_title": "Anonymous", "datetimeon": "2010-02-21T14:25:02", "link": "pygame.sndarray", "id": 3060}, {"content": "When using numpy, be careful to set the type of the array correctly.\nFor instance, when you're in signed 16-bit stereo mode, e.g., when you've\ncalled\n\npygame.mixer.pre_init(size = -16, channels = 2)\n\nand you want to create an array to use for synthesizing a sound, don't forget\nthe dtype argument in\n\nsamples = numpy.zeros((n_samples, 2), dtype = numpy.int16)", "user_title": "Anonymous", "datetimeon": "2010-02-21T10:37:46", "link": "pygame.sndarray", "id": 3058}, {"content": "The above is hard to understand, at least for me. For instance, what does\n\"A stereo sound file has two values per sample\" mean? Here's what it means:\nif you're in mono, and your array has N samples, the shape of the array\nshould be (N,) (a d=1 array of N elements). If you're in stereo, then the\nshape should be (N,2) (a d=2 array, Nx2); for a sample i, the value of the left\nchannel is a[N][0], the right channel a[N][1].", "user_title": "Anonymous", "datetimeon": "2010-02-21T10:32:01", "link": "pygame.sndarray", "id": 3057}, {"content": "You could always do dir(pygame.Rect) or whatever.", "user_title": "Anonymous", "datetimeon": "2009-06-28T09:26:48", "link": "Surface.get_rect", "id": 2854}, {"content": "HTML (#rrggbbaa) format doesn't seem to work with 1.9.1 ... gives a \"ValueError: invalid argument\" exception.", "user_title": "Anonymous", "datetimeon": "2009-12-02T14:01:18", "link": "pygame.Color", "id": 3019}, {"content": "(What's even more odd is that it works from the python console ... just not in a program)", "user_title": "Anonymous", "datetimeon": "2009-12-02T14:07:37", "link": "pygame.Color", "id": 3020}, {"content": "it dun wok", "user_title": "Anonymous", "datetimeon": "2009-12-03T12:43:47", "link": "pygame.draw.arc", "id": 3021}, {"content": "Re: noise and static was occurring on my Linux box, and I was able to ameliorate it\nby specifically setting my mixer:\n pygame.mixer.pre_init(44100, -16, 2)\n pygame.init()", "user_title": "Anonymous", "datetimeon": "2009-12-07T01:43:58", "link": "Sound.play", "id": 3022}, {"content": "its set_palette_at, not set_at", "user_title": "Anonymous", "datetimeon": "2009-12-15T12:51:36", "link": "Surface.set_palette_at", "id": 3023}, {"content": "hey matthew sucks in snping", "user_title": "Anonymous", "datetimeon": "2009-12-16T15:50:04", "link": "pygame.draw.ellipse", "id": 3024}, {"content": "ellipserect=Rect(cmx,cmy,mx-cmx,my-cmy)\nellipserect.normalize()\ndraw.ellipse(screen,color,ellipserect,1)\nwhy ValueError: width greater than ellipse radius?", "user_title": "Anonymous", "datetimeon": "2009-12-18T13:28:16", "link": "pygame.draw.ellipse", "id": 3025}, {"content": "It plays dot-to-dot with the given points.", "user_title": "Anonymous", "datetimeon": "2010-02-19T01:32:43", "link": "pygame.draw.lines", "id": 3055}, {"content": "In ver. 1.9.1, if I try to initialize by calling\n\npygame.mixer.pre_init(...)\npygame.init()\n\nand then try to play a sound buffer, I get no output unless I open a graphics\nwindow first by calling pygame.display.set_mode(...). If, on the other hand,\nI'm not doing graphics and I initialize with just\n\npygame.mixer.init(...)\n\nI can get sound without opening any window.", "user_title": "Anonymous", "datetimeon": "2010-02-21T10:20:13", "link": "pygame.mixer", "id": 3056}, {"content": "to get a picture instead of black and white cursor, in order :\n1) simply make a transparent cursor\n pygame.mouse.set_cursor(pygame.mouse.set_cursor((8,8),(0,0),(0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0))\n\n2) constantly actualise the postition of the picture to the postion of the cursor\n cursor_picture==pygame.image.load('./cursor.png').convert_alpha()\n while True:\n for event in pygame.event.get():\n if event.type==QUIT:\n exit()\n screen.fill(black)\n screen.blit(mouse_cursor, pygame.mouse.get_pos())\n pygame.display.update()", "user_title": "Anonymous", "datetimeon": "2009-06-27T17:10:22", "link": "pygame.mouse.set_cursor", "id": 2850}, {"content": "Not sure why I am leaving this here... but can anyone tell me how you would rotate a surface? Its 3am so excuse my ignorance :D", "user_title": "Anonymous", "datetimeon": "2009-11-30T03:38:25", "link": "pygame.Surface", "id": 3016}, {"content": "Theres is an error in documentation: pygame.cursor.compile does not exists, but pygame.cursors.compile do", "user_title": "Anonymous", "datetimeon": "2009-11-30T18:49:41", "link": "pygame.cursors.compile", "id": 3017}, {"content": "is there anyway to rotate a rectangle with out making it an image?", "user_title": "Anonymous", "datetimeon": "2009-11-13T15:06:41", "link": "pygame.transform.rotate", "id": 3009}, {"content": "Minor problem: When I run the program using this for an image, it says \"cannot load image!\" could anyone help me?", "user_title": "Anonymous", "datetimeon": "2009-11-15T09:50:56", "link": "pygame.image.load", "id": 3010}, {"content": "We need the posibility to rotate without the image being rescaled, just keep its original size like in PIL.\n\nim.rotate(angle, filter=NEAREST, expand=0) \nThe expand argument, if true, indicates that the output image should be made \nlarge enough to hold the rotated image. \nIf omitted or false, the output image has the same size as the input image.", "user_title": "Anonymous", "datetimeon": "2009-11-21T05:03:48", "link": "pygame.transform.rotate", "id": 3012}, {"content": "In pygame 1.9.1 this function does not return negative values instead it returns a \n0 for all values < 0 (of the direction vector). If you are looking for a way to \ncompute a collision response look at Mask.overlap_area.", "user_title": "Anonymous", "datetimeon": "2009-11-23T10:34:10", "link": "Mask.overlap", "id": 3013}, {"content": "can anyone please explain what this function do? at best whith an example", "user_title": "Anonymous", "datetimeon": "2009-11-27T06:41:00", "link": "pygame.draw.lines", "id": 3014}, {"content": "Meta key is 'Apple' or 'Command' on a mac.", "user_title": "Anonymous", "datetimeon": "2009-09-07T03:31:29", "link": "pygame.key", "id": 2939}, {"content": "why doesn't this blit on the screen???\n\n\n for star in self.stars:\n self.screen.blit(self.a, star.pos)\n star.update()\n self.screen.blit(star.image, star.pos)\n pygame.display.update()", "user_title": "Anonymous", "datetimeon": "2009-09-08T22:04:17", "link": "Surface.blit", "id": 2941}, {"content": "HELP ME ONMMGMGMGMGMGMG", "user_title": "Anonymous", "datetimeon": "2009-11-12T10:31:24", "link": "Surface.convert_alpha", "id": 3006}, {"content": "aghahhahahahah I LOVE THIS OMG (*&^%$#@Q", "user_title": "Anonymous", "datetimeon": "2009-11-12T10:31:43", "link": "Surface.convert_alpha", "id": 3007}, {"content": "In my game the screen is scaled. This can cause havoc with the mouse positioning. I made this function:\n\n def get_mouse_pos(pos):\n\treturn (pos[0] * (1280.0/float(game.game_scaled[0])),pos[1] * (720.0/float(game.game_scaled[1])))\n\nReplace 1280.0 and 720.0 with the resolution of the pre-scaled game and game.game_scaled with a sequence containing the scaled resolution.", "user_title": "Anonymous", "datetimeon": "2009-11-12T12:43:39", "link": "pygame.transform.scale", "id": 3008}, {"content": "It seems to work if you set the display of the movie to a surface of the same size and then blit that surface to the screen.", "user_title": "Anonymous", "datetimeon": "2009-06-24T20:28:26", "link": "pygame.movie", "id": 2846}, {"content": "This documentation does not seem to match what is currently in 1.8.1. \nInstead: pygame.transform.threshold(DestSurface, Surface, color, threshold = (0,0,0,0), diff_color = (0,0,0,0), change_return = True, Surface =None): return num_threshold_pixels", "user_title": "Anonymous", "datetimeon": "2009-11-11T15:11:43", "link": "pygame.transform.threshold", "id": 3004}, {"content": "For some odd reason anything in pygame.Color gets an error message like it doesn't exist.\nIf I try using pygame.Color.r, it says that Color has no attribute r. I tried redownloading\npygame, but nothing diffrent.", "user_title": "Anonymous", "datetimeon": "2009-09-11T20:56:38", "link": "pygame.Color", "id": 2943}, {"content": "I am having the same problem on XP. The sound plays, but the video does not.", "user_title": "Anonymous", "datetimeon": "2009-06-24T20:09:34", "link": "pygame.movie", "id": 2845}, {"content": "\"current_h, current_h: Width and height of the current video mode, or of the\"[...]\nOne of them should be \"current_w\" instead.", "user_title": "Anonymous", "datetimeon": "2009-11-07T06:40:09", "link": "pygame.display.Info", "id": 2999}, {"content": "For me, PixelArray works much faster (4 or 5 times faster) than Surfarray. I wanted to set every pixel in my off-screen surface individually. Creating the surface, creating a PixelArray on it, and going through the pixels one-by-one is much faster than creating the bitmap using numpy and calling surfarray.make_surface.", "user_title": "Anonymous", "datetimeon": "2009-11-08T08:17:58", "link": "pygame.PixelArray", "id": 3000}, {"content": "\u00c3?\u00c3? \u00c3\u00ac\u00c3\u00ae\u00c3\u008a\u00c3\u00a5\u00c3\u00b2\u00c3\u00a5 \u00c3\u00ad\u00c3\u00a0\u00c3\u00b0\u00c3\u009a\u00c3\u00b1\u00c3\u00ae\u00c3\u00a2\u00c3\u00a0\u00c3\u00b2\u00c3\u008c \u00c3\u00ad\u00c3\u00a5\u00c3\u00b1\u00c3\u00aa\u00c3\u00ae\u00c3\u00ab\u00c3\u008c\u00c3\u00aa\u00c3\u00ae \u00c3\u00af\u00c3\u00a0\u00c3\u00b0\u00c3\u00a0\u00c3\u00ab\u00c3\u00ab\u00c3\u00a5\u00c3\u00ab\u00c3\u008c\u00c3\u00ad\u00c3\u00bb\u00c3\u00b5 \u00c3\u00ab\u00c3\u009a\u00c3\u00ad\u00c3\u009a\u00c3\u00a9 \u00c3\u00b0\u00c3\u00bf\u00c3\u0080\u00c3\u00ae\u00c3\u00ac \u00c3\u00b1 \u00c3\u0080\u00c3\u00b0\u00c3\u00b3\u00c3\u00a3\u00c3\u00ae\u00c3\u00ac. \u00c3?\u00c3\u00b2\u00c3\u00ae\u00c3\u00a1\u00c3\u00bb \u00c3\u009a\u00c3\u00b5 \u00c3\u0080\u00c3\u00ab\u00c3\u009a\u00c3\u00ad\u00c3\u00bb \u00c3\u00b1\u00c3\u00ab\u00c3\u009a\u00c3\u00a2\u00c3\u00a0\u00c3\u00ab\u00c3\u009a\u00c3\u00b1\u00c3\u008c\n \u00c3\u00ae\u00c3\u00ad\u00c3\u009a \u00c3\u00a1\u00c3\u00b3\u00c3\u0080\u00c3\u00b3\u00c3\u00b2 \u00c3\u00a2\u00c3\u009a\u00c3\u0080\u00c3\u00ad\u00c3\u00bb, \u00c3\u00aa\u00c3\u00a0\u00c3\u00aa \u00c3\u00ae\u00c3\u0080\u00c3\u00ad\u00c3\u00a0. \u00c3\u008d\u00c3\u00ae \u00c3\u009c\u00c3\u00b2\u00c3\u00ae \u00c3\u00a1\u00c3\u00b3\u00c3\u0080\u00c3\u00a5\u00c3\u00b2 \u00c3\u00ac\u00c3\u00a5\u00c3\u0080\u00c3\u00ab\u00c3\u00a5\u00c3\u00ad\u00c3\u00ad\u00c3\u00a5\u00c3\u00a9.\n I don't know english, write russian. translate.google for you help! :)", "user_title": "Anonymous", "datetimeon": "2009-11-08T18:19:31", "link": "pygame.draw.aaline", "id": 3001}, {"content": "uiuuiu", "user_title": "Anonymous", "datetimeon": "2009-11-11T05:10:30", "link": "pygame.key.get_focused", "id": 3002}, {"content": "its very ...................", "user_title": "Anonymous", "datetimeon": "2009-11-11T05:11:00", "link": "pygame.key.get_focused", "id": 3003}, {"content": "Tip for noobs. This was killing me. If you're trying this for the first time and getting no sound, it may be because you're program exits before the playback thread completes. See pygame/examples/sound.py: it waits at the end.", "user_title": "Anonymous", "datetimeon": "2009-12-19T19:22:25", "link": "Channel.play", "id": 3026}, {"content": "Tip for noobs. This was killing me. If you're trying this for the first time and\ngetting no sound, it may be because you're program exits before the playback\nthread completes. See pygame/examples/sound.py: it waits at the end.", "user_title": "Anonymous", "datetimeon": "2009-12-19T19:23:52", "link": "Sound.play", "id": 3027}, {"content": "You missed pygame.Mixer", "user_title": "Anonymous", "datetimeon": "2009-10-27T02:47:35", "link": "pygame.init", "id": 2991}, {"content": "Tried this on XP with pygame 1.9 - video works, but sound doesn't. Uninitializing pygame.mixer does not seem to effect behavior.", "user_title": "Anonymous", "datetimeon": "2009-10-27T20:31:08", "link": "pygame.movie", "id": 2992}, {"content": "As of 1.9, it does not appear the loop param exists.", "user_title": "Anonymous", "datetimeon": "2009-10-27T20:42:45", "link": "Movie.play", "id": 2993}, {"content": "If your movies play slow or occasionally freeze, setting a limit to framerates seems to resolve the problem. \nSee the documentation on Clock.tick(framerate) on how to limit framerates:\nhttp://www.pygame.org/docs/ref/time.html#Clock.tick", "user_title": "Anonymous", "datetimeon": "2009-10-29T10:53:02", "link": "pygame.movie.Movie", "id": 2994}, {"content": "The example code and the explanation contradict each other.\n\nThe example returns true if lost, supposedly, and the explanation supposedly returns False if lost?", "user_title": "Anonymous", "datetimeon": "2009-11-04T18:10:25", "link": "pygame.scrap.lost", "id": 2995}, {"content": "Does not work *at all*. No changes occur when I change any pixels.", "user_title": "Anonymous", "datetimeon": "2009-11-05T22:12:49", "link": "pygame.PixelArray", "id": 2996}, {"content": "Remember, there are not semitones. Thus, each semitone is represented by an integer named \"note\".\nIf you are a beginer it is a good choice to start practicing with the middle notes.\nC 4 is the note number 61. Have fun!.\n\nTourette", "user_title": "Anonymous", "datetimeon": "2009-12-21T19:52:02", "link": "Output.note_on", "id": 3028}, {"content": "pygame.mask.from_surface(Surface, threshold) -> Mask\nno Keyword argument", "user_title": "Anonymous", "datetimeon": "2009-10-25T18:04:44", "link": "pygame.mask.from_surface", "id": 2989}, {"content": "you use a class to get the var\nfor example\nclass myimage(object):\n image = (your image)\nthen to blit\n\ndisplay.blit(myimage.image, (0,0))\n\nso that you are only accesing the one variable to blit instead of multiple instances of the same", "user_title": "Anonymous", "datetimeon": "2009-08-04T11:33:28", "link": "Surface.copy", "id": 2905}, {"content": "if you want to measure it over a period of your choosing just compute a moving average of the result of clock.tick(), like this:\n\n...\n\nrecent_frame_lengths = [ 100, 100, 100, 100, 100 ]\nrfl_array_len = float( len( recent_frame_lengths ) )\n\n...\nmain():\n...\ndt = clock.tick()\nrecent_frame_lengths.pop(0)\nrecent_frame_lengths.append(dt)\naverage_frame_length = recent_frame_lengths / rfl_array_len\nframes_per_second = 1000. / average_frame_length", "user_title": "Anonymous", "datetimeon": "2010-05-18T12:08:59", "link": "Clock.get_fps", "id": 3124}, {"content": "button can be at least 1-6. 4/5 are for the scroll wheel. \nThe squeeze-click on new Apple mice is 6.", "user_title": "Anonymous", "datetimeon": "2010-05-20T22:13:33", "link": "pygame.event", "id": 3126}, {"content": "event polling:\n#self.keys is [] 256 len. \nself.mouse = ((0,0), 0, 0, 0, 0, 0, 0) #(pos, b1,b2,b3,b4,b5,b6)\n#squeezing a new Apple mouse is button 6. \nfor event in pygame.event.get():\n\tif event.type == pygame.QUIT:\n\t\tself.running = 0\n\telif event.type == pygame.MOUSEBUTTONDOWN:\n\t\tself.mouse[event.button] = 1\n\t\tself.mouse[0] = event.pos\n\telif event.type == pygame.MOUSEBUTTONUP:\n\t\tself.mouse[event.button] = 0\n\t\tself.mouse[0] = event.pos\n\telif event.type == pygame.MOUSEMOTION:\n\t\tself.mouse[0] = event.pos\n\telif event.type == pygame.KEYDOWN:\n\t\tself.keys[event.key % 255] = 1\n\telif event.type == pygame.KEYUP:\n\t\tself.keys[event.key % 255] = 0", "user_title": "Anonymous", "datetimeon": "2010-05-20T22:31:20", "link": "pygame.mouse.get_pressed", "id": 3127}, {"content": "PyGame beginners, please don't look at Matthew N. Brown's code below.\n\nThat is the worst Python code I have ever seen, and it offers almost no examples of how to use pygame.draw.circle.", "user_title": "Anonymous", "datetimeon": "2010-05-17T13:22:44", "link": "pygame.draw.circle", "id": 3123}, {"content": "What about subsubsubsubsurfaces?", "user_title": "Anonymous", "datetimeon": "2009-06-14T09:27:19", "link": "Surface.subsurface", "id": 2830}, {"content": "for some reason this gives always wrong numbers.\nmask_creep = pygame.mask.from_surface(creep.image)\nmask_player = pygame.mask.from_surface(p.image)\np.life -= mask_player.overlap_area(\n mask_creep, (creep.rect.x-p.rect.x,creep.rect.y-p.rect.y))\n\np.life is the life of the player, and I want to drain it by the amount of pixels overlapping with creep.\nhowever, it seems it hits before it should, and with mask_creep.invert() I seem to get more accurate hits, which makes no sense...", "user_title": "Anonymous", "datetimeon": "2009-10-24T06:03:49", "link": "pygame.mask", "id": 2984}, {"content": "get also this warning : nsquickdrawview \nif I compile.\n\ncan\u00c2\u008et use pygame with py2app\n\npython 2.4 or 2.5\nmaxos leopard\neclipse", "user_title": "Anonymous", "datetimeon": "2010-01-05T21:56:27", "link": "pygame.display.init", "id": 3032}, {"content": "This function is not working as stated. It requires a 'rectstyle' argument (ie. a tuple with rect's parameters). it tests for collisions using this 'rectsytle' object and returns any that are colliding along with their values. Not really useful since no one needs a tuple of rect's parameters back. this would be really nice if it worked as stated...", "user_title": "Anonymous", "datetimeon": "2009-10-24T03:33:00", "link": "Rect.collidedict", "id": 2982}, {"content": "The math isn't that hard, you just have to think in relative coordinates then.\nThe key is to look at the center of the image, as these coordinates wont change by rotating it.\nThe coordinates of the center of the image on the screen are given by:\nx_cntr.. x coordinate of the center\ny_cntr.. y coordinate of the center\n\npos_org = (x_cntr - image_org.get_rect().width / 2,\n y_cntr - image_org.get_rect().height / 2) \n \"\"\"gives position of upper left corner of image_org (not rotated)\n depending on the center coordinates for the Surface.blit function\"\"\"\nimage_rotated = pygame.transform.rotate(image_org, angle) #rotate image\npos_new = (x_pos_org - image_rotated.get_rect().width / 2,\n y_pos_org - image_rotated.get_rect().height / 2)\n #get new position for upper left corner for rotated image", "user_title": "Anonymous", "datetimeon": "2010-01-21T11:14:00", "link": "pygame.transform.rotate", "id": 3036}, {"content": "x_pos_org and y_pos_org naturally need to be x_cntr and y_cntr.. sry", "user_title": "Anonymous", "datetimeon": "2010-01-21T11:20:31", "link": "pygame.transform.rotate", "id": 3037}, {"content": "fuck u", "user_title": "Anonymous", "datetimeon": "2010-01-21T12:35:00", "link": "PixelArray.replace", "id": 3038}, {"content": "doesnt work!", "user_title": "Anonymous", "datetimeon": "2010-01-25T12:07:07", "link": "pygame.display.set_caption", "id": 3039}, {"content": "WTH!???", "user_title": "Anonymous", "datetimeon": "2010-01-25T12:07:16", "link": "pygame.display.set_caption", "id": 3040}, {"content": "Where should the image file be save at?", "user_title": "Anonymous", "datetimeon": "2010-01-29T02:01:23", "link": "pygame.image.load", "id": 3042}, {"content": "To clip the blit, you have to pass a rect like this (0, 0, clipWidth, clipHeigth):\n\nexample:\n\nsForeground.blit(sText, rText, (0, 0, 32, 32)):\n\ndraw the surface sText into sForeground at topleft position defined with the rect rText,\nclippping the sText by 32x32 pixel box", "user_title": "Anonymous", "datetimeon": "2010-01-30T14:45:56", "link": "Surface.blit", "id": 3043}, {"content": "actually, it DOES WORK. put it in the right group", "user_title": "Anonymous", "datetimeon": "2010-02-02T15:56:23", "link": "pygame.display.set_caption", "id": 3044}, {"content": "how does this even work?????", "user_title": "Anonymous", "datetimeon": "2010-02-02T23:04:45", "link": "Rect.move", "id": 3045}, {"content": "Pygame 1.9: DeprecationWarning: integer argument expected, got float\n\nThe tuple elements must be integers. The line number in the warning message will\nindicate your enclosing function or method. I found this very misleading and\nfrustrating.", "user_title": "Anonymous", "datetimeon": "2010-02-06T02:16:05", "link": "pygame.transform.smoothscale", "id": 3048}, {"content": "By calling Clock.tick -> clock.tick", "user_title": "Anonymous", "datetimeon": "2010-02-08T10:30:27", "link": "Clock.tick_busy_loop", "id": 3049}, {"content": "that code you posted (TWICE) doesnt show how to draw a circle in pygame.\n It shows an example of a complex couple hundred lines of interactive \nphysics engine that just so happens to take im guessing less than\n5 lines to use pygame.draw.circle. Its a waste of space Good job for getting your code out into \nthe world. Now people dont like you.", "user_title": "Anonymous", "datetimeon": "2010-02-08T22:31:47", "link": "pygame.draw.circle", "id": 3050}, {"content": "TypeError: descriptor 'collidelistall' requires a 'pygame.Rect' object but received a 'list'\n\n...so it doesn't like a list, but a pygame.Rect? That does't make sense.", "user_title": "Anonymous", "datetimeon": "2009-10-22T05:21:56", "link": "Rect.collidelistall", "id": 2977}, {"content": "Also using\n\n my_surface=pygame.Surface([width, height]).convert()\n\nseems to be just as effective", "user_title": "Anonymous", "datetimeon": "2009-10-16T22:13:15", "link": "pygame.Surface", "id": 2974}, {"content": "x = x2 - x1, y = y2 - y1 gives the width and height of the rectangle.\n(x2 - x1) / 2, (y2 - y1) / 2 gives the center coordinates.\nI don't know of a built-in method on the Rect that gives the center coords.", "user_title": "Anonymous", "datetimeon": "2009-10-21T20:50:31", "link": "pygame.draw.rect", "id": 2976}, {"content": "AWSOME", "user_title": "Anonymous", "datetimeon": "2009-10-08T11:50:27", "link": "pygame.draw", "id": 2967}, {"content": "Aloha! jdv", "user_title": "Anonymous", "datetimeon": "2009-09-20T07:33:05", "link": "Rect.move_ip", "id": 2954}, {"content": "Worth mentioning: the initial angle must be less than the final angle; otherwise it will draw the full elipse.", "user_title": "Anonymous", "datetimeon": "2009-10-01T14:16:05", "link": "pygame.draw.arc", "id": 2964}, {"content": "If you want a circle with a *good* outline, use this:\n\ndef drawcircle(image, colour, origin, radius, width=0):\n\tif width == 0:\n\t\tpygame.draw.circle(image,colour,intlist(origin),int(radius))\n\telse:\n\t\tif radius > 65534/5: radius = 65534/5\n\t\tcircle = pygame.Surface([radius*2+width,radius*2+width]).convert_alpha()\n\t\tcircle.fill([0,0,0,0])\n\t\tpygame.draw.circle(circle, colour, intlist([circle.get_width()/2, circle.get_height()/2]), int(radius+(width/2)))\n\t\tif int(radius-(width/2)) > 0: pygame.draw.circle(circle, [0,0,0,0], intlist([circle.get_width()/2, circle.get_height()/2]), abs(int(radius-(width/2))))\n\t\timage.blit(circle, [origin[0] - (circle.get_width()/2), origin[1] - (circle.get_height()/2)])", "user_title": "Anonymous", "datetimeon": "2009-09-30T10:47:07", "link": "pygame.draw.circle", "id": 2963}, {"content": "I think the problem has something to do with encapsulation.\nTry:\ncurrent_song = 0\ndef Play_Next_Song():\n global current_song\n if pygame.mixer.music.get_busy() == False:\n print songs[current_song]\n pygame.mixer.music.load(songs[current_song])\n pygame.mixer.music.play() \n current_song += 1", "user_title": "Anonymous", "datetimeon": "2009-09-21T11:39:31", "link": "pygame.mixer.music.load", "id": 2956}, {"content": "WHAT?", "user_title": "Anonymous", "datetimeon": "2009-09-23T15:22:38", "link": "pygame.draw.lines", "id": 2957}, {"content": "Can I draw circles too?", "user_title": "Anonymous", "datetimeon": "2009-09-24T13:53:40", "link": "pygame.draw.circle", "id": 2958}, {"content": "how can i get a mouse wheel value? please show in a snippet - i don't know how to use pygame.MOUSEBUTTONDOWN and pygame.MOUSEBUTTONUP", "user_title": "Anonymous", "datetimeon": "2009-09-25T11:53:07", "link": "pygame.mouse.get_pressed", "id": 2960}, {"content": "Setting the line width does not work!", "user_title": "Anonymous", "datetimeon": "2009-09-29T10:21:37", "link": "pygame.draw.rect", "id": 2962}, {"content": "i dont like pygame very much\nrectangles can go poop themselves", "user_title": "Anonymous", "datetimeon": "2010-05-21T11:08:52", "link": "Rect.collidelistall", "id": 3128}, {"content": "In fact it should be\n\"By calling Clock.tick(40)\" -> \"Clock.tick_busy_loop(40)\"", "user_title": "Anonymous", "datetimeon": "2010-06-01T03:26:55", "link": "Clock.tick_busy_loop", "id": 3130}, {"content": "No, waiting at the very beginning or very end of a loop does not make\nmuch difference. Moving it to the middle might: \n screen.fill(...)\n clock.tick(30)\n screen.blit(...)\nwill mostly show a blank screen because the fill will be visible\nduring the wait.", "user_title": "Anonymous", "datetimeon": "2010-06-01T07:55:40", "link": "Clock.tick", "id": 3131}, {"content": "haleluja", "user_title": "Anonymous", "datetimeon": "2010-06-02T03:11:33", "link": "Rect.collidelist", "id": 3133}, {"content": "PixelArray works faster than SurfArray for me also.", "user_title": "Anonymous", "datetimeon": "2010-06-02T20:55:16", "link": "pygame.PixelArray", "id": 3134}, {"content": "Only seems to block if you start another piece of music playing while it's still\nfading out.", "user_title": "Anonymous", "datetimeon": "2010-06-06T16:23:37", "link": "pygame.mixer.music.fadeout", "id": 3135}, {"content": "If you're having trouble with color keys, try image.set_alpha(None) on each individual subsurface.\nsubsurface seems not to always inherit its parent's alpha setting, so if the parent source image has an alpha then color key is ignored in subsurfaces.\n\nYou can easily remove the alpha channel in GIMP by right-clicking the background layer and selecting \"remove alpha channel\" to fix all your problems also :)", "user_title": "Anonymous", "datetimeon": "2010-06-08T23:09:21", "link": "Surface.subsurface", "id": 3139}, {"content": "You should use pygame.display.Info.current_h and pygame.display.Info.current_w.", "user_title": "Anonymous", "datetimeon": "2010-06-10T20:42:30", "link": "pygame.display.get_surface", "id": 3140}, {"content": "pygame.display.Info().current_h and pygame.display.Info().current_w", "user_title": "Anonymous", "datetimeon": "2010-06-10T20:43:14", "link": "pygame.display.get_surface", "id": 3141}, {"content": "screen = pygame.display.set_mode(...)\nscreen.get_size()", "user_title": "Anonymous", "datetimeon": "2010-06-10T20:55:19", "link": "pygame.display.get_surface", "id": 3142}, {"content": "11246579455877\nppqu s442", "user_title": "Anonymous", "datetimeon": "2010-06-11T18:56:04", "link": "pygame.mixer.music.play", "id": 3143}, {"content": "import pygame\nimport pygame, sys,os, time \nfrom pygame.locals import * \nfrom pygame.color import THECOLORS \nimport platform, os \nif platform.system()==\"Windows\": \n os.environ['SDL_VIDEODRIVER']='windib'\npygame.init()\nwindow = pygame.display.set_mode((600,600)) \nscreen = pygame.display.get_surface() \npygame.display.set_caption('Excercise 5') \nscreen.fill((0,0,0))\n\nclass GfxCursor:\n \"\"\"\n Replaces the normal pygame cursor with any bitmap cursor\n \"\"\"\n\n def __init__(self,surface,cursor=None,hotspot=(0,0)):\n \"\"\"\n surface = Global surface to draw on\n cursor = surface of cursor (needs to be specified when enabled!)\n hotspot = the hotspot for your cursor\n \"\"\"\n self.surface = surface\n self.enabled = 0\n self.cursor = None\n self.hotspot = hotspot\n self.bg = None\n self.offset = 0,0\n self.old_pos = 0,0\n \n if cursor:\n self.setCursor(cursor,hotspot)\n self.enable()\n\n def enable(self):\n \"\"\"\n Enable the GfxCursor (disable normal pygame cursor)\n \"\"\"\n if not self.cursor or self.enabled: return\n pygame.mouse.set_visible(0)\n self.enabled = 1\n\n def disable(self):\n \"\"\"\n Disable the GfxCursor (enable normal pygame cursor)\n \"\"\"\n if self.enabled:\n self.hide()\n pygame.mouse.set_visible(1)\n self.enabled = 0\n\n def setCursor(self,cursor,hotspot=(0,0)):\n \"\"\"\n Set a new cursor surface\n \"\"\"\n if not cursor: return\n self.cursor = cursor\n self.hide()\n self.show()\n self.offset = 0,0\n self.bg = pygame.Surface(self.cursor.get_size())\n pos = self.old_pos[0]-self.offset[0],self.old_pos[1]-self.offset[1]\n self.bg.blit(self.surface,(0,0),\n (pos[0],pos[1],self.cursor.get_width(),self.cursor.get_height()))\n\n self.offset = hotspot\n\n def setHotspot(self,pos):\n \"\"\"\n Set a new hotspot for the cursor\n \"\"\"\n self.hide()\n self.offset = pos\n\n def hide(self):\n \"\"\"\n Hide the cursor (useful for redraws)\n \"\"\"\n if self.bg and self.enabled:\n return self.surface.blit(self.bg,\n (self.old_pos[0]-self.offset[0],self.old_pos[1]-self.offset[1]))\n\n def show(self):\n \"\"\"\n Show the cursor again\n \"\"\"\n if self.bg and self.enabled:\n pos = self.old_pos[0]-self.offset[0],self.old_pos[1]-self.offset[1]\n self.bg.blit(self.surface,(0,0),\n (pos[0],pos[1],self.cursor.get_width(),self.cursor.get_height()))\n return self.surface.blit(self.cursor,pos)\n\n def update(self,event):\n \"\"\"\n Update the cursor with a MOUSEMOTION event\n \"\"\"\n self.old_pos = event.pos\n\nif __name__ == '__main__': #test it out\n import pygame.draw\n pygame.init()\n screen = pygame.display.set_mode((400, 300))\n screen.fill((50, 50, 111), (0, 0, 400, 150))\n pygame.display.flip()\n pygame.display.set_caption('Test the GfxCursor (and paint)')\n \n image = pygame.Surface((20, 20))\n pygame.draw.circle(image, (50, 220, 100), (10, 10), 8, 0)\n pygame.draw.circle(image, (220, 200, 50), (10, 10), 8, 2)\n image.set_at((9, 9), (255,255,255))\n image.set_colorkey(0, pygame.RLEACCEL)\n \n magicbox = pygame.Rect(10, 10, 100, 90)\n magiccolor = 0\n \n cursor = GfxCursor(screen, image, (10, 10))\n finished = 0\n downpos = None\n while not finished:\n dirtyrects = []\n dirtyrects.extend([cursor.hide()])\n for e in pygame.event.get():\n if e.type in (pygame.QUIT, pygame.KEYDOWN):\n finished = 1\n break\n elif e.type == pygame.MOUSEBUTTONDOWN:\n cursor.disable()\n downpos = e.pos\n elif e.type == pygame.MOUSEBUTTONUP:\n cursor.enable()\n downpos = None\n elif downpos and e.type == pygame.MOUSEMOTION:\n r = pygame.draw.line(screen, (100,100,100), downpos, e.pos, 2)\n dirtyrects.append(r)\n downpos = e.pos\n cursor.update(e)\n elif not downpos and e.type == pygame.MOUSEMOTION:\n cursor.update(e)\n \n magiccolor = (magiccolor + 2) % 255\n r = screen.fill((0, 0, magiccolor), magicbox)\n dirtyrects.append(r)\n \n #here's how we sandwich the flip/update with cursor show and hide\n dirtyrects.extend([cursor.show()])\n pygame.display.update(dirtyrects)\n \n pygame.time.delay(5) #should be time.wait(5) with pygame-1.3 :]", "user_title": "Anonymous", "datetimeon": "2010-06-13T02:45:37", "link": "Color.r", "id": 3145}, {"content": "I get an 'UnboundLocalError: local variable 'fonts' referenced before assignment' error. \nI'm on Mac OS X 10.4 Tiger with Python 2.6.4, Pygame 1.9.1.", "user_title": "Anonymous", "datetimeon": "2010-06-19T22:22:14", "link": "pygame.font.get_fonts", "id": 3146}, {"content": "I'm no expert but wouldn't it be faster to use the math.hypot(a, b)\nfunction for determining length instead of writing your own function?", "user_title": "Anonymous", "datetimeon": "2009-06-09T21:45:55", "link": "Joystick.get_axis", "id": 2759}, {"content": "You can also move the corner:\n\nsquare_corner=(x-square_dim[0]*sqrt(2)/2*sin((abs(angle)+45)*pi/180),\n y-square_dim[1]*sqrt(2)/2*sin((45+abs(angle))*pi/180))\n screen.blit(pygame.transform.rotate(square,angle), square_corner)\n\nBeware: sin calculates the angle in rad but rotate needs angles in degrees.", "user_title": "Anonymous", "datetimeon": "2009-06-08T14:31:39", "link": "pygame.transform.rotate", "id": 2758}, {"content": "ACTIVEEVENT has two attributes. \"gain\" is set to 0 or one depending if the type of focus was lost or gained. \"state\" will equal 1 for mouse focus, 2 for keyboard focus, or 4 for window iconification.", "user_title": "Anonymous", "datetimeon": "2009-06-03T22:15:32", "link": "pygame.event", "id": 2755}, {"content": "If you want only certain events to be enabled -- you will need to disable them all, and only then enable the ones that you need:\n#--\npygame.event.set_allowed(None)\nprint map(pygame.event.get_blocked,range(1,33))\npygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN, pygame.USEREVENT])\nprint map(pygame.event.get_blocked,range(1,33))\n#--\nbelow is the output:\n[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n[1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1]", "user_title": "Anonymous", "datetimeon": "2009-05-30T16:39:22", "link": "pygame.event.set_allowed", "id": 2754}, {"content": "Also, it should maybe be noted that it returns 4 tuple items, not just 3.\nMy guess is RGBA tuple instead of RGB, but I'm not an expert :P", "user_title": "Anonymous", "datetimeon": "2009-05-27T02:45:25", "link": "Surface.unmap_rgb", "id": 2753}, {"content": "convert a mapped integer color value into a Color\nSurface.map_rgb(mapped_int): return Color\n ^\nShouldn't it be \"Surface.unmap_rgb\"?", "user_title": "Anonymous", "datetimeon": "2009-05-27T02:43:16", "link": "Surface.unmap_rgb", "id": 2752}, {"content": "Tracked module playback with Pygame has a lower playback volume than usual,\nand I need to find something like \"stereo separation\" feature yet.", "user_title": "Anonymous", "datetimeon": "2009-05-21T06:41:14", "link": "pygame.mixer.music", "id": 2751}, {"content": "Yes, I just found it out, and it plays tracked music modules such as MOD or XM.\nBut IT (Impulse Tracker) modules don't play correctly. Wow. I used fmod with Python bindings\nall the time, and Pygame supported it already. I wish I knew that sooner :D", "user_title": "Anonymous", "datetimeon": "2009-05-21T06:35:19", "link": "pygame.mixer.music", "id": 2750}, {"content": "While using this, it seems that it returns true when the music is paused. Anyone else having this problem, if it's a problem?", "user_title": "Anonymous", "datetimeon": "2009-05-19T11:35:42", "link": "pygame.mixer.music.get_busy", "id": 2749}, {"content": "If you want to draw the sprites in your group in the opposite order you could try something like this:\n#Suppose that you keep a list of objects in \"Sprites\"\nSprites=[]\n#You also have:\nAllsprites=pygame.sprite.OrderedUpdates(Sprites)\n\nWhenever you add something to the list of sprites, you want to add it to Allsprites like this:\ndef create_sprite():\n a=SomeClassForYourSprite()\n Sprites.append(a)\n Allsprites.add(a)\n\n#That is how I normally add sprites, but unfortunately I was getting the reverse order of what I wanted so I did this:\ndef create_sprite():\n Allsprites.empty() #This removes all objects from your group\n a=SomeClassForYourSprite()\n Sprites.insert(0,a) #Placing your new sprite at the front of the list\n for sprite in Sprites:\n Allsprites.add(sprite)\n\nThis should reverse the order for you, allowing the newest sprite created to appear at the bottom instead of the top", "user_title": "Anonymous", "datetimeon": "2009-05-11T00:29:55", "link": "pygame.sprite.OrderedUpdates", "id": 2744}, {"content": "Is this function blocking? I mean... when it returns and my program flow continues, can I be assured that the display has updated on the actual screen?", "user_title": "Anonymous", "datetimeon": "2011-01-14T19:38:50", "link": "pygame.display.update", "id": 3730}, {"content": "Is there a way to set a path to a font file?", "user_title": "Anonymous", "datetimeon": "2011-01-16T15:32:54", "link": "pygame.font.SysFont", "id": 3734}, {"content": "eee", "user_title": "Anonymous", "datetimeon": "2011-01-16T19:25:25", "link": "pygame.image.tostring", "id": 3735}, {"content": "The last comment was spam", "user_title": "Anonymous", "datetimeon": "2011-01-17T21:08:17", "link": "pygame.draw.polygon", "id": 3737}, {"content": "[(x,y), (x1,y1), (x2,y2)]", "user_title": "Anonymous", "datetimeon": "2011-01-17T21:08:51", "link": "pygame.draw.polygon", "id": 3738}, {"content": "The core algorithm works with 32-bit surfaces. When a 24-bit surface is passed, the pixel data is converted to 32-bit data before the actual transformation, and then it's converted back into 24-bits again, which means 2 extra conversions of the whole image. This would especially be troublesome with large images.", "user_title": "Anonymous", "datetimeon": "2011-01-18T03:41:16", "link": "pygame.transform.smoothscale", "id": 3739}, {"content": "re", "user_title": "Anonymous", "datetimeon": "2011-01-18T06:48:13", "link": "pygame.mixer.music.pause", "id": 3740}, {"content": "Hello world", "user_title": "Anonymous", "datetimeon": "2011-01-19T16:38:01", "link": "index.html", "id": 3743}, {"content": "what", "user_title": "Anonymous", "datetimeon": "2011-01-25T20:39:22", "link": "pygame.event.get_grab", "id": 3748}, {"content": "The width for \"ae\" WILL always match the width for \"a\" + \"e\" (which is \"a\" concatinated with\"e\").\nIt will not always match the width of \"a\" plus the width of \"e\".\n(But we knew what you meant.)", "user_title": "Anonymous", "datetimeon": "2011-01-25T21:11:43", "link": "Font.size", "id": 3749}, {"content": "can we get an admin to delete that?", "user_title": "Anonymous", "datetimeon": "2011-01-27T17:25:55", "link": "pygame.draw.circle", "id": 3754}, {"content": "This function seems to me little bit buggy, so I wrote my own:\n\na and b are surfarrays of some surfaces that you want to compare\n\n def comparray(self,a,b):\n c = abs(a.__sub__(b))\n c = c.__ge__(self.tolerance)*255\n surface = pygame.surfarray.make_surface(c)\n return surface", "user_title": "Anonymous", "datetimeon": "2011-01-27T18:49:07", "link": "PixelArray.compare", "id": 3755}, {"content": "your gay", "user_title": "Anonymous", "datetimeon": "2011-01-28T04:28:47", "link": "Rect.colliderect", "id": 3758}, {"content": "It would be nice if the number of Sounds on queue was more than one...\n\nGreg Ruo", "user_title": "Anonymous", "datetimeon": "2011-01-30T21:39:27", "link": "Channel.queue", "id": 3765}, {"content": "I solved my previous question:\n\nIf you need to play in sequence several Sounds in a queue, you can solve this\nwith something like:\n=======================\n i=0\n while (Ch0.get_queue()==None) and (i<10):\n i+=1\n Ch0.queue(f[i])\n============================\n\nwhere Ch0 is your Sound channel created with Ch0=pygame.mixer.Channel(0).\nIn other words, even if the queue allows only one single sound in queue,\nI use the .get_queue method to wait until the queue is free before\n adding the next Sound in the sequence.\n\nIf you have better solutions please reply here. Thanks.\n\nGreg Ruo", "user_title": "Anonymous", "datetimeon": "2011-01-30T22:38:45", "link": "Channel.queue", "id": 3766}, {"content": "Probably would be good to have an OPTIONAL choice to remove them from the queue . . .", "user_title": "Anonymous", "datetimeon": "2011-01-31T13:48:40", "link": "pygame.event.get", "id": 3768}, {"content": "I had this weird thing where blue/red was inversed, but not the other colours, when I was mapping some pixels from one image to a blank surface.\nIt was caused by copying the color integer directly to one pixel to the other, so the trick is to always surface.unmap_rgb(pixel) before setting the color to a new pixel \nThat tricked works.\nIt's the only way unfortunately.", "user_title": "Anonymous", "datetimeon": "2011-02-04T02:33:15", "link": "pygame.PixelArray", "id": 3771}, {"content": "@Dave: Thanks very much for writing that we should ignore the keyword \"width\". This saved me time and my program now works.", "user_title": "Anonymous", "datetimeon": "2011-02-05T08:25:19", "link": "pygame.draw.rect", "id": 3773}, {"content": "ankit sucks", "user_title": "Anonymous", "datetimeon": "2011-02-08T14:07:31", "link": "Rect.colliderect", "id": 3776}, {"content": "i heard ankit really sucks", "user_title": "Anonymous", "datetimeon": "2011-02-08T14:07:46", "link": "Rect.collidepoint", "id": 3777}, {"content": "ankit tandon sucks", "user_title": "Anonymous", "datetimeon": "2011-02-08T14:07:55", "link": "Rect.contains", "id": 3778}, {"content": "I don't get what this does...", "user_title": "Anonymous", "datetimeon": "2011-02-09T22:32:43", "link": "pygame.event.pump", "id": 3779}, {"content": "If you don't use the event queue(why aren't you??) this will keep your program from locking up.", "user_title": "Anonymous", "datetimeon": "2011-02-10T21:20:05", "link": "pygame.event.pump", "id": 3780}, {"content": "When the camera is stopped and you try to access it pygame segfaults.\n(On Debian testing with pygame 1.9.1)", "user_title": "Anonymous", "datetimeon": "2011-02-11T03:31:32", "link": "Camera.stop", "id": 3781}, {"content": "set_allowed removes events from the queue! \nEven if the event in question doesn't belong to the given type.\n\n>>> import pygame\n>>> pygame.init()\n>>> pygame.event.post(pygame.event.Event(pygame.USEREVENT, code=0))\n>>> print pygame.event.peek(pygame.USEREVENT)\n1\n>>> pygame.event.set_allowed(pygame.MOUSEMOTION)\n>>> print pygame.event.peek(pygame.USEREVENT)\n0", "user_title": "Anonymous", "datetimeon": "2011-02-11T17:42:34", "link": "pygame.event.set_allowed", "id": 3782}, {"content": "Thank you very much.\nYour compare function works much better than the original one.", "user_title": "Anonymous", "datetimeon": "2011-02-14T16:59:41", "link": "PixelArray.compare", "id": 3783}, {"content": "meto", "user_title": "Anonymous", "datetimeon": "2011-02-15T19:30:06", "link": "Color.g", "id": 3786}, {"content": "rofl rofl what for a crappy thing you performed? go to wikipedia it works!\n\nu mad!", "user_title": "Anonymous", "datetimeon": "2011-02-16T06:49:19", "link": "pygame.draw.rect", "id": 3787}, {"content": "rofl rofl what for a crappy thing you performed? go to wikipedia it works!\n\nu mad!", "user_title": "Anonymous", "datetimeon": "2011-02-16T06:50:00", "link": "pygame.draw.rect", "id": 3788}, {"content": "stfu\n\nu mad", "user_title": "Anonymous", "datetimeon": "2011-02-16T06:52:07", "link": "Rect.unionall_ip", "id": 3789}, {"content": "This method only queues one music file.\nIf you call it and there already is a queued file, it will be overrided.", "user_title": "Anonymous", "datetimeon": "2011-02-19T12:17:58", "link": "pygame.mixer.music.queue", "id": 3791}, {"content": "elif event.type == pygame.QUIT or event.type == pygame.K_ESCAPE:\n\nthe event type is not pygame.K_ESCAPE. you have to check for a KEYDOWN or KEYUP event and check if it is the key you want, for example:\n\nelif event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):", "user_title": "Anonymous", "datetimeon": "2011-02-21T08:30:17", "link": "pygame.key", "id": 3793}, {"content": "Well, sometimes black and white are swapped, sometimes they aren't.\nEven in the same program, for one mouse cursor it may work right,\nand for another cursor the black & white colors are swapped.\n\nI haven't figured out what triggers this bug.", "user_title": "Anonymous", "datetimeon": "2011-02-24T13:00:58", "link": "pygame.cursors.compile", "id": 3797}, {"content": "spam", "user_title": "Anonymous", "datetimeon": "2011-02-26T15:00:47", "link": "pygame.event.set_grab", "id": 3798}, {"content": "In Pygame 1.9.2 surface objects have sprouted a new method, get_view:\n\nSurface.get_view\nreturn a view of a surface's pixel data.\nSurface.get_view(kind='2'): return\n\nReturn an object which exposes a surface's internal pixel buffer to a NumPy array. For now a custom object with an array struct interface is returned. A Python memoryview may be returned in the future. The buffer is writeable.\n\nThe kind argument is the length 1 string '2', '3', 'r', 'g', 'b', or 'a'. The letters are case insensitive; 'A' will work as well. The argument can be either a Unicode or byte (char) string. The default is '2'.\n\nA kind '2' view is a (surface-width, surface-height) array of raw pixels. The pixels are surface bytesized unsigned integers. The pixel format is surface specific. It is unavailable for 24-bit surfaces.\n\n'3' returns a (surface-width, surface-height, 3) view of RGB color components. Each of the red, green, and blue components are unsigned bytes. Only 24-bit and 32-bit surfaces are supported. The color components must be in either RGB or BGR order within the pixel.\n\n'r' for red, 'g' for green, 'b' for blue, and 'a' for alpha return a (surface-width, surface-height) view of a single color component within a surface: a color plane. Color components are unsigned bytes. Both 24-bit and 32-bit surfaces support 'r', 'g', and 'b'. Only 32-bit surfaces with SRCALPHA support 'a'.\n\nThis method implicitly locks the Surface. The lock will be released, once the returned view object is deleted.", "user_title": "Anonymous", "datetimeon": "2011-03-01T14:59:53", "link": "pygame.Surface", "id": 3803}, {"content": "In Pygame 1.9.2 surface objects have sprouted a new method, get_view:\n\nSurface.get_view\nreturn a view of a surface's pixel data.\nSurface.get_view(kind='2'): return\n\nReturn an object which exposes a surface's internal pixel buffer to a NumPy\narray. For now a custom object with an array struct interface is returned.\nA Python memoryview may be returned in the future. The buffer is writeable.\n\nThe kind argument is the length 1 string '2', '3', 'r', 'g', 'b', or 'a'.\nThe letters are case insensitive; 'A' will work as well. The argument can be\neither a Unicode or byte (char) string. The default is '2'.\n\nA kind '2' view is a (surface-width, surface-height) array of raw pixels. The\npixels are surface bytesized unsigned integers. The pixel format is surface\nspecific. It is unavailable for 24-bit surfaces.\n\n'3' returns a (surface-width, surface-height, 3) view of RGB color components.\nEach of the red, green, and blue components are unsigned bytes. Only 24-bit and\n32-bit surfaces are supported. The color components must be in either RGB or\nBGR order within the pixel.\n\n'r' for red, 'g' for green, 'b' for blue, and 'a' for alpha return a\n(surface-width, surface-height) view of a single color component within a\nsurface: a color plane. Color components are unsigned bytes. Both 24-bit and\n32-bit surfaces support 'r', 'g', and 'b'. Only 32-bit surfaces with SRCALPHA\nsupport 'a'.\n\nThis method implicitly locks the Surface. The lock will be released, once the\nreturned view object is deleted.", "user_title": "Anonymous", "datetimeon": "2011-03-01T15:02:04", "link": "pygame.Surface", "id": 3804}, {"content": "for statement with arc", "user_title": "Anonymous", "datetimeon": "2011-03-01T19:54:13", "link": "pygame.draw.arc", "id": 3805}, {"content": "Oh my god I was so thankful that you can adjust the volume, I have no editing software to fix my sounds.", "user_title": "Anonymous", "datetimeon": "2011-03-03T21:26:40", "link": "Sound.set_volume", "id": 3806}, {"content": "Thanks to the comments for wrinting about the event attributes and the key constants list. It should be in any serious documentation.", "user_title": "Anonymous", "datetimeon": "2011-03-09T16:10:36", "link": "pygame.event.Event", "id": 3808}, {"content": "a;rtawkljethlak", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:41:39", "link": "pygame.font", "id": 3809}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:20", "link": "pygame.font.init", "id": 3810}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:22", "link": "pygame.font.init", "id": 3811}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:24", "link": "pygame.font.init", "id": 3812}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:27", "link": "pygame.font.init", "id": 3813}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:29", "link": "pygame.font.init", "id": 3814}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:31", "link": "pygame.font.init", "id": 3815}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:33", "link": "pygame.font.init", "id": 3816}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:36", "link": "pygame.font.init", "id": 3817}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:37", "link": "pygame.font.init", "id": 3818}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:47", "link": "pygame.font.init", "id": 3819}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:53", "link": "pygame.font.init", "id": 3820}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:54", "link": "pygame.font.init", "id": 3821}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:56", "link": "pygame.font.init", "id": 3822}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:42:58", "link": "pygame.font.init", "id": 3823}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:01", "link": "pygame.font.init", "id": 3824}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:03", "link": "pygame.font.init", "id": 3825}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:07", "link": "pygame.font.init", "id": 3826}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:09", "link": "pygame.font.init", "id": 3827}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:11", "link": "pygame.font.init", "id": 3828}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:13", "link": "pygame.font.init", "id": 3829}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:15", "link": "pygame.font.init", "id": 3830}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:16", "link": "pygame.font.init", "id": 3831}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:19", "link": "pygame.font.init", "id": 3832}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:20", "link": "pygame.font.init", "id": 3833}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:22", "link": "pygame.font.init", "id": 3834}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:24", "link": "pygame.font.init", "id": 3835}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:26", "link": "pygame.font.init", "id": 3836}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:28", "link": "pygame.font.init", "id": 3837}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:29", "link": "pygame.font.init", "id": 3838}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:31", "link": "pygame.font.init", "id": 3839}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:33", "link": "pygame.font.init", "id": 3840}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:35", "link": "pygame.font.init", "id": 3841}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:37", "link": "pygame.font.init", "id": 3842}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:39", "link": "pygame.font.init", "id": 3843}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:40", "link": "pygame.font.init", "id": 3844}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:42", "link": "pygame.font.init", "id": 3845}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:45", "link": "pygame.font.init", "id": 3846}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:46", "link": "pygame.font.init", "id": 3847}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:48", "link": "pygame.font.init", "id": 3848}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:50", "link": "pygame.font.init", "id": 3849}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:52", "link": "pygame.font.init", "id": 3850}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:53", "link": "pygame.font.init", "id": 3851}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:55", "link": "pygame.font.init", "id": 3852}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:57", "link": "pygame.font.init", "id": 3853}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:43:59", "link": "pygame.font.init", "id": 3854}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:07", "link": "pygame.font.init", "id": 3855}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:09", "link": "pygame.font.init", "id": 3856}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:11", "link": "pygame.font.init", "id": 3857}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:13", "link": "pygame.font.init", "id": 3858}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:15", "link": "pygame.font.init", "id": 3859}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:18", "link": "pygame.font.init", "id": 3860}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:20", "link": "pygame.font.init", "id": 3861}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:22", "link": "pygame.font.init", "id": 3862}, {"content": "I LIKEY TO SPAM", "user_title": "Anonymous", "datetimeon": "2011-03-10T18:44:24", "link": "pygame.font.init", "id": 3863}, {"content": "Hey guys, how do you detect if user hits enter? There's no event.key for that! Thank you.", "user_title": "Anonymous", "datetimeon": "2011-03-12T11:25:09", "link": "pygame.key", "id": 3864}, {"content": "Could somebody please delete the horrible code in this comment thread? :(", "user_title": "Anonymous", "datetimeon": "2011-03-15T20:16:46", "link": "pygame.draw.circle", "id": 3865}, {"content": "pygame documentation\t || Pygame Home || Help Contents || Reference Index || \n \nCamera || Cdrom || Color || Cursors || Display || Draw || Event || Examples || Font || Gfxdraw || Image || Joystick || Key || Locals || Mask || Midi || Mixer || Mouse || Movie || Music || Overlay || Pixelarray || Pygame || Rect || Scrap || Sndarray || Sprite || Surface || Surfarray || Tests || Time || Transform\nFont.metrics\n\nThe user submitted comments should be used for:\n\nExamples\nHelpful hints, tips, and tricks\nFurther explanation / documentation\nThe user submitted comments should NOT be used for:\n\nBug Reports (see our new Bug Reports link on the side)\nFeature Requests\nQuestions\nPlease note that periodically, the developers may go through the notes and incorporate the information in them into the documentation. This means that any note submitted here becomes the property of Pete Shinners under the LGPL licence.\n\nIf you do not want to leave an anonymous comment, please sign in first.", "user_title": "Anonymous", "datetimeon": "2011-03-21T15:13:24", "link": "Font.metrics", "id": 3868}, {"content": "I can't figure how to crop an image, even after reading this suggestion", "user_title": "Anonymous", "datetimeon": "2011-03-22T11:32:04", "link": "pygame.transform.chop", "id": 3870}, {"content": "I was dumb. Here is how I got it to work. So simple:\n\ncreen.blit(gameboard,(selection.x-18,selection.y-18),(selection.x-18,selection.y-18,96,96))", "user_title": "Anonymous", "datetimeon": "2011-03-22T11:45:29", "link": "pygame.transform.chop", "id": 3871}, {"content": "Perfect, Matthew Brown! Just what I was looking for. I found the reset_stuff() function especially useful and I'm going to use it in our production software.", "user_title": "Anonymous", "datetimeon": "2011-03-24T10:34:18", "link": "pygame.draw.circle", "id": 3873}, {"content": "Wow, thanks a lot Matthew, I am a PyGame newbie and was having some troubles understanding this function without a complete example.", "user_title": "Anonymous", "datetimeon": "2011-03-24T12:23:02", "link": "pygame.draw.circle", "id": 3874}, {"content": "lol", "user_title": "Anonymous", "datetimeon": "2011-03-24T18:06:29", "link": "pygame.draw.circle", "id": 3875}, {"content": "Guys, what Matthew N. Brown did here harms python's reputation.\n\nPython is elegant.\n\nWhat Matthew did was perlify python ... this is terrible...", "user_title": "Anonymous", "datetimeon": "2011-03-24T18:07:11", "link": "pygame.draw.circle", "id": 3876}, {"content": "Just wanted to give my profuse thanks to Matthew N. Brown for his superb usage example of this otherwise vague and esoteric method. I've contacted my boss and we will now integrate this snippet into all of our newly created (and soon-to-be-refactored) legacy code.", "user_title": "Anonymous", "datetimeon": "2011-03-25T20:41:38", "link": "pygame.draw.circle", "id": 3878}, {"content": "where image is a surface, rot and scale are floats\n\n return pygame.transform.smoothscale(image, rot, scale)\nTypeError: argument 2 must be 2-item sequence, not float\n \n return pygame.transform.smoothscale(image,[0,0], scale)\nTypeError: argument 3 must be pygame.Surface, not float", "user_title": "Anonymous", "datetimeon": "2011-03-27T01:37:09", "link": "pygame.transform.rotozoom", "id": 3879}, {"content": "and...\n surf = pygame.surface.Surface((image.get_width()*scale, image.get_height()*scale))\n return pygame.transform.smoothscale(image,[0,0], surf)\n\n pygame.transform.smoothscale(image,[0,0], surf)\nValueError: Destination surface not the given width or height.", "user_title": "Anonymous", "datetimeon": "2011-03-27T01:40:56", "link": "pygame.transform.rotozoom", "id": 3880}, {"content": "look at set_grab first and then you understand", "user_title": "Anonymous", "datetimeon": "2011-03-27T13:55:15", "link": "pygame.event.get_grab", "id": 3881}, {"content": "getting this error :\n in __init__\n self.font = pygame.font.Font(\"None\", 50)\nerror: font not initialized\n\nnot sure why because i rendered the font..", "user_title": "Anonymous", "datetimeon": "2011-04-02T14:35:05", "link": "Font.render", "id": 3882}, {"content": "The enter key is K_RETURN.", "user_title": "Anonymous", "datetimeon": "2011-04-02T17:03:07", "link": "pygame.key", "id": 3883}, {"content": "For this error :\nthere is no soundcard\n\nCall pygame.mixer.init two times :\npygame.mixer.init()\npygame.mixer.init()\n\nOR\n\npygame.mixer.init(); pygame.mixer.init()\n\n(don't omit semicolon)", "user_title": "Anonymous", "datetimeon": "2011-04-05T05:06:41", "link": "pygame.mixer.init", "id": 3886}, {"content": "/love little kids who leave dumb comments like this one", "user_title": "Anonymous", "datetimeon": "2011-04-12T10:48:18", "link": "Rect.colliderect", "id": 3889}, {"content": "there is no information about the supported formats - are those from ModPlugTracker supported? (like .mod, .xm, .s3m, etc.)", "user_title": "Anonymous", "datetimeon": "2011-04-12T12:35:41", "link": "pygame.mixer.music.load", "id": 3890}, {"content": "Yes", "user_title": "Anonymous", "datetimeon": "2011-04-12T16:17:04", "link": "Font.render", "id": 3891}, {"content": "This seems to be broken!\nI call this before playing a movie, but there is no sound.\nPlaying the movie without initializing the mixer in the first place, works!\n\nCan anyone confirm that this is broken?", "user_title": "Anonymous", "datetimeon": "2011-04-18T11:51:33", "link": "pygame.mixer.quit", "id": 3895}, {"content": "For Windows (XP):\nThe problem is that the screen does not get updated automatically, for some reason.\nThe solution is simple. Take a surface with the size of the movie, set this as the display of the movie.\nIn a loop, get the current frame of the movie and if it increases, blit the surface onto the screen and update the screen.", "user_title": "Anonymous", "datetimeon": "2011-04-19T10:47:45", "link": "pygame.movie", "id": 3896}, {"content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\nfrom pygame import *\nimport pygame, time, numpy, pygame.sndarray\n\nsample_rate = 44100\n\ndef play_for(sample_array, ms, volLeft, volRight):\n sound = pygame.sndarray.make_sound(sample_array)\n beg = time.time()\n channel = sound.play(-1)\n channel.set_volume(volLeft,volRight)\n pygame.time.delay(ms)\n sound.stop()\n end = time.time()\n return beg, end\n \ndef sine_array_onecycle(hz, peak):\n length = sample_rate / float(hz)\n omega = numpy.pi * 2 / length\n xvalues = numpy.arange(int(length)) * omega\n return (peak * numpy.sin(xvalues))\n \ndef sine_array(hz, peak, n_samples = sample_rate):\n return numpy.resize(sine_array_onecycle(hz, peak), (n_samples,))\n \ndef main():\n pygame.mixer.pre_init(sample_rate, -16, 2) # 44.1kHz, 16-bit signed, stereo\n pygame.init()\n f = sine_array(8000, 1)\n f = numpy.array(zip (f , f))\n\n play_for(f , 5000, 0.5, 0.5)\n\nif __name__ == '__main__': main()", "user_title": "Anonymous", "datetimeon": "2011-04-22T12:57:35", "link": "pygame.sndarray.make_sound", "id": 4038}, {"content": "Get Unicode key in Pygame:\n\nfrom pygame import *\npygame.init()\npygame.display.set_mode((500,500),OPENGLBLIT|OPENGL|DOUBLEBUF)\nexitt = 0 \ninte = 4096\nwhile not exitt:\n for event in pygame.event.get():\n if event.type == pygame.QUIT: \n pygame.quit()\n exitt = True\n if event.type == KEYDOWN:\n print event.dict['unicode']", "user_title": "Anonymous", "datetimeon": "2011-04-23T04:11:07", "link": "pygame.key", "id": 4039}, {"content": "The param is \"loops\" not \"loop\".", "user_title": "Anonymous", "datetimeon": "2011-04-27T15:37:38", "link": "Movie.play", "id": 4040}, {"content": "Use it when you load PNG images with transparencies", "user_title": "Anonymous", "datetimeon": "2011-04-30T21:10:05", "link": "Surface.convert_alpha", "id": 4041}, {"content": "The dest argument doesnt work for me, say if I do\n\nscreen.blit(mySurf, dest=(0,0))\n\nor screen.blit(mySurf, dest=(100,100))\n\nI get exactly the same outcome.\n\nWhere am i wrong?", "user_title": "Anonymous", "datetimeon": "2011-05-03T00:45:25", "link": "Surface.blit", "id": 4042}, {"content": "Sorry I realized i was blitting to screen instead of my temporary surface,\nplease ignore (and delete) my comment.", "user_title": "Anonymous", "datetimeon": "2011-05-03T00:46:43", "link": "Surface.blit", "id": 4043}, {"content": "How does that differ from pygame.draw.aalines? This one can also not be filled.", "user_title": "Anonymous", "datetimeon": "2011-05-04T14:58:27", "link": "pygame.gfxdraw.aapolygon", "id": 4044}, {"content": "XBM not supported?", "user_title": "Anonymous", "datetimeon": "2011-05-10T04:11:53", "link": "pygame.image", "id": 4048}, {"content": "I believe it offsets the detection area by (x,y) pixels. So just put (0,0) for no offset", "user_title": "Anonymous", "datetimeon": "2011-05-11T00:48:47", "link": "Mask.draw", "id": 4049}, {"content": "This function seems to need raw strings!", "user_title": "Anonymous", "datetimeon": "2011-05-12T10:26:46", "link": "pygame.image.save", "id": 4050}, {"content": "Is there anyway to play more than 2 songs I have tried everything I want the loaded music to play in order\n#!/usr/bin/env python\nimport pygame\npygame.mixer.init()\npygame.mixer.pre_init(44100, -16, 2, 2048)\npygame.init()\nprint \"hey I finaly got this working!\"\npygame.mixer.music.load('D:/Users/John/Music/Music/FUN.OGG')\npygame.mixer.music.load('D:/Users/John/Music/Music/Still Alive.OGG')\npygame.mixer.music.load('D:/Users/John/Music/Music/turret.OGG')\npygame.mixer.music.load('D:/Users/John/Music/Music/portalend.OGG')\npygame.mixer.music.play()\nimport pysic", "user_title": "Anonymous", "datetimeon": "2011-05-14T16:30:13", "link": "pygame.mixer.music.load", "id": 4053}, {"content": "How is it you play more than one song besides using queue", "user_title": "Anonymous", "datetimeon": "2011-05-14T19:29:16", "link": "pygame.mixer.music.play", "id": 4054}, {"content": "how is it to play a list of songs more than just one without using the queue(which only works once)", "user_title": "Anonymous", "datetimeon": "2011-05-14T19:32:21", "link": "pygame.mixer.music.play", "id": 4055}, {"content": "can the rectangle be filled with an RGBA color so that I can make it transclucent?", "user_title": "Anonymous", "datetimeon": "2011-05-26T09:16:14", "link": "pygame.draw.rect", "id": 4056}, {"content": "Exemple, playing a sinus sound :\n\n#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\nfrom pygame import *\nimport pygame, time, numpy, pygame.sndarray\n\nsample_rate = 44100\n\ndef play_for(sample_array, ms, volLeft, volRight):\n sound = pygame.sndarray.make_sound(sample_array)\n beg = time.time()\n channel = sound.play(-1)\n channel.set_volume(volLeft,volRight)\n pygame.time.delay(ms)\n sound.stop()\n end = time.time()\n return beg, end\n \ndef sine_array_onecycle(hz, peak):\n length = sample_rate / float(hz)\n omega = numpy.pi * 2 / length\n xvalues = numpy.arange(int(length)) * omega\n return (peak * numpy.sin(xvalues))\n \ndef sine_array(hz, peak, n_samples = sample_rate):\n return numpy.resize(sine_array_onecycle(hz, peak), (n_samples,))\n\n \ndef main():\n pygame.mixer.pre_init(sample_rate, -16, 2) # 44.1kHz, 16-bit signed, stereo\n pygame.init()\n f = sine_array(8000, 1)\n f = numpy.array(zip (f , f))\n\n play_for(f , 5000, 0.2, 0.2)\n\nif __name__ == '__main__': main()", "user_title": "Anonymous", "datetimeon": "2011-05-27T02:36:07", "link": "pygame.sndarray", "id": 4057}] \ No newline at end of file diff --git a/venv/Lib/site-packages/pygame/draw.cp37-win32.pyd b/venv/Lib/site-packages/pygame/draw.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..f72638d2031b5f0bfcfeb9ad001b791dea0f1849 GIT binary patch literal 32256 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 (3, 0, 0): + from math import floor, ceil +else: + # Python2.7 + # FIXME : the import of the builtin math module is broken ... + def floor(x): + int_x = int(x) + return int_x if (x == int_x or x > 0) else int_x - 1 + + def ceil(x): + int_x = int(x) + return int_x if (int_x == x or x < 0) else int_x + 1 + + +# H E L P E R F U N C T I O N S # + +# fractional part of x + +def frac(x): + '''return fractional part of x''' + return x - floor(x) + +def inv_frac(x): + '''return inverse fractional part of x''' + return 1 - (x - floor(x)) # eg, 1 - frac(x) + + +# L O W L E V E L D R A W F U N C T I O N S # +# (They are too low-level to be translated into python, right?) + +def set_at(surf, x, y, color): + surf.set_at((x, y), color) + + +def draw_pixel(surf, x, y, color, bright, blend=True): + '''draw one blended pixel with given brightness.''' + try: + other_col = surf.get_at((x, y)) if blend else (0, 0, 0, 0) + except IndexError: # pixel outside the surface + return + new_color = tuple((bright * col + (1 - bright) * pix) + for col, pix in zip(color, other_col)) + # FIXME what should happen if only one, color or surf_col, has alpha? + surf.set_at((x, y), new_color) + + +def _drawhorzline(surf, color, x_from, y, x_to): + if x_from == x_to: + surf.set_at((x_from, y), color) + return + + start, end = (x_from, x_to) if x_from <= x_to else (x_to, x_from) + for x in range(start, end + 1): + surf.set_at((x, y), color) + + +def _drawvertline(surf, color, x, y_from, y_to): + if y_from == y_to: + surf.set_at((x, y_from), color) + return + + start, end = (y_from, y_to) if y_from <= y_to else (y_to, y_from) + for y in range(start, end + 1): + surf.set_at((x, y), color) + + +# I N T E R N A L D R A W L I N E F U N C T I O N S # + +def _clip_and_draw_horzline(surf, color, x_from, y, x_to): + '''draw clipped horizontal line.''' + # check Y inside surf + clip = surf.get_clip() + if y < clip.y or y >= clip.y + clip.h: + return + + x_from = max(x_from, clip.x) + x_to = min(x_to, clip.x + clip.w - 1) + + # check any x inside surf + if x_to < clip.x or x_from >= clip.x + clip.w: + return + + _drawhorzline(surf, color, x_from, y, x_to) + + +def _clip_and_draw_vertline(surf, color, x, y_from, y_to): + '''draw clipped vertical line.''' + # check X inside surf + clip = surf.get_clip() + + if x < clip.x or x >= clip.x + clip.w: + return + + y_from = max(y_from, clip.y) + y_to = min(y_to, clip.y + clip.h - 1) + + # check any y inside surf + if y_to < clip.y or y_from >= clip.y + clip.h: + return + + _drawvertline(surf, color, x, y_from, y_to) + +# These constans xxx_EDGE are "outside-the-bounding-box"-flags +LEFT_EDGE = 0x1 +RIGHT_EDGE = 0x2 +BOTTOM_EDGE = 0x4 +TOP_EDGE = 0x8 + +def encode(x, y, left, top, right, bottom): + '''returns a code that defines position with respect to a bounding box''' + # we use the fact that python interprets booleans (the inqualities) + # as 0/1, and then multiply them with the xxx_EDGE flags + return ((x < left) * LEFT_EDGE + + (x > right) * RIGHT_EDGE + + (y < top) * TOP_EDGE + + (y > bottom) * BOTTOM_EDGE) + + +INSIDE = lambda a: not a +ACCEPT = lambda a, b: not (a or b) +REJECT = lambda a, b: a and b + + +def clip_line(line, left, top, right, bottom, use_float=False): + '''Algorithm to calculate the clipped line. + + We calculate the coordinates of the part of the line segment within the + bounding box (defined by left, top, right, bottom). The we write + the coordinates of the line segment into "line", much like the C-algorithm. + With `use_float` True, clip_line is usable for float-clipping. + + Returns: true if the line segment cuts the bounding box (false otherwise) + ''' + assert isinstance(line, list) + x1, y1, x2, y2 = line + dtype = float if use_float else int + + while True: + # the coordinates are progressively modified with the codes, + # until they are either rejected or correspond to the final result. + code1 = encode(x1, y1, left, top, right, bottom) + code2 = encode(x2, y2, left, top, right, bottom) + + if ACCEPT(code1, code2): + # write coordinates into "line" ! + line[:] = x1, y1, x2, y2 + return True + if REJECT(code1, code2): + return False + + # We operate on the (x1, y1) point, and swap if it is inside the bbox: + if INSIDE(code1): + x1, x2 = x2, x1 + y1, y2 = y2, y1 + code1, code2 = code2, code1 + if (x2 != x1): + m = (y2 - y1) / float(x2 - x1) + else: + m = 1.0 + # Each case, if true, means that we are outside the border: + # calculate x1 and y1 to be the "first point" inside the bbox... + if code1 & LEFT_EDGE: + y1 += dtype((left - x1) * m) + x1 = left + elif code1 & RIGHT_EDGE: + y1 += dtype((right - x1) * m) + x1 = right + elif code1 & BOTTOM_EDGE: + if x2 != x1: + x1 += dtype((bottom - y1) / m) + y1 = bottom + elif code1 & TOP_EDGE: + if x2 != x1: + x1 += dtype((top - y1) / m) + y1 = top + + +def _draw_line(surf, color, x1, y1, x2, y2): + '''draw a non-horizontal line (without anti-aliasing).''' + # Variant of https://en.wikipedia.org/wiki/Bresenham's_line_algorithm + # + # This strongly differs from craw.c implementation, because we use a + # "slope" variable (instead of delta_x and delta_y) and a "error" variable. + # And we can not do pointer-arithmetic with "BytesPerPixel", like in + # the C-algorithm. + if x1 == x2: + # This case should not happen... + raise ValueError + + slope = abs((y2 - y1) / (x2 - x1)) + error = 0.0 + + if slope < 1: + # Here, it's a rather horizontal line + + # 1. check in which octants we are & set init values + if x2 < x1: + x1, x2 = x2, x1 + y1, y2 = y2, y1 + y = y1 + dy_sign = 1 if (y1 < y2) else -1 + + # 2. step along x coordinate + for x in range(x1, x2 + 1): + set_at(surf, x, y, color) + error += slope + if error >= 0.5: + y += dy_sign + error -= 1 + else: + # Case of a rather vertical line + + # 1. check in which octants we are & set init values + if y1 > y2: + x1, x2 = x2, x1 + y1, y2 = y2, y1 + x = x1 + slope = 1 / slope + dx_sign = 1 if (x1 < x2) else -1 + + # 2. step along y coordinate + for y in range(y1, y2 + 1): + set_at(surf, x, y, color) + error += slope + if error >= 0.5: + x += dx_sign + error -= 1 + + +def _draw_aaline(surf, color, from_x, from_y, to_x, to_y, blend): + '''draw an anti-aliased line. + + The algorithm yields identical results with _draw_line for horizontal, + vertical or diagonal lines, and results changes smoothly when changing + any of the endpoint coordinates. + + Note that this yields strange results for very short lines, eg + a line from (0, 0) to (0, 1) will draw 2 pixels, and a line from + (0, 0) to (0, 1.1) will blend 10 % on the pixel (0, 2). + ''' + # The different requirements that we have on an antialiasing algorithm + # implies to make some compromises: + # 1. We want smooth evolution wrt to the 4 endpoint coordinates + # (this means also that we want a smooth evolution when the angle + # passes +/- 45° + # 2. We want the same behavior when swapping the endpoints + # 3. We want understandable results for the endpoint values + # (eg we want to avoid half-integer values to draw a simple plain + # horizontal or vertical line between two integer l endpoints) + # + # This implies to somehow make the line artificially 1 pixel longer + # and to draw a full pixel when we have the endpoints are identical. + dx = to_x - from_x + dy = to_y - from_y + + if dx == 0 and dy == 0: + # For smoothness reasons, we could also do some blending here, + # but it seems overshoot... + set_at(surf, int(from_x), int(from_y), color) + return + + if abs(dx) >= abs(dy): + if from_x > to_x: + from_x, to_x = to_x, from_x + from_y, to_y = to_y, from_y + dx = -dx + dy = -dy + + slope = dy / dx + def draw_two_pixel(x, float_y, factor): + y = floor(float_y) + draw_pixel(surf, x, y, color, factor * inv_frac(float_y), blend) + draw_pixel(surf, x, y + 1, color, factor * frac(float_y), blend) + + # A and G are respectively left and right to the "from" point, but + # with integer-x-coordinate, (and only if from_x is not integer). + # Hence they appear in following order on the line in general case: + # A from-pt G . . . to-pt S + # |------*-------|--- . . . ---|-----*------|- + G_x = ceil(from_x) + G_y = from_y + (G_x - from_x) * slope + + # 1. Draw start of the segment if we have a non-integer-part + if from_x < G_x: + # this corresponds to the point "A" + draw_two_pixel(floor(from_x), G_y - slope, inv_frac(from_x)) + + # 2. Draw end of the segment: we add one pixel for homogenity reasons + rest = frac(to_x) + S_x = ceil(to_x) + if rest > 0: + # Again we draw only if we have a non-integer-part + S_y = from_y + slope * (dx + 1 - rest) + draw_two_pixel(S_x, S_y, rest) + else: + S_x += 1 + + # 3. loop for other points + for x in range(G_x, S_x): + y = G_y + slope * (x - G_x) + draw_two_pixel(x, y, 1) + + else: + if from_y > to_y: + from_x, to_x = to_x, from_x + from_y, to_y = to_y, from_y + dx = -dx + dy = -dy + + slope = dx / dy + + def draw_two_pixel(float_x, y, factor): + x = floor(float_x) + draw_pixel(surf, x, y, color, factor * inv_frac(float_x), blend) + draw_pixel(surf, x + 1, y, color, factor * frac(float_x), blend) + + G_y = ceil(from_y) + G_x = from_x + (G_y - from_y) * slope + + # 1. Draw start of the segment + if from_y < G_y: + draw_two_pixel(G_x - slope, floor(from_y), inv_frac(from_y)) + + # 2. Draw end of the segment + rest = frac(to_y) + S_y = ceil(to_y) + if rest > 0: + S_x = from_x + slope * (dy + 1 - rest) + draw_two_pixel(S_x, S_y, rest) + else: + S_y += 1 + + # 3. loop for other points + for y in range(G_y, S_y): + x = G_x + slope * (y - G_y) + draw_two_pixel(x, y, 1) + + +# C L I P A N D D R A W L I N E F U N C T I O N S # + +def _clip_and_draw_line(surf, rect, color, pts): + '''clip the line into the rectangle and draw if needed. + + Returns true if anything has been drawn, else false.''' + # "pts" is a list with the four coordinates of the two endpoints + # of the line to be drawn : pts = x1, y1, x2, y2. + # The data format is like that to stay closer to the C-algorithm. + if not clip_line(pts, rect.x, rect.y, rect.x + rect.w - 1, + rect.y + rect.h - 1): + # The line segment defined by "pts" is not crossing the rectangle + return 0 + if pts[1] == pts[3]: # eg y1 == y2 + _drawhorzline(surf, color, pts[0], pts[1], pts[2]) + elif pts[0] == pts[2]: # eg x1 == x2 + _drawvertline(surf, color, pts[0], pts[1], pts[3]) + else: + _draw_line(surf, color, pts[0], pts[1], pts[2], pts[3]) + return 1 + +def _clip_and_draw_line_width(surf, rect, color, line, width): + yinc = xinc = 0 + if abs(line[0] - line[2]) > abs(line[1] - line[3]): + yinc = 1 + else: + xinc = 1 + newpts = line[:] + if _clip_and_draw_line(surf, rect, color, newpts): + anydrawn = 1 + frame = newpts[:] + else: + anydrawn = 0 + frame = [10000, 10000, -10000, -10000] + + for loop in range(1, width // 2 + 1): + newpts[0] = line[0] + xinc * loop + newpts[1] = line[1] + yinc * loop + newpts[2] = line[2] + xinc * loop + newpts[3] = line[3] + yinc * loop + if _clip_and_draw_line(surf, rect, color, newpts): + anydrawn = 1 + frame[0] = min(newpts[0], frame[0]) + frame[1] = min(newpts[1], frame[1]) + frame[2] = max(newpts[2], frame[2]) + frame[3] = max(newpts[3], frame[3]) + + if loop * 2 < width: + newpts[0] = line[0] - xinc * loop + newpts[1] = line[1] - yinc * loop + newpts[2] = line[2] - xinc * loop + newpts[3] = line[3] - yinc * loop + if _clip_and_draw_line(surf, rect, color, newpts): + anydrawn = 1 + frame[0] = min(newpts[0], frame[0]) + frame[1] = min(newpts[1], frame[1]) + frame[2] = max(newpts[2], frame[2]) + frame[3] = max(newpts[3], frame[3]) + + return anydrawn + + +def _clip_and_draw_aaline(surf, rect, color, line, blend): + '''draw anti-aliased line between two endpoints.''' + if not clip_line(line, rect.x - 1, rect.y -1, rect.x + rect.w, + rect.y + rect.h, use_float=True): + return # TODO Rect(rect.x, rect.y, 0, 0) + _draw_aaline(surf, color, line[0], line[1], line[2], line[3], blend) + return # TODO Rect(-- affected area --) + + +# D R A W L I N E F U N C T I O N S # + +def draw_aaline(surf, color, from_point, to_point, blend=True): + '''draw anti-aliased line between two endpoints.''' + line = [from_point[0], from_point[1], to_point[0], to_point[1]] + return _clip_and_draw_aaline(surf, surf.get_clip(), color, line, blend) + + +def draw_line(surf, color, from_point, to_point, width=1): + '''draw anti-aliased line between two endpoints.''' + line = [from_point[0], from_point[1], to_point[0], to_point[1]] + return _clip_and_draw_line_width(surf, surf.get_clip(), color, line, width) + + +# M U L T I L I N E F U N C T I O N S # + +def _multi_lines(surf, color, closed, points, width=1, blend=False, aaline=False): + '''draw several lines, either anti-aliased or not.''' + # The code for anti-aliased or not is almost identical, so it's factorized + length = len(points) + if length <= 2: + raise TypeError + line = [0] * 4 # store x1, y1 & x2, y2 of the lines to be drawn + + xlist = [pt[0] for pt in points] + ylist = [pt[1] for pt in points] + left = right = line[0] = xlist[0] + top = bottom = line[1] = ylist[0] + + for x, y in points[1:]: + left = min(left, x) + right = max(right, x) + top = min(top, y) + bottom = max(right, x) + + rect = surf.get_clip() + for loop in range(1, length): + + line[0] = xlist[loop - 1] + line[1] = ylist[loop - 1] + line[2] = xlist[loop] + line[3] = ylist[loop] + if aaline: + _clip_and_draw_aaline(surf, rect, color, line, blend) + else: + _clip_and_draw_line_width(surf, rect, color, line, width) + + if closed: + line[0] = xlist[length - 1] + line[1] = ylist[length - 1] + line[2] = xlist[0] + line[3] = ylist[0] + if aaline: + _clip_and_draw_aaline(surf, rect, color, line, blend) + else: + _clip_and_draw_line_width(surf, rect, color, line, width) + + return # TODO Rect(...) + +def draw_lines(surf, color, closed, points, width=1): + '''draw several lines connected through the points.''' + return _multi_lines(surf, color, closed, points, width, aaline=False) + + +def draw_aalines(surf, color, closed, points, blend=True): + '''draw several anti-aliased lines connected through the points.''' + return _multi_lines(surf, color, closed, points, blend=blend, aaline=True) + + +def draw_polygon(surface, color, points, width): + if width: + draw_lines(surface, color, 1, points, width) + return # TODO Rect(...) + num_points = len(points) + point_x = [x for x, y in points] + point_y = [y for x, y in points] + + miny = min(point_y) + maxy = max(point_y) + + if miny == maxy: + minx = min(point_x) + maxx = max(point_x) + _clip_and_draw_horzline(surface, color, minx, miny, maxx) + return # TODO Rect(...) + + for y in range(miny, maxy + 1): + x_intersect = [] + for i in range(num_points): + i_prev = i - 1 if i else num_points - 1 + + y1 = point_y[i_prev] + y2 = point_y[i] + + if y1 < y2: + x1 = point_x[i_prev] + x2 = point_x[i] + elif y1 > y2: + y2 = point_y[i_prev] + y1 = point_y[i] + x2 = point_x[i_prev] + x1 = point_x[i] + else: # special case handled below + continue + + if ( ((y >= y1) and (y < y2)) or ((y == maxy) and (y <= y2))) : + x_sect = (y - y1) * (x2 - x1) // (y2 - y1) + x1 + x_intersect.append(x_sect) + + x_intersect.sort() + for i in range(0, len(x_intersect), 2): + _clip_and_draw_horzline(surface, color, x_intersect[i], y, + x_intersect[i + 1]) + + # special case : horizontal border lines + for i in range(num_points): + i_prev = i - 1 if i else num_points - 1 + y = point_y[i] + if miny < y == point_y[i_prev] < maxy: + _clip_and_draw_horzline(surface, color, point_x[i], y, point_x[i_prev]) + + return # TODO Rect(...) diff --git a/venv/Lib/site-packages/pygame/event.cp37-win32.pyd b/venv/Lib/site-packages/pygame/event.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..40558f17c6f3720da2add534f55a7a0c5418eb63 GIT binary patch literal 22528 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 WYvpg=m_cRG8VU^t*z^B~>%Ra;C_lph literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__init__.py b/venv/Lib/site-packages/pygame/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63fa666fc63e8b8a86822a2aea7e0dea9fcac4b7 GIT binary patch literal 174 zcmZ?b<>g`k0*knvaUl9Jh=2h`Aj1KOi&=m~3PUi1CZpdI z6P}+{lA0akSWw`SSdtjylb@WJ6BCk}TM$!FnVgYWl&f2in4F!Mo|%^p6iH9aO@&dZ n6^Xe8IjO}l@$s2?nI-Y@dIgoYIBatBQ%ZAE?LZcO24V&P@*^)W literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/aacircle.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/aacircle.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..303d809b30c86705f515e57225fa38741443f4a0 GIT binary patch literal 991 zcmYjQO>fgM7`7efW8DX1j4>t-y>^0~5kiR4O#(KJvTiCwWs!;9&TE>cNy^%(J&h|8 zKcTt7PvFW4A%20coGNkTv+PGWi;3;-rEK)@i;Rx7+nRynZ|MMU>_n^&XGe zNnZ3=D+*xG7S65xr|IRFX$Rh%f07t>e^^ALql_59$yD*33~oiMpNqsSU*5t2IOXwB;P?_;j?bK`GU(A7DGJB3wcMg0bA2}NZnQ)P3RL;>q7ClRUFYI6YUG6-C|(v9oP z7s_b>kjPWvI+eXrai{#W=u&-`iUu+i%8Xgq5UxGFVb@{Im$4rRm%a^T>e6~3BV~$r zB1{!MVUU!j{RrTf2ha9hdwc8k=8NjCGMb|AI@{h>rBp0$DZ3j=e^O4TE7OAIT8SSE z5h|Q0^F;FW2r_vwR@v1MvucUzF&-nGy#(#94FjUzW`Q82|tP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/aliens.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/aliens.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8f5f43f9e633a7546ee86d565f4e04d5aa8e6ed GIT binary patch literal 8683 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 W&P;8wHdm|GDoE4CKh|C=YX1jmFjuGm literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/arraydemo.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/arraydemo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b3d10c825b779fc332e3148c2b81b2c290ed983 GIT binary patch literal 2770 zcmZt|U60$wahD$wMM-zMJKdM#xQq+OQQ;hdIB0{wb(#-91ZiX!zKdHzh|1G0b<|NL zy}LSF0#yXL+(Z9BpLLJ@3H>Vs3KZy*{z6~UnWfHWr=`Hz+4nZ#G>5&&S{W z6jI>QmSoF&!JeL6K(0<{{x^WG!qBE4+G1FF|Ub z_zts}{Uh;fti~#=`XlvSUT4m!A$r_BC!kNCl8(ECQ%JW%i<+E>Fc2b`!iN58U?2k? z3tsf;3wY(<04Oq|3nM2ZlTl_|82jJ{vo6iKp}>zEIG5m^ma1IBIU1|x;1?w?4`Jsl zYL{eg=H|#%b@1ogC*=7;`m0sZKUZjcaP&p^>xO4D~zMeucO=`$W)Xjh0V`+q6!Ng zC@eM2xWE3*acL1PNm}GM=vAQvHY4ou^)|xg_VGtenk!h=Se~N--*})&;IkrFFxrVLA0{>EFCF+ z+WRcaz6?~*`+YhH;@%-2XT5AXI0?k~{VW)q2E!;B0tKVKTKLOgoW)%B^l^-j(}QeU zG%>HZ>C2P!MI8>4djN=WgEpuOuK~~{7H!wtfQfD34KTy_;HC<%t|ZSSB!`Ean`3KkK_%IXvZAW2qI4B4+)J$oyeg}nLxsWW;F{A# zoz-&V(wN(-k=x8YhpN=nx~5iGBd@?WVqF*y2y0&9NMUOiW(ZW!tFU#{Q_a!ZVqLXZ zi)}!qSCu{5SZwC-wap#yWGi<7tATutZR&GsrDbhx3$5*wxeI)kwXgYX`vRhcAFNuU z4ia^?Q%a25^9K5xH<$_E*mj!$w)+a(-Y21{BWdQfym@8k_4UFC%?Cttcgs`$4_9km z7*`zhqqGLJmDVa3O}3{!ql@jl2Jx;jGhai!QoEEd&xAPE*#4C?yP^GDhiE`kJ`NBdghHT&h6aEgxfP5ZC$UitHy zji1?n>n54EAkr4Qc@?S7%Z9$S+NcdV+GKC%n`Mq5hRu9qkFZ;9GT+KK@~y>AZe7w{ zGH-*GHv0uyfg0b%uE{Lu&fe^w_?>xYfr!$HEV~-EXpe^>A1LX%9z0)#p8iU)$#{|U zGLfD|j5AN2@C5rFAb~1nyz+zR2i~_q95Jnb7Q_<{T~l!HZZa8j5e@Eo&@pk7P46Cf zkHL_55rHAb!(b9C?4#Yu_{sF1HUP3=5XaszG!rjPkcCFPC@iJWsU%filt=|~oE?;o zcZ|Z;XLM&bKhtsP5KvT3vMd#fvroJ`LO1Dd$As>fsQVul_5{|C3k#Q-b0ndCd3WUO zy(fZ8iBWrFNEi2xCrW`k;B3Iof@A>M!R~r6yLT;lTi*7d`=Su`T&+Er2m#G|CEYQW z-$UCHHvkk4_|!551wdg%2~09O z6Oi9a@(`0oRD z<1}D?Rol7GL=9=S-uab4VnGzv^9jtp?bYnlB-;JClW(D?w*dGxeam_{x{#ICe*xj4 zz-re5pen6DDG%0W)!jx>ifiN7q7p59k&8F1-c6_h9eR8!O2VX!&zA6?GeQ4RG;W zJkRO(b>{jV+U+#NeW2-^SzSgszYk)Z@lt$*8aDhNf;+1Q$5Q7XEQC?a`+f0iRK|h) o$~2}67}qgsOb6;bfImNzm_Niamn{Ge1lgdDv1d4YZqK3r1r^-KRsaA1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/audiocapture.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/audiocapture.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8287ea69f5b58b1740248dde189a5ea6580fc84e GIT binary patch literal 1455 zcmY*Y&2Aev5GGezX|URjs5g;Mzd#AONFASTD!Y+WQxh zYkLLvQstUM-#|VV=nM2!_S%!ry``59xlWsM!QpZ^GyG=0;WwR*OK^Pk`j6Lt*9rMk zZ$1ot@-qQ$kc>2e%f=*~8;$C_T9H<17MCz?(c2 zAib=Z_%V1po}X~r>&Z?#8{ike=m(&|4d>D6yUv~mCb)!y#tg#;l-FViyx z=c7TE4SnU0_S3+RM#m6mqpS#~zKFlf{NUW5gvkUox)2|hyE@5{sY2jqDi_etiudl5 zD3mHlvA{=CajO}*XEmNcQ83#8VooMt944VE>qgo_XIk32 zbh5NFfmsOMbgW_UNYT|Hbe&7vFvRT4&n3FZ2q0s&NwKV-rD4Ks7%Q6rR~XuN}upLn%!PWeaVITPO4f=#Q$3{DG?c5J;lXmFcqaOx$(W>+S5M zY9d>z6vR2Fo;cXt$_a7f(sNH7IIa*v;$(>v>ZuoaZ|w9>-PL~c=9~B4?7VsNW_oZi zN8q`9>(^T+@`U`2orA{&;ZyjMZvhx#G$d}Xr7nfO7HX@6>CE_!xH=~_qirg*c&0-; zpfO5ZTQON~Gqa<)IcBj8Xb1X@m{oRBroG z#6#znu)vy?e|-pEwuzK_43-kC;<$FrL6_%~%AHd`N@=%Tw_5 z=FHXdTEazAUT@SS-zrbV@vJZX@3)Bt=c_CLceFp6(gZ$a!^ zAhk56w{%I`v;&(cNlj}*GJuZR(OX8-XdBGxsJ*J0ZA)fqb~`I`EYs0Cv^~%vEfZ{B zKVpG(zG*VMqfw${i)B$(vkdmLC}D$J28^C$6#Lf*%eUx0jV$HosIp`*Qh3F(@XYd-vMls0qu-R>sIvP3?1o;k z8+vB zvF`z^iJW}D&yFkhq&y{0%MawZEXp(TtSoJ2w=5OO2^gQ;qbgjZfZxM4<{XR@Od`ed9+UM{Im}F(Y}D$ zq3XcMlAw^lpLMa46}8|#BysQ;P+bQJz005xSO695=EC64cEBb#>Tyx)Djp92$d6G6 z<=_dL9|vi*`yXHzC+K2{Dr#yn1-oN2SYWO?r;?Jh9NdE%Gk&ggu82hOVrun{YH9>g zAkz#Bk~s8tQXA@yhh-r(@VKUCP=~Xc8ezj{sn$qRBlhL()TlLrD7EpddMprWrqYP+ zav@z~BMbmH!yr!eExzOC(4pWl_hs*ZoBS@6u2ipbnHq8@=C1MO+Kp8=Ge388_KWo; z*Pi$0R%WJ_=Ujc>69`p=4FuoKPA|+Y&3aJtu%8_Cq4r_F?&f;qSOZ;a-dkQ+TRG5y zLI|^XP!?a{ZY-hQd4vlH7ZE-}_!!|6gi8pQ5w4^<6v{NS9R(E#lF%XOsVTRi%DEP- z$n#-Quz#|cO-)tcAvCJ$GB>NLAg(wyu&TRO0=EH=#1U}f=G3T)wrf@)x>bQY{JbIy zOrX@L`$04eQt~|jp*d>ctJ!pz=Cm<7M)NeU8M+4O&q(G_<9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/blit_blends.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/blit_blends.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a48ed8173b8617d08ab309f7ef245f3aa2523cbe GIT binary patch literal 3344 zcmbtX&r=)M9e?{vS_vcs2n@t^Hcnzk4$uNgoVdg>20G)hO_KqJWQRnv=q>WXN?Pwe zGN4%{nY!l=hfb%{)9ToJFYPJE{0)2PbkY+&=Fmef?dSU>VQAb#Q+D=!f4=Xp_kCY2 z_X~wQ!{57~{rR)<6~_Kf#NaOjZ@Dqq%0+xpQGj zRv105!L?_K!aiY5_2b^ojGb}WK{hevnsf7Ar3+ir%pQ`QVRwk@UDYmdgJ*ut>>|%{ z6L7>W@!X*r{?;9NMwW}Ta%GcM@@I&SZB&$0xz&EH*|MUeaNh|-=fv7?h1N;y=oQQI znvrmP-)bH;f|FF|j&N$Ujs7O_QV~}1MyCd2f+b29<^?-Y6RnTwiNO(ShoqU9CD|?m zrNl~Na0hocOteA|m;tF<60Zs$X0KNox74Rp3*8pE$rl?GA z#wO|V93XUg9uT^G2oSn_7!bP1-HH`n=&G_pdh$xYLf4a5;WsB<<3&{Eb!aGcWs*?? z@R3gbR6o8I=TD9BS8*=6!An$)Q|2p?K(^B5ob3r%L!6KHAAk z`b|kEVwR5m0_SVsb7Edfzb5Td<>~PS`FA9b_2j2rc9?<1?_!-e(--P=X@?r_${pGM z4$$IyavgaMBPT01c!9Gx+q2QtQGuSc@S?228;c9^@Dy5%s_-A4z9lQ-XLSXUso}TB z`?2)8#y+(>#evu38)AWvKU2V+>5N>8p*YPbf>ZVB?{?1Ph|L)MP6@utajEBhU+w!> zpMJG-ISMVjC!<)DQGgowm7X&FQ~t3zYT=)x^(CAS@PTcd_*==_G2N!oK90`sjK!nz z*lpGs{bKZsu^(Mmy?27*9hniROI~kZ@OnG$drjUI?;YGh1mp4OIbM#(<1(Td7w;uM zkH`5$R|QUyFULwePTl{1#`%q`&HLi6_@J(#2lVh8+`|bz8Bd7!ao?^0-UXZj`~Y|L zLe)^I3EDl)di8oy_ci|jjf$X~qlf>LzV7w#7i#xu3Bmq~(KVxyl~Z}M`65kI|AQN6EJ#=O5Nj8(KVj!_)~?JX5e;%AEk z#@Uy^+PT^juMy1eHG+2D@jbV>G++1j+j-x6dgO89r@8x&);HFwD{E^5baVTDn(uKR zZ$H`^uph5{e2zXqG|!#4ORc7B1>UjiTV8bM_2|yl*)rV!qFoeT!?i@q;w@r(vk16- zV_(^qp-vkq3|wXt#E^L;xoZ#g_wTT!Y9j(C#l z2Q9Cen)K^fZIywVI#1p|A^mq-QeBB39CHLbH!WVXlugLi%a7&4<{R_!n~g3xOUJ41;$&=4Lm-Ot^o zNHs8_eG<5~{?Yb>Etp&XWbKzb8>w*=QC`}idm>$KuC9Ezp6VbY3Q(j*=rrpt;VlYc z^TUTh@Ghd1NHbNAZ4(X2Np9=#641IBkc))?5d$ttSZnzWC-@@^ zXJO@gd-cxlcI1Z9?oR7KxQDwdL9m8C*nQNhIsWdJ+X!}pliCv}Y|I5t?a-;i0XWp1 z1K=Jzjlg%KU0I7g-)-_}o<6r4j@K;1OY~PPOfi+bGOQNWyk1oDny%zk9lRO&n2MSt)BXY7taXnNdy6RIX_=poaUh zDT8pLR6J5&g&dsTLs(ILF1vOf2l&`A37?ahDcD6Oh=nXnBEFIu&LhL~PfJP{W2^UR zc@>DjH!FP#0IGc`zmVma(>K~TgV2p4iyGEin0uS12WpO%wPc47O~svW-&nEcEX=K0 zYje)R(3-U#&sj9FX2HkZnzi1vFtpllY=Oqb!f9E;jfDIrjsmylIX+C`h%6c%(R@V- zUq*nk8!jw!#CsLXU+_ls9|4`8sYqUGR;zTj)oNuloQ5bYVX+InwwOn&I(}rA`sDd7 z3vZID^mdJ~87!%RVMbHU*^A^Xf@zE{w_3GL=>qd8e2KKFjIzq-AvDp0)#`zC}NX_(;r8!>5FwEzGB literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/camera.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/camera.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6ee0bf7461000140cbf3af102193ab5df504aaf GIT binary patch literal 2087 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/cursors.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/cursors.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..267382f4caa2fed83b9f0be9bcac4984fef6ffb3 GIT binary patch literal 2630 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 YYakVb&z9l9Qv3|ZcCI@$=bpp=4e6COLjV8( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/fastevents.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/fastevents.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a8214bd16d5ac3158676ec5ec18cbd8e1b823ca GIT binary patch literal 2256 zcmaJ?OLN>r5T21nTCKcx921<72N4G_k#cwq&!+_c*B zL!Xkb39oSPCE=d%_w8`PSgM7SyvqHTB%Bf__(a!|shHX)lyGZ_)NAo|N=Oj2HWC%U ze;g<+g;IeQN(bw?4D^Nw)?=l`k0R45=;eGn6%F5?y9dJHP|9CWwpqajsW;x8_nW_ZyVM; zEOi!$CL=l^2b7Wy8IZ^_)aC>X(1kja*jA+%MM;+EC@LAxGf^_7^8x~7N~G(rh{Ue^ z=lT52)nz55T3yLEwdk(iE{eOcj#nS$?KoX+iC(c<^xGS;?0r(i?QYyjvJObFc5hx{ zH|`awP^$(S((6rRGzkQP#{sG@hiAAs(e$^s&=RN2Nj(rHgZv zaj0Vzz0lp#5+d}p>_@0>3O6QjosiO&+u2oM)cZgPpzP8qK$|g_TJZK@@6##E1#WNh zE&lM;LfyeG$)J|dC4O`m74Wqv+S-oO@rkLVJPpQ=xyJ61=wCWOK8B^RfFAW6BWc6N zJctykn6lmkFg3voNK-kZtr0mu-X5_7G9=m=xt!|CfdwUYMjkiC)YW}5w6s66LB}3g zqY3d|;I=VKRgmY(iZQwwYghO}WZcgbFaOM4?rw3$o@__6^YYeQ- znbA9(nKC;=X0%R$762Gmp6>IY}_?@#F`ET85T zeP%2y~NRdwY{Q*Ko&TSKa(j?M<7eQ=cl)&NB{@*B?Pe>K99fH$-`2TZss5 zMPt3PdStj{Xd`sy)4bg+D?Cv}8uv?2360$%!s^rJ(*5xEokz`Z0)_3k&`F+|9*{HO z1-e?tQp;)N?T*l3vR{aheY<=g=A@7b3`hm!(R!iGT**_Q8de@QpWl75vQXMx(GR_c zQFCej_F{89ev@ddwv*_M=rE*^t*1#*R#lqsL^^4ALx>zghS|cqs$^T+iLQGkZI?Fu zJcKSzf{>-9uZB)1hg&W5$D^4hFp^Zj$+ctsZbpsu;v{RYY_ zy^nhjWj@SY4gMIs#~hr(9_cha1#+B6MyG6f1#^KhMB7nRpDrs=#PfC($vT|K3rH>@ z!J0|TT;ik~K;;y0WmTJ>9LT}k{A27dq7D|oIFM(MGei59n4G*X#&^+|HPA432*XSq U#+c14pqQmov!*XVrq@0CALU0nqW}N^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/fonty.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/fonty.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65edd075bf67543eb1eee554d35421d76138ee2a GIT binary patch literal 2000 zcmZuyOK;mo5ayE0hiJ)moWyycDHbh)R7GO+SOh`QJdyO_q=<~5gb;ScT}ib0>h8LU z4C>_mfE;_2j{OP!2mK9u4NySnrRSVFODRs^gaBuUv)?>+W@mV((+MqjzJC7K^M6~G z_1b*AeQaR9g;(waVOC@@#Ow@32v#Svd*&NwPL3m-yOE2Q`(ETVI6v~aw;wR~z!eXf z$Nb-|s8s|kSaPhzLXd=fjjbKnV#vc|3oO`At#141^+PT=dBI6mQbs7*>Gd9vVOc0L zOf!C+(1H<`$||E1k}8rGAteJU(}Yx$5zRq0Em-+thdfe*@w_ag5>##;Invrry z)R>14jLCAa&l5$cQX(B30&0ismTH_9Bf?)MsWMDjkTHaGod6&Nk2yU6Ym|%xrwU*+ zuQCo1id7g(|JMn)D^wG2*o2?cf{u6&!kq;q)!OYMjlS&K+CMDPWGrGG7^Y-A?xKYQ zhy)oNJf<2hym#T11ca!P2$9r?|7nSJaQ&ut_hx@j zav}TA%6-KT`nRj<9#ypegR$N3@x1C+lVnUqexrgA=m>0s#1!Z4vdWt5o6Jmhs)_D2 zzT;H}w#-2>5DNuJY{L5STzmpMAIrsic@Q38x>)$Ih`y|KAziW%O;X8(yvn|Pn z;f&91cu%58;G=nriZRv{;}0m&G62&8Q{eY)D2O#jQ)rl}&77&j@D$f*hHE^B@&Lk} zdCX$&+@8A3n|if7^J@<@eBgo_+NHK@XO5=>|_*1?W%?67cU$!Ii|K(}*R_q`b2X`YV7 z=q+PeXB%K;!<=`!xvpxHZ5|_bX4{&Ez;7L+I&2W(91U%duBkKinki_L+pRf_ikAfV zv$Jz^YyZ63Ru|O8p>yE9LP9;UUZG#rvt<*U-R;`xE2z-oZ>U$-S-gQ|@t-08ECr^i z#QC=b5MLPH)O`^d@&riano%(krWw2T!dx72$!r=y!!-(#dt0P5Tih~Rp8`3$(u|m# z!)!@pGa#-tmag3-M7aAi0WjXitq{ zE@nU>$Os!#8q4$u+E?&`aS`D`ma3>@@P|f_r3H`trxR(gQDbLNW-JN~B2_d?lcq%? ze-*kgjo36qgojyLX}1||8o!_r5mu9mNBF0`N4?1Z{{GMR9zWZSHhz4(_w@dqyf5IMViD6a_FdlQJuX_zYZuN&Zra&w-5`I7AfESWaYY zPN?l|6iCUycCix4Ra N;5;D?aPVDV{SP*%0D1rb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/freetype_misc.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/freetype_misc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db2d51a826d4e01b3c10831aa6d2d98f7f8b49bd GIT binary patch literal 2578 zcmai0O>Emn7M|gs{%yr^9J@_ZI!%9+ZM@yIO@Fp+{3E3`s>-b`*A1bKz-UG`Wr}2m zqs9^xV1e{nAcvr*9weZbUiPrJUV7dI_PzkI3lu0&K!+ZC$t8V{qP=b}OKLvOy!X8~ z^WK{wwO%M>30!a9{_gg_3xxcLgX1d$omFVz-vJn5)FsyRNi77<`w zS(ZJK=U9HMvclK8m1Q$*_6uU=c%Bsx74bKodjQ@U-65qj6IeH?m1sn-3@+4s^QPdu z-VeAL_JY6{(ro$Nz;QX7`~!#+hHwqx3BnD8{~%mM_z>Y2fRY|%_XY1aU1$G5Mwz(J zY;hRr(B)pF3eF6~S7S5@JNHU_B2B~z^krtyajWHe5`$VQj=~$8( zLLf{Tt01M4bh4uy!@e?9MtNCa+7cNS%^79@&JJm(I8-okpwBE3!0ZxXIhpF5 zfi|~JSpLft*c48&A%#;OU=i8u%$Ejm(Bs*};~YB++Ii3tb}rGQk7NA;I}du85%h~} zi9Ln0B(_hp3yEjcJ@XsgMfNP@VxF078SYDC4eXQo6YJ;L<(RR|o@X!omJzS;+|f0; z0Jbl(mma8P@|R2Z)x@&IuEdsq7*n=5RAF9->LI;r?Ip3rmM^obY~^>Be`K%3mVf%4 zptv@csIN^)H_d~C+tRBVXLQ@Ysbu! zO06fJ=KqhU4e(TsJx!UF|9Oh{=>^=|M<(>28C@Kc&a={#%kolNJv1IF;-`aSEOv06vu?K;(VqMBJyx__MyS`!;N}LnV8TMa{zH{&MMeYnlUGpu1^`gdm6aC0 zw58*Fu;vj6oJ$mK)?C-Lh2Qhovh&X;Po9AGF=#~^V34srX0BH&wX(ohhX4yA762e6 z85m4{j#<6{(ps&&Joy)lCl>&m15{s)sgtiz@C^ta(~_m%aqZUO1oPwE1DU}0JNU!w zIuAiGP=~j#ScWfbZ=Vl}n`WbT?fUiC&0WuF`HTbg3b342fXRQsc3?~ip!fm(VJ#+) zrcQ^*L>OFLSy}1x@MTjTIH3tY+cS5{Rd@%Bw%y{B#n?b-@Nni}DOM_!g3Hzc`IX%A%#24RphKiJydw6<#Xn2Ds=Rq1kM1pR%x%OlP492qHo z7-@km526%vgolcheJ6}1>1MMHABbi%O1I(NF5%;0X*YdOMq0;rJhTV{*X~E@kjrKl zvJ`1x;6_HvcYP6B^H5(dT*u>0n{|4j>~b(x1DjbH!BN+gzBRj3zg4X?cWdR!c6GB> zu?kbc)_QgGliiAy{yf=%k-mX`BPf!y5A*ABt#Gz3tk=rgVY4@_mX)8n*r{)C)!siI z)wZ@jTB}C-J%`ByOKZDM5b6ALT$6UshGb~d5I@=7tXruME4Rv9do^qJqpjVY%KC1- zzEwj(q}}Z~vSe7PHlzZQ20=r|GQt*q04*IhkjpK-C;5?#sQ8u${Fpv&Y`opr4Y>## zdwxgq!^T<=l;OlTsy>{qMxA$qM$m5^*rIzifW2x%i2ESHVjVyDk=+ek9yX5a(d;^5 zYbEHzXSe6!nGA;jgr=2wx}fCgjABrO7HJxqp%mkBk!It59>#ekOBb=J2AzW&SSL>d z>=$Sj5bd&b>MaYtX6QU3$WHYYg)YLpVh!exVC!^k$7?oAg-8wip?C?T;spS!Fb!$N z#jrzbHW?mAB=Gb`xy>&AN2v$__0|L7V2${ZBgJdz2>+*?OoW@Z*^HBX3Rclg`W@Jn gJ(s@+XOV>XPX<$whNVJCxOg=WVc|WergzfxSI(7-KmY&$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/glcube.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/glcube.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7333163c5b49426e9c533de9317e27e3b0c7e78d GIT binary patch literal 3029 zcmaJ@&5zs06(4>`qPUX0No?0{gOq54q$(PrK!6|!irSXM-E1sNo0XJ}iA@NuX2hkJ zBDuqnS6WDb(aoX9T$_{KLxKDWIi-IG(L;cq_LfU7J@viO*CsJSf-{fr&3p6ay?MWx zdbw;8c;5f~o6lQiLjH?CtH%K1K78pH&`{zKs!%ml90htURC{E4Q&L(FC0eNW$RUX= zov_@g$v;#GzAR7mO9lGE-;~EBQa>d$=NL5a6luXRso`wVA~nAtPKj>O67*$SrWNQb z>;}DYs`6*7atU^*+9lO(@1a6SlY8fuXAQ>3%!(sRoG>dLaK@sV#hx-gwT9dqG3y+p z{5TLM4j2H3dzQ!JaYU`-Dd?voFAObj1RP;`zzv{F66Wz#s>H`n*g#l8YNbgKMM31( ztSA=D3f_JSGcqwwtTcv+(qNQ?%%q+Gqk@kIV$4};oiNTU5nG%k@XK%#Ycvi;Fo?sL zGb$JGCllNR2P4amp$GT;6ZDOZf_KJIoQPl)T)@~cjuSLSVeN|r;p&q(h(roO0Lk?* z#0iW1(4sN8fr|v0dE#+uoyYvt8phljr#0(?&&(^xENNGjO!?!*n>~orZmZF++ZLO6 zxF+!ZY#iWX_NN`Nx!bB5Rn12wLcY7VBEDS{FA;7=ZG>xuUlguKeY?@zD6HnZ_Y&cH z)HUJ8+DkOo!fTqa(ks|)gs+>b#x-Qf2D!kH!k;mIrm`OPBO9ol^HqH_ z&y@;FS5i~wIdn%yMgf~VG%yxvj`S7EuTT!$B66{&ulcVpXvswdX=^oBdLd^(gVj=1 z-FUI0QM{sY0-$lah2KkhIY#oOhw8$^C0}~G)LnZHcGj-0=;fHTvjdn&K4=uJH{eVE z35_5^5vtHG)k|eggf4OjL6i4HzDYi-&6UX?W(rW&T%D1bdY2rjb8W7R!c0PyFlHK# zKYQztoV|WXL=gc>_ zS(Ys#nGbHm^ZmVcwVdf;kcv#Z2$F0I>(Sls?6rH{Kt^Pf*;nIA4HC^+j2kd zKWKKd8*(tx?kDy^uj`n8*g&*-clgxV^21LU7i@w*IX|=`>J-;U4Bd^`*M#4M1^lny_~59YGM*kC#!m!0J$jHN zO@PLuRy^>+qaGV2N6B;ma5Q=+@dl?JEWrnk4+y>Lmhh7v`60%pmP|7PqlG{3!zAe& z7%R1+8j1;TNimddC9h(?_}^CfZ5XlMAvhejo7^FFAaI9Z2IVfnUY9w}L55YT!I7l{ zFHdvu=4HkUv_K6ws){I~1P&v!y~x?Ko%?=YK0n;^zxoG0->hKd@%?3930V@xzpw7X z{MTyGa12a_cN{XO45@6|`@Ij{p55&^B|m)R2_8%y#dIOuKj?g9H+p-Wwo~!LR_xI| z3P(#IruaYJhqxzjY6VXjD)+b-rJ*O-FoR4V!~#i~rfbbDa3?DVQ6OADbW<@N4j%z4 zEkQ$6Lo<}TQh^wA^m`pqtT(JX8PN(rg&@zB7kE%(#gQlKbB(H4d3A_moxD&Xo&|Z3 zD^P#`nJHf?+<c8_Ql=n{PQ59@i`p+Bgp<{!(8EwtzEsF6p8$K!Y?1J*X78 znz*RqXyP$Pu$u zU6!V!4?}=A9WFR5)6cy?RCUK3j>B+qmji@?%Z;DqrGF{^Eh-|wEE>6K^^q4up8_xa zGc-gqR9(5P=AkuI#DO;e6A&HXU%3NV@ha?OQ!i;16?%og4LX_Ox@g69tJ_(@b!j|s zUH%)8IORonYa!xR>J%3jpc=%}T$BB5Yj2dqT-cn)oc|szn%!wC*vOs)f@2MFxK|Ti z!R7`w2uw2eYX>5LKA3g0I!VbT8h?RIjzjiWOnUk|XmnVJp{lT?5|kwXUP(9f9K3ns Kma%124f21Ze7~Il literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/headless_no_windows_needed.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/headless_no_windows_needed.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..595324355866293e130612b68154445b95ee3af6 GIT binary patch literal 1404 zcmZuw&2Aev5GJ`lTCb&8R?-x`6g*adSO{6rBBiCh%UzI^ z6&cFO?R(h0wTIsOD!lgOSIDWum96^F1voRDC1<`Fe)D6mmm>JS{qXmPy$GRy{O0b1 zJ^CJ&`3nR`8R9s@obaF|8EJKp1w0hwH004fYCTaFx4M(XB0f#7Hm(syt(Efl8fTll z!;@c8*5w;K1>F-5_~seWfAX#fPPfit{kzw^$AjO%BB{Z`V&b5)un3X<=G?XbSKC-GQ zAx=LE+S{FFw8Ym09vZ1qB?K3I zw^_JOn_pTAc}+X6xJ$bD5gA~;4Zd}^eL?GP4`5@_5-qXssUH!JeZMaD@3o7r$T5+? z9|g!bh59Ko)OX-^Uc{Ulc_HXG^POUNG+gBzhT0?1n_hIi=y~B=vl4x2 z0uk*&xg^iMKhH1X72j_B-{F_8ljpo1=Xn;x5CCZ%sf`O@MqNj!bE#{U^>4@MzgP4H zXAf@OT$-k2(6T!tluBBc7-93O<|2#DSPP-rzOB*t%JbZXOi$1MuPhf-tZ{)<)~sitqpc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/liquid.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/liquid.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2101fa4d64052daa94f44a126e928bbd0819445 GIT binary patch literal 1812 zcmZuxPj4GV6rb5$+v~O6hLDmLS~TKPf*`7LLKULaO;e(lM37h(E4S8oXVzY4cV{y* zZtbv^klK&HiIaV)#07EXEAR!7_5|XT8)r_u*(9Z^nAN;_`{w}o=_=1Ha%(Sih$gDRMgsASKm@eeND@+IB26-8QrIMW0=yX$Ae;mu7BZok7fO+o zl2}m28F{d~L&}5*oF))i1Tx6xb(_*X2)s8E+Vs2<127y=1$H7W?FIP6HynMk&7-MZy5k#Z8Hq#Z~4q)k;606Ku2BIAjI{3T6QOtm?w z$?HEgNSMJPg_q5S5U+$$B$)xvC`zs-u?8%50ZW$N)MOw)E=eZjD{q=l;UZGzDKSYI zQF;=FAA>p7H{l{v!l{}Oo{GtEM1m2GW1bHA1tbsxP?Y5M<5MU-w6}o^{1FgaMQLCp zW;9`%;=Kn`?O}v8THqxVlSX4}VKb~9U1_7GHAlK?ic!~@#q6a$$DrXY8aWi@+ycJ2 zXyw+Me2x~EmWVk}q+{SO=hk9niIy0n)CK;nC7N5TGPm_AtFjt%pWAb%N#)#)!&0#V*stS`|vdb~QX<+btEyn0lXFBv*O$1l4mx0$z&=Jqts9nfKOH+S{5 z+|FIrSVQaRIc80>G8eS!({^3~t=n@i_ew4Af3zBq^}D&1ySW!yc|C71m${*{v@tsV zyNiy0>z*O?UWwWD#SPXlr#t?!3(XGg*xK8$qVJ(2qdx%L!hr^$Cte&KPa?KCNU~EG zfFHsvhXfr|s-LbI&e#mUTl@LJpC>=uIcHwnIlT;f8}Ap@v&t%*D2;ScJMVzPRb2NI zC_cabW%r=-&CcC>_x<|zey9EDe!H_%SV9#}M)jz0#v)1!H=$A5XOS!_WwRBIX+OVS zmNs;6;@4C_W4<-@8$)nCh_s4MxZf~wGT4BJ;%w*qr>F%YeafXSD$pH6?mJ(1b`Sm9 z!~5TE?|1k7%U|tx4j`4o!~H!YC@TCZPjz8~_rlS$j7u9%=sN@GIo~la35cVF7ZnwA zo^3S!s)8qpr+&T6*z~hsg}mSq@g15*kn(g8i{ME4wb?o2DJ`-xkSZ`Q@YHvv89;$& zzB2>nCnT>!)PFknZudHhOV#U&vF1m;yIHmkx7K?k0EONmJc_++2Hhr;Pcj-D(INCc zNKBJoEEg|t@BE^(S>YIzuRs8`1q4|xUbR3EXmtrCc{UE#smB54R~7 zI#6X1fXgt7IruSU^(u_P6l4aH*T@ay!Tk)XYZCL%O-!{4#IaVe3(33IRm=U*Mb)eS E0xfkEF#rGn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/mask.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/mask.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eecfa8b1f35a5a3f4d5dbdc4d78c6edb081405c GIT binary patch literal 5376 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 bQnX`ev;2}~&J}g~RbDRMp~Io$GqryK7XjK> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/midi.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/midi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eeb6d08b7f8784b3e95af3cbb8f209056606c9da GIT binary patch literal 19921 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 OxdpHaWP}&c&i@54IMTWR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/moveit.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/moveit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38e25c5bd2ecfdb92258db30da74bea8a353758b GIT binary patch literal 1991 zcmZ8h-EJH;6t+E{pG-DsXhZp{sv%UAiP9D23RMUd8YmTzf=CIBwjE~2-rd>E&P+Vs zCL2v8q*Q&5-5VqxffwK*e1*hS-vDvNu_q}3CqDN0ob~bf&UenID=R*N@!^x-p4@T~ z`cr?L4;wajVb%-;LlI(_ksL?ZtRy0^TDi50I3ClvZKT891zv!~8z}PbBSxA13^DtZ zL`%$J?lTnm%wtQiF7poa_lfw4FP|ce82Ju`%gF{t$lo1hbpZcz#Dl>!&x533!5}M= zJm5#kq{`t~loO->W;RSFJlLJeQe;WK+xuJ7-Zk_VZ*3ARB$lR=#(h16DDh*AXU zh^PBmG29CJQ`y?_q@D$`48R-f26rC&pO->T3viLow&3zMx@smzWwB*maL9v#b5`7x z!J*)_ga{8aIRcMW2K#d0pE)ZTue<&WNC?^qvBI0F-kuKvo4YXUYalp+Od*pc0(e`@ zViZ=$2q5h!|32XM(4de~FxNw`dftOsZ-8j52F0ksAaR4|WP#=u!wp#wIH3%|O=L$v z&QNG8yRIMxWdoQ)9(hA9V*wZ|I)MZzt19b|Dq8b=AT+gpH$U$B9q=%Wt!x@T|TLL)hrz)VsfiW(*0xz(8Gx)!TEB=k-De- zX0lt&lo!WYk;yo|3QlSV1i}vd9bfquh3>gcs^if^uP@=)gpUS|(Hy`S1N99A=45O! zvQNdk01W8QV6j?QvL7HPp)H`ckkEcjw8|Dbaz%4KkRcYHR_OR!v3zd)CTz}Ldl`4| z@udr|)xqrm>JVB1!N;-k<9JfCX|DI3I6jyrd8-kf^9wIHG46~f3$(9lPdZi)dsOI? zmndjb>3kVd1hA243{;Ss2xwuQU`faJ+-acf=kB7VgrW?R7J7=5wW3ubM~aTitWe%0 z$%>d|LOE^HS}M@IOqg=hvUtjc42h!pLY&iBde49rjyoSYF@RhvJ-GFQ8Ta(*}?C7 zZFE<(_TYFAdN$OjyAzV^XGmi92k`lLxyq9n7q`2^Y;f%7*}*hp-TtHsi78_vUTAK- zcn?IlE?$F0QC&UCWm&C%uDlv*8@R>|=+TlCNl_0+`9>idJ_b~9_|oL_YSNbLh&lFXq6Bxu}6G- z75iYbPDBXSy3P!D<8Vc}am>mzj>Q$w7=)sgmd@Q=_o>=2S2sirf}8YfQvz_s0NOeH tPPZY0iUH6#5SR3sM*e~@jQ2ij%lc#eRj+}dbPZnky0zNz9B;!z{{R-O?s)(J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/oldalien.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/oldalien.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5cc32657ac5849f8adb6df51f34d9bb387718ef GIT binary patch literal 6538 zcmbtY-E-SkcE>kCkfJEXmL0~EKm^Y|7aNWij{v>_yPdP=06{7e)RAUDKzfkgQP3MF%-;{jvfAc6=tX^ z!e&~Axk-7dw6zt5T+APpSo=oFRNl_CiNkc9)zPbDx~NVyRY8AYs(@d{_!h|p78n;| zx=Z#0U4smv{-mj7SGfTl4aV0trJBTKK{z!N?9I2+o9^3bL*pbD*)(domZZ5c2*got zbdxB~?S2r&K8tv66->)bsQ|e_pmH-aO&6+DhwRr%|fe@+oejGy31@1eO+L_`CP>F}BcGnk3D$t+gF z+hR5=<6UA7m|w}wjh0CG*xiU>yD;IG>!*BAOAJyKr?&kTCv zqn)Tz1wDGSCdQF($qi~@A4VGX+H&zlHo#({I1;}9H#nJ+W-6+sj%yOf z_4CCR37LNMrbnVey9)yx-+sn<&1gskJe*V}L7}3}VKY1O^9_|>$I%y2u?iRxG?A-l z<7$CMu`uU{jy3wW+)0qY3Gkr{u5`7jb_z?H7@0Oz5wN6x7`u!Ij|&Gi!!C+vai#Eb zI}I~84ttR(nDhpK<_`2$jHHjwtza;KUjv8fd%0Dd%GJM6D}%oDIrbF1ghGv-f(Tk@ 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 G^?v{+B-zpc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/overlay.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/overlay.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..822af61dc235d035c8b4e0d46b53b8781935bdf8 GIT binary patch literal 1522 zcmZWpUvC>l5Z~SV>+>aqGz}?{z!E{is5PY$5~`x8rO5+OC87D(oZMQAckP~i|FXAn z?CAUyK0uN90Ovi2nF*m4lu|hBC!z|7%?L-8KxF9ne`hAY-TeDz7BVpJ0#*)UgK!s zU13%m8sd=G8Soe-i`>zAR=^zD72x2COmTrrJVPa!p(%NfH{RpTf-nM5ev$?=BuH0ybq)a?pm`F7QCiHN z;cd{j$<&(K1thhCn7fXE$E96Zg}s7ic6LZq4SXG~M`naB$c1u|)gTUNW+p};e^fYy zThw}n_C9_B_Dki*tX@g?L0T^F%n;!DY+5hsgB8%+1zPQqq5T$%4F*}i#b+BQdi4PZ z$W4D&LFEFn|J~)rQ8G-@i=@#@MNH*ajff|WFIl76YV3?d87BQ!t94r%C=)V)4s>Z& zVCh3?UiniDCBj$ucXDPPpg$2**a#EZB#N{iDm)hYOtst`KYQFh%DKqfC+R@)Vf$&8 zZBt3x&(kiA+J`*O+S#Q0hKl$>M!Q4W2MD0))0n^e@G*_Ei0AEe#6?6Wt!#4RZAM`( zyJ?(lt!i)@sf{kzNBdyFMQbzC{_`zh-r3#Y#g*lw zym)vT+pFisg)@G>hDP0Dh;0q4OO|Fj^6Kd zL>v=H% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/pixelarray.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/pixelarray.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eeeb65d455efa7a1749597785d1bd45ff680b687 GIT binary patch literal 2190 zcmb7FOK;mo5Z+xX%Z(uf!2;;8%7B=>RP*!DU%Yj zWEv@;d}!)he*|^xr9f}#U*WYUqdoV~OFFX@{V4iyDedg+%rd4Up=nS+=#Iv=;k+v{q z%&Q4gRK6o#T~vhyvnw0IK4j`^>AoTqyl<11a{`gbMvLawSn*+Bc5+kjgm)>*;W1#C zFdo8)+dvXBpc$KyDNSi+2nbCHaApeW%@{58l^FyWuYheev%r?6Y+%F6f$)!$+P8GR zuEToe33;}%2gihTjE$CY@&=+PjHyYBDa=KamYY|jNuP%@w}c-@0iSsFzDzptbJgQr znVUU72t0E?@DtzzKguie8##o<3yz{>5=qb8+Wl-NuWe7_M23&Xe&Q{BvAMhb=)vyJ z&gRDY<{l)GSNxForB{u+O3I;fAcY@@YQpr#mk&Q~@5WNa?Y+?;k%#U3QM3*Aoix(8f^A4a@;$ou}V4-(9~oaC5?Q6S@X*mEx1tXp)=p!RUnzLE@`G z2(7`-g~9Y}0vO6F%u}{-Ns(S;nYDz#x1#25q zHZ`W^_-cA~|MhrN`FDv&Vbnh$ePQUcq~C z=C!m!TVWm>J+=gINwIV7Z+D1Fp%>L-;~y-n(u4L2c9_BW=mRIKCG~-uHIk;VXRJ7L zdD08JFO}0gBd{$pzr-n=|2oA*pZ`{ylw=Dt(q_}@)WRO7R$A>bkS@*$^v;;V7ge53 zb2gk8;%9Houzk=}UH1FwvMX$le*egWh$PbN?5zY?fWUAYIVXvwGCe)uWzWOC9aqOP}hIGeEjRy>mTp+f7?R#r+Y7JJn-f4)@tAH&H3BNx2`L^Cvwvt`ia7? zKeuDRz;Gm_XKfcqs1QWF+7m>V`-m8hUpy;v#3GI5#7n9OUL;W;#QE7@wQ zWem)?$|?N&Io;3cB&RQOdf?e}^V^=m6_B{6xm&orgUdS_dkeCl4-j&Hh$tC<4}?&g z0Z_7<0g%a>bdlZ!(6nK-JfEBM`I?@u0ic$eaxN|2(-tm88?-XP5AyF`@PrbVR_EHn z7S~m(-pBmxP6spWbl~9EL71pS&bj*Ft)O&~>@|2Ro(J+1?0$^$Me4E}w8?DOmNxwpFL(sc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/playmus.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/playmus.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69c3e52bd12725c25f20fb963242781b76c381bf GIT binary patch literal 3818 zcmZu!TW{OQ73T0FQIsq@PIi;cX0a^L*3e>Cd1=u$2-4h~Vv&X7jh#3p+$Ctv$f8V< z@{o#cL4I;j>`U9Azd(K}3iJ=OzoQQYU;E_uq9}@@?RSRsCBcrsxt*CabIyF{qK69$ zj)wBnZ~pwvU$1D|-)V4GOmyz!%f3a$HBaM=>oFVYp3bOm#D-_6)>N$-TN~wk&8w;T zx>x^&#w}iZqw$)sj}5QE>)d{$c@A%I2W?Zdcym{mZ^VMA4co_zw{{KrS~$lV(~`Dm z(kx&2NIPaY(^%I!?dk6yxLGtB$HE;=vM6-Nad0SP*Ku6eeUS-we7F;gM0XS&V76S6 zr)rfOByKR_QR?=iSajV7?tYZ;bl;6K+8jy|xqRO=) z<7~Gfm#DX{<@(&1X(#N+$jzZOubluGs#oXw37Z+dJu`C6M-Q4XrnjDpd?NA8xc^ur z?~32+=+P@()1tRHzSEF&cwwJup{S+XLlNdh-S-o*@B2lqgi=xGQAQ{$%qWTS!p=nQ zk5Vp*S_W;2q+=FF7-xkU$Q{(X`y6#9;{G2s39Hin{qoVBEkILdTbt=H7rR>z#^c99 z9&CM;hC#fwAx7h^@nJX!H0EY*adxc6idO1e8`kHx z(mwSXT!a4gndUnj?=y7#X5ON9zHp*(^BN2mw01SOcxi44tJ?UMZs0Wk%1oOt6W&kA zsc3k^datnd2T?9guiIgSAx`h8V^vtUVt9ga9a+F(A4( ziE?Ls?ZKl}8j-4QkAq1joE5o3Gg8o6XQi)3{UG9QI?3JiwUF+Q-AsfjEZUI-&(2k8 zqmd0%UX$KD48~+tvW1z#gb#@e>ron~5`#Dzdv+ga$PdRtl2`T2Cux#{M0G8d5gxTL z;2*r@9WcwHso;K)g(BfX7WP@syLv(8q9ViQ&$>l3juPPyM6@%=i{`$Bs(hNtI=Wn< zn^}33$3h{mtd?ok_I*OH@Ba{^>_b!(7+w=&D4pI`;xpR^&NT7??PZK zEk)f%%MIUDcxAngbpe#ZBm^qYA}wtBZnenofpqWU77m-XDwQbN6#hc;i&O|qghZv2 zIXbW&ZO%@#E&a$iGBMJRteH8pZfZxh8KTLqCO@B{cU?Qu4|s0O*xXd!Qa{!oYrk5< zzWR|ptIw=!#LL3EhT>Vv>)b#PW);ntS$&f%6I6Sy)^Kyy=<72ZD=qj4lWBYRHnrRt zHs`HUGkB+3Pf1WPM_$E!PZv=Y=5{<0orThR>@$$dTSRM!WHJ&G;kU5hYN0`LYw`oC z2&(c1Dz71xt@wF*p>TN}l#Wwk!OX=0ERL+9VEY9dl-z5HvX6pAUV~OBb1B&2djOH2 zfYn2Mm35FCwbkz?EThGi4VO)qt9QC=cdYamO|r2BE*qi4@hL(~V(Pbie{T}R6$R0S zr=jmFcqk7pKgF5SrRoP%5jfOcF5Qp9h$K5!(4tXBwr4_~1mV2A z2VipS2%vD@Dx)F;HhR-fUu1~?caS>e1H|!*2;<(ROzGbAHU)l^YQYzyvn=Z@Ds`(p z)dsRsl?#2B2*q+XNca5-o#~H6M(sK-d~TBRXBeHEA(;{RUNkvOZ`t%Aw~ll*i^PGF2(<=bEN_$nr=mFoT*Zl!3UE63XGLkA zfRB8IQHuiGkufudZHyLobr=2wuz{%xkqzf}8{l_}u#%UqLN74@p3+7-1? zo|*K)=NkC@w_5dqx|J^fqj(_Iqnjo7vFby0`uEj*^OEe={5o%ul*vu3x{-ghqwm&m z&zBX)o5XRCD;YkQt)Z>t2E%0M|Qj2)BmAFkN-sO(Q6=R?oC7z9zKcwf!Ce3h-dfnE^u`k?RoZ7zszfpHs%o@Ya6Th}W zUaX}f=BpIZ#$1c$F^d|Wu52C33-mVTks0XAx}^Uq0+OOSIlKM@ zX*ZmmBx0%a#p;jPSyJRJR1+~Jy;)&ohgqSgnXJ(k3dhRs)oJoa#Mg*LqLS*@mxR2K g)V^D~*n1Qlvzw?)NK$%i)cVpxxWwBwB(e4X1KfVTC;$Ke literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/prevent_display_stretching.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/prevent_display_stretching.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d22cd019ab76537e50d368d5988186c38e518106 GIT binary patch literal 2162 zcmZux&2k$>5Z+m>?MX{FuS z^~}h!d`w;-2OdB=a^c2-3lFjPHgFQy+GCtu;eyl)x?GpNA`Gebg2_G?lTNGHc~-JGn0IkZN&f8AhK*ASmTp5_TN)!{WgV+*vBt*%35MCdZkSH?Tp>;^O0;>e^curhoP z%B%#l!<+2Vh>UXdmbS4nRIVED*j;v+-p14K4?jR=tBla<>0faBjVbP&uAzNx_~FQS zZ2VNAYp~W?M@y}1z9Hg}Ez#R=$nha&vOK(#AzeWv)C+y?4(|c7L-ebt5rJycgi5A< zsbc8W$oj7zR2f0PDteZ%PUt!DTOMw}Ep`nvt0UG1xEQhC*~DEFqpS|^GgM=u(?^+N zRaW}cpw%oE);wdpqjN*XJNsCjU88p0TgA3{A>ahKa#Of?2~d7J;4Q~_&RrQt z;QDct^b`nr&sA+ipSS`)2}H~zecboBd!#*iGidb$FjvLXSdJHlZa?5G?n?}aF+8OM z4bX@?JXWrkB;W}=gNGvR9`g)J`T~Hv%~&`ZxhFx?-Mw}o-y(S`KwmU~Ou!HD>_GF4 z(1?HSpw-@Z{9=2`S=OCo(DE>+mhh5x;L9mACZ%Gbka)k1h+a>{5ytkjfD=)0^Jt)X zIsYTUgcmXn5|k5=0Uq-dAcU*HZ}Z@|2Raou8EdXJRyvmp&0UW(%~eyuyy}j#6GVZ^ zl9XFcmiYuB^13=ScOPPUn&wzn3>S0Mz&r7R&^ro2%dkHYfBgiDh;gO!Jz{tn8iziJ zTHW>4Ai;o9Pbyu>0NGEdiI8K`#5`*k>llniPl zb%fV%1RQ&_Q8R^w)KbFFR;Dd|A?ug!`e2jSw%oJI?%V#>O*5$kW_fnw-5uSP7rQkx zI3$LV4d<%}bdD<{&9`)Wo-J>41)O1fpbl}^)1}*TtHEhC*n3LzN1^9;X};eM6d+H1 zG8@kI%U*ks&NLb<_8X1VjAfdW1DRSJTQt4Y0yVidle(pspT%lBN$l@>IuFr)>2AwPaV%e$anh}Z`y@v=Sadjis#$sI|pfCq{?-#yuV zzVmW#`}wofmY^C@%zzfg7d*9^F_N{O;+PhM)>6>?qd1HOwGpr(d!k8gRChd^5k1cF z`lOZ$B0$eD_Pc4`&wgh7xQF71G@rd}X%1yXN9=BDefx5I55e%+p%%mLNv$y8Xg>;( zVo@XMSwo;4Y2heV_y|zM!17tmFi3tiL`_#u5B~&@whmrm{_1H2Y8MvH!aray4%>1xV@Nvky`qBSmhx1J1A`*T#Q7s3~d z2rMZMR<1;riEWu=o-7cX*ruH;lY%)F+ Sm?dkStmo!Q*>v!0qwQZjh^O!X literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/scaletest.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/scaletest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76e9225dead4d1a3f099599bbce1b4561bd393b3 GIT binary patch literal 3197 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 D;#-ho literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/sound_array_demos.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/sound_array_demos.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f702407e2cc97def88c4208aa4ba72d005eec09 GIT binary patch literal 4881 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/midikeys.png b/venv/Lib/site-packages/pygame/examples/data/midikeys.png new file mode 100644 index 0000000000000000000000000000000000000000..74ecb86b8c4d75a7cfacfc9361264f317d1122ce GIT binary patch literal 19666 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/oldplayer.gif b/venv/Lib/site-packages/pygame/examples/data/oldplayer.gif new file mode 100644 index 0000000000000000000000000000000000000000..93906abad21b07a50dc287744f0dd7c53eba60b3 GIT binary patch literal 1075 zcmZ?wbhEHbbYL)G_|5h^f1qP0P44fP?9vc=M zY~~QwiaD`i;o)`xWv@9N8y6kz=3r!yFko1Gyj9AwP9}1~V$aDcp7U&G7CrHrqHDWP zL{j+inLbnfduLXDR`Z)DRQr#GD^TO&0=s^{J1b3;E-&L}<*48kT@CxY ztcl)Tb@Wv5ikq9A?H9%VzN&hAdrI}8xwE$^#qP>_e<*b2_ng!F>Vmsuy~_(uAFSo| z=Q*%rWAgE4WpATh8~_r-PSP1b3T7L?&l5ta9C5XY>2> zf$KYxtJmF~VV>O7XUf&SceX|Hy%W9Ba_6Kg@}Di7%pU%3w%M0s=a#>|m$$d*+w(hz iCD~V;i`w(^49EG^^*mL3E6=<;nm*Tme}V%8gEatMJ(KtV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/player1.gif b/venv/Lib/site-packages/pygame/examples/data/player1.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c4eda74e953b1647cf7734737aebdbede177510 GIT binary patch literal 3470 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/secosmic_lo.wav b/venv/Lib/site-packages/pygame/examples/data/secosmic_lo.wav new file mode 100644 index 0000000000000000000000000000000000000000..867f802b988a377c0cbeac4dce096d02d6df9ae1 GIT binary patch literal 18700 zcmYkk3v?XUc_w(P8USe#T~9!=9gC<(gH+;?*j-f(YGPSJS2rm;lUPK9j!({<#3Cps zXLmdnUlOy)NlazVoTVQk<=L4tdp6O-v%6<^5)-5|*&RQK2INe}w%An-X=0l~S5=pk z#G;9=2PoN;MO4*(w@L4$33NBQ>)!j{|NVdeEw(>?@Zi|T3HemxHxK;ozdWTFgbNC6{l)JdIeKage}C~DAx|7Rb%cBj zmkadD|Nao@0EWN)OGbauFL{Rkr1S&&B_ZkUargrt-+nLP3Ot0AzR=I;h}%~aj1kgQ z7!AEW4ZVzBl#28_T#75{Jk0G`?kt1v>16n&Lr23$AJA!UUx>vp48!RY-i}`JMBjrr z9DGy>sPX$RiLhwwdrfUkqFJ{22AYcMafe-0Fy6|W;#$blg zdyEc8lhFx4dn&L*WCTGG6h>t51`kX`=OW;;P++l;BVoaj9B+6&EqJVuNYBX}pQfM$ zi!hjkWmuw!qh~?HpY$)HU~ix##g(|axbqKFqO9^aT?LbSCTs{A75L&!vl9 zYE9Hij0!ry3R=4+;TNRhd;awTiLyfxU=SCRiU2$PuJ+*#FP>{HNJG z=R!IUev=rxDIjEU3W`hBfdw1Yk~AhyNj0OUi#1hIsiKYMfl7mMMV_zq2EAb5XZawb z{76Ss;1W?2Yg$d0Wlc3ej?9XZD5z9D$qWXEDcD$GNU}c2v4?f=V~}Kg4*eusP#Kl- zQ3B~o6`N2sL!T;XswS$Uu#cto2tKAE6e$UV?JNkQAP(|4$vH~F4BQNMY>bt3Y2K7I zO_L>vQiUGC6geu%_l^IbC8!@Y2&f1KLjf&uya@^r2~EjlBMgwH<5j~L}OJI9HyFq1qh`B-UYMrT#)pl?K}x`Xg9SD z_*#akHEM=tOqFC2s)wbJQB43T22hNkVLy&MGJ@rD5x~BUy)T&=shf z!WBVXQ!p5gM;$Q(HbOlPe(_4+7hn~EANUZ;Ajb66>q2>1Qq}dEF*P<;Qfo3qiHE?I z%jGyq(Q?pxdikk|>LU zo(J6+DFqlLiZZKJ8#Pm^=}i!!>yjct%0*F*+|{1nTaCcEaO4)0G2OPCv#>!`g;Rth zAZf_?j=$<{my-mx54mI0RaG%6mQ|N!V~Ukn>=v2>W@7Ou>J2&gJxmyaJJ>vazOeJ= z`#88#2of3!POGdmW|>WM0W49fDIfCDsuy&Iu?sntp^00J&^GIOvtnABj16MZFv+ux z?abedq8PRh9Tg-|(`sgO(X#ZWT&+SWunlUW!`K-{!`RQmQSd`_fgQlP3E)Z&rNTpm zeKD-QU{^G|p=+Wr12@t2JCMtE(#yckRM5nhz0fc#`fN#4uwYTdgWkq4aEAUc2nx7g zwj>!wQ*SpHD;3SKC4q#l+wnYqbv1*Z2VZD}T`GJcS0vlCrl3Fy!-eZ^x1V`g97FI_ zNYa>e*qoCaS_7U~AVo6lI_|3P`<*BrL`7;$P0vlq6}_VCrd}dkId^-VE0O2-xAS;C zA*@)l>ss4vwpvCTGS@|jZQD&&R zX|^rvu(4oj4P9dRLF_x19cL9T7X*Og%v7bdAIz%gQ&4QEvEy_)o15E-3#o%&gs~ur zW@}oWk~Q0?)d)BAI=+J|uTLMC-iV^rC>fM&yRMrH&_~0rs-#?whS#GmsEqv}NmbRh z_DspPX*bQeSxv9$0*Rc?aOhth2ChFG1cNkWB%@WI-DB7Wb|S+Gl%wuS*T1rv#XZ;) zM_9Recuu#>mOe`@mYK;Te`Uq%XFe<=j`^upU2B@nS#jP_MUo8MRk!c2P*&$DtQ?%2 zozl&=20vDlTBa>4MFeI>{_0A{9YO^Xo?|7;YA>{#wr!Y(4oh)2u-lFcB0)n)SgSQ> zwy+J0`2cxh^~0B2hNkiHaN}0C8F@q4oL{7jakyn+v!-D-YC_^WD^ACYIz2aw3sSQ! z82PNW&@hZzl^WSt+o(WxS-Hrv_}iY}8NynkIF$9p#rmRcwkwETER+2t>Nw5|zVASH z!m)ZCGM|+!%`jC3TG8!C{Vejl2%FX9<^g=$T%0XQFo<3}96FsMOmMT*cTolLTQSiN}*TbMZN>aJG)H+ZxOv{85Bixm~*Y~@Qe%`F{nE-qp_T1iqAQtn*OES5=ipx`ga2iUGW8*SY9t z34tfDk2LHCoMMUR6UTAAZ0n@ftW1e4%OwNvdDk0m7lXiEPwn>MMccL{u&YLPVN1}U z2yQG7naZ4b6q+FtaI{EP`rC0-tfylKEE~oPFAGiCh~bu}&6Z_VDyCgiNZ?)RIzi7* z3bxT|H=$bE%pk}j_d-7oqWqo(!-l3#F(in-=YxtY@?kG>>r)l5s>a++zB#PEwW#X( z$}2;-hK)SVqAX?WR?BM6YHAL*RXE*X74cB4)$2{GRzsRNycKo)Ayo3Gi)N+KFl~b^ z2P@7i{UHLvmRxBr!8aM2Ima=A?zgt%`1# zrpm8)k+%%_4+cSz?&eB*9gZAcW#5YHdz-_cmlvg3t8GIo8%U?iL3a}@^5dL*M%QGy zt}}e^qBDegc^MhgVThUqbs(EB3}fmjQWh@gWJTAEd12Rfc*FM&bf+&>c znk~K6Y#X{Nczw_9(X6A?tmtY@=)2I`AQp9Nf5ns#D*D|{oP^rZrN)9;DUmeq!((BU zFw`DxV>7Z??r!*Sw%sAJ?71m;;0Amn@m{|YgK_KZ)GRD;(bhFhm~@sM-(TrwS(%gU zrKY_g>$AsFIMQr09>|hDhh#w{7hUID!)UOcntQCeW~<2lFKKL_Xk9Z{GU#-N zffvA6wdYzELW9V6ygq`>Fv`Q);^Lf!_$qM2&CN{@Hl8pin2(W-@3`N^0+zj?icIb- zufk7dPLSkMi<;j8ay4jEB7df*!^^Yo0vX zZp${a1Xym#~XRn^vPCoAXuS z*5=Ujo!(#*RRKZtf)}btESJFn^@5n&zksbtWb)QF76m`#J+qpv87dDFoH$umTg{W; zp~6RQ#}9%5{N2*xqS=DI33&&scD9kL7|nLul41Yyc!TVFzPquV58~+j+Il)QTQL{m z%j%-axw!n|U=SvLR7}iTbz?yntIVz#gakP$oi;0mq2%3-;U-l%3$9tO%`5zcjtf^_ zn$}w_t6^|CTyNmVJY!d8&1PGdNz176%NP2AOADXU0qUDXo~m;m=T2uWoT}7KsJUTV z4RyEyryPL*=DmWcwBYqj8X92DZkE2G?SG2aMO@^ptaN;?)NUFL#IDKhtC63jq+Oqa zXbr)GTX%zGoz)f%S+5^38p7C9EW^`IE^~a88Al| zTX2B2hPfmWciG#_f;b%$lCZW^M-n89Lh60nr|w}223}K{$>Bz{;`Vs6ZJVmZN1Oih zu3Mz0wP?1dB&8fUQD>MHp{T3O*#5<)tnhE2uCn=0khf&M8}6;cg-Imx9H$p>jIp?{ z;}v91Z`((Vrlw`^&AuC_CCi+FMwS*A7b|e3#cUNYS5DDAc z(Q1&VqPbZAFq~F0wP)HqK&SOK5Gy%G)|+M-F*;A{m1eW8lKyQ&_`M_0H~wPJ?LZ~* zMXj0!UOyN_*V9zfmzsvHvgL$#mxsf0n0d)PE$Y5+KXm!f=-%1iLEHSs5L6sKEueeX$;;gKsX z_hUx0W{nz?`;Ox$p?viW@F>w9pCx~F<)_`TQxoG?uoQ=Q6HV+yGiiS5E^;sGvmC5{a2dPZLv#hjhg?hy} zNtnIIYcgv|>f}m5P$Ha!k2H}kHrw@Ut2A8Yr8(m4!jr~vL(*B41)4Uji#yy z`Q~FWo_ayf~d&Wzeq0Fo} z%foy<+&X<6$v)tTh&c|A%rgojRrHo^BbQog{*y1EXk%qrw~4#rtR6O-TGgmtiwJA{ zvJ+(-=LO|gJUpCrmUk2!m}A6XuFN_q#Zi6G$v#1Va4Oxn_;Sa`7=`zdbyZS^j z?O$<%0L4jr-v!srw`x)mjXz3$7F_ZNPn!!>g-a)Uq}ej(`6S^>))Os}kG_D(wnWJg zi064}>IJCdIcM4R;JV^`d-LXL1q>m~-G-r&na-e8X|`=DS2zb_fzl#Ms>(Sl5b)mP zRYi!m-4IG;Tyv=dJ*<{jhDbNsB7vIjIDzn#|2*14%~UIQLiI2jI>JRkJPSjF7E?8b#uvDD0Q$rFvLkX;S7>;;3wUNES) zYGQ%-&g^`tU_@y@80!W-wz;6>Lq8Z0wK{`hBTm2lgOgfSD7J&G!!0OQGDs_nP18Wm z#5S8t`uo3xqE!_5&>8p(-_YqwZK|Y|AWPF47$* zh>&l4Ol1}{$Ak5~3yKJEAszehxq_FbTaRR3CrGEv3bQ#xrX{Ilm+uV<;f2BJd4=JJ zF{>{wR0;46c4-0H40y_DT3Yq&B|?C0^11iIdg(N(g(X81g7DscyrnOhLV3`81I3hh&*`fLsTv|T2tua(+UXN~ z93!fk5+DBZmjM)1s$ravQlCsq+VQNjc0eGPg7qURpQLw7$}kJY48(dr`uUd_eO8!R zjd;DWZ!IBUUs5i%8jb2q{O%W7dFlyd1UWGogV@uSbmY31)D_}~Z?%Q41C8M_c^_T^3wud}h5tS(TW;kA9_bRKsf`P|Hh#NbhY{$izu5-g6 zAq$Tl;=gv0F$^*}NJ@H5dH&|(B;!(6Q~=}bJVVTy+D}5YA(pQU_SA%J_nqU2?rX;Z zQlye1*EWa4ExR`3yXnqzazi99hBB)pc`}%@)P3&SmVx?r`GY-P<&xg&nIJuv9 zGGgdV1{P>f3uV8UR;y*-Pp3|++x~w{HB-#|WXzb~mqn)^L11GwG4G{gJI|^ro39nJ z!~*nW8_@6bHy;n6oG2ihq+JLzOhb1&mbHPLp0jBqU{nbnoeMp1+$`WY`f?k(fMw=k!AnA+i9(Sbq5I zC0k}+M|F<0iyIfCb=H3PzZ}n^;oX2R8E%aj>cV6vVwMCRG38mkA~3&Ae(NW{etjjh z>cTz<;Tx9#!QC1pqO$!gbHw0+!QQ9iFcnn-428PbPYSM2bZsU|Pd}OT2!Ecn#Yv8g zv51$Y)4v0@Nu->lwfnoz&RV5+i!D_lgH&hy7gJl~cFcI$-`X`2xs0Why&dBAc4}6K z?%RKmOqFWGByH3P{9^3`t8BY^3u%h-V#!wT%D1G`_xnXj6Sl)tf@9m-f6^Q9Q%L0w z>~>sMd;dA3x-Wr>U~T49Ygadw8^lkU2g1+3gebI9YJmNdcSCyfRb!eKq%`KsPG-n z1$yZ_7aYgw1GPZ>aZ%L)GOd^Zyil<>4m#L$oqpFt77pwSJrCda>TJn2S)!t1u3L4p)vQ}h)NBAYbi zUMN>4X4sEyUXC|1j+A!3Ov)}_aKRM6(eH0YuIu&Fe6T*B$`%EvES+K^&7&wtEwjoB zGZ*8$13Fwk^8IDcyW)X4J|HJNqBl;EDdb=Pq)T%xkU=vu)Kf=CJFEWC_phYoU97-MhN7S) zaCC7I5aA-WWttCd?R&RKb2PFLgMl*posoVZl?676Lj2NW>o<^L8ix4{c${MuHHTQ}mdmepRB`13rM#67Mb10TdruP3q>wz*Uj3f8F9 zTVRJhhk9KT&0irR%)Xoy-i5vgdH5hAyB-&)eLWN|&ZS2#LA6*2p>EAqDwT=m?LS8+P;YY_K?) zvckGeD?K;F{nID}Hl9UYN2sq$&_G51A5TiDLx;C|6dRcfrEd14c801bIIqvl! zb`J&b2*C}lbf8s1@1jwwnB;Ix|4mIty1&M523XR^zbNp}7wA3oJ4rtXoQcnmwVhA( z9B2J=ubQg7WCNJ70Mga8{bB_TnFBhWW!)UM%OSaiwK`GY4o()WiaZ4vLNSGJyjgyc z!cmt7+CNauaZkX6eE4Nwl3J^fv&nY@PndltlE} zly0!??~z|hcpoS=oKyZ{ICS&Q;O!5;d4ii3NligdM>OY_)K*Qm&FN|BlHN~wH{Z@C z9xMI+>kB^s`jJK7wWtHL?4vTijWRVupF z)BzvOT@xomE)KD!Agn#p}nu zQVr)B+F~=zgSESBx}^gyYa(vdmAl3F8Zn!vc|4hiAvts6s|rEKopxD;FI78;H(mg3 zbvKeYnD{N`k?YCdUysS7e|R^iDy*OrL%X{=)sSr&0ZkB!cc1xi$|qbBfbx~+CKEt` z4j6)M#QnAHsJwpcPn0)RMw2wXGHsWRV-F)z&^gf$lf{?j*O{1yaD%)!ch7^Yumx=t zRYBQtM)?X^=hu@U8g3?D#6ddafBatwQCLNtCh8Qai@IUg8aQu}7H2=P{!oaE*9L>D z>2?8KiGakxvwG3yOWaz1?CYQ2Qc%;OkJu6pu)1EC0U+8Yka_(mxvw!`VrZ3{C)e1& z{G+$`F;!VJ4E^nieDYtZ)Az1DxxQ~bk9~jD@02g1VCgaCQ(t)`tuob$P$3O+Osqnq zG_{6K^I7#dlBeY&ioJ{6rK}7OM>RbHDgH*U-23En^KU4OfCwQ!J}%1gG>SL7353H$ zE^zAmhe8}ISO@HxfBl!<{=*WF;|-FeipR*>=U=`z-OkaWcpZV!i+bGJ1IPc(M@vMO zOmqHlYO@Ul3%#PMKtIp^&TD0|Ed+V+VmZzR-3-bBU7;S|9llGlWB>c^5-$m8vp+s9 zK)ZoP0wST_*|4?!FMaye2ht*sBlfNxUk?wwd6DPdQe=?^c++U9>iL;4TcP2j3pwM( zU*}6F-cfY(F#1s~5%5L}y(IWqXbAV^T_Ku`%bwE(6osJUJ3h>w25t-tE`%rE1{E}O zSOOVv>`erT(JR){G%S_J4)T~zo^UsDY)37|5e`UpmMl=L$j)_(~`D1MjVwc@~*W-Nt|LG0Iu*^Cd)pTDrUNEJm=?5Mp0}qPP2|&k)aF7#3NT7We z5VXMm!yi{yFeP z*?89*{HlT^0Dc({>`BLzlyETT+;w=3W!MSzs#KIzJt%v;pa2x)-JF0wT>=4gAjXea zGLnj@H_b=>)fsBMAOaJ3Z?QP#aDuYxuxUJ#6vc2D`P~lPBB<7T>TkQp78nlnB<`+6bC1t1*h@-Ul zft%pDyFF1e%mccqit;B-<4i%d2Xs(kursurefI6rUX(|-g^c}ax@iMJmCOgJ zAk*yA!+6V*vH>Y73+I?d4G5(yaz%U63H4uJo7I1pTaEUhHcnXz5~wP_a90$z#MQPg!QisbNg?y$_(Mo+tSi z#?VONO9Hx7jF6uGLcbK2Qy>+ASyDyU>mYLFl zCK|p}+swt5VOOlCJx{~}2cfzs1t1*My3S=Z!Tc4}hd53F!Rmt51fp4MG;BcdkPq6X zXaqLw3Jx@xyVKnBvjXK<-oNahR`iO37D69~`@Z*5k*p>u06rdPA~uGR+x5T0_hOT< zOKnX@7GYqzI`Z+8x;YQf*iC{Js6&U=n1S2vLZ2Meem;%7(c=PAQ&p>&Xp2BqQPH%l z3e0xFpl5(`W;g0;REjw&xwTWMO{=Ia@?zq3vTv-zvR~qh_i%Wpc zdq*MQ0K&JeTXb(H&;-+Lfhc7+_g9c>yDkcE$LU<&9OCSukJJtf`Wu1K8X`^|YHgTY zdx5I#oQ^85A|r9FzFI5y&`H3>o1XVp6@ZL7nUG;I{othn$p_$jJ}SRQ>u;nttNc1J zJN+ndgo=hF95rnHpkdBcP=xYMkvI?n&ejCp(C;|k50Kc!F^U}5?KOBnQxrJ1j-oz9 z=?f?TH3Ti=VKup~tfnNJ_#FA_txDF7Xw`X~FEy(B1`@wEZGMsPtLXa1Jmy0e3O>Pm zoyoTihEz<+up4F_Q?{*EU9VXBq(pv_rYO2|NC(~wMdxLDBnV~8an$vo zZWji}25&yj;bbsD?u%wHIxY2@aa7fsktCcaBuR2qx+7=muJq#9b1v!y$ekna2mCr9 zP#m?WS8#p=gd21Egu$K{j!j!_S#Lu^rt#VlJ|w%{7~NN||HiSfBBoQSFd>ubdFFjN zpG3nPxhj^3hwnv&c_lr@zo8N`niM{1*3@Q==G5%{?EH`s&{MvELo8r~>%V|wO8o$k z5fzs^`1JaiO3XIxiGT%$X&%*Pb@M3V6lO8Yb2wtd`vV90m**YG#}yH0yHM#d?|ugr zcp4S?a6R+mVL!f>bASCnG)F?V#?nTd*)VDcYSL0|>VT@hafDlc#Oe9S8T@`W=xql1 zMv`BTvp(W4GWdU(_~*?3#6K;)eUgz|kYt4>n1=ZjVd_7MZuBd}F@QM4%A{x}B=}=)An7qGoJ9@WX1C znT!+gg1V7j|5E72nHM}CUq_Yay2Bj_TO%OfLgz}eb@Mc%BT}{XC5cx3#xqs)!&bvV zkPm|RyT^*UKulIPt7G$D6yJltEpo*7we3N2HOZZP$K+VGuocE;Bo*1#{spP6>Xxh@ z-uEYp4>F2TqzfiK%KY`u|Ce`Bhi@jZ8-&fI8wabs_-0<32biy!8qUKR_M@ua)?kBn z^N40QbmO`CLCUXTO>W@3UqAJn#64)acyf%zi3wJ&K(L;a#I2l6^ zPGKc^N}ck_wVjy9@|n$ zP1JCt;Mvb#ni-&Kb9+7iT8e`wkRJQN(*IDoDSUdbDjAkqL4L8niMd+9JdmhqXK{cS zXc5h%`d45wcn9}}AK!Z=h0jRYKu`bl6%H0PziG?iY|=GO#xM3e&1@2k!| zz`Y?naN0Eg=uFwokmA5q`d5&0;Rt8`*5fy7lC3YQvY~%ctzZgTUg7cJd2YZ3xExe` z8z&C_I}sS%iT&hwXfS347Sl9O8FjdLnlU1Ra>y0e>=FVBjOonxq}2;gn7VN=)M{Fs3YkbM!Zycr@nr zNc#2)AgmK%gE46GY#y`$HBp9)ekm!|$)Okn2zR_Vz8-A;pvo#b#X(K|q;_6Nx8WSI zxyv#5i#B`09RIs{*=%7dby1=zBUBWrt8RYe++;5by%;`zIi@Kv{h>mknY8~GNqFpr zB56=d^S~V%?r?+>VIEi&fHqO+ej|wc>|Zf&sP~L>r@$1@s-KWP`V}r6BHTGn7rdr( zrp1m&rfAs-p0)wFQo+!FV8?y5MvXJq^Ooa)rbjf(MdTQf<9jdM`1BajkR&%-ZJ7#` zvV#hT5`>!m42SM0vY5Ub4Tk%P%7SyKT{PpNub27YDzG9Pcf389%m4T>nL%aKY#u~S zrPC=!ie^X;K9}>cHyB1#e3Wo!#FX1q`2N*bkCliDPFjaYweM*4I~vktzrjwFpW>S4 z`F$bs@2>YXIQm-?L|{>P+4~`L1wj+iE;&{bDJgZtubKr`kBGsJ)N>yw z;EM+TsP+XdP%6rqI4Q2x-$Vk443UO@7#bZnB89TWG|1hc5GE)uV4pe08~1%J1Q0HLDGZw9f^T5;Wh(70Eobe%Od~J z4>d|ydq1|o{)_Sd`R@1b#^O}Ecj|CZ(rli=4Mv&&3SH3Od}l_LVc3Uh7sNcn@u)hl z-XVpu+`nA=8KY|Yew6i)EE1cMf?%4~&fN*t-|%VeJ5mcgQN4nUKuX;I&od2F)pIZv z>|*3Rpd=Vh*#UB%!LgaZLz#_5Hg3$i=hr@Sxq~Pz7kU0`(|)R_EzLyiCj8AejVorscO(VnsNj`n3O(Q zhNV2S8b=${O8$S{rgLIe_yu%0{HMl5Nk1{##4kpp)WdiKCTM<)OL_rn0BZC-cLyt} zl{O5bxoCd$4%)`0Uz_U2o3)9n}mf zPs$s-k0?P&4jp>yrlg`Hg2id=OgD1JhB1fP{OB_;B{)$|^IW7@Z?Q-;sNCSQYG=X} ztin96j93ne9OpL_VK4YVNufU`=0&B9Wa`V?Lmbz`!VX+0=IY`ND8l-;EASufz^M~s zL;wa-BJiMdnC8QXViAeNdEED3dx~)D1P4gaco%k%PB3Pd9$EfUsY13nN#+tXlW{x9_Onw))s3H< zt`R34XStgv+;s*;Zh;dM=%9+ij$=_=(vI%(h^*}He^FOSz~j6(Rwg%3P{|^B{k@KV9>C*CbX_1`)W376)F>AE2rGo{VA!Wx zL2(J!d4Vc7vT1lhD9n0Iq$m}tPMoHNK;XP-p>>3ooanmZjz(Y)WuOmn_rhO3#nfyD z7}IK+lCyk~1%tx%LvCY;TGR2a#9Q3j%T*#RA}=)SS_4JrV$(c~F!qQkrSMXxm&yDf>LSphEEMv-XM>pGffG$pE3B-B=aAufTGT7uzylvIDIhb-TX za1_>!yv^;%`HOe}KooxuV<$Y8;vfMn5a$5kT60rVvVKrQ5u&4|Z<=dnIp)bmH1M2> z$H?C7`&s|BWBimMaqC*Ve)MzaN#-P8zu@CM?{s|6b%SMPux=A}PDY5v>F73$7>#hm zRCyo~6lA!|F76DY(fLtlg}M)D2RP|E6F`a>BHP9+avh*>u--*;(Y7j6GP*_|Ej6}z zfpa3X^Xc7zm4+yycdU2{DB9Mx&wMwgKnHH$7Kh1WKp#p&(j5l0J=q%1JWUiRs)!zJaLJ9fBcgZ zXnI=aV{acS<9_lu=%cece2b*e6I&(qn)1&s30IOF2k@eJB}VQvjJ}_TkFWi`l9eP* zM%b+5yo8CPfU~k;9-h>NOU#U)^^woPjd{UFkoU9A-0zGMD(}C2Bs8m~{WPYa_ytO& z9hc;W1riVi>vCe_49j-lL&0HkCkC?uRczJL*e?l_E}y$$&@b{H%IV&@JbR1d4$Y(` zK>`whlG8Ab)~1%EsYO}+huS8YaRzQ@nBhj4L9h|$-8{RRgO(hs+8IY*n@l`IdZl+t zE#wgGidK=d$`KWSPrI$p0=sHH{5MKKcozw;i+0yrpI{b{a@cycRD-_0m*RK|f>9EA zT;#lvTu%(|rtk*EiII+=oRLqnW41*5{2!X0xkSpy^&ktZ?SCsTd&mpi^E7;*^o8hWJWua_QknaoYx0DVRO=83NwL~MvPTNwY)8Ky(B zB&VhqdO`kYMYNhM1ou3gE)Y>ggHS~6TANx>b-1LZUoKHHl6;uO9`174Smh>`fd8y* zJ6$K}cy7Fmwwmv?-MYXuL|LuTzDE7121NlNU>-zOQmO3wE8!BFmne*qD0060M_Y#o zZn>Ni0ot4uwoyQ$(KZ|oVavVfVi@03-l3!h5Ha`!9E)j-EybkAQuWV&MY)u6Nb7)P z$NlXqd_Rd{(2V+H`;63k?XGl$uR2r_W{qs|XjuR7*%3;;Qop{eYg42j8k4oP4 zcHR6{wwgA8X#>^Xe0F|?Od?%`7ePC38PFP+{ARqDFpsckhD(^?6ncyBDz-84AaU8b zQv1PwTMmUw$f$C_0P(j02Idr$=x=9NZ~z2%bRA!9aI(PaC3Mov{fEXSv4Qb4h_=}U z^@CFx!CmPYlGkW(W$$D~DAhEZit@of`N*p?JuU}KfPV7Y2B3m=@CWN>3YS44UI#+R1XrV5E+MNwnb_y717n$Kuh(yZxxf%v|j-2CiM zXPAjUB^M{2o7kgN6nS1dL5{GRq}QN`+I?q!W1S50Ea)e_-iy3j1OXBg3blH}7r9>I zAAe~+tfk0bBw0U6PKbs9TLxaF8}@!-_AWg_3pyD9njAd4b?li(wv^kXOz+$gC=r^_ z(0Z>k8LV%nT)Ow?jZ^|s!_qSzZy%%Vz%4GaB=7v!k?M;vNy7p+K*!mc$-TWA7SW`dp?>Op z{c z9w{BN0s4cwJbLxmoAV`uI(X|~?M{}4T!1Ees5%>$P~`5#+3BQ|z%H zc!^6lAQ>dAD+ukLKgiRYkClW`GuD)j12e#dpaS`?`QRD!oeR+FYy@!ZD6MGLc>4zl ze*D9S#{`{DY#mg=36PJs_-&4;IJUMs&HNRReI-ep<0v@U4>IquUn$W`_89toOwJE! z^9PhbU6EE6$vrbo7F8HpvJK=!n2Bx;Rk*fuZ3TTFP>$*qQb92RVtzr2e>J!{qcMQo ztmXkK6FQRStQbDp&4XJgS|ex0dmZ^{Fsj%Qm#ig8`v8;h3F=K}g>H;)ZNTpkj1tBH zRM8Q|=?wU>kUZ}UFCrO9ydmoE5i3A5P5Vb9;b(t*n}{a5w3LIRFO!gE73%3c5|UVCfQC^nyf%>U^dKzxU|IhB$@=X9dp&3zjB!e*0JkGRwO4mCiF z?t6)r;ZA~*9T!sVK)ZKT`(i9^Cwm2DI878$zrkKH@E7FZ72s6vHL7S2J%c;zXFV!X&I@j)jVGYGUC4iJo7f;bPOn>FEKoAfB$QTz(iUj zLL{IEj2P+ahzRQ=U+*OVYS2za#oW1x!;>14I1N|N{|7{k_-fpZenACr^54-*I)pOf zgjItL(7j+fn|1>DCEs6yvC5=tT4h z4-^7tqRAwu2k0>R*4E<+Ewe!izIh4%|3`e8HkR*9-F5tT{t_HHjMfBZ15~c#8K4-l zg8Pad?)QTrQRm$uWyB7AfI7`{g3m9h+Fr_#f6S2)5tK8iz;W^g>tK-Ift!@}P=?^H zs0VlB=V>iyOF{k1ASKk$i1--pjypZUzOKd650Gx%ij;9&uuEI#?v=blgwK6&Ez zKBHI<)XCAOKBIgHpQFMV{o>{J|1w11+V)0Pn`PfXHWh9sVTgt*UR@ZC^6O#_J!OMZ9~a%-4GGZlO3MgEatRpE5-N literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/static.png b/venv/Lib/site-packages/pygame/examples/data/static.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3b0572ac41b9ad474d0f33efd38c638ef3ee1b GIT binary patch literal 1202 zcmV;j1Wo&iP)6j@JE;pPXVi z5JTnu<9%s`$ti{dF;p%ct@|H8ImK`whRXfN`_c-NQw#@Us9ZW)_dos)IDP+?^QJNc z0Uw{G{e8c#&vjFS?k;S_NfmH-POs&!3e*iaVFC`#sjD-S-^!eD0mtQZ{vs;=nw(4m zlGBJ*a?)56t`?nEEJg z(BKzow9lq%OpzHNb8G9EPk@<|(JrtCXq?8IK{%vK`+A>E9VDsP3WAzw^$9R>@=3)` zp~QT`=hiwliD-PNQ9619rPDKs6`ueDCu1hnjsabaz=`yzt*VTblj`TQiLQ9f3PcY6 z6ahFVZcQ37U|0g31<#3)$TxMQQ)HN!+O2l-+>{8L7_}w=ASb%wkph^o)>4Y+)Xqo3 zUPX%hN|Q~u-n5zcNfSm9!<=P^xp|Egji$1=YxIbyK2_K&@bTv*?ihwbV zH4$Q8E_W{)e|9Uk1Se>17$VXn0Lmw7)qw$kdtPfFLAAobGWbwqvPsA%q%oPlKq8!; zH6yWjh<&+vg9)4-&6yRn&%Z~~T6J&EjNrnqok!TLxq2kha?HxNe=KWpA~M@{CWMqe zjZ+8QgQ^s+KwCK>^^HE4I2xx*ZaU5do?#PIc>DC-u-`K^<#3^!BpHxT_0XmgMD`bk zeBw`H+L1TpWSEiB?aF!o|15e%q82KAR^*dhZ@J+@1Ze%HAQ;Kv7UZ2P*;R5ig%N>K7JZ&GQt!JW& zRI9CLrhAQRL2F*mHGw2lHJZ-D=O|oLUJonvpNvho0PZ#!kE+hC(ZgH^tM7}&X2G|^ zRlYz{?>+BXs6MHE2tZdeb=ay5fOYS(gs8*vYPDoizhiN1ZwEE(EtEQD6n|sC@8?psdo%41KM4CeRKrmQ+;kED6qV>S72$T$>ZQ@Oj!4ufB+w- zt7BYngP}Y=2{dx@9wQ=0_xX(AKyr%VKn#_cYRM^v12I%)J|(9Z4#ZHI`IMYuI1oc+ z=2LQt;Xn+PnNP_nh66EFWn+a07*qoM6N<$f)Q0S)&Kwi literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/whiff.wav b/venv/Lib/site-packages/pygame/examples/data/whiff.wav new file mode 100644 index 0000000000000000000000000000000000000000..3954efac71fd426ea235cc7414cff7239ad2e34e GIT binary patch literal 5850 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/yuv_1.pgm b/venv/Lib/site-packages/pygame/examples/data/yuv_1.pgm new file mode 100644 index 0000000..a59b383 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/data/yuv_1.pgm @@ -0,0 +1,6 @@ +P5 +752 864 +255 +€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                                   €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€     +              €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                             €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                                 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>Zideigcgffedcbbeeeeeeeedddddddd_adglortsuy~„ˆŒŽ’”˜£¨¬®º¹º¾ÄÇÉÈÏÙÁ§¸ÏÒÒÈÇÇÅÄÃÂÁ¼¹µ®¨¢ž›˜˜•Š†…‡xwyy{|w}~‚ytvtvrxuw{vwvvwwusrtutnnoligdgkkhhlnnoopppoononkjjd_crxqnrqqlihmnkkmklmnnnmlkghiiigfegggghhhhkgeedbdgeeeeeeeecegfeddeefilpsuwuw|ƒŒ’—™£¥©®³¸¼¾ÂÄÈÊÌÊÉÇÉÆÀ¸±«§¤ ˜”‘‰†€‚€|xvvxwwwz{{y~~|{yxwv{{{{{{{{vvuvvvvvxvuuwwvsstwyyuvwsoorsoquuttrponmusrmhlojflppnlifgmpqrlhioqrokhikstsniegisqmigiospqkcckqqnkd`hrnbQJC3,.,-OU>0444.&0>FO[T<3FRPMTZ[MKILQLDDMLIHHGDCFXZEBY_IAYeO8@Wa]][ZZZ[\^XRK<,*00259=98666=<>=97EW<%$#.@DSgkVKs¥©dC{ªˆ[_eQ<555512369;=?BEABDFHIIIHIJKLLLLPPQQRSSTTTUUVWWXZ[\]_`bbcccddeeegggffeeegghhiijjmmkjiiiikkllnnopnooppqqrpqrqpnljja`aWUcrvnmpxqN25=<<==?79521/--0**+++,,,)07;:89;CCDDGIKLNNNNNMMMRRRRRRRR€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=ctkhmjekkjigfddddddddddcccbbbbaeeddddcceeddddccbcdgilmnnoqvz‚Š”„{‘ŸŸ¦¬®²¸½ÃÇÉÐÐÐÐÏÏÏÏÊËËÇÂÁÄÇ°ƒjrxtrrtvvnuƒ}}}‚wx{wz{~{yxurtzspmmonifflnjglpqqrrsrrqponihjd`gnypntsrjgfkmhjononmlklmnkklmlkihjjkkklllokggfegkiiiiiiiigffgiigeggffeeddfecdefedhjloruwx~†•ž¥©ººº¼¿ÃÇÉÌÊÆÆÆÆÅÄÂÁ¿¸¯¦¡ž—•’ŽŠ‡„‚}}}}||||{{zzyxxx|{zz||{z|yvvxxurtwyzxwxzuppuursxuututttttstoinqidiorojfdgloqqjehorsohefimoolfdgksqmhehotqsmaakqomlc]fso`RKD2+1-0NY<0940(&1?GOaX60HUNIR[[ZVTVXSNPKIQQDDLJ?JPHFW\NL\d^M?DV]_\XZ\ZYbWNH9))41258;=>>?><:89;><9;?:5?QA''% /=CXacWJo¥¨fIv¡‹`[hT;534;89;>ABCDGJGHIJJIIIJKLNOPPPRRSTVWXXZZ[\]__`abbccddeccddeeffhhhhggggeffhijkkkkjjklmnoooooppplkkjiihh`_\ZVRONH??A;A]vrptswrM//5//.,0*.,*+0588579;>ACDDIOQONOQTSRRQRRRVVWXYZ[[`abcdefg€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bgvlkpnmqqponmlliiiiiiiiiihhggffhggggfffffghiijjiiiiiiiieffedcddcd_ahecknprtwz|}‡‰Ž“™Ÿ£¦­±µ¸º¿Èϼ[emhioomgd‡¦œ•œ•yrxvywxqr||vuvwyslopgilkgipspuuuuutssrogeg`\expntqsnjeilhmtrponmlmnnmmoonljimmmmnnnnplkkkkmplllllllljihjkkihllllllllonmllljigghijklljhebbcfhhimqw|€‚Ž’™£¬²µÈÌÒÖ×ØÚÛÐÒÑÊÀ¹¸º­«§¢œ—“‘ˆ‡…ƒ~}|~|z{|}{y}yyzzuqu…‚€‚|urrtutuxuuvvwwxxpptrmrtkfhnsogcfjmnnmgflnpqmhdegmookecgkppokhinrqsnfekolmnhafqpfQJH5/601PV;/61-(&4CHR`T12HTMGQ[^TILSOPWXY[b^QMTWKOPE?LSHGZ_SJGHLN[^XY[[Z_SJE9**302479::9<==<;;=>=77;95?OC*'##187BAAILMLIHJLMMMMMLKJPQSUVWWWWWXYZZ[[^^_``abbeeddcbbbcccdeeffffghiijjiijjklmmllkkllmnkjihfedcZYVSOLIHHGEBAABCB@LMJPPQVTOY`XSdeNBPQ>>Wc]Y[^bXSPI9((12358998748<>=:9999<=73@SD#() 2@CVgdSLq¤¤fG}¦‰b_fY??=9ADNOQSQMKLOKMNQRTTTSTVXYZ[[\]]]]^^^````aaaabbbbbcccccddefggdefhjlmnjjjkkkllgec`][YYUTROLJHFDDCBA@@?=>?AABAAFEIH@Ldojp{svvL)'.6R[QVVTgwvqqrqtttsssrrtojilnljmmlmmopqssrqponnlmnopqqr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gnxptuqsxusttsrroqsuurrwtrssqsurtqqsuwuqrqqsrppsqpsusmjkppqrolmphmnkhhjjmigihghliffhgdbcdeeeddegc_cgccgecbcfjors|pgghgjo\PKNPNJC<<=>?CFENQQLLJ5.B^`[\\`^TPI8)*0/14789:;<;9:<:9<9=<=;8DU@'&%!.:FTefSLq©¡cEz¦Ša]cVHB=:@GOTTTUTSSTRQSWZZYYWUZ_]\^^]]^_^^`cba`abcefdccdedegeeghhmojjihijhebfb][ZXSOOMJHHHGFBBAAA??DC@ACCDEDJKKMOPRSXX[ZTVesopurwuQ01:I_hghc]ntqstsvvwwwy{{z|xpkjjkmrnlnppprppqponpsqrqpopqr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gmyrvxutqtvtssttvxwtttrrutrrtwusstvvtttuurrtussusttrqpoorqstspquusqqpnnpsolllknrljjnqnjhnljiiihggjmjdgigfedcbcdedddddcddcdec^``[YVUVUSOKOKMNMX^UG@IVXEAb}ZOplKd“˜Œzvzvszpfiw~}yttsswxusqxwvwxxuqwtqqtspmqtqruttvrssrtvvtprsrqrrrquvwxut{vuuvsqtyvqsvtrsuvvvwvuuuwtqqsusqpqqpqsrnqoooommmjiikkjknhgeddfgigghmnnrw€…‹Ž“š¢±¬®²·À¹¤Š––‘˜ž|‹ž”–’Ž˜‹~w{~y{zz|yx||vpmkknleipsqoidgoqpomfdjrrplfdioprphdhmnpoibdlonlke_enj^UNK8-411IWA141.)'7DGVaM67MRNIM[W64MJ?ORLJV?1HJ79SD;745996;78;?@816IW]]XZ`TLE3(+213566777:=<8789;;:8=<4@UA%%&#,9GWhjXPtª dEz¥Šb]cVJIHHNRW\ZY[[ZYYYYXYZ]^^[\[\]^^^`a``^^^__`a`_beggfgiihghggif``b^`\VRPNMKLJHHHHFD??@CEDCDCCCEGFGJNMORSTVWXZ]`aa_^c`_\VXgvvppqywS39JXfklnjhqvy{{{~‚„‚…„€wljomknolmqspnoroorqoostrqrqprv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dn~wwvtwxwvxyyxvyxvwxutwxytrvvsrsuvtropruqortrqquvtpqvxwuttutqqtvtstvvtrpoqttrqqpnnrtspnrpnlllkinmmnnljgklkjhgijkfeggefhdefc``a_ec``c_[]^[\[UQPLQOQNONIOVPL]WHhŒˆzyyzup~x\Yv—£‰_YqŒ|}‰zjpuvtttsxwponqotvwwxwsurrrrsttssssssqsusvvxzvsvywwxwtuwxtvxvz{uvvwxwuwztvxwwwuqswxuuvrlwurprtsptpnqtrnmsqpooprsolklnmmnljjklijmqmoqt{~uyƒƒ{~…€u¨¯±»·´Ä“rrxy‡Ž‘‹‹™•ylonlmheoropiekopoonhflqopmeelpqtpgdflrsphaclrrmnh`frn_WMK9/312IWA141-)(6DJY_I4:NPNNS]V53KB:RTMUR46[Q7FWKLQNKLHDFHHGKPJ906IZ^Z\^QJC3(+0025677889:98:<96=;9<<6@SC$$'$+7HXggSLr¬¤dEz¦Ša]cXOQSW\\\a^\\]]]]Z\]ZZ[\[\^[Y]^\\aa`^_bca`figdddc`__`^ZWVTQQOMLJDFEDDEEDCCCCBBAAAFGIJKKLLNOOSWWWZVY__YX`hcdfgiijie\WUUZemrlnpwrT?AB@@@@BBCBBEGHJJKLNQUWVUYZX]]]`dcabhgihb_beggeddefgbUKMQ[ekqmpqtoS?J]]dnmnngceijjhdfghiijlnlmoomnompoooonmlpnlmqspknqrrstsq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€F{…wŠƒ~‡€i^gnkquwxz||}|z{zz|~{w{{{€}xxwrpsvurqurqruuuuyvvxxvvwwwvtuvwvsttttuuuuvvtrrstsstsssuwnstpnorutsrrsssrlpqpnnoplmliiknogejh`bif_`^\^\Z\[\ZY`^Y]XY`[\^[ckpppnmrk\UUUQU\YWY_[X`_UTWYZZYTNNQ[ƒ¡žœ ua_bagjjlkknqrrrstvwxyz{{‚€~~€y€ywz|yz|~~|{{}{~{wvx{~}{yz|ys{{{yyxxxw{{xx{}|}xvvvuvxvwz{{xvtuvvtssuutomoqqpqqnossqokroquxyzyodadaacbafijmllqst|tm|„€zoknmiijmopnnjhhoomnledlprqkfchqpqqkehqsqrlcagnpqme`gpnfWMK;1302NW>/64.%(;GJ[`E.9LRNHT`M7HVPQ>)F\B>ZdMEYWIFU^OEKGNbV;EO6,32/5?LW\NIB1)./13678899789;=:9;=74<=5?SA''%",9EUegUPv±©_F©‡\\h`WWWZa_\^`a_`a_Y\]^__^_a^]__][\[XVVVVRNKKKIECEFECAAA@>>?=@BA@?BFGHJLMNPPTVYZZ[^_]`ddcba`cbacfdabgdegecb`cddeffggcWNLP[myuoqpxuV/64-$)>HIZ_C.ATWRMW_K/;>8<2*EMFBFLOKEFNLHJIFKDN[N>KK4162112CXZMIC0*///136789:9<;89:::;85;<7ASA)'%!-9DVggTMt­¥_F€©‡[\h`XXUXacaaca^_bb^[[]_^[XYVRRRKJLMJGEFEDDFA@?>>>>>=<=@CDFIIKLNPOPTXY[\\]^`bccb```a`^_cb^]`]]]_cbadfcceefhhghhhhgffcWONR^nytpppxxX<[{mcnmljhkonknnilmlkmpoljpnknmjonoonnpqpopqqppppppprrsrr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<^ihrsmnsvshacjmlijpvutw}~„ˆ‘‘“Ÿ«ºÏÕÒÕÕÑÎÌÈ¿¿¸³¯­¬¨¢›•‘‡ƒ‚~~|z{|ysstspqw{{vxxvuvuswvttuuutuqtyxuusssstttttwrosvtpotrpqtoknlonnpmhfedcbacdb`agh`]ccgeabfa]blponprql_[^bb_`acaddaacfbaced_^`ba^^_^\Za]^`^^b__bb_]]]\\^]ZY[\\[\\`hjlqtsuy‚~y}€€€€€€„€}|||~€y|~}}}}z|~€|yy}{zzxvw{yyzzzyxxzzyvwzzv|xuuvuvxvyzwsrstns{|tsy{pollnlikplospmoqurkhjnk_ajqqpkffkprolgdfnpppnfgsqqokfdhnspolggmrqoicempomkfbirncTMK8.410LYA141,'->GJ[\@/EXTRX\]QC?=<8655:9416>=5=FA7;CDBAHLBAH@1.7/,6DU]XLJC/)//.036789:6;=;9878;<9;;9CRC(&&"+8DVeeQJpª¢aF}§ˆ^]f^YYTV`ccgfd_XTVXTRPNMLKJDCBA@ACDBBBA@?@@EBADDDGLMLNQSSUW\VOQZ^]`___^^_cf]^^^]]]^_\\_a`bdabcehhimogcefggehhgghijkaUMOV_krsruqusW=Y{i_rrnjjjjhikkhgklkjkmnmrnilonoqppqpoooprqopsspmopprtsq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<[d\]bcb````dfc^abcdhjjllrttwy|€„Ž™®ÊÔÎÎ×Ö×ÙØÖÖÙÛÚ×ÔÖØÕÏÎÉÆÅÄÀ¼»·¸ª•” Ÿ’“ˆ…†…‚}€zvvxyttutsstvwuxxtx|yprttttuvwxwuuvursxvqrsqqlmlmnjilmigeabee]__bcacffijfhf^boxqoqqsl][ckfacfgjbdiedfhcaeea`bb^`b`^^`^c^^`aeb^``^_bb_acdbabba]_ba`bddcdfhmqrqqkmsrtxyxy{~~|wx…“‘†šŸŸœ”Œ‰„€~€€{z{~|{z{}~{zww{€ztux||xuuvxvuwwsonrxxty~zqooqstronsqnrusqopoldjsfajqpmihjlsqmmhdimoookbdppopmdbjptvqhejnptupfcinpmme]dqpcXPI1'244IYE22-+)0>EJ\Z>1ATJK]]WT\ZSRPLOMOKHECBBB?:9;845;87726=3/153CX[[[YLH@+'0224677888:868;:77<;8<;6@RD&%(#*6FQdgVPu¬£cEz¦Ša]c^ZZTS]a`cee^K;9@EECAABA>BDA?BC@@ADEEEIKLKKOUUQSZVVX\]\[\`\WZba]^[^`a`^__`abccdefcfeceiieefeddbcggfhjfddeihhgghij_VQSV_ltsrurvvZCc„mapljmoooonlkkonmnmkmqpnpqpqqmprpllrutoqsqnnqttrpqqppq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€:]hcgdcjeadeadf^_db_cc_`cffghecffhnx…•—š™œ¡¥¨¬°¼»¾ÃÅÄÇÌÌÐÕ××ÖÖ×ØÝ͸¿ÕÚÏÎÊÆÄÄÁº´¹±ª¤ŸŸž˜‹‰‡ƒ‚~zyywz|vuywuvutvyusuvvywvrvutrmqurnnppooieeefgbbcbbfgfgjkecijg^epsoppqthabcegecddjnhchkhfgededaaa`bb]_cca``begfd_`aaabceedbcfdbedda`cc``a^`eeabhghgfgggklmkknllqhja]ÔÚ»²ÌãæáÝÙÓËÇÀ¸°ª¥£—Œ‹‰…‚|wx}{w}~~}€{z{}~|yw|||}zsnuzyvvxzpsusprtrutuwvssukrytjlogckoopmijiptqojdgpproifillophabjnqppmfhnnrsmcckpqole`emleVQM;*.20IWD166,$,FHI^X;0JWOHPVWUSWYUPQSUUSRSUUUUUVOLRPIIGBGFAA8-16JYa`Y[YOK=+(-/-25589:;988::9:;;;=>;5>RI)&+$)9BVbhVPz±§dFz£ˆa^c`XZZZ]^afeg_E25=?@BDDCB@CEGGGHKNNOQRSTTUWVXZ[XWX^]\Z\_`__^^`_]^baabcddb`fffeeeefdgiihghjffgggfedfiheeiiffghhggggcUPTV^ksxttnszbDe‹t`rrlmkmnmlmmmopqpnnpqqqonooonlqsoorrotqprrqqttrsuurpp€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=`jfigcfdadd`dheghdbdcbcdfedecabdcbcefedkiimnnpsyz}ƒ…†ŠŽ“™ž¢¦ª­´¹®¢¬ÄÍÊÎÎÏÒÖØØ×ÚßÝØØÕÏËÌÃÀÄÁ¶°³ª‡vƒz||}zwyzwwvxxvstzusrrusoroknolpnbkecjied]afiigcclgjlmjjcenqppsvsk`behgeeihgjllkihbdedcb``_ac`_egabbcdddddbdda`dghhgghhfghffccffccic`dfecddcegedffefdcdefg`ca_xœ¦œžÁåñíëííëììììêéçãßÚÖÑÊÁº´ª”Š‡ƒ‚€}{{}€{wvy}~|x{|{{|yup{‚~|}wzsrutuwuxxwvvvussvwpjqulfmqtvphgjnqpqnghpoqrlegpnonhbcjmrpkedhloqpjechnspmfbgongUQP=*,22IWD166,%4EHQeX:5K_]UX[YSFOVTONOPQPQUVUVYYWV\^XQOVVWVZWB19V_Z\[Y]YOK=,*.013349;87:<<::<<:<::<86BUD%"(")9CUbiWOx¯§dH}¦‡_^g`XYZZ_adhcgeN98?GHIJLMNOTTTRPRUXXWUUWXYYXWVVY\^^\^_]\^``acdcabcecdeeddgigeeigcdjgeccdfghefghgfeehhhigdfidefgghijcXQQS_mstrtrxx]Fb|mdomlmnmmppnnqlkoroopmoonooqqqtpnqsqpprootvtqpssssrssr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€?hpejlhgjhhgddfghdadhifddfecdedccbbceffeheeffdegfefgfcdfdeffghkmswsnv††Ž‘”™¢§ªª¹¿»ÀÇÈÄËÐÔØÙÒÐÙË”zˆ’’––Œˆ…¢³¡”œ—ƒ‡~uv€z{xvwsttvwsmielhecbfd`chjgehigkkhdd`dsxrptrokgbdmoheijkoljlikfefgfeff`efa_dgbdfgecaabafhfdffdhgiifjnmijklomihlihikjjjljklkkookkjhfhhfonifedgf]sŠ”™Ÿ¥¦©¬²¹ÀÆÉËÖØÝäìîíêðèÝÒÉÿ¼´µ³¯¨¡œ™˜”††‡x‚ƒ}}}wyŠ’‹†‰„yupsxusx~vy{ywv{z{zqiosmcjqqmljdinsqpmhlpssplfgopnongcgmrroiefkorojdejpsqngbgong[QJ;/33-IWE166-'2CGPcW90I`bYY[\WRX\YVUVUSRUXWSTX[TV\ZSSWRUPLYZD9Pc\X`]\]YNJ<,*/004558989789;<<;;878:73=NH)%)$)8BVcjVNv®¥fH}§‰__i`WYZ[`cfgdgaQFGITUVVXXYYWXXWVUWY\YWWY[[Z[]\YZ`dd[_dddddbaeggfgfceffffeddfffffeefeffeddgiegihgefffgihggikffhggghheXQOR_ntuuuqyx^N^fahpjoqlnonnnnnmlnnnoonooppqponpoqsrmmpppqtsqqsttrpqtus€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Amvlqpjorpoppnmosmjlnonmmmkijjiglkihgfddhfegfefheffgeeegjkkkhgedfigfgfdgjjjiijlnmryzy€†ƒ„–˜œ™š¤ }o}†‹’Ž•Š½ÜÀ­Â¡šŸ}[pŽ—““’““Œ¢ž{r}piozrcbbfiljhjjhmlefih_i†ˆpouqsnebbgijkkolpmlqnomiggfffdffgedfiifhiifffgjfgmldchkhkonkkmmmlmnonmmnnnnqqqmponoooqrpppnookopknnlrsllkjmpmgmmmnprtvwy}†Ž–™š¢ žž §®³·½ÅËÍÌÊÉÎÏËÿ½´¨€u{ƒƒ}zƒ’›š™˜‰uqttw|{wy||{||}{y{z|xqtvpijmoonkiiosqojflruqnlgeloopmfdksnoqmfgoqoqlcblsroleafnmf[QM>/12/JXF256.).>FRbV9-L^`[[\_\\][YYZVQVWX[YVTUWVY^YPPWZ\TLTWMN^^X[\WY^WMH;*+/0.36689:<779<<978;;:<;4;OI,&*%*7BWciVMv¬£hGy¥‰a_g_WZ]]bceffe^QPTUZZZZYYXXWYZ[ZZ[\_^^_bcb`befecdfgcdcbdgfdeecbcffeffggfeb`bbbbfihedfhheefidgiigffgfeeffghhefggghijaYSQSanqswvoyz`Q^YXkrmprmpqolmllptpnpnjmomlmnopqlnqrqoprpopstsrrrqruwvrp€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dnynrutxsrqrusrttqqqonpsvsrrrqpooopoonnnpmmnnmnpmnnkigggjhgefghhffffhddkgeccdefge`cigcdfgjhiokgnofbgkkllnirqo¨•„— ŽŠ‡iSt—–š›¡§¢«äÔz~½¼˜io¤‹¡¤l`Œ¡—r^etsmpnftŒroxqplb`ejjhlpooplntpmnhfghgfejhfgjkjiggghihhglihkkihiloooqqnmonnnopppnopoqsqmtwvqrsstpnpttttqpususptrrpnnpqpnmmkjjklljhgfghihhhhhhkorkpw~„‰Ž‘—¡ £¬¯­selokx£Ÿ™•™™Šw‰š•‡‰‡‚ˆ„‚||}|y|z€„{yrimlntqiijmppplehsqooodbkprrkcdkppmmicgmnkqoc^hsrpmfafnmf[QM?001.JYG256/+*+-9E:+,CMQVZZ\\\^_`dd`YZ[\Z[ZWSTY[[\SNRSUVRUWW_]Y^\VX\`VLG8)*/.02249;988:;99:978:8;=4:QC'"&$)7DVdkWLs¬¤fFx¢‡_^e^X]_`bbbgdfcWQW[\[ZYZZ\]^^^^_`bd__``aaaababdca`aedcabcb_dcbbbbdfffffeefgfbaegfedfeeegggfegjihfghlhgjjeeihhhggghiaZTORbpprurmyx]QaXXktklomllmmjijkpomqnmrqonorrsuppqqqpswpoprssrrusqrssst€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Djzusuutssqrrqqrrrrtuuuvvssutsssstttrrrttqpqpnnqpstsrtutsqmlkllljllmoljopnlkjjigijiiljghhkgcffcehfccefgjddhhcioifhkhiiablrpptsv~w„²ªit°¼¤s`–¨«ÎÄgT¦×Äœ`QŒ¯œsƒ°£„„ƒztvrnx~|||~xkotru{tloojdfifbcgjjjkkjkgfegikigfjljlomhmrokosrpppqsrsrpmqrrrtrnuvvtrvywsqswxwvutuuwxutsvuuuspqsppqqqpnnqqqrqrqqjmprrponjjigeegiejmklrwxmkmqlfm{†‡‰‹wŒ­·¯°®®»­‘yx||†‡‡‹‰}…‰ƒrjmomjfgkpqqkeimnoroeckqonkebhnpqngcdinoold`irqrohchpoh]PJ>210,JYG3560-+'#&,*(../.6;:==AFIKMQSRWZZZ\a_Z^b][`_Z\XX]]ZXX]]Z^]\`^cVLE6'*.-/3336765987679:;6869<5:PE*#'%*6DTenYKr¬§bFz ‚\]e_X\__babfdfcWTZ^_____```_`_``aaaccb`__`afa_beecc]befddca_bgieabfhdacgieaefggffedeghihhgfegijhhghjjjjhfgjkkjhffgheWQSU_mtusqq{v\T^YYjrjioomkmopnllmopmmnpqporromnorrrpqrsoprrqprtsttrqrtv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Chxttrsyvuuuwxxuxxuswxvwutvvtssrvwwurpqrvssssqqtpsussuwvstvyzvplpttqsrnmoqrrpoopptpikmjfinnhfhjiigggffhjdgjhghhefbbdfgfhfcbcec^bbciib_gmigZhoqƒ|[T{’ŒiGa™¥Žn|¢žwvxqqqs‡±¼½±µ¾œbw²¬{dbo~ŽˆŠƒtorpllmjimjhghlmkhmlnqpmnppnostpnqtqrrpqtsnrutuvwurrvxwvwuwwuvxxutzuttwyxyxvvyyuttuuvvvussqsuvvutssrrqqpooopqponoppqqomllkknpoqsngjqxzwrqrt{{{‚†Œ——|kmnjvŠ˜™š… ªžxhqqkjiflrsqidimnpqmggkpmlkedkskppjefmttnkfciqqrohchpohWPOB.*-0JZH3561/)--**,+)-+&()&(&'*+)*/477:=>CHKJSWVTY\[[__ddbb_ba_`a`\\bWLF6'*.,.3655667:767879<<:9:==DRI.&('*5CVdkWNu®¦`H{ž€]_d`WZ[\acfhff`UU]```bcb`_]``abba`_eca`````da_`bdddadecceghcegfdcfigc`ciic\_fifeiigdhlligghfgiijihhchiedgihiiihhhjldTPWZ^jsusuw~v]U^YZjrlkqmmmlnqplkkprooqnronopnmooopqsrokppqrrsrptrrssrtw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€I‡™‡‡†{vxwxz}€}uw~}xxvtvtuyyvwxutvwwutuwwttvvuvytwxtrstrsrrsvvusswsnrxwuotxxtqsuuprusqrrsopssrsuomqsmmqqnklljlkehgfgecedcbfcdfcfc`bc_^aa[[\[]]Y]ZZZZZWTWWXUTU[Zapnllomku„–•¤³ŽNu»¤\BO±ÑÍÅÏáÖ»®±ŸŽ“Š‚„„€}{ywrolqspmmoolptsqvwrxuutrswvssrtx{yvyz{}~xuyyzvtxyvvvx~{yytuzusvxwy|}|zwvuuuwxyywvuusstuvusprsutsrrronmopponoopqonqtnrwxxwtrl`]db\]bdbejjgkttx}yt|‚}wroqrkgijmrtskcftmmqmfglntuldglmnmnkfjrtonng_dorqmfbgongYOMA/+,-JZH356201/.-*')/%((,,++%)*(%$&&$#$&%%&)*,04559?ACGMNRVTW]^[__]a^XMF6'*/,03449;986899:=>>DADIKPX\C*"%&*5D[cfUR|°¢bHyœ€a`a`WWXYaekogebWRY`cccccba`aa`aabbab`_`bba_`deb`adegfcaaccaffedfiheceffffhiefggfedchgfffggggghijjihiiihhijijjjihijldZSOQaptuuwswt`WbZ[jsnlpnmnpommoonnooqrrpmlopoorpmovumlqrrronortrmox{vrs€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€U¤À°©‘y|}tkimqrttvwwwwvwx||vvzvuzxuspsuqptwvuvvxzwqswuqx|xttuuxvwtrxynssttttuurqswywuvwtutqsvsprssroptvsppqnnrpmonjmqmkjmmfehheggdege_a_``]]^[\Z\ZWZ[TWUVSRSRYlvuomoqhWRWZZZVVceaWP\w™šš°É½­»½¨®¸£ž¸º³·¾ºµ±«¢   š””˜†‚…ƒ|xuvuqpsspnquwwtrqx|€€ysx€xy{}yx~|}{}xyxr~wwwy||ywz{zyyyxwxxxyyxvt}xtsuwwvwttvvttvupsqqvtsrvwtruvolt{zwuuskjkljjkijkkjjkkjkfgiedaW[nsrqjhhknrurjfioqommjhkprpkhgioromicelpknldaipnqqfadkpi[QN@0,.1CVI799425332//0,-/.)(+..&)*((*)&'))&%''$(%$')'&'()+-0468??@CHLMLFA92-,-.34579:<93.+("),('0DXdiVNt¬¡fNu“‚c_ibWZ][addggheZT[da``a`_`bbabb``a^bcddddeggbaeeddebdffeffcgdcfgeefghfeghggfigfgihfhghijjhghhefkkggiigghiiijjjjihij`TRXZ`lrtttszt^Y^\Zktmmojnnlnonnpmmnnonkpqnntspqqsqoooorqqqrutrqvwussqqs€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€[¢Â¹°œˆƒ€‚wc[diejijjmnonvuutwz‡†……½Á·µ±¯°¯¬ªª¥Ÿž˜”‹‹‰…€~{yuvxxxywvuuttsssvvvspouzwqtyxrrttwywuuwxvvvuwwurxtyvstsutpqtrpppplklmkkmfiligkldccegha\^_[YVXWT\ormkouvlXQTVUWUVZZZYZ[_a]_]\a_ZZ\^^``VVe]^cdbehekmry~‡ŒŽ’•˜ ª­ª¤¦ž•™”œŸž©³¦“”——’Ž’™’†ˆ„ƒ‡~yƒ‹‡€€‚yy{}|zxxyy{}}{yy{~~~zxwy{sux{}|zxwwwx{|yuztwzxwstvwurqsuwttvxyx{snnpmmopompuuolmlpphejkfmmnstmjiioqomiggqssqmeemsrpjcdkpsspieejpqrlefknonldcinpfXQN>,,/-GYI3689;9458423311475/-./..//-,-*(''('()'++'%&'%'(+-..,,--.,+,15149?EKOR[\^_^\YVNLHB;4/,***)(%$"&!'*)*3GWfkVOx±¤hJq–…a]i`W\_^cgikgfd\W\aaaaa`^_bcabca`a`fcabdccddbddbacdfgecefghfdceffefgfggeegggghijhffghjihgggkhijgiljfikhefhhggilljkmdVQST_nuussqys_Y`]\lvopqtpnnopommllnqqpnrorsoqtsmqsrsporqoortutqotvuusru€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€?n~~wqqqqlc^cillmmmmoqrsvyyxz„‰ˆ…„ŸÆÐÉÊÈÉÌÍÌÍÏÈÈÍÐÉÃÄÆÀ¾¹´°®ª¨§¤¡—•‘ŽŠ‰‡…‚€~}xwwxuqsyvssxvqoquuwwtstvyrrwwyzwppzvpwvsstsqnpssnlkoolkmqllmighgbedef`Z^b[USYXSZosomoqodZRUUUWWYTUVY[\ZYWXZYY]_]^`_bfc_ccgiebehfddefffghcegfhklkmqokksurt€ˆ‰˜“…‹‹•“–¬Æ±œœ›£®•­Õȳ½ºª›˜“Œ‰ƒ€~~{yy{}}|{z{|}z|~}{{}z~~{yzzy~vuxvux|zw{{utuwmtyywwz{qmosrqrssrrtspopsurkfglnnossmhhgkmosqkhmnmkmojgnupmhcfmootrkgekupnmhdhlkmkcekpofXRP?+.1-GYJ67;;><57<946869842331-,-12/.0/-,/.+*,,,*))+)&,,,-./0125:?BFJLVY]a`]YVPNJE>70-))*))'&%%%%&&&&&%#$#(3F[gjUNx³©gIs™…_\i_X]a`filjhhe[V[bebaaa`_`cbbceb`cdccddcdfeddddedddfdcfffheddeffefedfgeefdgigghhghijjjgfffjhklffhehilkfhmnggikkklocWQQUborvtsrws^Xga[kvrstpjnrlmrpjsrpsolssqlloqppqoruqpqrpquupptupswxssvw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>^gacdee^aefdaabcdedcdgikiknqpruvwz}’±¾¿ÃÂÅÉÌÌÏÒËÎ×ÛÔÏÔÙØØØ×ÕÑÐÐÏÓÑÊÉÊÈÅÿ»¸´±°¥¨©¥¡ž˜‘ˆƒ€‚ƒvsyzvuvurprwxuswuyuqsrqsvwuutsrtnnrsmlorjjkigkmekicda^`a_ZWZVRajnkjmoqj[TXZYZXYZ[\\\[\\[Z^_[\^]b`_bhfa`aggbadggjjihggfelklmkhikjjkkljjibgifeggdgeeghkwƒs|z~ˆ€€ª×ɹÒÕüÁ¿½½¿¿¾¼¸²¯±°§—•‘ŽŒŒ‰„‚|yxxxyz}}xx|‚€zy}|{…zxzuwzusqvywwyzxsprutsuuxrrwxstzwxvleiqtqjkonmidimonmjiklmmnmffonmooihihoqmhhilromjebgmmpmgiprrjZRR@,/4.DYM:<==??89?<8:<;<:535766323424784221-.030.00.,,57;@EKORTVZ^`]XSROKE@952.,*'&%%%)*))'&$#(''&&%%%% $%%+4DZbeTMt¯¨fLzž†a`l`Z]_`cdgfilgYRZeecbccbbbcbbdeb`dacddddedcddbdedcaddeggegfccghddgeeggfhiefiifhjihjiihhhgggjhglkgijffhhjljkllihiklcUPUZdnpvrsqwr_Ye`\lwpppnkpqmqunrtnmutnpttrrssqrtnptspsutnnqswvrqsxxtsvv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€:`kbdjkgcfgecefecefecdehgcbeeccfabfgny}ƒˆ”—¢¤¦®´´·¼¿ÂÄÈÎÐÐÑÔÓÝÜÖØÜÜÚ×××××ØØØÙØÖÒÐÍÉÅÈÇÀº¸·µ·¥†v}‚~~|‚…{uwyu|{wuvy{vursvtpotqlnsvqjolkiehkihmlfcbaa`]WUZUQbornnoopiYT[_^]YXW[]^[[^aZX\`_^`a_`aeggffeiigjlmpklkkmpommkloollpnkknmllomifimmkifjjedhhdb]fdafdgt‚up„{y„ˆ–œ  ¢«¶¹·¶¹·´²µ¸¹´¯²¬¥£¤¢œ–””‘‰†}}{{|x{{{vy~srw|‚ƒ~|zsqqrruxxxvvyxwvwsxxlbmyuojpsnheghoqoljhgllikmiflppplechkoolhfgjosqg_bimpomgjmook\RRC-/4/AYO>?@?@@;=A?=?@><<=;78<;99997788533358;77;BDEIOUWY[[[YXUQLID?7242.+(''(+)%"!!#$&''&%#"!&%$$$%%&&!"!#+6EYbgYRu­¦cL}Ÿ„``ja[\_chfhiijfZT[dcbcddcdgd`becabbabbbcedaaefdcedeedddffgjfdeggedffggeeijggggjkhgjihghijihcgffjihkjghkjjiijlkhfjlleYQRWeqrtprswubZca^owonournnpsropqqonorupqwvonrroootwtrwsrtvwxxvostuwvuw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€9cm`affccghedgfcccdeffgfffggfdfigdfeddadbbdffegjiimprx{yƒ„Œ’•—šŸ©«ª¯´¶º¼¾ÂÆËÏÓÕÚÖÕ××ÖÚàÝÞÝÝßÜÙÝÆœƒ‰Ž‘•’™{oŠ‘Œys‚ƒ‚ƒ|uy}|yux}€{plmkjlmkkmjgikib__^`[TRZUPbvunnqqqj_WY[Z\\]d^YX\`a_ba`ab`^``cfedfgfkmjkpnknnonmotrnpooppppprpooooqsonooljntqrpkijmormoolllijdfhhgdecddcbcfhljmpomu€ƒƒ†—ž Ÿ¦©®°±³¶¸¸¹º¼»¶³²¯­¦£š”˜–ˆ…ƒ~|ttw‰•“’’ˆxttutsy|z|}wuxwsy{}rfsykhnrqmghglppnhdelsuqkdfqnomjihhjlmnjeelrssjadjlkmkfgihki]OPD--4/AYQ?AAACA>@B@ACB@?ACA==@8:<=>>=;>@BCEHJITUWWWVXZRQNJD=841-)%$$%&%'+--*'$$#""#$'(&&'''&%$(&%###$$#!,7F\gkZRw¯¥bHzŸ„_^gb[[_hmjkmjif^Y]ccccdcbcfdabdbaaabdeeddeffcbehdbdfdefffgheggffffdikjhijjkkgfijfgmihghjjjighmnighgdgjjihikfghhijmncZVTVertsostyucZhc_nwprurqonnmovrqrqnosspsqpsrqtqsssusruutssvurpuvssvwvw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€?hsijigfkjhffgggigefhgdadefgfggglfffghehgghifcdhhggedhidib^bffdefmmmqqqxz|„‰Ž’”˜Ÿ¤¦§«°²¼¼¼ÃÊÈÈÑ¿•‰’“—›žž¡š‹‹—ž¥¤ª¦zm“ž™£›‰‹˜™’š¡¸Å¤wxš–Ž…ysqolrtkddc^_[X[TSj…uqstun^VY[Z\[\X[_`^]]_ab^]bb`caefcagiclkhltpkpuvtrtxvpprqprvvrqsrqqstsmoqtsrsurjkvxolqppqsonspqlwtijmurollmoonsjehhc_`fdbabcccadinrw{~ƒ†Œ“—›¥¯°²°³²´¿¾šsx‚z}‚‡–›œžœŒy{~|zyx{}~~~{{zƒ€qw€uiinoqqgchmppnjghlrrolggnprnhedfmppqmeelqlmjcblqnnmhhgfkk]MOD,,2/BYQ@ABBEA@BCACECAEECACCB@CDDFLONPV[]]]XRTRME@=71,,*('&%%%&&%##$'%%%$$$$$$$$$$$$$%%&%$"! $#"!!#$%$"(+09AL[hjSKt®£fHy¡ˆb`hd[Z^gkeellmi]W]fgdcccbaaddccdb`cfdcddccdehgfffdegdegeeffffghgedeehihhfehhjjhiihikjiiiiihiijkjiihhlkijjikffhkjijmdXVYY`oytptvyubXea_r}urqosusnoqroqrstttuooprqstsprutqsvtturrwwtuzvuvwxxt€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ehrospnqpsromjlroliknnlnjijjjijmhglngfhe_dhhffghgfddffdcehkiecfieeffgghhdfhhggikehmqolmrtvx|€„‡‰snsy{{{„ƒ‡‡…Š’—”žœ‚yŽ¢¡ª¤”™¥ ºÆàúÙ‚|ÍÜÊÇÌÉ’s‘t\œº¡¡ž˜‘‰Œ„e]w tqzurv]XYWX\YY[W^\^_Wb^fe\`ecgejhcefgiiknorsrpuqqutprxttssuvusxsquvssvtuwwuvvronquursvnqrrsrqsppttpmopklnpqqrrrnggopljlmmmmnmlhjiffijhghijjihgjoprx{…yploqry„ŽŒ‰ˆŽ”‹x€œ©¤¢Ÿž¤Š~~€‚€}‚‚yy€vpmmrqiigpolmiekpsnkmgbgopolgcgoromjeelrolgcdjnklpkbcghg]UQE/+32>SQBDGCDABCDEEDDCFJMNOQRWY\^^][YUQKGC>950***'((#"$&'&%%%%$##$#"!%#$'%"#'&% !&"&##$%%$$#''(*+-27<>BCNTLJZghYNz°¨fG{¦‹c_ebZZ^gmihghkh[TYbkhbaffb_cddcbbcfddcbbeghcadgdcffgefiifefhffggghgeefggfgieghijhhjdiljgilogikiikllmmmlmlllhjkjhinr`WRU\fptwwwrvvd]he`n|utxsqsvsrsrrwwvvspsutvuprwwtuutttsptvuuwwvxwuvzzvuw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ao|ruzwsstttutrqsqprurprvplotvtrlloommppoomkijlmiklkihikjkkjihhieeeeeeeefeeeefeehecdgjifffeeefghgghfceihhffhgfhlklrvrmpw{uˆ|u~‡Š¢ÅßÀxu¹ÌÁÃÙÂ}‡¹kT¶îÓÎÏ×ÚÎÏàÌŽu‘ž‡rtwsrnRHq„\gstttnid]`]]bfe`febdhfdhmmosssuyrqstsqtyutstwxxvsvwtsuvttopvtpqvwvtssuvutuvutrppsqqstvwvwutuuuroqsppsropmpstsqnmlorqonoomnonmmnojkllkjkjlorpmlmlnrutu{~xx€…‰Œ›ž…mjorx˜ž’€‡›¢•|mmnkecgnnnojehqrokjgionknnfekoponlghmsokgffjmlpmdbilhd^TOD0-30;NOILJDGCDFIKMMNUTTX\\WRSQNID@<://-+)'%%%"#&%'(#&'''&%$# !"#$%$#" "! $!!$! &#$%),1578=??BIOQSZ^WWYNIXgj[Mw¯ªhK¦†]^j`XY_gmjlljkh[SYdgdegfffbcecbddcfgcadeeddebdgdcdcgfeeefggdeggehidfiiffiiegilifkmgghjljhiljjjkjiikmknplkmkgjlkhgilf\VTV_ltuutputc]jhcpzuuvrpruttutwtqquwtrtyxqovyutstvwttusuwyyxyxvwwvvwy{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Enyqtutxwwyxvuwvwutwzxtuuvxyxutvuwustuwzwuuttsssqstsrqstrqpoponmooooonnnqnllnnliikjhjlidijjjjiiiiilkgfhghgghiiiicedceedecbdddhkhhs~…~ee€………“…b{ŽiZ’±£¡£³¹´»ÎÁŽx‚pmyxvwj55~´¶Î·]o½Ä¸¼¨•ˆ{xŒxlzupvxxyupomptsqptxtuusrstuwuuvxyxwrwyusvyxqtvvxyyxy{yutwxuttvwwwuszxwvxywuyustxxtouyyxxurtstvusqrtnqturnpsrollnppoqlmnlnspoqrpmlmnls{ytt{}og`_aadhfigfhgiq{…~qx‰qnssmggklnppkghrqpmjgjntmljddlppmliefnsqpkeelqmnhbfppga_RMC1.2.ADHMMMNPSX[^\baYV\^[[fk^XWMJYhk[Lv®ªgH{§d`e`[^afjimkjkh\RW_efcbddcefaeiddhhabdefeefccefbcgjehhffhighgghhihgikjggjifiihjlhgllmljjklkkmmllnnmmmkjkkihljgggjklf[TUYdoussvtzwd]hfervswvsstsqquwtruusuxwywtuxwvzwussy}ztwwyxuuwwxwy{zxxz€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€]ŸµŸ†~|zsnottpwzxvy|{{zvvy}}{y{~zx{yux|zzzyuwzxvuvxxwvuuvvuuuvtttuuvvvtuwvutuvyvstttuvstuvwwxxqqsspoqqonoqpmkmrqqpnlkikkjlnljmifhllhghhfmdffdebfbb_Z^\\[WWYRR\koonknqdRMRNPdbK`€uvsuw‰¢°…k‹”¤¼ÊÉÊÍÉÄÊʳyBAÀËÀº½Á¾¹·±«¦¦£˜˜’Œ…ƒ„…„€~xw~|ww{zz|{wuvytuxvxytu{xtxzxxuvwwwvutwywuvvuyuuwzyvvzytruvuuwoswuroqtrrpossqrqstsrrpmlnuyxw|~zlhligjlnjjlkjkjjlof^egY]hqnooiemknqniijmplijgfmqnljhehopoojegmqpkheehmnnnf_elmmZRPE0+1/;KMBBA92/..,+(&%"&)'%#%'$#####$$"!!"%%&% "###! #""!!!! "#$%',2678:??AHMNRUVTUWZW`ea]\]]^`daY\b```____``ahg]Zac^dfeZYZPL\ikZMw®§hH|¨Žfaec[\`hmjkkkkf]Z`eedghffgfecaeiebfeddfedfihhfeghhffgijiggighjhhjkfjmmjjmmkhkkmplimljkmnnmmmkkmonnoomsvpkmmkkigfgkmgYPT_jpovuww|wc]nkfr{tstsvvsssrswwvuvutusvywvywqtwwuuxzywxxxyzz|yzzwx{yu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€U–°¤™…wz}}kalspsxtsy}xvz}{y{||||zttwx€‡…‡‡œ°¶³°°®«««ª¨¦©¥¡ ¡¡˜•”’ŒŠ‡†„‚~|y|yuruyyustwxxwtsvxzyvwywwwutwzyu{swztx|tuvwvsuwtxuqquututpnrxqrlloopgbhceZSVWPPYjklqpnmdRPSRRUUWSPQYUT\[\W\\Y]acbgfdgjloklmnnlheijihhijkmggoroosqqppt{}{…Œ›¶¹¢’š¬½ÂÃÌÚåÏÄÅËÏÝéååòïéîêÚÓÐËÄÀ½¸¯©ŸŸ›™š–Ž…€…‡‚~xzxuuxzxuwxvssvzwuwwrswvrxytswunptyxtv{|yojotrqsvsorwtptpnqmdhplfimnpmhjlnmmomiglnookggjmllmmihjkmnkfhmnqokfekqqslcclojg]SOF4/3-#$$&'%$(##$%%%$$"'('$#"!!"""### "%&&'*-7;::>BFNNSVTPPV\VZ_^ZWUVQ\db\\^^`bgbY\b_`_]\\^acblk^[eh`cjj\Z[PIZjm\Lt­©eH}§Šbdng^]ahmhhhgih_[_eggccfgefdggffhgehgfeffedghgefhgfgijjihjkkhlnikpmmmmklnmknkmomlmnpnllnqpmooonorqoomptrjiokhfhlonlaYTUXbnuvtvv{ub\kkdo{vttyxrpvyvtrtsswwvxtqtywvwvvwxxusvzwuxzxyzwuvwxyz{{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8_oggf_^^]]]_bdfdghghlljonnqtvvuqv|}}~ƒˆ‚……Š ¹¿µ·¹ºº¹¹»¼»»¼¼¼½½½¾½»¹·µ´³¹µ³²®¨¦§£¢Ÿ›˜”‘Š‡ƒ|{}{zyxwuvvxzzyx}|{zyy{|{uwvqtzxrquvsnp}xrqtrprvqommkjkf`_^ZXOKYloppntveUNQQSYWSS[WQYa\UYY\__`eldgiihhknponorsrqrolmrtspppmijnnjkmlhffebeegmrsmgmpux{€†Š‰ˆ‰™¤­²ÎßØÓáßÔÝÛ×ÖÙÞàÝÙÏÖÝÜÔÎÍÏÇÆþ¹³®¬£¢™™™‘…ˆ†ƒ~~z{{{zywvr‚y{|qsuƒ…€~yxprpnruuvmprrssroqrwobkwpflsrmkkiiklnnjhilqrmigimnrojhfhmlmokeflmpmjcakrmmohdgnrkZRNH:-)) &(#"! ""$$! !!!$$"$  %&&)+/51AABFMRUUSTVWUX\^[VVY[[]^[WY^Z\bb\[][ZbicY]cbfklbXZ`^dd]]^^eechf][cgebifZ\[NMYijXKy±ªdH|«Ž^`na\`bfkinkkni]ZdkiigikifhjgimlhhjiffjihhhfghijiihggfgihgjlljimomjkllknqpknqonolkpqjinponlomnonlmnmnnoppnmqkggfjmkcXRU[dovvuuvxu`^nkfrxqswssrsvutuzvstutuwuqquvwwutxzwuxzw}yzzutx{zxvy}zx}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<`j^_cadabcdca`^c__bb^^a\[[\_``_^^____``dbbcdekqlosuwy}€~…‰‰Ž˜œ™—šŸ¥¬²·¹½¼¾ÄÇÇÊÎÏÏÐÒÓÔÕÕ×ÒÒÙÚÕÕÛÔ¬Š†Œ‹‘’‹‰‰ŠŽ‹†„…„……‚„‚}{wyy|vuutzwtyvqtpqxsomghga[XYTNZkqmkmmniSQWWTWX[ZYXUVZ\Y]]_ccbdhhjllmortvtssuutrutrrrssspoosutrrorrpqstrusqoopqqtqoortsrmllmooom`gfchifgje`_cghgmoqtx|€‚‡Š—Ÿ¥©«µ»ÀÀÁÇÍÐÚÜÞáâââáåâßÚ×ÕÔÔ®x‚{v€Ž˜—’–”ˆt{}yxzzxyxvvy|zwxvytimuphlopomkiiloonigjmonjigilrrolhehorqkfhjmrsohcdimmmngehmqk_UVK/#&$! "%&$""%(***/56@@CJKQTVYWTW\Y\baZW[Z\bdaZXZ]]_`\XZ_\afd]_a]]ekd[]dbcgicZ^dbcb[[\^fgeki\Y`c^fnl][XJJ\klYKw¯§bH~«]`ob\`bgjinjknj^\ekjjhhkighggigeilffhiilkiggikkjihigjifjmlikoollkkmrljlnnmmnpnmonmportpmnpnmmmnnmmojnpnlkkjpnlihhklf[UW\dntxzyy~ybajihu{ruxtsrtutsussuxwttvtrtwvuwyxvxzyxz|{yxwtvzz{{ywzzy|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€9_mcdd_`cdefeecc`__bbabda``acdcb__^^__^^a`aec^\]abca^]]^_]^bdcdghjlorvxy…„†‘’•™¢¤¦©¬¯²³¼º»ÀÂÁÂÆȦ‰†ŒŽŽ‘”˜œ˜–—š£Ÿ›šœœ˜”š›•–žž—˜˜‰‹‰ž†|Ÿ–|Š™Œ„vjtwttihgb]YZSKUmnlmlmrnZQSTUYXW\WVYXZ[W][\_``cghkosttrrxwuvxywvvvuutuvwxsqtvttwuxwutwvtuusrqrtvvsqpqqqpuspqqsrqlnpnnqrntpkijkjijhfghigd\]`cegghkmnptz‚‘”š¢ª°´½½¿ÄÊÒØݯ|wŠt„¡®§ž••ž˜‹°·¦¥£›œŠxuz~€€~xrv}€xqoonnmgimoolfdhnpomjhginmmmjfhoopkggjklppjeeikmmnfehlpk[SSK1!% '3AJQOG=97?GHGLNTWXYVSVWZ[^a]Z]_YZbaYUYZ]ad`[Z]^_aa^Z\a^bgf__a^ainf[]bacfid^afehha``_dddmk_\egaflh\]\NL]mmYJv®¦bI}ªŒ_and\\ahnjklgjkb^elihjlhikkgfhjihfcfjigjkhhijkjhhhihhhjkllmjmmmmnnpopopqrplnonmooopmrsnlopmmrpmqqoqsqnmmpppikjhggild\UTYgswswuruwc_olgt{ttuusstussuuvxxvstwvwvuxzxxusuxyyxvvxwvxyyzz|~~z{zu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8`qjlmgggggfghjkdffefghfb`_`bcb``___aaa`Z_b_[Z]`\]__^^_a_[\ab_`d`_`__^_^[Y[_a`behhhijkklpuwx{„ƒshhnpsu}€‚~„‰Œ‰ˆŒ‘”’››•• £¡£¬²¹¯™¬t¼¸¯ÙÌ´yKFT[[RQLMKEEFJ]ojloilujWMPUX[WUXTVZ[\`ca]\^abeiginrvvusvttuwxwvxxyxxy{|{uswyxy{uwwtuvvtrsuuuuvwrsssrsuwvtttusqoqqsqosvqrppprrqookijmomkpppnmjhghfedccehfecbbcefkknry€‡‹qv}z{‚‘ŒŠ‰›—‚•ÀÒÊÏÐÎÕÑ£}tqlwžŸ¤–€ƒœªšxjrphhigknnlgfiplkoohgnomlkfcgnrnmlhgjmloleehlonmeehkol`UNMC2+0>Qkvw|‚k\MP\[UVUXY\b`[Y[[Z]a\Y^]YY^^YWZ[\`a_[]b``bc_[]b``eg`\^_`hnf\]cadehf`bfefgcdb`b`ipna]bb\^^WNWZKEYikXKx±ªdI|¨Žabkd[]`imjkpiii`]emghlmkkliljhiljjljjiikhgkiijjjjjkhgiklkmojlnllklooonllmnnpponoooonoooommomrplnnlmqnmnoonmkkjjnnllf]VTZfrvvvvstwg`smfpyuuuuttutttvvwvttuussxwtvzxtuuuuuyzvvvw{{uu}zvwxxx{|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>eskmojllkjjjmoqilkgfhgdhgefghfebcdedeffdgd^\ab``ab`][[\^_^\[[ZXYYYYYYYY][Z]\ZY\YYYYYYYYZ`_XW[[TXXWX[^\XY[]\ZZ\_]]]afihfkjfhotuw“¬¥|x…db““…¡±¡d41LQD784/.//,=drjlqhnud=5;@DINTgtpbeu~xsppponputrsuvvuxwvwxywvyxvvvxxxvtuy{{yxvyyxx{{yrsuxyywvuwxwuuwzwvtvwyyxtuusquwtttuuutrqzupnprrqoppqqqoooopplilqkkmmmkihkjhgghijinslozvqrx~|z}}vy‚ŠŒŒ— ¦…jfeev¦¥±§‡®´žwhtshfijmoomifiopppjdfpomlkffkqpmljdejlnpnfaflonleehjnlbYOPRKLYox††y|†‡†x`U^`ZYYYVY``ZY^\Z_c^[_[Z[^]ZY[]^ac`^`f`acc`\^cb`eha[]_]ekdZ\b`jikjdcecce``^XXTRUQG??=953./HYOJ[kkYKx°¨dI{§ccia\`cfkinolmi]\dikmkjlmiifkihkljiklkkkjikjjlllkkjhjkjgijijigjmnlmmlnpollnnnnljjjjnooopnnqqopqomookmprokikjjkllllkbXRV\fqxyuvxvud_omgrzuuuutuustvvuwwuuwwttuxywwwuwuwxwvy{wuwzyxzzxywwz{{}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€In{qrtprponmljjjpppnmllkonllmmljfhjiggikefd`bhf`cdeca_`a^^^^_____^][ZXWW[XWYXTTVTTTTTTTSX[[VUYXTPRSQRRPKKMOPPNMLJKLMNNMKOLMNNQTSPQ^bSQXOQVWal]R^YECPSGBGD97;9/9\hcehfnr^2)+,+4BQu’‹¢¾Åü¸µ¶´®¨¦¨£™—–“‘‹‰‡ˆ‡…ƒ‚{z{{ywz{zyyyvrxzzwwyywywvwywsnxxwvvvwxxvutvwwvwzwstwxwwwwwwwxyuvwxxvsprstttsrqsqrusnmprssrqnkipppooooosqqkntomqtttxxttte_`^\dkecbdfhnsxvzkt‚ysjjstkedjlmmlgdfhqtohehnooqohfikopnhehmollmidfmnnkdehjnla[VUY^l{}x}|nkv|ƒ‡rYYa^Z\^\\a`ZY^[[bha[__`dgd^]`^_ceb^_c`acc`\^cbcgha^_^gnsj^_daea`]SNMIGG@=70/+%'&# #=TNJ]mmYKv®¦bJ~§Œbcjb\`bgjinmkmi^]dhmokhklkkljhggefiikmkikljjlmmkjjjojknlijljlnmlijnkmmkknpnoqqolmnnmnlkpqonqmormmpnnnnnonmlljlkginodYSU[cnuxvwwyvc`pojsxrsrtuvtsvxwuvussuvuxstyzyyxstyzwvwvxwwvx~~vy|ytx}}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bhwnqtprpqstutsrtqqttqqtusrrrrqonqtrnlorjopkfhmnjkljhfghhbagf__e``______]ZY\[XXZ\[ZXVTRQRRRQQQQPOQQONOPOLKJJLMNNHJLNMLKKMIMOIJLHIJLIHHDEGHJJHHFCFMGCIKIIFFDADB::7/*(%$$ "!!%,' >TOLZjkXKx±©`K€©Š`cld\]ahnjkogfg`]emjkmliloliklifkokjgikhhklhjlkihjmjhikkmnlnnmnnlknqoopponnmoqomnqqprrqpkkpoopoklmjmoqqppmjidgjhkmic[SRWdpttywtyyeasofntrvwtuwtrwzwtsrtwywtuxvsuz{|wwxwvwyxx|zwy{yvxw{…ŠŒŠ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3JRLORSVSSUVXZ[\^]\^`bbaccdfhijkgijlmmmmllmnopqqoqsuuutsqppoonnnkkjhgeddgfdba_]\^^]]]\\\[ZYXVUTSTTTTTTTTLLLLLLMLNMLLKJIIJJJJKKKKHHIIIIIIGGGGGGGGGFEEEDB@F>?AA<9EV]Z^^^g\F=FGBFDAEIQZbimowx~…Š’˜ ¦¬²¶¸¹Â¾ÁËÏÍÐØÝÕÍÐÛáÞÙÐÑÓÐÊÃÀÀ·Àº¢–œ•“—”ª®—…Š‹‡Šˆƒˆ‰ƒz{~~xz~|y{wqqrtw{}{upwwwwwxxxursvwtsvutsqqrtutuuronqtosvtqopsprrttvwlmlv~vrw{tifkkiihgjlkkklkhjle^cg`^hopomhflpnjljfgqmmnkhhjlpqlfekpmkjigimnpnlhffjmrpe]dnolh`X`nppzyku‚sejp{…ƒt]X`Y^`^`iia`d]]fid___]diaXZ_adikhda`bcefaYUVQOJD=73032-$!  !"##&(# (+)*-1%:VPJ]mjVLx­¥dI}ªbbje[cecmqnnpmg_^glklliijlmlmiinnjkkkjjkmmlkljgkpoijljhlnllnjlppoolkmopnlkkpmmpqnmnpmopmmqtonqromnlnsrnopnmjeglkjlng[WXZanuuuupuvf_rlct{vsttuuwyvsvuuuuuuuusvz{{vuxwvuwzyvwyzxuuuwyw‚‹Œ…|xt€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+AF===;=>>>??@@ACBACEFFECCDEFGHIIJKLMMMMPQQRSTUUWY[^_``_ccdefghhgghijkklonnmmllkkkjigfeeccbba`__\\\]\\\\VVUTSRQQRRQPOONNLLKJIHGGIHGGEEDDFFFFFFFFDCCDEFDCA>>??:9HfkcgigleP>BEAFFD@ACEFFFEFFGJIHINRSW[^acdompy}~‡™–”š£«®®©´»¼¿ÇÊÇÅÊÁ­¦°¸·¾Á½Æáäʳ´¸¹¼¹¶¿Å³¦¨¦ £Ÿ—¥¼¹ž•›—ŠŒŠˆ‡‰‰ˆ‡~|xutvz|urqrsqrvtuwxxwvtruwxvuttvtrsuvspuysnrvqhft|xtuxyunptpmnnrpmlmmlkmmkc[enjelommkgfjnooogcisojmogcjnnmjffimpopmiilnkmlggknlnogagnmjpfYd|{mmsmvwfdkm€‡{gbf]]_]`hg`^_\_gha\]b`gnia_^]^^\UNIGB@?>7/**&%$" !!!!"#$&&'**)(&%$$%%!$,,)+,0$8UNH[ljWN{±ªdI|ªcbje]`dgklqpooma^hkmnlkkljgjjhgjmjghjighkkhmhgkmkkmlmkilooqojjmnoomkmmmnqpnqnmqqnmpmooqtropqoopnmnnrqnmnmklnkkljjmme[WY[erxvtvw{uddrlct|xuvuutuvttvsvyxvttuutvyxxvtvxxy{yutwz{yvvx{…‰upcXV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&@???>==<<:98:<==;::;;<<<<9:;<<;;:9::;<<==;<<==<;:DDDEEEFFHIJKMNPPSTTUVVWWUUVWYZ[[^^^^^^^^________``_^^\\[XXXWVUUUTTSRQPPOONNLLJJIJJKJKJJJGFFFFECA??>;<65HflacjeggV<=@AAABCCBAAEDEEC?@DAAABCDFGGFFFFEEFNNOOQTXZZcigjqsow{zrqzƒ…•—¦Âɵ£¥¯¶¿ÂÅ×äÊÆÏÍÅÉÎÑçëåÛ×ÕÐÏÇÈÊÏÒÒÐͽ·­£šš›’ŽŒ‡…†}zwuyxwutqmjsrrrrqqqtwtszwoniuvruvtwuopqmmpnnoprsromlori_grmgjmmjjkiiljhlkghoqpnkedmomljgehlpoomijnpmmlhcchojmjfjmkioibj}shmou}xf_ik{†„tee^[]]ahga_b_agf^WVXTUUNGA:6773/*('!  !!"#%&&'))',++*)(('(((''&&&%$#%)&&++/#7SMG\mkXP|²«dI|ªcbke^_cjjhrsmml^[hkkkkklnmkigikigikjgghihhijmmihlkglmlklmnpnmoqommmjknpnjloooomnppnrrpostqprqppqpoqqomoqnllmkjihjnmd[XWYdquytvw{ufgqjarzwvwvttuutuursuuttuwwwyywvvttvwwyzyxxw{{wy€„|ndb_]^_€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$8=79<9:==<<;::9;:9:<=<;<<;;;;;;<==>=<;;;;<<===>@@?>=<::99999999:;::9:997889:;;;???@@@AA?@@AABBCFFFGFGFFHIIJJJJKNNMMLLKKKLLLMMNNMNMNNNNNMMMMMMMMMLKJJHFDFFB=>85G]jb`hfglY=9D@<@D@@@@@@@?@?@CA?AECB@??@ACEFEDCDCBDEEDBCEHABCEEDCDDGHIGHIKIORXfkb[[dkvz’Ÿ‘Ž™ž¢°¹¾ÞçâÙßéèãåääçêííëêéçãÞØÒÎÊÈÈȶ­ª°®ª¦£ ŸŸœ—‘ŽŒ‹ˆ…|}}{yxy{xwz|{wmlu€ƒ€€~}tpmlmsvtostqoopppswn`htqbfqtljjbjqqnnkggnoqojhjmknqne`hsrolifhlmlmkedimnimkgjljjikpomxzjjmrwreajoz‚ugebaa`aa^WSRMJKH@851-,*$#""% !#$$&'''(()))++)(()++((''&&&&&&%%$$###&''((+.,1$7TMG_olYNz®§cH|ªccke^_cgjipolmm`\fimnmkiklmlkmnjfhmlhhllhimijjjjlljjmnnnmmnmmnonnopkjlqqonqosqlmssnqomlkproqqooqpnpqqpqrqnlkjiihkmnb[WVXervwutryxhdpkdtzvtwvtvxvwwuvtrruvvtvxvuxywvvxwwwxyzxyww~„~ul_[adhsƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&:=69;7788889899:878:;:988877666:;;<;;:9<<<=====:::999::6789:<==A@@>=<;:<<<<<;<;9999::;;7889:;<<99:9:9996677889988777766566788999999:9::>>?>?>?>BBAACB@>?>9573/@DBA@>>?@A>?@?ABCB?>>>>????>?@BAAAFCBBA>?C?DDBCCBBADBDB?GLGDKLOX]bz‘€•‘šª¿ÒàçéÝÜÚÙÙÚÛÝÞÞâççàÛÚàßÞÝÞàâãØÒÍÉÉÇÅ¿º´°¯­©¥‹y{zx~}zzŽ›”••‡nusoswvwsuurqrrppovqditofiopkijhjnopqjfjnmopjegnolkkigiopmlighlmllgabimmkmjfikjllowshpwmgiqumeehiu|~q[USKHEB=60+)&$#! ! !%##$%$#$')/)%&)(()++*)(''&(&%%$$$&##$$&&''##%&()*+,0348>:0/2&9UNH]mkVMx­¦cH|ªcclf\bcbjmkmookc_hllmmjjkmmkomimolknmlmlkkmkhhmomlnonljikorqommoqpnnpokklljjjiefffdhghfeinmtsqoqonqtsrqommkllkkmlmnf^ZXZesvsturyyg`qokz}utvsqsttuvsvutvxywuuwvtuvuuxwwxwwxyzyv{ƒ|njc^n~‚}{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(;?:@DA@;;<==???=;:;==<;==<<<<<<99:;;;:98899999965433334333333440000000033210/../012345623344556::::::::;;::9:99;;;;;;::==<<<<;;;;:9876655555555320100-+.+*)*)'.GdldfgfkmN018789:::;=?AB?>@CA?AEHGGGFGHHEEDEEDCDECABBB@>>B@;;:=<:;?9;====>>@@=AA=BCCCGB<>>EDJIFHHINNNRZhv€†}wtty„‘‘•£¦©®¹½ÃÊÐÕØÙÞßàäæèæåææåãààâ丆|ƒ€ƒˆ’–—™“–{{–™Žˆ†Š~tvyxvvuqxxjmxvqnmqtmfgmolkmicdjpqnhbdnlmmkfcholmnmiimosoicbeknmmgeikklpopruwupdhqtlfeeejw‰s>%)&###"#"%&$(*&&)(+++)&%&(*&$&&&&)%%%%%%%%!!#'(%$$)**,-./0:;>BEIKMPPQSY^N504&9UNHYjhVLy¯¨bG{©ddlf\cd`jnilpmia`hmmnlkklkhjolimnklpnmnliillmmmnomkonopmkkjikjhhgeebfgebdefjjiijlkjnpmkkjhhmnopqpoqqopqnkjkijjkmllnaYVX[guzutvuyvfdnlgw{wx~utsstwxvtuwvuuwystwwsuxxvstwwx{|yqy…~pig`^v‡Œ“Šu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&8;59=87667899::=;:;<=<:==>>>>>>:;<>>>>>=========<:87778<<;976545566778833210//.00/.,+**//000000000000005444444488888888;;;;;;;;>==;;:98:9:9:9:9;986630.)&,,(((,>ZjgiifjoZ4(.++-210../010025536:78899887=::>?;<@AAABCDCBDGE@BHG@BACEEA>=>==>>>?>@@=BA;<;>9:9?C=>CC>>A@?AEGHGCCDEFFFFKHHLOOSWY\bhnrtv„‰—¢¦©¯·ÀÂÂÇÔàµz…ˆˆ£¬ ”‘”’ƒpŸÊÐÄʾ¯¼¾˜xrsqzŠ˜•ŽttŽ˜{iosleffproolggkqpkigfknookfdhmmnomigijmniackmholfekljkpnjn{‚zpgorojdadgcmˆy<#'"" " '&%%'*-.,$#(&$$$)*+)'%&'(&&''$&*"#$&(*+,//4:=;;>>>========<<::;<>@>>=<<;::========;;;:9998777666556666555511111111.//12344222223330123456756666666555555556544431/+(22(')+4MbfijehnfA03.0675310011101320151234420/5006612713454445;758;<<;::=AB@=;FCCCABEF@BAGF@A?CBCACD>@:@BA?96==<;=?@?=B@>;;<>@?=>BCAACA@???ACDEHJIHJOTTY^`bgqymVXX[ddrt~|z‚ƒte‘ÃÊÁÓͽÎÞ©|spk º·¿²‰ƒ§Ã¶€eoqlkgknmnqkfhmnrqjfjpprrlfehllkjiffggjkjedinookefmnjiqqnktƒklxrhhb^gedctx^LHUKE;-()%(&(4GVZW@0),+(()%'((&$$$$%(++),1568;>ACDEBBED@@B\\\[ZZYYYZZ[\]^^`ZY[[\R?.2$7RKE_pmYOz¯¨aG{©ddmf^_bggenplnna]hklnmjhikkkjjkijjjijkkjkmnnmmmidbcfaacbbdcdda`gjgeghhgffhigcdkliilmdahqvvqikqtpnnnppponqpjkolfhllleZVZ\es{wtutywe`rmfv|vrsuwtruvsrvvvuuuvvvusuwustvvwxxywr|qrŽyqt{¤¾Ì·¢€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&:@::;;>==>==<::9;;::==;===<<<;;;><;=:79=;99;;97<::<<::<988:967;<:89;<;9;;::9988987666667655557777777777766799758998544555656565887766657996688535899642022//.*%+BelggeiqfD,48103467876586568987;88;:88:876667895555666643333333332124422235668<;<>?@AAADEFEDEGIEEGIHFFIDEEDBABD@A@>>@?>?==?>;<@@=<=@A?<==<;>AA?=?@?><<<;;=:79:7ACDEEBBBA?;8621.-.&&=VZ[]YVYWW]]UKEFLY^ZZ_ZL9*2*6SOEVplVLx®]Hƒ¬‹bcnc_dd`ciqpnqpb\gmlnonllmnmkikolhjljmolkljkliddeef`acefhihgcdjllmnps{{€‹ƒŠ“™ššœŸ ¢¤—‚wtrmlppkmuoqqopqmgpkhjljijfXSSZhryzzvxxtefmofsyutwtuwyxuvywvvvvxxvtuwwvuuuwqyxxysx„ukšÕÇ ›¨ž±ÕèìèÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!3:6764645678888;77<<99=;==::<<9;><;=;8:>>===>=<;<;;:;:::;<;::;;9888999899::;;<<;;:999::98776789666666668886558:5677667966666666877766654664355245676532455322.)'AakijhdphI./5211233443334555556655665567899987644567899888999::8::99;<;;9997457;9754689986557:=88888:<=:>??=<::>?><=:;;83550:UjhbgnooW?>>=====<;::;==>:<<:;<<9<:88:;:9;879:9:<<:;==:;>@AA?BFEADEEDCCCBB>?DFCCEBBCEJMF6:VkibekmiN<:<:84:987764224/WqoXLx³©`G«Žfdji]^_chijmkmne^gkomllnnmkkjjiiknnllmkikopk`]baXTWg~– ¤©«©³»¶´½À½À¾Â¾ÂÉÉÃÇÆÅÅÅÅÅÆÈÆÉÌÊÈÈÈ·}nprrprnnqrnllkmlikopmfXUU[gpvwytuyzicttjuzsqtuvvttuwvrqsvvvvsuvwwwxz{{{y{|vwzy|žÆàÍ´ËÊ©®Õèèê퀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%48676268887643247644774799768867889998835775579688779977::979998:;;989;:::998887777789:::9:9:::;;;;;;;;:99;<<:79:;;99:;::9:9:::777666666766565565332334232001.*06Jhldjkin\;)063432223562344334658866997;:876677899::;;;99::;<<=<>=:89:9667888:=999:9::;?>=>@A@>?@@@BCB?EDCCCCBA>?AB@>?B@>>>=;=?=<::;><9::::;;9798:>?=>CAADJRWH11RkmjkmlhYQTUMFEHB?CDBBGE?9@\Y@Onlkopkedkkhkokfjmlllhbelpomkedhonkjjfcgnmlhcaglklnjeji\Z`^^XJED>4@NV[][XYY\bdaWPMEFPZepw‚„wikpx„…‹‹ˆa:$#&%&'''%%&''&&%+)'&%&'(((&'+%&?USJMRKOZN3).)&)(*':W[XQ<)1)0MKB\rkVLz²¦bIªŒeend]accimsmjmpc]fjikllkklnmkjhglokhklkloniefjfUSnŽ¤®¹¿ÂÆÅÃÇÈÄÆÌÈÃÈÈÿÀÃÅÅÅÆÂÀÂÆÈÆÄÄÆÉÇÁÂÉÍÔ¾—{trptpnossplkklkjknnmg\YXZfoxwxuuyxgcrtjvzutywvuwwvwyuvwutwvqvwwvtsrrxvzyqrxx„œª¿æà¼Ç˪­Ôéìí퀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&594665966766543623562254223310243566554458765797679:9:;8899967:79;:879;8877665598889:;;99999999;;;;;;;;><:9;<=<;<==;;<=<<<<<<<<99::::::87777666764223452320120,05Ihleljhpb?-17365433568765689878;;9:==:<;:998:::::;<<==;;;;;;;;9::9<;;;:9:=;;;::::::86679:9=:99;;<<:<>??=<<>BDCBBDEDDEFECBCBBCA@????>>??>=<;;<;97898:;:@G?+3WpoihjniVKMPLIGDCBBFJMMPNPM[aLIQconomhbfjmmmfdkpnopkefjknpme`emnjijjgjnomidbgkjjjecojUMRNMPOF=:INXekkhfnlntvroneZVZ_ehdkx~{unp|…‰†ƒ€e?"''"$,+$''(((('&('%$$%&'*)((+$%>\SHKNMQQ?35<6+))+&,EZ]P8'1+1NOJ^rkVKv®£`Jƒ«‹cepb]cdbfmtrokje_ellkjkmmmkmmmjgklgikjimpkbaghZUr£ÂÌÆÂÄÇÇÉÌËÆÃÄÅÄÅÈÏÉÇÊÉÃÀÁÅÂÀÀÃÅÅÄÇÅÄÂÀÅËËË˼—wrwsrqomoqqnljjkkikmeWTTZfouttrtuq``tsht|xvytsuwwuvxxwwvuvvspswyzyxx{xztzxx±¬¿ëÙ¹ÊΨªÓëìëꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€2FLFEGGJEEEDCBA@==<=<<;<:6599448546755645666566753377669:89;:78<::;;:9:;7778899:887778997889998899999999:<<<::;=9;<<<<=?<<<<<<<<<<<<<===<;:<;:9;<;98899:67644752+8Sjjkmdhq_>/45254444566:878:<:89::::<=<;<=>>><<==<<<<;;<<<<<;;;=<:9:=<:<;;<;9;=<<;<;<<=<<;;<<<<=;:<;:9::;<;99:;;<;89<<;;;<=<<<====>>??@=>?@?=>@==<=@CDCCILNU[J.0SjkkmmphPEF@=<688646<=<<;>DZ^B/?^qolmkgjpqqnfcjolnojdfkmoolgegjmnlhdgikpmjechkjloe`szaNMKJPUPOZedefdchorljotuw{sup^VemcY`kw|xuy‚‹‹…‹†pB(")$$)$&&())*))%&%&')**''%'*$&>YWRTURL=/457;8-'+)$8WbO3(2,2PRM\snZJr«¤]I…¯ddne^ab`ehmqnllc]ekmnonkkkmlnnifhkilmkjmlf_f\\gyœ¾ËÅÀ¿ÆÇÃÄÉËÊÈÅÃÆÇÁÃÃÄÅÄÄÃÄÆÆÄÂÂÄÈÌÈÄÃÃÄÈËÉÀÅÒ½…ounoqpopsqmljiljhingVPS^msvyzx{{veeyufs|zuuquwvtvvvwvvutwwtwxyyyyz{tx|qryxˆ«®¤ÂéѸÎש§Õîêè뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6Q\SRTTTUUUUTRQPORRNNQQMNKKNMJJLHFHIFEGCA@??@@?>:999:99988998789876778764455667788766677889::9888888888869;<:8898:;;::;<;;;;;;;;99::;;;;=;:<<99;;;:9999977645774);^lhmmbjoX6/4423455665588889999878::::<:;<>>>>=::;<=>>????@@@@@>?><=??>@???><=?><:99;>@?ABCBA@@?@BCCBBB>??@????>=<<=<:7??><;;<=;:99;=<:89:;:9;>:88;>@ACKLJISZF%1RgilmiifTNPKEDB@=:9<@DFKD^WKMRI9+'+,,2=:-%)&2N[P9-2)3SRJ[ro]Nt¬¥bKƒ«‹dfqjbccdhjnolqrc]hlpnlkmlkhglmkjjjjiklnnhcefZo—©°¿ÌÅÁÁþÀÄÄÇÅÂÄÅ¿ÆÇÆÃÃÄÄÂÄÃÂÁÂÄÈËÍÇÃÁ¿ÂÆÇÅ¿ÐÏ¢yponoqrtspljjkkjjlohZWZblprvxvxzwebzvgs{xttswzwttvwwwxwvxxtwwvuttvxp{}rpt„¦¶§ž½ç×·ÁÓ¤¡Ïëèå怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1Q`WTWUSSTUWXYYYZXWYXVVWXXXXWWVWWTVWSSTPVTRRTTRPNPPLKMLIGJKHGIJICA@ACCB@A@@@?>>><<;:999:89:;;:988888888897557887:;;976669999999955666777854763363333221144312541-<<<<<===;<<=>??@=@@?>?AB>==>=<=@AAA@?=<;>@@?>=?@ACCA?@AAEDCDDDB@CA@AA??@>@A@@???=@@=<=>=?====<=?;99==;>DCHJJSYE$+Qhhfgipl^NKNF>A>>;8;CGFFHBI\^I3@aurnlhgonjlplgkmkopgaekhnqlgillklkfdfikmkheejnlplcdshI?BDO\bcefbdfhjmnmmmmnqtvwwy||iaX]dfrƒˆƒ‡‰†„†‹c;-*)&!''())(('&'()('%$((&'*#$=\YQVT9(*(#,+ /?4&*!(F_V812%4TPE]qm^Sz¯¥bI‚¬Žgfmf^abbgjnllllc]dlpnmmnnlkdijjmmjkommmi`bn_Z}¯¾¹¿ÈÃÁÀÀÀÁÂÃÈÈÁ¿ÅÁ½ÄÄÄÅÇÈÆÁ½ÆÃÀÁÅÇÆÄĽ¼ÀÃÆÇÆÈÂÅÊ·wvsomqrqpqgkmkjmpqfZWVXdoyuwuvzzgavvjtyutxwxyxtpsxuprxyvuwruxzzzyy{|uty|ª²©«ÃåÖ´ÅÍ¥¤Ïìïë倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€-GNGJLIKKKLLMMNNRQPPPQSTRTUSPPSVVYYVVYYVUXWUUYZXWYZXX[\ZXXXXXXXXSSTTUUUVSSRRQPPPOONMLKKJDIKHEEECFCBCB>=?DA?>??>=<;=>=?AA?=<<==;;=<;??<>A><;:<:;>><;<9;=>?>=?AAABEAADFDBABBAACDC@BCCA>=>@A@@A?==?GBFLPSD'(Ihjeeejj]OPMA@@;7349?BBA=9AZ`C,:arnqndclommmieiljmngchmkoqkdchklmkfeikkpkgecgmoloedgTBALW_dd^^gd_`fjpsnnkmstrtzw{‚z|‚‚zi[\ckv‚‡‡†Š„…‘‡pQ9.& (')+)%&,#')(''('%(('*%&?:<@=;;;::::987623553346,/Qllkkjfm^B56786679<=<:9;;88;;9;;;;<<<<>>===<<<>==<;:98;:9:<=<;<:9;>?><>=;:<::=<8:<;;<=>>;77:=<9:;<;;99AA?=;;<=;;<=><<><97:<=<==<;;<=<9>??=;;>=<>B@DKMQ[N-)Hkrkkjml_QROEDD=;9:Y\^X?((+#(++4;8<4(%%9ZS6-6+5QLE^qkZPy±¨_H«Žgfli\^caflrpomld_gnikmnnlllmjjmmkjlgknkbiug[­ÂÅÅÃŽ¿ÃÆÄÂÂÄÐÊÀ¼ÀÃÁÀÆþ¼ÁÈÈÄÆÅÄÄÅÅÄÂÂÇÉÆÁÁÄÆÉÉÂÈά~mvrprrommpmlnopopdZWZ^frx}ttu{yifrpgt{yxwsuvwtuwxvvwwwwxx|uotzxtuvzrq{‰ž«¥ªªÁçÙ¹ÃÅ¥¦Óíééꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€7QXQUVSUUTSRPONNMNOQQPONLKJJKKKLLJIIIIJLGHJLLIGFHFFHHFEHJKKKJJKKMMMMNNNNMNOPRSTUUUVWYYZ[\YX[]][Y[[[[\^^\]^_]Z[]`_]^__[YZ^[ZZYWVXWWXVUSTTTOQRPOQQKKKKKIHGFFGECABB34SnmggkemnW;362333577647898899788888999:::99988<<<<<;;;<::;<=<;===<<;==>=::;:9=;8:<;;<==>=::=>=<<<<<<<<=;:<>>;8=<<<;;>A@=;<====<;;;<>=;;=?><999;:<>?>@DEJOLN[R4$=dogfijobSQMA?>:999;>DHEC@E[^C.:[ponmhclonllgchpoopkcckmmomfcinnmiddgjjliihegigjgcs|eU\fdca_bffcgd^ajqrrolmswuquuxyz€{{„ywoc_q€†…††…ˆ†ƒ†…r[3%$*)'*'&*+'&()(#&'&(#$><<<;;;::;;;;<<<<;=>=;:;=8:;<::;><<:;=;9=:8:><;;:878<<:9:::9::;<=<<;<>>=;99:;;9:<;;;=>>=>??=;<<<;;<=::=@@@ADGINMOWM1';aoegmoqdUSNECB;::;=AEHEECI\`E29]spmkgfiljkmjgjkpqnjeekllmkdchmmoniefjnlqkabhkloiap|m_b[_ggbdgcbb]^cflwsnmswuqotx{{|€‚€‚„‡…€{lYXn€ƒ{vy€ƒ…ˆ‹Œf='*(&()")+(&))'%&%%*%%:X`XE/&*(*),3?;,,<0*&5XZ9%0&6URM_rkZPy±§hK¬eeoi_cd`ekoqsqmdaimlmljknmihlmjhilmkqp`cqjb£¶ÃÇ¿ÂÅÆÁÂÉÆÀÄÏËÂÁÄÃÅÇÄÂÃÄÅÅÄÀ½¼ÁÅÇÇÈľÅÃÂÁÃÄÄÃÅÈÂÃÏÇ¡}usrssqnlnlmonkmrd\YZ^htyxy|wyvgf|vgrwuuvtrsuuwvsssuwxwuryzxwyxvv~qly‡’¡«¹´ªÀæѱÆͨ¢Íìîíꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6PXQUUPQRRSTUVVWSSRRRSTURUWVTRTVTTVZZVTTYVUWWTTVUXXUUXXUUUUUUTUUTTTSTSTSTTTSSRRRQQQOONMMPNOPNJKOLQSOLMOPLKKMOONMNLLNPPRUSSSRRTUUVX[ZYX[]_\]\Z\_]``aaa`_^```abbccdWT[hpjejfgfefhdfeca`_``Z[\^^\[ZYYYXXWWWQQQPPPPOOONMLKJJGHIGECDEA@@BDCA>>?>?@=:<:7:=;998:7687669::989:;<8;?>;:<;:;;:=ABCHHKVL/*=cqijprqeUQMDCA<:8:@DGGLJHL_`E2:atonkegjkijnkgikmlkjfdimnnicchkjjifeeghinh`djjipj^h}zk_X_ikedeabeb^dintqnmoponosxzz|€€‚‡‰‚ƒx^GRk„{{‚{€…ˆˆŠŽ’‹l=&,+&+*$#()$$()(&&-*(;X`T=-)*#',79:920:3*%6[^8(2(6SOJ`rlZOx°§_E}©‹bdqh`ed`eloqpnkc`gkmlkjlmkiojilonkigliZjtgyž§³ÆźÂÆÇÃÂÄÆÃÆÌÑÅÂÃÁÂÆżÀÅÇÅÃÂÃÃÇÅÀÁÇÈÃÁÃÃÂÆÊÉÄÈÌŽÅÈ«„wurpqqpnnlmnnknrc]ZZ]iuxvy{tyyifxpdu|vsuxxwvwvuuzwtrsuwwuxxwxvssymm|™¡§µ¶®ÁèÙ¶ÁĦ¦Ñëêê耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6QYTWYTUTTTUUUUVTSRQQSUVTTTUUUTSVUTTTTUVVTSSSRSUXVUXWTTWWTQSVXURVVUVUUUUVVVVWWWWWXWXWXWWZZZYVTUXSWYVRQSTVSQQTVVURQQSROMNPQPNMNOMNOOOMMMNPOPPMQSPSTTUUUTSUTSUVWVUWSQSbngbabehe_\_`bddcbbbfdeggedfccdeffggddddcccba```__^^`^\\]][ZZZZ[ZYVTSSRSSOLNPLLLIFGFEFC?=?@?@@>=<<<<;<>??>==A=;;<;;AFILILZR3&>bpjkllodSMHA?<<97:@FGFGEBH\`C/;/**/63'%<]\6'2(6TPK`slZOx°¦]F‚¬cdnb^egbhnprpmleagmpnllkjijmnppnlkkqme`pnj”¯­ºÉÀ»ÇÈÄÂÀÁÂÄÅÆÆÁÂÈÇÅÅÆÂÃÅÆÃÁÃÇÉÊľ¿ÅľÁÆÇÃÂÄÿÀÆļÂʲˆwvroorqomljjlnmlb]ZY\iuwvxytywjozobu|uru~|uruvsuwwvvvuttrtwzzuu|{lp…–š«³²±Éëس¼Å¦¤Íéëê怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3NXTYZVWVVVVVVVVTTTTTUUVWWWXYXWVZYVSSVYZUVWVWXWVZWVXWTSUWUTTVWVTWWWVVVUUUUVVWXXYXXXXYYZZ^^][Z[\\[YXYYWVWZ[\]^]\Z^\]``]\]\]\YY[[Y[ZZZ[[ZYWX[ZX[]XTTUUUUTTWUSSTSQOUOFDWgc_imsrcPMTRTWWVUUVXUTVVTUXZZ[\\]^^a```____bbbcccddfdcdffedbdggedeggfdcebbehdcd`^^]_`_\[\[YWVUSRQQPTPLKLMKIIGGGFDBBBCB@?@A@>><9899998655677668;;:;=BFMLMVK-(DfolmkklbRLIDDA<;;>CGIJDA>E^bG1<^oknmeclomlmieijmpmgeimnnmiddilgkmjecioklojcinjongrŠ~f]`djnmkljhheabionrqljnqotzzy|~}~‚€ƒ†„‡rZTey…‡‚ƒ‚„‡ˆ……‡‰‚U*")%)+)'3A=-$''&)$%<[cQ7+*+$*8>/&))*63$(E_W4&0'6TQLaslZOx¯¦bL…®hgme`ec^gpspnmld_gnmllnoljipmhhmrpjoma`mgr£·°ÁËÁÀÇÈÀÁÂÁÁÂÄÆÈ¿ÅËÇÂÃÉÅÄÅÄÂÂÅÆÃÀÀÅÇÅÀ¿ÂÃÁÀÁ¼ÃÄ¿ÅѺŒvvtpqsrmnpnkmrrma]YW[iuvzwur{yjnscrytsvyvrswxusyywvuvwx{wtx{xuy|ls‹—¨¶®®ÈâδÃɦ Éèíì倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€7R[VYZUVVVVWWXXYUVWXYXWVSVYYVUUWSWYXXYWSSWZYY[ZVTVWUUXXVVY\ZWVX[XXXWWWVVWWWXXXXXYYYYYYYY[[YWX]]Y^XUY\[XWYZ[ZXXY[_\[\[Z[^[^^[\`a_^]\^acb`Y[^^\_`Z_`aaaa```_]]__]\`_XQ\iimplpqcVW]WXXVSSUWXTSUTSTXQQQQQQQQSSSSRRRRTTTSRQQQTVWXWXY[\[YZ[\\[b`]]``bhb`dhgfgfiggiighjjjjihgffdddcaaabca`_\ZZ]Z\\ZXWVTWWTQOOONLLKJHGEDGEDCA?@CHHNQPSJ5,IgkkmkmkaPIE@@<78:<>BEHGB>E]bD-:[nlkkgckppnlgekqlmoiehlomkicbgklkjihilomihgegkkqg]p“œ‡k^_^aggipvssndclrlmmmlklmq{~{zz{€{ƒ‡€ˆ‡‰r_\ey†…†‡„…Œ‹…‰‹‡rO3)*/',L`N.&,.,,%)C\eR6)(,)5:5+,+%-95#-N`T5*4)5RNHaslZOx¯¥bJ¨kkpebhf`fmnppome`ipqnlmnmjgjijlnlkjon^gtez´º®ÀÊÄÄÃÅ¿ÂÅÆÃÁÄÉÁÄÅÈÉÀ¾ÉÇÂÁÆÉÈÅÄÉ¿ÄÊÊÇÅÃÂÁÁÂÃÄÅÇÉÇÀÆÔ¿tvusstqkiopjinpm`\YWZhtux{|vzvfk{rcrzxwxvtvwuvwuuvwwvuvwyyvsuvvymix–‚y‘¡š˜¨¾·¬¾Ã§¦Îéëë怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€9TUOTUUTTUWTXXRVURRVWUTURWXUSVYYUUVVVVVVXVUVXYXUYYXXWWVVVVWWXYZZ]WUVWUUWXVVXXVW[ZVY[Y[\WTWYYWVWX[^_ZVY[VY[\[XWXYZ^_\ZZYV[\]]]]\[`_]]][_ha`_]]]]][afe`]`dZ[]^`bcd`i_RZfikjmnkgeeg``````aaaaa`_^^^^^^^^^^^[[[ZZZZZ[TQRTUUSQQQSUUSQQRRSRRQPSRQQQQRRUUUUUUUUYZZ[\]]^aaaaaaaaedcbbcdejjiihggglllkkkjjiihhggffeedcbbaa_^][YXWVZVTY_^VM@MfmjolimaVPLFBA=>@BDFHHHICFY`K0:Wmolmjcmprsphdfnmmlhfhlrokhhhgflnkffhkoiffc_dlmtk^o— ˆxiebadhjksutohfkpkkmpnhjprz{vw{‚‚ƒ„……‰‚wojjz…„„†‰‹ˆ………ˆˆe7'',*"4YcF 'AC0 "?]bN8.)+,;<.#*)&.;1$6X`O715)4TTL\poZP}°¥aJ¨‹gipibfeaiprrqokc]cnkomknqmhkimpmllgplZlznŠ´¶­ÂÌƼ¾ÅÂÀÃÆľÀÆÇÂÃÊÌÆÂÄÄÁÁÄÆÄÃÃÈÆÃÂÄÆÆÄÄÇÿÄÇÆÅÆÆÃÂÍб†sqppqqpnmmkimstqeWW]WWktv{wxvijyqew€{xyuwywvyzuvvustwwvutquurz~rn}”™„s~„‰‡‹’Žš¼¿œ Éâèë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bjwplgin_\`]WTQYWYZZXVW[XWUTUXWUXWWWVVVVWVVWXYYXVVVUUUTTWWWWVVVUTUUWXZXU]YVWY[]_ZWWXUY__]YUUVXXWY_a]XZ[YZZ[[Z[[\Y]^\[]\Y_````__^Z[\]][[]\[[[[\]][_ba]Z[]baaa``__[c^Yaknrkhfec`adccccccccccccbbbbaabcdeef\\]_`bcdba`ce`^edcbbbba`cb`_]\\\WXZ\[[YXTTTTTTTTRRRRRRQQSSSSSSSSXWVUUVWXUVWXYZ[\[\]^`abcfffeedddddeffghhggghijjkjigffgffZWfnmmjmqg__`_^^XXWVVUTTYWMJX`O;AUlrlklhiiijkhdfponnlhgilnlgdfiigkmhchnlkjhecgklokbr—¥•‰nicbdinpkorqmlossrsvrljltyzwy~|€‚ƒ„………ƒ„~ohp|‡ƒƒ‰‡ˆŒ‡ƒ‹zG'#) ;[Z@, )E@*$)9XdX?*'4;=0#%,+*0@,(CZ]Q715)4USK]qpZP}¯¤bI€©‹ghqg`ed`gnpopqmcbilomjjnonookkkhknmpi]otm’¹¶·ÇÆÄÇÇÅÇÅÆÊÈÂÃÈÉÁÄÊÅÁÅÈÀÁÅÆÄÄÅÃÄÅÄÂÄÈÇÂÁÉÅÀÆÉÅÈÆÁÂÅÈͶwusrrqomonlhjnnkcXX[V]p}sx{w|vfj~vhw|vuxtvvuutsruvvwxxwvvvswwt{mh}’’Œ†ˆ“Š†‘Žu±½ž¨Òèëì退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Z¢›“Ž•¡‡stxspmnsqmkmpolfgigc`chdcba``abccba^\\\^^^^]]]]YYXVUTSRWXVRUZ[XSUVUSUWYRS[]XVXVWWXZ\[XUV[\ZZ\^_[[[[^^^^[^_]^`_\___^^]]\^___``_\^^_`abbc]^```^^^aa`^]\[[\_[Yafinsnkkhb`a________\\]]]]^^`aabbccc``abdeff^ea]ega_`abccbccacefgfedccccdeffffffffffgffedcba````````]\[ZZ[\]YYYXXXXXQQRTUWXXZZZYYXXWTUVVWXYYXYZ[]_``ba`][\_b[Wellnnsnf`bfgghhggggfffdh`V[cd`\^jqljkelnnpqlhhnnmjhhjjmlkidbfmolifchlkllhdfikmijeoœ’ˆyohghklgmuxvssssrtxzwutvxyyz}~}€€‚ƒ„„…‰…ƒviis‚ˆŽŒƒ…ŽŽˆ‚Œ†`<))/=5)'*))06:&2U\XR904)5TSJ]qpZP|¯¤bH€©Œfhrg`ec_gnpspqlbdmnomiilllnmjkkjlonoi^nrr›¿¼·ÂÃÄÂÁÃÃÀÁÆÆÃÃÇÈÄ¿ÃÆÁ¿ÇÉÄÁÀÁÃÅÂÉÄÁÅÊÉÄÀ¿ÁÅÆÅÃÇËÆÁÆÄÁË»tsrrttsrrqnkknnlb[YWVcu{uxxwydj|sgw~xuwsvuuwurtvuvwxurpwxuxxu|nj…–˜•—”•¡¢“¼¼ ¬Öêëìꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Z¡—’š©”tt~{{z‚€{x{}||z|{yy|zywvvx{|}€~}{{{{zzzzxxvvtsrrlmmllnkgdfgfipvxnt~wpnjghhfbabec`VQUYXY[YXYZ\ZYY\[ZZ]ZVXXYZ[]_`a_^]\ab\``abbbaa[\]_aba_______^_e`[^ekmpmopnhb^]aaaa```__``aabbb``__^]]\ccba``__X_^]__]a`bddddegeeedca_]`_^^_acdbbbbbbbbgffeedddgggggggghgfeefghffedcbaabbaaa`````__^^]][ZYYXWVVVVVWWWWWVUSSTUTSCMbebjkkh_YZ[ZXXZZ[\]^__[b_X\dgheagpmjgchmoolhdejlnmiegjqmjjgdfkqoifhiilomhbbfiighcgzƒvilf_[[]_`hmqutuvywusvyyvsyxy{|||~€€‚ƒ„„ˆ„…‰s`fy‚‰‰…„…‡‰ˆ‡ˆva<*4GW^V@3+CP6%%(@\a[H21>:*+-+&*14.,D`\VS;/4)4TRI]qp[P|¯£bHªŒfgrhafdahoqtpqofcilmpomoqomjjkmmnnnmj\kwz Á»ºÄÂÄÆÄÅÄÁÁÅÆÄÃÅÉÃÁÄÆÅÅÆÅÄÅÈÈÄÂÄ¿ÂÈÊÆÄÇÃÅÉÇÂÈÊÁÄÈÉÁ¿ÍºŠwusrsrpnonmlmoqqe]XWXgwyzwvwzeizpcu€|xwvwwwxvst}ywxxvuuuxuxwu{|poŒš’¥œ’–—¢°«¬Á½ž¨Òæéê耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€]’ ’‹“¡mtƒ{vzƒ…‚}z}~|{}}z{~}|{}†‰‡ŠŒŒŒŽ‘ŽŽŽŽŽŽŽŽŒ‘Ž‹‰’ˆ‹—©¸À¾¾ÃÀ¶³··±±°«§£¤¥¥“xltuomponmmlkjhhgdefb\a`_^^_ab]Z`d`ab[``aa`][Y\[[\]\ZX^^^^^^^^b\[`gjjfhnqjb__^``__^]]]bbbbcccc``______aa`_^]\\_ab```bbccc`]\\^_acdc`[YXY[]^]\[___________``aab````````cba``abcabcdeffghggggfffiiihhggfihhgfeeddddccbaaa_^^````KUjlhljhd\VWXVSSVVVVUUUTTTOO\aWLSZgpqkggimnkkhgjpnprkcckmomhfiifjomhghkmmkhc_ekijhcdmjXF?<::Z_]P916/(*('+-.06CT^ZZU;.3)5TRH^rp[P|®£bI€©Œfhqhaed`hoqrqpmgdglnqqpqpljkkkkmnopli^oy~¥Â¹½ÉÃÅÈÇÆÆÂÂÅÇÆÄÅÇÆÅÃÂÁÂÄÄÄÁÂÆ¿Å¿ÀÄÈÈÆÄÂÇÉÄÄÇÆ¿ÃÈÇ¿Æ϶Šusqqqqomkjjjkmorj]XXZgvw|www|wgktds|xvwuuwwvvvswttwxwutswuvvtzyip™–›Ÿœ§ š©¼³°Ä¾¥Ðæéé䀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€\–¦—’Ž“¡‹kp{uw{‚{y{|{x|~€€{z}‚zyvvy…‰‰Š‹Œ‹ŒŽŠŠ‹‹‹ŒŒŒŠŠ‹ŒŒŽŽ’‘“‘’”’“•›©ÁÖÛØØÕÎÑÙÛÔÔÔÖØ×ÓÐÚÀ™Œ—š‘››–””–šš–”•–‘ŠŒŠˆ††‡‰Š~~Ÿ–Œ…€|xuxyywsolklkjihgfeabimjljcknmicaacddcba``____^^]]]]]^^_`aa]]^^^__`ba_]_hkfbdeda]ZXTVY\`cde]]]^]^]]]]]]]]]]ZZ[\]^__________a`_^^_`a^^____``[[\^_`abccbbaaa`bbbddeffaabccdeeffecbdgj_\jsqqnqleadhgeedddcbbaaa^VVaf]UV^gpsngflonllkhgmoolhfgihlmighihkjkjfgkjihheaiolnifgf[G81/,**(&#.5@MXaehwyyy|€€}z{{{{}}}€‚‚ƒƒ„„‡†„„yeep~†…„‡Œ„‹ˆ†‡‡{a<5_dA"*68WY7!%>Z^\WE50*''&*+).=P[\XX^V:-2(5TQG_rq[P|®¢aJ¨‹hipf_db^fmonsqhdfjnnmlopkilillmoolnmecvu{ªÃº¸ÅÇÅÁÁÆÃÀÁÄÆÅÄÅÆÊÆÄÉÄ¿ÃÃÅÂÂÇÆÀ¿ÄÄÆÈÆÃÄÇÇÄÅÉÉÈÇÅÁÃÁÁËϵ‘rpopqrqonmlmlknrl]WY[gtxzw{xxshm}uhvzttxtsuvtvxutssvywtqrwvvutyvdrŽœ›œ ¨ŸžµÅ³¬Ã¿Ÿ§Óêíê €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€X•¦—•‘“ Žps„„~{~‚ƒ„„€}‚€~|}~~{~|ywz€ˆ………‡ŠŒ‰ŠŠŠ‹‹ŒŒ‹‹ŒŽŽ‹Œ“–“Œ”–’–¯ÍÕÑÒÑÎÐÕÔÏÌÊËÏÓÔÔ×¼•‰™”•œ¡¤ š—šž­¬©§ª¬§Ÿžžž¡¦ª­««ÇÝÑÁ¿½¿ÀÂþº·º½¿½·²²´§¦¦¥¥¤¤¤¤¨¨“uihaidk~‰†„ˆ‚‚€~}}|vutrqonnjjihgfedaabbbbcc]]`fg`\_fgijkiebd`ZVW\dhba_]\\^^^^^^^^^^^^______________dcbaabcdba`_^]\\[\]^`abb___^^]]]]]^_`aab[\]_`bcda```abcc[Vdkkmmrib_beca`ddefghhijjd_chjldaempmhcmqpnomifekokhiigjkmlhdgmnhhkjiihlkidcjnjnhgh_M>72.+)(('%*(')2?LS`hpswz{wy}~zz{~€‚ƒƒˆ‡ˆ‡t\_m€‰†ƒ„„‡‡‰‡ƒ}l9(FcY7$9<-N];!'AV^`_P714*',/),AT`aZWY^T9,1)6TPF_sq[P{­¢_Kƒ¦‰ikof_cb^fmokqslefjklkloqnmrjnnnqoklrfcwsz«Ä·µÅÆÃÃÆÆÅÃÃÅÅÿÀÆÉÆÂÁÀÁÃÃÃÃÄÃÆÂÂÈÊÇÅÇÇÃÃÃÄÉǼÁÃÄÀÄͺ“wurrqqnlqooomknsj\WX[gvywy{vxtfkysiwzstyxvuutttuywtsuwvsryxwvvzvfv”žœžž¡žœ¥ÄÔ½±ÆÁ¡©Ôéëë瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€^™¦––’’œ…px‡„|{„ƒ€‚ƒ~~~‚‚}yz|{~{wux~…ŠŒŠ‰‰Œ‹‰‰‰‰Š‹‹‹ŒŠŠ‹‹ŒŽ‘ˆ”ŒŠ”ªÅ×ÒÑÑÍÏÑÎÒÔÕÔÑÏÏÐØ¿™Ÿ—š˜Ÿ¤¡™–š¡§¦£¢¦©¤œ¤¢ žž £¥¨¦ÃÝμ¾ÁÁÄÇÉÈÅ¿ÇÍÒÑÌÊÍÑÁÂÃÅÇÉÊËÍÔϪ|owwkcy«ÊÊÆÍÉÉÈÇÅÄÃÿ¿½»¸¶µ´³±®©¥ ›™™˜–”“’‘”‰rba_^dliggilmnmliea^[Zffffdb`_^^^^^^^^^^]\[ZZY________`_^]]^_`^^^_``aa`____^^^\\\[[ZZZa``_^]\\^^_`abcdea`fmng^V]nmhoqrslfggc^\]]^_`bcc`b\Y]`_``ZbmliieioolkllmjjnpkdfonoolgfimlmhehjlonmgacjlkleefV@67/+&$%')))&#"%)-/4DU`hpspxyy€€z~~€‚ƒƒ‡ƒ…†ƒ…†~rd^k}‡Š‹ƒƒ‰Œ~~„s=-LcQ/#?7&G^E%#@\\W^\E772+./*=X_`ZVZZYQ9+1(6TPF_sq[P{­¢^L„¦ˆjlng`ec`gnpqptodbjmoqpoolijoqlilllqwi_ru{¨Å¹µÅÅÁÃÆÄÂÂÂÃÃÂÂÂÁÂÁÅɽÅÈÀÂÇÄÄÇÄÁÂÃÅÆÆĽÆÈÃÀÀÁÄÁÉ;¸Ì¿Žutrrstrpmllmlimrg\WWYhwyw{ys|xeh|tgtxsuzwussurqwxwuuwzxts{yyww{whx•œ•š›§Ÿ¨Íݾ¯ÉãªÐãçì쀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€bž¯ š”—¢‡ou†ƒzxˆ‚€†‰ƒ~~€€€~y~z{{y}†‰‰‡‰Ž‘Š‹’”’ŽŠ‹ŽŠ…‰‘Š‰‰‘“Ž‘’‘¢ÁÌÏÐÏÎÎÌÈÑÔÔÒÒÔÐÉÔ½–Ž˜•˜ –ž¤¡š—œ¡¥¥£¡£¦¤Ÿ¤¦¡ŸŸ §­©¿ÓÊÀ¼±¹Âü¼Ã¹¿¾ÁÆÈÇĽ¹¼¿¾ÄÌËÈÐȨ†vvzuj~³Ø×ÍÌÖØØÖÙÝÚÓÓÖÖÒÒÖÕÒ×ÙÒÏÕÔÏÓËÈÍÏÌÐØÙÛ©lZbbdggffimlloonkhfdccYe¦³£‘y‰ˆ‰Š‚‡˜‘wmx|wzz|Š‹„‚‚qhtljj_\cad```__^^]^^^^^^^^\\\\\\\\\]]]]\]^Z`c_bb\^fchkgqsZ]flqmlvty€|qlg_\Z_^X\gh_cib`b`aaZXgnkjghikifhjiinmlkiffhkooifhjhjnkeehhjlhgebgmkpmh]J;52**)((())''(('%$##.9FUcmpuz}}~€„„‚‚„‡…ƒƒ†ˆ‡…‚vd_rˆŒ„‰ˆŽ‘‚{wN8LeH%-B0!IcF'&=Z^UV\WK>46516IWT[^YSY\P?03-2RMGatqZNz­¢cI§‹hipi]bd_aisrqsocalsplknpmigknlkmlkmqe]u|}¥Â¸¸ÃÆÆÁÃÈÇÀÁÇÅÁÃÉÄ»ÁÇÀÀÅÄȾÂÈÅÂÅÈÅÂÁÃÇÇÃÁÆÅÀÁÅÇÆ¿ÂĿƽ’uyururnqklllmmnnd][Z[ivutzywytclviuyvvuvvvussvyyyyzxutuvxwxuv{thrŽ™—Ÿ§©­¦§Çܹ¥ÄĤ¦Ìåêêꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€^žµ©£š˜¡st…‡~„ˆ…ƒ‚‚ƒ~ƒ‚€}}€€}|||z‡Š†ŠŠ†„‡ˆ‡‰ŒŽŽŒŠŠ’Ž‡†Œ‘ŽŠ‡‰“ŒŠ‹‘¦ÇÓÐÏÓÓÐÐÔÍÏÑÔÖ×ÔÏÔ½–˜—›¤›œŸ¡š ª©©§¤¥§¥ £¦£Ÿ ¡£«ª¦½ÕÊ»¹¸¹Á¼¼ÂÁ¹»¿ÂÃÁÂÅÉÀ¼¿ÂÁÇÏÎÆÌʽ­Ÿ’ˆzl´ÕÐÊÒÒÐÐÓÕÔÑÐÍÌÌÍÍÌÌÍÎÐËÊÒÓÐÔÌÑÓÏÎÕØÕ«vW]c`afgjijlnmopnligfeeg\vÅöÞ½¹ÁÏØÖÊÐàÔ±§²··¿ÄÊÝÞÕÑÍ»¯»¾·ªˆwŠ–—‹ˆ†„„€}yuqnmkkjiggeeeb``bb`]]_`]]aaadiilokd\eqsqiemntxtnnlea[]_``chlcljie_cd\_iloqjffloonhdelmnnjfgjnolgcfijqkghiffkhhjidgllnleWF:40*)(((()*(((('&$#$!)9EUgw}~€~{…„ƒ†…‡†„…‰‰†‰€rgl}†…„ˆŠŒ…|bET`<-AF)'K_G($C]\VWW[\M:8997=BBOV][Z_V?.1,3TOI^qoYO|°¥`K„«Œgfjg^df`cjqqpspc_hprnlmpolilnlknmkmud]y€}¤Æ¸·ÅÈÆÅÈÈǾ¿ÉÈÀ¿ÄȾ½ÄÅÄÅÈÇ¿ÁÁÀÁÃËÄÁÀÂÉÌÈÂÊÆÀÄÅÅÊÂÆÈþËÁtwtqsqmpoonmlkkkd\XWYiy{tzzz|wckƒtduzuvxxvuvxwutyvtuvvvvswx{xwzqiw”œ–ž¨®·®¬ËÞ»§Æ¾¢¦Êãêë退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€c£¸«¦žž©˜uq‡…„…„„‚ƒƒƒ‚‚~zz~}||zy~ˆŠ‹‹‡ˆ‰ŒŽŠ‡Š‰ŠŒ‘‹‹ŽŽ‹Œ‘’–’”‘ ÀÎÕÔÊËÖÙÒÊÊÍÓ×ÕÑÏÕ¾–‹–—œ¤¤ž ŸšŸ©«¬©¦¦§¥ ¢¥¡ž ¡¤«®ªÂØɲ²¹¸¿À»»À¿¸µ¼Â¿¾ÅËÀ¼¿ÂÁÇÏÎÆÈËÌÐÏȾ´¤§¿ÎËÌ×ÑËËÑÓÎÌÍÒÎÎÒÓÎÎÓÏÏÊÉÎÎÌÍÔÍÖÔËÜÖ¤bV`b]bffhlkikmllqomkihggo`[Ýà·²¾ËÙÞÖÛêßƼÅÊÏÚáéçêçêïãÞììéâ·žÀÛÕÐÐÏÏÎÍÍÍÉÈÆÃÀ½»º»¹·²¯«¨§§¡œ¡¢—“ŽŽˆ~vjjgfmrnikojhknuqxysmold`^_`acfkomlgjjee_XbmlmojhjlmnmhgljknnkggjqqojgegiljjheejnkklidejjlkaOA:3-*)(((()*))))(&$#!1ARar‚„}†ƒ~{~„……†€€…‡„ƒƒzg^pƒ…ˆ…ˆŠ„ƒ‚jOXX33PR#+SaE!B]][\ZYVC:3582.49:EW\Y`X=-0+3UPK`sqZN{®£_L„§‡fjqjbeb\dnsrqure`hoqssqnoppmomlonlntc\x|¤Åº¸ÆÅ¿ÀÇÄþÀÿÁÄÄÁÀÃÆÁÀÆÄÁÂÄÄÅûÃÆÁÀÇÅÂÈÈÂÂÆÈÇÅ¿ÄÇÉľÊÀtusqrpnooonmmlkkc\\[]jvvw{yx|xfm~shy{suzruursxyuttuuuvz~uxwxvv{tlz–œ– ¬²´´°ÃÖ¾¬Á¾¥ªÍäêë瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€h¨¹©¦ £´¢{r€†„€„‰††Š‡€}€‚‚}}€}~|zƒŒŽ‹” ¤šŒ‘‹‹Ž–žž•‹Š’˜’ŒŒ‘Ž”Œ“™¸ËÍÌÉÊÎÏÎÕÎÉÍÏÎÐÕ×Á—‰‘’–œ ™—œ›£¦§¦£¢¤£Ÿž——¡¡¥©¬ÄØȳµÀ·¼½ºº½¼·´¸¼¾½¿Ãǽ¹»¾¾ÄËËÒÒÏÌÊËÊÊÈÈÈÉËÍÍÍÒÏÎÒÓÑÎÍÉÇÇÊÊÈÈËÒÐËÊÍÎÌÌÐÒÊÎÞÍštUZdc^`aedfeflonnqpnmkjjjmsdwÈè¿°»ºÄ×ØÜéäÀ¸¿ÅËÕ×àìîéëíßØæãâ亘¿àÖØØØÙÙÙÙÚÝÝÜÜÜÛÛÛÜÝÜÝÜÝÜÝÚÖÒÓÖ×ÔÐÑÍÑÑÂÅÈ´ƒw~}zq]dffdyš¢›—’Œ†††rcbfgmvysrzwoogfhptpkfcjlkmnkhjkkkkigfhjkkjgfhjkllheilhjiifbeiikl_J@<4,)(('()*+***)(&$#'5Nhy{…ƒ‚‚‚€€ƒ„‚‚„…‡ƒiUhƒˆ‚‡…‰Œˆˆ†r_ZM6BXS24W`?$%CQXUZ^RC6-*1:3)*/.6FRX_S8.2,3UPKbuqZNz¬¡`L‚¢„hntebie`hnopptpc`gnjopmijlmmonmonlotiay€‚ªÇ·¸ÇÆ¿½ÂÀ¾½¾¿»»ÀÄÄÅÁÂÆÅÀÁÇÃÁÂÀÁÄÆÈÁ¾ÄÈÆÅÇÈÆÄÈÈÃÁÆÆÃÅÅ¿Å»tussrqppkllmnnoog_[ZZivwy{wv{yfn~wkvwtwysrsvvssvwvvwxyyzwxvwtv|uny’™—¦±³³·²ÁÕÄ´ÆÆ«¯Òçéè怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€d©¾¯­¥¥·ªƒx‚ƒ€~„†ƒ…‰ˆ€~‚……ƒ€€ƒƒ€ƒ‚‚~ˆ”•—¢°²§–‘”“’— «¬§Ÿ¢¡«·¹¬š’’“£¤Ÿ›“ˆ–¸ÏÑÒÑÐÐÏÍÊÈÍÕØÑÌÊØ׆ŒŒŽ‘Ž•›žŸ œŸ Ÿ ž¤ ™›ª±°±®´ÈÓų±¸µ¹º¸¸º¹µ²¶º»»¼Àû·º½¼ÂÊÉÈÉÌÌÉÇÉÍÅÌÏÊÇÊÍÌÒÓÒÐÒÔÑËÌÎÏÍÎÑÒÏËÇÇÉËÏÑÏÏÍÊÓË”b]``^ce]^cifdfmmkkqpommlllfuna•Òм¸¸ÂÔÖÛçÞ½ÄÊÕÛÙàëíéêíßØæêä库·àÛÙØ×ÖÔÓÒÑÝÜÚÙ×ÕÔÓÓÓÕÖØÙÚÛØØØÙÚÚÛÛØÕÚÞÓÙãÉ“|‰‹‚™ž„nnpkb…ÀÐÄÉÊÇÇÄÅÌÆhhi`oŽœ›¡¢‹€• œzjonijgknnlmkfenlkjhfgiiiigfehknkkiegklmllhghkklm]HC@5,((''()++***)'%#"" '6Pf‚…†ƒ…„…†…‚…‰…‰‰rTXs‚†‡†‹‹‰Œ‡uf]OCOQ90CbU2!(C\a\[T?40,+4:3)(*-05CW_O804.3TOI^qoYO|°¥_Lƒ§Šjjjjeha[gqspptnb`iooponnpolmonmonlosg`w©Æº»ÇÅÄÁÄƽÂÈÄ»½ÅÃÃÁÁÃÃÂÃƽºÂÊÅÁÄÅÄÆÅÁÄÈÈÃÃÃÃÅÅÆÈÇÄÅÆ¿Å»vtutsrsqjklmnpqqd\ZY[jz{vyww|yel„wgtzxwtvssvwuuwwvtstvxxswx{xwzrjv‘——§³´¶°¬Ãؾ¯Ì˪¬Ôêèæ退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€d¬Â´³©©»­†z€{y€€‚ƒ††††…}~‚€||Š–—›£¨¨¦£œ•˜šž¤©¬­®°®°±²¾À³¢Ÿ™•”“™¤³»º¯Œ—µÈÎÐÌËÍÊÄÐÍÊÍÐÒÔÖÓÀ—…‹‹‹ŒŒŽ‘”˜œœ›–›š™œž¦£œ¡²»»»ÁÆÑØν´¶´¶····¶´°¶»»¶µ»Á»¸º½¼ÃÊÊÊÉÉÍÌÉÇÉÌËÍÎÉÅËÔÏÓÑÎÏÓÏÇÊÏÐÍÍÓÓÏÉÄÄÇÇËÎÊÊÊÔÈa[X[^]ed_egigdhnolmqponmmmnipxin©Í¿¶ÇÔÙÔßéÔ¿¼ÃÌÛâÝåèêåçéÜÔâèáẔ¶ßá×××ÖÖÖÕÕÛÚÙØÖÔÓÒÙÙØ×ÖÕÔÔÔÖØÙÙÚÜÞÚØÕÖÌÔàÅ’y„ˆ‚”›™”Šyi‰¾ËÃÊÍÎÎÌÑÞÙœojg^už¸·ÂÀ‘³Ê¸‚fssjkgkpojhhhjponlgeglmmlieeghjiihcbipmmjfdfhkmlZIHB3,('''(*+,)))(&$! !(:ewƒ†…~†‚‚†…ƒ‰…ƒˆ_M_z…††‹‰‡Œˆ~e`]HBG?>Zb>'$&?]^\V>,.-/.371/12-/.7Q`S>25.4TNI`spZO{®¤]I‚©Žljjfcie_hooqqtpcajqooonnnmkmomlonlnq`Xv}{¢Å¼»À¾¿¿ÁÄÿÃËÉÂÁÄÂÀÁÆþ¿ÅÂÁ¿ÃÈÆÂÅÇÀ¿ÆÈÀ¾ÄÂÅËÉÄÊÌÃÅÈÊÅ¿ËÂusturrsqmmnnnnnoc]\\]kxwvzwvzxfn…vgy}vstrvvrrwywoswxwwvuuxwyww{sdw”™•¥²µ³®ªÁÕ»¬ÇÊ£¤Ïéçç뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€h±Åµµ­®Ä±‰}„ƒ~|‚ˆ†„ƒ…†…ƒ„„~‚|}~z|‹™š‘œ¤£  £¤¥¦¨ª«­°²¬®¶´«®µ°¦¯®§§©¬±µ¿À¹°¤§ºÃ¹¹Ãù¸ÂÂÂÀ¿ÂÆÆÄɺ”†Ž—•–˜˜—™œ˜Ÿœšœžž—˜£¨©¬­«´ÅÉ»²µ³´µ¶¶µ´³²¶¹¸µ´·º¹µ¸»ºÀÈÇÇÂÂÆÇÃÃÅ¿ÁÉÐÎÇÉÑÑÐÏÎÐÏÌÇÊËÌÌÍÏÐÐÍÆÆÈÅÉÌÆÆÓ·cZW]bYZbbafgiihilkjlpoonmnnooclsg~´Ì½ÑÜÛ×èóÙ¿»¾ÆÙáÝçéìèëïãÝëåãã¹—µ××ÑÑÒÔÕÖ×ØÕÖ××ØÙÚÚÕÕÕÖÖ×××Ø××ØÚÛÛÚÚÝÕÕÏÔàÅ”€‰‹‰†ƒ™·Ç옡ÂÐÂÆÇÈÊÆË×Ëšrje`xž³¯¾Ã¡“±Âº„eqrgjkjnomljikooomifimkmlfdehhijigffghlkheehkmliWJLB0+''''(*+-((('%" +Rwƒ‚‚€ƒ~‚€„…‡ŒvYZo}…„†‡„ˆŠŽo^R:.AY][G'(/+=Y\VG0&.+-+3;:9::@ED@K^X?04.4UPJburZNz¬¡^G§‹jlricgb]forrosre^fonoonkijmlnlknmkmsb[x€}¦È»¼ÇÅÃÂÃÀ¿¾ÀÂÃÂÃÁÇÁÁÇÊÃÀÃÄÃÁÂÇÈÄ¿ÀÂÇÆÁÄÈÅËËÇÃÈËżÄÇÊÅÀÌÃ’sprsoproppoonmmmi`\YZixyx{xuywgr„wjxyrtzsuwxusstyxwuwxxuwyvwtv|ufy˜›—¥±±°²¯Â×óÉË£¡Ëçêê뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€j´È¸¹°±Èº‘„Œˆ…Š‡†ŒŽ‰„„…‡ˆ‡‡ˆ„€‚~’ ¡ £©¯®«®µµµµ¶··µ´¶³º¼±±·´±¿¼±´¾ÁÀÈËÅÁÄÁ¿ÇÆ¿¾ÃÄÀÂÊÈÊÇÃÄÈÆÀÁ´’‡’–—•——››—œ¦¢£ŸœŸžŸ¡›—™™šŸ¦¤¿Ë¾´¹³²´¶¶´²³¸µ²´·¸¶²µ±³¶¶¼ÃÃÄÃÇÎÌÅÄÈÃÉÌÉÇÉÎÒÕÏÎÒÓÎÊËÌÈÉÎÐÍÎÒËÄÆÊÉÏÔÎÚ¿…YXb]WZW]]_ecaaghgikloponnmnoohlnrfl™»»ÃÇËÏãðÙÀ»º¿ÒÛØäçêæèìàÙçäæâ´–¸ØØÖÖÕÕÔÔÔÓÒÒÓÕÖØÙÚØØ××××ÖÖ×ÓÏÑÖØÔÏÕÝÔÕÐÒØ»•€ƒ€€…‚–³ÑÓÉÆÅËÏÄÄÃÆÊÇÊÔΙrnh]tœ¶¬·»˜Ž±Æ¶‡gruiggoooqqlghnmlljhikrrmeafklknlhggjqmlhgikjikfTJNA,)''''(*,-(('&$!#&Bp‰…‡„€‚„ƒ‚ƒ„Œ‚eV\v…€€‡‚ƒ‡vS5(%0EI:2)(%":YbS@7,%&&&''())*'((&!2\ƒ„„ƒ‚ƒƒ€zƒƒ€ƒ„u`byw{„‡ˆˆp_l`2#($(*$*,'9Z\EIhnhljjllmmmmknoYCV^A,4- 6SQK_trZP~²¦eL‚¨jjngaec^fnruqrrf_hopnoomnnmjkmnnnmlsg]t€€¦Æ¶µÄü»Ãþ¿ÂÃÁ¿ÁÅÈÀ¼ÃÈÅÂÅÉÂÃÊÉ¿¾ÆÉÁÁÇÈÆÅÁÃÌÈÀÅÈÅÆÄÃÂÁÂÌ¿utsssrqprnmopnkkh_[[^kvvx|zvxyhmƒweqxuuwzwuuvvwwwuuvxwwwvyyzwx|uiy•™˜¦®¬±±­ÀÒº«Äɨ¨Ìçìê怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€n¸Å²º»¹Ë¾x€ƒ‚}zz|}||}~}yyyx}}}}Ž–•››—–™œ¡¤¢¤©«ª«®³±¯®«ª®³³³´±³º¼¿ÁÅÇÆÄÄÄÃÆÄÅÅÃÄÈÈÉÉÊÊÏÒËËÍ»“‡—–’™¥˜ž¡šš¤£žŸ¦§£Ÿ ¦Ÿ—˜Ÿ¡¡¤¥«ÀÙѺ·¿»º·±­´¸µ¨°º·¯¯¬ª«²´´··¶»º¸»ÂÁ»¼ÃÁÇÊÉÉÍÎÌÍÑÕÔÑÎÍÍÓÔÑÎÍÏÍÇÅÇÊÇÌÞÀuRac[aic^_\YXX[^`dghikomijsqlmkd`ik\TUOO\S„®À·»ÓÒ¿·¾ÄÉÏÎÎãìæëìÙÔáççÜ®”·ÙÙÔØ×ÒÒÕÕÓÖÕÕÖÔÑÒÖÔÒÓÓÑÓÔÐÒÓÕØØ×ÕÕÖÚØÏÍÓßÁ”}„Š‰‹ˆ¯ÍÊÊÊÆÃÇÎÊÅÂËÊÁÎÍšond`uŸ¶«ÃÌ—‘±Ã¹ˆgqwokggoomnhcghknnjhillihhegjjnmkggjkknoheggjng[I<3*%*%%&'())*))('#0_~ˆˆ…ˆ…€€~‚€‚}d\r}xtyƒ‹r\bQ0(&(#+&)1.:W]KPnodgeda^ZWTSRLMA8R\=.4."7RPJ`vsXL{® _J€¦Škkogaec^fnrvsstg`jqonopnopoppppomkjsg]vƒ†ªÇ¹¶ÀÁ¾¿Á¾ÀÄÆÃÃÅÄÀÉÁ½ÂÅÀ½ÀÃÂÂÃÅÅÄÄÂÄÂÁÃÃÁÁÂÊÌÇÂÂÃÄÂÂÂÃÁÍ“wurrttropkjnommqj`[Y[hvywwvzyfn~uhu{xvttuwxtrtyuvsqt{|xwwtwwy{phz”˜˜¦­¬¬°°ÁÒ¹§½Ë¨§Íèíê瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€m¸É·¿½»ÌÄ‘z‚~{}~~}|zz|y}€}zxyzzvvw~—”—˜•”˜—•–ŸžŸ¤¦¥¦©®¬«««ª®³°²´¬®¹¼¼Ã¿¾ÀÂÃÄÆÃÃÈÊÇÈÉÈÉÈÉÉÎÍÇÉÎÁšœ•˜¥ ŸŸ—™¥£¢¢¢¤¤ œ¡Ÿš™¡¤¨©°ÄÚз´º½¹µ¯°¹¹¯¥«¸·°¬©§§©°·¸´³¶¹º½¾¹µ¹ÁÂÄÈÈÆÄÅÇÏÍÌÍÐÐÍÉÒÓÑÌËÍËžÅÐÊÉ׳iMcbZdlf\[[ZYYZ\]ceedhlmjiolb[RNR^ZNLRNOVMV‡ÀÂÁÝܽ¸¸»ÄÇÂÉãëçëì×ÓáèåÚ°•²ÑÒÍÑÓÐÌÐÖØÒ×ÚÕÔÖÖÒÑÒÕÓÐÓÙØÒÔ×ØÙØ×Ö×ÚÛÖÒÔâÉ’}„‰‡‰…‹©ÈÈÉÌÈÃÄÅÇÊÉÍƾÑÏ›omd`v¡»°ÆÌ—‘±Á¹‡fouljehnlknjcekjijljihllnlgfjlpkgehlkholfffflogXC3.(%($%%'())**(''$ 4h…‰‡Š‚‚‚~~‚„ƒkVhzypqz€yr[?,2D>/(@IFLED[`G>@A>:AAAWY8/4.$9QOJ`vsXL{® ]Jƒ§‰hkqhbfd_gosrqrqd\hqrqqqooonmnnooonnrh^v†‹«Àµ¶ÂÂÄÂÄÄÅÂÂÆÆÂÀÂÈÂÁÄÿ¿ÄÄÃÀÀÄÉÇÁÆÈÃÁÈÉÄÄÈÃÄÅÃÂÄÄÇÅÇÆÁËÂ’wurrttrolmmlkmopf\WX\ix}zxtx~wdrˆudx€zururqtwwuuttuvxwwvxwtwxy{qh{”—™¦¬­±®®È׶¥ÅЪ¨Ïëîê怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€f¯Å·»º»Ì¿’{~}zy€‚€{y{y~{{}~€zvtyœ™“™–“–š˜––—› ¢££¤§¤¤©­­«ª¥­²©ª·º¹º¶¶¼ÁÂÂÄÅÁÂÅÇÊÊÆÇÄÄÆÎÐÊÍÒÃœ›Ÿ››¦©¦¡ž¡£¥¦¥¢ŸœšžŸ ¢¢£«¯À×Ò½¹»¹···µ¶¶°®©®³±¬§¨¯©«´µ²³¶º¸³¯²¹º¶¶¿ÄÁ¼¿ÅÊÄÄÅÈËÍÏÏÌÌÉÇÆÇÄÁËÈÊÂÈÕ¦\Lba[`caWVWXYZ[^`defgilkimh`ZQIN\SEHNMWZMSJk´ÏÎÝÛÀ½¼¼ÄÄÂÐåìçìêÕÒãçãÛ±“±ÑÏÉÈÊÌÊÈÈÉÉËËÌÍÎËÇÊËËÊËÐÑÎÍÎÏÑÓÕÔÓÔÑÓØÕÏÜÊ‘‡Šˆ‰‹«ËÊÉËËÅÅÈÈÉÈÌžÓÔnj`^w¤¶®ÁÄ•–·È»‡dmrigempkimjegknonidejlnlihfgknlighjkkkihidemm\O:..-%!#$%&')***'&'$8l‡‚„†ƒ€€„„‡uW_qyonywr[?>ACFJLNMMPR[ZV`Y;.4.&:ROJ_trZP~²¦aM…«Šgiqicge`hptsrtsd]ispnoommmlkkklmmnnsi^u†‹¨¹°¸ÇÅÁ¼ÀÆž¾Äü½ÆÊÆÆÉÅÁÂÅÈ¿ÃÈÉÆÂÉÆÂÃÈÆÂÁÃÆÅÃÁÂÅÇÅÃÇÇÀÌÅ”utsssrqpnoppmjjle[X[_jwyz|wuzuco†sbrxvwuutrtvwwwyyyzwvx}wzz{xy}vh}•˜›¨¬®¶³²È׸«ËÒª§Ðìïê瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Y–«¢¨«¯¼¦ˆ|~}{{€€~|{|~z}}{{||}}~y{ šœ˜““’‘‘’•—˜›žŸž Ÿ¥ª¨¤¢ ¦«£¦³´±µ¶¹½ÀÁÁÁ¾¾ÁÁ¾ÀÆÈÂÄÈÇÇÆÆÑÓ½—‹—œžŸ ª«£ ¡¤¨¨¤£¥©¨£ž Ÿ¢£¥¨«³ÇÛÓÀÀƶ¹½º³³¶µª¬±®«®­¬¯«­µ¸²¯²·¶²°´¼½¹·¿Â¿ÁÈÈÁÇÊÎÎÌËÎÒËÇÅÆÆÄÂÁÎÈĺËÙ¡VL\\^cdf]UVWWXZ_cecdgjjkkgZRSUVWVRHFJW[T\SJXœÒØÜÜÁ¹º¼ÁÆÊ×çíçëêÔÒæêæà³’¸ÜÓÏÑÓÔÒÎÍÒÒÌËÏÐËÇÇÌÌÉÆÊÍÊÆÆÉÌÌÊÈÍÓÎÊËÏÎÊÑ·ƒ–“‘ªÎÐËÌÌÈÆÆÅÅÅÍÊÃÕÖŸoj`^v£·µÂÀ˜žÁÔ¿‡cmqfefkplilhdhrmijmjhkookghhhkikkiddinjghgahrjOJ<00/&##$&')**-)')(" !!# Cq†‡|~ƒ€„…|`Xerliv}wlXPc\DXkLOgnl_IT`ZUY\[SORUVTOJFRZ_\X\R=-2-'AHOMKHQbkmpxonihhchqbU•ÖÜÝØüÅÍÐÓÔÚèîèíëÖÕééÝ×­‹µÞÒÍÖ×ÑÏÒÒÑÑÑÒÑÐËÃÅÏÒÒÎÌÏÐÌÑÒÕ×ÖØÙ×ÒÖØÕÐÐÚ¾†gu{u}z{ÇÊÄÅÅÁÁÌËĽÅÈÊÚÔ™mhb]xŸ¼½Ã½ ·É¾ˆcmskkknpmlmkghjoomifihgkpmdflnjiihghllmkefhijeidL=B:% &+-(%*'&&''%" !>wŽ„‚€€€}{~‚x\UmyvmWVf`[lM&LqaYi\, <[_[WYVOLPMJKNNJERZ]WY`U=,50$9VSK`tr[P{­¡`J£†glsg`ca_iruwqttg^gsrpnmnpomopommpoktmav†®Â¹ÀÊÆÃÀÁÄÁÀÄÈÁ»ÁÈÅÁÂÉÉÃÁÅÆÃÂÆÈÄÂÅÆÄÂÃÇÉÆÃÂÆÇÈÆÃÁÂÁÂÅüƿ“urtpornqqmqrljordZVW\l{|wwy{{ufq…ufw|urrvuuutvvrtyxtrvwuvxvwuw{tn€™œš¤­²³¶¸È×·Ÿ¾Ë©¦Ëéìéꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€U…’†‡‰†ƒ„}~€}}|}~€€~||v|~}}}}~~y}–«©¤¦¢Ÿ ž™˜˜œ›–”“’”™•”™œš™ž“’¡¨¨ª®¯«¬±³¯²µ¹»¼»»»¼¼ÂÄÇÈ¿ʻ˜‰‘’“™œ ¡œœ¡¤§«ª§©¬ª£¢Ÿ˜š¤¨¥¦³½ÓèÞÆÄÊÂÀÂÁ½½¾º°´¹´°¯©¦®±³²¯®²µ²®­°µµ°ª´·µ±³º¾½½¾¼½ÂÄÅÈÈÇÇÊËÀ°¦˜–‘’’\FW][[gmjh]VW\]Y\bj^H;@FEDPY`juwsprlmlllhji[W˜ÕÛÝÚÀ½ÄÇÊÓ×ÙèíçëëÖÕèåßئ„µàÏÈÑÔÑÓÖÕÒÏÒÐÍÔÔÊÇÎÔÕÏËÎÒÒÐÐÐÑÓÒÓÕÖÓÓÓÒÑÙ½ˆkz€}‡…†¤ÌÎÆÅÈÆÃÈÍÌÉÊÃÂÚÑ—nic]w¿Äɾœ ´À²„gorhhfnpmlmkghjllljgijigkkgfijjiihfgjklnjgeet‚€\:=M7#+0,(**+++*'$!!#T€‰‚~€~|}~~x]Rj€gBKibXpO%NsSShY)>[``^`]UONUOHLMHISW\\\^O5+51%;VSJ_sq[P|®£^J¤…ektidga]hpqtrtpd`ktmopononmmpqnlnomqiax…‰«Ã¸ºÅÃÂÄÉÊÂÂÈƼ»ÃÅ¿ÀÀÄÉÅÂÅÈÉÄÁÇÅÁÃÁÄÃÁÃÈÈÄÅÆÄÁÃÄÅÅÄÁÄÆÃÊÀ“qpvttsmlpkjopmmpk^YZ^jwzwxz|zseqƒufv|vvxvuussvxvxttxzwuvyxuwwy|sl|•šš¥¬°¸¹µÀÓ»¤ÁÏ©¡Ääêéꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Y‹–‰Ž–•“’Š†„€‚„‚€€€€}{{|}zx}{wy{—®­¤§£Ÿ ¡œšš›˜”’“–˜™”‘•™ššš”——• ¤¢ £¦¨¬±±®µ¶¸¹¸·µ´¿½ÂÃÁ¿»ÀÁ¶˜Œ““’–ššš›œŸ¡ ¤§©¨§¨¤ ¥¥žœ¥«««°½ÓæÝÍÌÎÇÁ¿ÂÁ¿¾¿·ºº´±±«¨¯¯±³±¯²¸µ¯©«°³³³³²µµ²µ¹¸À½¹º¿ÃÄÄǼ¾Æ°b`YYY\ZMGOXUXaimhabXW`^XZaaOHNQSUU\hpqrrpqsrttqpon`TZœÓÛàßÆÀÁ¾ÃÒ××æêäèéÔÒåâÞئƒ´ÞÎÉÏÑÒÒÑÐÐÏÓÑÍÐÓËÉÐÕÖÒÏÏÐÑÓÓÐÑÓÐÎÖØÒÐÓÕÔÛÀˆnz~{…ƒ¨ÍÎÅÀÇÊÆÉÊÇÉÑÉÃÖИpld]wž¸ÀŹ— µ¿µ„epvnnmjooljfeiljimjcfjllomdbirlkjjghkknnjgaew†mH14:5&'01*(*)'&&&#0h‹}€€}|~~{{bOh…uL(Ko^Ig`A\hBRt`.=W[\\]\VPCNMGHIIMU\`_aaSA-60$9USK]qp[P}¯¤aK‚¥‡hmugaeb]hqtsvyp`_jpnprqonnonnoqnklqngay…Š¬À·¶ÇÇ¿ÃÎ̾¾ÄÈÀ¾ÄÉÉļ¿ÆÅÂÇÈÇÀÂÊÇÁÅÆÆÄÂÃÇÆÃÈÆÄÅÇÇÅÆÄÄÆÆÂÍÕppuutslloqpllnrvk^Z]ajuxy{vv|t`n‹wdtzwvwzwvwuuvxuwxxuvy~zyuwx{}shx‘˜›§®°º¸²¿Ô¾§ÃϨžÂâéç耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€T‰”„ˆŽ‹ˆ‡ƒ}€}|„|yz|yv{€}z}„ƒ}~š´³©¬¨£¥¥¢  –“——“”šš•““”’”––˜œ“‘£¢  £¨ª§¤£®¯°±´¶¸¸ºµ··¸¸»ÃÀµ–Š“”’’”—™™š £¡¤§¨¦£¡ ©¨§±ÂËÍÒÍØåéÚÇÅÃÄÁÂÃÄ¿º·¹»¹º·­ªµµ¶¶´²±²¬®³··³±²°°µ¸µ³·»¾¿¿½º»ÀÄ´ý…\[[WWTROHKXXQUaili`b\\]Z\aaTLIJOYcdinnmqsrqttwyurqj_Q`¦ÛãäÝÊÀ¿¿ÆÖÚÚæêãèéÕÒäå×Ô¯‹®×ÒÎÒÓÑÑÒÓÖÓÐÓÒÎÊÉÏÐÐÏÑÓÏÌÎÑÐÒÕÓÎÎÓÒÐÓÔÑÏÜÆŠs€Š†‡§ÉËÅÄÊÊÅÃÇÄÃÎÏÌÛÖœqja\{¤¶¾Ã³“ž·Á¶€`nvkiijooljfeikmoqj`bhmmomheilkjjjhjmnkjhgbar€]1$%)@?##,.+(*)&$$&%!!Q……~€||{}cG_}_2#Tr\8NcZ^M6E\P, <^^][Z[XRTXZVRONONTNEEB9418/ 6STM`sr[P{­¡bK¤‰jnsh`dd_fpvtqute]gtvqnpqonpnmopokmqskbwƒŽ²Â¸¸ÊËÂÃÉÄýÁÉǼ½ÈÏƾ¿Ä¾½ÆËÇÁÁÆÄÁÀÊÅÀÁÅÇÄÀÌÌÈÄÃÃÆÉÀÅÇ¿ºËÅ”vrsonqorospihknph\X[_iuxyztu}wbo‚wjvtms|vstutrttwvusvyzyzyuwx{}sj{”œžª°²¶´³ÅÜÁ§ÀЪ¡Åæëè瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€`˜£‘Œ~~€zz~€}{{{yy‚€ƒ~›¶´­®©¥§¦££¢š˜›š—–•–”’“’–œ›šŒ™Ÿ›š¥¥ ž¢¦¦§«°µ¸¹³®±µ¹»¹½Æ¸•…“’‘”––—œž¢¥¤££¢¡£§¨§¤¬¿ÊËËÊÓÞæØÈÊÏÃÅÆÁ¾Åĸº¹¸¶¸µ®°µ¸¶±°´µ²±¯°µµ±®®ª¯°±´±³¾¹·¹»»¾ÄÄ»¾¼—d\g`]]WUXVTXWQR\ellg_Z\]VVWSKJDH[jjgfknptsnkonpwvwvh[H]¦ÝêèÝɼ¿ÈÑÚÝáêíåêìØÕæäØÖ²Œ¯ØÓÊÓÕÐÑÖØØÓÎÐÑÏÎÍÐÍÎÏÒÔÎËÑÓÍÑ×ÑÐÔÔÑÏÎÏÍÏÚÁ„o{}~‹†ˆ³ÒÎÈÉËľÀÄÈÈÌÊÍàÖslb]{¦¼ÃŶ”ž¶Á¹„dsvhegnpmlmkghjoonidgiflqogcejljjjghkljkhhd_fqS$IP*"""&))++-+'')(%7mŽ‚}{|~d@OfD#(CNA-1=@A0/.14-+@VSPLHIIC>=:6433311-+*'&)39/4SSNdwt\Oy©bI}¢ˆilqjafe^cmusloti_ixtoorrmlolopmmopnvk`r}´Äµ¸ÅÆÇÇÈÅÂÁÀÅÄ¿¿ÇÈÈÅÿ¿ÅÅÿ½ÀÆÆÂÆÃÁÃÄÄÃÃÆËÊÅÄÈÇÄÀÈÉ¿¹ÍÈ–urspnqnqrpnmmooni]XY]jwzyvux{whrƒscu{wuvtuvvvxyvtuuwvuuuyxuwwy|sl}—œ¥ª¬¶´²ÅÛ©ÄÒ®§Ëêîêꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_š§•‘‰~}}†Œ‡€~~}}~}}~{}€‚}‚~š¶³±°«©ª§¤¦ ŸŸ™œ˜–””””’•™•–š”’›™’——šžž›ž£¥¤¥§«­­¬±¯´·ºº´´Å¸•„Ž““”šš˜› ž¥¥£¢£¤£¢¢ž¤¡ž¤«¬­¬±ÆàÝÉÉÐÏÄÅÈÀ½À¼»½½º¹³ª®¶¹¹µ²²²°·²°µ·²­««²±±·¶´¹´¯²¸»ÁÄ¿·Ã§q\ee[Z[WV\]Z\YYW[eigcd[ZXNIJF9AJXgkjkiorturqvxtqtsvzlSB_©ÛééÞǸ¿ÎÓÕÙçëíåêíÚÖæäÞÜ®‰²ÞÔÊÒÔÐÑÓÑÎÐÎÎÌÐÓÌÈÒÔÓÔÕÍÊÒÑËÌÏÏÏÒÑÕÒÍËÍÑÙº†s}|}‰‚„®ÎÊÅÈÇÄÆÊÅÇËÌÉÍßÒ›tmc\z£»Áƹ™¡¹Å¹„akpfilnpmlmkghjmjhgfiimnmkihjmnlkiffiilkfdfd_R2! U[2$%!#&(+*,+(()& N…‡{{|~€‚„hEIS;+30/37328;@FEHNQSO610,(+,%(5628=?D@-.8.%(*290 5SSMcvt\Oyªž`I£‡hlre`fd^fqxvqsre`jupopspllpmnnlnqqmrg_t|ˆ²Ä´¼ÉÅÃÀÅÊÃÃÄÿ¿ÂÄÇÇÆÃÃÄÅÅÇÀ½ÀÃÃÄÅÅÇÇÅÅÆÆÄÄÉÇÁÅËÊÅÃÇÈÂÀÒÊ–qpusssmmokmmghorg]XY^n|}ywwyzugs…vhx|ustuuuuvxxtwxuqtyxqvxvwuw{tj}˜™¡¦ª··³¿Ö®ÊÒ¯©Ëèìê쀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€aœ©—’‰‚†„€‚€ƒ€|}€€~}~}ƒ€~…ƒ€¸µ¸µ¯®¯«¨«ª¤£¡š—›š™™˜•–˜““–›š“•—™˜—™Ÿ¤žŸ¡¥©«©§§¨®¯±¶¶»¾µ•…•––”™™’–¦¨§¦§©©£¡¦¥¤¦¥¥©­©¼áãËÅËÇ¿ÇËÂÃÇ¿»¿À¼º¶²¹¸·¹»·±²··´³µ²¬¬±µ¶²®±·¸´´²¸»¶·»¹¸¸—hXbcZ[^[VUTU\QXY]imgdc]WLCMWQAK^ihhkkgjkorqs{qrswrqteOEm·àæäÛÈ·¿ÎÎÊÒéêìãéìÙÕäéÞÚ°‰±ÞÙÑÔÓÒÔÔÑÐÎÒÓÑÔÒÊÍ×ÔÎÐ×ÔÍÏÑÑÌÍÕÔÎÏÖØÖÎÊÍؼ…t~}Ž‡Š«ÏÍÆÆÁ¿ÉÇÇÍÍÊËÑÞÔ›qi^Yz¦¿Äɾ›ž²¾¼‰fnskkhjooljfeihkjjeadfkllmljjmmkkjggjjikhb`mkO(6hW,$#!$(()--+*-.&8mŠzz}}€„|dILSKKOLOUYTYaY\TWc]_cJ+(((%*,%8[fahhdmU./?,((080"7TRK^rq[P|®£`K‚¦‡gmvfcic\fptvsvrc^jwtpmmnnprplknqonopfd}ƒ‰±Å¹¾ËÈÁ¾ÂÂýÁÈÁ¼ÃÉÉ¿¼ÃÅÁ¾¾ÆÃÀÂÆÆÄÅÄÆÄÂÇÍÊÁÂÇÉÇÇÉÈÇÂÂÃÂÂÒÆ‘rqusrrmnqlnoikojg_[Z]kvtz|vuzsaothwxpsxwttxyzzywwwvvwxxuxwxtuztj~› œ£ª¯³¹¶¿ÔÄ°ÉÏ­§Èäèç뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_œ«•Œ„~€ƒ‡…€~~~~~~|||‚‡…€~{¡»¹µ¹¶­­³°§­¥¦¨¤¡££š—–—•’‘’—–’“˜š›•–•“•šžžžž£¤ ¢¨©¦¡¦¬°±²ºÀ²•Š’˜››–›œœ›”˜©­«¨§©¨£Ÿ ££¡¡£¥©ª«ÈëãËËÐÅÄÇÅ»½ÄÂÂÇÉÉǽ¶¹¼½¼»¹¶´³°·²´Âº­´À¹µ··³²µ¹»¿½¸¹»¶¿¯‘q]]`^ZXY\\XVXZTT\fljdaWLA=DKHMallnponklkjmrtswttttwtiIHÎâÝäÝØÎÔÝÝÙÚëéñêëêØ×èåÝܱ‰®ÙÒËÓÑÍÒÔÓÕÏÒÑÒ×ÕÎÎÕÐÒÔÒÔÕÑËÎÏÍÏÔÕÓËÓÔËÈÏÛµ…v}†…ˆ¨ÌÊÃÃÅÆÈÇÅÏÕÏÉÎÞÒ›qjbZyª½¼Å¼š ²Á¸†empjlfnopnjgffijllifhkklolfjmijmmgegklmnedcmoJ$ A`>&($#'('+,..-*&# !Y…ƒxy€ƒ~sYOPPNEOR[YZ`[Z[ZY[X]_K*'+%")'&KjogfjroC0A@').*06-6TQKaws[P{­ bL§Šhoriagd^gqvrsutfanvspllorrrrponoonlte^w„‰«Ã·¿ÏÉÂÁÅ¿ÂÇÄÀÁÅ¿¿ÁÆÇÃÂÃÅÆÅÂÀÃÆÅÇÅÅÆÄÄÄÂÁÅÈÈÉÇÅÇÂÅľ»ÊĘqturqrpmnnknolopg^XY^juyzxwwvsiw‰wftyxywyxursutqtuuwyutyvwvxwx|soz–¡ž£ª²±¶´¿ÙÆ«Àи«Æåíî뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€d¤°“‹Š„ƒƒŠ…|z{~‚ƒƒ‚†„~…ƒ‚…€‚ž··´º¹²°¶¶°¨§ª«¦¤£Ÿžžž™••˜“•–‹”œš••““––žž£¤ ¡§¨¡£§¥¨°±²º¯–Ž”–š˜š¡”›®«¦¦©§¦¥££§§¦£¢¦¯¬²ÌèàÎÎÏÅÄÇÅ¿ÂÆÁÁÉÈÂÁ¾¹·À½¼¾¼¶³µµ·³´º³«±°®®²¶¶¶·ºº´²·»º·±¶œoX\ba][[]]ZYZ^UNXikfg`RKMMMSYhkllonifhklklprrsovvox{hIU‰ÈÐÅÔàÉÇÍÎÑÕÑÕâêåèèÖÕæåÜÚ¯†¬ØÒÃÌÐÏÓÖÕÖÏÔÓÔÕÐÌÐÒÍÍÑÒÑÎËÓÓÑÐÐÒÒÑÙÖÑÌÌÒÞ»‚t‚„€‡ƒ„¨ÊÊÆÇÆÄÆÅÉÎÎÌÇÇÖÖ›nid]y¨··Ãº–Ÿ¸ËÊgoskjfmnonjhggklmmifgjnpnhddhkimmiehjknjcc^joJ#!"*;+  !"&(*--..+*)$ H„zruw{€€y_ORUTQJ?IXXXZ\[[Y\X]_L+(*'(+)0TpjkmhnbEGVB"%,*06,5SPKaws[P{¬ bK§Šhoqiagd^gqvxwvsd^lunnnpqqpopnmnpqpnsf`xƒˆ«Äº»ÇÅÁÁÇÈÀ¿ÃÄÀ½ÂÇÄÃÅÊÊÆÄÅÇÃÃÅÄÀÁÃÆÅÄÇÉÄ¿ÁÀÇÆÂÅÌÊÅÅÅÀ¼¾ÎÅ”quurqrpmllimnkopf^YY_lx|r{yvzwgt‡uewzuvxpquwurswsvwtrvyuvwvxwx{rh{™¡ ¨­®±²¯¾ØĨ¼Î¶©Åãìí退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€g¡ª’Œ†‡€ˆ†€€„…„‚‚‚ƒƒ„€ƒ‚€~~‚Š…ƒ·¹´¼½¶³·¸´ª®³°ªª¨¢¡¡¢ ›•–š—•–Š–Ÿ•–—˜••–•’ššž›¡¢§¥©§©­­¯»®–Ž”–šŸ£œž¢— ®«¥©®«©ª¨¥©©¦¤£¨°²¸ÏæÞÌÉÇÄÃÿ¿ÈÏÊÃÈÅÁ¿º¹À¿ÀÁ¿¸·¹¸¶¶·µ°°´´µµµ·¸µ±´·±­µ·³²³¼¨vUXc`_]\\[ZZ[Y[U[noc]UNMQSWaijijjjlmkdimkkmpppuysqxtcRV„»¾¸ÎÖµµºº¿ÆÀ½ÜæãçèÖÕææÜØ«„ªØÓÅÌÐÏÐÓÕÕÖÙØÔÓÍËÐÒÎÍÐÔÑÍÍÏÒÔÒÎÌÑÖÝÖÑÏÏÑܽˆv~|…„‡®ÓÑÇÈËÇÂÆÌÎÉËÍÎÚÓ™mie_|«µµÃ»™¢»ÌÆ‹cmtiihkmnmkihiijlkhegjkmmjfdhmilmifgjkmkif_mnD # $%(-.,-,)+,(  3r†{stknrzmWIT][^XCBX]WZ^ZZZ\X\_L-*)'+)&9awhjmhmVJGH7$%*1/5,5RPJaws[P{­ aK€§Šhoqiagd^gqvvtspb[jsqqqpnmllnmmnpqqprfbyƒ†«Æ·¶ÄÇý¿Á¿¾Á¾½ÃÇÇÂÀÁÁÀÃÈËÀ»ÁÆþ¾Èý¿ÈÉÅÃÂÆÆÃÈËÇÀÅÅÁ½¿ÎÅ”qturqrpmkjhlnkopd]Z\bny{u~}y{ucq†wgrtuzyqsvvwwwvvsrrqsxzwxvxwx{rh€ž¡ «®¬µ²«ºÕÅ®Ä͵¨Ãâêë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€e¥‹„z|xv{|}€}}}}}|{{„€€}{|~€‚‡Žˆƒ›µ¸¯µµ¯¬¯®ª¦«­©¤¤£  Ÿž™”“–—“‹ˆ”™’’‘‘’‘“““•˜šŸž¡¡£¨§«²¨’Œ•™›œ¡ž ¢›”š¨©¥©®­««¨ª¬©¥¥§©¬°µÍèàǾ»»½¼¸¸ÃÆ¿½Á¿½¾»µ´¸¼½¹´´¶¸³°¶º³°µ¶²µ´°²µ³­³¸¹¶´·¹»¸£šŠdU^`_][ZYXYZTZX[ee\YNKINT]ejejpoikkdbimmjlmnmvvrtvj[YSg›¾ÑÞغµº¾ÃÇÄÈÝèæëìÙ×çèÝת‚ªÙÖÉÎÓÒÏÑÒÐÒÖÓÒÓÏÉÊÓÔÑÐÓÑÏÔÓÓÒÑÏÏÑÔÔÓÔÒÍË×¹…u‡‚‚¨ÎËÃÆÏÌÈÄÇÉÅÆÎÔÜΗojd]~°º¶ÄÀž§ºÃ¸…amshhjjlmmkiijhiklighlomolcdkllmkhdfjnjoohdl_1"##*""&#&--+,+++-)%! &_…|rm`fmgOBKURW]N?N^YYZY[[]W[_M/*&&,#"@cqgimkiSF=2,,)(1/5+4RPJaxs[P{¬ aK€¦‰gnqiagd^gqvrqrrc\irusqommllonmnpqporgc{‚†«ÇµµÄÈÄ¿ÃȽ»¾ÄÄÂÂÂÇÃÁÿ¿ÃÄÀ¼¾ÃÄÄÅÉÈÅÀ¾ÅÉÆÉÉÿÁÅÆÇÂÆÅÁ¾ËÅ—quurqrpmllinnlope]YZ`mx|wwxzwqevƒwhuxwyvqssruzysuwxxyxvywxvxwxzqj‚  «®¯®±±¿×È­»Íµ¨Ãâêë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€e¦¯“‹|wzwyy{|utxxyyxux{{yz|zvx}{}|{–²µ°²²®¯°®¨¥¨¨¦£¢¡¡¥ ˜–•‘“’‹‰‹‘‡‡‰Œ‹‡‰Š‹‘”‘–‘• ¡Ÿ¡Ÿ‹•›š–Ÿ£žŽ’©«ª©«®®«¨«ª¨§«¬®²¸»ÏèãÌÅÿ¼¾ÆÉúÂÀº¼¾¹´·»½¹µ´µ³±­·½´±µ²¬®­ª¬±°«°¯³®¤ª¸¸ ut‰wWWb^][YXYZZXV[`ZKGLH@BTdfgkggjklpofbinlkkmnmipvtqhTUXPg¦ØäÔ´±·¹½ÃÆÑâìéííÙÖæêßÙ«ƒ«ÛØËÐÓÑÏÒÔÑ×ØÔÏÒÐËÉÒ×ÓÍÐÎËÏÚØÖÓÒÒÒÑÐÒÓÏÊË×·†t~€†€®ÌÉÆÈÈÄÆÆÇÈÅÇÌÏØÑšqkd\|®½¶Ã¾›¤¸¾¼hmtjhgjlnmkiijjkmmjhjmllnkehmjnmjfcdkpjmjgf]C!"! (3)#%!%+-.---,(&&%##%%!"P‚}i`Xgpj\SILWXZZSEP]ZYYY[\]WZ_N-'$'-$(Nh[TRPMHH@C4*/+%'05,5SPJaws[Q{­ aJ€¦‰gnpiagd^gqvwtvug]jssqooqrqoqpnnppnmrgd{ƒ†¬Ç¼»ÈÈþÃÇú»ÃÆÃÃÅÇÅÅÇÆÀ¾¿Êļ¾ÇÊÆÃÈÉÉÄÁÅÉÅÂÇÆÂÅÈÆÂÁÆÆ¿ÌÅ—qturqrplpoloolopi_WV[iw||yy{ztj|‡qcy~tsuruvuuvvtxzxwwvuyxxwxwwzqf|˜ ¢¥¤©°¸·¼ÎƲ¿Î¶©Åãìí退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€i¬¸¡“‚‚„‚yy|{}}||~~zx{~~{zz{~z}œ»¿µ¶¶¶¸¼¹´­°°¯°®«ª®¨¤¥¦£Ÿ™›˜””””•––“‹ŒŒ‹‡‰‰‰Ž’’’•“•›šœ ¢•”šš•š¢¥¦¡•˜­°¯ªª®¯¬«©¦¦¬®ª­¸½ÀÎâÞÌÆÅÃÅ¿ÁÈÊÇÂÈÆÂÄÄÁÁÅÄÄÃÀ½ºº¼¹ÀÆ¿¹¹µ³´´µ·¹·³®¥¥ – ˜vaZfg[U[\^]ZZ\\[XZ_^PCAC<>I^ifbgiddiklkifkmlkmnnnjlsqgZPPSOPq»èÒ±³¹¶ºÆÍÕåîêìë×ÔäëàÚ¬„¬ÛØÏÒÒÏÏÓÔÓÐÓÐÎÐÎÊÌÍÓÏËÐÑÍÍÒÓÓÒÓÔÕÕ×ÓÏÊËÐܺ‹v||{†‚§ÉÊÈÊÊÆÆÈÎÎËÑÐÌÚÚŸqke]x¦½µÀ¹’ž¸ÃÃ’fismigkmnmkihiklmlhefiejlhhjkioligddjqrkeieJ-"%"""$ "#"&+.+)*.-**-('##-5/ F~ƒhXW_\T]^RP[acd^[`]USQX[]^VY_O,#%*.)5][><@:.&3HF.$+'#%17-6TQKaws[P{¬ `J¦ˆgmpiagd^gqvxttte]kwvrooprrprpoooonlshc{ƒˆ¬Ç¸¸ÅÈÆÃÅÅƼ»ÃÄÀÃÊÆÃÁÃÃÁÂÆÇÿÂÇÃÀÄÈÆÃÅÊÉÅÄÈÈÄÂÄÇÄÂÄÅÃÁÂÑÆ“quurqrpmrqmpplooe]YZ_juwuyutxsctŠsbv{sruwyyusuvtsruwttutxywyvwypf{™¤¢—Œ‘—«µ¸ÅÀ±¾Î¶ªÅãìí退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€m¯¼¦¡}ƒƒ„ƒ‡†}~†„‡‡ˆŠ……ƒ‚ƒ……ƒ‚‚„}}š¸¼³¶¸¸¹º¹¶²·³¯µ¸´±´¯¬­®«¨§¥¤£  £ ˜—™™–”’‹ŒŽŒŒ’œ•˜š›™—ž¥¥–Ž”™›™œ¥©¥Ÿš ¬°¬«¬­¬«©©ª¬¯®¨«µÁÂÑæäÎÄÃÄÅÃÂÆÉÅ¿ÄÇÇÇÉÃÁÆÌËÉÅÂÀÂÅÇÂÄÉÇÂÀ½ºº¼ÁÀº²­—‹†~rsuj[a[OQWWSY[\[[]]ZX]WIDHKIJYcfigee`bflnjghjlmkloqpookkj[NQOJVWQØÙ¸¶¼½ÃÌÐÙçïéëéÖÕåèÞÙ¬„«ÚÖÎÓÒÐÔÕÑÏÐÒÓÕ×ÎÇËÔÖÓÎÐÏËÊÏËËÏÕ×ÕÓØÑÍÍÎÑÝÀ‡t}€€‡{ŸÈÊÃÅÊÇÃÅÎÍÉÐÏÌÛÛŸrke]x¦Â¶À¸‘žºÅÀagtlhimnomkhggkklkgcdgkmlgdehklkjjgehntigl_=%()$'(! !#'*,/1.-.-)''''#"%!'26#:s…fV]WBO\RIT\clhcb]WQJIW[^^VX_O.#(,*);`hZ`f\J5*IK3''$')28. 7USMaws[P{­ `J¥ˆfmpiagd^gqvwrrrd\jvwtpnoopoqonnppomugbz…Š­Æ¹·ÄÇÇÅÈÈÁ»¿ÇÆÀÁÆÄÁÁÄÅÄÆÉŽ·¿ÊÇÁÅÆÆÅÇÉÅÁÄËÉÅÃÄÃÂÂÄÅÄÂÃÑÆ“qturqrpmpploolopc\Z]bluwtvsszudsŠxhwzuutvvtqrvxvsvvsqvzwyywxwwypj€œ¦¡}€…š¤£«ª©Á͵¨Ãâêë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€k´Â¨£˜‡†„‚€‰‰}{Š‡ˆŒŒ‰‡‰Œ…‚…‰ˆ……††‰~™¶º³·º¹·¶µ´¶»³«²¼ºµ´²°±°¬«¬¤§­¨ž¤¦š™››™˜˜—”‘“‘‘Ž‘’““•™˜œ Ž‹•š›šŸ ¤¤›•¨¯ª®³¯¬«¨¥¬¯¯¯¯²¸ÆÁÌæåÌÄÊÆÿÁÈËÆÁ½ÅÇÆÇÿÁÂËÎÉÃÃÆÇÄ¿½ÁÅÃÁÁ¿¼½¿¶£’‰€vk`Y\^YQZa[PPUUTXZYZ\[X[]M=@DBBWde_biiediihlmjkmnlklqrqnjkj^TQSQNRUHZ›ÉĶ»ÈÐÐÏÜéñêëê××èæÜØ«ƒªØÓÍÓÐÎÕÖÑÏÓÐÏÔÖÌÈÐÔÕÓÐÎÎÏÒÒÏÐÔÔÐÎÐÑÌÎÔÒÌÙŠu{}}†€~§ÌÌÅÅÆÄÄÇÌÌÆÈËÍÚÔsld\{­ÉºÂ¼—¤¼Á¼ŒenwidknopnjgfflmnmifgklknlddkmiikmjfgllejkU5$'("##!" ##%,.-0/-+,--*(()'!"#&#!$6,.d|^Sg]>IP>Ea^Wa_aZNTZOQW[^^VX^O2%*,$#8Y[bgkjk`A:\U9'&.(39/!8VSMaws[P{¬ `I¥ˆfmoiagd^gqvzuvwf[grpqrrqonnommnpqqovg`y†‹­Åº¹ÅÇþÀÃÁ½¿ÄÿÂÆÄÂÂÅÅÃÃÅɺ¿ÉÈÃÇÃÀÃÇÈÉÆÀÂËËÄÃÆÅÁÁÆÈÄÂÎÅ–qturqrpmnnknoloph^XX^lz}vsy{sdq’}kyztw}wttwwtuyxwvwwsrwyzwyvwypi€œ¥¡‚ˆ›§¤¥Ÿ¢Á˳§Âàéê怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€l¸È­§š…„‡ƒŠ†{ˆ‡‡‹‹‡‰……‰Š†„†‡‚†‡„‚•³»³´¶···¶µ¸·³²··µ¶¹µ¯¯µ´­«¨««¥¡¡¡  Ÿ›™š™–”˜•Š‹’Š˜›—•›š‹•››žŸ¡¦§ ›¡­««®®ªª®®­­­®¯³µ´¼ÂÕëáÆÂËÊÃÃÆÄÅÇÃÃÈÈÇÍǺ»ÄÈÆÃÆÇÅƾÃÌÊÀÁÉÈÇÈȵš€pula^^XX_a\[ZYWVTT\WW[\[\\WWIBNTRVakkeeedddfikkjjjfkokhnpijmj^SPSUUWRV[Se’¿µ¹ÈÑØÜØæêëîçÔÒçäÛر…¨ÜÕËÐÎËÐÏÌÍÎÏÎÓÔËÉÓÓÏÐÑÌÏ×ØÒÑÑÓÒÑÑÓÐÐÔ×ÔÑÜÁ‹w}{y„„†¨ÍÐÆÅÄÈÉÁÄÌÍÊÇÏãјokcYy®À­»¾™¡ºÈÁˆbowgdhlikpnggmlhlnihjgnlkjkkllkjlkefjkhiplN."%$! &&!%'%##'+--.1-,.,)*.(*(""(*)& #% *.*^u^MPK'!"!! %)'')'%$'*,.0-//-++*))*)%#'+,)&  '& '/+\t]A766@YYXa[TWda`^ZVPINONLFMWJ0.2*%.-)-)&?fpjo\:'(''++09/5VSJ]wu]Pz¬¡`L¦ˆhopgcgc^dmvyrquiYdurqppqponrrqpooppsic|Š¬Ä¹¾ÄÀ»¾ÁžÁÅƽÀÈÈÃÂÃÁÂÆÅÅÁ¾ÂÆÿÀÄÄÁ¿ÂÇÈÆÃÄÄÄÄÆÅÿÆËļÌÇ•ossqprpmnpllkkqsc[XZ`jstwxxx{ucwŒ|hu{tpruwvvxuqtswutwvsrxwtwwy{qi ©¥£¡¦¬±¯²¼»¸¿Æ»¿Õêî退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€r¶Ä¯­ ‰„€…ˆˆŠˆ†ˆ‰…ƒ…‡‹Œ‡‹‰†…†‚ˆ‡‡‡‰ˆ˜²¸´³³²³³´µ³µ´²´³³¶»·³´µ°¯¶µ²±²²­¨¤«©¦£££Ÿ››œ›™™“Œ‰‘‹‰Ž‘‘–™”‘‘“˜š™œœ›Ÿ§¨«ª¨«©¦¨£¨¬«®³µ´³½ÕëãËÈÌÇÁÆÏÌÇÇÅÁ½ÄÇÆÊÉÆÉÈÆÄÄÆÉÈÎÈÅÈÈÃÆÏâ‹ur…€fTYZZ]^\\[ZYWVTSRWUXXTWZUNAN_^Y^aSIS]VOUY\^W[`P.$',5@7+(+#.SlljhD&&-'$.09/5VSJ`xt]Q{«ž]O„£…krmfdib]enuvxvsg]huvsppponnmnoppomlqi`wŽ›´¿¼½ÂÆÈ»Âż»ÃÅÂÂÆÆÂÀÄÆÂÃÊÅÀ¼ÀÃÀ½ÁÅÂÄÉÉÅÅÈÈÇÄÁÁÄÅÅÂÆÉ»ÊÄqttrqsrnlnlnnmqpg`\\_kywxyz|tbv‘}ivywvtzsqrrtvsvssxzxwxvxvxtv{tl{‘˜™›˜šž™—š™˜œ  œ«Ñìë倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÁί©¡Ž…‰…‚†Œˆ‚ƒ…‰ˆ‡‹Š††‡ˆˆ‰…„††††˜°²²±°®¯¯±±®´¶µ¶³°³¶¹·µ¹¹µ²²¯¯±¯­¯´³°­¬«¨¥£¦¦§¥¢ž›”‘ŽŽ‘Œ”‘ŽŽŽ’’•–—œ¢£Ÿ¤£¥£¢¥¨¦®«¤¦¶ÄÆÄÄÈØèßÍÊÇÆÄÇÉÇÊÎ˽ÅÈÆÊÈÃÊÉÇÉÇÂÂÄÂÁÁÈÇÆÏ̵ˆ~|z‚‚jWS[ZW]_\\]]\ZYWVUVVZZXXRD?8=P[]`e_ababdfecehiiiiinmkjnrfOMQTTTUUSVOSWQUZUS‰ÃÕÏÕàßêéæéçØÙîèÙÔ¯‚¢ÖÔËÒÙØÓÑÑÏÓÓÎÌÑÓÔØÛÐÑØÙÕÔÑØÔÓÔÓÐÐÓÒÐÓÕÔÐ׶€nyzy€|{¡ÊÊÂÍÉÂÂÃÇÌÌÎÎÏØÌ•opg[~¹Ä·¹¬¬ÇÅÃŒckshgillnnlhhjoljiffilmhfgjhhijikiddjkfyŽ…Z2',+%%()**&)))+,+,.-/.,*)))((),-.--$&#%/03,&FZQ=,%'8SYQQSOCT]UMXZPIRUYZTX_O-+..Hi\8+.&/TlliiJ-(,'%.09/5VSJaxt\R{«_M‚¤‡ipoeeia\fouytvxg[hvqrrrsutrlmopponmpjbxŽœ¶À»¿ÆÆÅ¿¿ÌÆ¿ÀÆýÀÅÇÁ¾ÂÆÃÃÈÆÄÂÃÆÃÁÃÄÅÆÄÄÅÅÃÆÅÄÄÈÉÇÃÃÆÈ»ËÄŽqturrsrnnolnnmpnc^\]`itxqz~xwrbuyizysvtquvvvsqvwuxwrtxvtwxzwvzrk~–˜“’“›ž–‘•›™—š§¢›¬Ôëé瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€s¾Î´®¢Œ‰ˆ†ˆŠ†‚……‚†ŒŠ‡ˆ‰ˆ…ƒ‰‹…‚‡†‡ˆ‡‡™²·°°¯®®®®¯«°²³´±­®µ¹µ±µ¹·³¹¸¶´±¯²¶­««¬«©¨ª«©©§ ŸŸœ›•‘ŽŒ’Œ““”•—šœ››ž¢¦¦¨§£¦©¥£§¤¢¥©¬±²³ÈãÝÌÊÊÇ¿ÁÈÉËËƽÁÅÆÉÉÄÇÍÅÃÇÇÂÀÁÆÅÆÅÆʸ—€~x^RW[ZY[]\^\[ZYWUTSUVTX[NAC;;JYZZ`ca]^cbacffggfffghgglpi_VNNRTSTVTQHGRXPNSUHn­ÕÑÉÕãëêçêéÙØëãÕÓ²‡§ÚÙÔÕÔÒÑÑÑÑÐÓÑÐÕÒÒÙÖÑÔØÕ×ØÒÓÑÑÐÐÐÑÔÓÒÖØÓÎÚ¿Šw€~‡„…¦ÌÌÄÍËÇÆÄÆÊÊÊÌÏÜЖopfY~½Ë·¼·™°ÈÈÀ‹cjrigilmnnkihilkkljihjkkhhhjjiijnoihjjjwsS8*#) */*+*))+,,*+-+,./.*()))*--++,'&**+,6*5?6,'&(6R\P?=FIJOMQZUIHNONMHQ]Q1)*6ZlE/0"/[ngkjF)&*(),09/5VSJcys\R|ªœaK€¦‰hnpeeja[gotwuwwe[juqrpnorrooopqqqqppjczœµÀ¸¾ÄÂÁÂÂÇÂÀÄÇ¿ÂÄÅÂÁÃÅÄÃÁÆÄÁÁÃÂÁÄÇÆÄÄÅÆÄÂÁÀ¿ÁÅÈÄ¿ÃÆǽÍÆpstrqsqnrqkkllpoc\YZ_jvyzyy|vbvŽvfxwsxyxsoptvvvvrpruwwvuvuyyzzor’”‘“‘–¡š˜œ›•”™¡¦¢±Øíè倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÀÑ·³¨’Š‡ŠŠ‰‰†„‰‡ƒƒ†††ˆ‡„…†‰‡†ˆ‡‡ˆˆ‡—³½²²³²²±°°³±«¨«­¯³²·µ±´¶µ´¸¸¶²°°°°¯®¯°¬¨©­°««ª¦¥¥¡ž¢”“’Ž‘Ž‘˜œ™ŸžŸ žœ¢ª§ª¬©¨©¨¥¤¦¤¥«ª©®¯¬ÆçßÅÄÊÅÃÊÎÊÈËʼ½ÃÅÇÈÅÅÍÆÂÄÈÄÁÃÉÊÅÄÈ·šŒ…tyƒnVNXUX[[[]]\[ZYWUTTYYYZUG@C=KY[Y\`_b[]ba`cecddddfhjcdlkWFHRSRPNOQSSMPXXLBBEEW™ÚàÐÙììêèìêÚÖèáÒѲ‰©ÞßËÓÓÏÐÓÕÙÑÏÍÒ×ÔÏÐÎÐÓÓÑÓÖÕÑÓÑÎÎÒÒÏÍÎÑÏËÊÙ½Šw€€‡……©ÍÎÄÉÉÊËÈÇËÌÌÊÌØÔ™qncW€¿ÏÀ¹›­ÆÍÅdiphijlnomkhhhjlnomighlljijjkkiilkffiikkeQ8*$&K\6%,-+))''+0,*-20*(,**+-*''*&$+)(+2*$($&)$ :OOA;@PZMKJRZTKLGGDC?JYO5!":bzeE)&$=epjpb8"),()*09/5VSJdys[R|ªšaK€¦‰hopdfj`[gpttxytd]jtutsrrqnlppoopqrrskc|’´¿»¿ÅÃÀÂÀ½Á½ÂÇÃÂÆÇÄÁÄÇÅÄÄÀÇÃÀÀÁ¾½ÁÊÃÂÈÉÄÂÅÃÂÁÂÇËÉÅÃÅƾÐÈ‘orspprpmqpjjlmqpj`YY_kwz|tsyu^r{gu{utwyuvvrsxxsstxxsquwwtwxy{phuŠ’Ž’•’Ž•–Ÿ ´Þñç €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÄЯ­¨’„„‡†…‡…„‡‡‰‰‰Œ‹ˆˆŒ„„Š‰†„ƒ~†‡€~•³¸²²´´´²°¯²±¬ª¯°¯°­´¶¶¶³±´³´³²µ¸·³³³¶·³®±·°©©««¬«¤žŸžœ•’“ŽŽ‘”™Ÿ¢œŸ£¥«­©¨®®¥©©¥¥ª©¨°­¯ÉçÚÂÂÆÁÂÈÊÇÌÏÉ¿ÁÅÆÇÇÄÆÊÊÄÁÅÇÅÅÆÍÅÆȤ…kx…wdWSUPV][Z]\^^\[YXVVSRZU@=A8,#2UijiiV+1/%&)09/5VSJdys[R|ªš`L¦ˆhopdfj`[gpttxwtgZewwsoonmmoonmlmnprvja|”ž³½¹¼ÇÆ¿ÀÃÇĽÂÉþÅËÆ¿ÂÈÄÂÆÇÀ½¾ÄÇÃÁÆÆÃÂÅÄÂÂÆÄÄÄÄÆÇÄÀÂÄÆ¿ÒÊ“orrpoqplmmjmoorod[WZboxytz{xzuaqou~xsxyupqwxvwxxwvuttuvxvwtu{uiŸ¡–”““•—”œœš³âòç䀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÅÔ³°¬•†ƒŠ‹‰‹Š‡‡Ž‹‰Žˆ†Œˆƒ€‚…ƒ‡††˜²¹··¶µ´´³²°¯®°³³±­¬³³­°º¹¯·¶²°²¶·µ··¸¶°¯³¶¯°®­¯«¦§¥¡¡¢œ—˜œš–Š”››˜™œ¥£™¨°¬ª«©¦§«¦¨§§ª««­­µËá×½»ÄÂÅËÈÄÎÓǼÇÉÄÇÌËÊÌÂÃÊÌÈÆÅÃÊÆÕŘwiyˆqYXZXYZYWWY[Z[[YZZVQW[XF8=HJHS\^[[]^^bb`aeebfeddegfehjWCDGFKKJKNPQPNKYZQKC3/*))()*&+..--..,1/0+$(+#%)&"&-+' "DJFEEMTA4;@>>GKDEGBJZQGUTMMWWY`V1(*4QkT-1:Xnigjb?+&-+'*,9<0!9XUMdxs]Rw§œ]L€¤Šjoqgcib[frwqswtb[hptqopqonnlpqlilppxi`~•›²Á¼ÀÇž¼½Ä¼¼¿ÃÂÀÃÉÇÂÁÆÇÂÁÃÄÀÁÄÃÃÅÃÂÄÅÄÃÃÅÈÃÂÃÃÂÂÅÅÄÃÃÁ½ÎÈ–rqrsspoovkgnrnnse\[VXn{zuyxtyu_s¡˜qr{xustssuwwtrtuvuuvvvryxwsw}qbÑß¿ÈÄ»¼Ãø´¶´²°¶Íåîê怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÇÚºµ­–ˆ‹Œˆ‰Š‰Š‰‹‹ŒŒ‰ˆˆ‡‚€„†…ƒ„‡„„›·¿²´³²±³³±¯²´²°°¯­°¯®®±´µ´³µ¶µ¶¸¸¶µ´²²³²°¯®°¯¯²±­®®¨¦¦¤¢ œ›“Š—ššž £œŸ¥ž¢¯®«©«¬¬ªªª«¨¦«±²²³µÉåÚ½»ÇÁÁÇÇÃÈËÁ»ÅÊÊÉÈÆÈÉÃÆÎÌÉÈÈÆËÎÒ´Šˆqr‡oVRXYXXY[[YWZ\]\[XTQWZSFCGNUYXVVVWYZZ]^\]`a^``acb`djkT=9BGFFLOSSPNNORUPKJC78605=1-6?AGPE?FX^PJQYQOXZ[\H/+/*.HbrmlmmiZB-.0/,)&&+58,6URKdxt]Rw§œ`Oƒ¥Œkqsgcib[frwywwtd[gnmqsommmkjnqpoonltkbz‘´¾¸¿ÈÆÃÅÅÆÁÀÂÄÃÁÃÈÇÆÆÄÄÂÀ¿ÀÁ¿ÀÄ¿ÂÁÅÁ¿ÇÊÅÂÃÄÆÄ¿ÀÄÇÄÆÈ·þŽotuppsrmopokjlnmd[[X\oyxzytqzy`qª ojxsqyusstvwwvutstwxwuwutzxuysdÕçÒÙåàßÜßáàááÝâáåëíëé耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÇظ°¨•†Šˆ†ŠŒŠŠ‘’†‰Šƒ„ƒ„‡‰†‚€‚Š‡—´½·µµ¶¶´´µ³²±³³³²²¯¯¯¯°±±±´³²°¯¯°¯´¸³¯´¶µ¹¹µ´µ´®ªª«««¨¢¡¥§¢Ÿ••››š¡«§¥¢›Ÿª°³³¯¯°®©©ª¦¤©°²´·µÀÕÓÁº¹ÂÀÂÿÁÿÂÂÀÃÉÈÄÅÈÃÄÈÅÅÉÌÇÃÁ¥‹‰„~ŽŒdNUXVXZ[YWVWVWY[ZXY[YOGDDMVYXWWYZZ[]\]^^_`aa`bbbfi_Q02>C=CLJFGJNRQNJQMGCAAFNNNi¦ÐǾÑàéäêíßÜäß×Щ‚§Ú×ÎÓÔÓÓÒÒÖÔÔÔÖÖÔÐÍÏÒÖØÖÔÒÒÚ×ÓÑÑÓÐÍÓÕÒÔÊÐÙ½}…„‡ƒ…¥ËÏÊÊÆÈÊÊÉËÉËÍÓâÓ™mjfYw±ÉÇÑÈš£ÆÕÇ`hpgfihlllkggnjlnmhdfjmjjkjfefikkieehlmgi_m“x2"(>jP%#+)**%%(''*-,,-//.//("! )-+)+)$''#!'86;7/IBFMIHKHIDP_[QLHMJLVX[]K/(.,'/9FV\ZSG4'(-.)&)((/48,6URLdxs^Qx§œ`O¤‰josgcib[frwywwtc[jtwsqtqmnsmnppoonmrldxžµ¼´¾ÇÅÃÆľ¾ÀÆÉÈÆÅÉ¿ÄÄ¿¾ÁÁÀ¿ÀÂÁÀÃÆÆÄÅÈÆÂÂÍËÊÇÅÆÇÅÁÁÂÀ»ÊÃnuvootsllljikppmd\ZY^owwwyvt|z_p”lo|wtxstuwxwspruuttvwvtvwzvsztg“ÖãËÒáÝààâäääãàââæëëëìꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÃÓ¸µ¬“…Š‹†‚‡‹‹ŒŠŒ‡ƒˆŒ†„ƒƒ‚†‰ˆ†}~ˆ‡‚š¼Ã¾¸·»º³³·±´»¼´ª¬´²±°®¯¯²´°²´²¯®°´¶·°«±´³µ¸²²·µ®«­¨§«¯¬¨¨ª¦¢˜•™š™›¢¦¨¢œ¥«¯²±­®²±««ª¨¨ª«¯·º¸ÂÔÑÀ»¹ÀÀÁ½¼ÁÅÁÁÃÂÃÊÌÉÇÀ¾ÄÊËËËÈÊκŒ†’~w~Œ~ZMWXXYZXWVWXUUVUWWZ[YKA@FQYWXZZXVX[][[[\^]^_`_^ac\J918@>=BHGIMQRPMLLOKF@AIOPNJV‘ÌŸÓâèäêíÝÚãÛÒ̦¤ØÖÈÌÑÕ×ÑÐÓÓÒÓÓÕÕÖÖÐÒÕÕÔÒÒÒÕØÙÕÒÒÕ×Ö×ÔÕÍÒÚ½Ž}‡…€‡„†©ÐÓÊËÆÇÇÍËÉÃÃÈÎÛÓšmjfYw°ÒËÍà´ÒÔÊelthgihkllkfgnmmmmifgjmkjlkhggijkhedhlmkk`n„c+!'/UM/&,(('&&($'+-,+,--/0.(!"$&)*+(&%(($$IFY^D=NTJKX^XVSGHKQXVZ_P1%*+('(/,75-.-*,,,))-'$-58-8WTNdxt]Rw§œ`M€¡‡gmqgcib[frwvwzxeZhtvspnnnnnqonnnoopqmdwŽžµ»¶¿ÇÃÀÄÂÀÂÁÂÄÈÇÅÄÈÇÆÃÁ¿ÂÅ¿ÁÄÃÂÁÀÅÂÃÄÂÄÈÉÇÄÂÁÃÇÆÀ¾¿ÂÁ¾ÎÆ“nuvootslkiikmnnoe\ZX`ouwuyyv|w_r•ˆjt~xwtvusrsssspwyvuy||wwsuw{}maÓÝÄÍàßààßÝÝÞàâäáæêêìí怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÅÙ»²¦“Š‹†ƒ†ˆ…ƒ‹ŠˆŒŠ‚‚†‡†…‡‡‡„Š‰ƒŸÁÈÀ»º½ºµ³·µ¶¸¸±«°º¹²¯±¯­±º³±°±±°°°®³°­°³´¶µ®¯µ´¯­®±¯²µ®§§©¬¥š—››œ¢¡¡¤©¡ž¨¬³³¯¬°µ±©¬­­¯¯¬¯·¸µ¿Ó˶´»¾À¿½½ÃÅüÄÈÊÌËÉÊÄÂÅÉÈÇÆÁÉÒ²|„ƒfoŒnVTWZ[YVVWXWVRTRQSXXUJ@59JVVUVXXUTWZY\[[^_^^ac^^bZG848<<>BEFJIJLNNMLLQIB?DPRIENMj«ÍËÍãéåëëØÖâØÍÈ¥£××ËÏÓÖÕÑÏÓÔÓÑÑÑÔÖ×ÒÓÒÒÑÒÓÔÍÒÖÖÔÕÖÖÔ×ÕÙÒÖÛ»‹|‡‡ˆ†‰§ÍÎÆÈÇÊËÉÊÍÊËÎÏÙÔšmjfYv°ËÄź¹ØÖÊdlshfgikjmojehnlmnlgfhjnokggiijjjhefhkpljmtg@!''&+47/()%$&&))&#)-,*+.0-.,'! "$&),+)''"!&7?4;=+!/GRR\Q58KLIOZ[V\]RPUZ]VZaR/#(-**)/),)(,*&*))*,+&'/48,8XUNdxs^Qx§œ`M~ …flpgcib[frwtuzyeZjxutrppqolsolmoopqqlcwŽžµ»·¿ÆÀ¾ÃÅÆÂÃÃÄÄÄÄÅÃÅÆÆÅÅÄÃÁ¾ÀÄÃÄÅÃÂÁľÄÊÅÁÄÈÆÃÅÈƽÁÇŽÉÄ“otuppsrmlklolhjpg]XW`otxw{ytyv`u™ˆiuzuvrrtuwwvtswxusuxvptyvuuz}nd”ÙãÊÔãÝÕØØ×ÚÛÝâáÞâèçëê߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yÆÕ¸³©•ŠŠˆŒ‹…€ŠŒ‹‰Š‡ƒ€‹ŽŒ‰ˆ‡†‹„Š‰ƒ ÄÈÀÀ¿½¼»º¹½ºµ±°²´µ¸´´µ³¯²¸³¯­°´²­©ª°³±°³¶·´±³¶µ´´±®­°±­ª®±­¥š–™˜š ¥¤¥¨¢›¥®³±®­°²­¥®®¬¬®­°·¸³»ÍDz±¶·¹º»½½½¼ºÁÆÉÉÄÃÉÌÊÌÊÆÅÈÆÊÆ ~Šsd†›ˆ`UWTWZXWWXXVTUXUPRUOD>86ATZY[TUVVVWYZ][[_`^^ada^WG849368@CEKLLKJJMOSEDIGECDC?AFKJOQMMD204)5URLdxs^Qw§œcP¡†gnrgcib[frwtsxzi\hsxusrolnsqmmrtqnnrjayœ³¼¸ÁÉÅ¿¾¾ÀÀÁÁÂÃÄÄÃÂÂÃÅÃÁÀÂÃÃÂÂÅÁ¾¿ÂÄÅÅÂÀÂÅÃÅÇÇÆÈƾ»¼ÀÀ¼ÊÁŒrqrsspoojijnonnqk^VT`nszzzvt|zar¦•kpyqqwoqrtuvvvuttwyxy{yuqxyxzqbÖèØÞÛ½¾»ÁÒÜÞãÝÜæêäçæØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÄÖ¼¸¬”Š‡Šˆ…‡ˆ„‚€…ŠŠ‰ŠŒŒˆˆ‰ˆ‡ŒŒ‰Ž…|›ÄÌÇÀÂÆ¿¾º»»µ²¹¹°¬¯µ»º³­«­³«­³±­®¯±®¬­±´²®®°³³³¸·­°´µ±­°°­°®¡’–› šž§¨¢¢©ª¬²²®³µ¬£«¨¥ª¬­³µ¸ÅÌÀ²¬ª©·¾¹·¼½·µ¸ÂÇÇÀ¼ÆÆÆÂÂÆÅÇÏ˪‡„Œ‚y„‘‡nXVYXWXWXYWSRTURRTPE>>>=FU]YVXYSSYZVW^YY\`a^^adZF1,47457:>ADEEJIJMMKLQOFCBBDD?HHGLLZ•ÔìèçëìÜÑÝÎÊÅ } ÔÚÑÒÔÒÎÓÙØÒÕÓÐÒÓÔÕÕÓÓÕÕÖÖÒÒÔÐÌÏÓÓÓÍÓÔÕÊÏÙ½‡yƒƒƒŒŠ¢ÌÏÇËÊÌËÎÇÈËÌÌÒãØšlkfVr®ÎÌÔɨ°ÆÝÌŒakpghfglmlmigiqmjkkeelnljigefhnnheihgjpkdtzU>IC,&(&(+-)*'%'$"%&)+,++-.1+&#! ## !)+)+,)##/DW^^]\\[ZZ]^`^\Z\]Y\__][\^__]\\\\]KKKJJJJJHGFEDCBB??=:62.,,/'5XXNcws]Qw¦›`N}œ„ipqichaZfsxnwzsa[ittrrqpqqnlnprrqomxqf|’˜­»º¿ÅÃÂÄÁÀýÀÆÅÀÂÇÅ¿ÀÃÃÃÿ¾ÁÃÄÄÁÁÅÄÃÿ½ÂÅÁ¾ÅÃÂÈÆÀÁ¼ÁÄÃÃÏÃousoqqmlnnmklnood[[[`muyy{yv{u^t«žpnyursvpqvwuuwwyvruwvvxvu{yuxpd—×äÝÚÍÎIJ§¸ÉÒßãßÞäæâèçÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€n¼Î²®¥ˆ„…‚‚„}~€~€…‡……„„ˆŠ‰…‚†}¤ÍÏü»»µ¶¸¶µ·´°°®¨£¨®¯ª§©©§©¨¦§«®®­§§¨ª«««ª¨®¯­®²­¦«®µ¯ ¤°¯¬¦›”•—•“˜—™››£«¨©ª­­©¦§©¬¨¦¬¯®¯´²¹ÂÀ¶­¨¨°´±²¹ºµµ¹ÁÃÃÀ¹¾ÁÄÅÅÅÂÃÊÊ¡||ˆ}Š•‚hVQX[VZWVWWTSTSSWXL<6;DLUXXXVUWYWSTYZY]\]^][\`RB30368;569<@CFGIHHJIFHKFCDB<>DEJJEDNNg®âïêêç×ÔÔÌľœ}¡ÔØÎÏÑÒÓÖ×ÓÏÐÒÖ×ÒÏÓÒÐÒÕÓÑÒÒÒÒÕÔÏÑÔÏÎÒÒÕÌÑÚ½‰{………‘Ž‹¥ËÐÌÌÆÉÏÌÊÌÍÍËÍÜØ›mjeUt²ÑËÔа³ÃÖÎŽbjphiginonoliknmllkgeilmmjfefhmnifhggkihimqW8;D7 &&)#&)(()&!"'),-,-./.+&! #&'#%&+/+)/0*"+CX]]\\\\\\^\Z[\]ZXRTUTOLKLGFEDDDDE;;:87543....----.-+*)+,-11) 7UTLdxt^Rx§œaM~¡‰jorhchaYfsxxvuse\jwtomnoqrpmoqrrqnmrkay˜®½¸¹ÂÅÀÀÁÄÃÀ¿À¾¿ÃÆÃÃÂÂÅÅýÁÂÁÂÁÀÁÁÁÅÉÃÀÄÉÇÆÁ¿ÄÉĽÀÃÃÁÀÍ‘ousoqqmlmnopppoofZXYapuvtwut}{`o¦™lkwutvsvywqqsuuwxvsstuwutzxuwod˜Øâ×ÔËÑ׸¦¼ÏÍÖäãáåæâæâÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€lºÌ°ª¡„„‚€ƒ}y|‚‚}~„ƒ€‚††…„‚{¬ÓÐÂÁÁ¿º¹º·´¶¹¶±¯®«©°®¥¥¬¬¥£¨§¥«¯­«¨¨ª¬¬©©ª««ª«¯ª¦¨««°¬¡§²±²¨ž˜•“‰Ž“˜˜˜›Ÿ¡ ¡¡£¥¦§¨¯®¬«°´´±·¹½À¼®¤¤«¬­«®±²¯²¶½½À¿¸¸¿ÃÄÄÁ½¿È¿”t}Œ„|‚Œ}m[NT_`\WTUVTTTTSXWI:BGIKKMNMIHIG@@ABGKHPQOESOK‚ÒõìêëÖÓÔÎû›~¡ÒÕËÎÐÒØÚ×ÕÌÏÑÒÕÕÒÒÏÍÐÔÑÍÐÕÔÒÐÑÓÒÑÑÎÏÎÓÍÒÚ¼Š{………‘ŽŒ«ÏÒÉžÅÌÉÉÍÎÒÑÐÛ×›njcTw¸ØÌÑ˪¯Ã×БciphjjinonokiklmmkkhgiimnjfefglmkggfhmlkkcZchYC:'"%&+'%)(')&""$&()*+,-+)$#)*)').2-,3/' #:NRQPNMKJIB@>>@@?<9::840/./.-,++,,++++++++++,,----000000//11+#:XVNdyt^Sx¨bL~¥jnshchaYesxyutwj^hvyplmoopoopqrqomlpi`x˜¯¿¸»ÅÅ¿ÃÆľ¿ÁÀ¿ÁÄÂÃÇÄÁÿ¿Ã¿¾ÃĽ»ÀÂÃÇÆ¿½ÃÉÈÂÃÆÄÄÅÀÄÅÄ¿¾ËÂ’ousoqqmlnlkjjknpfZWX`ouvtwtpyy`o©po{wtvqsvvvwvqmttsvtt|uusywuwnd™ÙàÒÐËÔìÊ°ÁÓÊÑèçäæåâäÝÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€p¿Ó¸¯£†…ƒ„†ƒ„ŠŒ‰†‰ŒŽŒ††‰‰ˆ‰ˆˆƒ„~¬ÒÏÊÌÍÊÅÄÃÀÀÀ¿¶·¹´³º¸°­²±ª«®¬©ª­®¯®¯°±°°¯¯°­«°±­«±³·³±µ·µ¶º²§™“‘–——••˜ž¡žœ¢¦¤¤¤ž¥¤¤¦§¬®¬«±µ¸µ¥›Ÿ¤¥¦©¬¯°°«°¸»½½¶ºÀÀÀ¿¼º¿Ç¹p{Š…}{…xfXT[^\^WRSUUTTQMOPC9@MSTVYYWWXWTU[[VUYZ\YV\bYI886203675558BGIHNRRRSROQJKQUYXPQNLMUQIRPY”âìĹÆǺ³–u‘ÄÏ¿¾ÂÄÁ¿ÁÃÂÅÁºº¾ÂÅÅÂÅÌËÈÈÉÉËžÄÊÉÉÍÊÉÑÈÅÍ·ˆy„„ƒŒŠ«ËÒÏÊÄÊÉÃÇÇÆÍÊËàØ›mjeUt²ÆÌßÍŸ²ÍÑ͘gfrlgfinonokikknnllifgkkkigfgimiihfhlljsdaŽ©‹qaOBDRT>*"))%')%"&%%'))('#"%*)$%)'(,-.5:76431,#!%&(''&&%%$%#!!##!$"""%$! !"  "$%$#"$$$'@XSLdxs]Rw§œ`M}Ÿ‡jorgag_Xdqv|wvwhZgyxrppnnnkllmnprstpi_w–¬¼´ÂÉÂÂÆÂÁÂÂÃÂÀÂÅÅÀÀÂÂÂÁÂÂÄÈĽ¿ÃÁ½ÀÃÁ½ÁÄÂÀÁÁÁÂŽ½¿ÃÄÂÁÍÂousoqqmlkgimniimh[WV_nvxytpr{u]t¥˜kiwuuxtpqtwxuptvwwwxwtpvvvvz}na”ÔàÙÜ×ÞéàÔÙßÝãæèåÞÞæåÒ¼€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÂÜ´ª™Œ‰‰‡‰Š‡ŠˆŠŽŒˆŒŠ‹ŽŠ‰„ƒ­ÕÕÍÆÅÓÞÓÆÉÄÊÉÇÌÉ¿ÄÀ¿ÀÀ¾¹¶¸¸±¬²·¶´´´´²³µ´±±·´­­¯¯°³µ¸·²¯±´º¹ ™ž˜š¡˜–Ÿ£Ÿ¢¯ª­°®°®¦¤¬ª¦©§¤¨¦¤­³ªž™•š˜”“˜œ™š ¨ª®¯¨«´²µµ­­µº›ukvrs~}zŒ\LW^ZVUVWUQQSIA?>;;8569:84889;?CFHMPPLLPTTSPQQORXWQOXORYMSRRiºç̽¾À±«”zšÍØÆÆÍÏÈÆÍÑÒÍÇÆÉÈÅÇÊÆËÔÑÈÆÈËÄÃÇÅÃÄÅÅÃÃʾºÃ®‚t~~~Š‡…¦ÌÖÍÅÄÌÈÒÏÉËÕÑËÜØšlkfVr®ÉÊÛÍ °ÈˢggslfeglmlmigilpnjiiggjmmieehjnhhhfimklkebgoqdEEYPIQ;*$*("$('$%$$%''&$$'+,&!#()$$(+397740/.*""$"!!%%%%%%%%++,-/01155568:<>E<9>R]TQfzv`Tz©žaL~¤Œjnsfaf_WdqvxxwscZhuysonnrrnrrponnnnvodz–ª¹ºÁÈÇÆÇÃÀÂÃÆÄÀ¿½ºÁÅÃÁ¿À½¾¿ÂÅÿ¿ÇÄÀÃÇÄ¿ÁÄ¿¿ÂÅÃÀÀÿ¾ÍÄ”ousoqqmlpkjnnklrg\ZX^lv|tvvuyrYn£™op}yuutrsusrtutwxvvttxqwwwv{~ob•ÕÝÓÖÕááâáäããéåéæÞÝæåϹ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÃ׿¹°›‡†…ˆ‹ŒŠ‡‰ŠŽŒ‹‹ŒŒŽŒ†‡‹ˆ†«×ÙοÃÎÍÍÒÐËÌÈÇËÈÃÄÄÃÃÅÆÄ¿»¼½µ±¸¼µ°´´´´³²°¯®¯²³°­®³²±²²±³¶´¸¶Ÿœ¤œ—¡¢Ÿœ›› ª²¯¬®²°ª¥¦«¬¨¦ª­®«¯±®ª£–Š“”’“˜™—™š›¢«¬©§¦ª´·³«­·µ“pnwpt~}p|nSNZ`YPOSSQQPB<=ACLVWUUVVVWWWWWSNRYXQ[WC5<=8;<=74:;8:<56<=@EDLNQQRSTTYTQQRUXWQOQURNLILQV†ÓÙ³½½³¥Žy—ÌÔÇÊËÎÏÌÌÓÕÚÛÓÐÐÊËËÐÒÒÒÎÌÑÔÑÍÏÓÑÍÎÔÎÎÑÌÈÙņr}}~„¢ÏÐÆÏÏÌÊÊÊÊËÓÎËÞ×—nodVz´ËÉØÍ¥·ÑÙÉ•bhthhfhkmmkihhllkklhefjjjiiijklnkebejlijhg_fviG^jL?H6$$$%&((&$#"""%((%',-+(##&"%),-035355/-/&!&'% " !#$$%%%%&(*+.10--279;989:;=@BA9>IMQVWUUUVVVVWUUSRRUXYXF309??>@948;859957;:=DGINQRPPRUSTWWRRVVPRTSMJGBOROj±Ð¹³µ­£z–ÈÎÌÏÎÏÐÍËÏÍÏÐÎÓÖÌÉÍÐÐÐÔÒÌËÐÏÏÔØÔÏÐÕÐÑÔÏÊÙÃy†‡Œ‡ˆ¨ÎÒÊÈÃÅÇÊËÈÆÏÏÎÞÛšmkaU{¹ÍÈ×Ѭ»ÏÓ̘cishgehkmmkihhmnnmjfgllnomjijmlnmieeghmniifgme`th:(31%%$$%''&%#$$$"#%'*.,'%$%'%$$)/3216310.-&&+-*()++*-36533369<@@@@ACEFGIIEEINPNNMMNRUVZZTW\^b`bb_]_decfgjfd^RTexv`Ry§šdP{œ‰knqhagc[epxuuxyh^jtspqpnoqoqrqpppposg_|“˜­º¸½ÆÆÄÅÃÄÄÄÄ¿ÀÀ¾ÁÀ¿¿À¿¿ÃÆ¿ÀÆÄÁÁÂÄÁ¿ÁÃÄÄÄÅÂÀÀÂÆǾÃû¶ÌÅ‹kttqrqmmikoojgjpf]XZ`mwxswwtzu]q¡gmwtvxvussuywtvtutsuxvtxwxttype‘ÉßÜ×ÖãæÜßéæÜÛàåçÛÒâãƳ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÁÕ¼·®šŒˆ‡‡‰‰‰‰ŽŠˆ‰Š‰Š‹ŒŒ‹ŒŽ‹‡‰ˆ…¤ÐÕÉÉÑÔÏÐÒËÑÍÌËÉÊÎÏÍÎÍÉÆľ¾¿¾³­¸Ã¿¹¹¹¸·µ´´»µ¯®­­®±³°±²°±³²´´¡’š¡žœž¡£¡š ¯­®¯ª©¯°¦¢©¬«ª¬®°¬°¶²¡”‘ŒŒ“–’˜ žœ¤¢¡¤¤¨®«¦¨¥‡lkmfr€rn{…sZU[YWXVROKB?;CQUTUVTTTTUUVVSVVQOSY\H3-6:=?9<4389556646:9KTTQPQSSSTTUUUUUXUPSVJ7&'-36:==87;91054335;@ABDHFGKNLLNONRVVWVSQUUI?CLNUaLEŒÊ¼¢¤Ÿ˜ˆv“ÆÌÃÇÆÅÌÏÍÊÎÐÒÏÎËÅÊÒÐÌÉÌÕÖÑÍÒÒÐÓÕÕÕÊÌÔ×ÔÑÝÁ‰z††ƒŒ‰‹«ÊÉÇÌÃÆÑÏÒÑÏÑËËàÙmidVxºÉÎÞÍ¥ºÏÍΘchtijjhkmmkihhhklkifeilljhfeggmklljfhllljgd`jƒn1$&&#%&$""$%&&%# !$%$'&#!$%&('$$&+./.0242140&"5N[]\a_ab`[[_Z^ca][^baa```abcege`^adecge]]ce`cc]\]^gh`hi`\`eeegf^^^RNgusaSu¤›bP~žˆimthagc[dqwuvzwdZivqqooqmkopnnoomlnti`xŽ–¬¶·ÂËÅ¿ÃÄÆÁ¼ÁÇÄÁÁÁÎÍÄ¿ÂÀ¼¿Ãľ¾¿¿½ÂÁÀ¾¼½ÁÆÃÂÀ½¼ÁľÀÃÁºÆÀktuqrqnnjhiklllmd[VW^kuvtrsuyn[y§hovquwwuuttstvrutrtwvvvuqtuvxkj”Ñå×ÍÑßãÝßããàÜÖÔÙÜâìÙ²¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rÃÛÅÀ¶Ÿ‹‹Šˆ†‡‹ˆ‡‡†……†ˆˆŠŒ‹Š‹‰Ž‡„­ÚØÇÌÒÕÐÊÈÊÎÓÌÅÈÉÈËÌÎÐÐÍÊÆÅÅÍƺ¼ÄÅÅÃÂÁ¿½¼»»½»¹¶°­±··°°´±®°±´¯¡–™žŸ œœ¡£ŸŸ©­¯³³¯±®¥£«°­©­±²¸³±¶º´¥—”“••””’‘’‘‘”˜–›œž¢¦ž…hjz|zxxtxqu…€fWWUSLB@?;;MWUTTSTTTTUUVVVURSXXL6&'-07ENKGC?>>4-/6666;CCBEHDDJMLJLNNQSRTWVUYUG;BMQOD9]°Ð°¡ ›”„s’ÅÍÁÅÅÆËÎÌÍÎÍÏÏÑÏÈËÒÑÑÎÎÒÔÐÒÓÏËÍÏÏÐÇËÒÔÐÏÛ¾‹z‚ƒ„‹‡¦ÑÏÄÍÌÉÈÌÏÏÏÐÈÄÙÖœlieVv¸ËÑàϦ»ÓÔÍ—bgrikkhkmmkihhooljheeihkmlgffhkklkiikomlgjiZ\tQ%#*%%"&%#"#$%%%##" #$#$$""%%%''&%'),./3/2752/+*#)BZa]Y\\^a`\]aZ_cd`^^_bba``abcdfd_]adefhe_]ab_bb\^_ahhajkb^eihhig^_`SNeus`Rv¤šbO|ˆimrhagc[epxtuyyf[hssnpspmnnqnmppllovk_v‹—¯¹´ÀÇ¿½ÆÇÄÀ¾ÅÉÀ¼¿ÁÁ¿Ãý¼¾¹½Â¿¿ÁÂþ¿ÀÂÂÂÃÄÅÃÁÀÁÄľ·ÂÉÁ¹Ê‰jstpqplmkjjllllmd[VX^kuwvttvzoZv§—mpytqstvwxvuttttvvuwywswvwssxoc’ÓæÕÑÚåãßßáßààÛàæâãëÔ«¢€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÃÙþµŸ‘†ŠŠ‡††‰ˆ‡…†‡†„‹Ž‹‰‹ŽŒ‰Œ‰¨Ó×ÍÑÑÍËÌÎÐÐÒÐÏÏÌÉËÌÈÈÌÏÌÉÈÄÉƼ»ÁÇÉÂÃÃÂÁ¾»¹¹¹ºº¸´´·¶¯°´²¯²´¶¯ –šžŸž› ££¡¢®²±±³µ´¯¨£¨­­¯²´´´´·¼½´¤—ž˜––”•—”””’’””“—˜—–š™š¢¢‡nrxmltoqor}~qcXROI?:=>FRVTVWUWUUUUVVWWTQSWO<*#$0:DSYRKHC<:6..6;;9;ABDJGCDJMIIMMMPQOQVWQXUC8>GF2-K–ÙÑ¥¡–Ž}mŽÄοÂÃÆÊÉÉÎÍÊËÌÐÎÇÊÏÐÓÒÎÐÕÖÏÎÌÎÑÏÌÍÉÍÑÏËÊ×¹‹{ƒƒ…’ˆ¨ÐÎÂÌÔÒÇÏÏËÇÌÈÆ×ÑšljhVr´ÐÌ×̦¹ÒØϘbeqgiihkmmkihhllklnkggjlnlhfgjnonjghkmnmghhc]N."'("!!#"#$%%$#!#$$#"!"%%%&&%%&()(').25037511//+4L^`\[[[^a`\\__`bba```_^]]]]^_bdb^\`decca``ceffe_bfgkidlmc`hkhghf\^aUOdvu^Pw¥˜bNy›ˆilohagc[dqwuuxwf\hquopspmnopoooonnnqiby›°·´Àƽ¾ÉÈÀ¿¿ÄĽ¹½Á¿Äž¾ÄÄÀÁÃÃÀ¿ÁÁÁÀ¿¾ÂÅÅþÀÁÁÄËËÄ»ÄȽ´ÈÄirropokknnmlnpold[VX_kuwyxvw|qXp¦–loytrtvvustutqusuwuvwvtxwxttypa–ÓàÖÕÙâäáßÛØÝáÞÛßÞßæÓ²©€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÄÖ¼¸²¡–‰Œ‹‡„„…‹ŒŠ‡ˆŠˆƒ‡ŠŒŠŠŒŽŽŽ‡‚¦ÓÕÊÓÕÎÎÒÑÍÕÏÎÒÑÎËËÍÉÉÍÌÇÆÈÇÅľ¹ÁËËÈÇÅÃÁÀ¿¿»¹¹»»¸µµº²²¶²®¯²¸¯Ÿ—šžžŸ¢¢ Ÿ ©®ªª°´®ª­ª¨§«°²°®®²»Äø©Ÿ ž™™ ž–’“–‘‘–‘•Ž‘˜™™œ˜‡nilkotvqqtrlqyy]SMH?=DJUXTQVWUYUUVVVWWWSUVO@0('(8GMMJC>;;>@EOFCELLGHNNNPPOQTUY`YA2;C?;RÓïÑ¡••‘ŒoŽÁÇÁÃÄÆÆÂÁÈÄÄÉÎÒÎÅÇÕÐÑÑÎÑÖÖÓÍËÒ×ÒÐÕËÏÑÍÇÇÓ´‡{‡…‚‹¥ÄÌÏÑÊÊÇÍÎÊÇÏÏÈÒÔœjddTs¸ÍÁÏΫ·ËÓЙbeoegfhkmmkihhkmmlkhgkpnlifgikimnkikmlknhcm‰C%$#$#$#""#%&&$"""#%$!$(($$&&%*(&')-./64531340//;Q_`_caacea\Z]db`_`aaaeeccbcddbdc_^bfgifedddfhfd^afgidgoncailgjkg\^aUNcwu]Ox¦—bMw™‡jkmhagc[dqxxvwue\irrpmoroovoqqnnppmsjawŽ›³¼¸¾ÄÁÂÇÄÀÃÁ¾¾ÀÀ¿Á¿¾¾¿¿¼¾ÄÁ¼ÁÅÀ½ÀÀÁÁ¾½ÁÆľÃÆĽ¼ÅÇÁ»¿ÆĻſhqqnonjjipqkinoke\WX_lvwwvvw~uZp¤’kqztttstsqrvvtqvurtutsxwtwwx{ndžÔÛÖÕÒÚçààãÞÜßâàÜàãäÚĸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€qÁÙÆ¿²ž–ŒŠ‹Š‡ŠŒ‰†‚†‰‡†‡ŽŠˆŒŒŠŽŒŽŒ†…¦ÌËÄÍÕÓËËÏÒÒÏËÊÌÎÎÍÏÏÐÑÏÏÐÏÍÈÅÄÂÁÈÏÈÄÈËËžÄÀº½Â¾»º·³³³´´³°®¹µ¤—™›› š›œ ¡œ§ª««§©¯¬¢¦«¨§°²¯¯µ½ÀÅù¯¤Ÿ£¢ –’™“ŽŒ““Ž”•“”šŠm_ksnmsqhouki}ŽyVKQG@JT]RVUTWQRTXXRRXYVX]W@65-*+CLG;,*,;B>30246=?88DEEPIBEMLIJJJLNONNQTWVYC/9B?h´Ñá梒•Œ†|nŒ¾ÇÀ¾ÁÆÄ¿Ã˾ÂÉËÊÅÂÌÖÏÏÏËÍÓÓÓÒÍÐØÓÌÒËÍÏÒÍÐѽ‹z‚€Œ‹‰ªÉÎÎÐËËÉÈÊÍÎÎÇÆ×Õ™ljeWy¹ÉÆÐ˯½ËÑǘaipifigllklifhmllkhfgjlpnihddhlnomihkolon_|·™>$#$$ # !""##$$$" !"" &')('&&')&&)++.32454477657;F`bUbdabdb]\_defedcccadgea`ejcikfbcgigikd]ekelg`]^bfheig_\__ZY_[]b[RMg{u\Qv¤›cSz™‰ijsk`b`]hqtstvwh[gutpqqooqqppqqqponvoe|‘–ª¸¸¾ÂÁÅƽ»¿ÁÂÂÂÁ½º¾ÁÀ¿Ã½¼½¿ÁÂÂÂÁÀ¿¼½ÀÀ¿¿ÀÁÂý»¾¾ÂÄÀ¼ÌÃŒkqtqoonkjkllmmll^YZV[lysutx€tYt¥‘gmvssstvspruuuuuwsosxwwwutou}mfšÒÙ×ØÒàáââáÝÛÝàÞààéâÌÅÄ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÅÚü±ž–Ž‹ŒŒˆŠŠ‰‰Š‹‡ƒ†ˆ‡Š‹ˆ‰ŒŽ‡…¥ËÌÅÑÏËÎÌÇËÑÍÌÎÎËÌÏÍÉÌÓÒÎÏÒËÄÅÇÂÁÈÌÆÈËÅÄÆÁ¾ÂÂÄÁ¾ÀÁ»´¶¶µ±¯¯°µ·§””˜—”•› ¦¡¢¨¬©§¦¥«®¬©­·¿Ã½ÄÇÍÉ»±¨­¬¦œšžž™š¢š—ŽŒ”ŽŠŽ“•“ƒjbqxmgmoktxpv‚ƒ~v_JFNTV_USOQSOUVVTSVXVR^YL835-,7DBB@1''29;88975;A@:;DKMHBEMMKLMNNLHINQQQV^M8145,+AE>BL?0./29>??;65<<9;CE>322355313003750+,3?P]\TScvr\Rv¤ePv–‡koug`fb[epwwwyyj]huokmpnlmnpooonmllti]v‘™ªµ¬¾ÌľÃ»À¿Áý½ÂÁ¾¿ÀÀÃÄ¿Á¿¾¿ÂÄ¿À¾¾ÃÀ¼¾Â½ÁÄÁÂýº½À»·Ç¿ˆkqtqoonkiijjjjkkfXVX_kt{wvsszpZx«”hnywz}yttusqrrpuuqruvvvvvupu}ldŸÚÚÒØÒ×æßÜåìàÕÙçßáèà×н€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rÃÜÈż§›‹‹‰‰‹Š‰……‰‹‰…‚ˆŒŠˆŒ‰Š‹‹…¢ÊÑËÐÓÐÌËËÈÐÑÐÍÊÌÏÒÍÍÍÍÌÐÑÎÇËäîѼÆÓÑËÌÊÇÈÇÈÊ¿ÂÅÃÀ¾º·´µ·º¹¸»¸£‘•œœœ—›››œ›£ªªª§¤¨«©¢¤¦§§§§§««´Çɽ¶±¬­­ªª«¨£¡¤¤™—’–’”–“Ž‹Ž’‰t`\^[^hqpqtw}}x||fHCT^ZXWUSTTRUQUXWTSUWM>4286)*>EAAEMPN79FLW`WOfws^Ssž˜`Kx›Šmpqd`hcYbq{|xvui^iuxposspppqponoprspi`y‘˜­»¶¸¿¿½Â¾¸¿ÄÂÀÁÀ¾ÄÄÁ½½¼¿ÅÀ¾ÀŽ¾ÄÅÁ¿¼º¿ÅÄ»¿À½½ÁÃÁ½ÀþºÊŠkqtqoonklkkjkkmmcWTT_pwvz{wvzpZy¨foyrsvouvsqoqwvustyvsutvvwrv|ke—ÓÓÁÃÉÚáÜÞêê×ÏÚäÞæßÖç怀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÇÝÆÅÁ¬”ŒŒŒ‰ŠŒŒŒ‹ŠŠ‰††‰‰ˆˆ‰‹‹ŒŠ†¡ÉÑÇÑÏÍÓÒÍÐÎÌÌÑÑÍËÌÎËËÎÎÐÐÎÌÐéôÛÃÉÖÓÊÍÍÊÏÏÌÂÉËÈÆÄÂÁÀ¿½¼»»ººÆ½§–—›¤¤Ÿ›¡Ÿ ª¬©©¬®±¬£¡¥£§¯­©®°¬µËÍ»±®¯°°±¯«§¤©®©¢›–Ÿ£˜’–™•‰p[[`_^hojdgilu|xuzybQVXf^RRVXQTWTPSXSI6/034-'3HJ:6IYVH/47BJIGGJJIJJJKMMLJJLUYWRSSG^©ÞåÝÄŸŒ„~}xnŒ¾Æ½¾ÀÀ½¼½À»ºÂƾ³¼Ü⺰ÄÉÆÆÄÈËÑÐÊÍÏÉÏÍËÏÍÐ͵„w…‡…ˆƒ«ÎÐÇÅÆÌËÇÈÉÆþÃÚÖšljcTuµÕÍÇ¿³ÆÐÙÍ‘]nqhhggllklhehkmmifghiiikkhgggfikjfgkooogijcr…T<8*!"&##""!! #!!##" "$%%%#&&%'.1146656897960!2i†„yW5)(%"$&')))(()-../03576?BGFAAGHDCHIGIEGJKLNNLQSVVOPTIX›ÚêÜÁ›„}{ti‰¼Å·¹¹¶·¹¼¼¿¹¼À¾¹ÆäïÀ­¿ÈÅ¿ÃÈËÊÉÍÎÉËÈÆËÊÎ̳…x†‡†Ž†¦ÌÑÈÇÆÊÇÆÁ½¸º¹À×Õ™ljeVx·×ÉÉƲ½ÆÍË`qodhjimmlkgdfjlljgfghlmkgdcejlmmkhgjmlmihdax‘wF51$ "$#"""! "#" #$$"!!"###!"%&$(-1146656897:903k…ƒŒzZ<4;=86KDA?>@FHECEBD@?EFEGCJNMLNOMPRW[OLSIX–ÛîÚ¿„„|xqf†ºÄ¶¿À¶¯³º¼º¹À½»ËìíÈ·ÂÆÀÁȾÂÀÂÎÎÊÌÊÇÆÊËÏÍ´Š|†…‚Œ†‚£ÍÕÎÊÅĽº¹½ÃÌÌÌÜÕ™ljeWy¹ÓÅÎÔ¼ÀÆËÐ\oqhiggllklifhijllifeghkjhjgeglkjighikjmki`c}’c9.-"#$! !!""#!%&$!!"#"!!"$$#"%"#'*+/3467569977>41k„Ž‚jYW[\]^_```aadbaacdeedbbeedeicdabigcefdcdeecacabhmnkgG9JSWZPSfvscXu ›_M£†empgagbZdpwwtssf\huxmjopmoqrqpooopprh\u—¨³±¼Á½ÁÆÂÂÀÀÁÁ¿»»¾¿ÀÃþ¾¿»¾À¾»½ÂÀº¹¼ÃÀ»ÂÉĽ½À¿½Äƽ»¿Á½¹ÉÀ‰kqtqoonkkjihhjlmdWVY_jpuxytptjX{¡Šcq}tswpqqqrppswrqstvxusuwysw{inÀ¾ÒÑËÄÉÚÞÐÑÞã×ÔæäÚêèÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€s¼ÒÃû­ª’ƒ‡Œˆ…~…‡……„€ƒ‡}‚€ƒƒŠ‚ƒ„}—ÃÎÃÅÇÆÂÁÅËÆÂÃÆÇÇÇÅÃÄÃÄÇÈÇÆËÖèíèÞÑÎÄÄÅÃÀÃÆÂÀ¾ÁÁ¼½¿¹»»½¿»³µ¿¾À©–˜ ¤ž¦©¤¢¥žŸ°·®¨ª¬­­­¬ª¯±­¯³°³»ÄÏÎý¸´¸´°¯µ·ª«³²ª«ª¡£§¨¤¢¥¤ž›š—ƒlb[\gggie`fonpq{wx}xz™jUPQSVRQXT:)1565/)')+CHB8@OK:2+$!5F??DABDECDGBA@ADFFEJHGGJMOONRWYSPQLHŠÚíÞÈžƒ€wxte¹Åµ¸Á»µ»½º·»¸½¾¹ÌèéÎÇÄÿ¼ÌùÅÌÇÇÈÊÌÉÅÉÌÐη‹z…‰†‡…¤ÌÓËÁ¸¼¹¼ÅÇÉÒÊÃÚÖ˜lkdSyÀ×ÀÅϾ¾ÒÑ͉boqklbelnljedikmnnlgdgmiffhhijkmkikijpkmhk_e••Y0+%# ! !"#$%%$#""!"###!!##!!#&%%())-39328:648<>13h‚‡‹‹‡„s`a`_abbbccbj`dccjigfecbeghidedcdbdkcmjeeegafejonkhcKEMPY_TXewsaWx¡—dPx–…knoe`gd\epvxtqoe]gpupnmloqommmnooppjh`vœ¯¶´ÁÇ¿¼ÀÀÂÅÁº¼Ã¿¹¼ÃÄ¿¾ÀÀ½¾¿¿½¾Á¼¾¿¿¿ÀÂļÁÄ¿¼¾¾¸»ÂÇÀ¸ÆÀŒhnqonnnkmihiiklhcXUW`ouwxwprym\|ŸŒlqxutvuqnrwuqtrrssrrrswwtvtrukgš¿½ÆÚØÔÉÏÑÐÕàåâÏÚçäßëëÕ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yÆÛÇÄ»©Ÿ’ˆ‡ˆ‰„{‡‡†Š‹…‚„‚€€ƒ„…‡†„…€ÊÔÄÊÐÒÏÌÍÏËÌÎÍËËËÉÊÌÌËÊÉÉËËÔåìêâÔÎÊËÍÌÈÌÐÍÊÆÈÉÄÃÃÀÀÇËÈÂÀÆÎÇ號£¤¡Ÿ¤£¤¤››©®­®ª¦¬²¯§§¯²¯°´²µ»ÁÌÎû³¸¹µ±°µ¹¯ª«´²¬¬ª¨­¬­©£¡¢žœŸ’ze]`irihmiacktwxvst{„’…gSRUPKV[E0-0354/(%(,AIA6?PM?4)%&087>C@>>>?ACBA@ACEDDFFGJMNNMSORWRQRJM~ÍñåÇ›€zzwmŠ½Ë·¼À¹¸¾¼½½À»¿½¯ÁèðÓÈÂÀÀ¼ÃÄ¿ÈŽÂÉÍÍÈÈÑËÇÈ»…{‡†ƒ†€„¬Ä½µµ¶ÃÌÌËÈÈɾÁá×–jmfQvÀáÊÐÔÀ½Î×Òbkpijeelnljfdhknmljhefkhjnkeeljjihgfglnjee_d‡Ž_/&&!# %"""! ##!!!""#%" !! "%&%&)*+/4778899889=15kƒ…‹Š€~mdadfffinmjc`bckoeeiccijhghaegfcadibiffecebeckqlhe`FBKMV_TUewsaWx —cPy—„jnpf_c_Wanvzywtf]htupnooppnoonnnnnnmj`t›¯¸±º¿¹¼À¼¸¿Â¿¿Ã¾¿ÂÄþ¼¾¿½º»¼¿À¾¼º½ÀÀ¿ÀÂÁ¿¿ÀÁ¾¾Ã¹»ÀĽµÅÁhnqonnnkliikilnl^WY[amtwtzutyo\v¨nuxrpsrrpquvroqturswwttwtustxkf”»ÄØðëáÐÔÓÐÓÝâàÏÜêåÚàäØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÆÞÈƯ¡“Œ‡„‰ƒy€„ŒŒ‹‹‰‰…„‡…„ˆ‰ˆ‰ˆ†ˆ† ÍÔÄÊÑÔÒÐÐÐÍÉËÐÏÈÉÏÏÐÑÐÍËÌÍÍÕäëëãÔÍÎÏÑÏÍÏÓÑÓÌÍÏËÇÇÈÌÐÑÉÅÇÉÆÈç”™žžœ ¢¤¥¢šœ¨®«¬­­«©§¤¦®±®¯³³·¼ÁÌͺ±µ¸·¶±²¸²«©¶¸¯­­ª­¯±®¦¥§¤¡¤ ˆkaiqnebjka^hhiloqpv€x‡ŽuZRSNOWM5-1.033.'#'-;HE7;JOJ9)*00.2>@AA??@A@A@@ABCCBFEEFJMOPSOSTNPRJPÒêܺ”†Š…}vnƒ­¹°µ´­±¶²µ¹¼µ¸¶£µæðØÎÆ¿¾»»ÃÁÅÉÐÏÇÏÎÊÍɼÌÕ®||ˆ…„ƒ“Ä´½È¾¿Ç¾ÄÎν¾ÝØ•hngQu¿àÖáØÃÄËÔÖ•bfohhiflmlkfdhjmmijhfekjlmkgfgkiihedgjlijgefrqU,$% # "!! !""'" ! #'&%'*+,05679999988<.7o„…Šˆ€|tk[Y`ec`^][ECXlmc]hvh^]]XZaaVPWej^OQIDQQDCE@D\omhf^GCLKT_UQevs`Vw —bP{˜ƒhnrhaf`Ycpxwxzyl`ispnqrnjmopponnmmlqk`sŒ™®¸³¾Ä¿¾Â¿¾¿ÂÀ¾ÁÀ¾À¾½ÀÀ½»½¾¼¼¾¿½»»¾¼¸·¾Æž¾¿À¿ÂÇż»¿Á¹°Á½‹hnqonnnkjikljlooaXWW]luzqwsrwn_~¦‹jtyqqxrstrpstqwvutuutqqwusqw{kb™ËÔÙåàÛÖÚÜÙÛÞÞÚÓÛåßÑÑÕЀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€nÀÙÆÇŵª“‹†ƒ†„|€‡‰…†‰Š……‡…ƒ„††‡ˆ‡Š†¢ÏÔÉÍÏÍÌÎÐÑÐÐÎÍÎÍÌÎÍÊÊÍÎÏÏÏÐØçíêáÑÊÑÐÐÏÌÐÒÍÒËÊÏÍÇÇÌËÍÏÎËÎËÄÊÍ´—–¡£¢¥£¥§¡›Ÿ¨¬¯¨§¯°¨¦§¨«­«­±±µ½ÅÏÍÁºµ¬³¸¹²®³±¯³º¸µ²¬­¯±­©««©ª¨¥£“tgovlkfdjlij`Z_knqwzvn|Ž‰pYWSYJ3.53-.01.&"'/7DG;6FRQ?--83.16>ABA@CB?@@@AAAA@ECBDHMPQPPRQONJJ{¿âáäÊšˆˆ…{tp…©·±±°©­²¯²«¯«¯®¤½éîØÏų¯µ´½½·´³š‹¨ÅÆÁ»·ÄÄ¡tu€‚„‚«ÓÐÅÅü¼½Á»¼½¸±¿à×–ilgSu»ÓÙêÔÄÐÍËÕ˜bdrifkglmkkgdgjlkjjiedkkjhggggnklmggkmiikffii^D-*' !!! !""##!  !!"%"!#"!"%%$&)++.36449;8689;*;t‡‡ˆ†‡€kotWDBAA>;7DSO=,-:==?6;==:,'% """"""!!!!!  !"##!#&&#"#$$%()),07348=;86:9%AxˆŠŠ„„~kmyeN?4672.0+@^T99=7MU?0=81ES93LipW6-LPD85AJQP?79:;;>>==?ABA@@@A@ADHLMMQPPRTFX æëÝäìÅšŽŠƒ~x»ÈÀº¾¼¸¼¾¼¾¿½¼·½ØëçÐÈɺ¾Æ¬y\UVV``Z`—½¸¨¹Ç®„x~„…z„¼áÆÀÍÊ»³°³ÀËÎÓÒÐÜÓšlhcXw²ÑÉÓɼÈÑ×ΔbhvkehhkkjliefijjllgdfjjjjgfgjkijjggjnjgdfgfmeL1"&'%&'#"""""""  "#$"!$(($!"$$&))(*-4899;@<695"N~‡‹Œ‚w|{uz|zkYL=007,@LDHL9/BSB3>93HM34UljS7.6IWE16:1Kgohfd`G4?NV]UVcuq_UvŸ–bP{˜ƒhmribf`Wanvtwxvg\gssrroijoplmmnnoppnh_y’™«¶´¹ÁÀ½ÁÀ½ÁÅÅÁ¾¿¾½·»¿¿¿¾½º¼¿À¿¾¿¾»¼¾»¸ºÁÃÁ¾Á¾½ÁÀº±ºÃÁºÈ¿Šhnqonnnkkikkghkj`WVV\ktytxsuyl[|ƒhuwrsroqrqpsvtttrrsvtqqwusqw{ki‹·¾µ·¹¼½¿ÁÃÃÂÀ¿ÆÂÁÃÂÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÆÛÃÁ¾­ ‹…†„„‡€}†Šˆ‰Š‡…‚ˆ†…„ƒƒ…‡‹†ˆˆ‚žÌÕÍÑÑËÌÑÑËÏÕÐÉÎÑÎËÍÊÎÑËÊÑÔÊÔæíëã×ÓÍÌÎÌÊÍÏÌËÌÈÇËËËÑÀŸ“¢µÅÍɪš˜——ž¢¤¤¥§§Ÿ—›§¬©ª«¬±²ª¥§¨«®°±±²·½Èɾµ­´µ±°±¸½²¬­¶¸¸»¶²±²µµ²µ¸µµ´¯ª¤‘vcf]bf_jzwiuyyzspxxffu—´¡d9,83-220*(,,)+13:BEB>CLRKCHOUVD78:=?=<<<>ABB@AACA@AEIMNPPSTUGXŸèè×âòѤŽŠƒ}rŒ¾Ë¿¾ÂÀ¼½¼Àý¾»»ÑéæÕÍƳ¸¹ŠTObos‚~eaƒœ“¯Ð´‹~„‡†…±Öƹ³´¶¹ÀÍÒÑÎÒÍÍãÔ˜jieWu±ØÊÑ͸½ÔÝÑ”bhtidehkjjlieejlkjiffhkljghjidjjihgfhmmkfdgclmZ?+-0--+))(''&&%! !#$%#"$''#"#&&(*)'(,09=::==850")]„„ˆ‰szƒ}~u|uaL=79=;>RM2/CJ@563:RN05\oeM4<>KVC01/A_qjdehiH4@MU]URcuq_UvŸ•cPz—„jnpldhbZcpwuwxudYfssqokjnoinnnnnnooog^w‘˜¬¹±·Á¿º½¾½½¿À¼»¿Á¿½½¿ÂÄÁ¾½¿ÀÁÀ½¼½¾»¿Á¾¼¾Âý¾¾»¼Âü²ºÁ½µÃ¼‡hnqonnnkliijikmj]UXZ`lruttnqyn`˜|exzrstlqssrrrsrtvvspswtwtustxkj‹¹Ã·µ¶¸·¹¼¿À¾»¹¼¼½¿À¾¿Ã€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€qÇÞÄ°žŠŠ‡ƒ‡‡{{‰ŠˆŠŠ…„…ƒ‡ˆ‡†ƒ„Œ‹„‡Š… ÎÚÎÒÐËÌÓÔÏÑÐÊËÒÑÊÊÏËÏÑÉÇÍÑÎÕæíìåÖÏÑÓÕÐÈÈÌËÌÏÊÆÊËÊϯ–˜Ÿ«º½¤’—œ™ž Ÿš¡§§ž’”¢ªªª¬¬«¨¤¥¦§§ª¬®±²ºÁÊÈ»´®®¶¶³°¶¼´«­¶¹¸µ®­±¶·¶¸¶²±¶»±¥¦ž…rhall^k{pgpz~{vpmz{gbcz¦¤qE6;1-3/1)&,.+,1::6?NH=ANMCFMUYM:88;<::<;>ABBAAB@@ADGJKJPNQRZNBbµäååñÔ£…Š‚~nŠÁλ¿Â¿¾¼¸ÀÈÅ¿ÃÁ¸ËëéßÔí½Ç“[^m|‹œj[pŽ¾Ô²ƒy‚€}¡±³³¹ËÏÇËÆÉÇÌÖÉÀØÖ–hjgVs±ÙÑØÓµºØÛÔ”chqgcbikjjljeejnlgffhjkjiigeefjkiggeelkojbgejoudQKKKJB642/+(&$!!!!"$%&%##%%##%(()+*((+.5==968<1,"1hˆ‚„„yz|€ƒxsz|z{|o]C>62?B44@>=;55G`H-8`jYC2:Q`U:5=29:;:<@BA@A>@ABCFKOOQKOPEBHl¡àïèΛ†ˆƒ|rŒ¾ÏÂÂÃÀ»½À½Á¾½ÀÀ¾ÏéõÚÐÈ­·Å›jqxy‡™–‘—˜tSu´Ã®~u~ƒ‚†…ƒ ÀÌÌÌÉÈÇÊËÉÌÓÇÅäÓ“eheVw¸ÒÐÜÕ¶¿ÉÌÔšdgofigglmlmigihlmlkhefkkjhgffglhfijhgjkgfggehntrlffijh[NF?:5-.,+%#!)$%&&&&%$#%()(*..,'-5:9534, "Ktƒ…Švpz€€€~y|you|y€ocN:48;9;=8>G<DHMB57AJK49P84UnjbfhdK=FMU]QMbvq]Wx šdQy–‚hnshae`Xbpxpovte^fmnqpllppmnnnnnnnnpjby“§µ³¸¿ÀÂÄ¿»ÃÃÀ¿ÁÀ¼»¾ÂÀ¹¹¿Ã¿»º¼½½¼¹¼À»ºÀÀ¿¿¾¾¾º¹½¿¼·¿ÆÁ¸Å¿‹iqplmljkkjihijklbUOVbmttsvqtxk]€œ{fusorwusrssrqpu|vouvqqsrptutuinŒ®²¬®­²µ¶³­«®®ªª§¨®¯««°€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rÅÛÁÁÁ­š…ƒ…‰‰~{ƒ†‚‡Œ‡…ŠŠ‰‡††‚„††Œ‹ƒŸÎÙÍÎÍÊËÏÏÌÌÌÉÊÍÌÊÍÎÏÎËÊÍÐÐÎÔäíëßÐÍÓÑÍÆÄÌÐÊÅÆÈÈÄÂÆÍ­Ž–’”šœ–”–˜š›š™™š›š™™˜›¢¥¤¡žŸ¥¥¦¨¨ªµ¾½ÂÁÅÎÎĶ­­´±©«·¸¯¯³¸¶µ³¯³´·¹·¶·¹¹³³³¯­¯¨–zlbdktywtvzyvwwsw{pernW`ˆp;)-*+$10.,,-/15:;:<60+"(Tw}ƒˆwlo~†‡†„{spmsyuy|q]G:56<@;9=::G>457=E?;6:AD5E^B3MdhccggK>FMU]RNbwr`Yx–aOz™„imph`e`Xcpxxvyue_hppnmmnmmnnnnnnnnnpi`x•¨µ­´¿Á¿¾¹¹¼¿ÁÀ¿¼¹»»¾¿¿ÀÃÂÀ¾½»¼Áƹ¹À¹¹ÃÅ¿½Åú»ÄÄ»µ½Ä¿¶Ä½‰iqplmljkiijkkkkjcYUWZcovrtqv|n\|{fvvrqsrruxuooutoqussusssquuuvia’ÂÁ·½ÀÂÂÄÃÂÄÇÅÁºÁ½»¿¿º€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zÊÝÁÁÁ°Ÿ’‡……ˆ‡}z††„‡ˆ…ˆŠ‹‹‡„…„ƒ…‡‡Œ‹‚žÍØÉÍÎÊÇÈÌÎÎÍÍÎÏÌËÌÏÉÊÌÊÊÍÍÊ×éëèã×ÏÍÏÏÉÇÎÎÅÅÇÉÉÿÃ˶ˆ’’”•••––™žŸ™”—šž¡ž˜—™ ¢ ¡§ª¦¡¡¦¨¥¥«®¬¶°´ÂÊ·±°¶³©ª²²ª©¯¶µ´³°µµ¹»¹¶µ¶¶³µ·²­²´¬™hgtxtr{wxz~€znr|udmiTby<*,/4122/,,/28:<;99COSOHJNOVWA78:988=9>@??@AA?>?BGJJIQRRRJFNPN€ÕõêÐ¥ˆ…€{r‹»Ê¾¾ÂÃÀÁÂÀºÁÆĽ¼ÐìéÙÎÄ»´¯±š}zu~w~€›¥|WgŠ„ƒ‚~‰’‡¡ÌÓÆÈÊÉÌÌÍËÅÌÑÓáÕ•gheUv·×ÔÔÏÁÊÆÆÈ’ahrgidfkljkhehjlkjjhhkhijigefhjmmhfhjgmliffiklnmjginqoc]^[WN=7W\D-%%&&'''%$$%*-+*,/00--4=>6-)#0^zz‰unt€ƒƒ…†xjjlnqpsx{€t_F6D=6468FLU]RObxtaZw›’eQy”gotg`e`Ycpwutyvg`ipnoolkmnmnnnnnnnnph]w‘˜ªµ­´¿¿º¹¹¿À¿º¸»»¼½ÃÂÁÀÀ¿¼¹¼¿À¾¿Á¿º¼Á¼ºÀÃÀ¸¼¿¾½À½»¾´»Â½µÃ¼‡iqplmljkmkihijmn`YWXX`mvuunrzn]} |dsurstqtutrssssqstsuvsturuvwxji¹¿¹½¾ÄÁÀ¾½ÀÅÈÇÂÃÆÈÆÃÅÈ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vÈÞÇÇƲ¡“‰††‡†}{‡‹‹Š……ˆ‡‹ˆ‡‡„„††……‹‰€œËÕÆÌÑÐËÊÎÑÍÌÍÐÏÏÑÒÐÇÊÐÎÍÎËÉØêëçãØÒÌÍÍÉÆÌÎÇÉÊÌÌÇÃÆË´’Œ’Ž“–”˜–˜žŸ›š£žž¥¥œ™¡¨©¦¥§ª©¦¤ªª¦¥§ª¬¬«·ÌÑõ±²³°­­°°¯©°µ²²³¯°°¶»»¹····¹»¶¯³¶²®”wuƒrq}||z}}xu{uekfYuŽ~H)++.61110//13989<:69@OKDIRWWO@6699968;=?@@@?>CA@BEJLMMMQSJJUQI€Ö÷èÉŠ‰„{p‰¹È½ÀÅÄÁÃľÃÆÅ¿ÁÒéêßÓ¿»´™‰xoxvmumt’Ÿ~`ct†~‡‚|¤ÉÎÉÑËÅÍÎÈÇÉËÈÊÜÖ–gieUu·Ô××ÐÁÉÇÎÉ“airhieejkjjhegfmomifehjiggffgilkiihhjlmkgddgijllihjpqod]]XTM>9WjZ<* $&''''&%$)**+-/0/40,-473,'!4d|x~…yu|ƒ|€rgllfkmonps|ƒ€lWJ60887875776=>1513=<.IfM3AVfjecfM?FLU]SPbxs`Xv›“bPz—ƒimqg`eaYcowwuzwf_fmmqrmklnmnnnnnnnnpg\v’™«µ¨´Âþ»º½¾À¿¾½¼»¾¿¿¾¾½¾½¼¾½»½ÁÁ½»»»»¼º¿Â¸»ÃÀº¼¾¼¿µ¼Á½µÄ¼‡iqplmljkjjjkklll\UTY^gptvvorwl^€zcstrrtqppsusqprrrvxtqvtvsvuxyji½Ä¹µ¶Á¿À¿½ºººº¶¾Á¾¼¾À¿€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÄÛÆÇ‰‡…‡…}}ƒ‹ˆ…†ƒ…‡‰†‡ˆ…„…………Š‰€œËÖÉËÏÐÎÎÑÕÏÌÍÎÎÎÑÓÊÇÌÏÌÐÓÎÎÔæîéÚÎÏÎËÌÌÉËÏÎÎËÊÌÌÉÈÉ°’—’’’’•˜–—œŸ¤£ ¡§¦›™£®¬ª§£¢¤¦¥©«ª©©­²­¯¾ÒÔÁ³²²²°­¬­¯¯«²µ°±´­¨¯´¸¸¶¶¶µ¹·º¸³µµ®²¢ŽˆŠ~ty€~z||zwspvh[xˆsJ/*(+.0/.03565668;;989?EDFLQUN?679898:=:965<=5687BE>?EKH528:7769954:@A@@;>ACCDFILIMSMLRKUŸéòæÎ……~zqŒ½ÍÃÂÅÇÃÂÃÂÂÄÅÆÅÅÓçðáÖÀ›|uƒ€vux|vjokkminŠ‘x`v‰…†ˆ†ËÓÅÆÆÂÁÃÆÊÌÍÈÈÜÕ•gjgXxº×ÛÝË­¶ÆÚÏ—djrhjgfkkkkhehkkjjiffjkihhhigfnlihhihhljgeceimmmjhimmj_[[TPL>6QdibM1$!''((''%%(),.,+.328:3-,+(!!9fvu{xtx‚†|}|ojkfgplfqvxvw||x}ul\IIQONMQS[^RQSTZTM]hZ`ehfdeggO@FLT]TRcwp\Uu—eQy•€hote_fc[douvtxte_irupmoqpnmnnnnnnnnph]w‘˜ªµ±»Ã¾»¿¼¹ÀÀ½¾ÁÀ»¸µ»ÀÁÀÁ¿½ÁƼ¼½»¼¾»¶¸¼À¾»Á¼¶ºÁ¾¸¸½À½¸È¾‡iqplmljkkjhggilmaVRX`jsvqvtuvh\ƒ”vewvpptptuqortsuturmrvrrwtssyzhjˆ§¦£ª©¨®®®¯¬¬±¹¸°°¸¸°®µ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÄÝËÌÅ°¡‘‰‡…††€‚‹‰‡‡…ƒ…‚‚††‡‰‰‡‰ƒ„ŠŠƒ ÐÛÐÎÌÌÊÉÎÕÑÑÍÍÑÏÍÐÑÍÌÍËÉËÑÈÕèîìæÕËÐÎÐÐÌÊÍÍÈÆÇËÌÊÈÈ«ŠŽ’““—™šŸ¢¡¥©¦¤¦¢ž¡§£§­«¦§¨¦¥¨©§ª²´¯³ÃÕÕô°¬°°ª©®°¯¦ª¯°´µ®®±±¯®°µ¶µ¶²µ¸µ´³®³·»±˜…~€‚z{~{~~„lefZ@2/+)((//136788;;<;989<77233277--587657:99=AA>;>?BCEFHIJHKRNKSSP†ÒîèÍœ……}si…ºÍÂÄÇÄÁÅÈÃËÊÈÈÅÃÒìêçÄ•vq}‚zmrz{vnphf`WS[juqz‰‡…Œ…{ ÇÓËÉÆÅÅÅËÊÈÏËÉÜÓ“fihY{¼ÏÎÔɬ·ÅÏÊ”cjsijegklklifikmlhhfcblljgffhjnmjeegiihigc`cimkkjgillh_]]VROA8TfdaaL2"'(((('&%((,.-*-32892-,*%%Agqr|x}~ƒyx|{nihdjnff{sptwvw{~ƒ‡smjcg_cfik^UPTXRQ]dcdgieabfhPAFKT]UScwq]Vtš“aO{˜„impe_fc[douvtxue^fnsronnpnlnnnnnnnnpi`x•¨µ¶¼¿¹·¾¾¾À¿»¸ºº»¾¹»¾¿À¿¾¾»¾¹µº¼¸¶¼¼··½Á½¸ÀÁ»¼Â¿µ·»¾»·Ç½„iqplmljkghijjjiiaVQW_jrsuwrrth^…ž{esspswtsrssrqrpstuwsrupvtrrxzfh¸½°ªª´¶³´¶¶²±²®°¯­°µ³«€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€o¾ÖÅÈı¥ˆ‡…††„†Œ‡ƒ…‡ˆˆ„‡‹Š†‡‰ˆ€‡ˆŸÏÚÑÐÑÑÌÈËÒÎÏËËÑÎÉÌÍËÈÈËÍÌÌÊÔæîìâÎÄÑÐÐËÅÇËÊÆÆÉÍÌÉÉÌ­”“–•’—˜™ £›¥©¨©ª¢œ£©§«­¦¢¨®§¥ª«§¬³±²ºËÛØĵ±²±°¯­¬®²ª«°³µ°ª®³²°°²µµ²º¶¸¸²°±®«°½¾­Ÿ’ƒ€~~€}syzu€…xfN8.-)%'0/2565568645:<;<=AEFGNMNSMGPVJfµíìǘˆ…zsj†ºÌÄÁÃÆÃÃÇÉÇÄÅÉÇÄÑéðÌy{}~jev{svunfQFHFDGJZl“ŠŒˆ‚©ÈÏÄÂÃÄÁÌÎÈÆÐÊÅÛÒ’fihZ|¾ÖË̦µÁÃÄakujidglmlmigijjjjhcaejlmkfegjjjihggikhlkdaflohihgillh_]\SON@8Sk_XlfA$'(()('&%*'(,.--0474-*-*#(Hinp~zz|ƒƒ}{|xjihfjg_k{oluulq€|z{€ƒ€||hXXYZb\RLTXOLSZeeilkfbcePAFKT]UScxs`Wt—dQy–‚hnse_fc\dotxuxte`kuqopqnijpnnnnnnnnpjby“§µ®´¼ºº½»»¿¼¶·¼¾»¹¾¼¼¿¿¼¹¸¼¿¼º½º¶º¹»º¹º¿Âº¹Àýº¿Àº¶¹¼¹µÅ»‚iqplmljkihggghjk^ROWcmqotvqsxk]£fturrttvuqorssqvtqrrprovtqqxyej•ÁºÀÂÄÇ¿¼ÁÆÇÇÇÇÃÀÁÅÆÁº€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€b¢ÁÁÄÀ¯Ÿ”‰ˆ‡ƒ‚}‰ˆ†‚‚‡ˆ„†‰‡‡Š‡ƒ…‡…‹…žÎÝÌÊÑÒÇÃËÐÎÏÐÍÌÏÏÊÌÎÍÉÉÌÍËÊØèïêÝÑÊÒÍÌÈÂÈÏÊÈÍÍÌÅÄÊĬ“Ž’”•—œ¢£ £¦¨¬®©¢¢©©ªªª«­®¬ª««©ª­¯´ÂÏÛÓ»±´µ´´°­¯¯©¤³º¯­²¯¯¶±¯³¶´³³¶¶µ´³²±°¯·Àº±°«¦•ƒ|yqljnnkm•‡j_ZK2%+,+02454248=8:<<;:;=:;:63310/036765679;:;==>AEHIJKLOQNMS\QRˆÜöÅ’„‚~{tkˆ»ËÀÅÈÆÅÇÇÅÈÃÃÊÊÃÔöášswxw{ubblvwvpcUI@><8:A7M™Š‡‰ƒ¥ÌÌ¿ÃÁÁÈÈÅÇËÐÊÇßÔ‘gmgXÂÖÍÐÁ©¿ÄÎÏŸdhqjeechjjligjhkkiheejnnmjgfhkjhfefhijkjgdehihnlhdejlkc`\SRK:8NgbYcvi3"'&'/+%)%*+,,,/0571,/.*)0Tjkr{xtƒ‡xuwrcac_^\]fnhgjf`iyurt}…‹€fLIWb]SNNSQJP_efrlgfdhkN;EPW^URdun\Xyž”gUy”ƒhkpi`eaZdotxwwqecltimrpklonmmmmmmmmth[u‘šª´³´º½½¹µ¹½¹¸¾Â¼¹¾¿½º¼À¿¼½Á¿¼º»½½¹¸¼½¹¸¼¿¾¹¹½»µºÁ½³¼Å·°È¼hppklljkkmihggie\UUV_ptruwusyi_ƒ—xcpqqrronoqqoqvtstsoqttwtswstvef•½À¶¹ÀÁ¾ÀÁÁÁÁÂÄÊÈÅÆÈÈÆÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€R¨¦®µ±©’†…„ƒ†„ƒ‹Š‡„…‡ˆˆŠˆƒ‚…‡……ˆ‡‹‡~œÍÙÈÆÍÒÍÌÐÒÎÐÎËËÍÎÍÍÌÌÍËÊÌÑÏÖáíîáÐÅÐÎÍÊÈÍÏÊÍÐÍËÆÇÑͨ‘’’‘–œŸ¡£¥¢§¬«¢œ ¥©«ª«­¬©¦®­©«­«¬¶ÀÌÙѹ³»µ¯­®±µµ®ª±´®°¶¯¬ª¯³²¯°´¸º¶²±±°¯¯´²³·´°²¯« ’vqnovy~‘™xRKRG1&+/-.0367557:79:;::999=<7468721475249:<;88;>@==@CCBFMKGELSSQOSLsÆóÊ“…‡‚}vk†¸ÈÃÇÇÃÁÅÈÈÅÆÌÌÄÉÖÜ¡}owxvqeecnxtnh^KB<=;537;7^ˆ‰„…¤ÎÐÄÉÇÀ¿ÆÉÊÆËÍËÜÔ‘fldTz½àÔι¨ÇËÌΟdhqkfffklkkhegglnlgbemjkkigefgkkjgdcehhhfddgjjmkgdekmkeb]VTM=:PcaY\sxP+*('&&(*$+.-*(-1351-//*(#5Wmou{ws€†…|ssr`[]\WW[fa^be`ahjmry~ƒ†„€†oYT^_WSQRRQX_bgnheebfiP=FOU^TMavq^Wv–fTx“ƒhkqi`eaZdotstvrfagnpkjosmknmmmmmmmmti[t”¥¯´ºÁ¾¸¶µ¼º¸¶¹¼»»Á¿À¾½¾½¼¼¾½¸¹½¾º¹¼¿½¹ºÀÀ¼¶»¾¼»ÀÀ¹´½Å·°Ç»hppklljkjmihhhjg_UST]ntuptsrxia†›}hvurqpoqqqqrrqrsrqrpqutpnrptyji”¹½µ·»º¸º»»¹¹»¼¾¿ÀÀ¿¿ÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J“• ¤¢’…‚„‡ˆ„‚„ƒƒˆ‹‡‡ˆˆŠ‰†ˆ‰‹„|žÐÙÉÅÇÍÎÏÏÍÌÍËËÑÒÏÏÉÉÉÉÉÉËÌÈÑãðîÞÑÍÓÕÑÍÐÑËÇÉËÈÈÃÆÐË£Ž”‘“’‘”š  Ÿ¥­¢¤§¬ª ¤£©ª§¨¬«¦£®­©°¯«®¶µºÍн¶½¼³°±²´µ±®°±®³¶­«¬®¯­±µ¶²·±®°²±±±°±­­¯²¹²®±¯¨£ ™š¤¥¨¤zRPVO=-/430147987678899:9867=?:7985332147986:<;::;<>:;ADBDIFFHJJJNSUHX¦ëЕ†Œ…wl„µÅÀÆÊÈÇÈÈÅÄÃÆÉÊʸ›€qjmkjjhidkpgdbXE=87611489>:586324984689879:9=99=BCCEHFEGIMOQVLGˆàÕ—‡ˆ|xm†¸ËÄÇÈÄÂÆÉÉÅÆÃÄŲ’|qhggcdlic`ZVabQ@956644686<;Lx†¦ÏÏÂÆÅÆÎËÇÆÇÌÇÆàÓejbRw»ÙØÛŲÒÓÍÍždhqkfgjonlkgbegkkijighkjjihggfilmicbfkilkfbdimjjgeglmlc^[VRM?:Pba`etq]4)-(%&.*--***,,00///+(+B`sx|ztzƒ„tmoof[]]X_baS]ghhomagdjz„…†Š„‹‹ze`giaRP[abi`a`hkfggM8AMW`VPcun]Yx›‘cQv’ƒimsiaeaZdotxwytf`hqupjilooommmmmmmmnf\u”¨¶¯µ¾¼·¹¸¹»¹¶»ÁÁ»¸¿À¾½ÀÁÀ¿À»·½Á¹²ºº¹¹»ÀÀ¿Àþ¸ºÀ¾¹·½Å¹±Å¸€hppklljkhliiijnk]QRYbmpsuupoxi]~˜xevvrqswsqstrqrosxvppvyxsqsoptdhŽ«¨Ÿ¤ªª¬®®­ª©©«¬®°°®®°²€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€N~„†ˆ†„‡‚„‰‰‚‹Š†‰ˆ…‡†…‰Š……‡…„ƒ‡…~ËÓÀÃÅÉÎÐÏÍÏÒÎËÎËÈÌÑÌÊÌÏÍËÌÎÔâïïßÌÁÍÑËÅÍÏËÌÍÏÍÍÊÊÏÅ ‘•Ž“•”“–œ ¢®§£§©¢¡«¬©¦¥§ª«ª©®°­¯µ¸·¹¸ÀØؾ¶¿¾¼¾»³¯·¾±³·µ³¯©¯²°°²³±±²´³´µ´±²µ°¸¹°ºÃÀÌãÆÃÕ§¥¦¶´W^hsucPGC=:9767788889877:<=<<==<:87348956;:96569987;><;8678986898679<>>?A@<:::77;:65899779;957<=9;ACAEHJJJNPQUXEqÑÕ—†‚|yl€±Å¿ÄÅÂÁÄÅÄÉÄÇÇ·Ÿ…nwpc\agc]SVIAXlZ832146876<9NbYbwqmpgV@/#%7J9(*,-1+*-/21,--)1Pjtzzut€‚vcdmcYXXY`ZP[gjlqlfkghlrx|‚††Šˆƒˆ‹{cg\OMNKHKPU\hifhcS?IRV[QM_ur_Wt˜cQv’‚hkqi`eaZdotvuwte]fsolstjkqmmmmmmmmmof[tŒ“¦²©¬¹¾¼¿¿½¼»º½À¼·¸»¼¼¼¼¹¹½»º¼½¸µ·º¾¼¹º½¿¿½½¿Á¾º»»·¶ºÂº³Å¸„hppklljkhkhhijnj^RQU_lqsnturud]… }fwupquqsssttsqqtsqsutsrqt{wwwdd–ÂÈ¿ÀÅÅÃÅÆÅÂÂÃÄÅ¿ÀÂÃÀ½€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Hv„{{zxwuuwvxsko{}}{}~|€‚€€~||yy{vr•ÃÇÁÇÅÂÅÄ¿½ÆÄÂÃÉËżºÂý¼Âþ¹ÐæíêâÖÊ»¾Â¿º½ÂÁü»º½Äºœ‰ŠŒ“’—ž¢¡ž¢¥¦¨¨£¢©©§¥¤§©¨¤¦¬¬§©¬­¬£¥³Ôá̾¾ÅÂÁ¿»¼½¹º¹¸µ·µ«©¯²µ³¯­°´«¯¯¬«¯²²±±µ®¶¾µ¸Å® º²‰‚‚‡…}ƒŒ~d_o…‰vaSF?<98::8578:::99:=>?@?=:89999:;:8::878996::98=CB>DFFDEJOPUVDsÒÒ”…ˆ|xwm³ÊÉÊÈÂÀÆÌÎÄÅÉ¿¢Š~wtme_^`\SPPCJilJ0740/1577A38AEJNUŸÐÔÂÆÊÉÈÃÈËÈÌÊÅÔÒŽdjcSy½ÔÙàɳÐÐÊÌchqlhhglmlmjgjlkhhkjijkkkjhgijmlkhffhjnomhdgmqppnklnmid[]ZTQG?R_[lwccudUK=)+DY9(./+/,/0130+,.+7Ypuywrt}~rdflcYXY\]XX_cflpicfjgktvt{ˆ‡†„…ˆŠ…fWPSVUUTSZbifflfQFQRR[SK_ur`Xt˜dRw‘fjoi`eaZdotqqurcZcpsnpokorkmmmmmmmmqfZsŽ–§²¨­¼½¹½À½¸»»¼¿½»¼º½¾½¼»¼¿½¸´µº¼»º»½»¸¹¾¾º½ÂÁºº¼»¹´·Àº´Æº‡hppklljkhkhhhiliZRSV_nqprvurve\›xcvvootqpqtvtqorttutqqvustytstae”¾Ä»»¼¹¼¾¿¿¾½¿ÀÅÅÄÄÅÅÄÄ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€M{Š‚~}{|~}~{u|}yxxy{}||‚‚~yw|x{}utŸÑÓÌÎÆ¿ÅÉÇÈÅÇÇÆÅÉÈÃÃÇÇÃÃÆÅÂÃÖçëêäѼ£¯ÄÍÈÉÌÅÁ¿ÂÂÄȼ™†ŠŒ‡Œ‘–—“”šžŸž ŸŸž¢  £¦¥ ›ž¥¦¡¦§¥¨¬£ž¨¾¾ÅÛßȼ¿ÄÄÃÀ¼¾¾¸µ¶·´¸¹±¯¸·´±²´±¬­²²­­±°¬¯¯°««³°«·«’¢¤tv„|xy}†‚shpƒŠzfXJ=;:;=;729:<==<:8>><=?A@<9:<<978;998667768:<<<=@B=CEDDHKJTQAvÔÏ‘…‘ƒ|xjz©¿¹½¼¸·»¾¾¼¾¾º«z}qc]\URTVTNARuh?/7643465318>?HKEKyÀÓ¿½ÂÃÁÅÄÈÍÑÇÀÕÒŽdh`Ou¸ÏÝåÁ¢ÃÊÈÌchqlhhhmnmmjfinnoqofchjlmljhijoonkiiknttqkhjorqrollnmibY[XQOF=W^`wvV\wgKGK85L[=&+..4.-2241*,/,<`uwxupt€ˆ„widhfbWUY[WU_[Z_jolgefjmnou€‰‚…‰ˆ„ƒˆŽi`cccc_[bhkfhqkLHUPO^WLato^Yw˜‹eSw’fhni`eaZdotsrvte\ftsmospklpmmmmmmmmqfYt’›­·©±À»±¸¾¼ÀÁ¼¸»¿¾½¹¼»¸¹¹¸¸»Â¾¶¸º·¶·¿¿¸¸¿Á½ºÄÀ¸¼¿¼º³¶¿ºµÆ»‰hppklljkhkhgghkh\TSS\msrtsooyl`Ÿ{gzypnqutpmpttoqsurpstorootqsvfl–¹½·º¼¹¸º¼¼»»½¿»¾ÀÀ¾¾ÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€K‰ˆ€{ƒ†‰ƒ}…„‚}€„‚„…„€ƒ„‚x{€~{£ÓÖÈÈÊÅÂÌÒÊÆÇÉÈÄÇÊÉÊÌÌËËÍÍÌÊÚæîèÞÓ»“šÄÔÃÉÓÎÈÅÂÍÈÆκ—„Œ“Ž‘’——˜˜–—šœžšž¦¥ ¥¤šœ¡Ÿ¥£§¤Ÿ¥š”¡¹¸ÅßÞŽÂÀÄÆÿ¼½À·±¶¸·¸³®¸³²´³®­±¯µ±­°±®±»¹±«­°© ®¤™›š~q„‚}}|}ˆŽ‡Š‰†‰v]^]B66<:895777:=;78<===?B@<:;<:9:<<98;:67:96779:;<===@AGIEIVJBˆäÎŒ‡ƒ|m}¥°±¯¯²¶¸µ²¹·¸³uxi_`\LISWNOK\nS3852456;=6278;DIIJ\•ÆÊÁÃÉÉÄÆÉÉÎÊÇÚÍ”jncOy·ÌÒÚÁ¬Î˽Ðflnigfiopkkomgorqnmjghjlnmiehlssojimppsurlhlruuvtolmljd[ZYYRDCSUd€rNWqgLDJA?R_>'++-..-,2..0..(::::<=<<<;>@><98:==<=<:869;;88899::;:9>@?ACLUEU¨ìÏ“‡„€~yj¯Â¹¼ÀÁ¿¾À½¼¹®“vmrc`XNJQTNPIJY\E3976/.9=72/128BHJOOu®ÌÆÃÈÄÊÉÈÅÈÄÁÕÒ˜jm`MwµÒÚÓµªËÈÉΟjqtmiemmnpomlknusnmnljonlkgegklllnoomkouxsmmtzuvuolllj`Z]ZRNKPN[pzbJVnnQ?EHLY_A(+**-/003400*&4ayyvwpty{rhdedZWY\ZZ\[VY\ahkhbafgipwupˆ‰†‡†ƒƒŠ€dECY^NDT[WZfh`SDOTV^VQcvqaYs•ŽfUy‘jnrgbdbZapttrusfahprnmmlllijlllllkjnhatŸ­µ®²¼¼º¾¼µ¼»¸»ÀÀ»¸½¸¸½½¹º½»¶µº»¹¸ºÆļ¸»»·¶¾ÁÀº¹Àþ³ºÃ·¯Ã¹…homjmnkjhfhjhjml]USX`krpnrruwb_ƒŒhevxrpuoruupnqvpsqoqrrsrrutqtrimŠžŸž¡¨§¦§©¬­®­¯°°¯®®¯€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€N{‰…†ˆ„„ƒ„„ƒ†‡‚„ƒ†‰ˆƒ„‡………„„„‚…¢ÑÖÆÆÉÊÈÊÌÈÇÍËÉÍÏËÉÍÌÉÆÈÊÊÇÊÚçïêáÖ¿˜ƒœÃËÅÅÑËÌÅÉÅÄ˶šŠ“Ž•–•’•›žœ ¦¤¢¤  ««§¥££¤¦¥¤¤¨© ‘’—•¿áÖÅÇÆËËÆÃÆÇÿ¼¼¿Ä½±¶¼·¼¿µ´ºº²´··³±¯ª¯³¸°¨­«™•‹Š”r„zuy€…‰€œ¯Œ[U[TWQ;-26369::87:=<>B>::>>:;?;<:7898899999999;49?A@?ILCuÐóÀ„€€zj|¯Å¶¼ÁÀ½º¾ÂÅÀ·¤‡miqd\OL[bWIOEMWK95721)(272//--5@BFONVÃÇÀÇÅÊÈÇÄÇÄÃØÓ—gi_My¸ÖÙϱ¨ÉÉÎËhovsrropqsspnmrwwrrsrptqpnmjkmmlptustwyyuniltztwvpkklkg\]WOPNLKbypUFPgpU:;HSbc?'//.,..237..*%Hw|syxnwz|zlcaa`TUYZY[\XWXY]did]bjkfnzxju‚ˆƒ„†…ƒ…ˆsPDKNIJHO^ffglS@KVZ\RPduo_Zt–dSwhlphaba[cprxvuqgafoommnmmomkmmiimmkqi`rŸ¬±®µ½»»À½¹º¸¶¸¼¹¹½¹¼À¾¹·º¼¿½¹¸¼º¸¹ÂÁ¹¸¿À»¼·¹¿¾ºÁµ±¹Ã¸°Â¶€homjmnkjkhhhfhlj]URW`kqostrsucbˆ‰gfxxqorrutqqurlptvutsqqsrttrtriqz}|}{|ƒ„ƒ‚‚ƒ…‡ˆ‹‰ˆ‰‹ŽŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€R}’•”‡†„‚„†ƒ„„€„‡‡ˆ‡†‡ˆ†…„†…ƒ|~~ ÎÖÆÆÉÍÌËÊÉÉÇÆËÏÌÊÎÊÈÆÉÍÎÌÉÊÚçðëâ×À•z’Äм´ÆÍÒÉÉÄÅȲ—‹’‘‘’––”˜  šž¤¤¦ª¦£ª¯­ªª©¤žž§¢¢¢˜ŽµÛÒÀÄÊÈÊËÆÃÆÉþ½ÀÇÅ·µ¼¾¿¹´¹½¸³±¯°³µ³°´´²®­´¬˜Š‰„‡wn~su|ƒ€‚†ƒ—°Ž[V]]Z^M2*020668759==>AA><>@@:??=;>?>=>;B=9<8999:;;;;?;8@?;K{µÜëíĆ|zzn~¬À½¿ÃÂÁ¿ÀÂĹ©–nc`^CJjp]QOCGNLD=7.-/3/&)/.+&(6?86@MC_žÈƾÃÊÌÎÌÎÇÀÑÑ’ad^P}»ÐË˶¦ËÍÃϦorzuompwzwvyvnrtwyyqlnqruurmnrsvyvqmqvrwzwpnrywywqllkj\\bYQSL@PwwURQCSgW:.,AkrF(/1-+//21,+*#@wqy}rmp{|~shcVNTXY[YX[^YY]_]\\\[]fmijvzmis„ƒƒ‡Š„€|hI?IPLKSbifglT<@HRZMB_tq`Wq•eTx€imqiaa`\dpqquvriafrrmpsnhkqnkjjkjlnqf`w˜§¶¯²·¶µµ´¸¼»¹¹¼º¸¹Á¾·µº¹µ¶½¾ºµ¸»¹·º¿º¶¾ÃÀ½¿ÁÀ¶±ºÃ²ºÆ¼³Å¸‚homjmnkjfdhjijli]TRW_jqoqqnrxfaƒfcrssuuqopstrrursuurqqruqrssvsgkwwmiimtpqssrmifnmosxyws€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€b¦¿²«£ž£›Ž‹Š„‰“†‡Š‰‘‘Ž‰…„‚€ƒ‚ÇÓÄÈÉÉËÊÆÆÂÄÈÇÅÊËÄËÎÏÍÉÉËÌÌÛèïêàÕ½xŠ¯ÄÉ·£ºÌÆÃÅÊÉ®Ž‰ŒŒŽ”‘”–—–”—ž¡ ¢¨§¦§¢¡ª³¬¨§¤¡ ¡——™–Ž’—”–¾áÒÀÊÐËËËÈÌÎɺ¾ÊÇ¿ÂÀ¹ÂÄÀÂÉÀ´¶¶»¸·¹³­²³···µ³³·°”Œu^`hw|‚‚‚œ©„\X[W_[b_F358<=<==:8=AA=:<9::;;<<=B=9;A=Jq¾çíè뾇ƒ‹|uti{«Â·½ÁÀ»¹»¿º±¢‘~jXMNDXtmWJB@CA===6/062,+)%&&#'5=74^sqaVp•‘cSv~hkohaba[cprvvvpc]ftrklqolnpnjilljjnfc_qŠš«¶¨«µ¹¹¸·»½º´³·ºº¼»º»½¼º¸¸¸½¾·µÀ÷»¾¹µºÁ¾¶º¾½¹»Á¿·²ºÅ»³Æ»…homjmnkjfehkiijg\TRV_jpopqopsaa‡…dfuqquurttppsrmqprpkkosuqqrswsgjyxkhnswwvtuurkelmquwxur€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€a¤¿®£Ÿ ¡“ŽŽŽ‹‹Œ‰‰˜“‹–‘‹Œ‹‡……‡‡ƒ~šÃÑÅÍÌÈËÍÉÇÉÉÈÆÈÎÏËÉÉËÍÊÇÉÎÍÜèïèÞÒºŒrˆ°ÁËÇÄÈÌÈ«ŠŒ‰’‘‘”—˜™›œœ¢§¥¥§¢ §®ª¨£Ÿ¥©£“•””˜™•—–š»ÙÎÂÉÏÊÌÌÆÈÎË¿ÁÇÅÆǾ·ÂÇÅÂÆÄ»·º»¸¶¶³³º¶±±¶º¸´°¬§±®ˆghty}|{€{|€™ŽhU\d_b^`bVA406;99@>;?D@>ADCA@:>A@?>>>>?AB@??<<<<<<<<<;9;9>V…¸Õäâæ껊Šƒuqshy®É¹¼¿¿¼º»½µ«›ˆveWMQVa_L@EK?:668972374020(&'%'29418>=Cq²ÆÀÉÀÃÇÉÎÉÄÖ×—eh`Ms«ÊÑÂœšËÌÆزuq{xrruwz~}yusuyzyyvrsvwwvsnorzyyzwrsvxwutqorw|ztooplfg_ZWYOER|‰iJTVF>eoJ2*,VrM'-2/-0,.100'9m„ko}tipw}‚tj[MUc`USVZYXZXYYWWZ^^Z]bliepvihq~~tt~}z„‡mMHQAWkrrrqmO=EKUaWL^ro_Wq–aPtŒ}eimgbdbZapttqrnb_jutomnmmmjkkllmkkkgb\n‰™¨±¨ª·ºµµ´µ¸¶¶ºÀ½»½½µ·Áļ¸¹¾º¸¸º¼ºµºº¹¶¸¿¾µ²¼À¼»¾¼·±¸Â¸°Æ¼ˆhomjmnkjigiigghf\TQV_jpnlpptwc`„†ejxrpsqpprsrqqrolmqrrsqvqqrtxsfkvuow‚„~wnhffnqtuvuvv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€[”°¥™–—”‡„‡ˆ‰ˆ…ˆŒ’Š’—†‰Š‡ƒ}†‡‚|{“¹ÇÃÌÊÄÇËÇÅÌÏÊÆÌÑÍÈÅÇÉÊÉÉÉÇÎÝèîçÜи•s‘Ä̽¦‘©ÄÄÃÊÐÌ®Ž‹ŒˆŒ‘ŒŽ“”•–•–šž ¢ ¤¬¨¡£«««¤ž¨­ŸŽ•›•œš¢ÈÞÊ¿ËÓÄÄËÉÈËÉÂÄÆÅÊȺ¸ÈÃÁĽ½ÁÅÀ½»¸µ·¹µ¯³·³µº¹µµµ¦dgy€}uv}{w~„“x[Y_d\`d`_dYA09@;7@?:>>>>>ACA=<=>?@A><>?@<8=A=>>>=<<;;9>?5L¼Ä×äçé㽎}‚xwxgt¦Â¼¹¸º½½º¶´ª–mc^\g]J;8?BA@>?A<9@AA><<=;78?A<:>?;8@8@w²Â¸ÕåÝä縊wrsiw¨Å¼¹½¿º»¼·±§’pdfrdK:3/:C<<37=849<=?DJONHC;2151.01:>Jt«¿¼ÂÌÊÉÆËÈÇÛÒ’agbPt«ÇÒÆ™–ÆÔÂʪvpxsosyzy{zvtw||{|ytvywy}{tswxt|„{pt|z{wppyxxtnkmnld\]\SPo ›uYSYT=3[zb?0!7fa.$86++2.4-&8t˜wmyjiv€ugcfdabbOO\`ZYWVTYYVWZ[\Zhun[bshZhzzff{~|xƒ’†g\gibhplnsoW<>JW]QP`pma[s”cVx‹yfnrjbeb\clovwvnb`hnnnmmnnoommlkjihhnh_wŒ¢¯®³¿¾µµ»¿¼·µ¼Á½··»»»ºº¹¹¹º»¸¸½¾º¸»»¼¹¶º½¹½º½º³¼ÆÁ¶¹Àµ°Å¹jnnigikjilkgehkk]USV\fnnspnruec„hhwrouxoqrssrqqttprxuoqrstsrurgkwq~ž¤œœšš˜ˆm[^imruutuvv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€S‰ž™ž¡–†€ƒ…ˆˆ…ƒˆ…‡ˆ…ˆŠ‡ƒ€‚„€€€}€›¥®´»ÃÅÆËÅÆÈÊÍÎËÇÈÏÎÈÆÌÌÆÆÕãîç×ǯx–»Ë̯—ªÃ¸¯¸Ä芉Ž‹Œ‹ŒŽ–˜˜ž§¡¢£££¢¢¤­´®£¦ª¤›––™ ¡–’™¢”žËàÎÅÌÈÆÊÍÈÆÉËÁ¿ÇÉÊÊÀ¾ÆÇÄÄÇÉÉÃÄÈÃÀ»±²¼ºº¹·¸º»´´¼«|k…ž«ª¢¨±¡”§~WW_`c_ddccfhaW?58=9<@9=?ABA@@@@@?>=;=:754>@Nzª½¾ÆÌÈÅÅÍÌÆ×Ò’agbPt«ÅÇÁ ™ÁÖÐȨvr}xtv||z{ytrvyz}~wqtzy{~zsrx{|~}vsv{{|xqotz|yytmjjjhf\\VRo—«•nXVXTA6UuiF4%0]]5'/.,./.,*8]‹”vhydgy€yrfadb_``TOWZVWVVWWVVWWW[^fqpbdoi_etyhdx€urw‡ŠtcfddoytoppV>?IW^RO`pma[s”ŽbUx}gkmibe_Xanupprnc`hppnnqnhjqklnonmkjof[u•¦°¬¯»½´³·¼º¹¸º¼ºº¾º¹º¾¾»·¶º¹´·À»²³»¼ºµ¶À½¹¿Â»¶ÁŹ±¹Â·®Ã¹†imnjhjjighgfimlj`UOU_lqmlnqvvdc…†cfwrpuwtonrsrrttrvxsprsqrsrrvsinvpƒ¥¨š–šš–†jX\imsupnrtq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ht‚x}‡‚ohmq{ˆ‰‚‚‰ˆ‡‡ˆŠŠˆ…‚…ƒ~~{|‚€„Œ‘˜Ÿ¦²¹ÀÈÉÅÉÓÕÎÈÈÄËÎÈÆËÍËÁËÝðç̸£‰v•ºÉȬ–¹É¾¸¹´°œ‡‰ˆ‰ŒŠ‹‹‘—š˜¥§¥¡¤¨¢ž¥®²®§§§ ™—˜›ž›’‘™¤–¢ÌÞÎÈÍÃÃÉÌÇÄÈËÆÄÉÆÇÈÀ¿ÆËÉÆÇÊÍÉÆÇÄÀÀ½¼¾À¹¹¼º¸¹¶·²»¬v”©³®¤±Ã¨‚}ŽiZfaZcfjjjhijihY9/;>:;:???ABBA@BCDA<<>?==?A?:9;B;785//4;9H{²Á½ÁÏàÚßâ´ˆ€upqgs£¾¹¶º½¹º¼·²œŒ}mojRB8431471,0;@93:CJMSZ`a`][QG@=AB<:Ca®·º¿ÈÆÅÆÎËÅÔÒ’agbPt«ÃÅÇ©›¾ÔËÍ«ytƒ}ytsz{z}|xww~~{|zutwx{~zsu}~{{}{ss|~xqnoruzzvolkkhf_Y[m‹¢¦‹bX[WTH:ImuR:)(Q]=+--+.,0$4Wœ‘rm‚wgp|}yoebcb`aaZTWZZZYW[\XSVXZ[dhigcdmjdalwiat{vpzˆ|d\aeoxvnklU?AHU_SNaqma[r”ŽgUv|ejnd`fbYanvqqvui_dmomlmnmnoijmopnljjaVp‹’¤¯®°¼¾¹¸·µµ¸º»º··º¾¸¶º¼»º¼»º¶¶¼½¶³¸¿½µ¸À¿¶¶¾À··À¼¬°ºÅ¸¬¿·†gloljjjgfghhjmkh]URV_jrrpmkqvge…†dhysorrqqrqpqtwqpuvqtwrnorrrwukkvw‰¤¢˜•˜†xhZZclttmmvyu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8[jd`b`UTY^qˆ‰‚‡‰„„ˆ‰‡‡Š†€}€€€€~€ƒˆˆ‹’š§³½ÇÃÆÑÓÍÈËÍÑÑËÈÉÉÆÂÆ×ðå뜂s—¾ËÇ©’³ÈÅÆƼ´ „‰Ž‡‡‘‰Ž“—š›œ§¥ ¥«¢ž«¯°­©§¤—‘•—–”•›¢ š§ÎßÎÅÌÉÅÈÌËÉÈÆÃÅËÈÇÉÂÀÇÊÉËÉÅÇÇËÉÆþ¾Á»·¼À»º¼¸µ³»· ™¨±¶µ¤§¼­‡zsaZbcaehlkjkjklnmS<:B>:??@AAAAABBBFGBBC@;;<><;:;>732.,3>@;gª¾µ·ÁËÝÖÜݱ†wrsgr¡»µ³·º·¹»·®›‡}{u]C6123012..3;?:9BLSTUY]acec^WPNRN@9Ot—©´¾ÄÁÄÉÈËÆÂÖÒ’agbPt«½ÆÇ “ÇàÌΫzv|yrv}}{}{vtw}yzytswx}|ttzy{y{|xuz€ztrppswyzwroqpnf[_—œ §XW`VUM=ACB@?BEIEGJFDB<=AC>97;>=84346;BC?BDB?>BGHDDGGFC?ACC?>Q†°¸³©¥¬ÂÕÏÔÕ©ƒ‚ytugp›´«©®³±³¶²›Œ—•mTN;52/-+,++-37>EHHLPTY^aehkjihdchcVV~¡°¼ÊƸÃÃÅÅËÈÄ×Ò’agbPt«ÊÌ¿š—ÀÎÃɤut~{{rsz{z}|xwz}}~yswzy{~ztu|~ww€spz}}|wokq{yzwrnnkg^x–¥’Š™‘kPW_W\R6'Q†]7"DlT&!.,-))Nr„““wboymjyzohcdaabbacf`Y[YUWZ\ZVVWWX\cZXko``jf`cnh`m{ztx}{}{mkoqojkkkTAEKU^TRbrnaZr’ŒaRu{dkrh`b^Zclqrtwrc]dnsolmmkijspmjijkmrh[sŒ”§³©«¹¿·³´¹¼¹·»½¸¶¼ºº¹¸·¸¹º»»¶µ»¼¶°¹º¶³¶»¼»¹¿½¸ºÁ¼²­µ¿µ­Ãº‡gloljjjgjifceikiZRNT]jqpppptucb„…egtnptrprrrqrrrostqqsttrrtrrushpoz˜¢••Œ‚vso`Ycmnnorvwv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3]h^^]XTVU^sƒ…ƒ……†…„„„„„€‚}|€‚}|}ƒ‰„ƒ‡‰…†Šˆ‘–›£°½ÄÅËÊÊËÌËËËÉÃÑíḢ›tœ¿ÆÁ¨—µÊÆÈÎÉ¿¥‡†‹Œ‘Ž“—˜•–š¢œ›¢¢œŸª©¨§¡™˜—Œ“Ž”™•™¢­ÌâÒÆÎÒÌËÍÍÎÐÐÃÁÉËÍÌÂÀÁÅÄÄÄÅÊÊÄÅÄÃÄÁ¾½Çÿ¼»¾ÀÁ¿¿»»ÀÀ»¸¨…dZ`ba`^Z_`bgjropnjlpojpuyqW>;EABBA@@CFGIHGHFA=B@?@DGHG<77=>>HV¦®£¨«¦«¾ÒÍÑÒ¦vrrdk–­¦¥ª¯­°³°ž”žŽX?>-.+(&()((/6:?ILKNRV\`ceilkjjhfig^k–±´¼ÄÀºÄÄÅÄÉÇÆÛÒ’agbPt«Ï͸“•µÆÑÌ¥wu}z{pv||z{ytrw}}y{yuuxzƒ|rqv|z}|wvvyzzuonu|xywromjfg”¨ ŒŠšŽeSY[X`Q/!G‰•rD'>lT$%<63-Afx†–‰peonfmyqfddgecfedghbYZYSVZYZWTVX[^]NRlmWZje`coi^k{€xw|}€‚minohdhhU@DMV\STcrnaZq’ŒbRtŒ}hjjc^ca[clqssvse]guqmiinqnipolkjklmsh\t—«·®°½¿¶´¹¿¹·¶¹»·¶ºº¸·¸¸¸¸¹½Âº´¼Á¹´¼º·µµ·¸´³¿Ã¹³¹»µ¬¶Â¶«¾·‡imnjhjjihhfdfjjgZTSV]hqsronqsdd‡…fiupormnssnlnporttoottmoprrrwuklr}’•—†}sssaV^inprw}|w€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€;dmbb\WZZ\hy…‰‡ƒ„ƒ€ƒˆ†ƒ‰„ƒ†‚~…‚||‚‰„‚†ˆ„†‹‰ŒŠ‰—¥°µ¾ÁÅÉÉËÏÔÆÂÑî⸡˜}v¡ÇÍÅ©—¸ÍÅÂÉÊÀ£‰†ŒŽ‘‘““—“‹›š–—› ¤§©¨§ —˜˜‘•’’‘Ž‘–”›ª¾ÛäÏÆÎÖÍÊËÊËÌËÁÀÉËÌÊÂÅÈËËÊÆÂÅÅÆÈÇÇÊÈÃÂÂÅÅÿ¼¿ÈÆÀ¿Á¿º­›zh[YX\a_[[abjnflknmhjqrnquvzpL7BCB@@ABDECKLIKIB=@?ADEEGJC@DIBA\€©«£ «­§¦¼ÑÌÐФ€|soo`g‘©¤¢¨­«®²®œš˜}P;5)/,((,.,+5<=?INPVXZ]__afjjjlkhig`a–¸»¿¿½ÂÂÆÉÆÆÃÆàÒ’agbPt«ÁÏÄ££³µ½É£vu~}tsyzy{zvtw|}}zuvy{€xpr|y|zv{~zyvrpruxvxwsqqnk…¨›|˜bUYXYcO+@„ŸM+8lP#5P?53_v}‹‘|ninoioxria`db`ccbemdVUUQW\TTUYZVV\XNYur\\hd_cqk]i|€tkov{‡whjqjeikV?DNW[RUcsnaZq’ŒiUq†zjlhb^c_W`nwusvudX`oqljmnkkmjjjjkkkkkdZrŠ’©¹®³½º²µ¹¸¼º··º¹·¸¹µ³·º¹¹º·¹·¶»»¶³»º»¹¶º½º´¸¹³³¼¾¶¯¼É¹§¸±ƒjnnigikjgklhfffd_UPU`lrpinswtacŠdjxssupoooprtttspoqqpppstusquqgkwzy€’œ‘~}yyuaXeqsngkx}z€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'FmsŽŒwinwmoywkeddc\ZbgfdmbSWXQXZRSWVTVYYVUXim\ZgcXbmi`dtztqpqy…{lisndecT@DKT[QQgwp`Yr…cUvŒ~gjoa]c_X_krvuwrc]eqqnllnonloljjklkjpi]rŠ”©´ª°¹»º·²¶¼·¹¿½·¶¹¸º¸¸½¿»¸¼¼¹´µ»¹¯º½¾¸´»¿¹´Â¿¶·º¼º²¹Á¶®Á´~emmikkijghikgekh[QLQ\iolqoouubdŠ†dhyvttpuooqppqppoqsrqstrprrrsphmyrpŠ¤¢Œ~vu{vb[fokimtxyx€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Aiqefe_[filu€„‚‚‚‚~‚‡‹ˆ…„ƒƒz‚zz„‰‡…„……„‚‰‡‡„„Š‘›¡©±¶»ÀÃÆÔàîç̸¬~w¥ÆÉÀ ˜¼ÌÆÂÄÊÚ‚‹Œ‰ŒŽŽ“•’Œ’˜œœ¢¤¡š™•–œœ™šŽ‘’‘•Œ’¿àÓÆÍÔÏÎÍËÍÐÏÆÈÏÑÐÌÄÁÉÊÊÈÆÄÄÇÆÅÆÈż½ÆÈÂÀÃÆÈÇļÄ©…rprjjgeilf\Q\cehklnnnmoppnlntutwxdJ=AA@BA>=GIHHHEBC@ABCDIMMDOGD_”¶ª”Ž“—Ÿ—˜¹ËÄÉÊ¡~ƒvqmdk†ž¤¡¥ª«¬ª¤£ŠaC;831,''**+/17DGEB?KJIJKFCFFHEBEJKKKKKd´À©‘Œ™¢¦¡˜¿ÍÃÇÍ¥‚~€uqogm‰¡šŸž §¨¤¥™rO@:62.((')./18=?BGNSVXWY[[^beeegljfgigZn¥Â¾¾ÂÃÄÅÇÅÈÂÁ×ÐŽai`Q{±ÎÌÆŸ›ÂËÆЧrv€|xwr{{{~zps{}yzwtvy{€„€uquƒzw{ztsxyyysjjsy}wuumiœŸ“›™†‹ŒoUX[[Yd\0F‚€_:*PjUS|_/BkwzŒˆt`Uakmtupkif_efehhda[TLV\Y]]Z\\YVXVPNW^kmccgaX^ji]Ygu‚}uxtq{…xfflghjT=?HWaUPctn_Ys“ˆcUv~gjoa^faX^ltrtwob^hqoommlkjjoliijkkknh\r‹”©´¯°·¶²µµ´··³¶À½¶·º·¶º¾º¶¶¾¾»¹ºº¸µ·¼¸´»Á½··º·¶·»¿¸¯¹Å¸¬¾´‚emmikjijkifhffkg\RNS]ipnnonpsfeƒˆfjytqrnqpmmsrqsrprrnknqorsontqdhywjt’›…|{vyzdVblomhgpz€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fovilojcgiku~}‚„‚€€‚ƒ…„ƒ„†‡…„ˆ‡„€}}€ƒƒ†‡†‡ˆ‹‰‡†ˆ‡†‡‹‡‰Œ”›£©®ÆÔÒÁ»¸¤x{©ÃÈÁ –ÀÍÅ¿Áǽ‘‡ˆ†ˆŠ‰‹“—™™— ž˜œ£˜Œ˜–‘Ž‘–˜˜•”•——•–™Ÿ•ÂàÕÊÍÇÊÍËÈÍÓÐÇÈËÊÇŽ¹ÇÈÆÇÌÉÃÄÆÅÈÈÄÆÇÃÅÈÈþÂÅÂƺ’oksplmjkopnotcX\jkiiinoonllnqporvw{ypT<;GFFHAEEGLOJGKLMIGMLJOPJg›­´½¯“”žŸ ¢¡ÄÏÂÈЪƒ|tqohn‰¡™›œ¢¦¦¢_MG;20*,/,,201;AAAFLRRQWZ[[^figdgijhhii]h Ä¼¾ÅÃÂÈËÆƾÎÑ_h`R{¯ÂÄÈ¢‘·Å½Ó«tv}{vrqz}|~xow|yvz{tp|}€{qpx~vsz{utz~{ztkku|zrtshoŒ¢˜‡‡‰rUX]^\kf7E…`>7ZiX[}U5Xxs‚~iVCOW\fliiifbfc``]VRPLJUZWXXVWWTT[[SQW^iibcf[X^in`QUruurntƒ}jfnkhiS?@GT_SNarm_Yt“‰aTt‹|ehma`gcY`mvuvuncbhnqomkiijklkjklljhlg\rŠ•¨³¯®º¾·µ·º»»¶µ·µ²¶¸¹¹»¼¼»»º¸µ¶ºº·µ¹¿½··»»¹¸½¾¼·»Á¹­¹Å¹«½´„emmijkijjgcffhmh[SOT]ipotqmored„‡fiyrprprsqoppqupqrroqrqrturqvsgn}{lj„”„xqq€ƒi[hqrlehryy€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Evpjjjiddit|usz~|z{|}}}}}}~€…||xtyƒ‚ƒ‚‚ƒ‡‹ƒ~€‚€„ƒ……†ˆŒ–­Â²²· uy£¸¿¹›–¸Å½¹½ÄºŽ|…†ƒ†‡‡ˆŠŠ’—™–“Ÿ š™œ’‰’Ž•™˜““––“’–™™‘—ÂàÑÅÉËÍÑÏÊËÍÊÁÆÍÊÇÆÄÄÇÆÅÇÉÅžÄÈ¿ÆÍÃÂÅÆÃÂÈË»£}hnpnqplkljhlsiXXflkmmmnnmkknpilou{xx€pLAFHJKPTSY\Z\bfffffhkjii]b™¾¹¼Ã¾ºÄÊÆÉÆÀÎÊŽfk\JyµÇÅÅ–­Ä½Ô§qxxsuuz|yy{ysw{xu|}vq}|}~{srz~~{ywwwxxutqlnv{xsvqi}œ£žž‡…‡tTUZ\]rp=?y„fFCave`oNGkyvŒnbTAILJNQRV[\]ZPHKMJHPNOWZWY\TVVST[ZRTUYce`dgXUYem]N[z{|{wmlu|qkrmgeUDGJT]SN`ql^Ys”‰aStŠ|dhma^faX_ltyqqod[ampomjihiklkjklkigke\r‹”¨²¬«¸¾¶³µ¸¶¶·¸·¶¸º¹·¹»º¸º½º¶±³¹¸²°¸ºº·µº¼¶´¸º¹¶¾Âµ¬¸Å¸«½µ…emmikjijifcfghlg[SPT]ipolfelsegŠ…eiwrpsrronmmpttopsrqpqoqpqqprofjwzpkz‰‚ys|Š€f\ejoneahoq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€P|lhkkhigjwztw€}{|}~~~|}}ywy}€„zuyyv|ˆˆ‡‰‹ŒŒ‰ƒ~}}€~€€€‚‚–³¿°°¶žsz§ÂȽ™–¸Å½»ÂË•}…†„†ˆ‡‰ˆŒ‘–—˜——œž›˜–Œˆ’”šŽ’˜š•”™œšž”–ÀáÒÁÆÏÊÌÐÌÈÉËÃÇÌÉÆÆÂÁÇÈËÌÉÅÆȾ¿ÄÅÆÈÊÃÇÊÇÅÈĺ©‹mipppxruslijifocaillnqmmmnopmkirsswww{`BISTURRV\\YZ^UWXWW[XPTRS_bbffZTVelUIa}~}|wrps{ƒwkljhhXILNU_UP`ql^Xs“‰bUuŒ}fin`\a^W_jqsprqc[dsonmlkjjinkhgijjjid[s‹•¨²®¯¹ºµµµ·µ´·¼¹·µ´¹··¶´¶¸·¾¸¯¯¶¸³²º»½»·¹¹²¶»¼¹µ¼¿²­·Ã¸¬¿¶„emmijkijigfhgfidZRPT\gpoqmksub`„„dhwpossmloplorqrqsuqorvtqststqiiuxtow…‡wr‚‘|]\ljprmkpw{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Nynorkannnv‚‚|z€€‚……ƒ‚„…~€„†‚‚yv„—œ™–•–—–••Œ…ƒ‚ƒŠ†ƒƒ„vƒ¦½±°¹¤t|¬ÊÒÀššÀÌÃÀÇÐƘ€ˆ‰†Š‹ŠŒŽ‘•—˜™œž›œž˜Œ‰˜’“–“‘’‘‘˜›š›œ›•“¼ãÔÂÌÒÉÈÍÌÉÌÏÆÇÈÅÆÉÄÀÂÄÈÇÁÃÇÄ¿ÅÈÈÊÊÅÀÄËËÂÂȼ£“{kmppqprutnlmicnkhhjiimonoprqomqsroquwxzqTAFEAIFGGHKLLOKFGGBENTn‘¯½¼¾Á³©¢§ª¯±ª«ÆØÓÝ㶈|wutkn†œ›”“•š¡“u]YI941,)""(..1;BECBEJMLILPW_cdgighfhlhej`X…¶Á¿ÀÀÄÇÉÅÆ¿ÑÍŒ`h^Ny°ÁÈÇ™Œ¶Ã¸Â¦us~„}oqw|}}{uov||{}yst{z{~vty{xz|srwxyyslnuvw||nm“°ª‘ŠŠ’ŠhTKLQ[ƒI-Okp]TgˆxbQOntrŠˆlacdh[VY\UMNNHEHHJSYXVWVY]\XUXVVVVWZZVXUU]acf][VUbnYI^zƒ€wyysoz†|leejkWGJKUaVOarl]Xr’‡_Rr‰{cfke_c`[dnrnrvob^itrnjijklljijklkhehc[rŒ•¨²¬¯¶¶³²²·µ²±´¶²²¶¹¹¹¶²µººº·¯®·»¸¹·»¾»¹ºº·²º»·±¶½·®¶Á¶®Á·ƒemmikkijbdfjhgkgYRPT[footqoqrceŠ…eiwpmrsnpsqonnlnqsqosxxqqrqpspfpxurvz‚|w‚ŒwWWmoomnrx}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dwƒqnqmhlpor}ƒz…†‚ƒˆ‰†ˆ‡…†ˆˆ‰ˆ†‚||ˆ–›ŸŸ›œ˜Ž†„„ƒ…ˆ‰‰‰‡„„‡‰~ƒ¢»­©²Ÿy{¥Àȸ˜ ÄÎÿÄ˾‚‹Œ‰ŒŽ’’’“–šŸ™’–ž—ˆ…‹–š‡‘œ”›žœ™˜—Ÿš”¸ÞλÊÑÉÅÃÁÅÉÇÅÆÈÂÀÄÄÄÆÅǽÇÍÅ¿ÃÃÄÊËÈÈÏÐÏÊú¢‡mglokntrsmlopljkloljoomoqrrqooqttjilmtzy~~hMGHFFFJJJMMKKQNIKOKRho{¡ÆÅÁű¤¥¦Ÿ¦·±©ÂÖÔßã´…zƒyvrgh“–•Œšž†jZZH50)&.'%,2.1Xe^_bflnihmbV~¼ÇÁÄ¿ÁÅÆÂÇÈÆØËllVKw¢¿ÇÀŠƒ²¾¼Ì¦sy‚~xuq{~{}}wqrz||}xpqyzz{xrpt{}}ztsuzv{{qjpwut€{j}Ÿ¬²ª—ˆ¢›|rg_[VfŽŠV.''4Seafpvdctmoˆ‚f`cWRTLScdSKUYPSUVWYZWTZZZ[[[[[[VTUW\ZRPTTV_d_YUWPWigOPk€|~|xqqv}}qcagT?AHS\RQ_on`]r‰„cSt‹zdhlg_b]V_ksvture]ervpkiijkliijjiiijjf]t–©³®­µ¸¶·µ¶µ®®µº½»´µ¶³¶¼·²¶Á½¶µ¹¶°®´ºº³´¾¿·´ÀÀ³°¾À²³¸Àµ­À³{`ikhkkhiefdijfggWRTRYippnooto^gŠ‚dftqoppoonoruroqqppqttqoooprxsgjyz{|vtwuqqwq`\hsqoqv~‚„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cnymmnopti^l„ƒz€„††ƒ‚ƒ„……††………†‡ˆ‹ˆ™•š—“”–£¦¤™››˜–‡†‡‚|{|€‘››¡œ‡nqvyƒƒ’®½¿¿Å;|†‡‡ˆˆ‡Ž‘•™š˜•˜žšŠ„‹Ž”•‘ŽŒ‡Ž–œ ž˜š˜š¾ÞÐÀÃÎÇÇÊÊËÍʽ»ÄÑÛäæßÑü¾ÀÂÅÄÀÁ¼¶¸¾ÁÂÀ¥Ž€rfdekpqmknpqooooppqqsphchopoomkknprrnoqppqtv|z}{fMDHKJHDBDKPLJMRSWh|rtytqŠ­º¬¦£¯½¸°µÎÞ×Ú廃{‚{rpde…›Ÿ”‘˜š‰seXK<30..0//**3=CFKFFGHKLIFNSH?L\[`efgkgdkdU†ÃǿľÃÅÅÁÆÆÆÙĉgjXO}§½Ê½ÁÍÁŤsu}{wrq{~{}}vps{zwxuoouvx|{rouuvy{xtuyyzysmpvwu}tj†©«§ ‘ƒž‹oincb`n–“[2$',8QdmvwZi{j{”ya\[JFSZ[caTQWWPQWWUWXX[VXYXWVX[_WTWYXTLQTV[aa\ZWZQUgkSNgyy{{wsszzh`eQ;>FS\SQanla]qˆ†bRuŒ{dhjc^c`Z`jousvrd[cntnijkihhlighkljghcZq‹•¨²¢«ºº´´·»µ±´¹ºº·³¶¹¸¹½¸³¶¹¹´´»·³¸º¹¸º¼¼¸´¸¹¹²°¸»´±¶¾³¬¿²{`ikhkkhifechkghe]QPS\imnmlkrq`e„‡hjwtopppppoprssprusoqsptrrootsjg{~{|zxtxtu{xe^hppnlr}„ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@pzjkqpkti_m‡‡zy€„„„„…„…‚„…‡††…„ŠŠ‹Š‚‹œ˜”™“’•’š¦ª¢›™›”‰……||y}ŠŒ‘xz}ux€~‚˜¨¯µ¿Ç³…„ˆŠ‰‰‡‡•—’–ššœœ›˜‹„‹‘“‘’ŽŠŽ˜ž¡¡”•™½ÜÐÁÄËÅÇÌÊÊÌÍÄÃÈËËÕãéàϼºÁÅÃÂƼÂÈÁ¾¾µ˜zgghmojopnkjklklprrpopsuslcdlpnmpqnlnqsnpppopsuptvyxeMDFGHIJKLMJGINRWdrwrz~to}‹žª®²¸´²½ÏÞØÝ纄~‚{sqef‡œ˜—–’‡{ttbJ<;630'-/*+9@@DIINPJD=515BMLHRaed_bkgdm\R˹ÂÂÅÄÃÀÅÄÄÙÊgiVP~©¾È·y~»À¯Ã¦vw~}ytq{~z||upu}|wuqnrqpptslktwvxzxwx||zwslnv{{wqq²­š‘…z‰’yeiqcehp”—i9"&..>Yo|q\ntpŽ”sa\WHJ]hcf`WTWTPU[XW^]UTXXZZURU[UQQX\\VRRSW`gaZXWZQSdoYMc~‚xvy|ywtu|zlbeR<=FS]SPaom_\q‰†aRuŽ|egic]a]Wamttosr`^ktrljmomklmjfhkmifmg^t—ªµ©­·¹³³³¶µ´·¼º´´·º·³µ·´±µ»¼µ¶½·®´¾º²±¸½»·¹¼¸´·¼»·¯¸Ã¶«½³€dmmijieeggbeffig[LKR^koqqnkstdi‡‚dfurpqrrrppqrpnmnrsortrrsrpottlly{€yvzwuw}vb[fptspvƒˆ…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Eu€qswtmyn^e€‡}zƒ‚„„‚…„„„††‡ˆ…ˆ‰„„˜–“¡˜—›•–£¢Ÿœ˜”š›“‰†{yrszzv|†…ƒ‡}z‰€„Œ“ž¯¸§…ƒ‡‰‰‡‡‡†‘•Ž”™–™›š—•Œ†ˆ’Œ‘–ž¢”“•˜»ÜÒÄÆÉÃÆÌÌÊÍÍÆÆÊÆÀÇÜéçÝǹ¾ÁÁÆÆÈËû¾­†ibfjimrlonnppooportronqtoqpg^epppsspnopmopqpppsusryysk_PMLNRSPMMKLQUYdpurtyywqh‚™®¸¸°²¾ÒÜ×áé·‚‚{sqegˆž•›—„xx~jNAC?<4$#&'0@FDHLLPMB;96999ESPP`h`VWZUT_RO–ÌÀ¸ÁÂÅÃÃÂÆÃÂØÏggVQ‚­ºÁ³~‡º¸«Á¤vw~ztq{}z|{toovvsqjejqonpoggpuvwwursuy|{rjnwz~zuw“®¦™–†{”–i]xuehll‚tB"!/13Ksriqxhzšˆi`]WMS`caicVW]\VY\WU]\TR[WX\\VX_YXY[\XROTQS]d_YZUXQRanXG\|…}zyyuwusuyqecV>?GU^SO`qn]Ys‹…aRu|dgic\a]Xantqmtq`[flojghkklmljjijiignh]rŠ“¦±°§®¹º³°´º·¶¸¹¶´µ·²²º½´°³µ¶±³Àº¯±¾¿³¨°½½¶³¿À¶¶¾»®®·Âµ«½³€dmmijieeegeeecih\VVSWejipposp`j†ghurmnnmnpopqrqpmorsstrssurqtrhnz{}xy}{vuwq^[houvu{…ˆƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fq|tuupmrl_gƒŠ|sƒ}‚€‡†„…†ˆŠŠˆ‡††‚ˆ’’”ž¡”‘–•–’”ž ™’•Ÿ”ƒwtxqnjbi~ˆ”ƒ€‹}z~}}‡— –„€ƒ†…„…ˆŠ’”––‘“––•–”‰Š†‰Ž‹‰‡‘–”” ¥˜‰”¡®ÎãÓÃÈËÆÇÌÍÏÎËÀÃÉÉÃÉÙãë߸œ¡¨£¤Ÿ¡¤ª®¡acfjkfhkjhgjnolmpqrssqppqrqrhX\lrkqsqnoqqpqqqppru{vuz|vpqmdZVVVQMLKQWWWduuuursuuqtwˆ¤´¸ºÀÑÛ×âéµ€„{srfh‰Ÿ™ “yr‡~lVJIED>/%(.9FIHJSSSK>9<>?QMDNSU`h\PIB>DOLQ™ÉÀ¾À¿ÄÂÃÄÈÂÀÕÍŒdfWT„¯¯Å¹{„¾º§¾Ÿpv~}wrr|}z{{tntvsqrkfkonnqpihoquxzwttuxy{ulmuzyypt—¤‘—€‚—zZr‰ylmnfozsN'*2/Coto}zo“£z[VSNMYb`af_WY\ZYYZURVXTUWPOVZWUVUWY]]VNMVRS\d_YZZ[SQ]lYFZy„|yxutwsszug`W?>GU_SN`ro[XsŒ…bRt{dhjc^c`Yajonqurf`foonlklmmmjklkhghikdXm„ «¦¤±»¸²±¸¹¹·µ¸¸µ´µ°µÁ¸³·¸¶¬­¸¹°®º½·±¶¹´²ªµ¾¶¯¼Á³®´¼²«¿²{`ikhkkhi`gghedgeYPPRZhmnonjpn`h‹„fhwtrssnrsplmorsrstsppstuutqsnbk~~y{||{ztrwsc]iptvw|„„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gq{qturoqi\e‰}x}}‚„ƒ†‚‚ƒ…‡ˆ‡…‡‡Š…|€Œ‹‰‘•Œ†‰Œ’“—“’Ÿ›–†wt}ofaZ_wŽ‹ƒˆ‡vozxx{…‹…€„„‚†‹‘““”••”†€€ƒ…ˆŒ‹•’ žŽ‡•¦¶ÓåÒÄÉËÊÍÍËÍÍÇÂÂÅÿÉÜèðÝ¢t{„ztuj|¡¢y_dgeacijkoljknpnmnlnprrqppwrqm_Yeskorpnoruqrsrqqsuy€wsƒ„upwrmjgaWOKINXWS^qvpswuuzsmq|‘²Â·ÎÜÙà浂zsrgiŠ œ£•yt…‰{ndXLDEFB76=FIHHGORYXNGDADZYHDITdfZQG>HX\HY£ÉÁÀ½¾ÂÀÃÇ˽ÓÍfiYQ|£«É½y‚ÃƷßpy„€yur|}y{zsmsupllifkkkiihfipmosvsptzzwwvnkszxwnu“•‚‡Ž|wv\i—•vqqldfmmZ1%-0=Xqy{u„¥›lVPMNR\ddge\VYVRT[XTU[[QFEDGNWZYWPPT\`VMNTSV^c]VX_]TPYj\JXu€}yxwtxtt|xiaT;;DU_SNbqm\Yq‹‡cSt‹zchlg_b]V_lsuuul^Ybkjnoljkkikllkhgghng[p‡‘¥°¦ª¶·³±°²³´µ¹»¶µ»»±±¸º´´¹¼·­ª³¹´­¶¹¶¶»¸³µ¶¹¾·°»Â¶®´¼²¬À³|`ikhkkhiafffffhc]MJR]ilnrnjqtekŠ„eguqmnnpqqpqqpnqtsrsppvqpqqsvqdlz||zz|qnqxud`mxyz|€…†…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€BoximutmldZh„‰|y€†…‚„ƒ€ƒ…ƒ‚‚„‡‰‰‡ˆŠ‰ƒ~‚‹‡‚ˆ––Š‹‰ŽŠ‰ŽŽ‘šœœš‰yzud[\Y\r‹¢•}Œ€xruxx~„}„‚„„„‰‘•–’“Œ‘Ž””‹…€‚…ƒˆ‰„œ‹–›ž¾ÝÖÉÊÈÍÒÎÆÆÈžÁÇÅ¿ÇÚæïâ¥nq€{…•vmnfedagoidnkiimswvsrtutqpprtoqvn_arvrnmoponrssrqqsv|qiowz|ssssrngaXPS_`Zbsyvv{}xv{~rsts­³ËÞÛÝ㶂zsrgiŠ œ¦›v„†ysrdN@AINFAHOJHJHMOVYUTTRKPROICJZj\SF@VkeEa­ÌÀ¾»ÀÀ¿ÄÉͼÑŇdj[RzžºÅ´y|ª°·Â›kw„~wsr|}y{zsmltrljgehklkihefkmmszvoqz{yvpknux~zy}‡†ƒ“™”sfu”¥‹osqjefhib;'$(17>X{yu“ „^XTU[^^_^de[SY]XVWVX[\[RGINRTWZYUWRQ[`UMRQRV\^WRT[YROXi[IRp€ƒƒ|wuwytt}yjeQ88BT_TOdpk]Zp‰‰dStŠycima\a_Ybmssqwr^X`bjppjhlnlllkjihggng[p‰“¨´¨«··¯­¯¶¸±²½À²®»Àµ±·¹¶³²¹·²°·½¶«¶¿»³º½µ¯²ºº±³ÃŶ­·Â·¬¿µ‚dmmijieeegbbdgidXQQQXgmmklmsq`g‰„fhvspqqpqrppqqqtuomttoqsqporvpbf|{}~|wrsw|vgk{xwz~ƒ…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gqz|wolscXd}ˆ€vƒˆƒ€€‚|„†‰Š„„‡ˆ…‚ƒˆ„‚ˆ“™—”–“‹ŽŒˆ‰Ž‘“Ÿjqpb[agit‚›£‘|†“ˆxkrv{€{xƒ…†‡†…„Ž•–”•–’‘–˜’”™˜ˆ€ƒ‚€‚‚™’Š‹•¸áÚÄÊÆÈÌÍÊÇÊоÂÇÈÍÚáëݦ|‡“Ž£§’tlqqojgfhlmiellmprsqostusomorvvqqskgounmsrqvqqpruursvkRFQ`ntrrw{{xtqokklrtjfousrrstrp~urttwˆœÌÝÜâæ´€ƒ|roce†œ¥›œ‰u|wbgk`LCFGENOIHPPIFJLS[]Z[^TPVUKFJXhZ@5.4RbQi³Ò¿¾Á¼»ÇÊÃƾ´ÅȆcg\Ty¬¶Æ¬|²µ¹Ê p{‚zwvr|}y{ztnorpjfdeikjhmoc`mpstsrsuvuwxsmqy|yyqyƒ…’¢²¥„Š£†vy{mjibolE)%)/3-W~~Ž¥’tZWUYYV^gcabWQ\]WXZZXW[[WVYXY\]YVVXQR]`UMLRQW^]YVTZXPMXcZIRm~‚|vzzwuuw}xgN>9BT[QO`pm\Xq‹ŠcRn‹€ehlf^a]YblprqspaWaoprjfoqllllmmlkjipc[qŒ–¤²°¬µ¹³­²¿¸¯±º¹±°³¶°®¶½ºµ¶±µ°°½½²­»¿µ®·¿º«¯¼»®±Áø¶Áų«¾¯zflieijhhgfeihgjd]TPSZenorolpo`i‹‚djwppurssplnrrnqooqrqprqrurosskn~„ƒ„|~€{{€~uty„}{~„†‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Crƒ|zurssdYcz…{z„‚€€€€‚„…†‡ˆ‡†ŠŠ‡ƒ‚…ˆˆ„†Š“•—™•Ž‹‘ŒˆˆŠŽŽyfgm`Zbimv‚Žœ˜Ž}optuy€{}€‚ƒ„…„„‰”‘’—–’’••–œš‘‰…„ŠŒ††ˆ“ŽŒ‡Š•œ·ÜÚÇÈÃÆÌÏÍÈÉÍż¼ÃÇÏ×Úïá©‚“Œ–ª™rure^fhijihghqmnsuropklmoqrssqxtossnmqroqqqtsututqwvhQE@DIU_air|€}zyzqtuyzqlr{yusrrrrpptxxvw{¬ßÝÖå¸}„„|sqdf†¡ Ÿ‡og``caUF????OUQLQRIAIKQY]^afb]_YLDER\TD?98GNQwºÌ½Âļ¾ÅľÆºÌɈdg[Sxª¿Ì®~ˆ»º¹ÃŸqx|vtyywxvqonqpnlgcciliijeclnnquxvspwxytlmrtxuo}›¬­¤¢¡•£„m„…mlnalqR-!*/18g‹Š›¨]SUV[]Z`d_ccVQ[]UU[XRRWYVTZ[ZYZ\[WVRV^]TNOQR\e`WUXRWSOZf[FQm}€ƒxuyvutu|zoT?9BS[SP^pn^WoŠŠfTl„ybimc\`^Zdotusto_Xcrolmmgghfhijkkkjij_XoŠ•¥´®¨¯µ±­®¸¶¯±¹¸³²´·³¯±···º¶º±­¸¼´°´º¶¶¹¹¸´·¿Á¶±¾Ä¸¬¸¿¯ª¿³bjkillfeacehfdjg[SORXdmmspkom`j„fkwonroopqprtsoppnotsqssqqppushp}}‚€„€€€~{zxxw€‚€ƒ‡„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dmytyyrood\g}†yƒ€ƒ€…ƒ†ˆˆ‰ŠŠˆ†ƒ€ƒ‡„‡‰ˆ‰‹”‡„ˆ‹Š‰‹‰ŽŠ„~qgjk^Zcjlw‡’–˜“†qcaovyy||}€€ƒ„†‡ˆ•‘Ž”™••’““’™•“’ŽŠ‹Šƒ…†‹Ž’’Ž—œµÙØÇÉÄÆËÎÌÈÈÌÀ¿ÄÇÂÅÓÝíæ­zˆ‚‰‹{migcbbhmkebejljlqsqprusqprsrqtusswrigouomrststpwxttjRFEFCAHUZ[cpy~}~~vz{zztpqtttsstvxsuwwzytn‚°Õç峄„}usfg‡™œœz[Z_ddWLEA@GNOYYQTWNAJLRX]_ejfa`WKDERZUIEC?CCWŽÄÅ»ÆƼÄÇþǸÈÊŠfh[Sw¦¾Ê¬{„¸¶³Âžqw|uswyz|uoonomjifegklhfhfisnpuywstyxxwpiluxyq‚“—««¡©­™–…htˆ~jjkftb5 /-.I‡—•Ÿ—gQVXY]]\ac^b`TP[]VUSVWVVTSU][XVY]]YTTY^ZRORTRZbZMMTYXPISb^MSmzz‚|vyxwtty{vZ?9DQ[WP`ol\YqŠ‡cUo…ychie^b^Yblqqpsn`Xanpptpgjneffhijjjika[q‰’¢³«¨²·±ª¬·¼µµ¹¸´´µ¸°¯ºÂ¸­¬¼º±¯¸µ­¯´µ±´»»¹µ·¼¾´®¹¾³³¿Ã°¨»¬wekjfjjhhfghjfdheZRORYdmmonlrqah‰divoorpoonnnooopqqpqrrrmnrsuwpbm|{‚ƒ‡‡‡…‚wy~€ƒ†‰Š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gmtoy{sjsg[d|…~z„‚…‡€…„„‚†ŠŒ‡…ˆ†{}‡ˆ‡†…ƒƒ†‰‰…ƒ„„‚„‰…ŽŽ†|roslbcnlhx“—†”±žgQakswyz||}€€€‚…ˆŠˆ‘Ž”•”‘‘“——–•—™’‡‚ƒ„„Š•œœ–”¶ÜÕÂÍÊÉÉÊÈÅÇÌÉÄÅÊÈÌÖÜåæ±m[htŠ~mbcec_ahmkdadikoqqqrsrqqpqrsssrtomrtkbmtpnpqsusmrzscTHFGGFCFMSSV`nz~~}z~yvvtsknqttvy{}zuux|yuov§å沇~„~vuhiˆ™˜—j=RkcVHELHEO]MWXSUZSFJNSX[_bf^\]ULEBM^YOLMKIHg§ÌÁ»ÅüÀÅÅÂÉ¿²ÃÊŒhh[Sv£·È¬x}±±°Æn{zvtqx}€€zplqsrojdchljimkcbkroquvsv{yzztmnux}xq„”Š‘ª®¢§®¡›šh_y‹vikgrm?$1(/c¡›˜—wUW\^][YZacaa_TQY[TTWWUVWUUX\VRUXZYYTVZ]XQPRRS]g`TQU_WOLS\ZPNhz‚ƒ{sy|{wtw{{]<7EQ\XOdngZ\vŠeZs…wdkje_b^W_iorrsoaZcompnjjnlggghjjjiine_tŠ’£´§§³¹±ª¬¸»µ³µ³²³´¸±°¸º°­´½º±²ºµ¬°À¿³±»Â¾±¶½º¯²¾¾´´¿Ä²ª½¯zgliehjhidbafeegb[SPT[fnollmusbf†ƒgjuomomoooponpsrnpqosuointvuunbp„Œ‡‡‡†‰’ŠŽŽŒ‹„xy}ƒšª¡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€GtwwwtqviZc~‡}w}…„†ƒ~…„…‹ŒŠˆŒ’Œ€ˆŒ†„†‡ƒ‚„„„…††„„…†‹Œˆ‚xqpiep}sbuš‘r‰»©gSmlmrvz{zw}}}}‚…‡Œ”™—–••“‘“—˜Ÿš˜œ™ˆŒŠ”œ –•¹ßÒ¿ÌÍÊÉÈÆÃÅÈþÁÄÁÅÐÖãä±bD]~Œ…jYajhdcehjifcdfknoopsutpprtvuroqqopvsh\irtsolswurprlVINKIHIHDHQVV]jw{~€€xux{xrrrrsuxzzurtxwusrkr§×¶ƒ€ƒ}wuiiˆœš™c,>\WB7AQKAJXLQRORVRFEKRW[^`ac`[NFA>J[ZVU[ZQN»Ð¿¾À½¼¸¿ÃÂǼ³ÉÉihZSv¡ºË®x€´´°Ä›nz‚zusoz}{rjmopnkddjigilja`gllouuqrw{|{umovy|zt…’…¬©–¢²©¡œnid|“yajrqH(*$?„©œ’€_R]^^^ZW\acadaXSWTPQWWWWXUVZ_YVZ^^\[VVZ\XQNPPS[]WRTWZSOQV\YOKcz‚…ytuz}yvw|€_;5DS\WMdmgZ]v‰bYu†xejh`[`\V^jqqqtoc\dmokegnjgljjkkkiihjb]sŠ”¦¸¨¤®¶³¬¬´¶±²··¶··³µ¶¶µ±¯²»¾´¯¹»´±½Àµ¯·¿¼®´½º®²ÁÁ´¯»Á°ª¿²~cjkilkgegedhggicZRPT\fonnmlqq`gˆƒhjtpmnnqppqomorllqrmqwsoprpptqfk‡•““”–š–‘”—––—Š‚||–ÇÙÁ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fxˆ|wutsuiZd‚‰|u~„|‚……‚ƒƒ‚†ˆŠŒŠ‰‰ˆ†„ƒ‡…‡ƒ€ƒƒ€~€ƒ…„‚‚‡Š†}rkj``q‚u`o“”~…“yZ`unntxtqtxwwxyz|~†“˜™–˜š•Ž˜œ›–˜›““‹•–•š›ž»ÜÓ¿ÇËÉÈÉÈÄÃÄÄÅËÍÄÅÔáêêªVQ†œ‹i^]dghkkhhiihfedljikortupooruvspvqovysf]jppsrpsrqxrmk]OSPONOLFIUVX`koqw{|{wrw|zyupprvxyssuwvsqrqwiw¦§…}|vvih†š•˜˜i/-FXH8?QIAKWMNNMPVQB?GPVZ^`_he\KEB?KX[[YbdYX•ÈÏ¿À½º½½ÂÂÀø²ÌÇjh[Uv ¼Ê©u»·­¼šnw~zrp{{wxyrlrqoolfbfgiihfgimimtwsnqw|{yqjmvz{}v…“…±¤‡´¥¢¡€`j•ŒlhrpQ- *^¢ª›}`QU]aX\YY`d`]c_XUUSQSSVXZXST[YYWWZ]ZUWVY]YPLMLV`_USTTTPOPT]^RLbw{xowywvw|„gA5BT\TM`nj\[r‡€\Vt‰zdhea\a\U\homorob]birlhkljinkkkljjhgja[q‰’£´©¦±¸³­­·°¬°¸¸´²±·µ³µ¶²¯±»»²°º¹®ª½¿¶³¹¾º¯¶¾¿³°Áŵ±¼Á¯§º¬wdkjgjkggefghdaeaWQOSZfmmmmkrqag‡€ghtqoprsrrrpnoqortsstvxspnnrwrdi…‘Œ‰‹Œ‘’•”“—ž›”ˆƒzŒ½æèÚ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Hy‰}{zuptjYaˆ}}„ƒ„„€‚‡†„ƒ…†…†ˆ‹ˆƒ€‚…„ƒ‚ƒ€€‚…}{}}}ƒ†skjjbbo~ykv•’“~WUrƒ{rtwqkpwstvwxxxxzƒŽ‘‘•™—‘”—“ŒŽ•˜–š—“›Ÿ—ŽŠ‡‘›™“œ ¡¶×ÔÂÅÉÆÅÇÈÅÅÆÈÃÆÊÉÍØÞìë¥`x§˜rc__`bjlcijjjigedqomlmosvwtrrtvvtttrosyrdhqoovurnotojpm_URSPMMHJTTV`ikhmwssxxtw|yxsoossoiepzzutvwqtrp~Ž‹|€zuuig…˜‘‘—o50LaT=CVTOUXNQSRWb[DBIPSW\__bd^PMG>F[^^Ydj`e¢Î̾Á½¼¾ÅÆÄÂǺ²ÊÅŒjh[Vx ·Æ¥qº¶«º˜nw~zrszzvxwqoopqsridgjkmkhgiioqsutstv{{zrjkruuyr”Œ—º¤‚˜¯£¥¤“ˆkcxŒˆmml]6>®¥ˆdMP[_bVZVVae`^a\UTWVTVYVSUYVUZYZYXZ[ZVXVY_ZNHJNV]YRTZZRMORT]^TK`v~‚}tpvvrqqw‚vM7@SZQN_nl][p†€`Vq„ubjle`d^U\gntsrk`]gpnllkijkihhijjihgnbZp‰’¡°¬ª¶»²ª­¹´®²»º³°±±¯²»¼²¯¶»µ¬±¾·©¨¿¾µ²¸¹µ¬³¹¹¯¬¼À±¯»À®§º¬xglidhjijefgjgejgWPOS[fmmlllsraf…‚jjtrooqlmoppnnorqmntsoprpoquyrbl…‰ŠŽŽ‘•–”˜™Ž‰~ªáèÛÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J}‚€ytng[dˆ…†}}„…ƒ€‚ƒ…†…‡ŠŒ‡ƒƒƒ‚ƒ……†…ƒ€€‚„€€€€€€~vppojqmr~}‡™ŠŠ–†ZVžuiqtrpnstvxxxvuz‚Š‹•˜’’•˜—“–™—™Ÿš’–š˜•Œ…‡”™•”¦£›°ÓÔÄÈÉÅÂÃÅÆÈÌÂÃÊÌÅÈ×ãçä¨~™œtbcXX^`fmkiklkhfeflppiflsvutrqqqrsrrstxzpaautpuspqumdfqvjZWXRMOOOTUV_jlhipqqy~{||wspstm]ONg{{vwxu}lgnuƒŠƒ~ztuhg„—œ‘šr4=`cM8Daf`ZNNTYX`phKHOSRTZ]]ih\IFC>I\ac]hodj¨ÐʼÁ¿¿¿ÂÂÂÆÏöËÄ‹jh[Wy ³Æ©s}¸·¯À˜lzytquy{|}xqqmmllh`_fjggieadikqvuqpsvxxvpimw{y|q}’Œ–µ›}Ž¤£¤›ŒŠ‹t^`‚˜|fhe@!P˜®™oSPXcb\XZSQ]dbbc\TTWWTUVVVYZVU[\ZY[[YXYXUZ`ZKEJRW[XRUWTWMLRTX\XPbrv{„‚wuxtnkkq}W:>SYOPani\\s†}aVr‡xckoc_d_W_ksrqqj^\fnmjjlljiidefhhhhhnaYq˜¦´¯ª²·±ªª³¶­°¹¸²±µµ°¯·¾¸±±»µª®¾½³±¸½¶²¶¼¾¹³¹´¬±¾½³°¼Á°©½¯{ckkhkkgfigfigfhaXQPU]honomjon_g‰€hitsqqtppnmnopqmprrolntrqqqrwsglƒŒ‡Œ’–”•™œš“ŒŽÄïæÒÕ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J}{€€}tgY`|Œ„yƒ€|€ƒ‚€„‚€€†…ƒ…‡ƒ|}„„~€~|~~€€~‚|}|ulkmknkrzq}ˆxˆ‹ww‘°fjpmsloqrqrvwttx|‚…Ž”’–™—“•–•˜–—˜˜š  ™‹–š˜˜¢£¸ÚÕÆÄÈÄÄÇÈÅÅÆ»ÊÓÁÀÙèì๕xYV]YWZ\^bggilmhcejnqtpijrwsssrqprupusswyseamtnqvojchnopqpoebgfZWYS_WS`njcgqsutuy{yvnnxv_NOJTdtytrvwoqsoxƒƒ{wtvnj›”›ƒ?+HOB?QljTHINS[[e€wI>MQQVUV`feYKCEa_MGNNNOKHFIQVRT]\GBB42CLSfhcfkamŸÉżºº¹½ÆÅ¿¾ÇÁ¸ÆÄe_DEy¦¯º¡r»¾µ¸”djtolnoqsttrpnrnkklfdglmljiffjnoruspszxtspifjnnji}–”¤¨„kƒ•™­—`mŸ”hfqom{…gg›škW][[]_^\ZXZZZ^^`d\URUYXVV][WVYWVY[\^_^ZUPVYXZ^RDDPZ[URQNKLMMRUWZUO\lv{~€€}stuqv|uyƒuQJXVPcwn[Yqˆw[Ur†ybfgc`aZU`jrnkonb]ekjlmlkijjjiiiihhglaXp…©·ª¦³¹°ª®¹µ±³¸·¯¯´³°¯¶¼³¯·¾»°®¸³¨©¸·±¯¸·°°·¼¶«±Á½«­Àí©¿­xbjjfghfgkeceimj`VPPT\fmlmihpo\fŒ‚fjwplqwpqommqrqmpssqoopnnqqryugmŸš˜œ ¡¦¢¢­®œ¯åòèæëíãÛØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Glww„ˆƒzp\a}ˆ€€€ƒƒ€€~}~}ƒ…†‡…ƒ€€€~€‚‚~~~|~{{~||sotuliZW`_blkm‚Ÿ³¡„’®ª”yjlmnpprqpssmlqu{„‰‡ˆˆ‡‰‹‰–”ŒŽ“”’•–’‘’“‘“˜–•°ÇÆËÚÖÌÈÃÃÅÇÄÀÂÈÄÈËÉÄÇÔßÕskc]\YY[\^dh`TY]adiopmqolpskbdltzxwxvqpnouvxwi^dmjhpssvyyvuwxwrvwuu{xn`[[^[]lznxqfo{xqnwywwzzy}}xvwuruuvupqvywwtqfbuŠ‘‰†Ža0;G?SnbHTxvVFNQIEFEFKRROPVRBA=))>JT[bhce_j—Èɾ½À½»ÂÃÁÃƼ¶ÊÄ‚hdCCx¡±¹¡z‚²°¬µ”dkuohjjnquurnlppomjedikkjhgdejoopstppwqqpjcfkkmlhx—¦ xk‡“–°˜[m¥›phsuiowo€–~^X_Z[\\``XVWX]cece_XRUYYVXYWWYXXY[ZYY[\\XTWWV]`PAEU]\SRURLGKOUWWZTO\jrv{ƒ€rrywx|zz„aPVSO^qiZZsŠ|\Vq„xcefa_b\Xajpplnl_\emnnkjijhfiiiihhggoc[s…Ž§²«§³¹°ª¬³´®®¶·±¯³·²±ºÀµ­´¼º««º¶§¨º½³®¹¿¶­¯»º­¯¾¾°¨¿Æ°«¿«sckkghighfeffehgaWQPV]hnmjmlnl`j‰|hnwonqqppoopqpmrtsqopruqprqsytdtŸž¤¢Ÿ¥žŸ®¯£¸èëéçêëçÞÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Hpzu~}yxq`_v…‚}ƒ}}†…~|€€‚ƒ‚‚‡…‚~~~~‚„†„~||~~~~~|{z{{vmiiklZT[knhv—¤®¯š“¦©œ˜xhmklrnnnnqrmlrvzƒˆ…ƒ‡‰†ˆŠˆ‡”‘‹‹Œ‰‹‘’‰ˆŠ‰Š‹‹™©ªºÔÒÉÉÆÄÄÇÆÃÄÇÄ¿ÄÇÄÌÕÑ …ohaYXZVXZ]bfc\^ZY]dinsrnpxxmcaikpvwspossuyvvwmdlywoqtvywuvz|{xyxwyzvuztj_]\Zbptvkerztmr{~zzzyxwxzywwwsrptxtpu{z{xukfwˆŒ‚Œ„R1BAFdmfen†nTPNHFHAFNROKLNPGC@98@FKJTikf\k˜ÉÌÄÂÁ½¼º½ÁÄȾºÎÄkkRNxœ±·žxƒ³¯¨½›giqg^_gjnqroljlppkfabhfhijiedgmnnrvqnsvtpicfjjpngpŒš§•owŠ‘²—Ws¨™xrqvmst~–j__d[\a^\^^ZXVZbddgaXSTVVWXWTZ]VW]\[VTW_`[UVWW]`N@EY]XOQVTPFLQVVWYRP[gou|€|suzwtxzz„nYUPM^ogZZpˆ|[Vqƒvagja`b[Wajpplol`[dklljghkkhiiihhgggnb\v†¨±¤¤²¹²®¯´µ®®´µ­«¯·°®¸À´ª®¼¶¨©ºº®­¹º®¨·¿´¦®½¾®¬º¼°©ÀÅ®«Á¬pbjjfhhfgccedacd_WQPU]gnmjommlbk‰~hmvonpnmllnopqrpqqoprsrvtsqrwp_o•«¨¨°¯©²®´¾½¸ÉæêéèèìëáÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cp|pnopr{oaew€€€€}z„{~‚‚†„€}{||{„‡†ƒ€}€€~}~|y||ztnkhbca\fpn€ ›š–¤¢‚wx~oflnrrquusrpoq|zƒ„‹‡…‡Š‹‘“ŠŒ‹‰”“Œ‡‡……‰ŠŽ“‘®ÕÕÉÈÈÄÄÇÈÅÅÆ̾ÁÆÃËÏ¿Š{kb\VUXUY]adgfc][XZ`hlmmrutrqj_jorsvxvpptrrrsxxqqyxqqtwuuvxwtsusyww}ysw}se_b_]dupa_qyoirtuwywvxwxwvz{xtrrvzupqwwwtrjetƒ†~}ŠP;JAStnlƒ’€of]UNIAJTVPLMMSRJGJHGNKNLYgh[lÌ˼¹¼¼¼ÁÁÀÀý¹ËÈ‹kk[X| µ¾ t‚¾»­¹—acmfaeghjkllkkoolhgfccfhiihedhnmlpuqosvnhgdeiknlcjŠ ¬“q‘†’®ŽXq«œƒxfr{uuƒšYY^Z\a`[[^\ZYX[```d]TTXVWZY]ZZ[ZXXY^[Y\`_YRTYZ\]PBCSVSNORPNHMQUTUXSNXepx~}|wopvyw|„u^TNM`of[Zm„{YUrƒt_hndaaYT_ksqmom`[cilnlheghhiihhggggj^[wˆ‘ª³¢¤³¶¬©®µ±¬®¶µ­¬´·®©´¾¶¯¶º²¦§³µ­¬¹º±­¸»²¬·Àº«¯¾¹¥¯ÁÁ©¨Â®qaiieggeffdeedgf_VPOU\gmmlmlonaj‹…fgtolnplloqomnrsnlptssvsqqqsysbr§È¾ÈÌÈÉÍÖÚÒÐÞìèêìíêäÝÙ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bpzpspms|tbe~…|{„„ƒ‚‚€€ƒƒ~|~‚†‚€‚‚}„ˆ†‚€~†~|€yvyz|yuqf_cdiiurh|Œ’‹ˆˆ†wklnknomqppoptusppxz~ƒƒ…’Ž‰†ŠŒ††Ž“”“’“‹‰Žˆ‘”’¤ÇÓÌËÇÈÆÄÇÌÈÁÉÁÇÉÆÒÄ–}wmc\VW\U\bdefe`a\^\`hghsuuuuqidclrrsvwtqpooqrstxvwyumpzvssuvvvwvvvuvwvtuzwkaacaopY[xwhiwxv||w||xxyyywxyrsttsqpprz{vmlx~‚}~ƒ~gSMHStoi}„“ˆ|gSDAMVSLJKLJROINUX[_YOUfebk¡É˼¿À½¿¹ÀÀ¿Ä¼¹ÑljhfVT{¢´½¤x€µ¸´»•^cqkcbhikmnmlknnlkjfdfkmkhgedfkhowunnrrlheadkonf^n«ªrŒ’„”¬Rv±¥…vz{vz{‡ˆnYX\^^]^^^][ZXV\cccg`TUZXST\_YXZXVXZWVX[[WUURRW]]M=CRVRQPNONMPQSVWUVSVemv}}yxvtvzrtziZOO_pj]ZsŒ{]Tu…uaeh_\b[T^lssnol^ZfphhkjefjlgdekmighkaZr†Œ¢®¨¨µ¹­¦©²±©®·±­±´²««·¾¸´¹º±§¯¾·¬¯»º²²¼½±ª·Â³¥°¼»±«½Éµ¨º­u`kihjfgeffefdfibTPMQ_jlghjjonakŒ„ghvtrojplnqnmqsostpnprtuuutswo]s»ãâÞÞßÝàâçêçãçíêëììêãÛÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Jv}qx{xy|vedx€|€}€‚~€}|€€‚€~‚…€}~|€‚††ƒ‚ƒƒ€~}zz{~|vojdcghcrzeo”–ˆ‘š‚`qŒpsopqnnroorttrrtwz‰‰‡ŠŠ†‰Š……‘’”–•”“•““Š‹‘’‘•‘˜¯¸¶¼»ÀÄÇÉÌËÉÂÁÉÈÉɤuqzp[W_^X\[^dfdcee^YTZghjstuvxuoiigmx|wqqusqqrstvsxzwuvvuyvtuvwy|wsqsttsst{}ukea_kkW^xvmuyywyzy{|v{~|xwxzsrtvtpnozzuqhdq{{z}u`NHbtimusƒŠ|wkXEJTZRKHGCITTNQWZ^bYMN[`epœÉÍ»¼À¼»¼ÅÇÃż»ÓƈgfVU{£²½¢u~¶¶®»—`doiaaghjlmljinnljgccgghhhgddipmoqmijmpnlf^`fjlh_m’­©Ž~‡š«yU³¤‡z€‚€y~€sc_a^]^`^\ab[VWW\ddabaUTXYXVY[XX[ZXVTVVWZ]^ZV[TSZ]M;?LXVPOOPKJNTUTTURTXflrzz„}wvwxvvsw‚€r]KK`nfZWoŠ|ZRs…ucgk_\`[Valpqmmh\\hojghhghjhjhgjlljjmd[s…‹ ¬¥§´¶®¯²·±©­´¯©¬±¶¯¬³µ®¬´¸´±´¸¶°®·º¯ª¹Âµ¦±¿³¤«»»­¦¾Æ¯¦½¬q`lhhifgecdbdcehb\UMNZinmkmlom`iŠ‚hkvqosstpnonnonqsrpoqssrrssswp_zÄçâÞáäâÝßäèæäçîêëëìëåÝ×€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gu}ptyvsvqcbu}€}ƒ|€€~€‚€‚zv|„ƒ€ƒ~{~€~{{}}~{wpifgecWbnq}‰‹ˆ‘ “pƒ§‘ktrimpmpssssrooqvw€…‚‰‹ˆƒ…‰††Œ•–™š–“•™”˜–Ž‘”‘”‘˜›Ÿ«¯µ¾ÆÈÈËÏÄÈÎÊÐÀ†cuxjY[\YYb^^ab_dlhc]W]ikhmpstuuohegmrtrppstrmmpsruxywwxxurtxzxrqqrtxyyxvuvy{{ysg\geU]son}yxyxz|ywxz{y{|ytqprwwrpquwxxlbo~||}|tbSTTZhqkjw…~}‚mTDFO[]N<;DLRSS\c`ZaYQNU_jr—ËÕ¿¼¾¾¾ÀžÆÀ¹ÉÆffWU|£²½ p}¸µ¦´’_dojehfgikkjhgjlkieabgijjkhcdkpopokjmngjlgacgfhk_m–°§‰“‹ˆ ¥q\ˆ¶§…‚|y{€ud^a_\bbb_]`_XZYV\gd^cZRUWVVW[YVVWXZYUTVXY]_\WWTZ`ZA4AOUQQTSOHKMRSOQVUMUdlrx{€€~xtsvwtx€{dLMcmdZVm‰]Tt…uafh_Z_[Xbklooqj]\delijkkllhjjhgillii`Yr‡Ž¥±§¨µ¶®­³¸²­®´²«®·¼²¯¸¹­ªµ¼µ±´·²°¶¸¼¯§µ¿³¤³¿¶§®ÀÁ«¦ÁŪ«Ä¯r`kihjfgeggefegjcWTQT`jkflmlom_iŠ„jmwokoqnnmmpqqqponmnpppporqswq`|ÉéÝÙßãàÛÝâçæäçíêêëììçàÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gu~ooqppok_bw‚~€€€~|}€~‚€€ƒ‡‘¥ ‘†…„„€x|~}||}}zwwrikkeda[]{…km†“ž¥–›«gnqghqoqrpoprsssur{ƒ‚‡Š„ƒ‰‰ˆ’“—š˜“”˜š›–‰’”Š’’Ž”Ÿ¦¨°º¾¿ÅÎÉËÏËέslƒv`Y]YSX]_cecadifba\[gj`enutrsndajqrrvupsroljlnpxyxvtvvvquyysnnrtzytszztrvxz~~rehhZ_lko~}yytv|xwu|}zwxuqsrsvvsonrwz~sen€|{~€{q`NVKSon_nxqx…†rSCFN^cP4-6AEFJVcc\`\VQScrw˜ÊÒ¿¾À½¼ÁÈÇÁÆ¿¸ÉÁ„efWV|£¶¿kzº·¥µ“`enhcgdfhiihfedgihgcbfijiigbbhmmooifgghjhdainlem`m›±¤Ž’‚ƒ  kb‹²ž‹„}}~|oebZSXecaa`]YYYXXeqg\b^TSVWXUW]ZWVTVXVRVZ\[[YXWV[^ZH8?PTOPTSOHGJQTSRSUNVcmtxyz}wtvvssvz}jPSenf]ZnŠ^Uu†tadg^[`]Xbjknmoi]]egihjkjiifhifcdjjgjaYs†Ž¤°©¨´·ª¤«·´°°µ³©«¶²ªª¶¼´¯´¹³¬³½µ¬³µ¸­¨·¼³­´»²¨®ÁÁ¨¢½¼¥ªÃ©o`lhhifgeggdecdf_VROR\hjgjkjnm`k~eivqnnmgmqtvrlmppoopqrrppqqqvo^}ÍëÜÙàáÝÞßãèçåçìêêëíìéã߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gpzomnorqndew‚‚ƒ‚€€€}}‚ƒ€€€|}Š¤·¼·¬œŠ†Œ‰€|€~}}~|{{zvtmghkdcliYuxm’—˜‘‰nhnmknptrrqrtvwvvpyˆ‹ŒŠ†……ˆŒŠŠ˜––˜™š –”‘‹‹Ž‘“ŒŒŒ–š˜œ¦®´¾ÈÆÇËÌÁfy†q\V\]ZV^^befdeggab^Wcoc_lyyuvrghgiovxwtwrpqojmsswxsruwuvvwvtrv|wzyuy}xlnw{ww{yrnpebkow€{xzuw|wtrx{xxzytoqstvwtptuswtjo{~yx{iKGQ\oi\n~mjt{„|\EIS[[RD4(07=NSNNTUPFDNQSWOB@MRTams|{}{zxuuvwtx|ƒ|_I`mg[WoŠ|^Uu…t`dg_\aZS]hmilpiZ[hokhhhfghfjhgijhffkb[sˆ¦²¤¨¶¶ª¨­³¬¦­¸±¦«µ¸¬ª·º­ª¸¿³®·¾´¨§½¾¯«¾¾¬¦´Áµ¥¬¹¹¬­¾Ã¯¬Â®q`kihjfgebcbcceibUSQS]hmlpolmj^hŠ‚hkvqossolmpppqqtqpqsstusstsswp^€ÏéÜßÞÜáæäåéëèçéíëëêêçã߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Is€ts}…„~|smt}|w~‚€}~ƒƒ‚‚‚€”ÀâÝǽ§Ž}}€€{|‚ƒ|y|}yyukhkjipink_gvj\WlŽ¨¾¦~wnrsmnnorsrtvsoxxz~‚‚‚…ˆ‹Œ‹‹Š”™œ›˜˜›˜ŒŽ‘”––’ŽŽŒˆ…Ž’Œ‡–œž¢ª¹ŠaƒgYs€`YeWW^caaeijoi\YZannaZevvpomfeejqvtqutvxuootqpoptyzxwvvvtsw|~zuruxxuztu{{tsxwuidjv|twwtyytwxyvuvyywuurpqtvvtpsqy}ss}|z}|uz{mw•›‚w……YCEOix\KKPUWXVMCGIPSSVO=?XYSf{|vœÊ͹»Á¾»»¾ÁÆ˼·ÓÁ…ghXSw›©°—q€¶²¨¹“\ania`degggecbfjlmkfeighhigcdkegjhehljkgec`bgimd^}£¦•…tea„¬Ÿ]L‚±¢……‚ƒzum_]`]_e^_le]juinypa_cWVZZVWY\XZYURUVQRY__][YW\[XUZVE=ITRNRVQDIMNQXYK=ALSdos{y||~}wrtzzsvy€iPcqiZVq[Ss…ubgjb\^XS_ilfmshXZgkllmkffjkhdeijfccg_Ys‰‘©¶¡¤µ¹«¤«·±¨±½³§«³¸²®²¶²­°Áº®±¾º¬«»º®°À¸§«¸Ä± ­¿º¨«¿Æ¯¦Â°m`lihjfgehhffdeg`VSQRZejjmmjlk_j„ghvtrojllpropqosomorsrsrqsstyra…ÑéÝàÞÞéãáâçêèèéîìêêéæâÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Lwuy‡†wfdx‚{w~{‚€ƒ{€ƒ||‚ƒ…~žÕëÛź¢Œvr}„ƒ‚„„}y~~ywwtqppoljlpifyƒpX\ˆ“ƒ¨É£|vnpomllsrqqsuusrssuy~€€ƒ‡‹Ž˜˜”“••”–“”—•“™—ŒŠŒ‹Œ‰Š’”Œ•—ŸžzmƒxYl‚v\[ba_\]adddeih_[\cppeZ`kvztrfcfkmqwzttwyxurpppqrtuvvuuxyxyzwxutwzwvzxutvwvtttmcdpxxx~xx{{zyvwxxyywutquutuuw|yqs|{su~€{y}}tz’Žv~›˜yO@BAc‡iGHQSQSROMKJJQYWRRS\\XjzršÉÊÁÀÀ»»½Ã¾¹Á¾ºÎÃeeRPx›¦°—nz°¯§¾”^cmhb^cghhjfa`cghggdcejihhgdceenofbghcgfeddeginec‚¢¡yi`Y„µ¡ZH…­¢‹€‹‰wtzugab_[bdmz}mfw{gisldbZXWVXYXWVTXYVTUWWXY\_]YVUWSVZ\TB;NQNNUTLIKMSTSTOAFJQ[ht|€€{vstvrqqu{}oYbmj^\qƒy[Rqschha[a^V\dioopk_[clgknlllkhiiihhggflaZqƒª³¤£¸¿®¨¯´±¨­¸±¥©´³ª«¹¿´°¸¸³ª®¹³©¬¶·°®»½¯¤¯½³ª¸Ä¼¨ ¿Æ­©¼§s`lihjfge`dfigfg_TQQT[gmijkhmh\m„flvqpoqmmnnnqqolpqppoqurppqtyq^ÏïßÛâççåãåéêççêéììììçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cmwnortupphjz€~}†‚‚†‡‚|€„}€ƒƒ¥Øíßų®¤‚htˆ†|†€x{|z|xrmllgacnfl‚xmƒ“ˆ„‰ž£ˆztooqpmlrrqrtutstuuz‚|~†ŒŒŽŽ’•““•˜—””‹•—“‘“”“““‘Œ’ŽŒ‰ˆ‹‘ŽŸ“mtƒjg}zia^][`\\bfffhli^[Y^kpj`^cpyrojedimsvtuwvtsutqnquvsprvttttuyytwutvywuwwvvxxvsq{m\[l{}{wxvwzxvwzxwvustwsrtvux{{qpquwuuz}€€zx{kUUXVaŠ˜{PCE@TzlKFNPPRRPOPOKNX[WUT___uwv›ËÌ¿¿½¾ÁÅÁ¾ÅÀ½ÓÃeeRPw›¤®˜r³®¢¹[akga_bijhfbaefijjidaaggggebcegcbeebejiheb_`cfkdd†¥„rf^[ˆ³˜TJƒ«¢Žƒˆqsysgdeb]bs‚‰…o`jsiklcfgYZSPUWUUYVYZWTTTTXY]_\WTUTRUX\YJAIRPLRSKEFLRSPQROWNN\lsx€‚€|xwvvtnlov~wd^jj^Zp…`Wu„tdgg\X_\V_imolkg^]elhihhhjjjiihhggggj[Wv‰Ž§¶¥§¸¹©«²³´¬®µ¯§­¹¹«¨¸Á·®³¼´«±¼²§¬À½®§³º´¯¹Á³¨³½¸«©ÀÀª­Á§k`liijggeegghddf_ROOT\hoknnimi]p‘bhsopprlllorpnqqoqrqsuttrqqsxo\†ÐëÞÝãåãåãæìéãäìéêêêëèá߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8anggdehlngfw|{€|‚ˆ‡†‡…~|‚†}€‚…¦ÔèÜÄ°¼¹fo€|†‚x{~}|xvohhkh`cnin{jo¡¥„y‚ŠŒzyunnrmmqpqsvvtrsqu}‚ƒ‚„ˆ‰ˆ‹Œ‘‘”–˜œ™”’’––—š–‘‘Ž‘Ž‹’’¦’sqmk„…i]a[Z[[Y\beeehkg`][\irlc]]kxtmfdfhlrxwsrtwxtsutpmqtsrswuwwvuvt{yutwxwxwvuuvxxwxj[[o~~wwzzxyxwx|wtvyyxvwtuvuvxvwwttwtsw…ƒ{olqhS<3=CF`q_LCG@DgnRCJLMPRQRQRNKSYYWd_\e}qs˜Èɾ¹º¹½ÃÄÁ¿Ä¼ºÑ‚efRPwš§¯–q€¶® µŽZalhcadiifeaafeggffc`agghhecdgiihggfdbghigddgjide‰¨•vhi`a‘¶”SQ„ª¡…ngqwpghhc_qŠ†}kbprmoj_ei\YWWWYXXWWWWUTUUTUY^`^YXZXVXWYXK@HSTPSSKEHMQRTRPQTNNYhsxx~{xxwuumosx~l`gg]Zo…^Usrafe\Z`[T_ikfkql_Ybkkihhhgijihhhhgggmb\t†¥® ¤·¹®®²±²¬¯´®¨°¹µ¬­º¾°ª²¸²ª±¼´ª®½»°­»¿³ª¸Ãµ¨±¼¸©®Á¿©®Ã¦g`lihjfgeghffccgaVRQT[flhikiok]m‹dktqrrsqspmqolnnorqlloqvsrqswnZˆÒîâããââæãæìéàâìëìêêëåÛÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€4\hdc_afh_S\w„€€|}…‹‰~wz‚‡‚~€„‚žËÞÕöÆÇ”afy|‚€ƒ|}}y{u…„xi[]ceddfz˜—€su‡›’wwxnouronruwvuuuuuwz€„†‚}€†Ž‰‰Ž‘‘””Ž“‘Œ“’Ž’Ž‰Š‘‹ŠŽœ—‡vq‰•u^`_XXZWZ^bddefhhdb_^grkb]^gvxocdfhiqwyruvwwvtqlnqrpmpuuqs{{xvw{ztsvxvvxyyxxwustj[Xhy{vstwxvz|yxvstxzwruvsrtuuxutsx|wvzg]ZYO?757=AIMJEBFB?XhTAFHINPQURWUQRUW\\Zdntxts™ÊË¿¹¹»À¼¼¼¾Ä½½Ö‚fgSQw™¬°“l}µ¯¢µ]dmidbehfefeabefedecabghjiebdgihgeddeehigb^_elideŠ¤ŠjbhZ^“³ŠLRŒ«¢€r\]oumehga`|•‘‚wgfvqkom_`e[PTVVUWWVVVUUVYZZW[ad`\\_YVXVUSE8EPTUVQIINPORVRMPNQX`hryzy|vvvtypqsqz}rhhc\[pƒzZQp€qbfg^]bZS_iiknpj^[bhihhifccghhhhghggkbZp©±§¤²¸®«®´«©°·±«®´²­­µ´ª©´¹±©±¼±¦¬»¹¯¯¿Â²¥¯Ã·¦¯Á½¨«ÂĬ¬À¦k`liijggecedfceidXTRUZejfeiipl]kˆ€dirlnmmoromopmmstsqrqprurrqswn[ƒÒðååãáææâäêèâãëëìëëìãÖ΀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€5[f``\_dbWO_{‚‰†z{„‹xtuz†„ƒ†|šËßÒÄ¿ÍÆ”hp}~†ƒ~z~‚zv~’ž©¥—‚kZ\]dffxŠŠŽƒnq’ª–oqwonuutrrvvrqtvtyrt…{z|}„Œ‰‹’‹Šˆ‰‘˜˜””‘Ž‘“”•‘‹‰†ˆŽŽ’Ž“™ˆ~“§‰``ga]UV[^`adhhfikib_]blob^`bo{tjedfjpustuvtttsrsrrsttuuvqrwzywrvwvuxwsqzz{yxvtsxp`Xev{wuuxxwz|xvyzvtwxvvwurssuzyvsuvsv€„dPPPIA;>;12BIIJCCDEDMWM@CDFJMPWZ\\[[XY_^alihrsl™Êʾ¹¹º¿½½¾ÁĽ¿ØÁ‚fhTQv˜¬°“k|´® ´^emgbabfgfie``fiihhebbghihc`addgheceghbdfdaafkidgˆš~caeYc˜®JZ—­¢‹veOUntjafd^c„—tcfvmksqcdh^SRSVWUVXXXZ[^^^^\_dfa[Z\\W[[ZVHCC@AEFKTZZYZ_]ZZZ\numghpšÉÊÁ¾¾»¼½¿Á¿¾¹¼ÐÀfiUQv—£­•nz®¨›­Š\dkeaa`figea_bcfgdb`bgjiihebbdicbfd^`hjigdcdgkfal†ƒlee^^u£¢nOv¦£ˆd[KLirh^dcf{•šŒ€k]nxgflgZ`dUJWbcdgfaabefd^\]Z\`dc_^_\W[ZWWK<>OVSUSLIOLNQTTROMOZabmzzyz~‚€xuxxyvuxz~ƒtga_\n…[Rqp_ccb]`ZS\fkonkd^agiijjihijigggghhiib[Xp„’¬² §³±©«±ºµ¬¯·±¨®º´¬¬¶¹­«¶·³¬²¼µ©ª¹¹¯ªµ¹°ª¸¾¯§µ¿·¥°ÃÁ«°Å¨i`lihjfgeefefcdhbVRRT[fkhgjhnj\lŠ|cjplrqoqsqnoqpnqmmnopqnsqqqsxp]‚È̶Ñéèâçâãçéæèíëìììíéâ߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€:clfmpjacjfgwƒ†ƒy~Žƒwoottw~~€‹„…¡Ç×ÒÈÁ¶ÂÛðèÁš‰‚‚~zwz”·¼¨˜•{kgejrpjxŠŒ“‘¨¬Žƒ†umprtvtwvqpturqttty€‚„‹’“Ž‰ˆŒ‘š”“˜š—–•’–—‘Ž‘’ŒŒŠ…ƒŠŽŒ‰ŠŽ‹Žš‚˜¡›žlajl`[[][Y_ijfgmljife^Ziqp_[_bluqebhjimrttuxxwvwurqrrprvrsutruxvxwwxwst{wsuzysu|wtdV`v~yutx{wuxz{yyyuqsyuwvvywuvzwvrpyzlOV\UE??=A<416=>=ECFA@CB@EC?@CDISW]\Z]_^_\^nkZdss˜ÇÈ¿¾¾¹¹¿ÃÆÂÀ½ÁÒ¿giVRv—¥®”juª¨Ÿ«Š]fnheedgdcec`bdikgc__chgffebbchgfffeeejhda`chkc_o‡~igebcz§¤sV~™¡¤‰a[MKgrh^eem†–›Ži^w~zoqpb`cZR_jkd^_ccbcb^Z[_]^aeea^_]Y]YV[R@@LRSUOHIMMRSMOSRNLYfcfptzvyysuzzts{{z|j`_]oƒy[Rqrcgh_X]ZT]iqnome]^dfjkjiiie_fgghhiiii[Tp„¨·¥¨¶·¬¥¨µµ«­¶¯¥«¸¸¬ª¶·©©º¹«¤¶Á°¤±¾¹ª§¸¾²§»À¬Ÿ¯Á¼©²Åì¯Ä¦g`lihjggedeccbelgROOT\hokmmilh]o~ekojonknollpnlpnpooqqqsusrqswn[}ÊÒ»ÔìèßìâßçëèçëçêëìíèáÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@ivtyytoszj_r€‚‚u}’”ƒywrls~|wy|}ƒ¯ÎÑϼ¹Øëìéس”ƒ}}ytŠ§­¶´›Œ‘~a_mllnƒŠ}‰™·¯|x…qklprurrrrqonnqsoos|ƒ†‡‰‹ŒŽ—š™–”–˜•‘Œ“—˜—“‘“‹‡„Œ‹‹††‹ˆŒ“„Š£¦¢ž`hljd\X]Z[^ejebgknke_\^dmm_[_bnvrffgfghrttussvxussttsqqrusqoptxzuuwyxvuvwwwwwxxxzveV_v}wwvxzzwwx{|wv{zuwyvtwyxwxyttwsuymYUWVTMAA=>;548>BA>BDBCEBC??CC@DMVUVZaebZX\_VRkss™ÁÈ»¹ºººÁÅÁÀº¿Ö½fkUMs˜¤¯•js¨§ž©Œ_dkgdb_befedddbfgeb``cegcaeebeihhgdacfhie`_agnb_pƒ{gadlv ¤kV|œ£ €eXLKasg]_h‚’’˜zlqvushca]\^^XYcfc`^_feeb][\[[`dff_[]]^\YVYUB=HPPTRHIKHNSOLQVSKR_ehotvzƒztqquwvttx}~od]Yo…yZRrp`ef_^_YS_ljkpodZZcljiikkhgikihfffhii[Vs…Œ§¶¡¤»Â«¤²¸µ§¦¯­¥«¶»¯ª´º²­²·¬¦³¼¬£°¼¹«ª¾Â±§·¿³¥²Àµ£«ÀÆ­¯Ä¥l_jfefdfdbhhgdfh^PPQRZinggnllh_o‰}bktmpqpmoonpsropnqpjkrrrotqqxm^ƒÂÎÄØèèçáàäëëççëíìêìíæßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cp}u{{st{j^o~}}€~ˆˆ}zzols{wtw{yxy–¾Ò̸ÊçìçìÞ»¦€xtz–­«­µ¢ˆzhZ_oron~qƒ—…«`krpikmpsqptutpnnnmnot~‰ŒŽ’““’Œ’š›™–˜œ™Ž•šš—’““’‹‡ˆŒ‹Š‹ŠŠŒŠ‰Ž“Œ–¥£¥–l]kogb`\Z\Y^cbegbjmkiheabord]^^iurhfefkmtyrptrpswrqrwvsruuttuuvwxzxwwvutuuxywvwvstviX\q{xxvuwxwxy{zutxyvw|ywvwwxyxrtwps|q[PTXWVNG==<86:>?CB?BGVVUUZ_XM^h[]dlnrÄÊ¿À½¸·½À¾Áø»ÓÁ~ciXRt•¢­”ir§¥œ§‰\djea`dghhda__defgfa_bkjdab_]bliffecdfmkd_^_bggdv‰uTRhzy† z€Ÿ¦mXNVhvokq{‰ˆ~~vjdeech`]_]^aaYYab]]]a]^ab][ZXZ^acd_\^^\Z[YZTA;GQSSMFLJKPSQPRTSLQ_ehntz{{zywuupsvvuvz~|sh]Wn…{\Tsp_cd`]^YT^kkgfki[Yenlifffehkjigfffghi^Zu„‰¥¶¥¥³¶££´·¬©±º´¬±»´¯²½»«¦±¾´«²¼±¤ª»»®«¼¿°¦´½²¢«»¹°¬¼½£§Á£i_jfegdfdafeecgkbSPSWZbiilkhni[mŽ}bkumpqppqpmmppntppronoprotqqxm^‹ÐàÓÞçåäââåëëççêíìêìíçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bs~pt~tsyi\n€|€Š†}‚{y{xonw{|}z†³ÔÍÂÚòíäïâ¿°‡ur†«º«¥«˜t^WUV_ie_jgl”Ÿvz£kuyoiloswvuwxtoostrsux~ˆ‘’Ž•™™—•œœœ›Ÿš””˜˜–•““—“””Ž……‰Œ‹‰‡‰ŒŠ‰‘Ž©§›}[_lpgda][\\\^cfdaeijklhbalrf\][bpric_cjlqorutsuupostppstrttvwwwvuvuvy{xutxzxsruursxn\[p}{wtstvuvvtwyxvuvxvxxwwxyyxtstos{s_PW]Y\WND?>:58=9:?>?CA=@AAAA@@BELOSUSRW^ik_a`bhnžÈ˼¿¼¸¼¾ÆþÁ½ÂÔÂdjYRu–¡«“ir¥£›¨‡\fmd_`fhihd`^]edcee`^ahihhga^cihijjfdciidbccbdigwcFTtŠz‹ª™‚––•‘rii{…ˆ~trz{gd_\^_]]_d]]_^^_^WV_a]\[^\\`a^\[X__^]]YX[\]\[USTI9GSRTRHGNPOMPRTVSLQ^egmtux|}}ytqwvvuvwxxzym\Vm„}[Ssp_dea\]ZU]ilkkngYZgniijllihhiihfffggk`\v„Š¥µ¢¦¸º¨¨µ´§¨²¹³ª­²³ªª·¹­¬º¿°¦²Áµ¨¯½¼­§µ·ª¤¶¾³¥¯»´§¬¼¾¦­Å£f`kgegdfecfdcbekdUNQY\`gknjfmiYm‘~bltmoqomopnnopnspnpspoqrotpqxm^Œ×îÞáâÞßäãçêëççéíìêëíçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ar|nr}~vpte\rˆ‡zv†‘‰‰xurj`gw€{zx{Ÿ»¸ÆáðíçîáÀ«ŸŽysŽ·½£‘ŠsYR_`S[c]e{sk‰„Zq¿Ä‘€‚plprtwusssssvxxuwyz}‚Š’Ž•™™–‘šŸœœ  œš›™™•”—˜—˜—•’Œ„„ˆŠ‰ˆŠŒŠŠŠŠŽ¡¯¥ƒ^]cjmlh`[^^\Y^hfab`gkljfbcgog^aaervmb\afjnsssrqsvvqstsrrqqqqqrrsstyvuwyxvuwxxvuutrvyo\[p~|utsuwxwuzwwxwzzytxzwuvvuyyqpsuvsbW^_YYVRPDA?43:<>A@?BBACCC@<;?CCAMPMPY^___ab]a\d˜È̹º»»Á¾ÈÅÁÃÀÄÕ¿€gmVOt™¢«“ku¦£ªˆ]jpe`cbeggecaaeffhgb`cegfec`ahffffc`aecgheddiplSh‡jHb’’z‰¬˜w‰¦§˜†xuoix‰‰~li|jd__a`\]cd^^b`__]YV[]\\[]`^__[[\[Z]^`a[VW]\ZXRTUI;GRRSSJGNQNNSTRTRMP]dfksxz{{|{xtwtqsx{ywz~q[Wo„}WPp€qagia[[ZU\hllqpf^]chhhiiihgfhhggffffn`Ys†¨²¡¦·¸¤¤²·°ª®·²«¬°º«¨¶¹«¨´¿¯£±¿³¦­¾º¬­¼»¬¨¶À´£®½´£«½Á«¯Ç¤g`kgfgegeegeebcgaUKLW_dikjkglg\n~blulopolnonmmmllsqklstprotqqxm^‹ØðáããßáååçëêççéììêëíçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dq}ssspkrse^s‡ƒwx{•´»ª˜Œ‚~umt…Ž‡„…‡š¢§ÍçéëéæÝŪ£Œ€•¹·—}r`RVebM^gcq…sdss^ŒÙБzmlruwyvtqpruxvutxwz~ƒˆ–‘“”“”—ŸŸ¡Ÿ›œ¡™™˜˜œš•”œš—‡ƒ‡Š‰ŠŒ‹‹Œ‹‹—²¯fTaekmljb]_`Y[cghf_^flmlgcdjrl^[Z]jzqb^cfjpsqtwuqqsprsrrqqpttsstvxyvtux{yvtxvvxwuuvxwm[Xl{{vuuvz|{yvsstuvwvvyzvstvwxxqptuusd^^\[XRTXJGG;05=C@AA?BFEAB@;;?A?AEL[rwhZcd^\^_Ve•ÈÏ»¼¾¼½¹½ÀÇʺºÑ¾glVNt™¥¬•ox¨¥Ÿ«ˆ]ipe`c`cffeccccffdb_`cghgc`_ciihgfcadhiiecghhjO7`uUq–z‡¤“x‹¤—’†xukdu‰Œ‚f_{…sb_\[YX[``[]bb``^ZUZ]^_\Z`]]\ZZ\[`a_^^ZX\W[[XSTUFŒËÝåêçåäääåäåääããääåæææææææææææææææææææååååååååäããáàßÞÞßÞÝÜÛÚÙÙàÞÚ×ÔÓÓÔËÐÑÌÆÄÁ¾¯§šŽ…~xupprtuvvvvtzˆŽŒŽ“š›ž œ˜—šž£¥¤¢¢¡Ÿ››š–”—˜•–š“‰‰ŽŽŠŠ‡ŒŠŠ‘¥» jVY`]_eimprof]]_\]hpmida^agllienri\W_hpul`_ackpstuurrvsssssstvtrruvwxwwsqruxywtuuuuuutuz}q[Yl}{vuvtsyyyywuy{wvxwtuyzwuxrlmqv|q^]bYV[ZTV[YSVRBEKNLMRPGEHIKKFFN[_ZUWZ^fc]OO€±¬•«Ãž¿¿ÁÁÀ¾½ÀÇÁ¾Ò¹y`nVIr”ž¨šo© ž¨^ckgc``gifefdbbdfeca``mjdig\^cjijhfjdT;41781++ &^‘•t`~¡œŽ‹Š‹—œ¤¬†cmrirxZ {X_a\`[\pve\`a]`a_XTUWWY[\Z][YZZWUTX]_[VTUUTSWWTN?6@SWQMHGJPOLNQQRSLKWcbcnqqtvwzzssqrqpuywy|zhqƒ{[Ss‚rbik\]bZRYckmkkf\Y`fhghkjgfgbehhfddeg^Xpƒ©²ª§º¸§ž¯¾®¤¬¸±¨­¶´­°ºµ¨©¸²¬¨²½µ¬²º»¯«¸¹«¥ºÂµ¦³Ãº¨¬À½¦²Æžh`lhgheecgfdgece`WONU\diikdbniZn‘cktknnlmoqollmomlkossqqrqsmpwka˜âðáÞåäìåãåéêëêìéêêìêäÝÜ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>ŠÕîëçêïçççæçæççæææçççèèééééééééééééééééééééééééèèçæååääãââààÞÞÝÝÞßßÞÛØÖÐÒÑÊÆÈÊʼ»¸³«…|xssvxxvzy{€…‡“•–™™–‘‘”šœœ˜™œš•”–”‘•™—’”””‘ŒŒˆ†ˆŒ‹Ž’§½•bZ_`[[dhmprqjb\^ZYdnledeb_cjmlemsm`X]fovpb]\bnnqsuvrqutuvtrqqpsqrrruwuvtwwstwurvxvvxvrttxrb\l~xwxzztrvzxyxvxzxzxvvwxwvvxtlilt|w`[c]UZ^WR]]PRWJFINLKSTGEFHKIBERZ^\UX\^_`_KL‹¹©”³Éø¼¼ºººÁÇŵ¸Ó½sZmR>j“Ÿi©›”¢Œ\_kcVRYdc`db^aacdca^^_dgchfWW^daflgWC352495)##&5p˜”t_q Ž‡‘”——¦¨Ybigt‚’sV yU^c_^Y]ptaZ^]Y^^ZVXWWYWV[][XZ][XXWZ`d`UONUTRVVTO@7@TXPKGHIOONOOPSOIHS`acmpquxy}~wsqokjqwvvv~~op~x\Vv‚o]dh\Z^XU^flllnh\V\bifgjjeegdfhhfeeff]Xo‚Ž¨±©£¶¸¬£­µ®¥®º³¨­¶¸§§¸¹©¨¶¶±¬²º°ª²¹¸­­½»¬¦·Á³¢¯Ã»¨¬Ä¤¯Å j`lhgheechfdgebd_VNNU\chhigfmfZo€bktostpjmonoppoonponnrurqsmqwk`–Þîåãçãìæãäèëéêìèêìììæáက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>uºäìçæêééééééééèèèéééééêêêêêêêêéêéêéêéêççççççççêêééèçççææååäãããßáãäãáÝÛÝÝÙÕÓÓÎÇÇž¹±¨¢—Žywxyy~„…„ˆŽ“’•–—–’’——˜–“•›™“š£¡—“’’•””ššŒŽŒˆ‹‘ŒŒ‘¦ºacc^Y[dimoqqkd__\[dppigea^`fkmflspcX[emwse[[blnssqrttuttpmmrtstttsrvyvuttvvxxtsvwvvxwuzuvueZe{zywuuwy{yxx{}vsxzxwyzwuuxzulfiqxxe^c_ZZ\YX\\TSTRIHMNJRUJBCINJBGUX][VX__[_cNS•¼¥—ªÈÈÀÅÁº¼¿ÃÄÄúºÔ»|_cNS…œ°§w…¯ž«^drdIB]igdkgahghjihghibnknfFFfrsmZA2*&5<=5(&.7/9l’•€df”œ‹Š˜”—¥¤xR\jjq†•qV„¡|Y^b_^X]mrd]`_\_^]\ZRLIGHOXWUWZYWXXY_fcYRTUTQUVTO@7?RXOIFIINOOPNOTNIGQ]acmqrwzz~zwurmkrywrry}qp{vXQqm\cfa]^XT^cghijg][bidcehihhifggggffgg^Xp‚©±£¦¼¹©£°¶®§°½³©­¶¸¥¢¶»®ªµ¿³«µº«¤²»µ¦«ÀÁ¯¨¸Á³¡­¾µ¡¥ÅǪ²ÈŸe`lhgheecdhfdbeg]ROOQU_higihldZp|`hslpqnonmmoqolpnprnorpqqsnqxj_ŽÛïèåèáæçæâæêêêêçëíîìæßÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bb˜ÏíëäçêêêêêêêêêêêêêêééèèèèèèèèèèèèèèèèææææææææééèèèçççèèèççæææääåååãâáßßÜØ××ÓÌÐËÆÁ¾º·´®¥—‰zxxw~„ƒ‚…Œ‘‘”–—™–—ž™œœ—–™›˜’œœ”‘’’•Ž…‰‡Œ‹‡‹”¬¼‹aff]Z_eimnooke__]\cnqlle^]_bgkkmpnbVZghuwi_^adpsroqtuvqqqpswvrtturruyvtvutxyvtxuuvwvxzxvzxfTa~|zzz{zxuxwx|~wswwvw{zvvyyxtkehqvyh`cd]YYY[[\]WQPMFKOKOSMEELRLFO^_`[SS[_[`cOU•¶ —¨ÅĹ¼¼¼ÄÁ¼¸»ÅÁÀÔ½z\`KW’¯ ª¢z‰¨™•¢Š`cphK?`khfmgajijjifefhfgcoiEEhtcK5(#*4;70,/488 +b‹“…je‹›‹˜“‘œ§£wScvsp—q[†ž‚e_^^^[]inf]_`_^\_bZQICCINUWVUWVVW_\]`_WVYTSPTUTOA7=PVOHFJIMOOQONSSNKQ\_aiprwyx{}xusrnlpursu{|tv€xZQn}n^ccZ[`YS[fnjhhc\Y`eehjihgd`ggffggggi_Zq„«³¤§¾»¬¦²¸®§±¼³¨®¸´ª¬¹·©ª¸¿¯¦±»¯§³Â¹©ª¾¾®§»Âµ§³¿´¢ªÇÆ¥®Å¡i`lhgheecbedccfi_RQPMQ`jijeeogWm“fovklmlnmmmlklmnnonnopppptosxj^Þñß×ÚÔÖáçåçêéëééììêêçã €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€F_®ÞëæïêêêêêêêêëëëêêéééççççççççççççççççèèèèèèèèççççççççèèèèèèèèèçææååääåèåÞÙÚÛÛÔÐÌÉÆÄÀ½·²©ž’†}xx}‚…‡‹”“—–•–’˜  ž›š›š˜•˜˜—˜–’•”’ˆ‰‡‰‡•²¾bikc[^eimmnnlh_]\]_gnmnf_]^^cilkpqdUXdjtvl`^`brqprtsrvwuqopssrrrssqsvutzxuvvtuyutwwvx}vtuylZa{xvzyvutvvyzxyzwyxxywuw{vvsldhqw{k_dh_WX]\YZ\YSQPIJOLMPOJHLNHGUc[[ZVSZ`]_aV_–¶£”«ÈËÃþ¹¹¼º·¹¾º¼Õ¿nSfJG‹½À¾¨{¸±³¼¬‘’›¤–•›šš–‘™¦¥¢œ–‘’–œ¢’xtwJ5&-513AF6,3:6*"+i“‰od~š–™™˜œ¥tWj~wq’m\|Ži`]^`^agid[\^^[X]^WVUPQVWSWWTVYYY[YZ^]ZXZTRPSTSOB69KTNIFJINNNRROPTPKQ[`cjru{|z}€|ronnklnmrvz{uz‚y^Tp~o^ba_^`YS[cijgfd\\bgcghffjhdhfddfggfi`Zr„‘«´¥ µ¹­¤­´®¦°»±¨°»¶¯²»µ¨©¶º¯¤­ºµ«¯Á¾®¬º»­©¹¿´©µÁµ¥®Æ¤­ÄŸi`lhgheeccbafedgbWRONUdmiheemgZp’}cmthijjnmmnlkmpnsojlmntpptpsxj^–åïÑ¿ÂÀÇÚèèêëéëêëíëêêéãက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dgz›ØòêíêêêêêêêêëëêêééèèèèèèèèèèççèçèçççééééééééççççççççççççèçèèéèèçæäãããèêåàÞÜÙáÜÔÎÊÇļ¸²­¦œ…}|…‘‘˜š—˜’˜§¢Ÿ ¢ šš™š™”’•˜—’Ž’‹‰†…‰ŠŽ’´À’eioh^_dimnopolfabc`dmqnje_\\bgjiosgUUamruobY]dqqprtrpsqpqrrppptsuvttvwvwuswzytwvwxyyz{zuuzt`\l|uvywuutwxywvz|x|zyxwvvxvwwodepu{pa^ebYU]]XVZZWUQMKLMMOONKMMFHVaWW[ZVY_^]ddi’¸¯›«ÄÈÀ¾¼¼»Â¿¼¼Â¼¼Ó·nXgLR˜ÂÀÞ͉›æðçÉ«“—š¦¥§žž ¢ ™—š¢ –‹ŠŠ†„Œ‹‚lG,13499;B;645/#"4mŒ”•w[x’””œ™š¤–p]p}yx–m`q|zl`^aabhhdd^^]^]Y]ZUVWUUXVRVUSVZZY]]`a`ZTQTRORTSPB56FPOJFIJNMLRUQMQNJNZ`dkrv~€~‚…‚yrqtpmoqpswzwz€wZRqo_df^Z\WV_finlmi`\bgfhgdehihhfccegfeh_Yq„ª²¢ ¶¶¥œ«¹­¥®¹¯§±¿¸­­·¸¬«´º®¤­º´©«¼½±­»¼°ª»Âµ¥±¾³¡ªÀÁ«·Æ™``lhgheeccbaedcfaWPOT[djiffdjf_s~cltlnpoqonnonnmopmkprpooptptxj]œçîʲ°´ÃÝêèêíèêééìíììæÚÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@ks…ËòçäééééééééëëêééèççééééééééééééééééèèèèèèèèèèèèèèééæææçççççèèéèçäâàååâßàäãÞÜÜÛÚÖÏÆÀ»´³´®¡–‘†~‚”–•”š˜—š–•Ÿ¤¡¢¤£Ÿ ›–—™““””—Ž†‹Œ‹Š‡Š‰‹‡¸Å™gekgagdimnprrpgabc]^hplnkaZ[bfmjmpdSTcknvvfWYdorqoqrqpnoqsqoqusqtwtrtvwwxuswytswyyy|{xpsywa[l{y{{wwxuyzxwxxwyxxxyzzxvwz|rbblrywdW`f]RU]YW^]UVPQMJLNNNQORQKMX__[\ZQR[^_daUp¥¶©©ÁÇ¿º¼Ãļ¼»½Á»»Ò»lUhOR’¹´Ë¾‡›ØÔÇ·_icddonknrledeaba`__bec`agX>2(72-3>;5971(  "7q†ˆ’|a~‰‰—’˜¥©•sgw~}…¡–tiqw|s``cbdmja^\[XYZVW[WX[[\\[YZWUY[ZXZ\_`a_[XTRORSSPB54COOKGIJOMKRWRKTPKNW]`fns{~}†„|squqmotprw}{|€xZSslZ`d]]`YS[dkdfjg]Y^eghhggggfhebbdffef]Xo‚Ž©±Ÿ¢ºº­§¯²­¥­·­¦²Áµ¨¨¶¹¯­·ºª¡°½±¦®»½±®½À°¦¹Â´¢®Á¸¥³Â»£°Ã›f`lhgheecbfdcaeg]SLOZ]_ejhb`lj^r“dktmpokkmnnnoonmknpnsvroptqtyi]›åíβ¬°ÆçîåçìçéçèëêêëçÜÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=`s„ÁîéêéëçìèÝâãâåáÜßáÚÓÒÖÛÙÖ××ÔØÙÓÓÛÚØßâãáàåèæäåæíìäèëãééäæîéçñçéêêèçèêêäãååàÞáåàÞàÜÓÌÊÁ½·±¬©¨¨¡“ˆˆŽ‘”™™œŸœ›”–Ÿ¤¤¤¥¥£›•—™˜›š”˜™“’ˆ‰“Ž‰‹ˆˆ„ŠŠ’¶Ã–hgmbadgdinnqtphfb]]agljomd`^]_ikptiVTblnsreVWbloppstqoqrrrqrsurvtrtustvsvyvtvuvwz|socD:Nr|xhVj{~{vxxuyyxwuv{{u{wttxzzyyuun`bqxuwiZ`h`TU\_\[\[ZVPJIJMOPROONGRdbXV^[STXaaYa^Y©¤ªÅÊÁ½»¾¿»¼¼½¿¹½Ø½kUcST›Ä·Î¸†œÌŹ°„lsrhktuvz|vmmsoooooooorkuuT4.04/'4B<53*("""5n|Š™xfx‡€ƒœ™‹˜¦œ~mw}‚” •rvuja__^`v~h_`]\[Z^^WY\XTX[YW[YYZZXWY\^^]]^[WRTTSPRUJ:4CTOEGJIHOTPNOMLOIKZ]X[owx€€{„†{strsrloqqqvy|}s\Vo}j\_f][^YU]cfefjdXYceejkeeigafffeedddf_Zr‡’«´Ÿ©¼¸ª¥¶¾«¥®¸µ­®¾²¦­¶´­®¹¿«£µ¿­£°¾»®¯¿¾®§·½¯¡²Å½«®¿º£±Ä›e_jfdebcbbcbdcdg`TMLS\fjfgfgjgZs“z`lrommkjorpoppomlorpopooopmuwhcžëñˬ©¯ÂæêæçìëêêèëëêëèáÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>gty·íèâÜÙÍÊÁ¶´¯²®©¨ªª¨¨¤¡¡¤¥¦©ªª®¬ª¨£ª¾ÊÀµ·¿À¿ÆÂÉ×ÝØÛâàåéåäçâàèåææåäåçêçåæêéäàáâäãÞÜÛÕÌÇýµ®ª§¦®¥ •‡‰“”˜š›—™œ••¡£¢¥§¤ —•”—˜˜š™š˜”“Œ††Œ‡‰ŠŠŠ”®µŠfhngcdghikoqpojc__^\bkmolgb\Y]fhosiWUchlqocXZbnttooqrrquupnqsssussutrttqrvvwwuvvbI60+.>f{}mXdx|wtwwwywtv{yvvxzywwwxzzwwyrccmpxzl[_hcXV^`\[]^]YQJKORTUTPJKN[g`SS^^UTV^a]^`Z_y–³ÅÉü¹¼¼½¹ºÀ¶¸Ù¸jVfUS”º·É¹Žœ½·º©yei_^ifgjmlcYUWVVUUTTSSX]b\G6,'.-&090(# 6q{‚š…p{…}…¢Ÿž¦˜uepvzŠ–“mfc]Z`g`_}„g`[\__[\\WZ^[VWZZ[YSSYZVX^[]]\]^[WQRRURQRJ;3@TQHHJLKMNKOSQIMIKWYV[qxux|y}‡…~{xuplprttwwy~wYTm|i\^dYW[WV`hmkgki]Zcjkiijjigfffeeeeddf^Yq„¨°¥¤³·¯¤®´®§²»²¦§³¹¦©·¹±®·¸±¥¬»¯£°Âºªªº¸¬¬¹½®¢´Ç¾ª°Â¾¥²Äžj`kfeecdbcdcdcdf_SMMS[eifgfhki]w–~clqnmppnlmppmkmqrqqqoorqqqntvf`êïÇ«­·ÌæêæèìêéëíìëíìåÜÚ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Erxo«áÒ¾³°¡œ™•˜‘Ž‰‹‘”‘‘”Ž‰‡Š‘˜š˜•’‹‚©·¨’Š‘‘” š§­«¬³´¾ÇËÍÔÛàæâåéêèæåäêçææåââåãæäàßßÚÓÐÌÄ»³«¦£¯««¥˜—™”˜›  ¢”•©§¢£¤¢¤¢™žžšœš—šš˜‘‘‰xs…‹Œ‹‰Š˜¥ yehljfefjhipoloohddb^ckqqolh^Z^gkpriVR^hmqmbY[blpojmrsqmrtrqsspssrstrqtqprstvwtuJ,)#'456ZwzlY]t|yy}zzxvuwxvtwxzzyxwxyzuw|tfdlov{qbbjfZSZ^ZW[^\^ULJNPRRVSIIUag_MO^aYTT[]d`\`[]m©Æɾ»º½¾¾½¼¼Ã¾¼Ï¹iTaPM‘·¯¼¥y¹¸ºªyktjhoijnnifgkmiihhggggckl`K4*-.2-..$ !7wzwš—}‡Ž…£–‡š¨”n]jnr„”•„j^\ZZ]l`bŠŠd\^]^\Y[]YW\\YYZYXZZYWXY[[Z\]\]^\XQPPTSPQJ<117MTOJJKIHIKNOOSOHL[a][``_WXWBozff\tÉì²sdfer|„Š‹£ÕÞ¶ÈæìÚɱ£ª›ªÍéíììææçïÂpazty“•„„ƒ‚Œ¨µ¤’€€€~}‚†‚‹’—¦ÀÚééãáãäáàâÙÚÚ×ÑÈ¿¹®¢——¡£¥¥œœ¡ •ž¡¡¦©§¦¢˜™ž›™žœ–—˜ƒv}ˆwhpo{—¨—s_e_bghkfefccikimqqojfcbbcgjopg]\[imop`T\`]`c]UXckpqoonlltqqtsopusoqsqqrqrttsqmnv}f07bzxm_]p}|zytuxrrwxwvuwxyzzzzz|wuxtjfmsu{wg_ekjUR\]\_^\^``][[][TS`aX[`]OT__XOP_d_Zeup^|ºÎ»µµ·»½ÀÂÁ¿¶¼Ú·gRaNK³©³ }–¼·¹¨i]xlWaqspqvwqnpmmmnnoookwsZA5346&!7r|b~ª«˜zˆ®¦‹¨Œh_eZ`‚¥Šj]aa`e^\]‡ŸrS^a][ZZ^^XVWYURUYUZ\\[[]][]^^[[[WRPSGBJPQMA;35CONHGKKJIEITPLIHGINOORKNORciQ=EV_ihftrotx~‚zi^p|k_aeYW[WT]cghjhbZUYcfijgefijfffeedddgYYt€®¯›£¹»­ ¬µ®§°¹´ª«¹±£¬¼¸«ª¹»´®·¾µ®´¿¹¬¯¼¶ª­¾Å¸©¶Å¹¥´Ä¾¦³Ä›e_jfdebcbbcbdcdg`TMLRZcfbfdfheXq‘z_inljllpjglppnmomopnoqrrrrntue_|²º¸¸·¸Íäèãåêèççëëêëìçá߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Eiyad‹´Øåºzbku€ƒ‚Š‰„°âÕºÄÛíݼ­®­  ÉêìçæìçèíÅ{cvz€˜’„…„‚‚’°·¢š–Šƒ‡†}||~~…„…“§ºËÞàÝßåçÝÞÞÙÔÔÑÊűŸ‡€•¢š›¦¨—œ•Ž™¡¢££¢¡ ¡––—˜—˜£œ—”‹‚……zgooz˜¡„dcfe`afihheccehlqqqomkhfffglrqng_\bkqq`R\bY]d\W\amopqpoqurutqorrpvspnopqrnstrqssp~k;/Wx~rf_t~{}zuvuutuvyzvtvyxwwxzywxynip{xzzna`ee_QZd\YY[X`f[W^d\SQYa`]][WX`]XWQ_aXYhurax³ÒÁ¼Â»¼Á¼µ¼Ä¹»×­hOaKK‰®§²žy¶³·¦iWljakturv|yldegdcfhcafefgVB6.2<)!7msb{ ­‰o„°§ª‘n^f]]ƒ£Šd^gb][`Vc”œmYbb_ZWX\`b[ZWTUVUTYY\][Y\a_]\\[[YSUSD@JRSOD;58>HLIJHGHKMMLPNMMICADF=AAADOiT2/<;IVTNS[\`mwk^r‚k\b`[[]UR^ehihgbZZ_bhhjhdefcbdffecdek^[p|Ž­­Ÿ¡·º«ž¬³ª¦­¹µ¨©³±«±À½§¨¿·ªª»Â²©±¼½­©¼»«©½À®£·Ã¶©°¾¾©±Ãœ`ahcehcddfdbcfea_PMMQXbgcbdfjfZw{akplhklkkklllmonmmppoopnrppotb`‰»¸·»¹¸ÅÞââêðèçëììêìîéä倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dmq[}´ÇÓç¸wduˆ†}‡‰»ÞÉ´»ÓãѲ¨¬«Ÿ¡ÊëìçæëåæêÀtZkoy—”………}„˜³µ¡—™–‰˜Œ}xxz|€„‡Ÿ·ÑàáÞàåãÞÙÖÕÕÐɧ’‚„–£ž™ž¬£––š››š›œœšš’•——••––•”…ˆ‡wqqn€ —q\igffebcfjeaacflrqonnlhgjfgkmllh`ZajooaS[\V\cYT]emprqonpqommoqrststqmnstsrvvssvsmwmA)Qt}pcV\agt|wmwvuuuvwyxutvwxyz{|zzxojqvuwyreaggXQ]aYZ_ZV[b_\`c^TPXab^\`\[a_YXQYb^[hxu`t°ÐÀº¿¹»Á¾·½Ä··ÑµmRbLMŠ±©²¡€”²­´¢dQgcW_ipllpmd_a_dbadb_dihhR;4.69' 3gq`v˜¨Ÿw‡¬¤‘¡«‘n`f]]…£Šf`gb][\Ym™•iZb^][Z[\]^YXXXUTUUXZ\]\ZZ\a^\ZXZYSOMA@JQQKE=649FOLNJFEGKNOQRROJFGJI?;:<;8DN3!*'.48349;EXda^r|g]c_^]^UR\ceijjdYV]bbdhhdeebbdffdcdef[Zs­­¡ ³·©Ÿ°»«ž«¹®§±·¸°±¼·¤¤¹À±¤³Ä¶¥­¾·­²À»¬«½½­©¼Â³¨°¿¾©±Ã›`ahcehcddcdbadge`QNNRYchdeccig\wŽ{alpljmmpmlmoppnmomjjnponrppotb`ŒÆÉÉÎÊÅÊÝßÞçëæèìëëêìîçàà€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Iifh§ÎÅÑë¸ue|‰Šz‡Š—ÈÞ°´ËßÔ¸©ªªž¢Ìììçæëæçê¾pTceu—•ƒƒ…‚{‚–¨©œ“‘’ˆ‚˜{vw|ƒˆ‡Šˆ…ˆ¢¼ÖäàÜåâà×ÐÖÒÀž‰†Œ•¢¦£›¡© ›š—–––˜˜˜–—š›˜˜˜—”•˜’†ŒŸŸ‰{rl†¡ˆc`fa`bb`elhdbbceinkoqoookedinnmnkb[bknodW\ZU[`WS]dinqonprqopollnppptsmnuxtsusoqvwr|rH3N_]UOSNMOVdqwxwvuuuvvxvuwzyxwsx{{zqknrtvzyiahl\TW[ZZa[Y\_^[^d_VQW`da]\YW]^ZYSUb_Xauxcr­Ñ¹½¹½À¾¹¿Æ¸·Ï³nWgRN‚¦¢·ª”·²²¨ws†pr{~|„‚zuvxtpsyxw{qccRA4)67%.`n_n¢¥˜‹©¢”¥¬nah[\‡£‹icga^\Y^}‹c[a_]ZXWY\_YUX[WTVVZ\]]\\[Y\Z\\\\ZSNTPLMORPB>935DONKIHHJLLLLPQKEDGJKEA=@@>GL7#'-+.20/233;ISSTm€o[]dZZ\UR^fhehkeXV_g`adcbfjhbdffeccddXYr€®¯£¤µ´§¡²¸§¡¬¸°¦¬¶·­«´³¥§ºÂ¯¤µÅ²£°Å´¦®¿¾±«ºÂ´¦µÁ·©°À¿©²Ã›aahcehcddced`bhe]ROOSZdieecchg\xŽzampmlookkllmnpqlmoqrpnnnrppotb`£ÞÝ×ÜàßãçããééäéééêêìíåÜÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Jgj„ÈÌ­Éíºwg|‡…z~ŒŠžÒÞ½­³ÏäÖº¯­¦¤ÐíëçæêééíÁrUcdw—”ƒ‚…„…•Ÿ Ÿ™’“‹‰™}xws…ƒˆˆ‰Ž‘–ªÍÛÜÜßâ×ÎÙÑ®‰ƒ‹’‘™¢©ªš§¯–š••––––˜—–’”””“”‘Ž‘“Š„™º¸†wuŒ’t^hggd`_bhmgdbccdgjnpolnqmgeinonole^cknoi]^_WY^VU\`hnqnmrtsmqsqkhhjpuupotvtrrqppsuuvzW$ %3:FLJDFMNKOPKPevxxwvuuuuxxvxzyvvv{}}{umjrvv|~n_djf\NW_UW^^\]^[]e]WUZbea\^\W[\YWPQ_^V[owfq¬ÓÆ»¾¼À¼½ºÂɼºÑ¯kWfRLv™Ÿ¶ªƒ•º¶¹§m]{€ohipnnoi_WUZPWaXMS`G-5AB4%:;&  ,\m`hƒªŸˆ§¤™¦¬ochZ[ˆ£Œmgg`_]Xcˆž€`\^^]ZWUW[^]UU[XUVV\__]\]]\[XWWWYXSQWSQOPSO?=;76@KNIIJKLKJINRQKFHJKJHDCEEGPF.$-.*-1.26536>CMZr}l[X\\[]UQ\cffjleXT]eegiifhifceffdccdhYWq~¯²›¥¸±¥©¹¶¬¦«³«£­¾¶­ª´¶­®¿¼«¨ºÂ²¨¯»·®°»º®«¸Å¸¦¯À¹«±Â¿©³Ä™aahbehdddbccabgf^RNORYdidcdejdYw‘x`lollongjlkjloplkmpqnlmnrppotb`¤ãâØÝæååãßàëéèïîéêéëìåÜÜ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dk£×ÂœÀë¼|j{„…~‰‹‰¬ÞÓ°©»Ùèϲ¯¯¢›¦ÓïëèæèçéíÃuWefx–•‡‡……††•››ž˜‘Š{…—ztq|€|‚„€ˆ’“”‹‹¨ÎáÕÔÚÛØÛÆ›xƒ“˜—–™¥¯¡ž¬­˜Œ”“˜›™——˜—‘’•˜˜“Ž‹‘„…§ÊĦŽ€ˆ’~b^gdhga^aefjfbaabfjllouumhhhgikklmj`biloj`_`XZ\UU^bkprlkorqqklplbepsuusqqrtrrsvtpqu{\)6CBIHIKKJKNNLQXTOYgxwxwvuutwxwuxxxzxyxwyxsnswwzn\[^caQQZRO_]Y\cb_c_ZX[bca_b`Y[^\ZTNZ^\]ksgo¨ÒǼ¾½Áº½ºÀÈ»¹Í²kU_MHo–™ “xŠ¡Ÿ±]AU^TPPQONNNKKMEF^b;%7J1";D4%7>' .[mbf}—« Š§¨Ÿ¥«‘qcgZ]‰£Œqkg`a^ZfŽšy_][Z[\[XWXZ_VVZYTVX[_b^\\^^`]\YXXWQMSROMNTQ@;::7;GOOLIFFHKNRSPKKLLJHDCIONNM<&'/**0..23115=EO\pwgXZa\[]TQ\cegijdXV]cefigeefccegfdbccjZXq~­±š¥¸±¥©¹·©ž¯¾¬¥µ½¶­«´·«ª¸»­¨µÀ·¬«¼»¯¯¿¹ª«º¿µ«¶¿¶§±ÄÀ¨µÄ˜bahcehcddgccdbcb[PMNQXcgcddeidYx‘v_kmjknlnonllnnllnnlmoolnrppotb`¤åäØÝçæåßÛßéèåëéëêééëåßà€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fp›ÃÚ±“Ãé½~l{†ŒŠ‘…‰Áçâ«ÍÛæÙ»©§¦š¨ÖðëèæçãåëÂtVcdu”—‹‡„††–›˜‘‹„u–’†|ppy~{€„‚‹’²ÉÕÌÒààЫ…z‰””™™•¡¤©¡ ®¨”•¡Ÿ›šš™•–˜›™“Ž’‡‘´Ì½¢‰‚p_ee`aa_\^chjfcbbadgmmprojjnjghkmool`^djmj`_[WZ[RTahjnoljmoongfjjdfnrtvuqnpstrrttrsv{lN;DRPHFFHLONKHOOQVUNSdvwwxwvutrwvuxyx{{yvvxwpkqvux{p]TUU`ZHKWY]]\^db_a`\Z_cc`_``WW]^\VSZ^^]itlm£Íƺ½¼¿¼¿»¿Ä¸µÈ´mXaQLl”¢‘t…›–¦˜dKXZQRWTTSTTTUVMRdX(*7%!6=3+44#!1[kbew‘¤œ‹Ž¥¬£¥©”tbe\_ˆ£uph_b_\iŽ”s_\[Z\][WVX[^YXZXST[X]aa][[\^]]\Z[WPLSSPJLTSD<9:68DNRNIDCFLQRQONOQNKJJNWWZ^U,")*&05../.-039BKSiwiZ^iYY[TQ]egefgaXW^cbcddadgedfggdbbchYXuŽ«¯ ¤¶µ¦ ³»­£±»©¢´Áµ¬«·¸©¦µ¿°¦µÁ°¤µÈ»¦­Å½©®¿¾¯§µÃ·£²ÆÁ¨µÄ—bahbehdddf`adbcc]PMMQWbgcgdbge\xv`klhjmjmppmkmnnlnopponlnrppotb`¤äâ×ÛãâáÞÝÞèéåèéìëéêëæàက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H}»×Éš‘Èë½}iy…Œ‹ŽƒÎé¿«½ÖÙäàÁ£Ÿ§˜©ÙñëèæçãåëÁsUaaq”˜ŒŠ‡…„Š˜¢¡›”„vƒ–‘ˆroy‚€€†„„ˆˆšÅ³‹Ÿ°ÀÅÒÜÕ»•x~‹Ž‰’–’šŸª«¢¢¬¤—Ÿ¤¢ž›—–˜››™•””‘¤Âǯšˆ…idjdeedc__eligeedbbdgmqpoomjkhhlptrkb[aini`aZVYXPSageillkjkkddfgihfensvsooqsuurqsslcUMFJMFADIMPPNMMNJRRUXML`tuwwxwvuqwvtyzwxywwz{ysmptvwzudSNOafJE]d\\]^_^_c_[]ejd]ZbbWT[[XRW[^][gunm ÊƼ¿½¾¿Â¾¿Åº¸Êµn[dUOk“›¦–r„ —›¤rU]dbbb]]]\[YWUTUWE%$% "7>201( !2[g_cs‰˜—Ž£«§¨§—xac^a‡¤Žxsh^c_]kŽŽo^Z]]^^ZVUY^]\YYZTRZ[]`a_[ZZ\YWVVXXSOOMLKORJC=;;68AIONKHEFJMQQRUWVTTQT\`Y_dK(','(11021/2655=ESmuf^a_\[]TP[bdgggaWU[_egjjgggcdfgfdbbbgVWuƒŽ¬±ž´¸¨±¿©§´½®¡¬»¶«­»¼¬«½¿­¤·Ã­¤ºÁ·¬µÅºª¯À¿¯£±Á¸¢²ÈÁ§·Ä–bahcehcdd`[_bagiaQNNRXchcgdbfe[ywbmlhjmigmplikopnkknnkkmnrppotb`£ãäÝáãÝÛåäáæèâäçììêëìåÞÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@ÛجŒ•Áï¾zet€†„†‡™ÐãÅÁÔÒÜâϯ¡ Ÿ˜ªÚñëèææåèíÃtU``p•—†„†‡…ˆ’Ÿ›—’zn|Ž‰†…ylx†‚|ƒ…„žàÙ¨±´š»ÓÒÄ®‘|Š’™”—ž ª«£§¬£•œ¡ œ—‘Ž•š›˜—–”’—£½Õͱ ‘†{nceh`bfhfbbeilhdcbacfkjjmpqnklhffktskd[`kojbc^WWUOS^adglnkfddbaabcdhkirvqnqtrtyyuuqZ>6AHGGFFFKPTUTQNKOUOP[QJ\stvxxxwvvzurwyuuzvvxxuqnpswx{{lWGPgqXK_d\YWY]adfd\[chd][bcWU]_\VTZ^^[gsho ÊÈ¿ÂÀ¿ÁÅÀÂÉÀ¿ÒºpY^PNk—œ¤•zŽ¦™žŸu[]_\[\^]YUTUVVVYXN9#&( :D42/$2Zd]ao„Ž”‘¡©¨«¥˜y`a_c†¤Žzth^c`]m‹m\X`Z]`^YVX[]^YX]WQW`__a_[Z[^\\[Z\YSJLMMLOTM@=>=9:@BMMLJGFIKJKPVVSSURV_d^hc6%&($*-(241.2965=GMgte[abZY[SQ\cfdefaVT\aeegfcefdefggdbabhVTr€Ž¯¶™ ¹¼©œ­¸© ³¿¨Ÿ²»²¦§¶¶¤¥ººª£³Áº¯¯À¶«±½»°­½º°«´»²¥²ÉÁ§·Å–cahcehcddfcec^cdWROOSYdieeeehcYx’xdnmikniknokknomnonllnnmnrppotb`¡ÚÖÌÏÓÒÖÜÝØßæãæïëìëììäÛÚ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€;–Ú⊈Æí»ygw…‰€‚ˆ¦ÚáÊÒàÔäỘ˜£¢±×ïìéëèæéê¾sR]cu–†ƒ‡„ˆ”¡ –”—•‡mu‡ƒymt~~ƒ€€€¨êá±ÃÆ”œÑźͳ{{”‘‘—‘”“™¢ª­£¤“ ™™š›‘–š•”˜•Ÿ»ÄÇÖÓÀ¸©kklf_cefc__`chmlgcb__bjkgfnrrspnkhghlnk^]gkjfa[UWZUW^_aaehfcbdaabdfghjpnorspoqsslu~a?@ACECA@BEMPRRPMMOOPORRFFYuwrr{zuwwxxuty|yxyusw|wmjz{u{€p[K\plTUgb_YY[\affda_bfa]`fbXY_]ZVMU`^Ycomm—ÄƸº¼½¿ÀÂý¸ÁѲlWdQKq”šŸ’v† œ¤ŸtV\`]^XZZYYYXXXPUUPN<&+$)-?E3.7% 0clY`s~~–™š¬®§§œy_e[Z„¥‘‚yk^]aft……k[b_\[[[ZZZYZ^ZWZXSS_]]\Y\^Z\^_\Y[YRMOPMJOQME@>?<7:AIJLKHFGJOQQSYXTSU^idelN)!#%')+/2110//26:EIavhY_`[Z]XT\bgjgg`TU`fgfefgfecffffeca_bVXs«¯š¤¾·¦¤´º¬ ­¾±¤¯¾·«±¿·§ª¹º§¥µÁ·«²Å»ªª»º¬ªºÀ±¦¶Áµ©±Ä¼¢´Çšd`jecdadced`aacf^ONMPYbeciccgfZv˜‚`ipmjjflomhkpngmoljorqqpnpppt^b™ÑÊÀÅËÊÌÊÍÓ×ØÛßãëëéêêãÞက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€E‘Ì´“ŠÎïºwcr€‡{ˆ¯âáÅËÛÛÜѲ“‘¡©ž³Øïìéêèæéê¾uU`dr’—„€ƒ}‡™¢œ•”‘‡mqŒ“Štgn|„‡„„…|¥äݲÄŠ°ž²å˃•Š‡Ž˜¡¦§¤¢¥¦›—œœ—™›™•’–ž™’›¹É¿¼Õع§}fcccah_fe^\_gojjfdfd``gkjjpsqrnnjghnomo`^ipne[[XURRZabcaacc`^_baabdgiknoppqqpoqrrriQBFBCDCA@BDKPTRPNJECPNHICJcvwvwwtqsvtuuvy|{tyzuruurmquvzv_]mm^S_j_[^^[]acdbeccdc``c_UV]]\YPT_b]eqsmšÆÀ«®´¶Ã¿¹¼À¼ÀϤbQcRLq”™¡”v…¢ž£ŸtV\`\^XVVVUUUTTUSSORS@0-(*;?668) "-_o]\n€}––ž®±©§›y`d\Y¤”ƒxm_\bju‚iZa^\[[[ZZZYW]\ZZVRVZZ]^[[^_]\[XVYYRRPQPNPQNFA?@=954?A4?ewquzrpuxxxvrr{}wwz{yxyvqtvrr|~tjqlTK^pm^\a^Y\cedb`_cdb_`gfWRXYZYRR[a\aknnÎÔÊÔÚÜØÝÓËȸ¸Ñ¬iUcOIr˜—¥šx‡ª¤£ sT]`Z[WWWVVUVUUUOPTSD=<>BFHIHIJJHILLNUY[`d]^th4!#$&'*-0110.-.035@WkcZ`a\WXTT_bcdejdVT^ceghhfffgbcdefedceYYtŽ®³¡¤¸³¨ª·º©£±¾°¥­¶²¦¬¾»®¯»¼¨©»Ã³§²Á¼«§¶¸¬¨½Á±§¸Ä·©­Â½¦³¿”c`jeccadcaa`cbcbXPNLOXbfdcbeidWvˆcinkjmkkmmlkmmlnmlljmonnqsmmwa_œÖÒÊÍÐÊÉÍÐÎËÎÕÓÊÏÜçêçÝÖØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J€®³œ}‘Öô·{qy‚ˆ}|–ÈèæÕËËÈ¿¯š”Ÿž¤Ääîìèéëèëé¾~jqluŒ}~„‘““¢­¥›”’„on…}opr|€}}…†}¥äߵürw¢Œ“˜‚xŽ“‘”Ž”•‘”˜›£©¥žž š–š™—““–—˜˜¦Èм®±Ëæج}jgfff`^Y`a\\`dfilkhhgcaa_dkia`elilnlgiomd]bjjbZZWNMX^^a`_]ZYZ^`aehikmlikjlopnnplrm[KB=:>=<=ADHJKLMPRRMH94402Uzyqsvqryzzttuusuuvwutw{|yqvtrzztzo[T[hmc^]^\\aedcbcedbbbdfWQY\^^UV^a^dnnh“ÇÑÈÌÖÞâåÛÙâ×ËÖ°mZfQIr˜—¦œz‹¬§¥¡rT]aXZWXXXWWVVVTOX[D!>^H5=B32;'"%!5al`\brrb~ Ÿž¥›¥œ‚gd\Zxœœ‹zuhal}zqj_X^\\[[Z[ZZYY[\YXWXYYZZY[]^]`\[ZZ]\XSQPOOTTNFA<:;<@DBGJJIJIFIMNPVYZ_og]aO$! "$$&(+.110/--/15;OfdZ`c]XYUV`deggicVT\_dfhhfdfgcdefedcbfYYsŽ®³¢¦¹°££¯®©£±½¯¤­¶²§­¼¸ª°À¹¬­º¿³§°¼¹­­¾¾²¯º¿°¦¹Æº¬²Ã¼§¸Ã”b`jebdadcabaccbbXPNLNWbfdbaehdWv…agmklpnkkkjklljlmmmomlnpnppou_a˜ÓÐÉÏÓÎÎÆÊÎÎËÉÌÐÍÝêíéÞÖÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€M}ªªŒ“Îí®vpw†yz—Çáçæ×ÉÁ¦’‘•™™¦Êèîëéèíéë辂qxozŒ‰˜Ž†™¬¥œœ”‰wu‰|jlr~‚€~„‡}¤äàµÁ¹u•¤˜‹u~†“’Ž“‘”˜˜¥ª£šœ™—™—š›’”˜–³ÕÌ´«®¼Ýبuhgdbe`][_^[]abbhmlgggdc_\dqqieedfhhhklmgebfmkb]XRNS\]\_]_][Z^becefdeijhjhjopmmpnscLD?;=><:<@EIJKJKNQQPPLE:5B]puwutspswwtrtwusssxwtsuyyvtuwww|}tfc__]dngZZ^a]_dfcfhe``a]dhYQZ\\]WX^a\bjim·ÄÀÄÈÌÛÝÓÒßÝÑѨhYiSJr—™¦œ~Ž®§¨¢rS^`XXVVVVVUUTTRQcZ-:[\NF?007(;dh^_akra{¡£ ¤ž¤Ÿ‰mc[[x™™Œ~ulgozkd]Y][[[[[ZZYYZ\ZWVXXXTYYXY\^ab\Y\`b^VKNQQQTQIEB???@@AAHMJGHHFFJKMU[ahsom]6 "#$&)+010/..0157F^aZ_d^YYTS_fihee_SS]abgjhb_aegfdcbcddfYXr~®³”·²££²¸ª¢¯¼®£­¹±¤¨¹¸®´ÃÁ«¦´½±§´ºµ©¯Äõ²»Âµ¨¶Àµª´Â»©ºÄ”a`jeccadcccacbbcYQOLNWbfegcceaVu‚akpjhmnljjllkklqnhhmompokmnnr\`ŸÓÐÎÑÊÁÆÇÌÏËÅÅËÒÓáëîëàÓÍ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H}œ¨ŒÎë©rnt}‡{zœÌÝæîؽ¨‘ˆ‘™™—”¨Ïëîëèèíéìè¾…v|qv‰Žƒƒ“œ—†“§¤™‘Œ€~Š‹{npwƒƒ€~‚…§åâ¼Çº“‚§”—Œ‡Ž“–—Ž’•˜š›¡ªª£œ˜˜•“—•’“˜˜ÂÛ讬µÒÌœndf`]a]YXYZ[]Z\bfllijic^_\cnpld\_cecdillmh`cnm_USMPZ_^]\aa_\\`cdfihdeikihijmnnnornW@==:;A=:;?DGHFILLMPQQHKNPMIO]jsupqsuusuywtvxvrwzwuuvwytuxxyxqXTZiidgc[\_a^]`daceb`cc]cj[QY[YZURZ`]aikq‡¤¥Ÿ¨±¶ÄÌÌÊÒÖÑΤfYhRIr™›¥œ’­§«£rS]aVWVUUUTTSSSQNXI'!+>LRQA05=) >eg___gm_v›¤¢¥£¢¡rcY\y–•Žunor€xg_][][\[[[ZZZYZYYZZZWRUYYXZYZ^aZUWZ]]XPQSRQRRMDCAABA?=BKNHBEHIJLLMU^hrpqvT!!!"$')/010//0255?T\Y^`\XYSR\ejccf`TS]bbccdeddcedcbcdeffXWp}Œ®³˜›´¶«§³º¬ ¬º®¢®½·§ªº¹­¯»º¡ ·Ã³§¶Ã¸©®¿º«¬À±¥·Â³¤²Á¼ª¹À‘a`jecdadcfeababd[QOLMVafed__cbYyž‚blqjgjiijlllmoojjkmmklommomls]^šÍÊÈÌÇÁÇÐÎÊÇËÏÏÊÕãìíêßÐÈ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H‰Š—Úïªqmt~Œ‚~£ÓÝãíѯ“‹Œ”™œ–¨Ñìîëèèîéì辆yrp…}’˜ˆ‚‘¢¥ž—‘Š‚‡“yjs{…}€‚†…ƒ¬æäÄϽ‘‰‡‘ª™Œ–œ„†‡ŒŽ‘––•™—–›§«˜›•”–‹••’Œ¥ÒØÏ¿³¬µÌ¿gae`[_ZTVXVTUWZ_eihfjlfa_\ajooh\^bdcachmig``ii`ZRKOY[^a___]\_dgfdhhddhhefjlklppmtgM:;>95D@;;>CEEAJMJJOPNSMORNKMM[oupqttvsstsopuwvwwvvxxwvqnt}zstiWWptbZY[]\\__`fgaadefd]]gYPY\Z[\U[da`hlb‹¶²œ˜›ž©°°¬µÅÌɪjYfOHsœœ¤œƒ”®§­£qR^`VWVUUUUTTSSNV]K2#!.A;/9A%#>dg`^\ef[o•¢¢¤¥¡£”ubX]{•“Žƒupstwd]^\]Z\[[[ZZZYZYZ[XUUUVWWY\ZX[]YYZZ[\ZPOQRONNLID>:;>@@EMOE>BILILLLQW^fksn? !!#&(/010001334;MXY^\WVZVR[cghhi`QP]ecegfdbcd_acefffffXVp{‹­³™œ¸½¬Ÿ­»­Ÿªº­¡®¿·©­½º¬­¸¸©«¹¼¬£²À·ª°¾¶ª¯·¾°¦¶Â·¬®À½«¶¼Ža`jecdadcgfaa`bd\QOLMVaffe``eeZv™€^gomklhgopjgkljlghllmnlmqsmmxb_–ÎÈ¿ÅÍÌÏËÉÌÑÑÌÎÕÔäïïêßÒÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J†—„—Öè¥nr‚Šƒ§ÉÚæàÀ ›  Ÿ™°ÓéèçêéçâììÁˆwyltˆžš†€}‹¢§˜‘˜Ž‚~‰’Œ}qt|„†ƒ€‚†‚„¨áÝÈÓÈ’„Ž‰›¦„ˆœ‘€|‡Œ”’“••”™ ¨ª¡““žœŽŠ’•‹‘¶ÓÒ¾²©³½¥|feb_[XWUKPVWUSSTcehknnjg^\_hprlcZ^ccadhgbgecgg_YQFN][Y^ab_`a`cffffeddfikgpslgimmrY@899:=?>:99=AABKLFCDFGKLLLQXYUjwZ( #&)+.--/231/26=HRX[]WW]WRY`ehde`TRZ_^gkfacff_addcdfi`RXwƒ“±°—Ÿ·º«ž®»ª¢°·¢ž±¼²¡­¿¸©¬½»°«µ¼±©­½¸°²½º¯­»¿¯¦·À²¨³Æ¼¦¸¿d`f`bfbeecdbbaad\PONPXac`fgbdfZx›€cnsnhjmjkiilmklifinlloqnssnqx`bÈÆÉÌÊËÔÉÍÔÔÌÊÎÎ×åëëëßÒЀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€N…”Œ‡™Øîªx~‰”ƒƒ®ÑÜßØñ»»º²¥šš ­ÍäêëêææàêêÁ†t{xx……„•¡zoq„¡¨›“—…‚Šƒums{ƒ†ƒƒ‡{©çßÉÜÑy™²˜‚–“„‚ˆŒ‘’‘“—”‘’—££›’•Ÿ“Šˆ~Š³Ï̾µ­®·±jjhd_ZWTSPMKNTWURY^ejkjhha^`gmpmf__acbcefghb^ehaZKEP`^Z]^_^`cdefdcdedcejoqsqkfgkneQ=7889<:;:<@DCDLEADGKR[WOLQPJKTN^pvrqrotssssuwywruxsruuxrqvyywqlddg`ceRW\]]`_\\`bca`bcca^WR[_Y\aXX^]dnhfŒÂ;ÁĽ¼À½¸±¦°Ë­o^gPKuš ¢žŒ•¨¦²¦rTZ]VUWUUUUUUUU[LX_>(=<27>)Dfa[cbac[f” ¥¤¦£šƒm^`y–‘†€zz~uuwg]]Z[\Z]][[[YWYVUWVWURPWWTUUUX[YYYY\[VTQQRQRPKEC?;;?@@CLNGCCGMHJLNRXYYgbD! "%)+.--02320407GSV[b\Z\VQ[chb]aaTPZehfgjiecedcccddddcTYw‚®­š¦ºµ§ ®²§¢²º¥Ÿ²¿³¢«»·®¯»´©¨·Á·®±À·©¬»»¯«¼¿¯¥¶¿²¨µÈ¾©ºÁ‘edibce`aaccbcaad\RQOPX`a^dfaceYwš`ipnkkkkjjjkmmnlmnljmnjinmiksZ]šÑÍÅÆÎÍËÈÊÐÒÍÍÓ×ÜèíìèÚÊÇ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€O‡žŸ¥—£Ûë¢s{€„Œ{ƒ®ÒÚÚ×ÓÒ×ÍŽ©•—¦±Íæïìâáëäçå‹sts{}|…˜™†wlrˆ¢«Ÿ––ˆŠ”‚wsw~„†…ƒ…ˆ‹~œçâÆÝÐ’|•Ž”Ǹ}ƒŸ¤Ž€ƒˆ‹’’•˜•‹Ž’˜œŸ˜—™“‰”¶ÍÊı¥¯¸¨†mnje_ZUSQPNLLNPRSSYbhkkkkga_chmnjb_`bbceeffa_gkaUJFP]\Z^a^]`dfhgdhgd_\_hpklnomgc`SF:7878;9:==?BDABDEEHMSTTMLPPIIONWlxsnontsrrsssrutvyxtu|xrpswzulrtm^ZhjNR]_\``\[_aa^]]^^^\WS\^W[]V]ia]jkfÅϸ´»¼¾¿½Áü¿Ò¯p^hQLvšŸ£ Œ–ª¨²¦qSZ]WVYTTTTTTTTTMW[? $&#-?=16<) 4U]Z^`ec\`o„˜¡Ÿ¥£ ‰m^dy–Ž‚}z|€xsrd\\[[\[\\ZZ[ZYYYWWZYVUQUWVVVXYXXZZY[\YQOQSRPLFCB?<=@A?AJMHA?FPOLJJNS\dfM/!$')../03332657@LV[]ZWXRPY`deaecVP[efdgjgaafheccddb_fVYv€«©˜ µ·¬¢®³© ®¹«¦³¼µ¤¬¸´­¯¹º­¨µ½³ª¯Ä¹ª­¾¿²­¾À¯¦µ¿µª´Ç¿©ºÁ‘dagabfbddbcbcaac[NMMPXadacc_bcWw™|^gnmklklkjhhhjjlkkkkmmjknnjns[_ÕÐÁÀÇÆ¿ÍÆÇÌÌÌÑÒÞéîîëÜÎÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€L‰©°³¤®áç›mzyx†~‚¢»ÂÄÆÉÐ˹­ª Œ–™¬ÇáîèäíæêëÌ•rnqyyx‰ˆvz‡˜›“‹Š†‰…zspy}‚€€†pŽãݺÕÎ…™‹”ÜÒƒr•¥™ŒŠˆ‡ŽŽ‹„ƒ†™¦¨ šœ¡£¦¤Ÿ£²½¿ºª£²½¦mnke_YVTSQSSOJINSTV[bhllkfa`dimlga````dgfgf_[bibVBFT`_\]^`^`cehheec`[Y]goolhfb^VPD>9:9779<<@B>AB>;?B?>@>@?@BGIJIFIJFGJJGAWszssywuutsrsuv{wvrrx|vrnpttrqppgc]Yit_R]`^`^[]Z\]]_a_]_dbY\^VWWZX]^dsihŠ½Ë¾À¿µ¾À¾¿¿¸¿Ö¯o[eOKs”š©¨‹–³±°¦rT[^XWYUUTTSSSRVUNNUI1%+$1HC369(7ek[^c_`ZW^m}  ¢¤lbm‚…z{}€…~ojbYUTW][ZZYYYZZXUVXYXVQPPRUTSRPTVZZX[^]WTTUTSPKA?=:<@CBDJMKIGKSWSRQQPW_W@3." "&',.013344722:FQ[bZVYUT\ab`ci`PO[bcffaadgebcdcbabceUWt~­¬›¨º°¡ž±·¤¡±¼«Ÿ¬»³¡«¹²¦¬¾¶««º¾°ª¶½µ«¯¾½°«»»®§µÂº®°Ã¼§¹¾`dibce`ba`bbcaabZONMOW`b_cb_dbXy™{bmokillimmkmjhliklkkllmrrrqtw_eŸËÈÉËÈÈÐÎÊÏÕÒÎÓØÞåççæÙÐÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fˆ«««¥­ÏË¢Ž Ÿ‘˜šœ––›—”‘’–—•“””œ³Â»¶À¿¼µ§–ŒŽ””–”–š™”Ž’””˜—’Œ‡ŠŠŠ‰ˆ‡‡†ˆ‰›­“†ž›‡„Œ¡³Ÿ„|„‰’›š–š˜–•˜–•š¡§¬³¹¼¿ÅÌÎÆ¿ÃÌÊÇÊÈ÷¶µšxnokd^YXXYTSRSUUSPTUVWZ_fkfdcccgklf``eb_ae]``]_f^MBMZ^[\`caadfddca^]\[ZYZ[]]XSTWPF9:;<;988<:;?>=>>?>>BFIHEBGGCCGFBA_wxtvwtutrrrsssvuuvvxxxrmnttqpplc]a`chbX[[]_`^^`bb_^^_^\baZ\^Y^bf[aa_mmb‡¾É»ÀÈÅÀ¾º½Âº»Ë°nZdOKr’§¦‘š³¯´¨tV\^WVXVVUUTSRRPNOQTVNAABJO=2::' 6oz`[de_YV^hq‚˜¢¨©‘tho„ryƒˆˆ|nga[XXWZ[ZZZZYXYVVXYVUTQPQSSQOOSUW[[XZ][URQRQQOKCB>;>======@FHGFECA@?>?Snystwtsuvvvutssruuvxtptrnptsqpnjg]^d_`e`\\\]^_\\^_^]^__Z[[Y\YVb†~\Ya^knh‡¹È¹»Á¾»¿ÀÁÀ¶ºÎ²pZeQLs“œ¨¨‘œ´±´«vW]^VUVWWVUUSSSQQWWQSXVTV[S:0<;& *e}eZaf_ZV\fit‡›¨ª”}opƒŒ{nz‡‹‰{ob]YZ]XY[ZZ\[XVWV[][YTRUWVQLKGGOTVYZY\^\WSSTTTRNHGC@@BB@EIGABGNTXYZYYWSN98<<4(! #%'),/1113539:8>O\^ZX[TPYageac_SQZ_fcbdfca_`abbbbcceUWt°°›¥º¸ª ¯·«¡©·¯¤¬ºª™£¶´«®¼Á¯¨¶¾±¬¸¾µ¨«»¼±­ºº°«·Á¸§°Ä¾ª»ÀŽ`_e`bfcff_aacbaaXMLKNW`c`b^^c`Wz˜z`ilkmniigjkjkkhkkjkmjhmommnrrZc£×ÒÇÆÉÇÅÑËÊÏÔØÛØÛâæêéÙÎÓ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€K…œ‘–š–›¡­¦£©ª¬ª¨©©¬¬¤£°ª¤ ¢£¢  ¨¥¤¬±§¢«²±© £¨ª©¯ª£¤§ œ£¡§©¤¢¦£œ˜ž¡žž¢¡œš™™›ž¡££ ™¤¡”“™¬ ¡›—™—–¡™Ÿ¢¤§¥§±®±¹ÃÇÇËÑ×ÜÞÜÛÝÝÚÚàØÏÖÛØ×ÓÖÒÓÆ–mlvqg^WTTUWWVUTSSRSRQUZ`celd`cinojacc`agf]\[[Y_h]CDT_^[\`dgfgd]\_aY]`^YUUWXURQOJA;88889;;;AB<9>?<;;88=@@CJQF><96:Ci}{ntwsvqtutqqtxwuvvtvyxqqstpoomlf]]\[`ba\\\Z^b_\^^^`a`]_[[]_XVh‘—nV[`mhdˆÄÕÀºÄËÆÄÀÂŽ¾Ïµr\fRNt”˜¬¬Ž™¹µ±¬wX]^VTUXXWVUTSSUSSTSPQUNNVV>1:8&*^xf`b[_[V[dekz‘¢§”ƒtpƒ‡yp|ˆŠ‰}l`\WVZY][ZZ]\XUVX^ZX]XPRRPF@DCEOQRVYZ_b_VSSUTTSNKKHDCCA>BIJDDIORX[ZXXYTL8:>B>0! #&')+/001357:;<@JV^UU[UPW^cceg_QS]_cdfhihebca`acdb`gVXt°°™§»µ©§³³ª¡«¸°¤®¿­¡®¼¶­°½½©¢µÀ´«²º¶¯²½»±°¾½µ¯ºÃ¹§­Á»¨¹¾‹]chbceabb_aadbaaXPOMOV^_\`\\b^Uy–u^jlhjmkmfjmgjnghkjhlnmlollnqqYbžÐÌÈÉËËÍËÍÐÎÉÍ×ÛÜäéïíÛÍÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fž–“”“–³ÐÛÖØÛÙÚÙÙÙÙÙÙÙÙÛØÕÔÖØ×ÕØÏÒÕËÉÓØÙÙÙÛÝÛØÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÏÏÏÏÏÏÏÏÌÌËÉÈÈËÍÍÊÌΟºÇÄÀÀÄÄÀÃÊÇÇÈÉÊÊËËÖØÚÝàãåçæåäãâáààÝÚØÙÛÜÙ×åßÕÜƈkusia^[WUWVXXVWZYVVUSSV]beihfcejmmifb^]ab_Y[\YZc[DCX__`bfdeb_^_`_^ca\WY\YRPWWPH?=CB=9;=88AG=:?A<:><<969AHKQJEC=9CRm}zrz{tvvutssstusqsussvxtpqpmrvrndYX^_`d_]]^]^abaa^^`__d_X]]`^Ta”¥pVbbkhgŠÄÒ¾¿ÇÃÁ¿À¿µ¸Ë¯r_fPMt’šª¨‘ ·°·¬tW^]WYXXWWVUTTSTRPNORWZTPRR?6;6$!&[wi_^YZ\[\chikƒ–§™†~ut~wr~‡ˆ†xi_XXWX\_ZYZXVXYT\[YVVWUQURDKVZ[XXQO[bceac`TRY]cfifa^adeeddccbbeVVsƒ’®¯˜ž¶µ¦¤´¯ ›°¼§®»¬ž©¼µ¤©¸º¬¥¶Ãµ«µ½¹³´¾¸ª±½Æ·©·Á°œª¾¸¦ºÁ]cfacb^a^c]]abb_XMKJMV_`\abcc_[|Žr^klikmhknjfikhghkkknnkjknomor\d¢ÒÍÉÍÑÐÑÍÌÐÔÒÎÓÜÜéìéåÙÎÏ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€C~¥¦£§¥¡¬ÎçéèìîïêêêêêêêêëèæéîîçààãåæáÚÛãéçäãåçéêééééééééééééééééêêêêêêêêíëèççèééååéëßÓ×åáßàäçæååãääååææçáâãäåæçèææåäãâáááßÜÝßßÝÛÛßàåÅ‚gswlb^[VUXVXXWVVVVRTUTSX`ghgedfjjigcba`ab`\ZYY]bXDAV_bdehfjd^\^`_]\]ZWX[WPSVSKC<:?C?::<9:AC=:==99=?<:<<>ENJMOOLKMQ`swqsurrttttsssrytrssuxzsnnmkptooja]]\[^_`a_]`a]__\\``]]\X_^a_U^Ž—kW`aloeˆÂѽ¼ÂÀÀÀ¼¾À·¹Ë¯r_fPMt’œ¬«“¢¹³¹¬tW^\WXXXWWVUTTSPQRTUTSSOPVT<099"!" %Wsg`a`caZYaedfv‹£Ÿƒwt~zwŠ‰yi]VY[[[ZZ\ZY[YWZXYYXXXTOURE?IPNNNPTWYZ\^\TQWWRPSRPLGBBBBEHJIGINSWXZ]\WOHA8132(  !$'-,,,-/246888>JUZZXXQO[bcb`b_TQZ^ahic_bcbedddccbbbUWu„‘«ª•Ÿº·¢²¶¡ ³º£¯º¬¨½µ£©º¸¯¨³¿¶­²»²§«¿¿¬ªº½¯¦¶¿³¨±Ã»§ºÀŒ]`c_ccaecb_acaa`\MLKNV_`]_`ac_\}‘v^ikiklinkggigfjlhjnlkkjkmomor\d¥ÓÌÅÈÍÍÏÐÔÔÑÒ××ÒØèîéâÕÎÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gz¢£ §«§¢¹ÙëêçéêææææææææéåãåéäÖÊÃÅÀÅÒ˽½Ùáéìéææèççççççççççççççççççççççççéççèçá×ÎÎÍÐÓÍÄÇÑæèéæäååäããääååååéééèèççççççæåäããåäââäãâàßáãå¼zgvuj_YVRSV[[ZWTSTVSUVTQS\ddghfcdhkhcaa``cd_XUX^aTB@S^dgdeccb`\ZY[]``\XX[ZVTSKB>::>CB=9;;BS^gidb`[]_^[YZ\_^[VUVVURNC<;;CB?@@<;:<=<;:986:;;>EKMOPLEFOPLO_szrsvssttuttssrrvwuttsxojihptnficZX]be\`b^]bb\`b`^^````^^XX_]`\^Z[]`gjh‘ÇÔþ¾¿½À¿ÀÀ·¼Ð®q_fPNu”šª¨‘ ·°·¬tV]\VXWXWVVUUTSSSTTTSQPPOUT>396#!Poeaega\UW_ccfam‡—™Žztyts‚Šˆqe[WZ[YXVWVZ[VVYZYZYWWXXWQUOHIOPQMMOTWXXY_]ZWTSRRQQSL@AGDDHKJHINTWY[\\YTQK>40-07=?3&#"#&+),.-+-274578==CLPNKILNMJMYq}wsvsttssssttwvwwtvxxtmkjjprkfjf]\`bb__^\[_b`_^^__^_`]^`\[`_\a__\Y`jij—ÊÑÄ¿½¿ÃÃÀÂŽÀÒ­p^fQNu”šª¨‘ ·°·«sV][VWWXWWVUTTSRSUUUSPOSPTTA7;5" Qqh`bb\YWZaabhcez›”uzooƒ‹ynf\WYYWXXXY]\XX\[VXZYXYWUQWVNKNQSNNPTVVX[da\VTTVWWSTLA@FBBEIJKMQTXY\\[YWVQE;40<<>??;98:=@CEKHGKMLJIIXp|ursqssrqqrstwtsrruxvnjjkjopiehbZZ^__^]_a`_^]`\]aba`^]^_][_`\Z[^^Y`g`jžÌÌÁÀ»½¾ÁÀÁÀ·»Ð¬p^fQNv•œ¬«“¢¹³¹«sV\[UWWXWWVUTTSUTSRRRRRRQWWB6;7#Psja_^^[Y]a__fecrˆ˜˜„y€pn…‹}tmi]VWXXXXW]\YYZY[VXZXWWVUTVUQNOPRQLLSTRU]_\[_`[VUWSSOEDFEGIJJJKNQXZ\\[ZZ[TKHEANeoXG1#!%%$+,-,+,035579:>HQUVZSOX_adbc]OMV]dedcbedaaaabbcbc`SUt…”°°•ž´´¨ ­³¢Ÿ­¸«¡«¶³ž¢·µ©«¶¹®§²»¯©´º¶­®¾¾®­»¼¯ª¸»¯ªµÁ¶¦¸º‡^cfbddaeb_`b`^a`XNNMNT]abc_^b]Wz’vamogdhjkhikhgjnkjkkhillilmlmpZb§ØÓÐÓØÖ×ÛØ×ÚÛÙÕÔßæéêèÚÑ×€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€RµéÞâíêëãêéäåççèææææææææääåääæéìèèèåæììåççèêíìèäèèèèèèèèèèèèèèèèååååååååççèéèæâßãçêéææéìêçæéêçäãççææåäääççèèééêêèèèèèèèèçéêéæåæèäèêÏq~yYSPTVTTVOLLNPUam`YUVUSV^aceebbgmmc]^_acd^ZQR\ZH9BQTTVWXSUX[YURSUVTRTUTOKA?97<>=?BEB>?><<@@AB@??@?;65?=;=@ACC@=?DB>::;<>AHIJKID?(%**('')-145679:99BLSV[TOX^aa]^[RR\bdggcacc```aabbcc^RVu„Ž¤¡”¤·®ž›¯º©¡¨²¨Ÿ§´¯¤«·¯¤«¶³ª¤®·­¨´¿»µµ½µ§®½¿¯§¸Á´©·Ã»­¿¼†]`c_bb`dabaa_`fcVLMMMR[`bb]\a]Wz”t^jnnok`chmkfhkhihehmnklhkmklpYa®ÜÒÊÌÒÓÖÌÔØÔÔÚààáèëíéÖÉ΀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€O¼ùèÝäèìéééééééééèæååçéëçççèèèéééèèçèççææèéèæåæççèééèææççæææèèçæèèèèèèèèèèèèèèèèééèèççèèèèèèèèèèèèèçççççççèèéèèèééèèèèçççéêéçæèêëèðÊ‘ƒz_V[PLWTILMVXY_\]iifaZUTWYb_^`_\aik`V[^^ce`SOV^UHLXYTLKPQKPQRSSSSTQRRPKE?<9426;>???A?;=?@@DB>?DEA?<=CC;9@DEFIKG?;>8469::;=?@?@;:67<=:834:@>?EHFHHD>=@Dizxtttuosnmrroosvwutqqurfahnoonrgda\]]W[_`adhhfe\^aca^^^^^]^a`]\]]]^Z`eXq°Ñþ¿¿ÂÄÁÁÁººÈ¬o]fQNv–œ¨¥‘ µ®¶¬rQWYVVRRTUWWWVUTSRRRSTUSQQTE247' Kpj`eda^ZY[]ae^bfeizˆˆ‚yv~|rmg`\YXYYWUWWWXYYYYZXYZXYYVUQRUQNMLDGCEOUTS[]][[]]\VSV\\UNLOONLGFKSQXZZ[]]``^[YPSbe\WB)!%%$'()+-023568856?INWXPNY`_dba\RQ[dddddcbbc_baacb`bhTSq«¦’œ³³§¤³µ¦™«¼ªœ¬½© «¶°¦©¸¹¤ž²¾°¨²¾´«²»±§­¹»¯«»À²©¹Å¶¥»ºXad_ba^b_]ab]]ecVLLKOW`b_`_\`_Z{–x^hlhfiihhiiijjjfjljhilnlnlkppXg°ÝÍÈÊÊÍËÎÕÓÎÐÖØÚÙçëêåÛÓË€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&|ÙôæåëäèèèèèèèèèèèççççæèèèèççççéèçççççææçèççæçèççèèèçççæçççççèèéééééééééééééééééèèçççèèèèèèèèèèèèèèèçççççèèèèèèèèèèèçèççèéèçæèéâêêÅ’n]a]YY]_agjfhbWTQVcefc]YYWTZcaYUMN\gi]TUV]b_STZZMFRSMIKLJKNNQTSNJKMJGBAAA?=7447;<;:>><;;98:<92046454138;@FHINME@CLPctxvvsrlpooqsrrswvrsuvxrgaiqrolnnh`XZ\[`he_`jmigbcff`Y[`^\_bb_^]\[\\Z`f\t²ÏÀ»À¾¿ÁÂÀÂú»Ê®n\hSLt——¤¤±¬¶®qPWYSSQQQRRSRQPYXVTTTUVPNQUE247' Hnh_fg\]]YWZaecddbdr„‰z{yqnh`]ZWXY[[XXXXYYZ[[YYZYXXVVRQRQOLGAECBMWWQW]^YUW]`WST\_ZSQONNKGFMUX\]\]\]ab`^\TUbe_YC)!"##'')*-024568965;DLUWOOY`^`^_[SRY_dcdec`adbda_ba_bhTRn{Œ«©•ž´±¦¤²±¥Ÿ¯¸¦¡³½¬¡©µ±¨¨µ·¥¢¶¿°¨²½µ®´»±¨¯½½°«º¾³­´Á´¤»ºƒ[ad`bb^b_`_`_^a_VNLKMV_b`b]Z`aZ{”v]hlhfhhhjifjnmhkjjkjhjmknljppXg¶ÝËÇÇÄÇÉËÕØÓÖÚØÔÜæéìèÙÏË€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ Y¹òéâëèçèçèçèçèèèçççççæèèèèçççæèççççççæåççèæççéçççèççççæçèèççèéêêéêééééèèèèèèèèéèèççççèèèèéèéèèèèèèèèçççççèèèèèèèçèçèçççèèçææçéäé纂ja]fqmbbddh_`\YVPPYflme]ZZX\`]WQKKS_kaTRTZ^VLQ[YLFRPNKJJKLLQSSPLHFF@ACCBA?=:7578:87>>>?>823:955873283147—çðâçêççççççççèææåçèèçèèèçççææèçæççççæææççççèèçççæççççæçèèèçééêêêéêéééèèèèèèèèèèççççççèèèèèèèèèèèèççççæççèèèèçççççèçèçççççææçèæêä°vegkwxnbbededhf`]XQLU_hie_XSXX]]SKKJUgeXSTYZNFNXVJDMNLJKLNOOSSQMGCAA>?@AAA@@87669::9;;;<=85777559:8853358:>BMKLNPOPRNYnyvoqynpssrrtvouxytqtrjgkjjnnohjwuc`g`\aaahllmhdcec]\`^`ec]]a`\[]]]``Yz¼Ò¿¿¿¿ÁÅÃÀÀ»»Æ«q_ePOw”–¦§‘±¬¸®nMVWOOOPPPQSTUVQRSRQOMLMTZVA9@8( @jiaeecbbYLN\eea_`bgtƒŽ‹}trpne^^]YWUWXYZZYWWY\YXXXZYXXVVTRRPMJG@@HQUTQWZ`aVJP_ba^WVX[ZVSPMIDEGSVYZ\[]b\[XYUT\a[R;&!$&'&'(*-0346677536A><<>AA@=;;:99975;:76889<><647:;?775588>>==<<>AA?<@?;76898<=<:;<;<@?;9:;:<;;7588;BNKJIJJJJFQmvstqrtsqnoqstttsuwyzscelljnpsxxx}r\[b__ccahlfggfebaabbccaa_]]_[][[_][ƒÅÑÁÀ¿ÁÁ»À¿¿Â¾Àͬp^eQOw•©¦Ÿ²ª±§lLQSQQMPPONOPRSSSUX\`dgdjl^@:D8!!Fqk]adg^bcRLXbbcbbbaix…Œrsupb[WUTWYYX[YWX[\ZWWYWWZXVWXWSRSQQVH9;KTSRSPVY[cljb_\\^_]]^]\[ULCDHHQWX\^_`^\UVURY`_N2 !$#!%&(*-1457422116>;88:;::=<:;<;:==979::<9978=<<@DHHDBBB?@Rswqwvvonmortrptuuurswtkhlidhoxyzx~xd^^^_bYMXlqihfdbb`^`ddcc]Y]\Y]\]a\Z‹ÆʺÁþ¿À¾Áû½Í®n\hRMt—Ÿ©¤ž²¨­¤lLPRRSMNOPTX]bemoprssrrpqqbA8A8%! !KukY_fdZbgWNXaa`[[``eoŠrsvo`]\[ZZYVTZXWXXWURXZWVYXUV]YSRSPOUM>>NUSRPQVY]grrjj_[aaYVY]\[ZTKFFLOU]`\\bc_XXVSZb^K.!&$"%&(*-1458300016=BMRNOZ_]]_`ZRU]`adeb`aba]`abec`biSPn‘®ª‘¶µ£œ®µ­¥«²§ž©¹³¢ªºµ¥¥·¹«¦³»²¬µ»¶®³½·ª¨´µ­§±¼³£¯Àµ£´±}Ydfbddadabdd_^c`TNLJLT]_\^]^]X\Žp\iieggbcghefkljgknmihjmiljinnVe³áÐÇÉÍÐÍËÍÎËÌ×ÚÐØêéçéÛÏ΀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&,3qÐðáæíåäèçãåëæçèççæçèæçèèççæåèçæççååçêèçèèææèèèçæææææèèééêéééêêêéèèèçèææèèççèèèçæææåæççèèèççææçççæçèéæççæåäåæéèçæççæååååãåççåæìæ¨eo|\^``][ZZ_efcelmhnmjcYQPRPX\`bXG?JTbeZRRU@BLM@@LRQRQOMKGA==;89=?>9<=>@?=>DB;427978;=<<=?@>><99;<=@98=>:BD9@`qpuwuvusqqporwuvuvuuwrfbkkeiszyytxp]\`acWJShoiojcda^bfdedb`_\X[[\]b]^ŽÇÌÁÂÅÀ¿ÃÇÅÃý½É¨q^bQPv– ª¡ˆš°©µªkENUPMOJPJCHMPUTTVXYYZ[aYSJBGF8%! !Ryn\agddec`]]^^b`^bbbh{‚|oqzq`ZXXZYUTUYXWY\ZWYYYYYYYXXX\VQTROTSFENSRQMRLQ[akuwqrj_\aa]]ab^XRJCEQWX]`__`^ZZVOXdY=($$%$',/1479752/159;FPSMNY_^a_]WQRY\cedcec`bgd_ae`\_bUTl~˜±¡‹¡¹°Ÿž°µ¬¥¯µ¥«¸«œ¦¹´§¬µ¼©¦µ¿³¨±º¶®¯µ°©ª·¸©£µ¼®¤²¿±£½·|Zce`bcafd[_c``eaRNNIIT]`ae^Z[XY}l^kigiifhiiiiijjkiffkkjmjkijnlVj¹ßÏÈËÎÌÍ××ÑËÎØÚÖ×åìéä×ÌÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"12]¾ôìâëåçèããçæåæççååææèéèææçèççççççèèééèçèèçæèççççççççèèééêêééééééèèèèèæçèèççèèèæåççåæååæçççççæçççææçèææçæååæçéèææææäãåçèæäæçèàñë©n}‹iY]ab_\YX\_dhklkimjknk_SNPSV^e]K@?I[d]TNG>CNK<=LSSSOIFFB>;>>==???==:;AA>=:=<769:959>><:;>B?<::;=@=978:<=@BC>AB@=5Dgyomvxssqqrqpqtrtttrqtqbdllntuusxzz{wi\^^`aPFYmrkehidbfgeeda_]Y[^\YYa]^ŽËÒÆÂÄÂÄÇž»¿¼¿Ë¨q]bQQv–Ÿ¬¤Ÿ³©µªkFNUPNOLR?! #! !#$&' '=>????>;@>:;AC?>:>@=<<:8558==977;88::89<:50025565:;><9BGPcsqjnsqqqstsqqrtsqrttun^bhipurrux{vsyr\]]\e`JNfojhifdfhgefeb`^[\a_[[b][‹ÈÏÁ¾¿¾ÁÄ»»¿»½Ê¨q^bQPv–š¨¢‹°¥®©kGOVPNPQXJ-"%!"!0BBLSG)" !Nxphoghdbdda^]c`_]\_fhpyzrqum\WYZYWVVUWXWXYYY\YXWVVVVWXWYVPRTNQOMPTMGINQPNR[hurvwpf``bc__bb\UREEKU[^_]a]XZXRY`Q3" ""%)('*2750/01/-/7>FPTMNX_]]ZXSMPZ`fbcc^_b_\___`]]dbORr|‡¨¬” ±¬¥¨³¯¢¡®²£ ­´®¢¦¹º¦§¼²¤¨¸¿±§²¾¹±³¼´¨§¶·¨£µ¼°¦²¿°¢½·|Yce`bb`eb\\`aab]RJLKNX_][[Y\^XX’p`mmjhgdjjjhgghikmmkhhjijkijnkVj±ÒÇÊÐÍËÓÎÇÄÈÊÈÇÉÐãææëÝÊÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€/+3fœ·ÅæêèååäåêèèççææååæååææåäåæççååæåãææçèçççèåæçççççèçèèéêêêêèèèèèèèèçççççææçèèææççäãæççèèèçççççæåååæåæççççèèæææçèéééçççæåååæÝìè³uekc_^[WVX^ccadlmihlhmmffmok]UOTadYLB?Qb^UNB:FMC5;IMFE@<<@A@<:8<@CA=@?<=AB??>??=<;72238<933720278547=<6015525<<<;E]mcao{urvtpqstsqqqutqstvvnbckprsrxzvxwsyvc]d_ajYGUikljgfggjiihc`^\Z^^[Z`XVŽÆȽ¿Ä¿½¾À¾¿À¹»Ê¨q]bQQv–™¦Ÿˆ™­¢­§kHQVPNQlh\QLJFC9<;5/--,++8>=OT<% ! Rsjnehkkgcaa`b^``[_feirwsopi[TY[ZWVTRYZYXXWX[YYZZYXWVYX\ZQQURRKKOKE?9EOPMOT^lkottngfjle`ac`YTH?DS[_a``]Y[UQZbJ,! !"&''*-0013////.08@GQTNMX^][YYWSU[^cdffa_``]``_a_^beTSm{®¦’¡´®¤¦³±¤¢¯´¤Ÿ«±©¢§´²¥¦µ¬ž¡³»¯¥±º²«¶¿±¤­º¸¦¡µ¾¯£±¿¯¢¼¶{Yce`ba_daa_`a`a^WKMJLV^]\_Z\`Z[~palhejmjefffefhjggjjgikijkijmlVj¶ÖÇÇÍÎÐØ×ÏËÏÒÑÑÕÚÝßäéÝÍÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+00Ebw„¾åñçéèäëèççæææååèåäååãäççæææççæääåççççèèæçèçææççèèééêêééççççèèèèççççæææææçææçæååæççèèèçççççæåäåæääåçèèèèææççççèèçççææåææÜíì¶q[cbZ[[ZYZ]`ggikkiggcba`^^dkjkbTT``UG6>GF>>=:<@A?<:9=BCA=??=>CC?=?>=;;;975359844651155226695,*02-994>C2((++,+(++(%')''-S}tjspglldafgd`]ab^_dbcksqjig\VY[XXXYXWYXVVVVYYZ[[ZYWVWX\]WRQSSPROC94/8ELMOOR]cekrtqqtvsmgda]XM?AOY\^^a\XXSQ\aB%!!"#%&&+0/+.63/-/239?GQTMNX^\[]`\SQW\cedcda_`bc`_cb_`dUSk{”¯¡‘¡·¯££³³¦¡®¶§Ÿª´­¢«·®£¨²¯¤§´·¨¢´½°¥²Ã´¤ª¹º¬¤³¹¬£±¾¯¡¼¶{Xce`aa^c`b_``_`^WKMJLV]][_Y^b[[o\komihidhljfeiojghjikmljkijnkVjÃç×ÐÖÚÜàßÚ×ØÚÛÚÙ×ÒÐÜçÛËÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.4-8Ugg…ÆìééêåæææååååääéæåææäåèåååæçèæäáåççæçèèæçèçååçèéééêééèèçççççççççèçææææåâååæççæççççççæååæææåääåæääåæççæåääåæææçèèæäåææååâçëÃzX]_YZYXXZ^beikjiifbba_\ZZZ[bjpgVORSK>BW_RC:==@?<@?ACC@<;??<>DD>;???=;;<=>625;:6363243/.02/.-,+-03,6azvstdZgzvoqrqssrqrrrsuuvssurifmnjrvstwzwsvyxe]]]htcT]jmjmjefggigb__^Y[[[[^VWŒÅǼ½Â¾¾ÂÀ½Âƽ»È¨q]bQQv– « †—¬¤±¤kJTXPOSVNKPQOG>HFEKVXG2#!(-(*0/'#')%)/..,'&*-/4-8c…{ptrmpokkmia^^ab``aa`fomdce_XYYYXYXWVXXVWXXYYYYYXXXXXXXZZSORORRQMA2,.7CLOKJP[[`jrtuxtywnc^\[O@HRTNMX]\\\]XPPV[dd^]bc^_cea^cd`_aQQn|Ž¨ ‘¡µ®£¤²²¤ž¬µ§ ­¹¨™£¶¬Ÿ¨µ·¨¨¶»®¦µ½·©¯¿µ¤§º»«¥µ»ªž°¾¯¡»µzXde`a`^b_]]__^`[QJLKMW][YZW^cWZ…—takjffhhjgefhifcmgefghiijkijmlVj¿æ×ÐÔÙ×ØÛÛÚÙÛÛÖÐËËÇÔæÚÈÍ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .1*5WlheÅåêçåãæåääææåäçççæææææâãäãæèæâàäççæçèèæççæäåèëêêêêéèççèèçççæææçèèæåææåãååæèçååååæçççççååååääåçââãåççæäâãåååæçèççèèçåçêæàèÊ}TZ]YYXVVY_dbdfefggedlmgehbVWVcqkYJBB?CRZN>8;A@;;@?;@A@>?A????=>BB><=>??><<<=:77775321110.,+/*)-.++/,"-Zvqosl_fyzpqwrtusrstsvustuvwpmhjghqutwttrnouxzh\]grn]Rdmieefhffhgb``_Z]]\\a[ZÊÏÀ½¿¿Â¿½ÃǼ¸Å¨q^bQPv–© †—«¢­£jKUYPOSYRQQMIE=JHGMZ\G-*$$*,)*-(""$#'.*&)%"&,,,.Af~{uslnkhgfb_\^``_`__b_bki]]dc\YWVXWWVVYXWYZYXYYYZZZZYZYXYZUQRNOMPVN>4./;KOJILSSV^fkoqqvysi_[YSE=GV\_e_XVXTT[X4"!&($%(+-/1335/-00/4=HRUNMW][_\ZVQTZ]ca_^aaa`^ca]acaa_OSr~‹¥  µ­££²±£Ÿ«²¤Ÿ®¸¨¥µ¯¡©º¶£¢²»¯£¬¶´§©·® ¦¸·ª¨½À©–°½® »µzXde`a`]a^cca]\a`VKMJKU\[ZYU]`TW…˜nanjgihbdfiigfghigfgjkihjkijnkVj¶ÙÊÆÊËËÏÐÑÑÒÔÕÐÊËÑÎÔãÛÎÕ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ '-+2M`^b`˜ÞìâäææåååççææçèçââæçææèçååèåÞßãççæçèèæææåäåéìëëëêéèçæèèççææååçèèæåææäææåæèçãâççèèèççæääååäåæçäääåååãáäåææååæççåäæçæçèàâíÅsT^WTVY[[\^```__aehjlpmfeihbZSVagg[J;ABDHB:=9?@<<>=9AA@>?BB?B?>?@>=?>@?=?>=@==@CDB?=<;97652/11/--.//*-,(*0.&$)Vvvqmnffntwuporsrqrrpstrtssupqmnosvu{xmmtrqvx}u][bgpiW]glhehmiikic__^[_\XXa^^Êͽ¹»¹¼ÄÁ½ÀÀ¶¸Ë¨q^bQQv–ž«¤¯¤­¢jLUYQPTWMNRJDEFBEGMWZH2 $%'+($&''$&*+($&&&(,+'(3BRVSVWPRG@>;8?K_b_\__^d_`hgZZde]XVY[[YYWYXVXYVTTVXZZYXVXZ\][WRQUPONLLJB2,8KOLMNNNOSZ`egjmsxuldaVI>DSXZb`]\\SOTP1"!')$"*.+-3633..0-*1=IRUNMW][\\\VMMV\__de``cbX``]^aac_RVs€¨žŽ ¶®¡¡±²¤¢¬¯Ÿž¬´«¨¬²¬ £±¶§§µºª§º° §¼²¢©·¹«¦·¼«ž°½® ºµzWde`a`\`^^aa\[a^QONHHRZ\]]UZ]RV‚’o\hjhfhiefhijihfhifdijgfjkijnlVj¹ÖÄÂÇÇÊÔÔÓÓÕÚÜÚØ×ÜÜÛßÝÙÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+303BQWRNoµæçÝáåæççæãàÞäææããææãåäåäéëãââêåãèéêåããåèèçèëéðïèêïëäéçèêçãåìëéçæåäåæçàççääâçâæèçååæçâäæççæäâìëêèæäãâåæçèèçæåãåçéêèæåäáæ³gS[XYXWX[afjjjgcekoomlklic]ZSOLLJKLJ=A@>?@AB??@CC@>>=@BA><>AA><;:;;82.0).Lab^ab^_`cchdWZeh^^]\ZXWVYXXZYVUVVWWVWYYXTTWYYZYRTUUPJNOH905BHHJLILNOPTZ_cehilmjd]PFHS[\Z^_Z^UPWJ"!###$&*-..///-0.,--3=KUTNPTVZ^\[YRPU[`^cgc__`a_`cc_]_hQSr~§¥“ž¯­¥ ¬³¡°µ§ž°º©Ÿ¥²®¤¦«°ª§´º¥›­·¯¥ª·µ©¥³¸¥¤¸¾§Ÿ°¿¬šµ´ySdd_ab`a]a]\]_a^UKKIKT[]\ZX[\RY†‘nbhhkfdkkeeiifeclkeafkkjkihkojUl½ÚÇÇÒÒÏÕÐÖÚÝáåãßÞâãáãçäÜ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*1-0>MRPM[”Õèâéççççæåääèéèçæççæçåèäåéäâæíæâåçèãåãåéêèêîîéæçèæåèæååçåäåéèèççææææãçêãåíæâèæåææææèççææææççæåååååååæçèééèçæçèèèçæäãâêè©`V`]XWXZ^ekojkjghkjhgihc\TLGEDDCACC@C@=@DCBE?@?>==<<@?>>>?>><>AB@?@C=?>=@?=?@@@AEGC<;87886332221/-+).0,&!$&(Ajzronhgpxxtsuplnoorwwuttsrstqnrwvsplosw{|{xwzxe_fmpgY\ikhijggijf_[[\W]rqh^bˆÃͽ¾ÂÄÀ¿ÂÀ¿Â½¼Æ¥m`bOPr”Ÿ­Ÿ‰š¬¨±¢jKTVNMQYOLMJJHBIPRPQRLCGGGE@:4054333445667778887>>IH===;I^caa_Z[]`]a`WYa`\]]ZWVXZWVVXWUTTQPRUVUVYWSSXYYVSRMMPOPQOH<2:INJIHLOOLKMPW\_`befdf\KFRYYYb`X[WTT=##$!!&),...022-/.,-.4?MTRKMRVZ[\[WOOV[dbba_ab^]]^aba`abPSp}¦Ÿ‘¢³¬¢ ®´¤¡²¸­¤°¶ª §³ªž¥²±¥©¸³¡¡°·© ª¶¬ ¢¸¹©¨¸¼¦˜¯¿­›µ²yTdd_bb`a]Z^a``e_RGIJNW\ZX^Z[^SY†“h[fikifejihghihgkihimkhhkihkojTlÂßÌÍÖÕÐÕÐÓÕ×ÚÜÜÚÞàáßàâÞØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)0+,:HMNPNyÉìâßëêèçæåææèççèèçèéêéìæäçäæáëçæéèêçäãäçéèéëïëèèèéèçììëéêëêæåçèèèéèçÝçéßäéàâëæåæäßâèäâàÞÞàâäßßàáãäåæãäåææåäãéçåãâááááêÞ›aY[WXWXY]bgjddccecYN[]XLDDED?CGECEC>BCB@A@@A>@A??@@>B@>=???>@>?BC@?@<;76:;;=DB@CGID>8556531010/--,--4<3$%&:auqmoihowxursnntuppssrrtusrrnmswsonmvtsvz|{xy‚k]dork\V_hhgihghgd][\]Vf„{dV[‰Ãξ½¿Á¾ÀÁ¿À»ºÆ¦l]`ORq’ž¬Ÿˆš¬¨±¢iJTYPLNXQNMKJID?9447740***)&!#"! ####$$$$'(*,,,+*,330333CU`a`^X[_a[^_\]_[Y[\[XVVVWVVWWUUUKOQPQTTSWWVUUSUYTNNRQNOOMKEBEB??;:;AIOOMMRVUVZ]_bcTIQWWZ]]VWXYR3!##&))+,,-023-.-,-.6CSXUMNU[^Z\\UNPX[d`bc_[_d^_`__`_]]PUo|Ž¦›“§·«Ÿ ­¯¥¡¬±© ©¯­£«·­Ÿ§¸¶ª«¸¸¤ ®¹¬¤°º®£§²³ª­¸¼§–­¿¯œ³¯wVdd`ab`a]_`ba``]TMMJJS[]^_Y\`UX‚h\ikijhadhhfigefgllgfhjkkigkojTk³ÏÀÁÈÅÀÂÄÃÄÆÈÈÉËÓÒÑÏÏÐÏÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+1,,9FKTVKe²èêáâáàßÝÜÛÛÝÛÚÜÜÙØÛÔÖ×ÑÒÐÎÚæçÝÜÜ×ÙÚÚÛØÕÚæîîìçääâáßÙÕ×ÔÐÐÔÏÈËÍÎËÊÊÇľÄÆÂļ·ÎéÔÃÀ¿¹·»¼»¹¸¸¹»¼¹¹»¼¾¿ÀÁÀÁÂÄÃÃÁÁÉÇÄÁÀÁÂû¿°`[VXYXWVWY[]^[XY\WF5?ILE@BB?BDFC@CEC>CC@?@@AED@>=@BCAAA?>>?@CAAC@<=B@;986:=<@@?@AA@?:7554100-,,-048:?J: #$6[ttnokhmuxurrnotuqprnpruvtrswonnjhmqxtprvzzxyyt]aomlcWVajifihggc^\]VPhdV[‰Ãο½½¿½ÁÀ¾Áú¹Æ¨m\`QTs’ž¬žˆ™¬§°¦kJU[SOPVOLPMGBB=&""/N^a_^Z\^_[\a_^]Y][YXWVUTWVVWWUUVRPQTVVUTVYVSUVTVWWWUPLLLJJNOIFB<82.222?HFCC@:BAA@=>AACA?ADA?AGDA?>=>??AB@=<>@B@@@@>>?><=<88:98876557:32120--.3457;AEHHP?$4Xuxoplilsxvqqonopppprsstvtsvqebfhkrwssttwwwwxs|zfckhlm`S[lofkiihd_]^]SiŒ}`T[„¿ÌÀ¿¾ÁÁÁÀ¾Á¹¸Æªo^bTVu”«ž‡™«§°¨lIRYRPRXLGMK>;CH&  Mab__\ZY[X\`_ZYX\ZXWWVUTTSSTUTTUSQRUXXWVXZUOQSUYY[[XSNMNPJJLNQRNGD>969?DHJKJLNLHEQ[TLRYVT\]WSN?%"# %(%(+-.0221--,-./BBAAA@=>BAACB?<=?@@?=<==><;>BC>99<;874364211001431000037BCDEHKNOLOC&#1Rt{oqnjkrxvpnqrppsrmqrprvuruqdclqpqrstuvuvwywux{tjgiingWVfmfjiijf`]^[W_ria\`…ÀÎÂÀ¾ÀÂÀÁ¾ÀÁ¹¸ÄªqadTVv–«‡˜«¦¯¦kHPUONR\J@FD78KJ(F_b^`^[YZZ]b`ZX[UVWXXWVVUSSTUTUWQSSQRVVSTWXZWTTX[ZYZXRNRJMMOTVSTQOKE@@CFEGGHLNLGJOVRIRYQSWYWSK6! ""%&((*,-/10.-,+-/0>SVWVQPW\Y[ZXUQSXZ_abca]]b___^^_```ORnzŒ¤“§º±¦¤¯±£¤²³©¡¬³¬¤ª³ª¡©µ±¥§¶´¤£²µ¬¤­·°¤¥´µ¥¥µ»¦š¬¼®ž³©tYdd_bb`a]\\]]_c\PKKIKSZZZYZ\[QX~c`hdgiffbcfgeijdchjjkkihjgfjmhSj¢º¯µ·¹¸¶³¶»¾¾¾¿ÂÁÅÉÊÇþ»€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ -3/0=KPQXTa“¿ÇÁÄÅÇÈÊÊÊÉÈÊÌÌÎÑÒÒÍÐÕÒÑÓÐÖÛÖËÏÚØÖÓØÛÛÛâììäξ°¨®ÎèæÚÜâçéèèêîñíãâéëçéêìæèïéçåçëîìéçèèèééééèèííììëëêêèéêëëêéèëìíííìêêéöàŽRPTPPPPPPONMDC=648<<;>@ABCDC??@A@BB?;AB??@@ACBAAAABC@@AA@?=<8>A><<;89:8564243102200120...05;JKLNNONNMNJ1 *Ioznqokjqxwpptsopttonqpqurotmabntsrqsttsssvxwwwzyoijghi_TZfihhijf_\\]_[[X_\X‡ÂÐÄÁ¼¿Á¿Â¿¾Àº¹Â¨pbdRSt—ª‡˜ª¦¯£jJSVMMRYI=@A6;QI&<[b]_][[\[]baZX\VVUUVWYYUTTUVUVXURQSUTUWWTUXYWWVWZZYYTQTPPIDMWZ[VRMIGFECGJJJLOPNQSVQKRWQSRTVTF0"" "$$%&)**+-//,-++-/1@WVTRMKTZWX[\VPRXY`eb]_b`\ca`__]^_]PUn{Ž¦š£µ¬¢¤±µ§§·¸ª¢­°¦ «·¬Ÿ¥±²¨¢­´¢›®¶© ª¶®£¥±°££¯·¨›­»¬ž³ªtXdd`ab`a]a^^__^ZRJLLOW\ZX[Z\\RY‚g`kihigfehifeijhgggigcemigeimhRj¦¼°´µ·¹¶µº¾¾½¿ÃÆÊÑÔÏÊÆÀº€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+2-/=KPQRGe¸êæÜåäããâââããææããææãââíçßèèàßêèææäæåèãßáçëêèÇ°¥¥¯ÏíñÞßäêèââèÛßÛÓÕàæãàãíêæëåáèèéêíîëæêèæååæèêççççççççèéêëëêéèêëìíëèåãêîݘ[SUSPPOMJGDB9744:@>8??@CCA?><=@@@DC=BBABEC@ACCB??ACBABDDCA?>SG":]e][XWX[WX^^XUYWVTVYYXUTSRTTTUWSQOPTXYWSSUTQTWTNY\VVWVWSRNHIX_Y\[XRMJJLMPPMLOSTQXYSOSVUVRUXS@(   #'(&,,++-0/.,+*./1AZZVRLJU]ZV]aXPRYY^bb``_^ab^^``_`d[RYq}“¨˜Ÿ®¤¢°²ª¦¶·©¤³µ«¢«¸®Ÿ¦¶¯¥¥±°Ÿž°µ© ¨¶²§¦±°ª«®¶«ž­»«´ªsWdd_bb`a]]`a^]`]SHKLOW\YVZX[^TY}c[jjdeiidhhgfdcfjjhgihfgigeimhRi¯Âµ¸·¹¼¹¸½¿¼»¿ÅÇÖÜÚÑÉÆÁ»€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&003BMLMMHÜéã×àßãæâáåèêæãäåääåæâäæäãâÝáèèåæåãäèæäêèæëæÅŸ›œ§ÕíæâÜÞÞÙÜáÞÅÂÈÏÑÚããÞèäèëæëéééêêêêëíéééèèçææììëêéçææìëëìììëêêêëëëëìíëôã›PGULIC;64321::::::::<<<<=====;=@BCDEB?@DADECAA@?B@@@A@<98<><9986.35300/.1/14630/53.1646DIJLOQQPOQRT? &>buropnkmsustsqkhouspuustrrvo\U^efdbfnqqronqox|ulhgekimo`QZqmfifca\bZ[\YX^^W…¾Ë¿Ä¼µ¾ÂÁ¿Äƺ´¿¢racPQx•¡­˜‚°¦®£jJTYQQUWFCF;3@PB$ 7Yb\]ZY\\ZY[]]ZWWSRVZYVSRPSY[WTTSMOSRUYVVWWUTTTTVTRVZTPVWVQKLSXZ[]\XUSPLTQRUVUVZZWWSKLSUOPQTQ;$ "#!#&)*,--,+++)/.-/9UZXUMIU_ZY[\XRTZ]\]ab^]__`__]`^Y_\OQhx¦—¦µ¥“¯³Ÿ§´µ§¢«²¬¢¨±°¨ª¸±¤¢²µ¤£¶º­¥¯¸±§©°±©¨µ¹ª›«Â®š·®rYfd^adcb\\`_\`c\QKLKLUZYXVW\ZOZ‚‚^aqg`ehedhjhedeeiggfehkhflhfkhSl®Â°¶¿»´¶¹¼¾ÂÁ¼¾ÊÌÑÏÊÌȾ¶€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ '--1=ILMFd»îçæååââãâäåààèèáàçéæççéèæèçÞßææãåæåççæãèèéí俤–£ÖñëíèééäæêçÞÚÞáßäêèèíåæîëçåäêëééìëæêëëëëìììææçèèéêêáâãâááãåßßßÞààÛÔÓÔ‡I=E>;8448<>?::::::::;<<<<===;=>??@?=DDCA?@BDBDCBABA??@@?<;;<7679732342//./12-0343211.224757CKLNQRSRQPQWG" %6[sqnqoklsusvrpolostmqsssrsun`X\_bb`dlpmnqtuwwk[YgolkiilgWUfmfhic^]`[[\YX]^V~½Êº¾½¶ºÃÀ¼¾Á¹¸Å¢racPQx•£®™ƒœ¯¤ª£jJTYRQUPEBB61@RG& 7S_]\[Z[XXY\^\WRUTTWWURPQSVWVSTVXVSRRVVQUVXYWTRRWUSX\WRQUVSLHLU\[_a^[ZXUQPSX[ZZ]ZVXXPLORPQSVN6  "#&&'***+,,,,)+,-63.ASVQKOVY[XYYUNOUW]aa``^[^_^^]`^Y`^PTo~’¦–ˆ¥·¬›¢­­¢¨²°¤¥®²ª¢©³°§¨´± ¡±°Ÿ °µ¨ ¬·«¡·¯£¥¶º­¡¬¶¦œ¹±vUfd^adbb\^^``_a]SOMHIRZ^`ZY\[OZƒ„hbjbbikgehjheeghhghfcfjjglhfkhSl¨Çº¶³²·À´¹½ÁÄÁ¾ÁÄÅÆÇÅÀº¸€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#(*,3@IM>BŠáîÞåëâäçäßâåáßãäàßãåäæèêçæêéÞÝäæãæçæçæçãæèìîß¼«¦Ÿ¬ÕîìíéêêçèêèåáàÞÙØÙÖÐÖÒÉÌÉÆ×èм»ÃÃÁÁÀ¿¿¾½¼¼¼¸¸¸¶¶µµ´¸¶µ³±¯¬ª°°®«­±¯©¦¬§~J573;855:=?@::::::::::;;<<=====??===FFD@@ACBBA@>@A@>?AC@<888977996441/.01/02021.-156.455768@MNPRTTTTPPYQ,$-Pprmrqjksvqtqssrqrqpquvtrsslb\]^adaegjkotuprrgXZhoijieim`SXjffib[]][[\YW\]U€¿Ï¾Â½ÀÀ¿½¿Âº·Â¢racPQx•©—‚ž±¨¯¤jKTZRQUPE@:11BRI'!$$7J\^\[\Z[YXY[[XUWVVVUTVYVVUTUVWVYWSUYYUSVWXVUUUUTSUWWXYXQSSNGGPZ[_ca`_]ZVVY]^\[[^XWXRKMRPPRTH/ !##%%&%+))),-.-*++-82%+IYUKRXX[XYYTOOUWacb`b`^`^\^]`_[a^PVtƒ’¤”¦µª¤¯¯¦©±­ŸŸ¯ºª¢ª³®¦§³¸£¤³°¢¤°¶¨ž©·©›£¹±¥¥²´¨ ¬·ª¡¸«rUed^acab\_Z^a_a^SLKILUWWXWU[\QX~b_jdbdffcdddefecgeedeghegkgflgRl±É·¶¾Ã¾¶¶»½ÁÇÇÂÀÊÌÈÃÀ¹¶»€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!((*:IKG.X´ëáÛæéßâæåàáææèåãäååãããäæåâçåÜÜäæåççääèéäåçííÙ¾°«ª­»ÆÇÀ¾½»¹··¶±¯®¬©¨§¦›¢§¡¡žÁÙ±“•š–›™š›žŸ¢£¤¡¡¢£¤¥¦¦²±±µ¹¹µ±ºººº»½¿Á½ÇÀI19=A=989;:9::9:9:9:9::;;<<=?<=??<;=<>>@ACBADDB@@CBA?@??<9535653464/,/241..0/0//14546645756=LNPRRSTUQOXV4$%Howltsjisvqtutpmpstsrtwrrtslb^bdfgegehmmopnlmh`^dggiieflhZQ`gddaZ\Z[[[XV[\T~¹Ê¿À¾ºÁý½¿¸¶À¢racPQx•™¦•ƒŸ´ª²¤kKUZSQURF7.*1@LG'"""*4AYaYZ\[^[YY[\ZXVWWYWVW[XWUUWYYX\WRRVVUVXUTUTSV[RRWXVXZUQPQPKGKQX\^``a]YZ[]`a`___ZXWRKLPNMPO@) % %'%%(*('),.-,.+,01-$ 7V\KMWXXXYYUPSXZa^^_]_a_^[]^__\a]NSs ’¦´«¡§¯®«¥«°§¡ª´«¢ª²¬¦ªµ³  ±²¥¤¯´ªžª¹­ž¨²±¨¦²¶©ª¾¬¸©mXdd_ab`a]]XX\^b\NKJINVZY[ZVY]QYƒ`_kggifcbcddfhhghihfcehkhkgglgQm«Ã¶¸»½º´½¿¾ÀÆÇÆÉÐ×ÓÎÍļÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*((>BCC@?@AA=;989864121/020-/230.-///./245448547846>JLOONORUSNUV9#$Cn{mstkjptrsutolmrurnqsqptto`]eifebahnmihlmdgf_\`efgggefkdSTfa]`[ZYYZ[WV[[T{¶É½¾¼»ÀÀÁ¾¾À¹µ½¢racPQx•ª™…¡³¨®¤kLUZSRVTG4''.;FF&  " /07VbYX\\[ZZ[^]YVWVVUTSTVUVWXXWY\WUROPUWTSVWSSVWVQQTVUZZSSPPOLHILUWY\cfc]bbba````[\ZXTNJJJLPN;$#$&$%(('')-.,*/,,00*$!BWPJSYUXXXTPRWX`]__^_a^^Z^^__]a^MRo~ “¥³«¤©®­ª¥¬³¨Ÿ§³¨¡­³ª¥­¹³¤¡°³¢š¤¯ª¢«»®Ÿ¦µ±¦§¶¸§—ª»£’µ¯rWcd_aa_a]__]\cg^QKJILUYZ[ZUY\RY€‚`akcdihefiieacgkhggffegiijfhmfQn°Åº¼·µ¼ÀÁÂÂÅÈÅÇÑÔÎÍÍȾ»½€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+**:@3*V¯èíêãßåçâäæâàáâäâäéçãäéâßáåããâÞåéäÝÞáãèéêæèèèçÕ·­¤¢¢·ÒÐÌÐÑÓØØ×ÚØÛÛÝááßâßÝÞßßÛÙåçÔÆÅÀµ°µ´³±°­¬ªª¤¤¢¡Ÿžœœ“›¡ Ÿ§»ÌæçççåããäÜæå©[VgR;978:;97776767776779:;<<<>=<;=<;@??AA@@B?AA><===<<;:8743310220/1231.-00.0/144348425:948BHKMMKLPUTNSW@"#>fzossnkmrtqrrsqlmsuqprqpruqa[ce`\[Zhonnkc]_fd\^ikdfehe`hiZOaa\^\YXXXYWU[\T}¾ÒÁ¿ÄÃù¾¾¿Ã»¶»¢racPQx•«™‡£¶ª°¥lLVZSRVXO>315>KE%#" 3-/PbZZZ][YWX[[YVWTRSRRTVSSUWXXXYWUTTSTTRQXXRQVUPMQUTSWZYVTQNJHILRTV[cjifhhfb_`_]\]YSQNJJILSM6! !"$%%&''*,,*),.*04*!+FRPU]ZZYXTORVV`cbbca^_`Z^_]_]`_ORn}£–¦¯§¡§®±¦©²° ›ª·¬£°°°¯¯±¥¡®³¤Ÿ­°¬¥­¸¬Ÿ¥°¨ž¤´³¦žª·£’«¨sSbd`aa]`][`^[_bZPHJJMTYVTVTX\RY}|]aj`agfeggeb`bdeihfimlgdiieinePo²¾°¸¹¸¹¶¼ÀÄÉÈÁÂÍ×À¾Å¸±¹¼€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*-1;5.7ƒÒæáéßÛáääèçàÞáãâÞáçæßàçáàãäãåäÝâçãÝßâäèåæåêéææÚÁ«š–—·çêæêèæéåàâåêèçêçâääèèçææáί’~|xjgpdefghijjgggffeedchlidiwƒµÒèèãæéèçæë´fi~Z<:878741555555555678::<<=<<<<;;<@@?=<;=?@BB?>>=;<<=;830.1//10-.11111100/.0477544436975;CHKNMJKPVTPU[I$$8[sqqrqmjovtrpqsnmrvtrstqptpb[]\YYYZfjkm_NLcgbY^knefcdeace`SYca\[XXVWXVU[\U}¿ÔÁ¾ÄĽÀ¼º½¹·¿¢racPQx•œª›‰¦¹­³¥lLV[SSV[SHCDBDNA#!5-)I^^]X[^ZVVXZZXSSTVVUUVSSSTWYXVYTPQUUUXUTTUSPPRNTWXXVUVYXTNJIKKMRVX]cggdffcbcb^`]TONKJOIMRG0"%()&'()*))))--42" "/CMX^Z[ZYTQRWW^aa__]\_aZ_`]^]^^PTn}‘¦—¤¯¦¢¥¬¯¦¦­®¤£¬²¥«²©¦¬²®¤¤¯¬ž °²ª¦¯µ¨ ©²ª¡¤°­¡«¹©˜¬¤pTac`a`]`]]_`^^`[QILKIS\]Z\Y[ZQZ|_aichkfdedbcehgdghgfheehjieineOo°Â¹À¼½¾·¾ÆÎÒÐÈÆÍÑÄÆɾ¹ÁÄ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'/9?23N§ëå×äàáäããäãáäæáãããâãäâÞÞáãâàæåÛÛãäâäåäåáâãìêåçàÒ¬‘Š§ÞéàæååëéäèáçååêèãæãæâãäãÆŠ^XSROLLOSTVY[^_adca_\ZXW[[[[[[ZYhªäìâäçââàðÄom|N976787414444444455689:;<:==::=>;><899752/-,.11.-.//00231.0423335774:65546?99=@=9<=;::97522441/1..120,-10/11./3368743664356558?FLKJJKMPRWROYY3!'OsrjnsnjoruttspoooottstomtobYXWZ^_^cdYH>CMZidV\eed\_a_\\`eWL\naUXXSX[TOUYQ¿Ò¿Á»ÂººÂ¼³¶ sf_KQt–¡¬˜‡¨¶¤¯©nOVVTXXQKHKJECG?#+8) 9Z]X\^\ZYY[]\[ZVUUVTRSQSUTSUWYWVSQRQPQTVTOPUTNQPPRW\^]RRTSNKIFFMMLSVUV\`^\aa[YVPOSQIFJJLG4"! !##%%'*)()**(*-))24&"  =X^XYXURRVZa`^_a][`]`^\]\\a[JQn–¥– ®ª¢¦¯²¬¥§­¨ ¦²¨ ¥­ª©¯²ª¡¤²± Ÿ®««¬®³¯¤¥´¬œ£²³¡š­·¤”®©sTbaaabb`^\^b_\c`OJNHFS[XXXVYZT[yrW\heghhdchfdjjeegeggfgigklggkfTn©½±¯µ·±µ­³¹¸½Áº¼Óâκ»¸¹Ã€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€0920)P«äâßàãâßßáäáÞàâáááààââáßÝáäåâáåâÚ×âåäååäçàááäæâÝÝݲ–’ƒˆ¶ÜéâæíéäååææææææææäããèÚŸ^BLMMOPQRRPUYZ[]__^\aio{‡Œ‰„~ytoljZi¡ÜæÙÜèèäëÚ§‚hG67887531/////02354444567876788889;;;:;<=9;;8678722220/.032/,.11.440.12138765545688878=EKLKKLLMPTWUQXX8 &Jnslnrmjosssrqrvskqrqrtsruq_VZ^`dga_TEBJMHXfbVZcbaga]]\[[\TFN^\XXTUUUSRZ^Zs³ÎÀ½¾¹¿»½º¾Åº¯´«s][PYu‘›¨šˆ¢²¤ª¤lPX\[\WYQKIFBFOA$+6(-Q_[Z\_][[[\ZYUUVXVSSUVVUUWXYXVURPPPPRTSSUVVSQNQTVVXZ[WUWWRMNNILQTRRTVSTVXZ^]XRLLPNHFJKME2! ! $('&))*+)')-+.53#":V\UVVTQRVZ\_^]``_a]`^\]\\a\JOk~•¨šŠž¯©œŸ¬±«£§°¨§¹°¦¬·­£ªµ­¢¥´²¡ ®­©¯µ³ª¦¯³°£¦¯®ž™¤²¤˜­¢nWeb_^`aaa^`a][`]NKPNLTYXWXVYZR]xa^efjhecacffcdghgeffdfhglkdcfcTo¦¶¥£®­±°´¶¯±¹¼ÅÊνµ³¬³Æ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€55//9}ÔëÛßèààåÞáäâÞÞàãèáãäãßÝßâÛßããâäâÙÜäåãåãáâãßàâååÞÑÔµ—‹‡˜ËêâåëçãããååååååååæÝãëÆwGILMNOPQRSOTVSXbgdieerƒˆ‹’˜ƒ}uppf_‰ÒïÞÛíèáä὇X=677764202231002422333445;746889:6:<99;<9898645660010123210-,055266326668955764477678 $Cftmnqmjouysonqtqlnprrpoqupd]__ade^LAFLIHKS``X\a^[[XWWYYVRIDIQQORUUTSRU\^Yn°ÖÌÂÃÁÀ¿¿º¼Àµ±¿ŸrkjTPmž¥™Œ¤®¢¬¤nPVYXYVXOIIIFIOC$+4+(Kb_Z]^][[\][ZWUUTSRUYVSPQTUTQTTPMNOPSVXXURRTUQSVVUTWZ[WX\XRQRKGLSOOSSRQUVSVWONIILKFFIKLC.  #" &*)&*+-,)'*.-380 # !7SZVVVSPPTX[`_[_a`_]`^\]\\a_NSn“¡’Šœ«¦œ¡«­¡¤­¯¤Ÿ§±¡›©¸¯¡¥®«ž¡°®Ÿ©¬¤§±¶ª¡ª´¬ ©·´¢ž¬·ªŸ± mZaaabcc`]\_^Y[a]SJLLLQWWUXQVYNW{u[akcbacdfbdfdegehfhhghihjjdafbRmž¯Ÿ˜Ÿ«§¤¡¡¡ ¬¸·ºÅµ¯¨¢²Ç€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*5213Z¯åæÜåêÝÝåáÚàããâàÞáãäáßàããßÝÝßßÞãäÝØâäáââàâãßáäãèáÏËÁ¢‰Œƒ±ÝååáâåææååååååååèÛåë´aDVMNNPQRSSVXRLRbe^_bcrŠ‰Œ–‰„~wtunazÀïëàèéääéÔ•U:77654200.//0/12401233333755665555:;88<;7677654331/-0463110244101//25358796677568458=AEFFLJKRTRQSY[WY[F"$=_uompmjnutpoppqqpqpprprttnhc``c_SHEFJLIGIMY]Z]^YUXYXWZ\THAHLLHFKSPTUSRURJY«ÁÉÇÂÀ¼¿¼ÀÁ´±Â¥secMOr›¥¥‘Š§«œ±£oQVWQTWaRFGJJKNB$,2*$(A[^Y]ZYY[^`_]XUSUVUUVXSPRVVTRUTPMMOQVVVUTSUWXVUTUTUX\WRUZYUPMPGEKPTSOTTVTQQPJNJIJIEEHLL>*"! $('&()*)'&(+-69,! #6S[XXWSPORV^ca]^`^]]`^\]\\a\LRo€”¡‘ž«¦£¬«ž¥¯«¥¦Ÿ›§´­¨­³¬ž¡±¯Ÿž©­¨¡©¹¯¦³©ž¬¶®›ž°¸©¢ºªoVdb``aaa`^b_[]aZRMJHKQZ]XZTYZLYuXbkcdffefeehgfefccceegijgiefidQi•¥šš ¦›”––™ž¯º²®¹¹®£›¥ÁÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#84+?†×ìáãæãÞàãàâãâàáààâàßÞßâåâÝáÜÝÝÝââØÑáçàßáâåàßäæãçæ×ÂÁ®‡ÃåîàâçæêääääääääëàéÞ™Q@PNNOPQSST[\VMR`faells‰’ŽŽ’–•‰~xwvq_i§åêÚÛâããéÛ›T7875310//-,,-//000112333266433565878:;988666543332.-142/-12685/.0-.476686898679988:=AEGHHMJKQWVSQZ[XZ`M)$7YsomonikstusnjotttrqpoprqmfbaddWD>IMGEJLIIRVVXYVSZWUWZXMBCIKHJJJMMNRTPF@@HP^y¤É;¾ÂÀ¿À´³Ä¤sfcPSu™§ªŽ¥­š±¦pRY\TU[]PGIMLJK>#/0"#"0LYWYWWY[_`_]ZVUVWUUUYVTVXWWWXWTPQRUZ_VQUYVUVUSSSSSW\YTTY\[VMRNGGRVNGNSSQRRNNQMKJHEEFKJ9$ !!!%&&&((''()*),66(! 8U]WXWTQQTX_b`]__]^]`^\]\\a`MQk|’¢”‰ °¨š ¬®¥£¨¦™™¥«ž˜£¬¤œ£¬ª› °­žž©­©¤©¶ª›§³©©¶°žœ­±”²«uYdb``aaa`^ba^ab[RMIHKRZ]YWV\WL^†vX^hdifdfdbcefdefhgecddfggiggleRj–ž”—››’‘”˜™£«¤¤¡©¨¡›¥¼Â€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6,)g¿ëçàæáÛáåßÜÛÛÚÝàßÜÞÞÛÜàáÞÞáÝØÛßßãàÔÕäçàßãâáÞàãåãææá¿´«˜Š“¥ÔîéæäãêääääääääéåìЃLGNNOPQRSTTXYUR\sƒ‰„‡w}†ŠŒš›Ž}uqov^\™ßèÔØÛßÞâÔ•O48741/...10./00/.001122235532488687789987764321252/0430/1145323203668<;779;;88;<:===>@CEHOMKMQVVTZ[X\bU1$1Rpnlonhhptuvtpprpruvurrrsmede^SJCFFFHJKJJIMPRSUVWUUY^VG?ACIKIJKKKLGJVR=5@IQPNQQMORPLIGEEFIG4  #" "')&'*))(*-,+.51$!;W^TUUSRSW\\_^]``_a]`^\]\\aaNRl}Ÿ‰ž­¤™ ªª¡¡¨¥™ž«­œ•¢°¡™¬¤–ž®¨š¨®£¤±µ¦š¤¶° ¦¶¸£˜¬±›­§s[aaabcc`]]_``ad]TJJJMRVWWTQWZP[{nU`ibfe`ahddfdegfdeefggfgjkfeieSlŽ”Šˆ‡‡ˆ‹Œ—Ÿ—•”œž šš¨®€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(.O¥æêáàâÝÛááÜÜÞÝÛÜßÞÞáâÜÚÞàßßâßØÚÝÝáâØÕâäÞáäâàßàßàäââæз§žŒˆ„ŽªÑêêããçääääääääâæîÆsKSTOOPQRTTUURUeœª­˜“Œ€uz‰‘’™–ˆ{spxc[ÜëØÛââáãÎO99730.---.../////00//0122.03676417764688564320/14211221366640021/5756:978;;;:;<===>><;<@DFLQQSVUQX][Zc]9"+Jmmlopgdmvsrrpprroqootvtsnda^PCBFGFEGKMKGKMRWXY[\[^a[L>KWXf‚¨¸½»¼±¤£‡ZPQKR\`}xlz„~‡ˆdMQWVWZ\TLG<0-10#41'% 2IUWUVX[^^[YVWZ]\XVWYUTVVRSVVWTPPPSXRVYWUUTSPMNQQNQWWOMPSVUQIIFA>=>@JOQPOONMPNKGEEFGFD/ " !! %&%%()('(**(25,! #=W\TUURPQUY[a`[^b`_]`^\]\\aYIPm€”¢’‰©¡˜¡©¥˜Ÿ¬¨™Ÿ­ª” ¬Œš°¢– ±©š ­²£¥±¶ªŸ¤­« ¤±³£ž«±¢·§mTeb_^`aaaa`a`_`\QKMKNVXWZXSW\V[vjYek`fid_defc``cddghikieehiedicQj…†Š‰Š‡…‰ˆŠ›¤™•ž˜–•–§´€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%>‡ÒíßäßÞßáÞÙÚàááàááÛÖØÝáåäàÞàãâÛÝàÜàáØÐàæàÞÞàäáàÚÜäàÝæÞ¤£›‹’„ƒ®áêäæåääääääääÜäî¾eCQROOPQSTUUVR]‚¬À¹ª¢˜–wuˆ•Ž”—Ž~trqf[†ÕîÜÚãÞÝßÀG7973/-,,-/010.---0/.../12236752368534655642231//2430..13452012124768969===;:==<=@>ABA=!&Ejllopgbjutrompplrupknppum^SLGEGFIFEGHHJMKOX`b`__b`TCWZWWVRNMPT\ecZ\b`[]`^\]\\a^LPj|‘¢“†ž­£–©¨›ªª˜—§­™” «˜¦ž“Ÿ°¥—Ÿ­°§£¥«§¡©´«¦²¯ž°°›·§oZbaaabb`^a]^_\`^SKKEHUZX\XZYSPa~mUcmbb_`gdhdbghdeegeefdbccfdfjcNf™‘’–˜–‘”—–£Ÿ«®£›š›§±€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)f¾ðìáæåÞÚÛÚ×ÙßáÞÜáåÞ×ÙÛâãàÞÞÞáßÚÛÝÜÛÚØÒâæÞÜÞÞßÜÚÛáâÞÜÞçÖº¡™›—Š~ƒ­Ýíæäçâßááàãçàãï¹`CNRPT[WYXPXUPÀÖÈ»À«¤™–wq„—Ž˜ŸŽ~xpxu`€ÓðÝÜßÞßäÉz;563/./110210...../////023666566663432321241/010/0.*-102773001145358:==>?@@?==>@BDEFDJOU[VSXS[eceeF#%:dqjfrlajtsswuppqrqtsmouukWFBDIHAHEDGIJMQMNYaacd_TLC><<@DKMRSH97?GHFTcS;9C=:BJFGRRU[VMME1/=A?@BEKKFFKKFEIB?AJTXYZRLHGC<9;-%&5-#$##5CMPPRVWY`[TUYYZ[WWVTSRRRROMNNKJNQSQQSTSSUVPLMLKOUTRQSVVSNFED>59EMNORURNOTSGHEEHAEK; !#" "$&''&'&%$),*+12) ## ! -DX^RUWPPRPT^b_Z]_^__``][\^_aOTn|Ž‡ž«¢™œ£§ ¤¬¥—™§¬ž“¤²Ž›¦¡–¢³©—¬®¥¤­¯¤Ÿ§­­£¦¶°žœ¬±–¶§lV`ba_`ca\ba`^ae^ONLHJT[[ZZZZRH`|kXdhbficeiebadggfigeffeefjiikn^Th–Ÿ–“˜“”›žŸ›ž¦£ž¡¡¥¨¦ž˜œ¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .Z–¾ÊÓàæäÞÛÝàÝ×ÝÞÚØÚÜÜÞÜÜÚÚÝÞÝàÞÛÚÛÜÝÜÚÕÝÞÜÝÞßâßãäáÜÛÝàáæШ“š™Œ…„ˆªÏàåãâåçåáâæâãë°T==?BCCC=>?ACEEFHJKNUVVYX[a_`dM%!$7`oieoj_fpyvrspoqnlpusqtwgL=CEBELEDFIJKKMONS^ecVGA?@DEDCDKNOROB64<@COa\C47ADB@=@IMGHLLJ<&)7<;>ACIICAFKIC?<:=FORUVTSPKF@:7@80-+(')'&'%! !&+/1467/42&&1+!"" !&):GPQRTX\VPNPPPPOSOKKNQRQUNJKJKNNONPSUTSTWRPQOKKOTRSXYUOMH>:921?LQRSTQNMNLGF@@C>EK: !"! !"$%&&&&&'%'*).1.#"$ !0JZZVVSLNTQU\]]_`\]fa^YY\``^aNTqƒ•ŸŒ‹Ÿª¡™ž¥§ §£˜œ©¬¡š¢©™Œ˜ª¡‘˜©¡‘–¥­  ±³ š¦µ«›ž¯«›®®™™»ªjScbbccbaa^]^`abZMNMJLRUUUWY\XK`zjYdlfdfccehhdbeebbhkhccegeeehl^Ti—ž•‘”•œœ §¥ £ ©¨ žŸœ›€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&/;Ka~”µÒèãÚÚÞÜÝÙ×ÖØÜßÜØÛÜÝÛÖÕÛÞÛÝßÝÚÚØØÜÝÝÞßßâÚàáÚÖÚßáÛâÛÁ¨›—”‚ˆ†ƒ‰œ»ØèâßâåäãäÞãïµ[F[eNT^\_\RXg¦âñèáÜÑƹ«ª¥Žvo—›œ’}oqo]yÇæ×ÕØÔÖÛ½q9373102321321//.///00-/45234566544652132/.0--031.,.//14335324547998::;>?=>@@@ACEED=?ACEFFFGIJLTXWW[Y^^]eU,"3[mkeni^cruttqlnottqopopsfMCIIABHDFGGHJJJJLMPTNC<<@E?ABBDD?987;BHKOS_gmidb_ZYQKJJGGJ69>5'(-(6@FEFJJFIRSIA>7-,(!'4-$!$:NPMRXXSPLMPPOQSPNNPRQPROPOLMQTPOQRRQPQRNLMMKMPPNQVUMIID97<85<;:;?EDCCDDCB?ADGHHGGGKLLQWYXZW]b`gZ/ .Uloink`aupospjmposqnpqptiREJHB@CFGFCDHKJFMKEA;;B@>>???AFGDJNLSYS?57FWd[C7<<:66F_zq]G<<>>?DFLRTROQRQLJB>CCCOL4!##"##%&(&%&&(**/GSL0!)K]VPUVOMPPW[ZSPUXVVXUUY[[[\]OUmzŸ‘ˆœª¤›Ÿ¤¢›ž¦£šžª­—’¢ª—Ÿ§šŽ›°§”›­«›©°¢™ ­¢›¥²¯ ™¦°¢Ÿ¶ŸfYcbbb`^^a^]_^]]ZRILKKRYYXTRWYN`~t[dle`dfhcdccfifaeddggeegddein`Wm—‘’•“˜œœž¢¦¦§«­«­°ª£žœ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!(*)*.1;Ha„¬ËÜààÙÖØÜÜÙ×ÚÞÝÙØ××ÙÝàÞØØÝàÞÎÑÚàÝÜÞÝáßßááÝÛÜÜÛÞâÝÅ¥Ž—’‡‚„€†Ž¡¾ÔÛÚÞæäæë¬TBPQNT^\`^U[šèóàìçº¶º¶‘cp•£ ¤–{rgh\s¸ÜÕÒÔÌÏÒ°i;87544653122210.--/02430/021111122010/0/./--.00//0243352/152368;;89==;;:;@EDCCEEDCCDGHJJJJKNOLKS[_ZX^daf]5)Lhqjnka_msnknmnpnqpqsmmulM@@@CHPHFKLLWdXD;?OdcJ7:96=Os–•i?7?9(-7859;:;==946<91101578;@CLYafhhglfaa`]\]dabdirmXO]bYXekg`\TJB=>A8CLMJHD>@50/.,+(%#  "?PHGPPMONORMHJKLLKJKNPWVVRKJOQRRPMLLLMNMNNMIGFIKNNKIIKE?@EGHGDKT[YURPMJIB?@>GXK/ ##""#%()$%)*,+).G\eN-"'@[YOTWNMOPX^SHJPLJOQLJKLIIKRITm|¡‘‰š§‘˜¤¥—¦£—›©­•£ª”Œ›£Ÿ™¬¡•©¦œ§«Ÿ™ ®¥œ¢¯­Ÿ•ª±Ÿ˜´¢iUcdb_]_`_[]_\Z]ZQGJGENXYTWSXZQ`zmWdlffgbdfgfbadffbcfhfbchfffim^TiŽ’ŽŽ’”—”“•””—šš¢ž› ˜–¦€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"(+*'&'/08G[z§ÌáßßÛÕØØÑÏØÛÙ××ØÛÝÜÓÒÙÖÓÜÕÍÓßÞÚÜÝØÙÞâÝÖ×ÝÛÙØÜáÙ¾£˜˜€}}~ƒ}|ƒ”§µÀÇÇÔä¬WERNOT[Y\]U^¢åòêíè×»¬¶¹µ¹¿ og¥§¨—|shj^r°ÕÐÌÉÀÄɤc;:765677415433222210154/-/-.01221000-.00.-,+,/2333332331/153589;;99:9:>??ABABDGIIHHIIJKMMNLORPLPZ^[\]a_daA %Aaojjja[dopnnnomnqpnomnvjO>@DFGHCEFFGIIINPMF?:DKHRMAGRWXc^WIDU^P@KTeƒ“‰xw\9.73#/6539;87/9DD8-.60+).368;<@DL[jleb]\_a`_a`_UVdbQI^kpg`cfcT]a[WYVOHGHJJIHJSga?.43%'$ ?98<>;=>?CCBCFFFHJLLLPNLLLORTQLMPMNTXV_[__bgR$"!6]rlknf]cjkormkknmmopnothPCGFACHFCCFHHKPOKKIA@C@BBCCA@EKPLONFLXXSZ`VEIX[cghmvwomeP85;0! +3218;87748CF;.''!%,1358BGHRdjefa_aa^]^[^TWjbLHO\b\TUWV```_\[]_VMHLPMFBWiiP8001&" ""!CaSJTTICDD??CCCFIIHHKONSXUNMPPLONKIKNPLPTWXWTRUPNPPORXTUTMJNL@D<8=CDDDDECHPoŽ„E#! #$$$$%%&&)(*)))-8=H\g^M6 4RWNTVMJMQ[VB-+0,)/2--6<:7667823653441130.10/2+*.0../++****++,/2676544011357889<;9::;>A>@DEACHHGILMLNQQQRRPNPTVRNPQNQ[Z^X^^^fY- ,Yrkhnh\`kpooonmlppmmprvkPDGBADBEDCDHJJJJLJECCCACA?>@DFFLJMVUFGZQT][E@U]lld^bbZTZQ?100+()45-.6947::++(%#!!!!GjYMOOJC;8:?A@GIIFFIJHLGPYSJJKHMOMNTXYQRTQMPSQQUUQSWWUWWSNLLJGFD@=<>CGKMO\e}—„F!%!!!%&$%))%#)&%&)49>;E]^QI3 >XZSQQNINTP;1**,+)*.,**.4;?G[mp|™ ‰‚—¦ž–¤¯¨ž¥«¨¡ž¤«¢˜¥­—ž«‘‡”¨Ÿ”§ª›§«¢ž£®§•›³¨“›¬¬œ¯›mXSTTUUTRRQNOPNNNJIAFNTTQUVSVXN`zjPafba]]d[X[__^^]_`aaaabceecbg[Qg‚’˜¡¦¡ŸœŸ¢¤¦¦¦¥£« ›¡Ž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%&"#'&$%)++.560-4:DZ€¬Ì×ØÔÎÑÙÙÓÐÐÐÑÓ×ÛÞàÞÛÙØÙÚÛàààáàáááßÛÚßÞÚÚÞßßÜÕÅ­’w~ˆ…z|y~rXMRVd`b][YS]¡çîäæм°¡œ”Žƒˆ”„e}¢ÀÀ¦…qrjjv|xxrppxtS9==<98677875542221042/00.-0/12-,,*-+)((+.16300220-/255458;9;::;<<@A@BFEBBEFGILMNPSSTSRQRRRROMOPLNW[]X_^]e[0 ,Snlhok\cmrppommnpnlnpppoZMGAAFFDEEFGIJLHKJD??AB?@A@?BFJKFFS]TGELLPWOENW_aZRRQMKKH:-***+-*,028:516:FLKKJHIKKJEGIMRNJMQSSQQTSPOPQONSYZY^^XUUSOVXWRMLKIEDCCBCEFJRRVWq{A%"""$%&&('&$*()()49>;@LLPS=$+JWQUSQMLPI6##%''%&(''&&'*-/7@JQb‚”Ž…š§ž“ž¦™¡§¤œ™ ¨Ÿš§ª”‹›§“Š—ª¡Ž’£¥–”£©ž—œ¬¥”›³«—«¬˜™¯šiUUTTSSSSSSNOPNNMHA>DJRWTWVSVWM`{j[hkc^VQT[ZXXZXY^ZWX\YUYcddegjZSp•£¡£°¸¸­¸¶³±³¸½ÀÅÓÝÈ›„š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&% !#"!('.LhpqrO48Jg‡±ÎáÛÔØÜØÙØ×Ö×ØÚÛÜÛÛÚÛÝßàÛÛÜÜÞÞßßßÛÙÙ×ÑÐÑÖÖÖÓÉ·¢”Œ†ƒ€}v„yfbgVQg~pkc[WSU“Ýôìä˸­¡“Š‡€‹•g~¥Á¼tieeimkkmkiiqpQ79<;97777742474211/2/+,//.,)*+,./,%'+.23339730..131477558;:;::>??AA@AABDHKKKLNOOQSTTRPRSRMRQOQSOOV\\X_`]d_7 *Hhngnn]]ionnonmimlkoqpqpdVKDCFHDFHGGGKNILLD==BEADFB=;BIGIPW\^R?DGPZREKRQPHCFF?CCLdmkjigfecbfbei`LBBCA>?IUZYPEA@@?=C^XI=;:Pm~‹”£¤–‘›£š£ª§ž›£«ž©«•Œ›¨œŒ“¤›‰‘¥¨•“§®¡˜ª¢’™²¬šœ¬®—–°šeRWVSRQRSTROPPMLKG>>DHQYWVVSVVM`{jVbfb`XQTPVY\_[X\Y]ZQPXaeddgkmYUw¢«§ª°°µ¶µ´´¸¼¿¾¼ÎáÚª€˜£€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$#! !)/&H£Ú×ÑáÝ®a1.CWi—ÆÚ×ÓÓÔ×ÖÔÒÏÎÌÌÐÐÎÍËÊÉÉÃÃÁÀ¾½¼»À¾»º¶³±±³´±¬¥¡¡¢“‘™|y|oVT_QU~šmd[ZXQ}ÉïéÚǸª •z”qk–¾ÏÄ }tihdcejjghfdmnR75::98777775551/00*,,++-,++))**,,,*,/23432320,*+05666789::;<:;@A@ABCCCCEHJMNOPPPQSVVUUVVRNQRQSTPOT\[Y_`]bb@ %=dqejo`]hnmmmkjiopnnnnpngZOIDBEEFGHGIKNLOLD>@DH@CEC=:0*$ ,9;=979:99:>KK9%$+28?EC@?CGNZfYKFFGC>BHB5.26=IDXukJ5)/$" -Znf_XWOB7872;NRLILMKJJOMLLMPRPMNNQSUTRZZ]^^`ca]_^VNNRTQUWSNKHFFEEFGHHHOROU]xŒo2$ ###$"#((&%('++-).@G=9;EEDP\H.$!*JZVSQRQE4)&#$!!$$!$$$$$%%%))+/2=O^t‘¥šŒ™§¤•ž¤¢š˜ž§Ÿœ¨®›Ž›¬ˆŽ¤›ˆ§ª–•ª³¥› ©¢“™®«š™°²™—²œdRZWTQPQTVRPQQLJJHBAGJQXUUUTVULa}k[egdaVLMYZZXVVX]ZYVUUZ`eeefjl[Uu–›•—–Œ–™™šŸ¥¨¨¥ÄÒ¹ˆ˜œŒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!!"""$*.<áÛÆÎÑÌ©oD76H\…±Çú¸¹¸¸¶µ²±°²±°®­ª¨§ŸŸ  ¡¢¢¢Ÿ ¡ ¡¢£¢ª««§£¡£¥“‘¦¿¹œ„xkbSOSSmš¥‰rh_\\SgªÕÒŽ·©™—›‹}‰‡iw²ÖÓÃyrokhggfhkhfckoV:4888887767542011--++,+))*,.0-+)+/001010003/,+.1228889::;:==<'+1/2<>D^ovxywspqstovvZ;7A?=@GOVajaQKMOMKRWPD@A=EUpŠŒŒœ§Ÿ“™Ÿ˜—œ¢š•Ÿª–ª”‚«§¢¥”“¦­¡™ž«¤™›«¨™–±³œš³œhT\YVSRSUVUPOPNMKEDAFKRVSTUTVTKa~kXbedcYPSMOW[WY^\]YVVWYahggfej]Tl…xtyzzuy‡‹‹‹“¥ ‘€ŠŸ‘h€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!#%%$&).##Y¢· «œ ©š|Z<>EUq’ª©ž£¤¦¨¨¨§¦¢££¤¢¡ž›œŸ ¡¢£    žŸ™˜–’Œ‡ox– yjic]WTd‰¨Ÿype\]XX‰·Ãº¸´¨›‘˜–Šƒui‡¾Úη”toekmhdglptpjpt[<3678888666311252+0+*-+*,.+,+,//./,.0210-+210013559;=<:9;=<>=>AA?ACDDEGJNROQRRRSTTXWUVSQRUNQQPQOMPY[Z[]]_eS'/Yrfdjd[gnoppnmkonmoqpqocXPHBBEGECEILKKMMHC@BDCFB@B@>AGOUIDV]W[cNG[[F=>53..3204-33387/*,)$!#5779<;78;85MLKKKJJLKRSWZPPebba`][^b^[[]\\]\^^b^SPTTTUUSRSPKPLGFHKLMMKL`ly{V$!#!"!###$'''&''*(%(@[\C>76BD@LM;6-,HUINXS@."!+.-(#"##! !#%!((&')-5?BYyˆ‘’‘”–—–—šœ“•ž—‰œŽ‚¤ ‘Ÿ“’ž£œ™ž¦£›œ¤¢—”©ª™›­šlW][YVUUVVXOKNQSNC?=CIPVSUTTVSJblV`ddcYSYTQY\V[b\V]YMKYcdfgdch]Rh~tu{}†ŒŒ—¢£›¡©ž‹}‡™’rV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#'*'$'&&# @ˆ®Ÿœ§¦œ¡ª‘fAEEKf‹›˜•–˜šš™—–˜˜—•‘Œˆ…ƒ‚€~{ywvtwuomnmhkgb`_]ZWUMR\ZWY\`[[VVo‘Ÿœ“{qj]^\Skš¸¸²®§¡‹‹‘Ž}mv•¶ÔÕ¹tkdmogcgkirngms]=156789765:40/011,-*,/.-/.,,*+22-,0010/-,++.00/16;:=?>;:;>:=>?AA@BEDHLMKLORTUSSTUTUUUTSQQRQTRPQPORW[[X[^_dZ+ +Qnlfga\hononkioqnkmnmnof_UGCFEEDEEGIKKKLKEAACCB>>AB@DLRaR?GRT][ECZX=9C>ADIKC;DIINWaf]OMQSV`t‰•›’|pv~yŠ•l7''"  >eja`UJ==@IG40BTVWTQQSTV]]_^LGZebbb`\\_\XZ^^]\ZXW]\RPTRSVVSRSSQQMIIKLKIPMM_o~yH "# !""$&%&((&%*($*Hd]H?<47BBFNB1+KTNQUF-"!"# &1:<72/+*)'%"! '%()'*,2APbz…‡……‡ŒŽŽŒ‘‘‰†‰…‚‡‰‰ŽŽ”Ž“”’”š•—”“–”Ž™˜‘–¤”oY^]\ZYWVVWOLORSOF<=CGOXVUTUVRIb€lU_ccaWT][Y]^Y]a[Y\\XWZafeedei[RmŠ‰‚ŠŽ‰–¨¨ª«ª¨©¬¯‡{|‘™|`\€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ %*-($&$$#-a‹„‹…ˆˆzqePCM]jyˆpqqqnjfcbccc`\XVUUVWXZ[[RVUONQPKJKLKJKOTJNXZTRUROOTSXv”› –vlk___UW€¨­§¦¨Ÿ‹ˆˆ‚rm‹ ¥Áί†rkkedklfejsogls]=====<<7<>?AAADECFLNLNTNQRQQSTSQUWWVUROORPMNMMPU[[VY^^d^."*Jkpid^\hppqqnmkonjjlnqmjh\HEICCDFFFGJLINOIBADFC??BA>BKSXTJDBHSP;B_\KPVY``XLEQfsiVLQSLFJDD@775*&&$ !,563:JG/$/84055:IOFFECA?>=;26:;A@BJPV]cVLMQQR\q…šš‰pjwzp{k3'&" AgkbTEFA>=FJ:3APVZWUX]`Z^cf_NJVb__ceb``a[[__^^^[Y^^USWUPUVROPSTTNGDFIJJNHBTlw;$$ !!%&$%)(%$+)$+Nh[K>C;2=EHJF-+MRRTM7 %/316BLLIG>>=:5/)%%'$$%+-.4:D_y‚…~‚‰‹†—”‹‹Œ…|v~ƒ}yƒ…x†……„ƒ…Š…ŠŠˆ‰ˆ†‡‹Š‰’œqZ^^^][YWUSPQRPPPL=AGGNZXSTUVRIc€lXbec^SP[XY[[[_`[^XX^^Z]fcbeikXSt‘’ŠŽ––›¤ž›¡ª©œwžy[^a€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"$%)*''"$$ &?ZgVVVWWXYYX[SEG[jmpdRSb`UTQRSTTSRQFHLOPOLKOOOOONMLKJJLLKLMNTVPLMONVLOSUlŽ£—~rtfTW]Tcƒ•™Ÿ¥–‡{~yivš¨»¹˜{qmlhhllhhlnqjks_?26554332253223111.-,,-.--//00.,,//.-,---,3213;CEB@@>=<<<<9?A??@ACFFHLNNQUTSQOQUWWSVXWVUTRRQPOONNNPYZW[^^^b>"Eklgmb_hrojlllqmjkkijlllbUMGDHDIIDFMOLOIKLD@DFE@AFD?DPX]\ZSBATS<O[NHJLMKF<5JL30:;;;BINU[[QEGNONWlwŽš“…xsvxksc5%/" Fc^ODBFDACGC:=JZ\]YUX]^X\cbVKNX_cb`a`\Z][Z[^_]ZZ\`]USVUTRTVTUWUPJDEGHKNKMRUe|g3"" %&"'&'&'&'&&')'5XfTHRSA.-8>FE2/LNKN;&"*/:KQOKDAENVVUTSQLFA5,%%&$"#))-16BZomd_gomimwyww|~|{}xv‰‰€|‡ŽŒ‹ŽŽŠ‚‹‡€ƒ„‡†ˆv^aed`\[ZWTSWUMORL@@AISTSVTVWNIdyfYacb_UQYXZYWX[`c\[`_XZbegfbblaUkŠ‰Ž‘–’”“š‹z}|‘ˆ]RbW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!#$)+'&#"! #1FTLLKLMOPQNW]WKELVcvoYW_ZORSSSQOMKGHKMNNMLRQONLLLMJKMPQPPPNRSOMOPNPJLOQb‚š¡œ‡uqgYU\RWj{‡ŽŽ„}xtpwŠ›ž¯¼®ulimjjmmjjmmpklsaB3444433331563/111/0110/..,,.0/-,-1/../00//5<@DEB=;<>?@?>=;??@AABFGHKOOOOQQSTTTUWWVUSRTWVSPQSTSPMKNY]XY\]`dD"=dlimc\erpkmlkljilmnnpnpk^QIFGFGHHHJLNLJLJA>CEFDDEDAGOXagibOENO?AS^^adeeinrz}ptu|ˆY:DGFEECCGB=950*''+*3?=0.7@?<@DABK@07<:98=DIS[^LBEJKLSdqx„‚rccgew„f7"&'!$$(ANJHGDBLIHHB=CPY[ZY[^\Y[^a_WPQU]ca]]]]^_^\ZYYXY[Z\[TQRQTRTUSTVTTNIIIIJLKOQTfv[+"" !%&#&'&'&'&'&(&&=_gXIU[M5-03@HQRPSTUVOIcygT^cc`TNU^XW[\[\^\[Z\]\`ifecdk]SkŠ†‚ƒ„~‚~{ysr}‰‘›sW]VU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!!#*,'$# "%->QJJKLPSWXW[_^VH=9@_tpeZTTXXXVTPMKKJHGIMRUPPOOQSVXJLOPQRRPMOOLORRMOONPRZw™›xmjd[]YY\fw~tmns}“Ÿ—ž³µœ€oihgeeggeegimikrcE42233444424530.143320.--..,*,--.0../////05>EGECA?>??@?><;===?BBCHHKNOPPQPQSTSSUVWRW[ZXVTRUTSQPOOONX\XX[^`gM!" 4\kileXaqrlmljljkmnmmloroaOGFEJFEIKIJMHJKE<<@AACGHFDEGKWafcRCCJFKXaddcbdhqywrszƒ‰œ‹ZABEFHGCDMJGEDA>=>FBAC@:>HFFEEHC?ATJGHHIKICMXD.3:;;;AFINSSJCEFHLTarŒ‘ŠtcbxqwvX4%'&%3;9@CKTVSTTSUQJbyiZbdb_VR[`YU[a`^_]YW[_ZZcgddgiYQm‰voqvvsnplht‡†uŠ˜{[\WYo€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ "*-'"# !'.AVPPNOPSVXXWTU\`UD4=UszhXW]]]\YVSQGFDDEIMOQQQQQQQQLNMKLOPONNLLPUSNMRPQTSj“—›”}kmoh^ad``o~~towˆ•œ“¢¯¦ŠwlfiffegffefdgegnbG51113344552011015//./010/.++-//..-./.,.48@FIEBABBCA?=<<=>>><>BDFJJMONNRTTQRRQSUUSWWUTSUTSTSRQOOMMPVYWY^_]iV( !.VkiieV^orlmmkmllnnljhrxxiTKJHMFDJMKIKNQOF@BDABBCDEEIMDKPRTPKLOPT[_`_]eeiu{pm{ˆŒŽŠƒd8)1455634:A>=?@ADHGGILJGHLGMOMLKOYRFAEGHF@-9[bKDB<@AGMORUSNKLKNX`jpˆ–€na_c[[YF0&##93/,,4ANSU_ipmaUJC4*"#').33K^U>9?CB?CGEDHJHJJJIJLMRRRPPQSTPSTRNNPQLNPPLLPRKNPQUXWSRKKNLOL@;>AIRTQQTPURJazjV`cb`UOW[YWZ]WWb`ZZ^][]bb_cij[Wt—„|~„xv}yxyszšŒe]ZLd…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !*,'""!!&+:NMKJIKOSVTUSQV]]YH?AUmwlYRSSSROMKCDFHHGFEFHLNPONMRSOHHNRPOONLQVUOIQOOSM]ƒ˜›–ƒokqrccecbo…‰’™š’‘š¨¦“}rg`dccdbccdc^`^`f`I600123344110.1440210000.-/,*,.-,-0/..07@GEHHEBB@>@?=<<>@BABA@FIKMLOQOPRUTOQSTUVTQSUWWYYXTTRPMLLMNOUYWX^`]h]1+QkhfeU[lqjlmkklnoqpnlv}{hSLMMIHIJKJKKOROJNWXTRNLLLKNTUYXWZZXX`^]]^]_ce`_gh_nŒƒeG813.1/,./--,+-00.-.-/3565567<<;@BDIC::@B=5+.+@JCCEB87;?AEJIJIIDDKMQgol`YTPPGDIJ<-$.FN@./FPJKOLGPLIB:?JOT\YV_^YZ`\[]\WVX]aa^`_ZYZYXXYZZZ\ZZ[XQPUWUWXUVXUPMMNLHGIJPO[p_5!!"#$$%&'&'&'&'&)%*6JbiZHO``M>3#!1&>L52OPLJLJLSZLBBB;7973-((,49;H\jlfdf[J6)"#)1->QPD<5915;6488:;<CDCACGHGKNRQNLPURPNPUUQNYUT]mvl]RDBIMPMC;?AGQTQQSOUSIa{kV`cb`UOWYX\[NEJTZ[\ZYZ`efbfjhZVoŒ†{tx~|tkqkflp|“ŒbgcP_{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !)+&#!!%,,4HRPMLLPTW[ROSSMOWQPPOP]kkbbcca_]\OLIFEFGIFHKORTUVSWTKKTWTQSRPQVUQLSRTXRYt•›˜Šxmnuriffjx†‹‡”–’“’–¤¨—tl`Z\]__]]__][[YY_^M911122223.//1231////.--.00,**++,/..05BB@DHJKNQSSRRQPQTVUUVVURUWVTTUUTQMJIKNQLT[YV[`_d`;(HhjecTXkqjklkegijlnliu€zeTLJKDJMLIILMLNJIT`b_d`^`_]^bhhgeeedcca_``]]ce\WZWWq–‡hRD=A@;9768:93//30..,**+'--,/1./1/7A@:1)05;73536--1669<:67<:BEKRNIKMFD@;BLMRZYW[\Y[^Z[_^WUX\_[WYZWVSVYYWVWX[\[[YSRVYWXYVWXVNLLLJGGJILO`mT-"!!$%$%'&'&'&'&'&%.33EVSJRcbNF>,#+%!184DQNNJABLRQG@@@>;;4542-)'&%(3FT^hrrhZJ8("$("*=>;:<>=;;:9;>><>B?CDCGIJLQZ_XOJ>>GKOLC=ACGPUTSQNVSGa}lZbdb_VR[ZY^TBGL?>OTQVYY`eaefdZVhqi_Y]cdagaWZt‘{d[[TVw‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"')%$ *2,3LTQNKKNSV^ROX]Y[blpymJ>YvŒŒŒŠˆ…‚€ƒ|rf\VRQ`\UNJHIIJRTOQZ[TSWXSRTUSRVVY^ZZf†•˜„uovzrnor~‰‰ƒ‡‰‹—›˜ƒrkc\ZZ^aa^^aa^[ZVTZ^R>222211110..11/.0,-/.-,++---//-.105>@A?CBA?>===CGHHKKMQPQSTSPPPSUVTSUWWXXWUVVSOMNPQQONLLS[YU[a_`aD!"=engaRVkrjjkhjlllmonku…j]QGHDHLKKLMMOPIFOVVUZXUUW[_bc`]\]`dh^aaad`\^b\]`\]kz[JC>;=?GCFEDEEDFFDDEEBABDBCGE=873;<:<>==627@A>:41?KA8747018>?@A=;:>FQQQXZWUVZ][Y[__ZVUZ^\XYYXYY[[YVUWZUWUTVTQSYWXYVVXUKIIIHEGLIIObgH&# !%&$%('&'&'&'&#+5/"%6@@Nc_KJI6)*1'0CLLLKEAKSPOKD>=><8@;64651-+(&*4CQZfglpeK1"'(*$6s¤§ˆƒ‘™†€Ž—ƒz|‡ƒtsufbliXPV^RKLNHA=CE@;=:694;?>>BDE9;ELMPM@<@?BKRRRONWRFbkT^cc`TNUZ][H>SYTXVSVXW]^__\htqpuz{{|‰‰–«¯˜qR\hNOo‚Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ "#'(%%$ )1'/Mbbdiq|‡’‘“˜ž¢¢Ÿ„T?Skffeb_ZVTX^hqvvtrkaRC:78:>KRPT\[QTZ[VRSTTQSTY^\XZvŽ–’Žszuuwut|ƒ€zz‡“‘‘Ž†rhe][^]Z^^ZZ^^Z]ZURX_UB3322100/32.,,//.-,,-.0001//0/038;BIJGEHLHHE@>@A@CA><<>ACBEGJKIJPQPQSRPQUSTTTUWVTUWXVTSRPLNPRRQONNRXXV]b\\`I!#4bri`QUktljjehiihjmli~‹z]SKELHFFINQNKNOIELQRSQTSPPSRNRQTWURQQOSQORPLLKFHGCFHB=?@=HQHAJLLKIDCJFDEGHFFHHDEJG=67=A>=GNNMK>8;=><607LNB>7154685563:6635=?BEOPLMOOQXUXR9$ %.;826O]UKGLUK<799DOOQTWXX[ZVYY[^_]WQRZ]ZYWVWTUWXXYYZVXTSWVQPXVWXUUWTQOMLHEGLJFOca? $ !&'$$)&'&'&'&'&/3.'$(02F`\GJO>+;A'9NNJLFBFGJPTJBA?;;@85236886;91&#+6;NKThulTA% &',U‰œ‚—ž†~“£Ž‚‹£ ‹«¢Œ‹¡¡‰ŸŒ€…ŽŠ}tŠokqgN>GD=77;946?JKHPQE>BABLTUTNOXREckYacb_UQYW_YD9?JOL[a__cdf\Z]YYZUZ``gv…š¤§²¯œ_TejTO`‚‘~t€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ %#""$)"/65AUp‡ «§š’”š¨´²¨›Œjb]UHAEJEBGK@558.4?LTUPKD>758=><>KVXVWWUPTVUW[YRRSTTSRQP]}’†y~ttvy{|†‰‡Œ‘‹Šˆslkb]d_QXX\Y_c\^RWWQSa[C63+,52*/-11--00-/.'050867424;@CHMLNNHHJIGFHF?>BABA;9?BACCDFILMNNPQQRSSSRSSTUVVWYVSSUURONNPQPPPOMLRXWVX[[bhO$!2Wmh`VReqliihflojhklj}{`EFGAAKNNJIKLKPNJGNX[XQVZZXVVXTUXXURPLRONLJKJFF=9999::AGMLJNPB87855873JbRDF;9;;:;?A@C=;<>EJJMZ[]XR\\UQXQ5%%!! )' 5[`PJLTUK>98>JNNMMSVSV[YWW[ZTTUPTZ]ZXXXUWXWVWXWUXWVWYXTQTTVWUTUTMIIKIEFKJFVdO-!" !$%$$'$$&(&##'&/.'&*+-9J_\NOH5<9EPZ[YZYWSWYZ]a_YWWXXWVTSWiƒŒ‹‡zustz‚„†‹ˆ†‚ztkg`S[g^ccgbafelcee``kjY=3,-3872/.-,+,.16BIW[X_^SJEKPOPUMKMMHGIHHFCABA?>?==>>BEFEHKNOPQRQONQUVQMRTUVWWVUVSOLNRROORTRPOLJOTWVUW[]]fV,!.QljaOSfngjmkdgjkkmprl\KCA?@FEIKJJNPPOOKGHNPNPQPOQVWUXYZZXXXXWXVSRSRPQMLLFEO[bjkr~uYGPRMILKIMPJGJLKJJJHFFB>=@?ACHLJGKI=578657:6G\SJOI=>>?DJKHAAEIEEKP[hqkb_]]Thw_0%% "!5Y\NJOTSG?>; ,LSKLNHDDDITKHFCA@>;>>?@;8;A@CO\]UB..,(-B]mohV8*)'Aqwnnsronlmlpvslnx€vt~€yw~‚}v|†x{Œ}œ†UGPONLFAACKNLIJMJD;@BEOTSQQQUNHfiW`cdaTNVVWSE88:59BA==>?><>A?@CDGGEHJLMMOQTUSPQTVVUY[YTSVVSQPPSSSSUSRPMLOPOMSWYXY[^Ycc@">dpcOQdnjhggjedhihjobMGIBBHEEHJKLNOPMOMHDDDCEFJKFBISNOPUXQFBFDIMOVZT]fg_WVapt|‰‰v^LAFFFILKHIDFJLKGC@B??CDB?>@BDIMJHKD:0---/20'1SYBIUULIPUUUVTUUUVVTPUVY[[YXY\WTUXWTRYWUUVVUTWVWXUTRNJIIJIFFIGNaZ2"%$##&'&')(''(%#$(22.*(# #-M^_LFSE5C>#2RNPMNJDCGJLPHCFF?>HLLMNMKMRRPPMHKNKJH@3')9J\hnfJ*3Zjikjgkqpqssrtwuqtz{wy‚|w€zsqqrpsszpTGRNMPOKKOOQQMLPMB>@?CMRRTQMQOId|hUde]ZVRTVSPI?>@?98666:=??==A@A?>?DHIFHKJDF^|„vtldx€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"%!"  #'6>;9:788BDBQ\PGY_[U?(!%(*$"(&$!$)))*(%')'&'-1004997?@CFGKNKHKH@8455799:>NUG>?AEGDB@>;=;>?>?BADLPW[[ef]d`B% &&"?[ZQX_]QABID;?ISXNIOVUUWVTVWUWWQTWY[[[ZYSVYXWVUUWUTSTTTSUSUWVUSOJIJJHFFHEP_P*##%#$''&')(&&'%#%*0.+*)$$,-4F_TGTL887$3QOMPOMHBBJPKNKE@95;A?ACDCFKLHKNLJKJNPOG:016>O\ikI.7SONOQWZVWXZ[\\\\_dfceikhkrvqnrtpmorxxiVNQOPRQLJKJLPMIMMD>?>CMQQTQOSNFa|lY_`a^QMXRNNKD@BA<==::;AEHEDEG9:axncYQIDBEGHOd€Šqvodv–‹\€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$%###!!%3:5..39?B@?EFFIIINLKJJMPSTNRVVTSUXTUTPOPPNORTUVWTPRQONOQOLNQUXWX\b`adL .Xn`HUikfggghiihhkmmXHADEBDHDFIMNMOQQNKIIIFDHJJHHJHCMW\[TGBMQ@BPRUUJ^”µ°©ª¬²¯«§¬³«‘zUIJNIJKDFJKGCDHKHECFGFGIPRRTVQLOOMJIIJIHMKBCC833-4::7777448=?EJIKRQ[[Vflo|mB###C_]U[a]PCBHD=AHPVPKPWVSUYUWWSVYSPU[]\[[ZUXZVSTVWTVWVTSTUUSUWVURMMLJHEDEGCT\C!#$'%%''%$&'%%&&%(-0*$&(#%06%-RUEMPA2)$9SOINRL>>PP>7MN>::4/1//3457:;56;9:?A@CEFC=3+-9BK[f\KNIJNNOPLNOPSROOSQRSTRQRUPRVVV]^W``_``YSTQOMKJJIGEFMPJKKD;=>FPQOQRQVOEboV^bc`SLUTOOSMFB??AA@=?DIIJHEL??rœƒ~xoe`[]gxˆ~cmxiy¤]Y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"#!$$"" *---'-@LHFFGILMU_F&%& &#(,+(&!&&)(#$''(%%(/3310.1421>PPLKNNLMPSPQVXTQQPQSUWXXWQX]WTf{ƒ}{{{wutppqniihaYm€u^t­Ì¯‡ŠŒ™¢¦™š¡¤ £¦¢¢¢¡œ—’˜¢¡¤§§¦¦¥¤¢¦£–¦Œi\NKPMKMMJJFDFDAADBBBBCCBBFHHHHKONNNOOOQRTTUVXXVTRQONNOQRSUVUVWURMOPOPQQPPRUWWVZ__`eT)*Rk]NZjhadfhgjkjijll[IAFEBEIDEINOMNQRNKJKKKJKIIIFDHOU\]XPA?NSDBNUPJH`‡Ÿ¢§¨§­¤ª©©®¯·È£^FUNLVRUXYVVZ]]YXYZXUTVVWWXZTORQQQPQPNLKF;95*)+-4;<===;A?CGFGKKJSWUXboswfM7(!#Da`V[`[NCCIE>BHNTRLMSTRTVVYYVVVRSV[^]YXXXVTSTVWWTVXXVTTVVTUWWUQKHIJIHGFFGWS3$%'%%'&$$&%$$&&&*0/(#%% &8E3(8IHGLH4#ARNKMQB(/QR14KJ97;5.-**,.-.051354574232/39817,/7;IYY>:>EDCFIKKMONLLNONPRPLNSUQSSQSSJKOQSVQNSVSNOYaZMKDHLHHKF<<>FPQORQRVNFe€kRae_\VOQUPSWQGCBGD@<;?FKMOOFLD>f|smpz|wmlsvljv€~f¬œeO[€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ "# $-*(*#(@SHDP[XRVO+9D2)53,-0,*,-&'+)"#)*&,48854361145:Phkecghfgknjlruropmnqtvwxx|z{|}€{tngbchfabd`\[ZQ[pqgy£Ç½“ˆŒ™›—¡ ¢Ÿ›¡¤ž˜›£¡›¢©¡¢  ¤¤¡¢¥ ¨§Ž¡‹l[OJKJMOIJKFDGE@ADFCADDBEIGIJGILKLORRQPQRTUUUUTTSONOPQRSUTTTUSPQTMQSOLMPRPRWZXUW[\_gZ/(Oi\OWeifeeidgjjiikmXGADADJIFFJOOLLPQNKLMOPQPQQMHGKOLQPONDCQRHBNYNELg•¢Ÿ¤£¢§¤¤¦š˜¬¥wbiiehicddbdeb\[XVSNJLPOQQTVQMOKKIGEEDB8=86433.39>ACDA=@?DF@BTeSNTRYd_aZ[N7%$ "DaaVZ]YLCCJF?AGNUTLHNRRVVYYVUTTUWUW\^ZY[XVVXXUSRSTUVUTSRSQSVWWSMLLKHEEEFMXJ'&$$"#&'%&($##%&',2*'&)'"0IMH.!L\ih\V]\RNRRLBIC>CB@GA63985796789;;;:==@DC@CJJEINMQSLJOOQVSR[\YWc{‡sWKBFOLJIB>=?;76637?@>?==A:8CECIJIMV`b[S@?DJMOJ@9=@FPSPPPPQKHdxcU```]QNTVOQH?bZQ`jieccghhhkigkhWJGFEHGFKHHMRSOLMNKIMONMOQQRUWZ`^`bcgnrrty~ƒ†‡‡†z{xpnpnijje]WWTQRQPONMLLKJIJLNMLMKKKIFGJMEDNSOKMJKLMMKJH=93/-,*)').6989<@DJOPNLLPQX_]\hzƒlE% "I`[TZ]VHCCHH?=ELQRSOKRWTUVXWUVVTUTX[ZY[[YZZYWVVVTTSSTSRPRPPTSNJJKMJFDEEFNK3! &$&$#%&&'(($$&'.2-"#("!>YWDR`D#8PGJ:!%FOIVM18@5FWC/88422.-1//641Fbs†€y†’‡z‹™}‹œ•ƒ‹š—‹Š””…†’–~~ˆ}ry…zjemk\W`cXOPRLEEE>=>;89:<86:@B?;69AHKMI@8;>EPTRSRRSMJfzdXbaa]OLQRUVD7FQOPPQQQRUWU[[[VLPdmdYV]ebZ[aZ`pij‰ÂÏŽQ__Na€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ #"!""!)2+%-#4rŠ]t¡ŒH"2TF3/563521/-,,,,*)'$%)06987544442230J¶©›ž¡£¦©¨¥£¦«°±­¥žŸž ¢¡ž ¥­¨£¡£¢ œœœšœœ¢œŽ‰ƒ~ƒv‚¨Õíà±¼½¥‹’’‰–Ÿ£¤¢¡£¢ž•˜œœ›œž¡žŸ¢¡¡¡Ÿ¡ª¥–™ž‘bHFHGIGFHIDADECB@ADGIIHGJJLPPNOQSUUVVVURONMKMPSSRRUUQRUUVTVXTSTQPQRQOMNPNPTWVSY``X^bG8[ZTdmidcdfeffihgjfTHGFFGDCEDDHPUSNKNMLPTUVUWVVWUUY^`abdghfeeffa\Z\]YVWYXXY\]\XX[\YWVVUTTSSTUXZ[WRNTQNLHEGKQCBS^WOOPOMID?;820....--.-3@EB@B>EHGHLMISRW^`^epjO6(! $G_]U[[VLFEGF@@HMOQXSFLWTSUYYWWVRUSX^]ZZ[\\\[ZXVTWVUUTSRPPQSTTSSSNLIFFHIINA) !$$#%&$%&()'%$$(01)%&"1VfXCOfY((JID>,1LQKUA.=6RlP8:6<21./2127:6G]k{ƒyqoqk`htrgn{wim{~uu‡}|Ž“ƒŽš‘„‹š—…ˆž ‹‡–œ‘…Š•Š{{…‚oo{d@;B>977998;>DGHLMG<>?DMQPQPPRKHdxbV```]PNTQSS?7ITQ[]``^[XWYVTVWVY^pw}}ƒ…„ƒŠŒ—¹ÞÌ‚W_]L[~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"!! $.5///>™a‡Ã{+WM2-4026,********)&$'-6;>:86424567706_”¤—–—š §ª§£§¥¢¢¢¢ ž–••—”‘•‘“—šš•‘ˆ‡…‡‡ŠŒƒƒ‚~yvvxryŽ»ÙÒ¹´·¬Œ†Š“š £¡Ÿ Ÿœ•˜››šš›ž™š¡¤¢¡£¢¥®¤•¢£…QEHKGHGGDFDBDEBAEDDFJMLLLJMSSPRWUUUTSRPONNMOQTSRUSPQTQPURNQSORURQQQPOONONORVWWY]_X\eP%2S\WdjhghfdcdehghjeQGFD>;5406=?DPA?OYRHFCCBA?<989876530///4<>:79)2JQQS8'@@PnlM83=3101212697DXct~xyjcc``dbbafg`bkm\^kpffpsslnwunp{|os‡‰zw„‹‹”…‹¡¥‰ˆ¤‚D8C@=9779:FGIHGMNG;<=BLQRTOOQKGcv`T__`]QOUWTRB5:BFPSX[^`bdheff__^X[fw„‰“¦ºÄÁÓÙÐÜßÀ€^[bMMrŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!! ! (:/#.3 E˜‡h˜ACF-34220+(()*++*('$'-4;=<:87533467:26S~•”Œ‡Œ’”‘ŽŽŠ†ƒ„…………ƒ‚‚~xx{||~‡‹Žƒ‚‚†…ƒ†ƒ€‚€|wqlnnq†—• ´¸³´–‹“› žœœœ™™šœš™˜šœ›—š¡¦¥¥§¦¥¬¨¢«™gCEHFFECDBFFCEDDDGHJIJKPSMPSSRSTTVUSQNMLLLOSTTSTUSSRRUTPQTSVURVZTQQQPPNOOLOTWYWXZ^Y\dX-+L]]aeilhdefggiijkdQHG?3*#"!(17AJPPNPKB?>@DADB@EHJKKNTWY\afhmoorurkjlcWZgg[^_\URPMHLLKIHGFECBA?ACGIHFFFDBCFKDCMVSMJEGIJIEA>973/,*++)-268940*++***-./6CLPOPPQRMIdv^Vaaa]PMSONMA762259=ACDFGJOVTJN]eillkjkf_[accb[X^dYNL`ƒ„d€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"215/+",h¢w]‚j/7>0-/0,'*+$'&$$%'*,:;=;9789777765327AdŠ–‡ƒ†|€‚€|{|zyxzzxvonquutw|wxyyyxxx{vwy}ytvtonprq^^d^ZVh ½µ¹µ–†Šˆ”žœžš›œšš›Ÿ¢¤£¡¡¥ª¬ª§§ª°¶¯„LFHC@CFEBDGEBEGHIKJJLPQPNVPNQQMMQNMNPPPRVWSRSUSRQUTTSQUWSRTVUUVURQQQPONOOPRUXYYXW^`[^_<!;UfiheecbcaddfgjjaN>70/5:>?91+).;GMLFBDFEEFDCGLHFJLJJMMJHIMGHQSOPWV^^VVbkkpsspnnkgdcb`_]\[VVUQMKKLIFDB?=?CHKNOMF?:531/.../147899;<:@JSWWWYYXY[\]aeddefkrx{uN%#!.Tc^Z_YPHDFIFBFMLIQUNFIRVUVXXVWXVSTY]\[ZYWXYYXXYZYXWVVTRQVVVTPMMNLFGFCFID1! !"&##)&%%&%%%%%$*1*#%,")')-+&%()&$#'.6;=:8788658999740.LmŠ›¡”„‚…ƒ„‡†ƒ†€€€‚ƒ‚{|{|}{wx|y{|}||}~ƒ‘ˆ‡‰€}€ytuxyncf]^]c™°¯±¹¢†Œ‹†“žŸžŸ¡¡˜š›šš¢§©©¥¡£ª¬©¥®®¦­°ˆRCA@@ACFBEHFFJLJIIKLMLMNPONMNOPOMNNPQQOPTSRSUSPORTQOSXTQTTTSSUTTUSPNOQQOLPTXYWVXZ^bZ\`@!5Plgcee``hfhghhji^I:68>EEEDDB;.',7LKC;;<<>BB?@DFFHKJLOOOU]`dmx~€…Š‡‚…‰‰…€tvslfb\USRPNKIGFACEDB@ABC?:8547=><97545712468:;<>?@@@BFIHIQ^da_bbcda]^djlmkgfkqtwP."!!/We]Z`YOEAFJGBFLLHNWQCHUVTVXXVWXVUSW\[XY[\YWWYZYWUTTTUUTSRNPUSKIMIFGFCIH=-!$$%!%(#!$&$$%%$%-1' '9KH@NULIC:+,75* .J:,01;==<<85:=9844ALHDFJDHMJILJLMPQMMONRPJFMROJFMPORUTRWUZ`]_fjfmhentoknoqqpptxrttpmsskgoqwzcHEEEGIJIFCFMQMJNJ=7;>EOQNNPQSNJcu]Wbaa]PMRUUTJB>9<6654358:>;:<=<<@?<>EJLOTWZVW_\TUJGMftebw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ " !+<3-,2)6uk_rgA4,&*(%$$#$&)''+39<:==<=<?>@GE>CNMJKPPIJOOMHLPLLOOLLJJNNLMNQPPTURQVVY^a``cljkonklqoutswnUBNOKGJIINHHKNNOKA<<=DMNMPPMPKJgu^Raa_ZNMRRPRNF?8:<;9524;BCBDC;6@MWPJIHEDE?@CFHHGECUnud\{¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!$0:50.2-!%6IXe`S:$''()(%$%($)18;<:9;;;:987676;;/2Y„‘ŽŠ›¬š€‚†ƒƒ~{y{zxwurqnkkostwy}ƒ…†‡‰••‘‹…„~~}yuszysqtŽ¨­±ÃÛ‰š¨°´¬•—šž¡¤¦¨¦¦ª°³±­±°²µ¯³±’fQCA>>BBGGHHIJJJKMNNLMPSNQSQONPQQRSSQQRSQPQQPORUUUUTSTVWXUTSQSTSSSRPOOONORVXXXYZ[^\adN'.Rnrh`acc\bfgfdllY@>FIFIHDGQRNJ7'-HJFHNLIFMMLMQSSU[XTSSUUTVUSSQMIFLKKLKIGHGEDFEBBE?ABBBCCBEDCDEFDBHGDCBCCDDDGGBBEECEFHHDBDCDFFFFGHFDM\```_```aabeikkkjgirzoA# " 5\dYX]SJIECFGACKMKLQMACOUPUXYXXWUSUXYVXYWYYXXWWWWWUSTUTRRSSSSPLKKJHFEFI@/"!"$$##$##$&&&$#%%//)/:FLNF?CFB>AB=-$.6/!&)(,/787@CD?;8/.982266215759<9<@?ADBBEFEFIKKLMMMOLNOPRSQPQQQRQOMMNNOQQQRTTWXXXVOLKMHEHGCBGGIJJKI@9;>FOPLMPMPJJgu^U`^][QMPPPVTKA8:888768>DADFKH8Bf{pfdd_WRTNGCFLQS_qt\S{­Â€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&7:66761,$2LQXX7!*%)'! &&!/5;<:778<:7558;==78=Kn“‘Ž‡ˆ‘…„‹ˆ‡‡‡„ƒ„ƒ‚†Š…}zspqtuu|†}‚…‰‹Œ‰‘–“‘‘Ž‰‹‡„†Š‹†ŒŠƒˆŒŽ›¯®´Ê²‰„Ž‹—§ª¥¦§žžž¡¥§¨¨ª§¦¨««§£¢¤¢£ ¡¦›ŒpUE>AFFEFGHIJKLLLMNOOPPNRUSQRRQQRTTTSUVRPPRTSQOSTTTTSTUUUTRQSVUWRNORROLQTXYXWXY\_]]dV0)Mpre[]`dc`eggfljT==?@A5&&/1'!! ##(+.114@B=>;<:69932<916844668:=?AAABFIKKLMJLMNNNNLSSSQQQQONMPPMMRTONGFT\WOGEGGGJH@9;>FPOLMOMPJIhv]U`^][QMPRRVOE=9=<=;879>BBCDKI><978968:;;9756=Tq‰˜—Œ‰‡…ƒ‚†……†‰‹ˆ„„ˆƒ‚ƒymllsz~||€†…†‡ˆ‰ŠŠŠŠŽŽ‹ŠŒŠŠ‘‰‰‰†‡‹‰‰¨«°Ê½“ŒŒŠ’šˆ’ •’‘““‘ŽŒ‰‡‡‰Š‰ˆŒ“š¦©­ …`B?EDBCDFGIJKJJKNQQMJMQSSRRRQVUTTTTSRPRUVURQPRSTTSTUVSTTTTVVUSQQRQOPSQTWYXWWY\`][c`;$Ffia`b^bjc_aihgdV>=@?>5&!+)&($!&(*--7AKJ2 &$%).;RZO5+Dah|Šyqvwkbhh]R^]OGJIC=::=;>>;647;746678;=?@@@CEEEHMLJQOQSQUWSZ[W`v~lZDCFHIKIA;<OixqmlkjmrqmhghjkjladŽÄΠp€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#"0<<787585,&%$IvW#$)(*(&*5AFB@=<=;8587555689So‹™–‹Šˆ„†…‚…ŠŒŠ„ƒ†‰ˆƒƒ|uw{‡‰ˆŒŠƒŒ‹‹ŠŠ‰‰‰ŽŒ‹‹‰†‰ŽŽŽ‹‡…Šƒ„Š„†“—ª·Á rtvmmpkflqkheeffc`achpzƒˆ‹˜š’—žœŸ¡¢ž€WCBB@ABCFGHIIJLNPOLJNORTTRRSUTSSTTTSOQSSSSTTSTTSSSUWVUUVYWUSSQQRQOORORVWXWXY]`^ZcfE >Yffghbbif^_ijfdX@<@CEIGHNHKLSK>LcQABFDGFABA@A@@ABCCCCCCDDEEDFGFCHFFFFDDEIFGIJGFFGIIGGGHGJHHIKKJHKJIFDCDEEEBBGFDCAEEDFGEBEDCBDFHIGBFTbc_][_ccfhhdhgknhcod2"!$C\^UTVQQNHDHKDCKOOKJHHKOPQQRTVVVVVTSRSVYWSTUVVUTSRPQSUTRQNQQLIIIGFCBDE;,"!$#!"&'%&')(&%%%#4QYOA@A?>=0#"*! /1& %'%)(.AWV;! %%';Yg[7Ah|”‚ƒ•›‰“…‰”ˆwŠ€sqwsgdih]VZ\QIKKDA@CA;8;<:88;<:7?<::>DFBEGFNbfXI>?EJKMI?<<=CMNMPNMQHHhv[Raa_ZNMRNTR=5BKNFKMKKMLJFDKOG>J\d]VSSU]fec`]\\^`[~¬ÜëµqX€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#!)7::6:6244/-!#Vƒ[!$8#&+9WsviaZPKIHDA@=;>@CEGMMJOQPI?D_TGFGEFFCFGEDBCFHGEEEEFFGHFDDGFDDCCEEEFHFEDFGGFEHHFFHKKIJJJJJJIHJJIGDDFHFBBEFHHDBEDCFHHGDDEFGGECECES`b^_\^aegigdiikmihs^/#&HbaVTRNOKGCHLEBHKPPONLLORSRRTTSRRQRTURUVUUUTSRRSSSSTUUTSTOPOKHHHHEDBEB5&"###!"%''()('$$'*BtrL?AAJE==A>:=DA?;8;3"&%&0/,#!'$*3B\[; "*,(9YlZWg|Ž„uŒ–ƒyŠ”‡|„•|‰™…Œš˜‚Ž”‰‰ƒ}‚„zpowtgckd[UVVOIHMH<9><798857>A?A:=CIJKF<9;>FOPLMMMQGGhv[U`^][QMPPUP:4HSWX^`][ZUNKNNRRFPr‰wttstvpomihp~‰´¿ÒæÓŒY^€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! !/8899798448:#,o’Z"$<,+Fxšžšœš”‹ƒ~}}~vvx|„Ž—””–šš”’—‹Ž’“’‘‘ŽŽŽŠ‰ŠŽ‹’”’‘Ž‘‰‰‰‰’‘‘‘‹Ž”˜™——˜ŽŽ’’Ž‰…‚„zƒ˜”’¨¸·‹NFICGLJHKMKNPRTVY[cgmqsrpnsuu~†Š‰~›½º“gLDDEEFGGGJLNLJILOONOQRSTTQRSSRRSTRVXWUUUUVWWVVUUVUVTTWVTURSRONNNMNQVWXXYZ^_`^dkQ& -PjkejiaYbddffibI9C@=98>=1" 1@A%-,/EXX6'#+%+?QfnhqŠ‚~—‰€Ž–Œ„ˆ’Œ‡‘‡y~}~•‰€Œ—‹†“–‡ˆ™™ˆ‡–•‡‚‹Ž…„‡{jlt[???<8:<417=?DHIJE;9;>FPOLMLNQGFhvZU`^][QMPSTM84AJLV`impsnfZ_[[\U]w•–Ÿ­·¼¾À¶¼¾º´¸ÇÕßäçÎYQe€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"'156;8+1<7366#1‰¦\$!/)Wˆœ™’‰“—šš—•–˜š˜—••–—˜•’”‘‰“–’Œ’ŽŒŽŽ‹‰“’•Ž’“–™ˆ‹ŒŠˆ†…†‡‡‡ŒŽ‹‰Š‹†}u|{~†oy–Žž¶½‹IIWKIQRRVYRVZ\\^bfafnv~…‹Ž–˜–—”•šbt¾¶hOHHHHHHHHIIJJJJJJLNNMORSRRQQRSTTSSSRQRVWURSUVUTTTTWVTUTQRRSQOOQQOOSVXXXYZ^^`_dkS* (Wg_Ybea^`bcede[@6=EFHKGHIPNJJGB=DOMJKHEEGJJIIHHJHFDEGHFCGDCEGGGIIGFGFEFHGFFFEDFIGHIIIJHEJIIIJJIHHFEEDC@>?BBABAADECBEGDBDCEGFDB@@CCEQ_`]a_]^eihghgiiggmu{U,!"  .R[ZUXUQQJDGOMBBKOOQQQRRPQOMNRTSQPQPQRRUURUTRQRSUVWTSTUTSSUQOMIDDGEFEE>,!%%! #$$&+('%&(*)(3k™€M;::;?<;B1  8F=$ #!(58BZM4#%,,;Yqpr‰|†–Ž‰“™‘Œ”‘—›”‰”—‰‹–“„™‰‚‹Ž‘—˜…„˜œŠ†”˜‰¦–„•£v@8D917?95=CCFHHIF<<<=DMNMPLNQFFhvZRaa_ZNMRPOK<4866FLPQZgnmlopkdb^Z_bkx„’¤³ÂÑßàÙ×áìäàÌWYfT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$-/-/2-..58464,>ƒ«m-3Ddƒ—•’‹‹Ž‘’‘’”—–””–˜•’’–—“”˜¢›”’”•“–””••““•‘Œ“™“‘–”–—‹Œˆ‚„‚ƒ„ƒ„‡‘š£ „™““ˆƒ~~ymuvŠ‡us”¤”“°¹†QIPQSRRRVXXUUXYXY^ahr{‚„ƒ‚‚‚uwwrvoSk©Ç±˜wOKMKFFIF?BEHJKKLMNLNNKMSTQQTURSWWUWVSRSUUSUSRTSQRVUSSVUVXUSPNOQPMLNTXWXZYZ]`^Zf^.)Ne][b^bc`babg`K98EGDHJHJOSOJLI?9EONLMKIGGHHIIIIIIFFGGDCEEFGHHGFECEGGFEEEFFFIKHDDGIJJIIIJHFIMJFHKGGHFBBEF@CDDEEDABBDGGGEBAACECDGFDFDK]b^`_^`effjonefmcfxsG& # $ =[]VXZTQPHCFOPFBINONQSQRRPQSUTRQRTSRRTUSTWPRUUSPOOUQPSTSSVOQNHDEGFDCFA/""# "%&&'),&!-'#)%)C~˜ŒY4>6<@?=A@=?>==8:<:A9" 3HA5! #$ +=FLC+%#!-6Hcloˆ”€•—Ž‰˜‰‘—‘‰•’‹‹‘’ŒŽ““Œ”šˆ™–ŒŒ–•Œ‹•š‘Š’›”Šš•ˆ‘vB5@???=9:89COOMQLOSEGktXV_^^ZLJPOPKC=:859;>?@ELRV[SMXgmnnj^Yadbgv€Ž™¡©´¼°’lW[bZK€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(-+(,0/-,48455.3„ Z@hŠ”¡¡™™š™›’”–™››››Ÿ› ¡ žš›žŸœœ ¡˜—˜˜–“’”–™™˜–•–•š–•—““–’Œˆxy|€}„Š›®¹®—™˜’ˆyyukktƒ‹‰zu¥•Ž®¾„FCOOOLIHJLNJJNPQUZijkhfgkpdebkor{uu‹´Á®œ~WKLF;35=DLIGGIKMMJIKLJMRSQRRTUVUVWWWWVUSSVRPPRTTSVVSRTUUVTSPNORQNNRVXXWWXZ]^\Ye`5%Ea_\^[`a]abbaVC7CKHCEFFKJPMHIJA9BMKHIHIJIJKJGFFFGEEGGEEFDDDEFGHHGGGGFFGHGFDEHGEFHIIJJJIIJGGIHHJJHHIGCBCBCBBBAAABA@BEDCDEDDB@@ADFDFCK[a]__aehhghiogiofj{tC% # &!#Fa[WXWRRPGDGQTGAJSNNRSQQSQQSUUUUVXVSQTVVVVSSTUUTRQRUUQPSUSQOKHGHFDDDE>,!"#!$%&(*-(")*)\‡–aC><=;B?>:;<9A:$!"0F?:5 #'/9GI;(! ,-:Xkr‡‘ƒ•”Œ‰‘—Œ‡–‘‰–“”•Ž•–ˆ…Ž•‡š–ŒŒ––ŒŒ•œ”•ž– šŒ”žvA5??@>:9AKIHHFFKG;99:BMQNOJMSGJnrUV`^^ZLJPNOH=9<:4679;=@ABCACDCKYb`fffifbea`_bfhge`Z]hfXRV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$.-'%)/2-*38456,F‘ƒQt¤° ¥¤¢§¦¤¦Ÿ¡£¤¤¤£¢ Ÿ £¥£¡¤¢¢¥¦¤¤¦¡Ÿ›š™˜—–••–——™š™“•š˜˜—’Ž’‹†{qosw{yvw~…³ÖÝÇ«›—Š†|tsqicq„ŒŒy ™Ž§¾ˆGAEFGFEFIKMKNTYZ^chlppoqy}{}††ˆˆƒ¤¾·¤—€_GGE>3.5>@@ACFGGFKKNNLJKJMQQQUTRSTPNPQOOPQORSQRUTRTUTVVTRQRRQRQNJKRTUXVTW[\\ZWdc?!<^e`^[`a^acc`RB?@BGDFDIX^]^_cghhiihmgiogm{o<# ! !% .SfYYYTPSQFEFQTH@JTPPQRPQTTRSTUVWXXSRSTUSTUUUVUUTSRVTRQSTSPPMJJJGEDEFD7' "$$%&&&&'((%'),$%EyŠ“—k7:C2).<=$ /1%'35?A6*$%(#.Pmw‡†”‘ˆˆ•‡…Ž•Š—”Ž–——˜‹ˆ‘˜Š“œ•ŒŒ––ŒŒ–””ž–—Š”ŸwD;E=7;CFHIIKLGFJE58;>9;8558;<;B?BA9=EBBJPU]][]fjnnkiiknie\IDd€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*3-'&(,4-)39567%V~dcž®›¢§¥¤¥¢ §§§¨¨§¥£¢ž¡£¢  ¢¥¤££¥¥¥¥¦£¡ž™–”•–•“”™™–”–”‘“—•••ŽŽ‹‰†~tostspmntz†µåõã¿¡•‹‡‚zpqpjao„‘ƒ|”š”¡´ŽTDKMOPQTW[_^afgdceorvwvwy{xsw{tsvmp¨Â¯˜‹{dJFFHE=9::>BEFFGHHHIKIIIHKOQQRQQTRPMNNNNOPNNPQRRPVVSRSTSSTSPMLNMKKPSTUTSU[[YWVadI3Yfb_^`^___a`TFB@DCEGGHMOONMKF>:@KLJKHFEGHHHFFGHFFFFFFFFDEFGGFDCEEEFHGECIHGHIGEGHHHIJJIHEGJJFGHGGEFGEEEB>BB??CC@ACCA@EFBCEDCCBBDDFCGT]\]`dgfgkmljeglfmxf4!  $!>afX[YQOTQFFGORFBJQQOPRQSTRSSRSTUUUTUVWWVUUQSTTRSTVTUSOQWUNMLLMIDCFEF@0""%$%%&''()&('&*"-[Šˆšq43E:3('4<=A<548=;7C="&/"9?B8"(8.%-6<4$ -,5?<-###+QqzˆƒŒœ˜Œ”™Ž„Œ”‰˜•ŒŽ––ŽŽ–˜‘”š‰™•‹‹•–Œ—š‘Š’›”Š™“†“uD>B==CHHHIBGIGDIG=9;;BMQNNONOBHotVWb`^YMKOMSRH>>??@<87:=??>=?>86@MGD@AFIFEFP[a``di_ZNBEc“·€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.2,('&'3/,59677-BSl˜³¯¥¢¦¥¥¨¢ž¡¤¤¥¥¥£¢¡ ¢¥¤¢¢¤¦¡¢¢¢£¤¤¤¤¡œ•‘“Žˆ‰Ž…„ˆŽ“•’“”’‹‰‡ƒ}wso{umebbef…¼ëóáÂ¥—‡‚xrssk_k…˜š„z“œ—¦†XFTUVTRRTVRPQVXX[_voga^\[YYUYXPMKFh¬Ã­”„yiQIFKNJED:=ADDCCBEEDDFHJKJKNOLMPQNPRQRRSSUTRQTTTTQQQRUTSSQRQOOONKOQVWTSSRZZVUU]cQ$*M`^]]\W^\ZZZOFDEEEEGGHKKNOLJHC<@MNLKHGHIGFEGGGGGGGFFEEDCDFHHHGGGGGHIIGEFGFHIHGJGHIIIHIIFFIJGEGHJGGFDDCADAADEBBFD@ACBACEDDEDBBCBCEDEQ[^]`ehggklkifhkfou\,! ! &#Pk`Y]YPPTPHGJRPECLOPNOSTUSNSRQQRSTTWSPQVWTORSTSRQSTPTURQSSRLKLLIDCFED:*"%%%%&'(((''%&'"1  /Wsy…Ž‡™—‹†Œ•ƒŒ”‰—•‰••‹‹“—‰‘–…•”Š‹•–—š‘‹‘›“Šž•‰”qB>FA@FKJHGBEIFABEB<9:CONLOLMQELpsSVca]XMKNKOQME>>@===>@AAAC@?D=,I…ŸwcUMHCBAABFGGFGIKUtš®¯€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .0)(&"#0117:797:.C…«¤¢ªŸ£  ¦¥›—šœž¡£¤¤¤¢Ÿž £¤£¡¡£¤¢¢¥¥£¤ ›•’‘‘‘’‹ˆ‹ˆ€…‚†ŠŠˆ‰Š‰€yibdgvoe_]^^^…ÄððÜÁ£”†~{wzvk]i…œœ‚u£›“œwMCLMLJFEFHGDDJQXaiaXMHHIHE==B?=>:>¹Â¬•‚yiOKHJMMMMBBCDFGGEDFEGKMKMMKMNMORPPSTSQTUUTVTRSRQURQOPSTTWTTQNNQSSNOTWRRTRYYUUTY`U)%E[^]_ZU]]XSOIDFEGIJKKJIIPQJEIE9:ILJHEFHJGEEGHGFGHHFEFEDFFFFGGHHHGFFGGGGEFEFGGGLFHIJHHHJJGGHFGHHHGGGDCDBEA@BB?@DAACEA>@B@>AB@BFEBDCEN[`_bfjkjigejjklhqsS&!"""&.bpZ[_XPRTPLHOWRCCLPSOMOPSTQQQQQRSUVYVRQSWVSVVTSRQQQRQRTSQQSNKHIIGEDE@2% "%('&&'('&*$#)()PˆŽ‰’qB6<;87-/=+ $2;4,83$8/+A>&9B% .IP>-&'35(")5WrvƒŠ…˜—‹„Œ–„Œ”ˆ–“‡Œ••Š‰’—Š‡—Ž‰’›“ŠŠ•–Ž˜œ”•–ž•‰—ŸtFFOD=CKMIEIIKH?>@?<99DONKOMNQEInsUVca\WMJLMLNQNHDDA@??@ACDKLGIE4Q•µ²±«ž“‰€rne\USUXRf›®³§™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!./))% #-46::9;7.2fž¬¦¥¬¤©¡—š™–—™œ £¥¦¦¢ Ÿ £¥£¡¡¥¥¢£¦§¤¢Ÿœ›—“ŒŒŒ‰ƒ~z~€€}|~vaX^bkhdaabccˆÆðïáÇ¥‘Šƒ~~€xh`lƒ’’|rŠ¤œ˜žtE>EGGFEFIKLIIMQTY`OKHHJKJGINSNV[Vc—À¼¦Žwp`JJIGHLNMNJDACGKMEHHIOPNOPPQRSTUTYXWUTTVVXVTUWWURVWVVXVTSSTUSRRRQJMRTSRSSWXTUTV]V0#@Z^^^YWYXPGFDCEAEJLNPOJLPSMFGD9=IKJJHHHLJGFFFFEFHGEEFFDGGFFFFFFFFFFEEFGGHHHHEDHGHIIIHIIIHHGFHIGEEHHEDDCCCCBABBA?BDA>@DC?ADEDBA?ACCDM\cabeimkgedjkkkgqnJ#"$""% ?poX^_XRUTOPKPXSDAKPRONMLOSTRRRRQQTVTUURPQSSSSSSSSSSSSRQSURNNLIFFGGDE<+!"!!%%$$&)++*)$'+);iŒˆ’l:2A@13<1 ",+$3;.",)$76$)@@'%A>! )CWTF3/2)$.;9Tq{„‹‚“…‚‹•…”ˆ”‘ˆŽ˜—‹Š”™Š’š‘Œ”ž“‰Š•–ŽŽ™””ž–›’ˆ– uJLIFFHHFHLGHJGDFE><:;CNOLNMORCGltXUc`ZULIKMLNQSQOMMICABDEDBFDEE>V†¢ž ¢Ÿ£©¨©ª¨Ÿ•’˜Ÿ£«³´°­¬¬€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#02,+%!&*5:<;:<7/L•¯¤›ˆˆ’¤©¡¡¤¢ ›Ÿ¢¤¥¥¥¦©«ª¨¨ª­¡¥¥¢¢¦§£ ŸŸ¤§¥•ŽŽˆ……ƒ…ˆ‡†ˆŠ‡‚„…‡~jbgihiiigffgÆèêæÑ­—…ƒƒxeep…„vr‹ž¡“£}G=BDEEEFILONQVWSRSVWWY[]^__edYabXjœ½´ …icUNLE?BKOMROJDABFIONGDGIHKJOQQSQPSTSSVYYYZZWXXUWXWWZZY[\ZXUWVSQQPNLRTTVSQTVWTUTSZV5:V\ZYUVQNB:>BA?BEHHJPQLNMPQKGE@FLGEIJIGHGFFFHIJEGGEEGGEBCEGGGFEEGIIHGGGBEHJLIGJHGGHIJIGEILIEHIFEFJJEBBA?>@CDA@ABBDEBABA?CCCECBD@CCDL\ecccfjjggjhiihdniB!#%" "$%LxnX``WSWSNRNOTREAIMLMRRNNQRSTTRONQSRUVUSSROPRSTRRSUTSSSSRPOKMKECEGGE9' #"!%'%$&)*)(&',*)L}‹ŠŽˆe>4999:>=, .!&6;*#" %59))>=!$F?! %9S\UG=+(;J=Qt‰…†”††‘™†Ž•‡Œ“Šš™Œ‹•›ŽŠ‘—†–’‰Š•–Ž™š‘Š’›”Š“‡•pDGGCCJNKHFGIKHGMI;:<ADFBFHILLLOOMLKKID@FIIIJHEGGEGIEDFFDFDDFFEFFFDBDHIHBEGGGHGDCDIJEBFIFFHIHFFGIHIKJGFFGGGFEDCC@?@BDDA>ABDDBCDCCACEA@CDECDEIV``fhgiookjhijegr]. # $)3iwcXd`SQROPNJQSLECHPMNOOPPPPPRRONPRSTQUUPRVTVRPQSSSSSQQSTRPOIJKJGDDF?/$  %&&%$%'('&",-"/cŠ‰ˆ†’€S936;96;;5/$,067&"",130/<<$9. ##3HTUXE4KS;Pw~ƒ††‘Ž†ˆ’–Œ‚•…Ž–‡˜•Œ“˜‹‰—‘‹’”‰ˆ“–ŽŽ–—†ž•Š–’†•sLGG@>??@>8=A@<=@?:9;>K`“³¨£ª¤¡ ¡¡¢¢¢ž£¤¤«­¨£¥ª§¥ª­«ª¦¦¡›˜šš˜š–’•šš•’˜””—››™ž–‡}‡ƒ‡Šƒ~„Œ™µÚíݽ§¢™——•‘’††‰ŠŠˆ„Š˜ ›˜— bOTVSVXVVXYXWY[[ZY\\\\\\\\^]_Za^Zz±³¦¢ƒRGJIFFJJIJMRPPTVSOMFJJJOUSKGIJIFEFGGJJGFHJIOQSUVVUTY_a^\\ZW[UNKKLKJJPWZVRRUVUPMNLOY?!,GWWZ__mbG5;A> ".82*" 5JS\QCRN;Os~ˆŽ€‚‘’ˆ„•†•Ž‡–‹•“Š‰’›‹‘™‘†Š–’‰‰•š’ŒŽ—“”ž“ˆŽ™”†’˜oKJUOMONONGJIECGKE:<<;BLNLLJPVFInqNR__^XJJRSJHMPRRRPSSQSZ^^_^[\UEYŒœ˜”“”–˜šŸ›™™–•šŸš–˜ž¡¤©€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!/5474.,+168::60RƒN?DD@AC@CB@BAACDCDDHUacfjihjgdgijhksf@"#"'#/Z‚{^SnjYUXURNPNMMJDFNQNNQROOSRQRSSSSTVWTTWRPWWTSSSQQRURPRSQNLJIGDCBA@3(""!#&&('&')*)(,/(+Nz‹ˆ†Š’vH449?:6<=:9,/=3 ($%-374/63,AICGF4#""!0DWVINI?<?CDBCCA@DCDDGTaeekmllhehjjdjs]3#" #&";BKKINLJKEPrqRYb\Z^ZTOMNPPHEGIJJHDFOZ`^`^`WCSƒ˜’’˜™–š¢Ÿ—¤žž¡œ ¡¢¤¡Ÿ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$0436622++/5:71,7DD:9:7554?==a’©žž œ› ¡˜›š˜šžžž£ ¢¦§¤¤¨«¤ žŸŸ›ššž˜˜œœ™˜”“•”“—˜•“–‘‘––‘Ž‘’’”™›˜£««©¡ž£žœ›–’’“Ž‹Ž’”‘›žš— “eOWXTUWTUWTWZYXXZ[YYYYYYYYX\Z[]Qb˜±›†dJLMKMNNOONMNNOOQRRQRWXVVUOFFC??BGKMMMNOPPSVRRRPNKHFIFDFFDCCBDFDA>==8::7:AGHLMKMRTZfc9 JjbZ]T=3>648;BMOKJOQTRPLLLJLKIIGFGIGFDDGIEBEFEFEEIGDBDDCDEFEEEDDEEHFEFIHFEGFFGHGGHGEFGGFHJIHGEDA@?@?>>?AABAAA??CD@>@DDBCDACCEDFSbffjjhhghmjibgoR,!# "# &Nx†rZ[|y`QTRONPKKPNCERQQPPPQQRQPRRQOQUTQSSPRTPPMMPTTRQSRQQOLKLMLGCEE?7& ###''&%$%'('&/)&?l†…‚‡‘`606<<52:;7<7)+5'"-$(1334/-%!4CDEFKRXYQB2%")"?U]SCRo~‡Œ„ƒ‘‡…“‹ˆ–†‹’†‰”—Œˆ“Œ‰š•‹Œ”‡‰””‹Š“–‘Ž•›’Š–…”™nOV[WXXVWXTQVYUTRKAD>;CLKINKPQCMrqNSc`Y]`b`\YZZXVXXYYYXZ\]\X[[`ZHY‰˜’’—š—™ Ÿ£Ÿœ¡§¥¤¡š˜Ÿž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€".1/21--+),496/+<>;79=;6;7>@9=bš¡˜œ’–Ÿššš›¢¦¡Ÿ¥£¥©¨¤¥©©¥©§ š™™™Ÿšœž™˜˜”›ž—’“—˜’‘••‘‘–ŒŒ–š›š¡¡”•Ÿ¢ššœš•—˜”’”–•’œ›–Ÿ‘bJUVQSTRSUUXYWVXWVXXXXWXXX[]\^[Rl ®ƒ~cJIOLOQPPQOLNLIJNRPMRRRSW[XRSLDABEFEEDFHHHKNOOPPPOOOQNOSRNPVQOLHFDBAIIGHLTY[^_]^badnf? :[YURC1?ADE@@EDABD@@CC?@DCCCDDESbhcggfhgeijichhI($"#"2aƒqWX}eTVTRSSOLPNEDMQQQOPQQRQQSUUUTUTPORQOOPURQSTSPOTRPPOMKKLKFCEFEKNUSQQURA0*!"'9NRBNn‹‹‚†‘†…“Š‚‹’Ž†Œ”’†‡‘••–Šˆ˜•‘˜–Ž‘›™‹”–‘—˜‹‡œ”‡—œnMS[XYZWXYVTWWUUVMBB?=CLLJMGORDMopTUe`X\^^Y\^`^[^^Y_[XY\^^\\^^a[HY‰Ÿ–‘–š™––•—œ¦¬­«««ª¢œ ¡¢€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$16574-++')395-*EJB8865:<:99=5E­¤  ¡¤¥¡¤¥¦ª¬¨¥ª¨©«©¨­¯©¦©§Ÿššž££œ—š›Ÿœ  œ™™–—™™•“”ŽŽ’‘Ž•–œ¡°²¤ £—–˜˜•—–Ž’ŠŠ”•—˜•Ÿ’bHUVRTUSUWUVXXWWXXXXXXXXXXYZZ^XTv¤¯|r^KFKMQSQQSPLOMKILOOKOOQTUVWZUTTTSPJFGEDEC@AELKIHHIJKOMMNLHJNMMLKJIIHMMPQQNMMQSRSUPOW`D1P\WI60?DDKF4*.5@AA??AD@ACCBCCAECBBBCCCBCECDRcjdgggkhcbjihkcB&"!#!"Cq~~qVUu}hWYUTVRRQOMGFKRQPPPOPRQSTTTSRPSQORUSRUTSSTSQRSTRPPPNMMHHEBEE8'"" !%'('&')*)(,&8^x~€ƒ…’†Q0564:32>=597 ""(0/%+2.2>6#&>GC>Ro€‰‹ƒŠ‹’’…ˆŒ†Œ”‘“ˆ˜”ŽŽ‘’”—“Ž‘™–‹——ŽŽ——Šˆ”—Ž‚–žqNRYWYYVVXVUUSQSTK???>CMOKKHKLDQqpW^f]X]^^\WW]a]Z]aa^\]`_[WZ\[_ZI\Ÿ˜”•šš–’žž¢¨¨£¥¬ª¯®¨¦¥¥§€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.=DEF@62+&(394,)BSG4;>68=:8;D87h¥²¨Ÿ©ª¢§ª¬©¨ªª«¯¬««ª¬´´©­¨£ š›Ÿ¡žœ ¢¡¢§¢¤¦££¥¤¤¡š™™˜–•“”•“”•“«Ê×ŪŸ™–——–—’ˆ‘”“‹ˆ›œš”’cKTUQRTRTVWY[[XUVZYYYYYYYYVUW[TT{¥¨ŽvdWROPMRTRRSQLMONJGHJJEJMMOVZZYYYYYXWVWSQPLFEICDEGGHGGHHILMLHFGIKIGGKOLJIJJKQZVWTUXX[ffP*-G[V?2:<@GH>1+,4:AHJJMNMLNOOLIIJKIFIKHDFEFGDBFFGEDFEDEEFEDDFFDFFFCCEFEFHFEHIEDJGEEFEEEJFCEFFFGJJHFDBA@@AABAABB@@AA?@BB?CDCC?AHBCECDRckllgfjhddijmo`>$ # ,QyyxrWTkxgWZVSVQQQSNEFPSPNPPNOSQTUSQRSSRQPPRSRRLORTQOPSQPPPMKKNDEB@DD4!"!%(&%$%'('&,&?iz{€…Š•‚H*486:44A?698!&.$./#-701?8%,?AFMKB5%"!$,;Zr{…Šƒƒ“”Š…Œ“…‰ˆ•‘‡š™‰Š–˜Ž‘“’–“ŒŒ“”ŒŠŽ™ŽŽšš‹…¡”„–ŸsRWYXZ[WWYXXYVSSTLA=??DMPLJLOK?QwqMVa_^^WW\Z[]ZVY^^_\[]``]Z^_]_YHZŒ—•““•–•’• ©§¢£¥¢¢£¢¤¤¢ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H†¦¡špA3'.-/4'(CRK<6:A:4::1;?8L’±¥¡¬§©«¨¦¥§©¨¥£¥©§§®²°°«¤¡¤¤ŸŸ¢¢Ÿ ¢£¥¨£ £§§¥£¡¢ ›™›š–“’‘’“’‹’°Ð×Ä­ ž™–””–”†‹‘‘“‘•›š“’žbFPURQQPRRRSUVVVWXZXVWYYWUTZ[`SU„¦¤‹t\NMMRRTVUPLKKMLKKKJGEFEGLOPSV\\[[[Z[[ZZYVSPPQPMKJJJHEGIHFGKNMLKLLNQSUWWXY\_bdfhgdejmlpY,>aV80?@BJL<+**2?EJKLMQNN>MypEPc_Y]YX\[YX]c^Z\\\^^ZWX]`]\`XH\‰”Œ‹’•—•˜˜œ £¤ —›žž›œ¡¥¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€gªÄ»»¿µžR.%0..21FYSFA>;3;==5;=6B{®°¥°³®ª§¨ª¬ª§¥¦§ª««®³³­«¦£¤¡›—˜ žš›¡¤¤¦§  §§¡ ¤¦§¥Ÿš˜•’˜”Ž‘•µÉÉ»­§¥›š˜—˜—‘‰Ž”–––’Ž’–“˜ŠaIQSQRTRTURTUVVWWXYXWWXXWUWYX^SX‡§ ‡nYPTPMRSQNIGGIJMPOJHILFEGKMNORXXYZ[[[[YZ[[ZZ[\XWUUTRNKIKJHHJKIEGIMOQRRWWWXY[\\`cdbceebaS.E`K/3>ADJI9**+0:CHJLOONOQQNMNIHIJIGGJIIHFEFHGEEEFFFEEGFEEFFB=DBACEEB@DCDFECEIGFEFIJHDGGFGIJIEFFFHHDAA@??ACCA=@AAA@ABCDAEF@CGBAACCGWfkhgghecdhihir^4"!##"$#Ht€sxqYRZ[[[YVSQSQQRNDFPURQRRQPPTSVWQORRRNOSSQRSSTTSQPQQTQOONLJJFGFC?7+! ###$$%%%&0Uwzw‡‰“zB-437:62:<;<0$)<3-,"06/0<9("3DA," '-..16:<@PbZ<&#5]ƒŒ…†‘ŠƒŒ•Š‚‡Œƒ–†Š‘“–˜‘‹Œ“–Š’”‹–“ŠŒ”“‹Ž”•’›—‹––jMU[VX[WVWWUUUQUUJED?>ELOMMOOPAMwlBH^^X]]\\[XXYWZ\Y_\[\\[]``^^c[K^‹ŒŠŽ““”’’•—›˜“”—šššœŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€c¬¾©­¶º¹ _+ 'CU<=WSHG@>?<9;9;>9;\œ±¡¨®¦¢­«ªª§£¥©¡£©ª«´¸°®ª¦¡™šœ˜šœ¡¥ œ ž £¥£¢££¥¥¡š˜–”Ž‘’’œ±Äĺ°¦žŸžœššš”Ž”•”•“‘“”™—‘—‡_JRSPRURTUTUVVUTTUWXXWVUVVYWV\R[©’oZOTSOQRSQMIGGCFHHGFGIKHFFGILPSUWYZZYYXY[[ZZ[\Z[\]^\YVRTTQPPNKNNNNPRTU][XVWY]`^aa][YUPTO2>R;(4=AGJE4)*+.8CJKLPPMLORPNNNIKMGFHFEIIFFGGGFHHEDEDABCDDDEEDCEEEEECAACFFEEFFGEEHJJGEGGFGIKJGGFFGFCBBAA?>@CC@CCCBAABBBFEACDCCA@CEIXglffhihddgjfgqZ/ "#$!"(Ry}r{v^UWWWVVUUTRQQSOGFNVQNNPQRRSQSSOOTUSQRRPOPQQRSSSRSTUQNMLJIIGECA;0&  ####$$%%&:c|wv‚…‹’wA,5459529<;1" &('&%$&+/1159BQXG0! +5h–†x˜Ž†ƒ‰•Œƒ‹“Œ‚Š”Ž‰‹‘‘•™“’“——ˆš“‹Ž˜•Œ”œŽ“—‰Œš•Š–—jMW[VXZWUWWSTVSXVICC=;BKNLJHKPAOvmFB\_\a`[W_]][YZ_^_\Z\^\YX[YZ`ZJ\‰•‘‘‹‰’’’‘“•’Ž•š™™›žž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€eµÁ§©®®µ¸¦t3@†17URJJ?;E?8;>8G‚ª£¡©¦©¬§¥§¨¦§«¤¦¨¤£«­¦££ ›––™›—›ž¡¡ž›žŸŸŸ¢¤£žš›žž›˜–“ŽŒ—¢±¾¿·®¨¤¢žœœ™”’‘’’’’’‘’“—‘Œ‘ƒZDSTPQSRRQPRSTSTTUUWYWUSUWVTTZO`—¯„si\PSSRPQSSQNKJJJJIHFFEJIHIHHHHPRTVWWVVWWVVTUVYYZ[]^_^]Z\\ZXXURSRQRTX\__]YXX\`cZ\[WTSPKa_A,:2)1/(*+-6ELLLQPIGLQROLHGIIEHKFFHGEGECEDEDBCFEAEEECBCEGHFDDHJGABEFEDFGFGFFIIGGHGGFGHIIHHFFGDDCB@BCCBCBBCCCA?>??BABCABCBA@DHLXflefhkiedglfhqV+ %!##".[~v|nWPVUTSRSTUSPPRRJGLTPMNOQRSRSSSPMLNOPTSONQSSQPQTVTRRPONKHHJIEA?7+"  #####$#$(Emzot…ˆŒwA,554741:<<;/);>%,(#45-3;2$,5.%-5692/064-,2*/335@MV9'#=|Œ~†˜’ˆˆ‡€Š“ŒƒŒ–’—œ‡“™‘ŠŽ˜šŠ˜“’–‘’š–Šˆ•‘Š”„“•jNYZVWZWUWVRTVUXWHBE?>EMPNMFJOBOvnLPa^X[\\Z]\Z]_[Y^`]Z[]_^][Z\c\L_‹™““”‘ŽŽ‘‘’’”’Ž—›˜–šžž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_²¿¦®¯ª¯§º²hl«~)9PNMSE:?F>@C>?@6Ap¦¨›¡¤¥ŸŸ £¢œ˜˜› –™ŸŸž £ šš™ž Ÿž£¥¥¦¢œŸ¢  ¢œ›š››˜“•““’Š“¡¤«µ¸°¦¤¨£œšžœ•’•’’”•”‘Ž‹Ž‘ˆ‚\HRUQORSTPQRTSSRSSTVXVTRTVQQUXMg£³d\XTUTPPONNOPQQKLNMKJLNJKLKJHGEJLORTVVVWVURRSWZZZYXXYZ[Z]^\[\ZVSTUWZ\^_[[\\\[ZZTWVTUZ\ZfgL!  ./-1;FF;6;@??C>635417CNB8$H|‡„“’‚‚Ž†‹”Œ…Ž˜”…Ž—„‰“’“—’Ž’˜’“—“Ž’˜˜Ž•‰”Žƒ“–hMYZUWYWUVVUUUQVUJEA=>CIKKLLORBOtmOYb^[\Z\^ZXW[a\X[[ZYXY[\[\Z\b\L_Œ•”““”“–’’•–––’“–šš˜—šŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Z«¹£©­¨«¤¬µ€}¢o@NUINYODB?;;@==D<:cŸ©–š”‹’™›š™›ž¢ž™œžž£¥¥¥¤¡››šŸŸž¡¤¢¢£¡Ÿž››œŸ¡ŸžŸ™–•˜””——•—š ¥°¸²¥ ¤¡œšœš“‘•’‘“•““’Ž’‰€]LOUROQUVRPQSTTUVWUUVUTSSTNPUVKp¬±uZUWPQRROOPRUWVUONMLLLLLMONMKKIGEGIMQTWYZYVROPRUTTSRRTWZY[\[[]]ZZYXXZ]_aaa_^[YWVXZYWY_cb[aO)"./.4=CJE4(%&)/;GKKLQLJJMMMNQJIGHIGEGFGFCFIHFEEDEEEEFDCCDCBCDFDAACFFDFFFGGFFFIFDEFGGHHGFFFFFGFEHHDED@B@?AA@AC@AAA@@AB?EB?DFCDDBGNQXchffhjiffjkhllH$#&! #".b~urxfXWXVTQPPPQPOQTQGFOTSSTSRQSTPPQMNSTQPQSSSRPSQPPRRQONLKMLJGFIE?9/&"" ####""!!0Zvuqw~‚‡Ž~K.562310:=<;-#0@<""&:7,7<-!$6C@9=HTMB;72-<4Y•ªž¢˜“› œ ¦¨Ÿ¡¥¨««®²°©¥¥£ Ÿ¢Ÿ Ÿž¢¢¡¢ž¤§¥£¢ žŸ  œ˜™žœ–’”š›™–¥¥ª°¯¨¤¥ŸŸ™–•”“‘‘‘”•‘Œ‹„‰|ZHNTROQSUSSSUTTSTTUTSSTTSRPQUSLy³¨kTUTJLRSPPRWZ[XURPNNOQPPNPRQPOMIFFGILQUW\[YVQNMMKLMMNOSVUWWUVZ[ZYWUTW\bfgd_ZXWWX[]]ZZ^^\ZaU1"+,/7>BIC1&%#'1?HJILPNJHJMMMNKIGHJHFHHHHGFFFCEDDEFFGHDDEDA@CGDDEDCBDGDFGFFFEAGFEDEGGGHGFGGFGIHFHFBDFA>?ABBA@@BBBBAABCCABBBDEBFDIQRWafgfgihfhlggkf? ""!!# '[€xop^TQVUTRQPPPMRSQMHHNURPQRRTVRNPROPTTNRTQPTVQOPPQQQRSOLKKJHFFDC=3)$"! ###""!!!?hxqvyx€ƒŽ„R0462200:><;- 0G@%&;6*8;)!0@A96>FKSXOA;BJTTV\^WI>56:>:&/^Ž”‘‰†ŠŒ„€’ˆ„•ˆ“šŽ„˜’’Œ“™•Œ˜•Œ”‘‹‹•Œ„Žœ“‡——eHVYTVYVTVURTVUYWHAB>=CJLLLJMNATwmQX_\]_]__^Z[\[^_\Z\\ZY]``c_]`XJ_Ž™’’–•“’Ž‘”š›“Ž’——™––šœ™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€\«À©¢¢¢¡«ª½phQ5.*!'( !" &!$%$125UŒª£ ¤Ÿš¡£žž¤¥¡Ÿ¤«§£¥¥¨ œŸ ›™œ›•–Ÿ¡œ™ Ÿžžœš˜˜—šœ”Ž“œ•——–••–—žœœ ¢¡™¢ —”——‘Ž‹“‘’ŠŒ†‚„`KOTQPPOQQRSTTSRRSVTRRTUSQSSUPM€µ jQNNHPSMQPOQTVVTSUVRMKMQRSRPOQQOKIHHILPRY[\[WSQPHJLLJJKMNOOMNRTTSSRRTWZ\`^[WUTUUTXZYZ\ZW[aW4 "(08?BIB/%%"&3BIHILPQGAEMOKGJJIGHIGEJDEHDADFHECCEEEDFDCDDDEHEDDEDBBEECBCDDEGDFGEDFGFHFFGHGIKFEHHCEE?>BDA?@BBCCCB@?@ACB?AEA>CHEJRSW_dhgghgfindfja9!"%"#!GzzmjZSOTTSSRQQPPPPQNGGNVROOQQPPNNNOPQSVSSSRQSTPPQQQQQRSONLKHEEGAB;/%""  ###"!! Ntxkvyv‚Ž‡V2463100:><:-0I?% %;5)7:'-8<>@98GPMPWSD8578IF-;w˜‘€…Œƒ’‡ƒŒ‰…‹–—‹“—†Œ—›‘‹’›•‘“–‘Œ–•Œ•šŽ„‘˜ƒ••dHVYTVYVTUUUUURVVIDD>>88+0OA%(&*D2'89+%09<@;6EKPRPRVSL>33::AQ]Yc^HLYE*\•–ƒƒŠ~—„Œ’ˆ•’ŠŽ”‘Š‹–šŽŒ“”“š˜‹••Š‘”’”‡—”fLU\WXZVTUUTTTRVUIDB=>EKJJKJLNBVwjRY[X\`^\Y]^[Y^_]\^^_`_\[]^[ZbXHdš’“˜——˜™“Ž‘––“—‘•–’”š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€R’Ÿ•š™š†gD0(#  !!"""#$%'(())+:g“˜ŠŠ‘ŒŽ’’“”–•‘’“’“‹Š‰‰‹Ž‘‘‘”ŒŽ–”ŠŠ”‘‹…‡Œ‹ŠŒŒˆ‡ŠŽŽ‘“‘š›š˜™™™•“”•“’Ž‡†‹Ž‰‹`JOROPROOONOOORTSPSRQRTUTSOSSMV‘ºiPPPJKKPLLORSTX]YTUWSPRTRRSSQPQROOJFHHFJPPSW[\[Z\WROLIIKGEFIIGFHFJLLLOSVVTQONNOPTSUWWUUXRST> (49>DD8)  *7>CLPLIJ>>FFEGGHKLJHHHGCEGGFFGICEFECCEHGFDDEEDBDCBCFFDACDEFFEDEGFFFFGFEIGEGIJIGIGEEDBAA@B?=AB@@C??B@@BCBDCAACCACKPPQX`e_`ejjeejjmnU."$ ! F[N@DOXTTROOQSRQMKOOHFLQSROORRPMOPQQSVYVTRQQQRSOPPPOMMLJLJGHJHEA7+(&!  !!! "# (#:gwsrrp{‚ƒŽl:.974.0==:9*0M=#)*(=3.4-#,::;;:BMOQSUWTQSF>8.-5J€”‰…†‹Ž„€Œ•‘‡“ˆ”’Ž‹”‘•˜”ŽŽ‘Ž‰Ž—˜’‰‹‹…‹”Ž‡—”fKUZUVZVUWVRUXVXUIDC>>FLLKKJLNCVwjRY^ZZ]]]Y[[Z\__]]_\[]^^]\c`]cWE_‰‘‹’•“•”—••”•˜—“’š˜›  š˜š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€F€‘†‹|YC2$#%# !!""!#&()(&$'/Ch††‰€„‰‰‰ˆŠŒŽŠ‰ŒŽŽŽŽ‹‰Œ‹‹‹ŠŠŒ‘Œ‹Ž‘ŠŠŽŽ‹‡ƒ†‹ˆˆŠŒ‹ˆ‰Œ——’˜£›š™™—”‘“”“‘’“‘Œ‡Š‰…bJOQNPQNNNRRQNNPQPSQPQSTSRQSRL\—ºiPNQMLJMPNNOPRTXUUZ\XWWUQRTTPLOTTSNKMLHHIHLUZZZ\b]YXWSPONLJIHEEFFEFIJLNPPLIKLKOTVQPUZYTQNOVH#(49DDGPOIJH?AGFCEDHIIHFGFDDFHHFEFHFEEDDDDDBEGGFCCDCDCCEHFCFDCDEDEFEFFFFFFGHEEHIFGHEFGFFEDBCA?@CA@BB?@A@@BBABCBBCCBGNRRQW_dhddggfhmemlN+$'!!! 0?;6ARWSRRSRPPQPPLLPLGJQOOQQNOQURPPRSSRUUPOSPMPOPPQRPNLNLKKJIGD;0(%#!  !" !"&%Jotqtuqy„†vB.77303<<<;( 6N9!)(.@4##'<=::>EMNLKILODXxjQX`]Z[\]Z\Z[]\ZZZ[\]]^_aa[[[bWIe”“”’’’‘”–•”‘”š›ž Ÿ›šœ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€It……~bC.$%  ! ! !!!!! !$&'(''())=cy|~{ƒƒ€€ƒ††…†‰ŠŠ’—’Š‹ˆŠŒŠ††‰Œ‹Ž‘ŽŒŠ‰‹‰††‰‡‰ŒŽŽ‘“›—™›–™¡Ÿ››š˜”‘‘’““““’ˆŠŠ‰dJLRONOPPMNQSSRQPPOQRRPOQRRSOJ`œµ—fPLONMIHKJJKNPSTQWXW[[VTXXWWTQQSUURQQOKJFEHOUX[]Z[[\]^\ZWURPMKJJMHGJKIHJJGFGHIKNMORSOJKPPTaX0'498BB3$'6CLHFKLEDND@ELIFDDIJJHHIGEEEEFFEEDIEBCEGDAADGHEDDECEFEDEFEFDDFGFEECEGFEDFHEEFGFEFHHIFBADC@C@@CB>?EB@ACABDC>@BBBCBBJOSSRV_fhggfegheeqhD% "" ! #%/43CTURPQUTPNPMPLLPLEIQQPOMOPQRRQRQRRRUVSRWTNORQPQRQNLIFFIIHEB7-&# !  ! #%.Ysrrwuov‚…‚‘ƒL,37324<:=<'";P7!*'1D4 ":A869CSQNLMPRSPSWXUTSP?;9.5V`UGMu‹…Ž‘„”‹†•‹–‘‰“ˆ‘˜”Ž•˜‘Œ“š•’“‘‰ˆ’Š•…•’eKUXTUYVUWWRRSSWVICE>]qutu{}€‚……†‰‹ˆ†Š‘‘Œ‹Œ‹‡ŠŒŽŽŽŽŽ’”‘‰ˆŠŠ‰‡†ˆŒŽ‹’•–™™š›š›ž¡ žœœ™–’‘‘ŒŠŠŒŽ•fJKQONPQRNNPSTRPPQOPQQONOQRRNHf ®eTLLMNKGEIMMKLOSWZWUZ^[XZZYWVVUSQRTSPNNMLKGEIPVW[_`ZZ^`^\[YVTRQOQLILMJGGGIJIIKKIDFJJEBGOZ_nh<&4::@=-%1ERJCFLIDHNAAHMKFFGHIIHHIHFEEEEEEDDDDDDEEEEECCCGGECEEFFECDFEEEDFGFCDDEEEFFGCFHFDEGGGGEBDGGC?@A?>?@@@?ABABDB=?ABBACDLORSRV_headgeefcfqc;#""" " +32?SVUQOQPNOSRPMQVLFMRSRONNPPKOSSQPSURSRRTTPNSQONNMKIFGHFEHE:3'#$"!"##""!  %$7erntxsmt„…‚”X..7324;:<;&@?@A@=>@A?BC@>?ABABDIMORSRT^hlbelfadego[5&(&$!! $17FUUSQPQPOOPPMIOTLDHRQRTQNMPNOOQQRQQTSSSSUUQTRPNMLKJKIJHDE@4)&$$#"""!""##"!! &$?kpktxpnt„…‚’”h8,6312<:98%!BQ2#/(CB?AB<=@@@BC@AABCCCHNQQRSQR[fgdii__d_lqU0&'#" ! ! -;LVRNQRRQQOLNMMORMGFNRTQOPPNNNONOPQRRPQQPQRQRSRQOMLLHCEFB@;/%)(" !  !"#$$$ !&$!Elpgrsnrv€…Š“yG/44.0<:65%&HR. .'79##'-%'/.1@A<>A@=>AAADEADCCEDEJQSRSSPOXc]abRH[jaijL*&($$!"!"+6EOQQSRMMQQNONOTSLHIOPQQONOROOMMMOQSQPQRRPPPMPQQNLJJJHIF@A:)%(&! ! "$%#! "&%#Ilpdnpnvx}…ƒ‘ƒT235,.<:43%&HP*/*#7. "$% '+(1014;BIMOVURUWPO[JAXv‚…„†|†‘…‹’’ˆ…‘•Œ‚Œ•‡‹““Š“˜’Ž’•”‘Ž–”ŒŽš’‰Š””ŠˆŽ•ƒ’ŽcKVVRTWUTVVWUTRTRE?A=>FLMMNIKL@TuiQY`]Z[]`^[\ZZ]\[_]\\_`^]]W^aaSHg—‹ŒŒŽ‘‘’—™—–¡œš››™—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%*)'#"& ''$'&%#(% ""(1BQO@77?atqqtuxkt}…Ž–•‘ŒŒ‘“Ž–ˆ‰“’‹‰‰‹ŽŠ†‡Œ‹†Š’”’’–œš¡¯·¶¦¢§ª§ª¯«§§§¦¦¦¥¥¡œž££—“’Œ’„\INQMNQQPNOOONNOQRPPONMMLLJRFSŠ´«†cNKQOLKPSOJHIKKKNLLNPQTW[[\]^]\ZYWTTUWXXXUTUTQQTOKIKKKNSXWXZ\[XU[XXYYWX[``acgkoqqlkopmklqa[`P% !-<85,'4JODELPNONB38ISOHDA@HJIGFFECCDEEEDEEEECCEEDECEB@BBACFFFEEDCBGFDCCDEEDCEHGEDFGFEFGHHGEDDEGFDBB??ABBBC>;=BB@?=@@BA=?DCB?=?FNUXT]X97]menj@"$#"'$ !""'7IRQORRQPRQNRMLRSIEITPMOSROONNLLNMOUSQQQQQRSQQQNLJKLFIKHB:0)$#"!!!"#"##!"%#%$(#&Mpllmoopxˆ„ƒ‹‘c(*2-//+0.!+@F' 0(#/()!" !%(,))-/4<=@IHRUSUSSZJ=YyƒŒŠz‰‘Šƒ†„†Ž”Œ…‘™…Œ’ŽˆŽ“ŽŒ“—•‘‘•˜”Ž’™•’™“Ž•”Œ‡‰•‰ƒ”fNUZYXVUSRRTRNOSPFAC=:DMMMKDJNCWufOX]Y_`\X[[_^ZYYZ]]\]^][[]a^\aTIh”ŠŽ‹‰‰Ž”˜˜–š ¤ž›žŸ˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*+#"&%$!)/(#)++-+'%&+5?EKJ@:>@?^{‰ƒ€‚ƒ†ˆŠŠ‰Ž–˜•‰‰‹Ž’•œ—Ž‘’“Œ‹Œ‘‘‘Œš›¤¤£¢¢¥¨¨§£¦«­®®¬©¦¢¤¥Ÿ ¢ž™˜–”‘Œ‹Š‰‡„~}‡‡…‚‰}VDMPKKMNONNOPQONMMPOONMLLKKQDR‹µª„fPIMNPNNONMLLLMMLKKNPQSVSW[___\[\[ZZZZXWXZZXUTUWTQNMJIIJRUXZZWUS[bfffijjdfilnonnolkllife]TU_S+ ,<>5+)7LOBEPQLLE:4DNQKGECBFHIHGFECHFDEEFCAFFDCEECCDFDCDDBEDDCCCDEFEFFGFFDCFFHIEBCFHGGIHEDEGGGHHGFEC@>>=;:::898679844895687:88?ISVVYVN:=[f`lc:!$!$# ""(8IRQNQRPPRQOOQRQMIHKQMJMPPNPLQQONNMOSUTQQSROTRPOMLKKKGCA?8.&'!!#"!# "" !"#%$(#'Lollmonow‰„‰–s5&0,,-,++(*00!$-&/3&")"#*..**-049=>EOTQORUG@Yx‡Š€y†‰ƒ…ŒŽˆˆ–ˆŽ†‡‘“ŒˆŽ“”‹Ž˜˜Œ•™’˜””’ŠŒ–•Š‡”Œ†–ŽbLUYXWVUTSSSSQTXTJC@<;EMLNLFJJ?VveM[^VZ][Y^]\\\\^^ZY\]]]]]]_]]bTHhŒ‘Ž‹‘‘Ž–™™›Ÿ˜˜™›œ›™˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+) ('#,2.&%*,+).:FNZsŠzI0?C2:W~Ž‘‹Ž••“™šš™šœš–‘”–••™ž¡›œ›™—™œ œœŸ£¥¥¤¦£¥«®«ª­¬¬©¤¥§¦¡Ÿ›œ ”‘‹ˆˆ‡‚~~}{xusqpmmnnnprs|~}y‚wR@LOLLONOMNOPONMMMOONMMLKKMOBSµ©ƒeSMLKNOPMNPOMKLMQNKJKMQTYZZZ[\_b____^[VSSZ^[XXYXWWVRQONLKQW[[YYYU]fkorrnlkkklmoqsrmhd`YSQNQXO. *:;/#(>NKBHROJI<17KOLGFECBDHJIGFECGHIGECDEDEDDGGEFEFFDFDCCEEFFGEEDDDDDEEEEFGHHFDGJIDBDC=<>@ABA@>>>;878988936:97:=;=;:967::646?KQPLLHD9@\gejY2 %"! !")9IRQMPQPQSSPPOOSTMHJSQOQSQORQPMJNPPOURRTUQPPQOLKLKJHGCA?:1($%%#  !#! !"!#$$(%(Mnllmonow€††ƒ‡—ƒG$+*)+,''.(*')+!,?+)--.-1.2:=68:6587?:DQTTVRBB\v„Š†‚““ˆ‰‘ˆ“‹†‹Ž‹Š‘‘‰‰’‘“’‹’™’’”“’ŒŒ‘‰‹“”Š—^JUWWWVVUUTTTRSVQF@@>=GLJKJILL@WwhPY`Z]\YW\]\][YZ^^Y\^^]]]\[[^cSFf‘‰Ž‘’’–˜••˜š–“’”’’–˜•‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%&-CU[cmnhdWKXknr‚”šœsI63Bj•¢Ÿ”“™š—–˜œŸ¡Ÿš”Ÿ££  §¬¬¥¨¬­¬««¬­­­®¯®ª¨®§¢¡Ÿ›˜˜•“ŽŠ‡‡„€ƒ|xzxrrxpooonmmllkkkjjiimjghlopoz}xwTBJOLMONNLLMNNMMMNNNMMKKJJLNBUŽ²¦„eSNMJMOQNPPOLJIIONMMMMNORSTWY\^```__]YTPMTY\[\ZYX[[YWXVRPSWYYXWW[UT[djmpqnjhhjnqfe`XTSOHFEBC>+ (76*.KODDMNJIF5/<667878::;:;@EHD@8?D8=[kkhO*!%! !!+8HQQLOPPQTTQPQQPPONNQQQSTPNPQPOONMMQOQRSSTRPMLJJJJIIFFE?7/)&&$""  """!"###$#)%)Lmllmomnu€ˆˆ†’ŠY'")**,&%/)+&"*')A,&)'>DFJBAKI?:<=>>;;38FMS]dJ>Wx€…y†—“……‘’ƒ†‘…ƒ‹‘“‡ŒŒˆ–‘Š’“’–‘’—’Ž“Ž“‰‰Ž’Œˆ—Œ_JUVVVVUVUVXWSRTOFA=;/3BIHFDDA=>HJJHGGHHFEDCEEEECDCCEDBBEEFFEDCBFFEDEDEECBB@@?>>=;978998952269;;;<<;989:9655755663588897<@@>>?@@AAB@?<;:5@I<:TeieF&#&   !,9GPPLOPPQTTQUPJKRURPNNORSPNQNNQRPMNPLORRRRRPNNNLJHIJGE>4-,)$%  "! !"#"$%###)'*Lkmlmnmmu~ˆˆƒ‹i-)-)*(%+-&!,#,6)"$+?BCH@BNWPC843;GBA=:9;PjYCVx…†ƒƒ‹ˆ…ŒŠ†’‘††‘‡Ž•ˆŽ–“‡‹––Ž—˜Ž‰–•’˜Š•‘††‘‰…•aLVVVVVVUVUUURRTPHDA=;FNKIFEKOCXvgP^bY]``[ZZ[YWYXXZ]^^\[[\\YZ^cREf‘’ŒŽŽ”“•›Ÿžš˜Œ•“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3>P³·¡ž«¨³¶sE¼¬©®°­µµ¥rM62;CFVjŠ§·¾·§³­©ªª©©««©¤ ¡¢ ”Šˆ‡…}xvsrpnjhihgggda_d_^bdccfeggffiihfhfehgfhlllmmmnndhkjhhmqy‚x}wWEIMKJKJLLMNOOMLJJMLLKJJIIILE\Žª ‡fQKMMMLMPQQRQPPPLNPPPQPNNNORSUVV`_```]YVSLHMQTUXUWYZ[\\ZWTPPRUVVVWURSZ`bccb_[UPLOMGCBCCA=A@AD9!-,,IKFFDH@CD4-;IKIEDD@>CJKIGGHHGHIHFCCDFCDBBEEDFDCDEBCCA>???=<:9:976679:9;;::<==9<=<;<>?;;:876777447899;<9=CDCA>HOMC@CDCBCC@<99;;@H@>Qbj_?"#$  !,7ENNMPQPQSSPPNNRTQPSRQQRSQPTNOOOMPRQONOSSPNPOPOLHEEFDE>0)*)$""! !"! !""#%##"*(,Ljmlmnlls}‚†ƒ€†“z;)-)'(())#!*%($$!3@@CFAEQPWWQI916CKMMI>>BEEEEDD@>A7 ()*@@@A>;<;99:8;:999:;;:;<=>===9:;9:;:868;:7347;;::<=>?A?>?AAABDABBAABAAOPDADDABBB@><;;:@H??VgnX8 !   !,7CMMNQRPPRQOORPMQUTPURPQRPOSNQTQMMPNQRQPQSPKNMLIGFEE??8,%%%"$!!$"!! !"#$#"!)),Lhmlmnlks|ƒƒ‚“ŠR'(*(#%*,%" $(#%:@?CGDHNSONRTL@92:HX`YJ?@Rir‰z‹”‰‹†‡ŒŽ‡…’‡‚ˆ‰‡–—’Ž‘’‘’‘‘”Œ‰Ž–”’—‹Œ‘ŠˆŠŠ‡–‹]JVYXWVUTSSTVVVVPGCB>;DKJJGHMNCZyiPU`\\[\]b^XW[]^^Z]^^[[\]]_\[_QHk”š‹“”“““‘ŽŽŒŠ˜™’’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)&>‹Á¼«¶¶Ä¼lV£Â²²»§mC70'.31,)))''.02E^htmijhb_`[Z]`^Z[``^^`bcbaec``acdcbddb_`ceab`^aefbabcdddca^ca`gfdighhijkllgiklkigfr~t{z]LHMKJJILLLMNMLLLMLKKJIIHHMJA\‘«ž„fTKFFMOLJQWXSOOPQTTQQRQNINQOJJOUVZ_ehe_[Z[XQNLJFJGFHHEEHFHHGFEGIKJKOPPRVWUPLHGGGHFIPTPMNMH<8<8'%5JQMI>:FEEF;0<989:<;768::<:89:8:=<;;<<<<;;::::9876899:=A>9A?@C@=>DJHEDEEEDECACCCBC@BDC@BECAQQA=BDACBAAA?<96EN=0'&)'"#" !""!"#"!!#$##"!**-Lhmlmnlkr{€‚„…”f1&&'!,/')&"#+!*A@=BEDJNQNRWSPRP913G`yŠ„xŠ‘Š‹Œ†‹‘‹ƒŠ‡‰’‹’—‘ŠŠ’•–™’’–’’•‘Š‹”“‡ƒˆŒ‹˜‰ZHVZYXWUTRRPQPPRNGEA>;DJHJJFLMAUugQZ`WY\_[ZZ[[]^[Y\]YZ_^Z\ab]Y]QJl–˜‘‘“™•’”•”’‘ŽŽ‘ŽŽŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.12e«¸•”¥®–]PŸŽ[;9>822001-'&'%%'()/6LYca[[]^W\ab_^_b_abb_]]^ba`__acddcba_^]\^`ba__accdec`^^_bbbbbcccaceecdhlghc_aca`l}swz_FFMLKKJMNLKJLNNMKJJJIIHHHKLD`•«…gVMKLNJJLTUPNSUQPSSTUQQUPPQQNKNRUZ`cfgeaYXXVQKJMKGEFEA?@=AB@>?@?BDGHIKOQUXXUUZ]]b[TYdaZ\_J=;;;/ (Hb^ME>AILA>95DQJE<:?BCDDB?==>;9;9;949=9;;9<@=;;;=>;:<;898:97:;98;9;AGHGFEEGGJMJLHHHGDAACGIIGFGEAEDBBBCCCCBCEFDDEDNNC@CB>C@@B?:8;=EE>>SlmP+"!! ,4?MHMPQPNNQUOQRPMLNQSRSTQRTSQRPPQOMPPQQPPOOONMJFEGFCF=+!')$ " $#"!!$$ #&'#&+%1Riiioqmlvˆƒ„€ˆ”u?",-!(3)"+%.1%&:B=?FFAFQPRSRQPQSUP>49`jbRGFMXZQ52100.*&!"#%%$'*1CV]\]\Z\^^]\^]\\]_bdd`\\]_abba`^^^^___`b`^^__]Z_`bb``ac]]\\\\[[UWYYXZ^abca`chhgoƒw{€dJHOMLKIKKQOLLLMMLJJJIIHHHGHB`”¨™‚hWPMLMKMLNOQRSUVRTTVUQOSVQMKJJLOPSW\bhhea^[ZVRRSROMLKGECEBACB>=>A@CGGFIOOW^beiiggc\^ffbd\K@;9<0 'IdZEA@DKF@=:>OVJGABFC=989<<;;><9<=?==;8?<:;>=<;;;989768;@CDDIKKKOOQV[][WLHMPPNLRJIJID?>AKNOKGFGIDFGFCAABCABGIGDCFNMFCDEG@ACC=78=>FE?>TllK%!" #!-0:KMLORQOOQTRQOOOONMQOOUXURSRSRSTQOPPQQONOPOMMJGFHGDE:*$((#! """ "##""$$"&)#2Tjkikoopv|€‡‚…€…“|B'4;.,+1%$-%67'#(B?===<;<<;:;9;94787679754428?<??<98>FF??VniF#!#%#" #./6HOKNRSQPQRRRRPNNPQQTSQSQQUUUTTSPNOLNOMMPOMLLJGGIHEB6)&*&!!!%$"" !"#""#%!&'!4Wmkijmopu|‚…‚†€‘‡S+0?B?/)!$.$>;% #9F<<>BCCIQRQPPRSRPUOSWOID87MdqgJHf‚Ž‘ˆ„‹‘ˆ‰Ž‹‚††‡Ž‰‹‘•–Ž•š‘“–Œ‘“‰˜“‰‹“’‰„”‰ˆšŒ]LWYTVXUSTTVURQRNFCC>?GIEFLHKI?Zt`OZ]XVXX\]XZ\Z\][VY\]]`]Z\ZX\bPEgŒŒŽ’Ž–””‹Ž“‘’’——““‘‹€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$-38COXQPTK7=NH>IVYTQUYF2/61/0)%('$#%%#$%&.BY`\WXZ\\\YWXZ\\ZXXYYXWWWYZ\WWVUUTTSPRUVTUWZ[]^_]]_afgghijkkmnnnoprtsrqoorrmtƒz„gFGLIIIJMMJJKMMMLLIIIIHHGGJGAd–¦™‰lWPOLLLMMONMPUTPPRTXYVRSNMMOOMLLNNNRX`dghd_ZXXZ\\^]ZYXUPQRQPOPMIJFDFEBDIFJMQV]bfdjhbbhifZSLBA>;;=<>CF?DGCDJB:KF9222141/;C;FG@?Yoe=##""%##"026EMJMQSRQQQSRPQQRQQQSQQSTRRSRRRROMNLNOPRRQNKLJHHJHE>1')*$!"" #"""####$&! &%!8\nfkmomlr„ƒ†€~Žc0(:FE0($#.& C; $$2CA<=?ABCIOPQRRPPQRWNPSQSRG<7BWgdUMaˆ†‰ƒ‰‹‚…ŽŒ…†’‘ˆŠ“•’”››”‘’“•“‘Ž‘–“Œ”‘‡ƒ–Š‰šŒ]LXXTUXTSTTVUSTWSHAB;;EKJIKJLI@Zt_N[`\ZYZ^_\]\ZZ]^^[\[\__\[][^aPIl‘’Ž‰‹ˆ…ˆˆ††‡ƒ€„„ƒ…‡…~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!).4?O[ONXL-+:9CRTOLJC?>=>@?7:>=?JSRKW`VQSK>KE4(+,,243=A69EDMTWUTSTWRPPUZ\[ZNHOQIFGIHIMOKDCFNLKLKHGIHIIHGFFGKKJGFGJLRWO@=BC??@@>=;:9>EG??[p`3" $"#263@JILPRRQQPNOQRSRQPSOQUTQPPSPOONNPQNMNQRPNMJKJHHIHD;-'*)!"#"#! !"###$%%!!&$%@amekmmnkq„†€|Š”h5-;C=.1.%%1+$F?#*6?C==>@BBBGMOQRQPOPRNOQQNPSSJ6?EFcp`N`„Ž–‚ˆ‘‚…Œ‹††••‰‹”˜•‘””Ž‘’–”’’˜ŒŽ‡„Ž–‰‡—ˆXGSWRTWTRTTRSSUYSHA>9;FNLIIIKH?Yp\L[`][[Y\\UX[[ZZ[\XY]\YZ]^[[_cRLo’•ŒŽ‡‡‰‰††ˆ…ƒ‡‚…‰‚tpu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .12f—¡—sTJMLMLINIJPRPPTUVW[^\XYYVTUUQNMJKLNMOU[\bggc_\ZVWWX[^_][[\]YSQRQRRQPNIE@ADIKMPT\bhgekkdbZTMHMH3:iiG8;>997=JTPJIHA<>?CD@05=ACNVUPUYRKLC9>?1(/1/7:6<=6=IIOSTTUUSSURRX]^]\TMOPNMKIFLRQKEFKIJKLJHGILIGFHIIIFIJKKMNNNRMEAB@>A?<<>@;6>]p[/ #$&% #460I@,19.(41(JG&5HE?@?>@CCBGNQPOOQRQOMPPPSRRWE=[fJAY{hQ_ƒ‘Šˆ’‚†‹ˆ…‰ˆ–˜Ž””ŽŒ”Ž’”Ž‹“œ”Ž‰„˜‹ˆ—‡YGTVRSWTSTTORSSTNFC@<=DIHHKILJBYp\NY^ZYYWXWXZ\\ZZ\_]WVY[^_[[[]^MIm‘‹†ŠŒŒŒ‰Š…†ˆ…„††‰‹ŽŠ€zx€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$00/8IVPKWG-6JUROKOUQLQW@028622,)'()'&%&'(&%%,3P[`\[_`]a``beggfefijkkjiklllmnnnsrqswyxwz|€‚ƒ‡‰Š‹ŒŽ’”•›˜––™šš™•““ŒŽ„p{‡€„lIFJGGJJKIGILLLKKLHHHGGFFFGAAm¢–ŽtTLOLLMKNJKQQLNTQQSW]][]ZWTSRONOKKMONLMPW]cdeeca^[YYZZZ[][]^\VSSVRPPQOMMNJIIJKQXVY`bcknhfZSPMPJ74epP77?:;7?NRJCDF?;78963)63)LL) 9KFAD@=?EEBGQQPOOQQPOSSRRROPXB=a€~eNSypOb‘‘‡‹‰’Œ‰ŒˆˆŽ“’‘—šŽ‘—˜‘‘••’’“”˜š“‘’”Œ†‘˜‹ˆ˜‰[KWVQSVTRUTPRRRRLECC;:BKLHEHLLD[p_T\_ZXZZ\ZY[][YY[\[[]]ZWZ^]\\[IEiŒ‡…ˆ†…†ƒ†‹……†‚„ƒ†ˆŠŒ‹ˆ„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .348BI\OQ<*>PTGNLGKMKLWF2.7:415.)))(),*'%&''')?]qkchmjmmmkiknrooopruxzxyz}ƒ„‚…‰‹ŒŽ’•”–˜™™™œžž›™—•“’•Š†„‚~{uoqpghg[bo}wu{eDFJGGJJKIJKKIGGIJHHGGFFFFFAFu¥§—ŽuVORLLNNNOPPMKLNMNOV^`adba^ZTPRVSPMMKIJNTWYZ^dedc^ZZYWXZWYYYYYUPZTQVXTSVXSOMKKPWWV]bfoupgXQPOQJ80asV54A=@?ENNID?@<;=@ED?6:A@BMLHHA:?F9.441;>5499=EHLTXVSQQTSTUW[]ZURMLLNMKOPTUPLJHEIMOMLLMLLKIIIJJJINPMHC>:@LMA;?BA??=;=?<6;CF==^pU&!&& -61;KJIIJMOPQRRRSTSOMNOOQSQPTPMORQPRQPNLMOOMKJKJGFFC>4)&& "%# "%$! "&'$"$#"$&5Yndcmkjokm€„€~ˆv<*;G;'2>3)51(MJ,#7DFEE?;>EFCHSOPQQONPQSMKPRONRD9\z…ŽvSUomXn“Š’‰€Š“‡Š’‹––‘–—•’‘’’Ž–™”Ž’“‰„“”‡„•‡YJWUQSVTSTTSTRSTNE@?;=>DOJ=?DB>BA:8;;77;GH?=]nH & ($ &+ )11>IHIJKLLLKLORRSTTTRKKRTOOTSNPSOLNPPNMMOOMJLJJHEEA9/+'$#""! !#&! "'$!##(#&?\ijiffijlry~‰ƒ€~„Šs;%9I;(,<-(5,,SJ" >CDAELOOPQPONNOPPPOOQSF=Yv„Œ†ecpoez„‰„‘‘…„’Œ’”’’”•“Ž”•‘Ž•“‘‘“•‰‹ˆ†“•†ƒ•‡ZLYURTURSTPQRPOROF?@;?GHEHKFLG?]u\M[`^[YX][Z\\ZYXXWY\[[^\XZ]Z[aSHa~…}|ƒ„…‚||~€|…„‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ (028D@CUS6/JWNMQTUY\YTdbA*3<:6=91)')+,-+)''()*.0ClŠˆ‚‹ŠŽ”™›ššš———˜™›ž™•’’ŽŠˆ‰ˆƒ}xwxkifc^[XVTTSRQPPOQRRSTUVVUUWURUVQQkwuw_FHJGINLJPJJJIJJHFGGFFFFFFI?Dq¡žŠŒ†_LIGLNQPPONMNNNMOPORX]_aacec_\[VWVQMLMNSPPSVXZ\___^Z[]\ZXUTVXYXY\`dgijjeilljhfdgeccinlfe]XRJHE<""Otb:2?A;FPPH@AJFKNGERSG=COPHLURLORHEMKCGO?.44/5<=<89>DGTUTTUSPQRMMU[ZVTMOOIHLNT[^XOKE??EIKKKLKHNLJJLPOLEB@A@>==CHEA@??BCA<:=<88>HF==]i>#$%%+6'#(/.9EJKLLLLKKGJLOQSRPOLMQPLMSUQRTPMNOONMMMLJIMIGGGHA6,'$&$  $ "%# ! #%#"$'$*E`hgggijiir|~‡‚}ƒ‹v=(>J;)/=@EDBHRSOLLNOOOOPPPOOQSHA^x‚‰ƒ€‘†xokrŠ”Žƒ„‘„…Ž’Ž’“’Œ”–’‘“Ž“˜“Ž……“–ˆ†–…WJWWTTROQUTOOQUUKBAC9:FMMHDELG@^u\MZ\XWXZ]ZZXX\]\YY[[YZ]]\[]]^_OHd€…|z}}~~||}~{z€„€„ƒ€|}‚„„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#,07B<=WZ43[dZZZXVX[[XXhU/,88<;83.)%&(+++)'(+.000M…¤¤£ŸŸ ¢¢Ÿ›˜‘‹…}{zupkhifa\TTUSPNNOOONLKIHHPPQQRRSSSSTTUUVVVUVURTVRH`urqs]DEKHDIKHIIJIGGIIGGGFEECCBI>Bt¦ž‡„bOLLNNOOONMMMNNMOQNMPW\`__abaac]YUTSPNLRMKMQUY]VY][XY\ZZ[YXZ\ZVVXYYY\aeifddefggllkiknmilf\NCA?8%!JsmF38:9ELHDBELGOVJGOKG@AJKEIOHHKPHDGB9@I;+01-4>>;78>DFLNPRUTQRUOOV[YWXIIMKHIKO[\UNMICCIHFDCCCD@BEHLKE>>=>@B@?>BKLB=@A>A@<;><76ED@=<>CEA=EPOQQOLLNQOPPOOOQSB>_z‚…}ˆ•|rozŽŠ€…“”‰‡ŽŠ‹“–“’–”‘””’‘“”Ž“˜Œ”‡‰“”‰Š˜SIWSSWVQPSSORRQQLDAA9=GLJHFFOMB[nYO]]YZ^]\VTUVVXY[[\YXYZ\]\]_a^KHjˆ†|z{{|~|ƒ‡‡„…ˆ†‰‰‰‰ŒŽŠ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%*4@:4LR.9hjcbdfjptts~Šw>(6889765/'%'#(,+)(+/,2.1U‹œ…€zvtromfd`\WTRQNNLKHGFFJKKKKKKLLLLMMMMNNNNNMMMMQRRSSUUUVTVVRTURH[qrqs^FBJMHEJJEIJKKJHEBFDB?;8548+1k§ †ŒmSKKKKNQQPPOPPQOQQOKMQVYZ]abaadea^]YTRSQPPQQRV[VX[[XY\[[\\[[\\Z^_^[WX]bmifgjliegjkiilmkqiXF<>>9)DqtQ:99@HMHCEHECKMCAD>>>?ED@IMCEKQJFJD9=F;-22-0;;735=DFLSTQQTUUWRPV[\ZYLGNPJHIM\\TNQOJHNJECA>>?A@?@ABB@>?@BBB?>BKNE>::=;438FF==^g8!"#"$<@)!*+8FLLMNOONNMNNMLOQRRPOPQRQPMQSQMNPRPOONNLKJGGIJFE>3($"$#  ! "%%#" &&'8Wigbfgjkhiq}€zƒ‚{ƒŒp9+@D4(02,++7H6!*?FGDA9=BD@>EOSQONQSQMOPPPOOQS@=]y‡‚€„Œ„{|‡Ž‡„’’ˆŠ‹‹’”Ž‘”“Ž‘‘’‘“•’‘“•‹Ž•ŠŒ‘ˆŒ™~QJXPRYYRPRRRTQORPG@C;]u^R\[WZ\[YSVZ[ZXZ[Z[[[ZZ[]^]]a_JHq“•ŠŒ’’ŽŽ— š’’–šš–’‘“‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$/?;8EF6[†€ŠŠŒ‘—š›œš “U)085:875.&$&%'))(()+0/205Nc_[WSRRQOLLKJHIHIJIIJJKKLMMLLLLLKJONNMMLLKKKLMOPQQTTTTTTTTWSUVTSUSHVmrqq]EAEIIGHIIKC=??;87321/.,,+3&)f¨¢ƒtUKMKKMONNMNNOORSSQOMNPVW[__^`ddddd^VSTOPSUVTTVYVWYXWZYXXZ\[YZ]XZ[XUTX\afihikhbehiedeedi_N@?BA>-:iu[EA=AA=7FINUURRTTTVQORY]ZVNIMMIIKNWYTSYYRPPJEDC@@B??@BCB@>??@?@?><>GLB;=@===:9=:42>0)03,*&8M9"*>EEDC;BGNQQOQSRNOPPOOOQSF?\vˆ„‚ŽŒŠ‹Œ‹†ˆŠ…†“•‰ŽŠŒ”–“Ž‘Ž‹Ž”–“’””‘”––”ŠŒ‹…™{PLZSSWVOOSUSRQUXPEAA;>FIGHJFIE?`v^Q\[UVYY\[]ZZ\^\[[\_^\^\\_\Y]`JIw˜‘‘”•”ž˜›žŸŸš’Ž“”€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!,<:7:5?~®¢›¥Ÿ››››œ”’e0,97:9972*%#-)&%')('73591-9IPNMMNNMLNMKKJJKKMIGIMPMJIHGIKLLJMMMMMNNNLLMOPQRSVVUUUUTTWSTWTSTSHRiqonZCCIFCHIGII8+-2312/00001115+.h¬¤~‹uULQNLNMMLLLMNOTSRSRPNOUTVXYZ^bdfiie^YWSQPSTUUWXTTWUUVWUTVYXVW[VXZYWUUV]gkd_beeadda_``^]UHBED><12`vcK@:BKSL@EKFAC99<>@BA>=?@???@?=?JKA:=?=?>:9<;54DHD=AalA  #'#!?I/ %'4DHJLNPRSSPPNMMNNMMOPOOPQPPUVRNMNPOMLLNNLIJFDDBA8+%'### !""##!$%  "'%,Daicbifeijmryƒ}z~z‚ƒb60>:3/3/,+)8K9%.AD@:677787888\y‚…}x†’„ˆ”“ŠŽŒ…‡ˆŒ‘‘ŠŠ‘•’Ž‘Ž‹“•“——“–”Ž“Ž‰Œ‰ƒ˜yOMYRRWXRQSRQTTUUNFC>:?IJGGIELKF`rYN^]YZZX\]\[YYXYYZWZXW[YUX]V[`JJz¡›••—“‘’’‰ˆŠŽ˜Ÿ˜œš˜™š›€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"#*97<@4Eƒ£”†€|vmfd`]ZJ.*74466430+&+)'&')*+66541*/?OONMKKLMMLKJJKLLMIFHLMKGNLJJLMKIGGIJKLNNMMMMMNNNLMNOQSTUXRTWTRTTLRjutr_HFLIDHJHHG8-.4432100.-,++..3iª¢||{TGNKLOQQQPQRSSSQQSSQQSRQRW[\\\]bgfb_]\]XSRRQRTVUXYWWYXXUSSTVWXVXYYWTQOV_eb]]`b^``^_aa_UOFEG@9<4 *XxiJ80@IJDCHIF@??B@:=FECJOKNURIPUKFLD8;A7,.0*)4;=65=FIPRRSUTRTTQPSZ]ZUNFFMQLHPW[Z[_\PKHECBB@=;??@CC@>??@@?@AA>EKIB>;;@@>97;955CHE>>\oO$ !"$&% "AL4 "$#$1BIJLNPRRRTTROPQQPPONNOQPNRQNNSTQOONMMMMKILGCA?=5("#!!!!#"$%# $(#'%.Hbfbehfhjjjr{ƒ|{zƒ~O*(0*())+...))8D4'2>;60)+,-/13446:>AKTRJOPPOOOQS<;^z‚yt‡‹ˆŽ‘‹†‰ŽŽˆ‰‹‡’’•’‘“–”‘••’˜—’•Œ’ŽŠ’‹„˜wOMVPQWZVTRMPUTQQNGBB9;FMLHEHIDAcx]O\\Y\[WXX[^^ZWWXWY[ZZ\[Y[^W\_IL{˜”—™”‘ŽŒŠŒ–›˜š›˜˜šš™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ &%*74400/..01368;=>>CGsªœtsŠySIQNMPMMLLMNOORPPRRQTXXSQV]a`_c`]]bgd][ZXWTQQTPTYYUVXVWVUUY[WQTTUUUSOLQUZ_`acd``_^_ba^NIBDG>:D6! OxoK4-7GIDHHBA7=IE=85;>ERSILQMEHLD@FB9?D:--.,-6>@84;CEIQUSSSPOSPPTY[XVNJFEKMHLZ\ZX\XNJKGB@AAA?=?BC@<=A>@@@@A?<>LI;:>>=?=758744;EH@9Vr]2 #%'(!'EM6&"%"$1BJKLNPQQQSTUSQPPOQRSQPPPPPRPOQPNOPPOOMLKJKHEA;83)   #%# !!#!&%/Iadafegjkhhq}„}~y{ƒzO..4,/1.-1../1;B3)14,--)+-//023374..=PVQOPPPOOQS@?`y~‚€†ŽŽ‡ˆ‘‘‰„‹ˆˆŽŠ‰‘“‹‘”’‘”“’–—“”•“Ž”–Ž’Š‹…Ž˜vNKSTRTVTTSOQPORUND?B;=FIHHILJB>aw_R]\X\]Z\\\YXYZ[[\Z[^^\\^__Z^^HM{˜’–’‰Œ’“Œ‹‘Œ“’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%&'--,458>21IPHJKHGJJFBAEA<:2!!"&!'0+%*2=75784/-9INLMLKNMMMKJIIJJJKKHKNMKMLKLKKNKLKJMNMPMNONMNOPSQRUVSRUSSSSTVUQHN`rvq`KAEGFDEHIFD>25FLMPQSUVWWW[WWy§¤j|ZHNLLNTLIOSPOQSQPPQUVQSRQTY_a``ca_accdb][][VSUPSQOUZYVXUVZZWVXZVRRSSPLOW[\aa__[]`_`daWHIHDFBFDJRVTUUPMQOQUXWUUMEEEEHGHUYWUVWPGFGD@>=<>=?=BD=648:71=EE?CTgqF!#'(,)EN6'$$'(%)5>IGMQMPVTQSWVQQSQMORQLKMOSQTUPNPPORQMKMLIIHFB<5-& "!#'$" &%%;)+1,..*./111.,*2)&'):MRTNMPJIPMA=\x‚ƒ|€†ŽŠŽ‹‡Œ‰‚‹”‘‹Š‘Œ‹‘•–”–‘‘”‹’•’’“’‘‘Ž’”‡Œ‘”†—vMLVOUUPOSQLRUVWTJA?@;>FIHHHINE?`rZO`_WWZXZ]Y[YWXXY]\[]YY\ZZ\[][ILw—‘Œ“”Œ‘“‘Ž‹Š‰ŠŒ‹ŽŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1<-$/55892-9JNIJFFFHIIFCBBAA;+!#)0-*.0./59731.9GNJHKLHHIJJJJILJJKKIJNKLJJKKKLMLILPNLNNNNNNNOPQSUUTSTUSUVVVUQNIK^qup]E>CFFEGIJFDA;E[ba]\[Z[]_a[WWy§¥h}_KPQOORMLONIIOVXZVOQWXQPQSWZ]__cdcffdcb`\XUUUUTTSTWUTVTUVUUXZZ[XVVWUPLU\_`aa_`_]^_]ZTMHGFEHD;AA*ArzW8003:FMG=:@JJA45BE?9:;>GKIELPLCBB>EOI525..47833>GDIPROPQOMURQTXYXXLGECEHHN][XYZSHDBCCBA=<>?A@AED?;<<=9669724;?GEJJOQNOTRSLNUTQPQMMNNKLOPMPSRPRRPNPPMLMLIJHFC<1'"! "&# !'$ %=[uƒ|}Š‹ˆŽ‘Š„‹ˆƒ‹‘Œ†ˆŽ”””–•‘”•‘“—˜‘‹Ž—’‘ŠˆŒ…Ž™vLN]LRSPQUUPQSSTRJA?A6' ",0+(,)'*-.--,.CRKEIHLJIIJJJIEKIFIKKLNLKKLMMKMMLMPNLLPONNNOOOOSUSRSTTTVWUTSRPIFUion_HCEFCCEIJGD@;H[_ZYYZZZZYY[VWz§¥gnlNIILQOMNQOKMTSUYXSSUTPNORTTW\`ddcghgfbb`\YWVUUYXTUUTTRPTYYTV[[XUUUTPMQX\^```aa^_`\VOIDBDGMG>BI25j|^;.33:GMB9:FFA;44:6:9=EHFGEEJQRRRNFENH3/1,,15712?HDMSSOQSRQSOOTZZWTMKGCEFFP`]YWTI?>@AA@A?>@BB@ACB>?>=ALJ?>?=;<5378314>GF;>Tioc;#" $'"*ENC2%/-(("&;KLPROORQMPUTOMPSSQQPMLMLPPPPRQPQNNNNMLJIHHHF:*! !$!$'#!%>Zc_`cdfghjmrvx€}|{„~O)#%%&'"%#""'%"("$)')363/.,*)'&&!(&&+$';NSMKPRSN?A_v€†€}ŠŽŠŽ‹ˆ’Š„‹Œ‡Š’”Œ”””—”‘‘“‘’’Ž‘–•‘”Ž†Š’‹„’oJMYVXVQORQNQQPQQIA?>:=FIHGFEKDCfv[M[\Y[]WVUZYZZXY\\XXZY[]\\WW\\KMv””’••–‘“˜—““™›Ÿ¢ ›™˜•€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€B?AC8.18BGDGHGMNKNQONROFBJF3,1-,05722@HDMSSOPSSRTPPW]^XUJIEBHJHSac\SNG@@CEB?????ECA@BB@?>?@?>?>=COMA>A><::96310/;FH>>UgihH"! (*#.FGB9&/0/-%);IKOQPPQQKMPQNNPRPOQQNMMLLMMPSQNPONMNMKHHGHKI:& !%(!!'A]d]^ddeghjmrv}z~}ƒuF" !"#$"$$""&&&'$"%&&.62*#$%&'&%$$)$%-'"/FTOIPRRP@B`xˆˆŠ‹‹‘”‹…Œ“Š‰’ŽŽ”•‘Œ‘“’“’‘’‘“”‘Œ‘””””‘‹‰Œ‹Š“•rQOPPSTRSVVSQPNOPJB@>:?HKIHFAIEDdqWLZ[X\]ZZYYZXWYYXZZZ[ZYZZ\XX]^KLs‘ŠŠ‹”•“Œ‘‘“’“—•””“”•“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*56.+9B?)(>KGFIIHHIIGHJEDIKGD>3&  (,((('((&$% )>KIIKIJKKKJJJKIJLKKLLJHKLJKOMJNOKKNPMNMMMOPPPOPPPPQRQOSWVTSRPKDSimfYF>BFFGHGECBA=GY[V][YXWWXYYRVz¢¢‚jp€xWJNONOMMNMLLOSSXZXX[[UNLOQOORUZ^_egffjghjib`b`]WUWWUWUVWUSSVYVVWXYWSPOPU[`a^ZZ[\[UQKC?@HKJC=AJ;'VxjH7.3BRN82>?:GJ5'1;JPGBIMNEEOWQJIF==FE2*-*)15834@HDLRTQSTSQUQPU\]ZWNKGCJJFM`bZPOIAADDA@A@?AAA@>?BA>>?@>>??=CPN@<>=<88742100;EI>>SgfnV+#(#)==<5&(./("+;EIMPQQQRSQOPSRPNMNQRPPPPRSOKORRSQNMNMJHHHHIH;(""%& )E_c]^dceghjnsw…€||~‚n?"%%%&')(&#''$))%&&))$ !#$%%%$%!!('$&>SQJMOPQ??]v€„~~‰Œ‰‡ŽŠ†Š‘‹ƒŒ•‘ˆ„‘ŽŽ””‘““‘’•”“–•Ž“–‘”“ŽŠ‰‹Œ‘Š’•rOPVQUWWVUQMQPNOQKCA?;>GIIHGHNFCbpYR\[Z]]XXUY[YXYXWXY[][YWY\ZZ_^KJqˆ†‹‡‡‘Ž–’Ž‘ŽŽ’‘‹‹Œ’‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'.:9-2B>0-=JHEJEDFJJIKPMLOPOPPO:." ".&((&&&%#(%#2GKGKFHHHGGGHHGIIGKLGIJKLJKMNMKKLKLNNLLLMOPQRPPQRPPRTQTUTRRQOJCNdkcUH?CEGGHFCDEEAIZ]ZXXWVVUUUWPWyžŸ…qky|aHINNLNOOMLORSSX[ZY[[XRNPQPOOQVWY^cdeefhijjfbhe^Y[[XWVTUYXTU[VUUUVVTSPNQY^_[V^YYYPF@=ACJJE@$$NvpM6.6GUK3.=>:JF(%59NTF;CMJAEKNICFF@7@C4*.,)24766?FEJRTSTUSQROOV[\XULIEDJLHM]^UQSL@@HB>AB>>DBBA?@DEB>?@??@?>DPNA<==>;4144004?EG=;Qfgn^4" #"4BB91%"'&$+2BHLNQPOROPPPQQPRNNPPMMNNMNMMNNKJQNLMMJIHLGDC;- )'##,I`b]_ccdfhjnswƒ†y}„f6&-+,+,1./.30))% ##&&##"$#"!!#%&%$##$'((;RSLLLNQ??]w€…~~ŠŽŒ‹ˆ†ˆŠ‰–’ˆ‰’•Ž‹‘”’”—“‹Œ’”•”‘••’’Žˆˆ„Ž˜qGL`TUTSSSSSQQPRRKCA@:;BEFHHILB@aoWO[XVZYWZX[YZZYYZXVZ\^ZWY[[[^^JKr‘‹†ˆ†…Œ‹ŠŠ‹ŠŒŽ‹ŒŒ‹‹Ž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ *0?C0/A<23AKIGJOMJGHLU[][UNKJJLKKJD;.!'(*($"#" $%!*BMLMGGGGHIJLJGHKLJJJKLKJLKLMNJKNLJLMMNNMMMNOPPQQPPRUQRRPQRROMHPgqdOCDEEDDFECEEE@HY\YVWXYYXVUTOWw™œˆxmp~mQORNLMNNOQSUVRU\_`_[ZVSRQQPORTSRX]adbbcfjkhdilg``b^YZZXUTWYZWWXYZYVURNQX]_^ZVQQSMEBB>AGDABABFC+BptQ4+2@KB-.@;>L?',AC@>@@??@@>DNMB?><=8436427@@CF?;OdfjfB$!$$ 1FE>>0&+0+',AHKMQNKOSPNRUONUQPRRPPPOMJJMMKLLQNKKLLKKLHD?7+&/-!"0Na`^`abdfhjntx†y‚X/)300..519<;/+(#&&**')$#" !"'&&(((+/=PSOMLOP?B`v€‡~ˆŽŽˆ‡’‹‰”‘‰Ž•”••Ž‘–”‘•Žˆ˜–ŒŒ’‘“’‹‰Œ‹„“ŸyKL\VTRQQRTUOQRSRJA@A;>EHHIIHKDDdqXP^ZVXVUYWZWXZYZ[XXZY[ZW[\[Z]\JLv–“‰‹‰ˆŒŠ‹‹‹‹ˆ„†ˆ„‰†ˆ‹ŠŠ‹‹€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!)1CI82;;16GMJIJLMJB;::9582+-.**.258@GB7*%*,*('$"$!&:HHEIIHIIIHGJLJILKHGLMIHKJHIKKNOJIKKMNNMLLMNPOOOPPQRLNPQSUSOJCH^maJ@ACDDFGFDCCB=FX[XWWVUUVWXSNWw–›Š}chvQJPPPMJKNRPLSNOV[^`_ZZWTQPQPPSRRW[]`f^\bhiijikjihd``_[XYYVUXYYXWWWWVRMOUXZ\ZUSQNF@=9?AEA?CCAGG07iuS4/4?H>,/BCED518;BGHB@@>>>@@??@@?AJHA?<9971-0;EHG>AFB>ObdkpQ%'&&!.?:9?@;<;*#2AILMPMHLMQPNQRRSSRSUTSQMOMMLILOMPMJJKMNMIJG>1%*30$ 1P`__a`bdfhjntx~}~‰yJ-*511/.612;3!%'#(*/,*.)""""""##(&$(,))0AOSQONPO;A_r|†€y…‰ˆŠ‡„’‹ƒŠ’…†’‹Š’•’‘š—Œ’›•‹‰‘˜“’‘’’‡„ˆ“nJLWQRTWVSPOMPRTQH@><9>GJHFDEJDCanYT\YX\ZXZVVWVW[[YZXYX\\YZYYX[[JNz›šŽ‹‹Œ‡…†……‰Ž‰ˆŒŒ‹‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!05?J7)9>59FKJJII:,&$$%&$%&%$$&('(" &,2;H:( &))'"%#%*?MEHGGIIFEEJIHIIIHHKIJMLIJNJKLKKJKLLKNQOMNNQQRPORRLNRTQPQRPLCJ\i_JADEDDFEDGBBCEKUYSWXUPPUXVWLSzšœy\c€rMIPTPOMLMNPRLNRW[_ab\XXWUUTPSPOPRSW\_\^_`ekjgihcchhd\[XVUVWXVVTTWWVVQNKLRYYURRSLA>@==?@33@A=@948=BIF=9;:8346?GMOECBD?9G^gam`- "#$%(.6<3@=<@/!,BGKLNONJMOPPPQRROOPRRQNLKMOONOOOLMMMLKJJKJF:)+4:9'$#2Va\\]achhinpsx…~~‰qA&+*&&+.-.2/#$))&*01/14.-+(&'((&'('(,01LROKKNRL>Ebt|‚~€‡‘Žˆˆ…“Œ„Œ•‰‰‘‘Œ”“Œ”•’‘‘’‘Ž“ŽŒ‘’Œ†…Ž’Œ“•oJNZTSSRQQPPOPPRRJ@=:9?GIHIJFHAEgnUT_ZVVYZZ\ZYUVZVTZ[WX\[[]]\UYYFN –‘•——“Š‹‰‰‰ƒ€†Šˆ‡ŒŒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"+:F@0/=?08KLJH@) !"!**)'&%&&$(('($)8D@.%&$  # $7JFEHJIHJJIIHHIJJJJLJKLKIJLJKKLKKLMOOPPMMNMMONNQRPPSSRQRRPMMHKWfaJ=DC@AEFCCD@=@IVXQWXVTSUVU\PSx–™}^\zvSJNQUTRMJJMPSSTWZ_cf`][ZVVVTTSQOOQSUX[YZbgedbcdehhc]_^[YYWUUUVUUXVSRVLHOVVTTMLJHECABCCA?>ACCAE8)_{`<:@=:978688867=;::;;;BDAINC7GVJ;6:EC3),,&340*0@IIKSSRRSUONRVXZ^^[VNE@@GMNXYPIKH@>BCB?>=<=>??C>??FD;8:979?DKLMNF@EG=7J`dbke9!###'08>?9>AD@@A@><=A>BDAAA@=@A?9648?MOONJJNIBBE?:I_fdhlK"# ")/=936<835>FLLKKLLIJLOOMMOPOONONMLNONLMNONNKKMMKKMMH=.!'7BC:'(+!5<% 6Yc^]_baefgkmpu…ˆ„‹l6 #%'&&"#.588610674101110486596;KLNLMNNRP;A_s€†{v‰‰Š•Ž„„ˆ‘ŒƒŒ•Ž‚‰™˜’‘•”•–Ž•–‹’•Ž‘•ŠŠ‰Œˆ“nLP\TTSSRRRQQQPSTL@;97?KOLIFFIBDemSP]ZZ[\ZXW]^YTX[ZZZ[\ZXY[ZY\a[GR—’’“•”Œ’ŠŠŠ‰‡ƒƒ…‡†‰ŒŠ†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.2+*.4<7;AIMD.$%'(&"!#&"" #0;B7*!!'$#" 'BGFDDGIIIIKKJJJKJIHKLJIJJHJKLLLLMNKKLKJMPPPNORQRSQSRSTSOORKGEPgdI>BDDBEEDDDCBBHSZWXUVZZWVYYTWw””Œ„gTkxYIMOMOQQPOPQQQRTW\`bbaba[YYXSTRONNONKMRUTY\Yabdfecccc`b`WVXVXXVTVVUWQKIOSSSTKIA>>@EMIFCDEC@=?HD*N{f4#368;7326;ADOD4:6??4*((%'+.19AECMUSQSRTTPTTZfcUNVQDAGIFFGHFFGC??@=?A?>?=>=?BA=>BBB>99866:;95325777@KSMNKNNMQP>?]wƒ‚x{‹‘……”„†‘”ˆ•‰ŠŽ‹˜—‘”ŠŽ’Ž‹”‰‰‘˜’‰‰‹‘Œ‰”—qKOZUUTSRQQPMPQSRJBA<:?GGFGHLLCGgnTT\XTVWWTSTXYYYWVX^ZWXZ\ZW\Z^^IQ~›’ŒŽ•—ŽŒ’”‘‹ˆŽŠˆ‹Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%%'.+,;59DNJ3 &*,5FI;.(&$!$-BIOD6.%# ! $>FECBEHHHHIIIIJLLJIKLJIKLKIJLLLLNOLJLMLKMNMLNOPQRORQRTROORIHENffK<@EECDEDDFB@CLY\UWTTXYXY]WTVs‹‰iVivZINONNNPRRPNQRUW\_bdabeea^][XVTTRPOOKJOSSSVVY]`aabcdcb`^ZWVTRTTSTSRTSMJLPQPOGDB@@EJIHGDBABBBAGE.Dvm<7C?8:94,6;6135/,,*+*+/5:>C@<=?@ABCBE>;>@=:9NK>>HOE=BFJEE:3AH<9@<60-,*(,)(*1:BFJRPSN?DZZVUY]aefUJ@CGC>?AJMGDDA:==>>?@;30003579;?@AC?:9<>BFJLJFEAFHKGFIC?BFA>LQLMICGHEIMF?HHA9::7@A@91;E@@@:4111005999BPYY\abdaZ[]LLS]cca_PE@DFDB@DLOGACB;?BDD>53841021-.1.12248:9:LVQJHIJGHGHEFIBA@DD?J_ichgmZ-!! "($ "&-6=ELLLMONNPQQPOOOLNPPONMMPQQOOOPOQOMMNLJHB?.(7@HI;(-GD%3O_J%"%:Zb\]`eeiiimnou~‚ƒŠ„T*(/+23(&+$'(!%(3<7+$"&,-+.5;?HKHFCJJBEflSS]XUWZZXVYXWWXZ[ZV\ZUX]\YW\`UBT„˜’–‘”‘ŽŒ‘”–—™š˜•—š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&+,11.9MTI@:7-,3/&)./1112573/00-0424467640.-.)/F: " ,CKFCEGGEEEGGFGKKHIKLMLJIILMMLJIIJKLNMKMOMNJKPONOOMQRPOPPOMIFHZfWD>GJFDEEEE@=>HX^ZUZ\YXXTNYYUh~||„|aZjbLJQJJKMNOPPOPQSUY\]_^bgikjf`bdbbb`]\VUTQRTSPOQUVW_ic`dbXW[XVWVSRQPSOIGNTSJCDFGMSOFDMHFHGCDH>FXS+)_rTCDCIG<;@@,073345=9.,>B7=E:0+9GCDCBBFHIKNNURKQbjebimmlodF>BFTef]\TGAAABD@FMOF?AC>?BDDA813:<>=;::;<=<941/.4;=:>DC@HFBEIMPF>BGA98?HHFEFDJCDeoTO]ZXWWWZ]YVX\ZVVXYZYY[YX\YZ_ZFP~––’’Ž“š’Œ‡ŒŒ’˜›™——˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"#!!""%&+,14-.$  !""! """!!!#$!).(&12# ,>IDEGEGIHBHIHJKKLIHJLKIIKHIKMLJKNLKMNJJJHIKNMLKMNQNMQRNLMKKIEUgX@>CDBCCBBFB?@HV][WXWTUXWRQTYgvx|Š‚gYfbMKVPMNOKLOLNJJQUWZ^^_abcfikfecbaabb]ZWVVVSPQRTW[^`_acfe`[ZZWWVRRRQMNHCHTUKEGGNWVLFGJHLMIGE@BK]\3YsN0;C6.5:=C=4>A/0HM819NM9@F:/0:A?9CBGJC<::AFKKXkplhdhqmYG@A?CGN[_VL?=BA?CFFMKFJMGA@A>:9=??<99<>==?FCBCA==@<:6322343:7?IGECAGJA=SfabecllD!'* $#+/!,;>GJ@.!";K=% ;R\J)#!5T_]``^`hljkpsp€ˆ€†K&-+(,*(.*&*% *3:?8,  $%(/8HUPJOIONKGKSNCFFFGD@KCEejSS]YXZYXYXWWXZ[ZXWZZZYY[[Z]^]RAP{†‹Ž‰‡‰‹ŽŽŒŠŠ‘”‘’•”€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" %"$)+*! ,FJFFGDEJKHHJLJHIKHJKJIJJJIJLLJILQIJKKKLLNHKNPONNPNNOPPONOIIIESfZD/PS73CFHGMHIMGEHPOPLNI75D>22>B>>DB?CFENTVYTHB<::?EHC<@CFFCA@?@DIJE@@DCDEFEB?=68675387VjgbjgeldF..! !" +=DIMPNLONOPPQRRQTSSSSSRQRQLNSRNPRPMNMLKG<+.Ebs~„z~†ˆ‹ŽŽ‹‡Ž“Ž‡‹‘Ž‰‡‘‘‰Œ˜™Š“Ž’”‘Ž‘•“–˜”’‡ƒ‡Ž‹ƒŽ’jGLVSPSTPNONONNQSLA=:CECCCBCDA==ET[XWUVXVSTWWQP_mjo‚†o[^\NMTPNNNLMOMJKLMORTT^]][]`eihfeghhfchie^\]\Y\YWVW[_cfhgcbcb][ZWTSSSQKHJRXQIIKNZ`UIFFJJLLHEDAIRaa=JeJ=JRHDIHGGGDFC>ADNGA@B?86@?30=A=?BH>/18=B:9/18=B:@YgYGEKMFCGHCCFAA>@CAAGL^bb_YK>;BE>>The\ceciqoe]I+#(&!$5>DINPKKRQPOOPRRQPQRQPOPQNORRQOOOOLKLLKMH8&$1?FGC4$*?G7"(BUZF% 7V^[]_bdimkmrusw‚ƒ‰xA!)+',)(,)$&!'.2*" (.=D>1"!'0?WcZOLJNKINF:Cbu…{~Š‰ŠŽŽ‰…ˆŽŒ‡‡’“‰Š–˜’•’ŽŽŽ’‘Ž”‘ŠŠŒŒˆ†‰Ž‡‘”lJPZNOSSOPRQSQPRQF<;><@EGHGCGL@AdiQP\WWYWWXWUUXZZWVW[VUWZXXZX[^VEV‚’‰†‡ŠŠ‡‡Š‹‘ŒŠ‹Œ‹‘’‘’˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€2SA!$%',08<=;547=?>855-"!&)&,AFCCGGIJJFGHGGIJGIKKLKKKLIHIJKKJIJMMMMLJLMMMMLMNOOPPPNOOOLJIFN`\F=ABABB@@A@@AIVZTVWUTUXWSVTT_hel‚„r[WULKPPOONMMNNSPMMOQRRSVZ^afilkjigedddcffdccb`a^YVUVZ^adedbc_ZTXYXWXTNIGJQSMGHMR[YJEHIHMQOHDEGNWceE 8VM9BKD=DFE<@?;22<;::;=5-39B@609CC?EM;0@E98MG9BGCLJIRUMFHHFEGEEHKHEC@@CITbkikeWH<=Rechihebdo{„sE"!"=J=+(6@EIMOLLRROMPPOORPRRQPOPRORVVQSRNQOMOLLNI6#!*5BIG?-0AC1 .GWYC#7U\Y\_ebgjkmrrpyƒ†‰q;$/+'+(&,'##" ##11)&)#"-:IL4  )1BZjdOFLILTH6Bbv…{€ŠˆŽ“‘Š…ŠŽŒŽ‹‰…‡‘–“‹‘“Ž’”“ŽˆŠŽŽŠ’’Šƒ…‹†ŽgGOXKPTQOQSRMMNPNG@A<9#&)+05;>>?DHFD>3($)/+/.09954**+-,)3GFDEFHHIHGHFEHJIGFGHHHGHHGJKJHILOIILNLLNLLMNNNMMMPNNOPPPPNIGFL^^F:BEB@?@CDB?=EU[VUVUSUXWSTUU^gek{v_SQKLNPPONNNNOKLORNHEGNPTW[^bdiiiihhhhffgigdce`][ZXW[__aefea]ZRRRRRQOLJDHSSHDIOW]THGMLLOOKFDHNT[chQ%-CD;C@6=?429?EE<JMDALRMF=58FKA=D<286/1;71H^`^N>HOKFEFELNHDH>7>GEBAHQZ^d\NDFKLOC83=KOF;5;FNNGA>LLKLSZXQ=AL[gfZNLOIMURPLDCC>>Sfddie_dinv~tM2;:'$7Y`F/,6BHIINPOOPNOQQNOQTRPPRSRQNRRPQOMNNLKKJHKH8%&0:DIG<(4B?+2KYW@"&?Z^[\^efghhlpssw€‡‰k5#.*&+'&*&!$! *:2''-$"*?UN3!"&+Bay^FIMOSL9Car}ƒ~†‘Šˆ”“ˆŒ’Œ†‰‡‰Ž‡ˆ‰•”Œ‹’’Ž†ˆŽ‰„ˆ‘‰„ŽhGMSPUVQOONMMPQPME?=>:>DHGFCBJAEegPQZVVXWWWWUZ[XY[ZTZUUZ]YXZYY]SA[Žœ‘‘ŒŒ‘Ž‘”•ŒŠŠŒŽ‘““€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1K9$.120//149=BEGCDEFEB=:)($ !+78=>?A??CFEEECCDFIHEFKJHJIGHLKHHLIKLKJKMMJILMJLOMMMMNNOOPPNMOPQQQNGDEJ]bJ=CECCBBC>???GUXPTSTWUSTXTSQ[hhfo}{eRNMOOPQOMONMPPMMPPKKOOOPQTZafhgfhihd`gccffccffcbb_[\`bcfheb^]YRNQOKJNGFLUQHEGNY[QIJKJNNIFFGJNY^aj[06FG83?OM<:KLPUTTVOLMPTVUU[TIB;6?E<57<;0.11./*8MVO81CPMHIJHGME@GC77EHB==<50<84ALT]dbYOHYfc]XPXcJFD?>Sdcfke_dhjr‚uP7;;6>>G_^A25?DIHGMQPOPQRQPQRSRQOOPPPPSRRUSOMQNOKLLKML=,%+5?FGB7%#8C:%6NZU>!(@Y\[]^eghhkorttvŠk5$,*&*'$)% ! "5;/%*2, *DYN5 ,Aiq^KJLOM9Cbs|‚}…ŒŠŒŒˆŠ“‹ƒ’Š„„‘ˆŠ“’†’“‘‹ŽŽŽŽ‹‹ŽŒˆ‹‘…„‘”lKMPRTSQRQNMMPPNKGA?97=HJHFDDKADcfPU]YXZXXXWX]]XUY[ZUYZYWYZ[UW^UB]š‘“‘Œ‘Ž‘•“Ž‘’”””—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€;P4(0;CGGFFFFFEEEEECDDEA8+! !  !->FCEHE@EEDDDBCEJHGHIIHJHJKJJJKJHIIJLNMJKKLLJJKLNMLKLMOPQRQNNOPNNGEFHZcL?CDCEECBCCA?FV[TTSTVURTXUQP^lf_eu{fNIJMLPROMPOMPNKKORQONNOQQSUY[``bfijgdeaadgfefdcdeb^_c`beffc]XUPOQPJGHEIRTLGGHTYSGEFHLKNKFEFKT]__ke85PXLMRUVSRNOJHINQHDDGDDA?NXLGC7146=:<<=FQTIE91154,:FLGGLJCLRNCFJ@13<=9<<50'%!%-.+,3IO=147?EOR>;DEW[RML=((67<99DJJNOJIGC?=BKIC=?DA97ANOHF@2)5859??>;- $!!"+/+,6DKBINJEFKO@:9?FHJLEA?CJMIDHMWdebbWJDB?BViid`fjdgoosrW3)/7>47VbK=?DFIJKLJMVPMMQRQQSTQONPRQPRVTOOQONLPJHLJIMH;23;EH@5- #/;B3#9Q[S;!1GZ\^`^dgeeimprrwz…ˆa.")*&*&$($3B@.&),/.%#!/LT:% !;MjrUEMG;Fdsz{†Œ‰‰Ž‘†ŽŒ‡‹‘ƒ‡ˆ†Ž’ŽŒ‹‹ŒŽ‘‘‰‰ŒŽ‡†ˆˆ…‡Ž‹‡‘gJPVTQLOVSMOMMNRRH?>>;>EDBEGHLAFhhNO[VVWVUVUTWXTRTVUTXZYZ\[XYX]R=[’œ•’’””’’’’“““’’‘‘‘‘’“–—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€  F8/ADEKE?>ABA>@ABCCBBB<4-#!#" ,CK@AJHCGHFEGGFCIKHHJJGIHIKKJIJIJLLLLLLMKIJLMMKKNMMONLNMLNLLNPWUKDDFWbN=>DDCC@BBA@?FRUMTWSNQTUXTRTfn_ZbjoiUHJONOOMNQMKPQMNRQLKNMNNMQX]]accabffb\_a__beeda^`a]Z\`bdb`a_YSPMKLMLKEHRRHHPTUPJDCDGIMNNLJLU_`^`muM#/@BJ\R:>KSL=?J=0=D><8@F;5HTKEB+#3/0687DMEED><:7=CEQL>?D@8819EGFD<=?A@>;99;<4*$$$ !&*089579;@=BHKJEA>GLOIAAKVhndTUWNGBBD?=SihcfigcdltusM$#059;BOYMAFIIKMNMLLLSSQOQRPNOQQQRSQMRXUOQSPOSQLKNMJKIF?@ADI?4+  '1?A/&DU_U:";U\Y\_bchifdjttnv~Œ‰[*%.(()%(*  4@?0).1.,/%%9OR4$ !!(6XtgONK8Cdt{x”Š’’…Šˆ‹‹ˆˆ‰‰‹Œ‰ŒŒ‘ˆ”‡‰ˆ‡…‡‰‰ŠŒ‡‹ŽcCMURPOPQPNKRQNOPC;A;6;DGIHBAGAHdePT^VUZXTTWYWYXTWZUSUUUY\[[U[aPCf’—“—™™˜—˜˜™–’–˜’‘”“Ž—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*1%*BKGAFC@ACDCA@BDCA=;:.'!" !#"'9FFGIDBFHECEFFFHJJIHGGHJIFEIKKLJHHJKJILKJJKKKKKJLMKLMKRONKLMMSVJCEDR_M<>EDBB@C?<<>FQUOTURSVUQRTQRgp^TZekgUJKOOLOMMPPOQQRPLKOPOMPQPQUZ[b_`fgb_a[\[YY\_`aca^^_^_a`ab`_[UPOOOONLJLLRRKLTVUOIEEFJMOLKKMQX_b`bozX""0?BFJE@B@99EEKXM57@A@HH@>ED969:=GMC5??<=<<<2;=<91%&" !"$'&$'05:>@@ABKVUJMajdh_PFHHECDCE?=SgecfifcdlsrI''--33?BFJJJHIKMNMLLMPPOPSSQQTSRSSQOMTSTTQMOQPNLLLMMJKIDFEFG;-%%-7>>- ,DS\Q7&@X]YZ\aecilggnsst|‹ˆV% *(()%(*  3@<0)-1/.0-  ):PF."*CfkWNL=Ebu€x„’‘‹Œ‘‘ŽˆŠ‰ˆ‘“Š„‹ŽŒˆŠ‘ŽŒ“”“Žˆ†ˆ‰Ž…‡‰…‰ŽˆƒcEPVQOOPQQOMRSNMMD=A<8?FEFFBBE@JgeOSZXWUSWZXWWUWZWTVZURVYVV\Y[_O@b—ŒŽ‘•–––•˜˜–’‘–˜–“‘–˜’’—š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€",?EBHHBBAABBA@CA?@A<0''!  #,8CHFBCGIFDEGHFIJHHIIFFGIJJIIIIJJIGGHJIIJKJJJKMKLMKLNMMLMMPPMRYJDGCM\MEC3,48;EMC3413@CBE?78@HI@EEE>>Tfcdfhfcdkr|wO)/>;5679?AFNLIKMMLLLMMORSTPQTROPTURRTUSQQQQOMMNNKINNFKLJLJGE8)!")4;?;,$5ERVJ3,I[\X[]bedijghnsst|ŒˆR&())$()"2<:0),11003''CP@$#/MfcUH8De|ˆ‚uƒ“Ž†Š”’‹ƒ‰‹ˆŽŠˆ‰‰‹‘Œ‰Ž’ŒŽŽŒ‰‰‰‰ŒŒƒˆ‰ƒŠ“‹ƒeFOVPONNPQPPNQPOOF==;8?FFEFBED=IhdNTZXWTTXZVXYVV\YTW[YWWYWWYYY^PA^‰’‰‹‘’‘‘—™•““““›–“–›™˜™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%6CAAHBAAA?>==>?AA;2*%$(/5@FDCCFGECDFFDHIGGJJGIHHLLJHIJJJJKJIHIJKKKJIIKMKJLLKNMMMLOOMS[MFHCL[O=?DDAB@C@==@GRXUSWY]_ZUVXQOl~hTW`ebVLKLJMQOMOQOPLMQTTQNLLMMLMQW[\`cehlkhgd^XVWUSYYZ_a]\aa`bda_ZUSQNKJLPSILSXWWXVMIECFJMNMHFMV]`agkos}m7(GVUZRQ[VNLPVLEH@7=BCOQ?9EMDFQME;$=:&.;73AALL<7D?DCFHD@?D64238A@6.'$#!#""""  #%%+7?@ADBEIFCLPEBED=@VfcdfgecekqupR;AFJNKJKMMLLLMOONQUURRTQQUTQORSRPQSMJPNNOONPOJKLKMJGF9*! %.7<@9*)@ADF;A@?><<=>><7-$ "6BBEGEEEEEDDEFFFEFHIHIJKKIFHJJGJJJKLLKJLLLLKJIHLNLKMMLOKNNLONKS\OGFBKZO@?CBBC@A??>=COUPS^eeda_b^TPo…kSU^b_UMKKJOONORONROMOSTPOQOMJHJNSW[]afjnnlhfa\ZXUPRUVW[\[[^ad`\YWQOOMLKLNPLMRWZZXTJHFEHMOMMKLS\behiourwn?!=H?@COWG;@IKD7=KB0=22;?6=B0,5/5E>746;<9>51/+)("  ! "  !"#!!##!+&+105>?=DD:6=EGGHCIG@@?>>===<;5.'##!",AJFDDDGGFDDEFGFGGFGHHHHKIGFGIHGHIJJHIJLJJJKLLLKJIJJIJLJJNOMPNJR]REDBJUOB?AABD@@@A@>BOUPU`b]Y\bjj_[|‘qST`b^TLJJIRQOPRNLPOOPQQRRSTOJHIJMPU\achnmgffd`\ZUPSRPRVXX[[_b^WWUPLLKKKKKKKLOUYWPJKIHJNPOLNOSZ`dhlkqwponH%19?AE?7=ND0:GGPOKERG4J^]MKSb\OD4*0+$,68:7=IHIJ><@A>@HD5.169779;=7=F;4''6CQQG3!,CUYY_a`defghhjnqsuy‹†J '&!+)!"(2:>4,-11/.-5<9)!0IE+%2Tl_=C`tƒ‹~}‘‰‹’Ž‰‰‹Œˆ‡ŠŒŒ‰‹Œ’’Ž‘’‹““ŽŽ‰‰†‚‡Œ…‚‰„‹š]CPTRRQOMMNOOKMSOD=>:9AGDDFCEF?HgdNRXVWXTSVYUUWYVTTWXVUZ[VU[XX]PA_Š”ˆˆˆˆˆ‰‰‰ŠŒŠ†…‡‡‰Œ’“’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=EBAA=><==<==81+!#$# !!!#!(@DEBABDFEDCCCDEFFGGEGIIGIFFHHGHJKIGGIJJIGHIJJKMNJIKLJKLJOQNJNLHR`UDCFHQPB@BABC@A@@??DQXVTZYSQS\gmddˆwSS]^ZSMLNNNPOORQPSNPQPQSTRTPNLJHJMPY^^cmmfkmkfa\WRTQOQUSV\]^_[URQMLJHHHIIHGKPTUQJFMHHOSPLKLOU[_bfknpulkpR'8HNUQ99UeZBJ_]YYXY\ZVVVUPTOMRTK9//'$-//677HLJJFMJE?;;:;FB90$!0?FQOA-3NZZY^_\cfggghknqsww‰…J%$ ,* (4=>2*.20/1028;3# $;G8#!)>\fBAax‚‰‚‡Œ‘ŒˆŠŒˆ†ŠŽ‡†‹‹’‹ˆ‘ŒŽŽ‰ŠŽŒ‹Žƒ‚Œ“‰‡Ž†Š˜^BNSKOSUSOLKMKNSOE><:9AGDCFDEE?KhbLSWVWWTUWVVWWXXUTXWZZXYYYYVY^NAc‘™ŽŽŒ‘‘ŽŽ‰‰Ž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ =A?>;:=8=<<<:1#!! !#!  (>NE@DHGECFEDDDDFHGDDGIIIJCGJJIIJKIJJJIHHHHIJIHHJMIKKKMLJKLNKIPOJSdXEEIHOQA@CBAB@B<;;>DOXXQUWWVSV`f_c‹ wOO``[RLKLNOSQNPQOOOOPQRSTUQPPPLIJNRTW\cimnjmnkgdb`QSSRSUVZZXWVRONLKHFFHHGEHNTTQMLONFFRVNHIQTZadfjnporjjtY/$NcVMWSPWSMPWSJHIF@ICBLOG<=0 +$"3.!9MJD>IOKMNHIRVWSTQGGIA:53;29M7+5.+=E?A928@>>9, ,("'/*+,+))*,&$""" !"!!$&6IL>?TdggfdcceiktrT87;9?NHD=4,"#6EIPL>*!9Ua\W\]\bechllhhpxyx‰‡M$# ,*!(4=>0)/4103334660$#-FFFHDGE>Lh`KV[UTXYWTPVXWUUVVVW[YTTY[\RX_PCh”š“’‘‘‘‘™‹“”“’–”“•—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(?A=9::9<;84-#!!!" "! !#$" '#"!"5FFDEFGEEFEDGGCFJFHHHHHIIIHHHIJJIGHHIKJGGHLLIIKKJMMJIKMMKKKLLJNMKSeYFFKILL=ADDBAABA<CUL>=ELE9CJA7;E?67HN@2@RM@C3 '%0'+GME>6EFKSULIRPI>55995011-/@JF@ELEFH><561/7>@A8% *&%) +, $/2.*//++(&& !&%"!!6EH>BYijceecbelqxsM*/<>@L>9@HKLQRMJLONLJNOMOUUONRSRRQQRSSQPNKKNNNLKKMNMLLOOLJJJJE>99>CB;/$ !&:JHPR>%$1@O[YZ^a``adehkoquxu€†L !(# #'2=81-/341/12873;8#$%,=>, $.AXTD^~‚€…‹‘Š‡“Š‹ŒŒˆ…ˆŠ‡ƒ‰ŒˆˆŒŒˆ‘‰‘‹‹†…Ž•‡„ŠŒˆ‰ŠŠ…„“aCMSMQQMMQQLQONQPG>><=ADDEEA?C>Lg_MUVUY\ZWWVQTVVWXVSVUVZZVUV[XZLBf’›’’‘——’‘••‘‘•••™—™š˜—™š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*=<;=>76?95,# #"$"!#&'$!$% *;DHGGECBCDEFCBEGECCHGFEEEEFIHFFGHIHJHFHJJIIHJKHFJLHJNKFHOPKJLLKNMIPi\ECJIKJ?@BBABDF@;;=BOZYUVX]^XZei]b‰¤…XM[aWMLLMLORPPRRPRSTRPPRSSWTRQPMLNHKOSX]cgmoponnljg`XSQQU[][VSPNLJIIFFHHFGHMQOGEHLMPONOLKQSYagijmqrpmlkxm=1>34??BA7:G@/8ECHTMGQJ@L[]XPVd^HF>&"(1+,026BE:3DONLJ@2>@<2/598;ACAACHLDGRF8>>5BXhgfggdacinusT20;?BBAAFMIFMTOKLMMMNIOQOPSROPOOQTUTRQRSQLKNPNMLLMNMMMOOMKLKJLC?CC?:6-!$+:IJPS@)(6HW\ZY[]]_acfijlptwvˆP "'#"%'0:9/),1222*286497.  ''1;7#"!)>NTKa~‡†Š—ŠŠ‹Š„‡ŠŒ‰‡‹Ž‰„Š‹‰‡‰ŽŒ†‹’’Œˆ‡‰Ž‹Œˆ‡‹Ž†„‘Š†ˆŒˆ‚’cAKVPRQOMNMLJLORNB:<89?EEEDADI@JgcNPZVVWUTUTTWXXXWWVWVVYZWWYVY]MBg’˜‘”““–•’”˜•’‘”—šœ›˜™š——˜™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.@<9=?96;)&!  #%""""!"$%$#"+>JJHEFECCDDBBFDCEDBEEEGGGFFEJHFEEEFFJIHHGFGHIHIIFGJIKIIKLKLNJLNLNMHNe]GCLKKFBAA@@ABCA=;CZ_ZZ[\YRS[ZQTWOQWO@A4'(*462+-:CB2;@FMH:14=A?BJKE>JMIF?:=5>QNFX_P?IK?0*097@B<+%*"$# *'$# "$ "#!'+*.429HJ?AWfffggdbcintqW83IfcORWSSVVVWUXWWVUUVXZXWXXVVXTX]NFn˜˜‹‘’‘’“˜“‘‘““–™•”—™˜—˜˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1D?87;;5.  "" "$&!"""""#$"#0BIHGFBDDDCEDCBDDEIKGBHHFEDDEFHHIIJJJJJKKKHGGHGLKGIKJHIJJJIKLNLMOMNNKOgdLBHIHD@@???@??C?;:APXUVXWRPValh\c‹¥Š^Ocj]QNJJKNOOQRSSUPQPOQRQSTSSSQONOOOOOQU[_ccgnponpomicZUX_^][YWVTSRPOQQLKRXWTNGIOQVTQOOPRVZdmqstrommkkjsoN3QYTV^bXVYRUWSRMFHEBCACNK?EJ=;FIA@:%&)+540.027??=59IJDFKJFDHKC65@A;>FHGMU`^[eaKIEA>80**29AWffbdeecfkpvoT85?B@JF53EMMPNOPQOLLNLKMMLPRNNPPONMPRRPPPOOPNOMKLMNLIOOMMMONLIKLKIG=0'!$/8CJJKRL?2-5:513/563,#&"!*>A*#" +8GR`q{s‰•‹ŠŽ‘Œ†Ž‰†‹‘Žˆ„‡ˆ‡ˆ‹ŽŒŽŠŒ‰Œ‹‰‹„…ŠŠ†‡ˆŠ††’Œ]COTPPPONNNMOMMPPF<;96;DEDDFEE>>>@@A@A>::CRZYY]]UT^jnn^`‚œ‡`MamaQMJKMMMOPQRTTQPRSSRSQSUUSQPPOONMLMPUY_^bilkknmnplcZ[`_ab^YVVWWUTUUOOUYWQLKLS\YRPSSSV[djoprttqlnnomnkQ#*L\QFIMEOMB@DIMA@ANK+'GPIMONONLILONPSQMOSRPPPQQQPOOPQPLLOPNMNNONMLLMNNPQOKLOOJIJA0(',4?JNJNRNDCIRXXY[[]_ce`gkgflrtz|†‘l)%&&,&"/A>3/6:537065&'&!#2C5&!#!'4=M`pƒ}u†Ž‹ˆŽ‹Œˆ‘Œ…†‹Š„‡’Œ‡‹Ž‹‰‘Ž‹Ž“ˆ†‰ˆƒˆŽ‡…†‰††’‰[BOSORRMMOOKKMOQMB;=;8=EFCEFIFA@??>?AB@=:=FPVWUZac`cecaVZ|™ŒeMbuhOIKMNPOQSRTVUSORXVSSSTWWTQRQPMMMMMPTWZ[^befhilorqi`]`cghd\WWZ[YUWYVTW^YNKNQU_[RQVXY^dlmnnopqpnqqsoliW+1A;2?G;CF@DH?7:LHOMBLSDENVWZ_a_RDFA*#*11.*&+25*-@F75@AKE?;8;EOWZbd][\VC<>C>HSF<>DOO<;JLMMMNNOMJJMONOPNMOQPQRQONNOONONLMOONPRRONMNMNMMNPPOPNLJIJC8-05LULQQLLRRMNNNOMC=>:9@HGEDCHG?@A>;=@BABCCHJHHID>@Ru’ŠiP[tjPHHIKOMOQPQTROQTTTUURSWYXUSQONNOONORTVXYZ]befikpqmedfmoojc][\YXVVYYWYUSOJKQ\g_USWY`jnmnqttpkinqpplhh^5,@=5ANM:29R`F9QZZTVa_WYWXWUSQMIPJHF4!#+0,/.%%18%0MF56@>CILKKPVVUQKFECA<:9>>I\XMW`S:;JNFLNIK]Q*#2+()"/:'(,$5DG=@WffcfhgedhksrP7ACAB@>>??<:=>9667688587.4@WuˆfQ[rhQJHLUPNPRPRTROPPRURPSXYXVRQRSMMNMKJJKSUVUX`dddgkonjjmvvtpid`^X\\Z\]]`ZTPLMYegaYUVYfruxsopommolokkfcgb<0EHKQTZ[NQW[]SMSTMHID>A?IOG?AB=>HHLB)!%#$..,1)#(>OG::3:CIKIB;HJ>3:CB>IUUX[WWPHITVHDMSLJH@IRTQQPMKMRXZVY]_\Z\^__afknoqs}~}€?($&/+#!$'$"!&7C4" &($"")67' &*.0RnxˆŽ‡‰ˆ‰Œ‘‹Ž•”‘Š†ˆŠ‰Š‹Š‰ŠŠ‹ŽŽŽ‰ˆ†‰ŒŠŠŒŠ…‹‹ˆ‡…†ƒ„Ž‚S>MQOOOOONNOKLLNK@:<8:?BBDEBEB:Mk_JSXUUVTTVXVWUSTVVTYXVUUVWXVWXICl“‘Š“–”‘—‘•™•”—•”“–™˜—˜˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$%000.&%*/21230+!!# $%"!"$,6?HMJCHGFEEDDDAABCCCCCCCBBBDFGGFEEEEFIFFFFFGGFHHHIIGGFFGHGHJJJIIJKMNLKKKMIHKLNdmX@FQNC:?@?AAAA><:7<<;:86549BRm~xiXWloYLKHKRPNORROLOQONQSTVSUXXURQQOPOLKMLHNPOMPX^^a`dkomlmuropqng`\XVXZ[^b_WRSW`hjeZT[fnppsojiousnmngadefjG8_^WZMEMJLMH??BNIB?<55>ECLI>AC>1;PME@,!-.#$*/15+5LI@A5+4CHD7-:<=>FQY[a]ZVJ;7@UficfgebchmxnN;DG@BKC16JNJJJNPOOONLLMNQRSRQSPPOLLMLMLNRPKLQQQPNLKLMOQNJLMNQOMNMKJJIECGMMPRNKNQRRSVX\]\\^^]_fceknmnrz}}‰…J""*0'$252.*%7VI !"'# %).-%#+/+Fy‚–‹Œ’ˆŒ‹‡ŒŽŽŽŽˆ‰ŒŠ‡ŠŒ‹ŒŠ‰†Œ‘‹ˆˆ‹ŒŠˆŠ‹ƒ„‹Œ„„Šˆ†Ž€Q=MUJMPQOMMNMKMNJA=>87@FDCFDII=Lh]KP^WTTRSVVUWWUUVVTTXXVVVWYUW\L@f‘“‘”—–’‘”—’––”‘’”–”’—˜—˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+#!../-"'/430.05:<83*!!!! "&)+5A@>?@@A@=<<<;:;;=@?=;<=DGMaqqgYYou[GILPPOOPPRRSPMNPQPRUUVWXYXUROPNMLLKIJLLKMSUUUVZadglrqnkklmlj_][ZXX\bd_XRTakl`[Y]ekllmmllnqplljc_a`ahM 7YI6@=4CA>SX>7EMM?7BH<2HB/0GVN;6F[WHF:',+"%+/9@07QF39B.+4=DA?CDLY`_XUEA?A?;@UfhfggeccgjtmM9GO=/::/6INLMNPPOPQOLLLMORTTTMNOPQPOONPQRPNNPMMMMMLLKOQNJKMNQQNLKIKNOLHIQTPNRQOMLOTX[[]]]__^_bdinppop|‹ŠR%#  $1AG<970.,"+T[3"''&#&..,.4/?m…‰•”„”•ˆ‰‡„Œ‹ˆ‹‹††‹Œ†ˆŽ‹‹‹ˆŒ‹‰‹‹‡††ˆŠ†‚…Š†ˆ‘yGLg]LRVSUXWVUSUVWXXWWWUTYZVVYXRTXJ@g“—“–•’‘’’••’“”’“——”•€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'1!$,02. !/242248;@DC@;5.)%#$'()/:BDEIKIGGHGJHEDEECACCCCBBAACBBBCCDDDBCEFCCEGFGGGGGHFGGFFHIHKJJJIGGHLIHKKIHJKMPLLNIF`m]CDRQC>AA?@?>>A=;;=>?A?ACEEDDDHMS`jiaTQes`JHLPQRSQPOSVSQQNLQVSTUUVWXUPQOOONLKLKMNMNOPNPQUXY[biiknprqpoib\YYZ\][\\Z\dhefc_\_ejkjorqoppnnibacacmV%0TI2684BBLER]HPRFGRZZJBJVSDCD/! )+('+37=,6QA*3@@6/:>=NOQROOLD944:CHDBCBCCDHHJNOLMJIRI,#+.!$)&++/>+2;#5EI>@VghhgfdddfhtoTBHF72=?69JMKIQQPOPRQNLLLLOSSPPRQPRPMOJKNOOOPRQPOOONMKMPPNNOOPMLNONNNLPPNSYSNTPNKMRWYZZ]]^a`_`acefhmrv{~‹ŽZ '&%,,,.6B@:621=A5'FW@ &0* !072++2B`vw–…‰ˆŠŽ…ˆ‹ŽŒŠŒŽ‘Œ…ˆ‹‰‰Ž„‹ŽŒ‹‘‘ˆˆ‹ŒŒ‰Š‡†Š‰ƒƒŠ…‹šyFAPTMOQQPONNLKNQMC==;7=EFFGBCF>Mh[MVXTUWVTTSVVWYXUTUUXWVXUSYSVZK@d’›‘’’‘’‘’’“’’‘”’‘‘””•˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.1&,/2+ (/2005=@??CCCCA?<977:<>BHKLHJJIFGGHHFCDEGECBBCCCCBAEDCBBCDEDEEDEFFDFGHGFHHHFHGEEHHGJIGFHLIDIJIGHKLLHFILMNJJ]l^B@PSD=AA@@?==@<9<@A@?>;9:==848HUadb_VQ\mgOFGKQSTTQQSUROOPNNPPORSSTVWUSQQSQNNQNOONNONNNPRSRRUYdgjllmnpof\YZ\\ZYWY^bgjhffa]aipqkpsqooonle_bfber_, +QU?765=II;-A_\>31:BAGE<:AD@B?>AA>;<>CEHMKIOK>85=LH4-43,(%#)/+$%%.=-+8%6EH>@WgghfdddfghwrW?=83A@2"$5<808EA* !,.)(3:2)%,4BV[`x‰‹‘Œ‰†‚‰ŒŠ‰ŠŽŠˆˆˆˆˆ‰Ž‰†ˆ‘Ž‰‡ŠŒ‹Œ††ˆ‹‡€„Ž†›vDDPTOPQQPOONNLMOKB>?86@@=>??@@;8;?>;86201441-:O]a_^a\SXhcOFJNMORTUUUUPQPQRQPRPRSRSVYZVUVWUQRVQONMMMNPLLMMNOQQTY`cddgilh`ZXY[\^XX\bjoohigehnpnkmljjkkha\Y^dadqe4"HZOGHIHQZKCNRQFNMGF>9?@?@?OQ=BD@7DJEI;!&.)$(,0<7.>M:).*(?937;@ACB?;;<43566457BIGCKMF?91-(6PJ3,3113(")*,+(#!)/&!.&7EH=AWgfedccehjkxrN.0744DA67FOQMJNPNNPSTOLJIMQQONNQSQQPMQONOMIIKOOPOONOOOONLKNQQOMMMLMONNORRRVUNNPQSTVZ]Z]^_bbabcdhlkilrv|…i+%$":73.+)./2AJRcw‡“ˆ‡ˆ„‡‹Š‰Š‹Œ†‚…††‹ŽŒŠŠŠ‹‰…‰‹‹‹Œ‰ˆ‡‰‚†††‡‡ˆ“c;EPRPPPPPONNNLMOKB=>76>ECBEBCC:Mi[LWZUTVVVYYWVTTVYXVSSVWVWYWXYZL?Z„•ˆ‰•—˜—Š‹’ŽŽ’”•”‘“”‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€-1)(10+ "/0/6=>@DEDBC@ACDEEEDGDDHHFFJIFEIJIEDFGGFCBCDCBBBBCCCABCDDDCCGCBEFEDFFFGHGEFIHHGGFFFGIHGHIJIHHHIJJKMOLMNIIMJHXjeKBQWG?@?@@<9;=<:977643468F\fd\Z\UMUbZHHLNLNPTUVTRQURNOPNNTTSSSUWYXYZZWUVYWTRSRQRUNNLJKOPOPV^ehikljf_YWYZZ[YXW[flionkijkkilkighkhd\[[`gefof= ?ddPMZN=GFBJC<;BOL:;DB78GBIP=>IJ@DHJRK)!/1/-013-=L7&-'%$)6<7>@@@A?:426421/147@E:-6IE3499'2SI+/3131%"'&&)*())$%$"",- 7EG=AYgfccccdgkmwnJ/4833?=49FNPMFLPOMOSURQLHJPQOQPRROOOLNONMLMMLKMOPONMNLLLJIKONJJMOOPPOOKOTSTUQNRVXWXY[\^]^`a`b`_agiinvw„€…‘p4!>?;9;NUE8BNM?<:8650146762//3.$/GI72MfYJTXTVXWUURRSRRSTVWYUWWTVYVUTUKARuŠƒ…‡‡††‰Œ‘’“’ŽŒ–˜’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*5/-2%)53493ABDFGGGGFHGDDGHFIGHIGDFKEEDDDDEEEDCBAAAAABDEFFFECBBEGFCBEEFHFDEIHEFJJGGIDIKFDHIGFJKHGJJHHJMJIKJKWhfOANXJ<@?=>??@@;8;??:6/.,,.4;@Vs€s^W\ZQORNIJIJJKMOQSTTSQRQNQSQXTTVUQPRV[]YVWYYZXY\ZURSSZ_\YXXVSSSTX^cfddaYTTVVSRTTRWag_cilhbdicegffe`ZW^`bfe``dH)WhH0351EH9D@:7@DVE+'0*+2002.275.()--(-'(3108EF=ADCC@BBAADEDEDEIHEEHFEDCEIIFDHHGHIIKIHIIFGIFGHKLKHIKJKLKLMJGXhiWAJ\M<=A>=@>?@<79@<1-/-.5>@EP]u…xaVSNLMMLIGIJJKMQSSTUVSOPSPNPSUUVWTRVSV[]][XV[_^ZZZYZ^\[\[ZY[YWVVXZ]^adc^YVTSRVWPNW``]`cb`bcabegfda]Y^bdcbb`\fT((GaV@=::;CH:2>7FUB*0/+)++)(+/1002.'#(+))/227FJ>=UhgddcbbfkpxoK1:A95.'&4HNLNMNNNNNNORUOJMLKNNPTTOMQSSMLNNNMKLKJJJKLMMMNNLJKNNOONNPSUWSQTZ][XXYZZZZ\^]\]`cdca`cgjlmoqu‚q1 ;E-&50$/5/'-0% +0/04@NM>@OLGF7K…sq™Ÿ„„‚ƒ†…†”Œ’ˆ‹ŠŠ“‹‹Ž‹“˜‘‰‹Ž‹‘”’„‹‰Š…Š™‹Z>@<;??A=<89<945138DTYVVe~Ž€cUQLJJJIIHIJJKMQSSTUVSQPPTVSSSSSSRRUVUX]\XX\XY]_\[]_\\]^\Z[^_\YWWXZ\_`^XSQRRTSTQLOZb_]_b``cffffc^[[\`cecbb_[eX,#E`[JHGIGDEGJNLPQKJLMPPLIIKNLILIRSKIEB6*%! "%0/86%"*-.2('-$#5D@3--.21*/-+12+&&.735HH,5;?9@L<$01/--,*+(,/.+***,,++.2317EJ>=ThgbcdddfjmuoN4:=0)$"$2GQNMLLLLMMMMURNMMKLQPNORPNOPMOSSNNOOJMNMIIJMLMNNMLKJIKLMORTTWUSUY\]\ZYXXY[]_^^^^_`abbehijmquv€ƒp/5@2++  $/:1$&)"'7842106==9CBDE14Xˆ…z‹¢£›Ž‹Œ„~†Œ†|„ŠŠ‰ŒŽŽŽŽ‹Ž‹•“ŽŽ‰”’ŽŠ“‰„š«€H?ONMSPQQOMLMNNLMNJA<=88>DDDEFCD>Sj[LV^SV[XROUTTUVVTQRWVTSTVWYVT[ZCBf†“ŠŒ‹‚„…‡Š‹‹‹‹’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!02 "''5604889>BBAABBCC?@BBDFCFEFGGEEFHIHGFFECDCBCDDB@CBCCABC@CCCCCCCCBDEEEEFEEFHJHEEFGFIJFDHIGIHEGIHFHGHIJHHHIJKJKKJFTek[CGYM<=A>=@>?<;99<=?DCDKTTFCNl…™ŠhUQMPNLKJIHGLLNRTUUVUQQTTTUTTUWWVVWUUWZYZZYWXZ\[[__YWY]``_`bbb`^][[Zba[SNOTWQPSTMKU^`^adbacdgec_YVZ`befcba^Zd_5>VVONID@?=;;<>E@;DMNMTNHFJJE@?FK;*+4=9.+%$,:8"%.23,-()=??/(043.&'&)12+%"1;55DE4-0;>DM?()+,+-,-/*,.-++/4.+*,.-,,8DI>=SggaceffgikupO354%#$(5JUROKLLLMMMNRQPLJMOLONPRONOPPPPOQUSLLLMLKJJIJMNKIIKKLLOSRNQWTUXZ[\\\YWVVY[\\\^`a`_`aecdfloqpx€„Žm,2?5,"$0:1##'!5C7002-'(),SlZIPUSXWWYUPVVTSWTPRTVSRUUVYTTZXH@[€‘ŠŠŠ††‰ŠŒ‹ŠŒ‘’‘“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"0/!&05313448>@??BCA@BBCECEFFEEFGFEDEFHHGFFEBDEEEDCBCBDB@@@?BC??BB?@DFEEFEBBEGGEBBEHHGHFGHGEHIHDFJIFGGHIKJIHJIJIIIKIFUgo`EFVL;=A?>@>><968=CJRPKIPNBAQm‡ž“nYTOKKJIIIIILLNRTTUVWTQSUSQUQSVWUWWRWUUZ][WVUXYYYXX]]\]_``abbddca`][[\ZTOOQRMOSSNMU[Z]`bbefdba_[XX]cdgfcaa^Zdg?5GLIF?<:>A<64=>64@NPFCLHAA:,')68)!"'68/00&+3'$+0104(3@@;-*2550""#*00*&!155==796IKHKK>0:Lf{†”žšŒ’«¶¦¤­ªž˜œ““••ˆ”’‘•”‹‹ŽŒŠ‰‹Ž¥§|B?QMPQLLOQPMKKMNLLNI@<=68?FFDDCGEA=<@>@?;::;=DIMPNLQTY_p†¡™u^WNGIJIHHJLJJMQSSSUVWURTTRSVUVUTVYVVRSX]\ZYX[]\\Z[ac`^]^^addfgcaa`_[\[VQPQQQOPQNOX_Z[]^_dge_^[XY^bdegfcaa_\ahI/AIE=:BAQegeeeccejmxqK'$$*&'4FKKNLLMNNOPPOOPPQNLMLJKMOQQNOSTQOOQRNNNLKKMNKLNNNLNQNOONQVVRWWYYYYWWTUWXYY[[__`aacdeabdeimswy‚†g'.B- ,92# $!!  >@>>@=<<;DS_Z[XVVUW]u† ž}fZKLMMKHGHJKLNRTTUVVTVXUUUSXVTSRUWVSUWY[][XXY[\[]^[^_`a_^_cfjkhddb``a]VQQTUTMNSQOWa_\^bccdd`]YW[beeegfbaa`^^eO!+AIB;57:7/++-117B94;.76*.02D6/.&&:?5.-3301)"!&/53%8,%9B=;3+)3:-$,0,,-,/14:CJKIHHEENL7.+/022.))$&)*,---/--01/+*8BF?>QdhgfdbadinupM)$#*&'6HMNTJJKLMNOOOSROPRPONIJPQNOQQSRRSSPPRQONNOPPMJIKMMMOOMOTSPRYWWXXYWURUVWXXY[^]^_abcdd`bcegjnqx†e&+?- '61$"&"1IJ@;4379?GKIIJIFEFF>537DRcš™¦°¦šžŸ™šœ–’˜—›¡›œª§¢¥©¤¡Ÿœ•™–”›£‘g?FLPQPRQPNLMOPMJMLNQLB<<::@DCBCCFB:QgVGUTSURRYVQSQTUQPQQOQVXTSSQZXXUTHCe„‘Œ‘‘’“’‘Ž‡„‡‹Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1.,10121/2578:>@ADDDDBDDCBACEEEGGFEGIHHGFFGHG@CEDA@AC>=@CBABAACB@@DECBFFCBFGFEDFHIHHJGFHHGGIHHCDGIGHHIFEGIIHGJJIHIJJGR`ibJHYT:0'(16-%*1/*/77PchefedcehltqO,%###&4FLMPJJKLMNOORNOQPNOPMLORPMORNRRRSQPRTQNNQQPMNOOMKKOSOPPRVYYWUVXYXVSQUUVWXZ[\\_bccbcd_`bejllkv}€‡e&'7( &41&$($0JRNKMEFLMLKGIKIDDHKJ@=;0387DTbdm}Šž ŸŸ£ ˜”ž“‡ˆ‹‚}†‘‰‹“•––“™Ÿ Ÿ¦•c?ANMNQNOOLMMLKKKMMLMOJA<=88>DDDEFE@9Rm[LXXQTVTRPSRQSUUSRRSUWWUUWXWTYVXL>T‘……ŒŽ‘Œ“”‘–’”‰†……‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ /++22252142/39@DCA@ACEBBBACEDDEEEDCEHFEEFEDCDACEDBABC<=<>A@@CCBBDDCBCBCCCCDFGFFEDGJIFIIFGJHFHGGJIDEGFJHGGHHIKKKIHIKJHR_gaIFWR<=A>>@>><8:<:;??FC=98?Wsu™¢zjRJIIIIJJJIJLPRRSTSVUTVTST[[XX[XUXZXWXZ[ZXWVTV]^\\Z[]aba`abghdabbaab`YSRRRSTUPJNY`a``__bb]YWY`fhggdfeaaccadf^4!/%$;1&5(1?.0--?:'.2&)-0/-3=3-;<) *9/*//+-.20% "$)-/'49*,AEFHC92'!),)',.,+)*/-,.1/)')$,0/.10.8AE?>PchdeffeegivsQ-$"#'+7GPNNKLLMOPPQPNRSOQSMMNONMOOLLPPOPPPSQQPPONMLOQQNLMOORSTVXYWUVWWWVUTTWWX[]^]\_bdda`cgbdfijloqu|€‡d'"-!(84% $#!$DTKELJFINJEHLHGEHKJGHIDI;0644-887BFCFWaaf’Š˜ŸŸ ¨¢…œˆzwuw{{‘ªÁ³`9ADBAEC@CCCDEDDFIHGGGGGFDJKIGIHGHJHGGFEEFIJJGHKKHGKKHGJIESflfPFTO<;?>=@????88>4##3YtrŸ£…pTMLLKIIHFCGMPQRUWVVUTTUWYYTRTUUW[WWYXRRWYXXWVWYZYXY[\]_abefeccddbda]XUUTNWQLMQQV^ac`[^`][YZ^cddehfccffa`bacbA '3$"9/.2&9;)**.?6'10*,%//(5:.*/94%%20(+20-1442+$ "%'(4@7%(9@8..1+(.4=>><989;CHKT\ekw…Ž•¥¢•˜¤§¥¡™yQ:=IMNNMLLMNOMLLMMMLLLNMGA>?99?DCBBBHB8SkVITVRWZVWWQOOUVSSRSRRUURRUUTWWTTUK=lŠ‡ˆ‰ŠŽ‹‰‹Ž‘““˜—•””“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"0, .4122222333:@B@@ABCCBBDCBCEEDDEGIIIHFDCDDCACCCBA@@@>@BBAABD@BBBBDCBCBDGGFDCAFJJGFHLIKIHIHEFIFEFGGFEJIGHHHHHGJKHGJIFSaghTHTR>;?@?A?@?;46<0 &A_sq~œŸˆw]PLIIJJIGHJLMNPSVVWXXWWXZTSSVXVUUW^ZSUWWZ[YXXXWX[^\ZZ\_abefgfdcdfc_^]VSTVRUVVTPT`b^]]\\ZTUZ`cddddegihc__b_cdG  ,!1,/3(56*'-180)2*00!*5,.3%)+)%%-5.+-/-/32032*$$&("%28/-9A:48??>><999878:;;7200/+)**'$&*,*(.-*+,)(+%&--&'.0,(&&')+6AC?>LbcbbdfdcgmtpO/)$" #*9JOOQPNLKMOPPRONNNQRONMMKKMONTQOPSTRPPNQTSRQNQPPRQPQTROOTURQRSVURSTTTYXWXZ\_`_`aabdcagddhjkmmv~‡‰Z#):5&#*)4HMLLKIJJJKJKJJJJJJIIIIKKIHGFEDCBBAA@@@<;:9888958;=AFHHQ\hjiuzq^RC=@GKLMMMMLLMNLNPPNLLNGILMHA==67=CCCDDGB8SiVLZYQSVSTXVTUXTRTSQUVSSWWSTSWWTUVMASu‘†Š‘’Ž‘‹‹“Œ‰Œ‹‹’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!.)!06444333455:?BBB@@CCCDEEDEGDDDEFGGFEDDFGGEC@AAA@@@A@@@AAAA@@BCAACEBFEDFGFDCGGHIJJHFFGHGIGFGKHFFGFEDFEEFGHHIILMKKMMJW`ejYGPP>8=?>>=?=:6<@/ $''''0B\oq}˜šŽŒhUMGGKLJIIJKMOPRSUWYXUSSTYWUTTTSS\_XV]]Y\]ZYYYXWYZZ[^`a_]ccdedbcgfbb_WSUXUXYXUQU_ebcb]YWSV]defffdafigdcef\bhO!&#!,#0/,;9.,15;/'/+67!%5) '#43 4=3+-/,+14/0671+)(%# %,/8@A?:9::Ncdda`abbfkytT2,)%)'*.:IMKMNLJIKLMMMNPOMOSSMNMNPONPLORQONQSQSSPOTUOQPQRRPRUSSUTQTWSSTUTQRSSWVX[]\^```_^adfegbcgjkort}~‡‰Z# '43%"+-"-IULJNMIHIKLLKJHJJJJIIIIJJJIIHHHIIIIHHHHDEEEDBA@=;;<;99:8:?>9=@:=;:;AEIJLMMLLKMNNMLJKKLLKLMLF?;<66=CDCEEC@;ViRHUXPPTQPRRTRTTSUSSVVWVUUUUSVWTVWQGFd€‘ŽŽŒ‹Š‰‹ŽŽ’’‘“’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!-'"16534454445;?BDB??C@ACDCCDFBEFHGGGIFEDDDDCABBBA@@?????@BCBBBFDABCABGFFEDDEGGHIJIIGFHJJJIIIJIGGGGFFGGIHFGKKHGJJJJLKIWael[GNO>6;@=<;>?=7;=/&/6965:GYkn}•—Žƒm[RHGKKJKJIIJNQRSTWYYVTTTSWYVPOTXTW[\ZX[^^][Z\^\XXYZ\^___dddfggghddc^Y[][YZXVTQS[`b`\ZWSTZ`egffgghkjfdec^]biU)$('*$0)+<7*20-0,*2/3;+*80(.5=?:@:7:;;<89?EDCDDFA:UfRHUXQPRQSWXSRVVUVUTWTUVUWWTSVVUWYTN@ABB>@EABCCDDEFBDFFEDEFGFFEEEDCCCBBAA@@;>AA?>@B@CCBCDEGEDCDFGFCEHKJGEFGKJJHFEGGGEEEEDDFFGGDFIJGFHIHIJJHR`fl\IPSA8>B>=>??=67:0%)/-'):JWck{’’‘ƒmaYMHIIILJIIKNQQQRUYZXVUTXVRPQTVVTUZZX]_Y]\ZY[_^Z[[[ZY[_bcefghjjigggb\\^ZW[[XUPRXZ\XSUVVV\_cffddfjlkfdda\_biY0!*)&",3,+0,(60#&5;17A<9?>;<>=;:=A<4,-,+,.//,../372)$!!#!#.:CCBCCG@;WjVNXWSRQPQSRQUYROTSNSUTSWVUWSUVUWXVSEBgŽ‰Œ„Œ‘‹ŒŽ‹ŽŽŒ’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€".&&2322210/269?AABBA@D@AAABCCCFGGGEEDECCDEEECBCBBBBBBA@BDCA@ABEBDE@AEE=BGFCBDGHHGHHHGFLKJHDEHIKHFGHGFEGFEGHIIIHIIJIJIIRbgj[JQR@8>B<=>=>>77>4"3ESbgxŒ‹ˆ‚me`RIIIHLJJKMPPONRUY\[ZWVQV[\XUTVWY\[X[^^^ZYY[\^a]_`^[Z\_`ehggijjmkki_XWXZ[XVUSRTY[[TNSZ[^`chhfdedikhcaab`ag]7'*&(+02,#%/A=515=@;6:;9:<;62;>9:@;.,,*+-,+0.../11.**#"%# %/881*((#  !"""%((')-.+,-,+,.,()-))//)+1-*+*()-3,(*+'$%3CE>=PfdfcbcddhmvrV5*.-*)116HNJLPNKJKMMMLMKKNPNMLOOOONLLPPOOOOOOPOONNSVSQPPRQPQTTTRRSNMRSRSUSTX[XYYXZ]\Z_``^_bdefhhedkpooz~ŠŽ_'$! (34(!!#2BNPKHLJGJLKIIHJKLJJJJIIIIJJJJJKKKHHHIIIJJKKLLKKJINLKLKIHIJEINLMLGEKPPKIMRLMMMKLLNNNLKJJKKJKMLF>::45;AAABBE>;YjVLTSSTUWWVTQTWRPUWUPTUUSSUXTUUUVWWVL?O|–‡ŽˆŒ‡ˆŠˆ‘Œ‡†‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+$(5444431149>@ABCDCBCCCCBDFECCDEDDDFGGGFEDDCCDCBBBB@?@@AAAAAACADC>@EDCBABEHGDEFGGHIKLHGIHDEIIFDBDFFEEIGFFGFFFGGGHHGFFUdfi\JOQ?8?@:=?;@@86<4# &$':HUedt…‚Œ‚oheVIIJIKMLJKLOQRNORUXYYYSUX\ZWVYZWVXZ[\\^\\]^^`d`aa_[Z[]beijiijlkikjd\ZYZYTRTTQPXXXSNRZ]bbdfhhfefhjhc^^a_^ea@(33:89>:26>><=<:76:99<==<99==95331.,,**-+*/0/01/,**/-'#$%$"&'"!" $$#""#&(*,/-++-/./.+,..*,,*,330/,+)(''((! ! 1BE<;PfcaacdcbfksoX9/54.*437JQMOSQNMNOPOJNOMNNNPSQQQONNNNMMNOOOORKLSSPQTPOOPPOPSQOQWTKLTSTTVWUTWYVSSWZZYZ^```bdecdfffkqqo{‹a(%!(14' "$/;VdOIRVTRRSRRSROSTSTVYUQSUTVXTUUUUUUVXWF6TŽŒŠŠŒŽ‹Š‰‰Œ‹‹‹Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+$*5321232249=BCAACDCDDDBBDFEBCEGECCFIDEEEEDCCCBAABBA@?BDB?=>@@CC@>ADDCEFEFHHGGHHHGHKMJIKJFFIIHFFFFEEFHJIFGJJGJIIJIHGGUbbg^MQSA:BB;@B<:=87;2$!()#)@NS]bqz}‹ƒrigWIJLKKKJJKMPSTPOOQUY[\USUXXTSUUWYYY]_[Z[\[]__]^__^\[[[cbdhihhijjjhec]TQUWUSPLLXTNNUZ]`ccbadgfdc`affcbe^\ddE ,>CB>888:;3<9637>;:=;??;3.41/(!#*)#+-*)-,*..,-11-,.,1/&""" & #')'&&'.+,020./00.+,//,*,.,)%%'&'&" !"!$*-2CF==Rhd^_ceb_cjoseOGJD87?99IOKNROMLLMNNLPONQQPQSNQTQNNMNOOOOOOONRRPSSPNNPPNNPQQOPTSNOSRNPQUYWSVWUVZ]\[[]ab`_`cfabfhgimnq}‚“d,&")14*'*(2AQOMJIMNKIJKLLKJIGHHIJKKLHHHGGFFEHIIJJKKLMLJHIJLMJNMIIMMILPJFMOJHLJHIKMMMMNNMLLMNNOOMKKKLIKMMG@<<;;@ECAA@@;b˜ ƒŠ‹Œ‰ˆŒ‰‡†‡Œ‡†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!+ *000210/26;>BBCDDCBACDEFFECBFFGFECBAEEEDDDCCCCA@AB@=>@A??ADD?@DDACFDBCDEFGHHJJIGEFIKJHHIIHHIMJHGGFGIFEGGEGIEEJKHHJJGRafj_JHM=9>=>C=7;B1#%(AOW]_nwsw‡„nlm]JFHILLKKKKOQPVPOTXVWZZ[YXZWSSVPU\ZY^`^^__][[^Z\_a`][Z\`bfkkgfohffb]YVUVVTROMLSNMV]\\a_b`_cffhiecdfea^^bdiP$(AIA85;?<:;?@@>:86510/..+'$$!"&)+&()((+./,01/153--/10-#)(%" !%(('(*.-)%-/.*,21*-/-)),+'$"  ! ##"&#)''*-3;=:@H@:Qhfbdfc__dirncZ^f_PWUKGPPHILMNPPPMJRNJLPMLQPNNQRPMKMNONNOOMNQSSRQSTLKLNNMNPOPPPQTTRPOSVVSU[YTWZUW^^^[`d__dcabdgjkkknvyq4" ""()3-'%&'0@OOKIKJIKKJIGGHIKKIHIIIHIDGJIIIJIHIIJJIIHHNMGHKJILMNMLKLMMLJKLLJHHMNJJMNLLLMNLMMJLOOMMLKMKIKLF><<77:@CCBAD?=ZjSHTSTVUQPSSQSUVTSRSRQRTVUUUVRTXWUTSTTN@;_‘ŸŒ†ŒŽ†‰Œ‡ˆŒŽ‹ŠŠ‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!*+100432359=?@@@A@@@@ABDEEEDCADGGFDCCEEDDCCCC@@??@BA?>ABB@A@?AABBBDEBDCBEGIGEHHHIJKJIIJIGGHHEEFDEGFDHGGGIIGFGFGHJKJIHO_be_OMN@<@>;=;;A>89?2#$(BPUW]jrosnhi[LIJIIKNMLMLMRQSQOOTVVY[[[[YWWVSUZYX[_`^^``^\\\]^]]\]]]`beijhhieegd^YTVVUROMMMPPRY_]]a]abbefddifefggd`_bbiV*#=H@=>A?859241)&()'(&$#$%%%'%""#&&&&()(),//.00./11-120/0+"'%$%'))(.241-+++,-,+-/,'&&" "%)-)(+)(*++-1112209AG@;Qgfbdec``dirhVKOUVZdXTWQGFJMOOLLOOMMHIOOKMSUPQTQQQNONPONOPNLOPPPRTUPNMNPQPOQPPRRQQSRQRTUVWY[XTUZ^][^bbbea`fdccceiklnx{€x:!!""*4.%"#%1AMMJJNMIIIIHHHIJKHGGHJJKKLIHIIIHIIIJKJJJJMMKJKJHIJJJKJKKLLLLMMMJIIJLNLIJMKLMMLIINOLLMLKJIIHLOH?:9779=AAAAE?;VfPIVXTSTTUTPSQRUUQPRSUVSRTUUSPRWWVVUWWTMA>_Ÿ‹—–“—‹††Š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!)-22255679;=>EDCA@???DDEEEDCCDEGFDBABDDDCCBBB@@@?@@@?=@BBBBA@ABCCABDCCDFFFEFGKLLJGGJLLJIIIHGFHDGHEEGEEGFGJFDGMJHGIIHGTddebTPM>:?=<>>=>>96=3$ANRQVdplirwqde[MJIGGJKHJRQNSTTRONPTVWX[\ZXXVWSRV\\\_][[]`_^\]]\[YYZ[]`bdhhiklhhie_YRVVURNKIIORV[_][]]bccddcchfeegheb`a`h_34?8421,%&,)&" #$"!!$'*+#! $&'&#$$$&*,++,,,,-//--)(.1.*-*'(,/0/-.,)(('#!!!!"!"$%((*,.--.31.,,**--*# %-0.8AG??BAFNOXZQKKHMRPIGMQPOJJMMPTSNLOSRRTRQPPONPQOOOONNPQQOQRQOPQRPOPQRQRSQQPOQTVWZ[YWY\[YZ^`ac``dddddefijny}€‘€B !"!&-0,'%&&.::56:@CB@@G?;?>>>=86<20MUVWY^ceforlfg\NFFHKHMMMPPORWSPQOMOUUUX[XXXVXVTWZ[Z]^^^^^^]^__`_][ZZ^bdefffhjgghfc^XRRQOMLLMSXZ\^]ZZ]bdcbcdeeeddegea_`_ie;*0+('($!  &!"$')+,,*'##%'&%$$##&*,**+,-,+-/./,*,//1210/-+)'#&%" !"&'&((),/0/0,,-///,+-3/))++-1&(2316AG?@Hhˆ§˜œ—›¨©ŸŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!'!386789;<>>>=CBBAAAAAGGFFFFFFHEBDHJHECCCBBABABBBAA@AAA@@?@@AACBAABBBCCCDEGHHHHIJKLLIHIJIGHJIFEIHFJHDFHGGEEHLKDGHHKOLDO`aefULJ@<@>;=<;><76=09RPORXY^`cjnj``YNGFGGIMONNQRQTTTQONPPQPUXYZ\YUVYYWV[]``_\[[]_[]^^][ZY[_cehgfhecefec^WVSNIGINQW[\\_^\Z\aeecdeedffdegfb]_aihB"$$#$%%""#!"$%%'*+'),/00/.3.(%&&%#%%%$'+,+&(,..,./,..--)(+$$$$" "!!"!)+,-0465224675311/,+,--,&//(),.10,'0>>QcdbbbaabfhpkI2<:2=ABEKNJIPNNOOLIMSPRPNOPQSORQPQPPTPSOKNONQQNNQRONOSSQNNPQPPRRPPQQORRTUVVWYZVW[\^_^^bdeeeegefgfggikrrzƒ“ŠS!#!" !!%2:1)-0.&!"%.:CC@AGIGHKIIHJJJJIKLLKKJHJJIFGHIGKJJIIIIIIKLIHJJIKJIIJJIHKKKJIIKMLKLLJHLRKJLMKIJJKLKJKKIILIKLE=::89<@BBBCA;=ZfQJUSQRSSTUSSUVSRTVVTVVSQRTTUSTWYVUVWXSTXVLB?LYkŠ¥«¦¢™…~“‘”€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&$7;9;==>@@AAADDEEDDBAGEB?<;:9989>EHGEDDCCBBBBECBCB@?@===?@@@@BBAABABDBCDFGHHIIJLKJIIIKLKJHHGFILHDFFDGFCEIGGHHFFGJLLIGRbaegVJI?;?>;>=>Qada`__`begvpL4<;-/716FNJJONLMQOJKQKOOMPPMLQRSQPPQQPSOKNNMPROMOQOOQORTTRQPPRPOQQPOPSQQTWWVUZYTU[ZVZ_`cc_`baegijhhikqox‚\*$##" (0--471*+--)$%'-6?A??CEGKLJHHIJIIHIJIIJJJIHIKJIHJHHHHHIJJLIIKKKLKJJIJJKKKIJKKKJKKGJLMMMKJJMMLNNLKLKJLMIGLMJJIB<;<58[ePKWTRRSQRRPRQQRRSTUUTSRRSTTWURSUSSWTURVWRQOL>;ETiƒ”©¨¡¡§¦žœ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&&:><=@@@@ABCC?ACDDA><0-*&" #)1:CHEDDDDCCCC@@ACBAA@??@A?>=@BBAA?AGCDFGGFHIJIIKNNKHMLLLJFFIHEECADHFKGFFFFHKKJIIIHHHRb^ah\RN<9>=>95<2'HVNNQSSW[^fhc`YQJJLNLLQQMMPRRQTVTRPPQQRRRTTUVZ[ZY]^[Xa_]YY[]][[\[[\^__aabedbcbchjif^TMMLKKMPSTWY[]]]`ccffegiffkkfehgb_Z_dgQ&(&),.00111.+*((+02478778:71+(*+)&&''%%'))&('$##!"!$&&(./11100025992+,33454320/45311320.//.01.(+,.,*++)*61(,,&%2BF=@Q`c_^]]_adennR9@>+ )*)3DJJMOLMPOLLOOQNKNSQKOQRPOPONRQPNMOPONNMNOQRRROLMNOOORONPRQPPUTSSVYYVX[XW\\[a__cb]afcadhijjmolmy}‰f0$$##  ""09:2/133/)00(!!&/9??=?GJHIIHHHJKJIIHHHGGHJGHIJIGJMKJJIIIJJKGHKKKLMJJKKKKKLKKJJJKLMJMLIHKMLOMJLOMJKKKMNLIJMJHJLE=::89<@@@ACC;=YbMJUWRPRVXVQTTSSSSSSRRUVTQTXTSRTWUTWWTVYTRUVRIED?@LXks~Š•šž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#''<@=?A@??@ABCEED@90'!!0ABB@@B@@BBA??AA??BBBFFEDFHIGFJKLNNMJHIKLJGGHIEFGFFGGEEIHEGGDEGKKHGJJGTc[[e]SL?;?>;=<<<@;4;50KTLKLPQUY]eg`[VOJGIJHMQMJPRQTUVWVUVUSRUTSUUUXRZYW[ZWY\\[XY\]]]]]\[[\]]^]_dfefeehgdaZOMLKJKMQTW[^`a^_ccchjiihbejkecfe`aY\afW* +.+)+0541241*)-0/.157778:5/*)*+($"$$! "$$"%# "''"(++,2789>@A<635940154//475453002133026620100241,)+.--44*3D=,/4,%1BF=@Q_c^][\^acdniQAC9#&$,IOGNONLMNNNNPOPQNNOLNSPLPPOQTPRQLOSNLPPNNPPMONOQPNNPSRONQSPLRTSPQVXVXXVTW[\\_fc^abaffghgfgkoinzz„’m3%%#$!-1' )6<8,-41-15./*$$(.68?CEGGHMIHHIKJHFGGJLKIHIGIJIIIHFKJIIHHHIJHJKIIKLIJJJHHHIKJJKKLMMOLIJMMLKKKKKJLNLLLMKHKKFJHJKE=;;79>BCAABD=?ZcNJUTRSTSSTRQUVSQSTSUVUSRTUVUTRUYWVYVTYZWTRWQTSKDBCACDHLOW`d€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$'#,=>D<0%+?BEFEDDD?ACCA???BAA@??@AC@=>???ADEDDHKJHHHKMKLNLJKJHHHHFDFIGEEGFFEFHIHHIGGHJLKIHP]XWe`NLA=>?;:<=:=86:2CEFHFFIKJIHHFFGJIHGIJIFFHHHJIGHIIIJIHJMJJJJIHHHHKKLNMJKJJKKKKKJJKKJJLLJMJLNMLLLJKLLKJIHKJJLE<<:88AECA?@F=?ZbMLXUSQQRSRRTTTTTTSRSVTSTUTUUSSUVTTVRUWVVVUTUSQRTRLFEEEDCCBB€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"$".>BB?ACDCBBC<@DC@?AEA>=?@?@CC@??@ABCBGFEHIHKLKJJLLJIIIJKJIHGDFHGDEGFDGIFDEHIGIJIHIGDM\VQ`aQJA=@CA>=<;=75;3 #@RNMRRLOSWZ[[[TQMJHHIIMNOOPQTVXURTWZYYUUTRPOTYUVXYZZXTY\^]\\[Zaa`_`ba_]cedddddgkgbdbVLJMNMMORS_b_]afd`befedehjkgeedccd_\\\ff?'00+,36323/*((*))-,)&$"!  ####"$" !&-/.0343355531147:98<>EC8146..16863203446521544332/,/230/0/,,++8AADD@9:-"'3AE?=Ma^[YY[ZY\broG()1-!'HSIHKLOPMJKPQONOOMLMROOOOPNKPTUTROMPNJJOSQMJOMMOONORPQONNOOOQRQOOTWXWYXVXZZ[\`cdbbdfbefeegjlmqxƒ‘{7'+"!%"/7.$#)485,*./04551(#$',3@EFFHGFIIIHHJKIEFIKIGHIJHHGFGHIKJHFHJJIJNLKJJJJIJKJIKKJLLKKJJJJJIIIJJKKKLLKMNLJLOLKMMKIHIIILG?<636@CBDCBA:@^cKIVSOPRORURSTTUTTSSRRTTSUUSRUWWVUSRTWURU[ZTXXWWUTTTSRPNKIGF€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ #3A@@?@<;@FA3'#2AIBCEECBBC@@@??@CDE@>@@>>@ABBCDEECEFEEGHGFJMMLLJIMKJJKJGEFEFHGEEGFEGGDEFGFDIJGGJIEK]WO`gVHC<<>===;<=64<5 +HRNNRMNOQTVWWWRPNKIGGFHJMNOOPQPTWVTSVWVVVWVUVWUUTUWYXUTX\]^_^\]_`___aa]_`agihfjkhfe^SNJLMNPUY[c`_^adc^aefddfjjia^de`]aa]__gkI%..,,00/1/+%""!!#""!#$&'''('%&'&####(.0/06643.-353248<=<7>HG2$2BE?=L_]ZXXYYW[`jpI"')(%DOLMKLOPNJKNMOQQPNPRSRQONLKLMPQQSQOOKNOLKNPOKMPNMQSMOTSQSSPPORTQRUWUXYURX^_^___acdedeghgfilmoqw|{9 #$+& /5-%$(384-.52-.0:3'"$%)3DGHGIGFIJIIJIGHJHGGGJMLIJIIIGHHHJIIJJIJKLJGGIJJIJKJIJHGGKJIIIJKLLIHKMLLLKMKHJMMNMJHKLIHILLKJF@?838ABADB@@8?^eLKZRQUXTSTPQQRRRRRQTSTSQSUSRVYVUVURUVXVSRUXTVXVTTVYUUUUUUTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&9A<<=B??@9*0?DBCEFFDCDEAAA@>?AC@>;:<@B@ABA??BDCD@CFEILFIJJKMLIJJIHIHGGHFFGGDEFFGEDGHFEEFHHGILKFR`TGXgZLC;9;<<<:==44<6 3NSMOOKOPQRSTUUOPNKGEEGJLOQQPONSSVYVRSXVUVWWWUUUUTTVXYXYZ[Z[]__[^`_]]^``aaceefkfdgh_VRNIILPTX\`caaa]acaaddcdiife^]dd][__^cbclS#"&'%%&%$)(%!"#&&&'*.2589;73.'$&'#"%&&(.1003253&!,5335:>??@=95443/20,+*)''+,,/4434430--/001//0/,,-5DFA?:9?D4!1BE>>L\[XWVXWVY_mn@!*&AONNLLNQNKJMPOOPQQPOQSRPPMMRPPNOOONNOLIIJLMOQNPPLLOMMPQPRRPPPSUUUWVVVYWVZ][Z]_ababdfeffegjkkmpv|z7"++(.5/'#$1;3,085/04<8,$#"(7GJHHIHFILGEIJGGJIIHHIKIGHHJLIIIGIIJJIIJKLJIHIJJILLKJJJKKKJJIIIJJIKNNKIKPOJKNLIJKNMKLKIHKIJIIB<<969BCAB@>A9>]dLGQORUVUROORRRSSSSSQTTTVVTTTXXSPUWVTTRQTWVRQRTVUUTTWWWWWVVV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)<@;>@AD>."+02369;>?@AEGBBBBCBA@?@?>@B@=ABA??ABBBBGHDGLIKIKONLJHJKJIHIIHGFFFDDFFFFHHGEEGKIFGJKHDR\PBSbXJB<<@A?=9==44<6 9OOLKNOQQQRRSSSLLLIGFHIHJLOSVWXVSSTUSUWVXYXVUWYTWXXXZ[[VZ]^``^[_^^_`_^]dccdfdejcegcYTQJHGLTXWWZbbfeabfdacb`chifa_aca]\`__cabl[+$''&))*.1,(&)-01-28>=?B?74552/////.,)*++,//.0310/.-.02..20*+13$0CE>>KYYWUUVVTX]ll=!)DRNHLLNPPKJKONNMNNNLRURNPRPPPQQOMMPRNMMMMMORPKNQLLPOOMMNMNQQQQSUVVX[UXZXYXY\\^aabbdfceeegkmmimw~ƒx3#(,-4.'#$1;8..30,18>>2'&$*:IKIGJIGIGEFHJJIHHJJHGGHGIHIJGGIHIGFGIJHFIIJJJJIIJJJJJKKKJJJJJJJIJKLJJKKKLIJNMJJKMNLJKIIJIHIKD;:846?CBB@ABBB:1##'%"$((+.259>BECABCC@==<=@A@><<9<=64<5 !=NONLJMPQRSSSRRMLJIGGGGIIKNQSTSSWXURSUVTVWVUUUUVYZYYZ\][[[[\`aa]]^`_]]^`baafihfggb^[SKIJINW[ZZ\acedbefe`ccaaddb`aba_]_aaa_^an`3)/0/49;=?8.((,02.27::;;=950*&'(' $$"$+/./10044484347=?<654/*010/.-*'*,)'),-.2000/,-/2.,/0..0140%'15<;:-0DE=>JWWUTSUTSV\fl?! (BROIMLNQPLIJLOPONORSRTRQONMNONOOLMOPNOMJKOOLJKOPMOQORNOQNOQQQPQUUTUYZYUTXZ[^]]^adedcdghggilnglv~ƒw1#" '.4,$#'278/.2/,.2?C6))(,:JKHGJJHIFFGIHGHJGGFFHJIGHHHGEEGGHHGGIJIFFHJKKJJJIIKLLKKIIIJKKKJJKMMKJKKJKNMJKKJIKLIHKKHHMJHKF><:34>CCBAC>:>X^LMXTQSTPRUSSSRRRSSSQRTTSTTQTVXWUSQQXUTUUSSUWXWURRUXSSTTUVVV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€':A@>5%!#%(,15;>AA@>??@>>>?@ABAABBAAACCGEDIJIJKGHKLKJIJKKKKKIHIEEEDCEEGFDCFIHEEFFEFHIGOYOBPaZJ@;:;98;;;=75;3 !?ONPNIIMOQSSRPOLLKJIGFEHHJNQSSRSRSVUQPRWWWVWXWUWYZYXZ\]^]\[]`a`Z\_a^[]`]bcabdefgaZYWMFIMOSX]``^bfd^`dgfbbb```_^ba`_^^`abd`]ald?)12.5>?>>7.(),0225:::9:;84/*$"$% &(%&,/-453113558657<@AA?>98;6.+,./.1330')%!'/22210.,,/1,-//,*.3.0--48@=2/DE=?ITUTRRSSRUZkg;+&# $?PNOMLNQQLIILLLJLOQQOMQTOJMRQNNNLLMJOOPPLHKQONNOMJLPOOPQQQQPRRSUUSSU\ZUTY[WUY]bdcbcedggedfhjhlu|€Žw2"$!-5-#"(262,.4310.;F<+)).;JJGFJJIJKGEGIHGHHHHGHIIGEGHGGGGIHJJIIJJHJJKKLLKJIHHHHJLLKKKJJJJJMLJKMMLJJKKLNLJLMMKJMKGHMJGGB<<946?CBB@A@>AA>@@ACCABE@DFEEFHJQPNNOKJOKJIIIGGGIEDEDCEEDCDFGFEGFKKGDGHGJVM?L_YI?<>A=:;;:=86:2$BNIMOJJKMPSSROMGILLJHGGIHHJNQSTRSTUVVUTSWYXVVVVVXYYZ[ZY]\[[]acc]]^bca`aa_]_bbbfd_]YQNMJMSXZ^b^W]hieghebe`\\^`aae_\]^__aahc__hfI+43-3==8;6/+,.//-27:99:<;4.)""%!#!%/1-2025448996459=@@>=;<<406.133330*(*&"(00+231-+,./-)*--+-35/-"&3@G5+"/EE[bMJURQPPRSRQSSRRQQRRQTSRTUTTRRRSTUUUTTUWVSRRXURTWYVSUUUUVVWW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€-@?-(:C@=;:975/,'" """%',4;=?C>>>>>?@AB??BBBBBDEFFHIIJKLLLMLLLOMMKGHJJEFFEDEFHFECCDEGGHDFHEHIAMXK=L]YJ?;9;=;:9=?;088)FKJMKKIJMPRRPLHGHIJJIGFIIHHJNTXUVVTVYWRUUTUWUSXUYWX]\X[a^]]^ab_bb`aec````_`dd`]a]ZXSMKLKPW\]]^abegfffeba`^\\^adb`^]^`bab^^ccioN!"/3/2;=;51+)-.---0246:<<=7/'"""%!,1+.25435788315;>=;=9:91/465523411//*%#%*,-/10--..*.-.-)&,500-!$269B<%0EF<;FSUNSTPPTWVgjG((" (AQLLOKHHKMMKKLOQPOPSRPNNNNNONONLKKLLOOOPRRPNKOQPPNMPONOPRTTSTSTVWVTTZYUSVVUW]]]]`efegeeeffjnonux~ŠƒA# #,4*&4850142...2@A4*&.@KHIIEDGJFHIIGEFFFGHIHHIJHHHIJHGIIEFJJKJFIJIGJMLHIKKJLJHIKKKJIHJNJLJIKJIKJKLLKKLMLJJLKHGHCHKJA::799?BCB@BC8=_cJJSSSSRPPQSSRTTPRTOTTSTTTTSTUVWVUSQUUUUTSSURRSUTSSUTWWTSVWV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€/:,%5>?????@@A>=83/,)%"%%%+4=>@@@A=@BA?ACCDHIGGKJGIIJLLLLKMNKHHFEGEGHFEFFECEEFEEEFEFEEGIHGNSKELZZJ@=;;<<<;9>;398 -EKMOIIKGNQQPQNIKKKJIGFEIGGIJLQWVTTWYWUVTYYUTUVVZUUZ\[\`^]^_\VYb^^_`]^``\]^_a`^`_[XWRLJLPRV]aca_^fifcdb^]_``^]_ac`aege`][`ccagoV' -313862.)'+.+),,,,.38;;:3,&!#$!" *-',12//34230/38:8775566325751123542+%$&'(*-//-,.-+(+-)%+48/3,#4F8'95"0EF<;FSTQTUQPSUTejB)BRMMOLIJMNMKNMMOPQRRMRSPNPNKKLMMMMMMOPPPPQQQMOOOPONOPQQQRTTSRTVVTSTWVZXTUXXX[\]`bcddfdeikkhfllsx‹‡H#!"+1'+784002111.3<<5-*1?KHHHGHHEIIIIJIHGGHJJIIIJHJJHIJIIMIFFFGJKIJLMKJIJIHJKJJKJJJJJHHJLLKJJJLKIJIIKKKKLLMKIILLILKIJC9:;6;A@@C@?@7<]`IJQQPPQRSSTPQSSPRSPQQQQRTUWTPSUQTWUVTRRSUTSSUVTTUUUUUVVVUSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" -8;>>>=<<>@@AA@?=952-(%%&-8?BBCCABDDBCDGHJJKJJKLLLKJJMLIJKHFIGFFGFCCEDEGFDCEFDGECGGEGKLHDHW\M>>==>?=:9;92840FLLMIKMLLORRMJIKKKJHGHHHFFGHHLRVSSVWSRTVWYYUSVX\YWWWY[\Z]]ZZ^]WWZ__^`cbeb_`ca^^`][XTOMOPSX\_aa`geege`[Z]\\\]_``aeggffb^_abeebi]4).*+.-)$'''*,*(-*()09=>;3-)&'&"" !)*''+,)*-.,-)(+1578469:8448872245861*%%&%&(-/.,,./--('))*+($*07C>*#*,%0EG=;ERSQSSPNOQQ^d=$?OKJNLKLOOMJMNOOOQRSSONQRONPNNNNMKKLLMNOPOPPOMLKNNMMPPQRRRSTSRRSTSTVRWWTTWXX]\_bdcdfddgjkiijiiqw€ŒŒT #!!+4,!!*693/./144/35860,4@JIHHHKIBGHIIHHHIGHIIIHGGGIHGHIHHIHHIJHGHJHHJKIIJJIJJIJLKJIIIHGIKLJKKJMMIJJIIKKKJNMKIKLKHGGHJC:;;79@CEDAA@9?]aKMSPOOQSTSRSTTRPPRSPRTUUTTTUTTSSSTTTSRSUWUQUWWVVVVUTVUTUXWS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#*/168:<==>>>@AABB@=<;61.,-08ACCACDCDHHHHIKKKLLMMMKKKIGIHBGDCDCAADEFFFDDEFCFGHHHGHLOICGW[M>>=<=>>;==84831ELNOLIIJMNOPPLIIJKJHGHHHIHGEHJLQSTVVWWWVVYXUWZX[]ZWYZZ[ZY^_[]_W\a`_aeddhfddc`^a]^\XSPOORVZ]`cdd_bca\ZZ[\aed`]^a_egcadebbda``akd9(.,,-)$&&&(*)(*1.*+19>?82*('" $&%!!#'('''(+*)(*,,,-/4673498//4543/147:80+'&%##&,-.,,--,+)(-.)(..6DGFAC@9>]_JLSQQQRRRQOPRRPOOQTRRRRQRRRUVUTVVUWUTSSTUUVSSTVVTSTWVUVVUUT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&&'*,/4;?A?>==<;>??>>;999:;?BC@;>?@@B?@DCEEDFHJILKKKLLMNMJJKIHFCFGFCCFGEDEFFGEEDCEGGGEEFIKHCFTXG<==<<>=::;7383%3?GMRNKMJLOONMLKHIJIHGGGFHHEEFHHMQTTVYZXVVYZWXZYZ[Z[\ZXZZTX`_^_^adb_cfdbid__b`\\\_^VRQQOTUX\bfd_^^\\]]\[\`ca][^baaaacffdccdb_^ih>'-+,,)&&''())),---.28;<95+)+##38*%('%&&&&(,00.-),,)+0547784036232-,1485,+*'%#$&*,.-,+*))+'&,,1?FILHEG>$"16/EG=;EPQMMNNNNPS_^:!& %BTOMMMNOPOMLIMPONOPQQSQKJNQQOMLLLKMPMJJKMMNORPOMMMNNLLNOPOQSPPQTUTTTVUVWVVWX\^``abeefccfjklmjkqwˆi-#! )2,#%.9:5-,14553328;3,6CNIGHGHIHGFFGIJJIHHIIIHGFIHGGIGGIKKHIKIFFEHLLJHJMKKJHIIIJJJJKJIIJIKKIIIGGIKLKJJKLIKLKJJJJFKMJ@9;917@AAC@?B:@^aJLUQRSSQPOOOQSSSQQSUSPPQRRRRPQQQSVUSRTWWTSUUSSUVUUVRRUWWVVW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&%$%')*,17;==?>;99<>==;;?@<:>=:;?A??A?CA?AB@ADDDEGIKMLLKJJKKKLKIKMHEHCDDCCFECFEEFFFEEGJHGGECHKGFFDSZJ:;====;99<846745?GIIMMIJKLORMHHMGHHIIHGFFGHIHGHJLMOSUWWXXUX][VVYXW[]YZ[XU[\Z[Z\`^_ab`cc^`ca^[ZZ]\a`XRRRPPUZ]`b_ZXY\][XY]Y[_cedb``aaacfgegbacb^fiH&*)*+)(#()'),+*'*-/022130&$(!$9>,'-*'))&))).52)(++''/695862033375.-0341()*(&&'(,..,+*+,,*$%-08HMHLQJJF/"1;'/DG==AE=BabJMVPRSSQPPQPPQSRQQQTSRTVVSQRSRSSSRRURRUURRVUTSQRUVVRTUTSSTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$&&&'&)((*/5<=>>?A<9<@@??=@>BKNJLOJFHLONKKLMJIHHHIHFGHJIHGHHJILQVWXYTXZZ[[XUVX\[X^b]^_ZX]ZUW_^__]^`^^`_\]^^]^`_YSPPQRY__]]\YW[\Y[``\Z]`ba`ab`cdbbdeccc_[bdjlR##,./-(%'((*,*)+*,.-+)'%,)%&'#'58.*,,+--+0.''-+!&')('(/55652002464.,0462+*)*)'&',,,+)),.)).346CPHDEJGJL9&,7*!".DG>ED>C^^HKSRRRQQQRRSOPRRSUTPOOQTUTRPTSRVSPRTRRVWTRRVVTRSVWVYUTVVTVZ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$()))'((),06;<==<<=<9<<<=<99>=>>:;>><@BAACA?EBBCEGHIJJKMNNMKJKHIKGDEFFECCDEEEDEFFDEFHFBFJFFHF@IH@BRYK;;PIFNNMLKLNOLKLOQPPPPPQQOMLMOONKJLNOOLKMMKLPQOOOMOQQPMLOPNNOMPRSRQTYWWYXSTY[\ZZ^```aeddhjjiiklqx…•<$ !.70$"+7;5579753.1:;7409MHJMKGHIGHGEFHJJIJIGGHIIIIHGGHGGJLHIJHHIHHKLJIKJHIKJJKJHHJIJLKIHHLHJMKHHIJMMKJLLJHKKIIKJHHJIHB==837>?ADCCD@E^]ILRUSQQQRRQTNPSRSTRQPPPQRRSTTSSSSSTUTTVVTSSUSSUVTSSWUSSSSSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#(*))*,-,-27>=::;<>>=88>?<;>====<=?@A?=?B@?DEEFEDGKLLMKJLKJKKIJKIEEHFFECBDEDCEEEDDFGFGFEEDEHHFFCBJZQ>9=;QIKKKMNNNMLJIIJMOOOQRTSQNLKMONNONMNNMMNOONNRRPPSRPPNQOMQQMKPPNNRSRSX]YTVWWZZYZ^___afeggfhlmnouv|‚…G!"/<." )9:83000-+++/25639FLKIHGFEEFFHHFFHHIEGIHHHFIHGHJHGIIHHJJIIJKIIJJHHIKJHGJKKKKLKIHIKKIJMKGHKKJJJJJJKLGJMKIIIHGGIH@:8858?@AA@BD:C_]KOSPPPPPPQQQRQQRSSQQRSSQOPSURSVVSSVTRRUVTSUUSQTWTQTUUVVSQTX€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$*),.,)+/3::;<<=<<:<=;?C?>ACDB@CFDDFDDIKKNMIHKLILKHFFEDEFGFCBDFDEEDCDFHDFGGGGFGLFDDAETO9:@;8<@=:973388=CLKLOLJHKKLLJLLHHIGDDGHHJLIHKJGIKJLMIMTUSRRTX]^\[[ZYX]_\\ac`YVX[[\^`bb`_`\[_^[\`ced_ZWURONNSX[ZY[[`babcb_bbbcefffbadca``cccbebcrl>&.-*)*++*)(%$'++.21./0-*+03114-))/1..2."'1(#*,'%$!&4?<50...+&)*)'(./**)*-,'$%$$'**+/353139AEEIECCB?BHE8(/CE=;BLNKMKLMJKRW]B#=QIKKLMNNNMLMJHJNQPOSRQPOONMPNOPNOOLQOMOPONOPPPPOPONQROOPNLOOMPRQRUWWYYXXXXXX\^^]`dhfddfgkmlmosu~€Œ‡R""!3='$23-)%$$####'+1317EJIIHGGGHIGHIIIGDEEHLHDDGIHGHIHGIIHGHHHIJIIJJJJLOIIHHJKIHIIIKKKJJKJJJHIKKHJKKIHJLKLLKIIIJHFHHA;9737?ABB@AC7Aa]GKTQQPPOOOORQOOPRSSRRQQRSSQQUURSVVSSRPSYVQSRSUVUTTSXVSSUUTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$%(**-00.69;<<;<====<<;<<>=<=?@@?>=AB@BFDDBEHEHLJKKMMJJLLJLLGEFFCDCDEFDEGDFHHGFGIBEFGHGFGGDDCBFTM:6?@?;=>=741588;EKKKMJJJKJLKJJLJIIHGGHIJLJJIIIIGIJJIJKMOQRWYUX]]]YUW_c_Z]``\[^]YUZ_```ab`ba]\]abgjh_WTRPOORX]]\\Z]de`]__aabbddddcbbcda___dfba`bolA$/.)**,)))'&(+-+,24/,.0-*/4/&%,,---,--,"%.+"$+0*'$!&4??951,+)%(,0,(*02++-0/($$%"$)../1110,+-/.2124435:5.&/CF=;99=<9:?@?==>???A?>??BCABEDBDHJJHIHHJIGHJIGGEDCDDCBDEDCCEDCCDDDDBDDEEEDEGEBA@FUQ:7<;:;><=96445:CILJKLJHIKNMLLLKNLGGHEEIIHHJKHHIGGIGHLMKMQRTUTW]^ZZZ\^[[c____]YXYWZ[\_cc____^\[_deeaVNKLLKMQVZ][Z]`_^__`dc_acadeb`c^[_dbacedbffbepN"/-*+*+*++'*-,+*(,330212+*22)&+*+.,)+0-.((*&#*(%##"*8B8541*)+*-.01..2621.**,,*%#&/5533010-+,-,+)(+-++++*&/CE>ABB@AB:D_ZIOXQQQQQQPPSPPRTSQPRQQSRRRSQSUUSSTUUSTUSRSTSRUVSQSURVWUSSUW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ &(-11..4<>=::<9:;::;=>???>>>?@BA?>@@@BDEDCFGHIHJJJKJHJHEDDDABDBDEDCBCBDEEDCBCDCDDDFECDFABEDBNN88A>==>:<:7545ANPMLMOLIILNNLMKKNIDCDBDJKEIJJLIFGFFJKHIMNKOQSUUW[b[UX`_\]\^ab]VVYZ[\^`a_]a_^^`abbb]VPNMMLLOQSY^]Y[^__`__caacbbgjc`dc`dfc`aacbb^\dmW& +.--+('*,++,((*''/43144+&-0-..,++*((*+,'&)#!*%#$%'/;C;874/./.,.2311442/*(+/.*&(/5744521.))*-,*'&'*+,..-).BF>=BLMJKJJLIJP]Y@, 9RMILLLLMMNNNMLKLNPRRSSRQONMLOONOMNQQNMOQPONQPONPPOOOONLOQRQPOMOTUSSUXTOQSTWYZ]]]]affdefhjkjkmovƒ{„d)$#  !$&$(')**/=KKJIIHHIIJHGGGHIGEHHGIGFIIGIIGHJHIJJHIIIGJJIIKMKGJKJIKIHHFIKJJLKIKMKGIJJLIIJJKLMNKIIJKIHHFGJIB;9936>@AB@B@7B][HMTRRSSSRRQSOMNPQQRTPOQSSQPVSRRSRRTWSRTTUUSTTTTUTSUVSSVVSSW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"+43./4:=<::<:==::>?=;=???>?@>BBBB@?DE@BHFEFFIGHJJKJGHFEDDEDDCDDCCEDCBEGFDCBCDFEFGFDCJFCECBOQ>7;;;;<;;:5459GTVNLMNMKMMKLNKJKKHGFGGFGIKKIIIJHHFGIJHIJKORPNPPT[]][[^_\ZZ^``_^[WXY^dc]]a`ba][^^Z\XSPNMLLOSSTYa`[Y]de`]__^```acccddcccbbecbb`bb^ah\-(.-***&',-*(('*)',22-31+),,*-/.*%%'%"#$&$""&%%&((.7<>?=81-,.,131-142+-021.,,./14543353.*(*)'))*)('()*-*-BF?=BKMJKJJLIIPZ[>#7ROIMLLLLMNNNKIIKNNNSTSRONNNPNNOPRSRNOPPNNNNOOKKNOMMOPQRQOPRQNOQQSROPWVRUURTWXZ^_`bgebcfhlljjkpwz†h(&! """""!&'))(2CNHHHHHIJKGFGHGHHGHKHEEHGFHHIIGHIHJJIHGIIIIJKKJIGFKLJJJJIKJIJJIHILKIGIKKKNJIGIKMLKJIHHHHHJFGKJB;9858?@@B@CD8Cc^FHQPPQSSSRRRRSRPOPRQRQPQSRPURRUUSPPRRRRSRQQTVSPSUTSTTTUUUUV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ &-1159;::;=<<;:<>???>>===>>BBB@BBA@EFDFJHDHKHHKLMLGIHFCDEEDFDBBDEDBFCABEFDBEEEEHGEECBABBAML@:>;>?>78;8425GVTKKLMLJNMJKMKIIGFGHIJIHHMIHHGILJGIGFKJHJPMKNSTTUV[_^\]^\_`bc`ZXYXX[ceb`aba`^ZVVXUTQLJJJJORTTX^_[`_ab`adccaadebbf^]`dcabc\`c__b`anh:&0+%)/)&*.+()()*+-12/31/-+(&%*%#%&$$'"%'$!"#!! "#$)25=A?:60.330.,-00,',10+(+/4201587400.+***(%'*+****(-,!-BF?=BKLJKJJLHIPXX86RPIMLLKLMNOPNMMOPPPTSQONNNNKLPRPOPNPPQQNJLPPOMMNNNNPPQQPNPRSPQRQPPMOSROQSTUWWY]acccfdeghijgiiqx}z‰Žh("! ! ! $)&&4ELJIIHGGHHEFHIGGIJIGGHHGGEGIIGHHHHJHHHHHIJFGIIHGGHHJJJKIGGJGHKKHHKIIJKKJKKJKKKKKLMLLLIHHJKLIIG?:9:69@BBB@AB8Dc^FKVOOPPPOMLTSRQRSRPORTRPQSSQUWROPSSPRTTSSTUTUTRTWURSWXTSUUS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !$(,05:<<;::>=;::==<=<<>??>=>@B?<@DB@ACBDIKGFIIJKIHIIFCBBBBBCAABBBDFACEEEDDEEEBBEFFGFA@CC?KOB9=>=9;<;=6325DOLEJNNKFJMLKLMJFGIFGGEFHGFHHHIIIKFEEDADIKMHJNPRTRXX[\Y\`a^bd`\[ZWX[^`bdca]]ZVUWVRWTOJLQQMPSWXZ]^^`cc`_]^c_^ac`beddaceccc`a^^_cebdmj>%2+#,.+').-(&*'*,**--%'(%$)+'&&'('&).&)'##%$%$$$$#)/2>>=<<@BA@CDADBABFHHGJIHIJGEHEEDDDEDCA@CFEDDCCDDEEEFFGHEBEFEFIECD@@JOC:9;;=:7;<7/18ISPJIMMKHGLJMPMJJJIIIIHHGFGKKJKLLLHDDEC@CJKMLKLNORSW[ZZ\_`\]``^__[X[]]_aa`X[ZVSTUUTTSQNMMNSVVW[^^]_aec__ba^^bdbbdcaababefb_acccccadjN+/---)%'-/,(++*)*'&('"#&&'))%%$%-31+'+,'&))&'''%*35/6>56A;311/-,*()+,0/)*263101111233.*+./.,)%',)##'&&%-@C=?@@C;F]UELROQPOMOUPOLNQRRSRRRQOPRTSQRUUQQSRTRRTSQQRQPQSSSTVSSUWURRU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !"#*0:=99;:9::;;<<=<<===>>?>?@@>?AACDDEEFHIJGHJHFFGHECCCBBCDDCDECBCDCBCEFEDECFIFDFHHFCD@@IND99>=<:;<;9117GQPJKKJJGJLLNNLMMKHHHHHHHHKLMKJJJHIHHHFDDEGIHHMRQORUYZZZ]`]\^]ZY[\Y[]`cc_YVWVTRTWXVVURNMNOPUX[_`^]^bfebbcb`acccdb^_baaega[bcdd`]^bjoT#"-0,+,,)&*32,,*))*+))(&%&$%()+%#(.10/01-'&*)#$')*.9<73:59DA6-.,)&&(**-+*-24432235652021/../,(*'&'('()+'$.AC=>=<<=?=;=?>=@CEDCDFGGGIFHJHFFEFEDCBBA@DECCEDCFFECCDDCADEGGCBEDDBABAAJOA;<;;==;969549GOMLMIMRMJKJLOMKJHJIHGGFGGIIKKIJLJKKKJJHGFGHHJKJJMQRVYYX[`ZZ^`\WWX[\^_ba[TUUVWWVXY]XSQRROLSTTV]a`^`egfdbabbffccddcababe_\baaa`aabagmX)*.--+*)(,032-*)**)($&('$%')+-(%&(*.40+)*+(&&%%',5>=35=BFB4.-,+++,---&-1004521134541.,/0-+*& #&'''(*+*".AD==<<>@A>>B@?ACDCBCEFEDGGGIIGDFBDDCCDCAEDCCDCBDDDDDDDDDEIIFGHGHDC@B@?FKB9:=:::<:56239FQLJJLNLHKKKLKKNOLKJHHGHIIJHKMIKMKJGFIIGFIIIJMLHJRQQTWYZ\^[[_a^ZYWV[_`_]ZVVVW[ZXWYZZXSNKMPPTWZ\]^`cggdca_bcggefda`_ca`b_Z[_aababba`k^2&--.*+(',550-)),+*'$'+(%&('(/+''+00.-(',+%#'%%&-7BA97@LJ5$(1/++.-(&*+.475004:840.//.595-(*($#"%*/5>==>?>;=????>ACEDCCDFFGGGIFEFFDCCCABDCBCDCBCCEEEDDDCCBDEFGDBEFDABB?DID;<=:9:<<75026CNLLKIJJJIKLNNMNMHIIHFGGHHKILMJKNLKHHJJHILJJIIMONOQQSUY]^\\\_`__\WPW_bb_][[XXZ[Z[]`YROOOMJPUZ]_^]_`cdcca`cfc^_dc`_aca_aa`_e`_becaaboh:(-,*+,,*,2543-*,-+)'%(&$(($#)++)*,-+*)(%%&'''(*,1B8)%**.)'('%)/035400:FGE@:762,043,*,,'% #.106F6(0CE>=CLLJJKLKJMQUO7''((!/PTLKNLILMLLLMNOMLNRTTSQQQPNQOMMNLKLMNOPPPOOLNQONNONNOONOPPPSRQSURPSVXVSSSRQXXWX^``abccceghgllmt~…Žk.#$#&(()+-)  &%(/56;BJHGGIIIHFFHHGFFHKIGHJKIGIGHIIFGHIGGIJJIIHHGGKJHGKKJIKIGJHGHIIHILJJIHJIHHGHKLKHHHIKKJJJHHIGJH@:8439A@?ABDB8F_UFOSOSQQRNQTQORTQNOQRQQQRRSSRTTSVSPPRSSSSTTRSRRRRQSUUUTRSVUR€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&'$'5=:9;;;::<>;=>?>==>==>@@BB@ACDEDEEFGFGHFFFEDDCCBBBCB@BDCCDCCBBCEFFDDDGGCBDDEEBDDBEJD??<9;<;975116JSPGGMMIGJLJKLKJLMIIHGFFFFIHJLKLOOJKKJIIIHJJHJMMJIPQRTY^_\]]^__`]WV[_abca^_^^_aaaba]WROOOOTUVZ_`]]^acdca`aa^]aec`___^`ba`aaaaca`bgfqmA$,,,-+()*-2794,*+*((''&(+,(%)&%&)*(&&%$$%''')*+-/9BE?2,(%**&..*&&+/1/1007FQVOMJGIIB9364/-.,((,/57-(0:.!0CE>=CLLHIJJIILOWR9)'($/RVNKNKHKNLKPLJORPNQTRQQQQQQQOLMONLMNOPPPOOOOOONLNPPQPNPQOPSRORWSRTTOSSSTTRRVWXZ^__`cefffhigjnnr~ƒ†Œk.  ""&'*)'% "!$+0.2;FJIEFLKEHKKIHIIGGIHFHKIDIHGHIIGFJFEGHHIHJIEEGIIJIKJGHIIHKIIJJIIJJJIIKKIIMKIHHIIIKLJHJJHFFEHG@<:72;@?A@;AC9IbWGNPOQMORQROLNRRNOQOMQSQNORSPRRSTTRQRRQRTUTRTTRQSUTRTTUVUSST€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€")'$+7<:;<<;;;<;<<=>>??=>@?=>@?AABDFFFEFEEEDDFE?BCBBDDCECCCCBBCDCBBDDCBDEFDAEHFFFBCEACHG<<>;::>:852-9^hPHQPLLHKLMPOKKLKJIJIIIIIIHIKKKMOMNNLLLIFIJKMNKJLNPRUY\]^b_^^]^^[]]^^beebddccdeeba`\UPNQTPTX\^\\__`cedaabc`aba`acee_\``\]bbba``bdekmK!*-.-*$ (24/681)**(+(&&)*)'#&')+)'')'%'**((+347:>EJI9&"$'**+(**)-44.0-0?R[XPPPLHJPQNIC:1-+(%.8;83)(57/&1DF?=CLLFGHGFHJLWQ9'!.QUKMNKIMNLLMKKNPMMQSQPQRPPQLLMNPONPNNOOOOOPPLMOOPPMNRPMNPONRQOPVUQSTTRPRSQPTWY[]^^`a`cghgjokomq„…Œn/#''##)-(!  !%)*0:BJLEEJJEGHGEGIHDFJJGGIIEHHHGHJIEHEGJJIIHIIJJJIJILIIKJIJKIIIJKJIIJJIILLIIDLNHFKLHLKIHJKIIGFIH@<:62;ABEB=EC6E_TFQUNPRQOORPPSSOMOOKPQQOOQRPTSSRQQRRSTSRSVTQRTUSSSSQVTRRSTUU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!&*($+;::;<<<;:==<<=>??:<>>:DA4EbWFOSOOTPLQPMNQPPSSPNMQRPMOSVURRSRSSONSUQORSQSQQTVUSSRTUTSSUV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !$$$%$'0<:;=>:9<=>>=>@?=????ACB?A@@CDCDEGB@DECBDDCCDEEDC@ACCDDCC@BCCCDDDDDDDDDEEEEBBA?DGE;;<:;<>;;65-;:629>=@A?DB7IbUDJOOMPQMNPMNPQPOPQPOPQOOPQQNORSSUVSTSRQRSTTRRTUTRSTTTTTTUUV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! !"#"! #!#&''()6=?;:99<>>>>>>>=?ABA?@??BCBACEDBEDCCAABECCBBBBBCABBCBBAABA@BDDCBCEFDBBEHADB@@CHI@9:;:;<;<=2/1:MRLKKKLKLNKLMMMMLKHJJHHJJIMKJLLJKOLMPOJILLJJLMLJIJMMMNPUY]^_adb\WUYZ\^bhkkffdbcffdfa[WUSRSQSV[_bba]difba`^_^_bcabfcbcedc`_b`^`bda^bbkf9'.*&())((,133>A3)+*$&/1)&,20..014421220.,-.0/10-374,*+--*)(,(%+59AO_RJT^VMPQOOOKKJGNHEIIEEIECA@@?:32,*#-DC>=AMJIIIGFGJMUQ/+JPMMKNOKKNMJMMMPQPPPPQRRQPQPPQQOONLLLMNMNOPOPMJLOONKLNNLNQPRRQSSQRWWWXXWWWXYYXWZ^__`aacdghjmmksƒs2$"""!%*'#'%*24:DIHHHGGGFEFHHGGHHGHHGGHFEFFGHHFGJKHHHHJHFGGHHIIIIJJIGFJGFHJIIIHHIJIHFEHIJJJJKLJJJIHIHDGGIG>973/:@=@C@A>8J_TFMPQOMMPPONNOPRRQONORSQPRRQSQQQRTUSPRTUTSRSRRRRRQRTUUTSSSRR€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! !%&$$&&#%'$$'&1:<:;;:=@=;=??=;>>==?BCB@@??ADCA?FGB@CD@BBCA@@ABDB@??ACD@@BCCBCEABCDDCCBDEA@@BGHB;;:8::8:=3/37AKOPMMMJGIONLKKJKLGIJJJJIIKLMLJKLKLLMLJKMJIJLNMKJJLKKLOSWY_`ced_[YUZ]]aghddddcefecgd^VRRRRQSW[_aa`]^bffb``b^^bdabfg``db_``b`_]`cdbc`hjC&-+)**(%$*/654HaTFNRNROMQOMRROMNPOPQOQSRRRRQPRUSPQTTTSRRTTTSQQQSTSQQQSUTQPSU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!$&()*))(%$&&.8;:<<:<==>?=;;=@><>@BBBCDCBAABCCACCDBAAADCAAABBBEDCCCCA@FDBCDEEEHE@AA@EHD<;:9<=;<<9426?KLLLMMKIILLLMLLKKHGHHGFGHIHJNKJKLNNLKOPMLJIJLNNLLKLKLMQUX_`aba_\[X[\[^efcbdefdddddc]UORUTSQT\_]]`]^afhfca]`a__bca`bde`_`a``_^_ceed`hoM #++')*)$#'+787?A1&()+65)$+5.-,+((**,*''(+-/12202@D:1/-/32/,)**'0Na\VTTTPOOPLGHIFJLIGIIHGGFF@EDFJFCLLFB6*!0@B?=BLKIIIGFGJMWS0(GOLJLONJJLNLMKLPRPOOPQSRPOPMNOOMMNKNKILOLMTOPQQMOQOQPNMMPPOPOPQQTUTSTVVWWXXZ\]]\\\]ccbcdgjlijhny|‹w3'-"!#'& #)+/5@IIHGGGEEGIIIIIFGJGFFFIKIGIIHIIIIHFGHIHHHGIKJHHIIHGHIJHKKHGHIHJGFGIJIIEFGHHIJLIGGIGGGGEGKI?9855:>?@@>D@3HbSEPSPSNMTRLOQONOOPPQOOPRQPPRPQSSQSTTUSQRTUTRUSQRSSSTSTTTSSTU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!$$"((''++(')8=:;==<<<>>=:;==?A@??>=BABCBAACB@@CECAABBCCCBBACBAABCBBABB@CFFC@BEFEDCCGC?AA@GLF=<;:==;<98428@IPNLKLJHIMKJHHIKLJJKLKHHIKHKNKIJJOPONNLKMMKJLNONNMMMKKMU[\_bcc`\YYZ[]`dfeeeeeddfhg_ZVRQRQSPS[_[[^Y_efc```___accbbdb``cb_]`^_accccffluY#!*,''*(##')1327B;)'*-0/''26((*)(()))))),.12/0203<>3464221/10((*'4KY]_^SJIKHLOLEDILJIHFDEFGGFIFFKFBIIJNIB;0-6@B=:BLLIIIGFGJMXT1&FPLJLNLKJKNLMKKOQOMRPPPQPPQONPQONOOKKLMOKKPNNQOMNQPOQQNNPRSQOQQQRTRTUUUTTTTXZ]^\\]^`abcefhhikkq|}€Œv4'* ! "!"%$ %--4@HHGHHEFHIGFGKJFGHFEGFFIHEGGFFFGHIIGGGHGEDGJIFGHIHHHHHHJJIIKIDHGGGJKJGIIIIIIIIIKJHIIIIJIKG=7863;A>AB?A>7K_QFOQRRPORQMMNOPOOOPPOPPNOOQRRRSQOQUUSSSSSSSTSRSUVUSRTTSTUUUU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$'%#&'&(-59:=>=<=<;<>><;<>>??@?=?BCB@ABB@BA?@CCABBAAAABBBA@@BCCB@CC@@DDBEEDEEFFFDD@??BJOG=<=;<:8;:7117@KNNKKNLIJMMMMLKJJIIJLKHGHKKLMKLLJLJLOLLNONLKKKKKLKNOMJMSY[_bdca]YXWZ`deeghfeghhhhd`]YQQROPQTY\\\\`\]dfb^_b\[beb_`eecbb_^ba`aba``beikt`,),(()'#%)*+372:D5$(+**(+3/'(+.-.-++-.0//..)(*.3>?4362---,0.)'))*;RV^^VPNHAGMKEDIKKGBBHIDBEJGFHHHGFHHJD@A>?:?B<9AKLIIIGFGJMWT1%EQLLLJJMMKKKMMLNONMRPNOPPPQNMOQOMNNLQPKJMONONOONOPPLNNNOQQRQQQTURPTTUUUUTTUWWXZZ[\^_`abcefgills}}€t4& )2(!%"!))5CIEEHIGGGGGFFFHFFFEEFFHIIHHHGHEFFGGGFFIHGGIIHEHJIGHLKIJJIIHHHGKKJIIKJHIHHIIJJIJLJHHHFHBCGF<7625;@?AA>B>;K]SEKSQRRQNMOPNPPNMOPQNRQMLRSRQSTSOPSSRSSSRSSSTRRSSSSTSTTTSSTU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! ")168449<<;9:<>=<<==?><;>A@==@A??@BA@@BCB@?@@ABA@@BCCBBBCCA?CCA?BED@CBBDGGD@CDA?>AJQF::=<;::9>:206ALNMLMNLIHLLLKKKLLKIHGGGILJHHLOMMOQNNOMNNLOMKLLKJJILONLMQUY[^^^_]Z\YY^bceifdehjhgg`aaYOQVTOSVX[^^[]]_ba^]^_abaabba_bc``a`_baa_^^adfjgne5',)(+*'),)*5;45EB+&+0,'+1/))-00121-/2210/0,/8AGLC0-.)(02+((()-+$/GYRMTYPGJIEEFEDGIGBADC?BIJIHFFGFCDDE?<@>?=?C>9AHIIIIGFGJMUQ0%ERMLLIINMJKLMLKNOOOONPQRPONOPRROMNNKLOONNNMLNPPQONNQRPNQQONQQQRTRSXSTUVVVWWVWY[\\]`cccdegijfihmwx}‹s1&49/ ! &5FIEFHGDGIHFEFGGHHFGHGGHGHIHGHHHIGFHHIKIHHHGFGHKIGFGGHHHIJHGHJKKJIGGGHHKKJIHGFFJIHHGDEGGFHF>::78:?@B?=D?9J_SCKTQPOOOOPPNOPOOOPOOQQNNQSRQQRSSTSOQQSTTSRQQQRTTRRSUTSSSTSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !"$# #&(19995588:<9:<=<<=>=<====?@@A?@AA??ABBBBA@??>ACCA@BDECBBCCCAABAABEFDBCDEEDDCDB?A@?JTJ<9=<:9;49844;GKQKKMJIJFLLMMLKJIGHHIIIJJKKHIMNKLKNMKMNMNRNMOQPNLKLLLKLPTX[]]^`_]][\`bbbdeddfedfijd`YOOSSPSVY\__\\]__``^]_^^`bbceebbb`abaa`^]_cdbjngmj?'-,*,+'+.**1:=9AG8+,1,(045/021//234553/-./35;@CIA/,20+-+')((),,,29FGEINJIURBAHCDJDKGAEFBEDEG@>B@@=>D@;AFFIIIGFGJMRO.%ERNIMKJLKIMNNJIMQQQQPPPONPRPRTRNNNMLIKMKKLJMONKKJKPPSQNOPPROPSTRSVVTUVVVVVWTVZ]\Z\`abcefghhmnlpy{‚’s/(162+  %5EIGIICCFHHGIIIDHGFHHFFGEGIGFGGGHFEHIHJEGJLJGGJGIIGFGHGFJKHILJEIIIIIGHIHJKJIIJKHHIHEGIGGFHG?;:65>>>>>>>????????@@@@@@@@BBBBBBBB>??@ABBC??@ABBCCAABCDDEEEA@@@BMXL=:=;=?:<74535CRMMLLKJIIMMLKKJIIJIGFFGIJKLLLLMMMNNNNNNNNNNNNNNNNNMLKLNQRVX[^___^YZ\^aceedfhjjhfdcdc\TOORQTW[\\[Z\^accb`^bbbbbbbbcccccccc__abdfggdiejpG#/0.+*+++*,)8A9FIOWHEA><=?@B@=;>BB>GGDBCBBDCHE;9@EC=;AB=@JKJHHHGGIMQS3%ESIONLKKLNOJMOOOOQTTQQSRNNPOOOOOOOOLMOPPOMLNNNOOPPPRQPOOPQRTSRQRTWXUUUUUUUUQRUX[^_`bbcdfghhmhjry|„Žt0!+53)"$)'(CKGFEFEFFGGHGFEEFHIIHFEGGGGGGGGGFGFGFGFHHHHHHHHHIJJJJIHFHIKKIHFJJIIIIJJIIJJKLMMLKJHFECCECHG=9:60C>7K\MDOTNOOOOPPPNPQPNNOPPPPPPPPPQQQQQQQQQQQQQQQQRRRRRRRRRSTUUUTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !!489:;;:<::::::::<<<<<<<<>>>>>>>>????????AAAAAAAABBBBBBBB??@AABCCAABBCDDEAAABCDDDEB@@AEOYI;:A>;:5:96206CNNNMLLKJJNMMLKKJJJJIIIIJJLLMMMNNNOOOOOOOOOOOOOOOOONLLMOQRUWZ]_`__]^^_`abbcdfhhgdcffc\TQSVQSW[]^]]Z\_abb`_ccccccccaaaaaaaaaabcdffgjh_esV  -1.,+++)(0138;;@K?.,58CIA)(+12/.0,,,--/013CG>?MSM2)*2128:9525=====;:;>DHH><@B>BHGGHJJGFJPZS0$CQIMLJJIKLMJKLMMNPQSQQQPONOOOOOOOOOJLMNNMLJNNOOOPPPQQPPPPQQRQPOPRTVTTTTTTTTRSUX[\^^bbcefghimhhpv{„p0 !'-133390$#@E>9P]IESSNNNOOOPPPOMNPPONOOOOOOOOQQPQPQQQRRRRRRRRSSRSRSRSPQRTUUUU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"0478:867::::::::<<<<<<<<>>>>>>>>@@@@@@@@@@@@@@@@AAAAAAAA???@AABBAABBCDDDBCCCDEEEBA?@AEOXQ>8;97<>8<920:EKLLLKKJJILLLKJJIIHHIIIIHHKKKKLLLMMMMMMMMMMMMMMMMMMLLKLMOPVWZ]_`a`]^_`cdefdeghhgedfeaZSQTWOQUX[\]\Z\^abcbadddddddd________eeffggggabafp[*3:8520,(&/316?:9FC/*-2BK?/,+./-/3421/.---3BE=BVa\B55=;7:>5/+/;BC@E9,%&+0388:;>@BCB>>AB=97=EE=88:=<778614<@??>?A=4OcNBOPOOOOPPPPQONOPQPNPPPPPPPPQQQQQQQQPPPPPPPPTTTTTTTTPPRTUUVV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€  " #"/469::7899999999<<<<<<<>>>>>>>AAAAAAAAAAAAAAAA@@@AAABBAABBCCCDCCCDDEEEC@<:=EQZJ>9<:9;<9;7./;IOLLLLKKJJLLLKKJJJHIKLLKIHKKKLLLMMMMMMMMMMMMMMMMMMMLKLLMNOWXZ\]_^_\\]_acdeffghhhffgea[TPQRRTVYZ\[\[\^`aa``aaaaaaaabcbcbcbchhhhghggbadhm]2 4CA>:60+(-/29?=:@G<.*6HG8,**+,*+-+++,,./0>C@=GWXL>55;704:;7348;:863-%"$''++*,.379>=?CDC@?>B@:8987438EKJDBDBBA=@FIDGJJECHNRK;(%#! "-AOPKKJJIJJKNMKMOQPNPSRPOQQNPPPPPPPPMMNOONMMLLLLLLLLKLNOONLKPONOOPQRQQQQQQQQWXYZ[[[[\^`dgjlnlijpv{ƒ‹t0#%.5=@>A6'-DGDHJFGIFGHGDEFIEGHJIIFEGGGGGGGGFFFFFFFFGGGGGGGGGGHHHHGGGHIJIIHGIHGGGGHIGHHHHIIJKJIHFDCCEEHG@;836<>>ABAB<5K_RIPROOOPOPPPNPQPONOQPPPPPPPPQQPQPQQQRRRRRRRRSSRSRSRSPPRSSTTS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                 +    €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€        €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€       €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€           €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€~~€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€~€€~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~‚‚‚€€€€€€€€€€€~‚€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}€‚€‚„ƒ‚~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ‚~€€€€€€€€€€~‚~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~€€€€€€€€~~~~~€€€€€€€€}~}}€€€€€€~~~~~~~~~~€€€€€€€€~~~~~~€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€~~€‚€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚ƒ‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€‚‚‚€‚€€ƒ‚€€ƒƒƒ€€€€‚‚~~}‚ƒ‚ƒƒ‚‚‚€ƒ‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zzzzzzzz{{{{{{{{yyyyyyyyxwxwxwxwwwwwwwwwuuuuuuuuxxxxxxxxvvvvvvvvxwxwxwxwvvvvvvvv{}}zyyyyyyyyyyyyyyyyyyzz{z{z{zzz{z{z{zxxxxxxxxvuuuttssqqrstuuvttttttttyyyyyyyyxy|}}|yxvvvvvvvv€€€€€€€€€€€€€€€€€€€€€€€€‚€~~yyzyzyyyzz{{{{zzyxyxyxyx}}}}}}}}{{{zyxxwvvvvvvvv|}~€‚ƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„†…†…†…††ƒƒƒƒƒƒƒƒ……„ƒ‚€ƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„„„„„„„„‡‡ˆ‡ˆ‡ˆ‡ŠŠŠŠŠŠŠŠ‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚††††††††ˆˆˆˆˆˆˆˆŠŠŠŠŠŠŠŠ……………………„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚ƒƒƒ‡‹‹ŠŽ‰……‰Œ‹ŽŽˆ‹ŒŠ…‚„†‡ŒŒ‹Ž‘‘‘‘‘Ž……„ƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€wwwwwwwwxxxxxxxxyyyyyyyyxxxxxxxxxxxxxxxxwwwwwwww||||||||{{{{{{{{xxxxxxxxwwwwwwwwy|~}zwuuxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwyyyyyyyy||{{zyyyrsstuvwwuuuuuuuuqqqqqqqqsvy{{yvswwwwwwww€€€€€€€€€€€€€€€€€€€€€€€€‚‚€~~zzzzzzzz}}~~}}}}}}}}}}}}}}}}}}}|{zyxwwuuuuuuuu{|}‚„„„ƒƒƒ‚‚‚‚‚‚‚‚‚‚„„„„„„„„††††††††ƒƒƒƒƒƒƒƒ††††††††„„„„„„„„‡†…„ƒ‚€„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚ƒƒ„„‡‹Ž‹‹Ž“”Œƒ€‚„~………††‡‡‡†‹‰‚…‡ŽŒ“’““““’‘‡†…„ƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€zvtuvvuuvwxxxwwvtuvwxxxxvvvvvvvvyyyyyyyyzzyyyyzzyz{||||{{{{{{{{{zz{|}}}}~}|{zzzzy|~~{xvvuwxxwvvwwxxxxxwwwxxxxxxwvvvvvwwwvwwvvvxyyxwvwxyz{{{zzyyy{{{{{{{{yxvvvutrux{|{xvuvwwvttuv|€€€€‚‚‚‚‚€€€€~}{zyyzzyxy}~‚€€€€€~||{zywvuuvwwvuuvyz|‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ†…„ƒƒ„……ƒƒ„„„„ƒƒ…„„ƒƒƒƒƒ…„ƒƒƒƒ„…ƒƒ‚‚ƒ„…†‡‡…ƒ‚…†‡‡ˆˆ‡‡††……„ƒƒ‚‚ƒ„…„ƒ‚ƒ€€€€€€€€€€€€€€€€€ƒ†…ƒ‚ƒƒƒƒƒƒƒƒƒ‚€‚ƒƒ‚‚‚‚ƒƒ„„………‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚‚‚€‚‚~ƒ‚‚ƒ‚€€‚ƒƒ†„‚‚ƒ„……ƒ‚‚‚‚ƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ„„ƒ‚‚‚„ƒ‚ƒƒ„ƒ‚„„ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„…†‡ˆ‰‰………„ƒƒ‚‚…ƒƒ…††ƒ‚€‚‚‚‚‚‚‚‚‚‚‚ƒ„…†Œ‹ˆ…ƒ~‚~~ƒ‚€‚„‚~}€…‰ŒŒ‹‘“”““““””‰ˆ…ƒ‚‚„„„ƒƒƒ‚‚„„„ƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚„„ƒ‚‚‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€}zxy{{{{xxyyyyxxxxwwwwvwwwwwwwwwwwwwwwwwvvvvvwxxwwxxxxxxxxxxxxxxwxy{|}~{{{zzz{{{}~~{zz{{|||zyyyxxxyxxxwwxxxxxxwwwwvvvvvvvvuuuvwwwwwvvuuwwwwwwwwyyyyyyyyzyxyz{zy{}~~}{{{yyxxwxxx{€€€€€€€€€~}|{yzzzyxy}~~€€~~~~~}~€{{{zyxvvtuvwvvvwyz|‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„ƒ‚‚‚‚ƒ„‚‚‚ƒƒ‚‚‚ƒƒ‚ƒƒ„„„„„ƒƒƒƒ„„ƒƒ‚‚‚ƒ…†‡‡†„€ƒ……††††††……„„ƒƒ‚‚‚ƒ„„„ƒƒƒ€€€€€€€€€€€€€€€€€„‡†ƒ€€ƒƒ‚‚‚‚ƒ„††„„„„ƒƒƒ‚‚ƒƒƒ„ƒƒƒƒƒƒƒƒ‚„„„ƒƒ‚‚‚ƒƒƒƒ€ƒ„‚€€€‚‚ƒƒƒ‚‚‚„……„‚‚‚€€‚ƒ…††„‚€€‚ƒ„ƒƒƒƒ„ƒƒƒ„„„ƒ‚‚ƒƒƒƒƒƒ‚‚‚ƒƒƒƒƒ~~€‚‚‚‚€€ƒ‚‚€€€€‚ƒ„‚‚€€‚‚‚‚‚‚‚‚ƒ‚‚‚ƒ„…‡ŒŽ’‰„ƒ€€€€‚ƒƒ‚‚„‚}{}€ŠŒ‹‘“”““““•”‰ˆ…ƒ‚‚„„ƒƒƒƒ‚‚„„ƒƒƒ‚‚‚‚‚‚‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒ‚‚‚‚‚€€€€€‚€€€€€€€€€€€€€€€€|yy{~€‚€~}|{zxvuuuvwwwwwwwwwwwwwwwwuuuuvwxxvvwwwvvuwwwwwwwwwwwxyyzzyyxxxxxy{}}|zxyz{{{|}}||zz{{|{{zz{{{{{{zzzyxxvvuvwwvuuvwvvwvwvvvuuvvwwxxvvvvvvvvwvvvxxxw||}|{z{||zxx{{{z{€‚€€€€€€~}}{zyzyxwx|~}}€€€€€~~~‚€{{zzyxwvtuvvwvwwyz|‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚ƒƒƒƒ‚ƒƒƒƒƒƒ‚ƒ‚‚‚ƒ„…†‡‡„€„„„………„„ƒ„„ƒƒƒ‚‚‚‚„„„„ƒƒ€€€€€€€€€€€€€€€€€ˆˆz{~~€‚‚ˆ‰‹‹Š‰‰Š‰ˆˆ‡‡†††„„„„…„„„„„………„ƒƒ„„„ƒƒ€‚ƒ„„„ƒ‚‚ƒ„‚‚€‚‚ƒƒƒ‚‚ƒ‚€€‚‚‚‚€€€€€€€€€€‚‚‚‚ƒƒƒƒ‚‚ƒƒƒ‚‚‚ƒ„„„ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„…„„ƒ‚€„„ƒƒ‚€‚€‚‚€‚€‚‚‚‚‚„ƒƒ‚‚ƒ„…ˆŽŽŽ“†€€~€€€{y{ŠŽŒŽ‘“–•”“““’‰ˆ…ƒ‚‚„ƒƒƒƒ‚‚‚ƒƒ‚‚‚€‚‚‚‚€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒ‚‚‚€€€€‚€€€€€€€€€€€€€€€€|zy{}~~‚‚‚‚‚‚}{wuttuvuuuuuuuuvvvvvvvvuuuuuvvwvwxyxwutvvvwvwwwxxwwwwxxzyxwwwww}~~}ywvwxxxy{||z{||}|}|||}}}}}}|||{{zyxwyyyywwwxyxutrrrsuvvvvwwwwwwwwwwwyxvwwwutxz{{yxxyzyxyz{{{{ƒ€€€€€€~}}|zzzzxvx|}}|~~}~~~€€€€€€~zzzzyxxwtuvwvwwwyz|‚ƒƒƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒ„„„‚ƒƒ„„ƒƒ‚ƒƒƒƒ‚‚‚ƒƒƒƒ‚‚‚‚ƒ„…†‡ˆ…„„„„„„ƒƒ‚ƒƒƒƒƒƒƒƒ‚ƒ„„„„„€€€€€€€€€€€€€€€€…‡„}~€€€ˆŠ‹‹Š‰‰ŠŠŠŠ‹‹ŒŒ‹‹‹‹‹‹‹‹ˆˆˆˆ‡†…„†…„ƒ‚ƒƒƒ‚‚‚‚‚‚‚ƒ‚‚‚ƒƒƒƒƒƒ„„„ƒƒƒ„„ƒƒ€‚€€‚„‚€~€€€€€€€€€€‚‚‚ƒ‚‚‚‚€‚†‹Ž‘‘Ž‹‰ˆ‡†……„ƒ‚€€„„„„ƒ„ƒƒ††…„„ƒƒ‚€‚‚€€€‚‚‚‚ƒƒ‚‚‚‚‚‚‚ƒ„…‰Œ•‘†ƒ„……‚‚€€|y{„‹ŽŽŒŽ’””“’’’”’Ž‰ˆ…ƒ‚‚ƒƒƒƒ‚‚‚‚‚€€€‚‚‚‚„„ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒ„„‚€ƒƒƒƒ€€€€€€€€€€€€€€€€€€|yxyyyyz{{{{{{||{ywutuwxvuvuvuvvssssssssuutssssswxz{{ywuwwwwxxxxxxxxxyz{zzyxxxxx}|xvvyxxxzzxwxyzzzzzzz{{{{{{z{{{{{zyxyzzzyxxyyxwvvvxytttttsssttttttttwvuuvvusvy||{ywvvwxwwwyz{€‚ƒ€€€€€‚€€~}}{zyzyxwx{~||}~}{{{{||}}~~~}zzzzyxxwvvvvwvvuyz|‚ƒƒƒƒƒ„„………„ƒ„ƒƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒ‚ƒ€‚ƒƒƒƒ‚‚‚‚ƒ„…†ˆˆ…‚…„„……„„ƒ‚„„„ƒƒƒƒƒ‚‚ƒ„„„„ƒ€€€€€€€€€€€€€€€€‚ƒ‚‚‚‚‚€€‚„„ƒ‚‚ƒ„„……††‡‡‰‰‰‰‰‰‰‰ŒŒŒŒŒŒ‹Š‡…„‚ƒ„†‡†…„‚‚‚‚ƒƒ…†ƒ‚€ƒƒƒ‚ƒƒƒ„„ƒ‚ƒƒƒ‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ…‡ˆˆ‡††‡ˆ‰‹ŽŒ‹Š‰ˆˆ‡‡‡††…†……„„ƒƒ‚„ƒƒƒ„„ƒ€‚€‚‚€‚‚‚‚‚‚‚ƒƒ‚ƒ„…‰ŒŽ”’ˆ„‡‰‹‹ˆˆˆˆˆ‡††††…ƒ€~€„ˆŒŽŒŽ’““’’’“””‰ˆ…ƒ‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ„„ƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚€€‚‚„ƒ‚€‚ƒƒ‚€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€zxwwwwwyxxwwwwwwxxvvuwxyxxxxxxxxwwwwwwwwxxvvtutuz{}}{yzzz{{|||yxwvvwxxwwwwwwxx{}~{xvvxxxyyyyxwxxyyyyyxxyyyyxxxyyzyyxwwxyyxwwxxxwwvuttwwvvuutttttttttttsstvwwvtw{|zxutuwwwuuwy{€€‚€€‚€€~}{zyyz{yxx|~}{}}|{|{|||||{z{|~~~}{{zzyxwvvvvvvwuuyz|‚ƒƒƒƒƒ„……††„„ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚€‚ƒƒƒ‚‚‚‚‚ƒƒ‚‚‚ƒ‚‚‚ƒ„…‡ˆˆ…€‚„„„„„„„ƒƒ„„„„„„„„‚‚ƒ„„„„ƒ€€€€€€€€€€€€€€€€€ƒ„„‚ƒ‚„„„„„ƒƒƒ€‚€€€€‚€€‚ƒ„…††††„ƒ€€‚„……„ƒ‚‚‚ƒƒ…ˆ‰ˆ†‡‡†„„„ƒƒ„„„†„‚‚ƒƒƒ…„ƒƒ‚‚‚‚‚‚‚‚€ƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ„ƒƒƒ„„„ƒ‚‚ƒ„„ƒ‚ƒƒƒƒƒƒƒƒ‡‡‡‡ˆˆˆˆ‹Š‰ˆ†…„„†……„ƒƒ‚‚…„‚ƒ„†„ƒ‚€‚€€‚‚€€‚‚ƒƒ„‚ƒ„…ˆŽŒŒŒ‘Ž†ƒ†‡‰‰‡‰ŠŠŠˆˆˆ‰ŠŠ‰‡…„…‡ŒŽŒŽ‘“•““““•“‰ˆ…ƒ‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒƒƒƒƒ„‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚‚‚€€‚ƒƒƒ€‚€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€{yxxwvvwxxwwwxyywwwwwwwwyyyyyyyyzzzzzzzzzzyxxxxx{|}}~}}|||||}}~~{ywvuuuvvvvvwwxx{|}|yvuuvvwxxwxxwwxyyyyywxxxxxxwvwxxywvuuvxxwwwwwwwxxxxxxxxxxxxx{{{{{{{{xwwxz{{{vx{{zxwvxxxwwvwx{€€€€€ƒ‚€€€‚€€~}zyxy{{{zy}}|}~|~~~~~~~}{{{|~~}{{{zyxvvvuuvwwvuyz|‚ƒƒƒƒƒ„…†††„„„ƒƒ‚‚‚‚‚‚‚‚‚‚‚~€‚‚€‚‚€€‚ƒ„ƒƒ‚ƒƒ‚‚‚‚ƒƒƒƒ‚‚‚ƒ…†ˆˆ‡„‚‚„‚ƒƒ„„„ƒƒ„„„„„ƒƒƒƒƒƒ„„„ƒ‚€€€€€€€€€€€€€€€€ƒ„„ƒ„„ƒ„„„„ƒƒ‚‚ƒ„„ƒ‚‚ƒ‚‚‚€€€‚‚‚‚‚‚‚‚€€€€€€€~~€€€‚…‡†‡ˆ‰ˆ†††……††††…„…‡‰ŠŠ‡…ƒ„†‡†……„ƒ‚‚‚ƒ„ƒƒƒƒƒƒƒƒƒƒ„ƒ‚‚„……„„„……„„‚‚ƒƒ„„„„ƒƒƒƒƒ‚‚‚€‚ƒƒ…„„‚‚€€†……„„ƒƒ‚ƒ‚‚ƒ„„‚‚€€€‚‚€€‚‚‚ƒ‚ƒ„…‡ŽŠ‰‹„ƒ…„ƒ…„„†‡†„„…†ˆ‰ˆ‡†„„„ŒŽŒŽ‘“’‘‘‘’”“‰ˆ…ƒ‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€€‚ƒ‚‚€€€‚‚€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€xwvwwwxzyywvvvvvwwxxxwvuxxxxxxxxwwwwwwwwyyxxxxyyyxxxxyzzyyyzz{{{|{zyxy{|{zzyyyyy|xutuuvwvtsssuvvwwxxxwwwxxwwwwxxyywvutvwxwwwwxwuuuvwxvvvwwxxxxxxxxxxxxwvwxxwv}~}||}|zxxyyxw|€€€€„ƒ€€€‚€€~}yxxy{|{{z}}|~~}~~~}}||~~€~}||{zywvuuttvwxwvyz|‚ƒƒƒƒƒ„…††‡„„„ƒƒ‚‚‚€‚ƒƒ‚‚‚‚‚ƒƒ‚‚‚‚ƒƒ„„ƒ€„ƒ‚‚‚‚ƒ„ƒƒ‚‚ƒ„…†ˆˆ†„ƒ‚‚ƒ‚‚ƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒ„„„ƒ€€€€€€€€€€€€€€€€†ŠŠ†€~€‚€‚‚ƒƒƒ„„ƒ‚‚ƒ‚‚ƒƒ„„‚‚‚‚‚‚‚‚‚‚ƒƒ‚€€‚ƒ„ƒ‚€€ƒ„ƒ}|€€€‚‚‚‚„ƒ„…†‡‡††„ƒ…‰ŒŒŠŠ‰ˆ‡‡‡ˆ‰††††††††ƒƒ„ƒƒ„…‡…„ƒ„„…„ƒ„„ƒƒƒƒ„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€€€~‚…ƒ‚€‚‚€€‚‚‚‚‚ƒ„…‡ŽŠ‡ŠŽˆˆ‰…„……‚„ƒ‚„„„ƒ‚‚‚ƒ„ŒŽŒŽ’’‘‹‰ˆ…ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚€€ƒƒ‚€‚‚‚‚ƒƒ‚€€€€€€€€€€€€€€€€€€€xnnx}}€~}}}}zywuuuuvxwwwwvvvvvvvvvvvvvvvvvvvywuuvwxxwxxxxwwvxxxyyzzz|||{{{{{€€}zzz~}zxwwxy|{zyxwvvuuuuuuuuwwvvvuuuuuvvwwxxuuttuwz{vvvvvvvvyyxxwwwvvwwuuwvux{~~{xxxxxwwxz|~|€€‚‚€€€€€ƒƒ‚‚€~}{zxvvwxzxxyzz{||{{|}}~€~~}}zzyyxxwwzzzzzzzz{|}~€‚ƒƒ„„„„………†„„„„ƒƒ‚‚‚€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒƒ‚‚‚ƒƒƒ‚‚„ƒ‚„‡†‡†ƒ‚ƒƒƒƒƒ„„ƒƒƒ‚‚‚‚ƒƒƒƒ‚ƒ…††…„„€€€€€€€€€€€€€€€€ˆ””†|{~€€€€„…†ˆ‰ˆˆ‡††††††††………„ƒ‚‚‚‚‚‚‚„ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€‚ƒ„‚‚ƒ„†‡ˆˆ„…†‡ˆ‰Š‹…………………………………………………„„„„„„„„„„„„„‚‚ƒƒ„„„…€‚ƒƒ„ƒƒƒ„…„‚‚‚„ƒƒ‚€€‚‚‚‚ƒ„……Š‘ŽŒŒŽŽŒ‹‹Š‰‰‰ˆ‡††††…………„„„ŠŠ‹ŒŽ‹‹Š‰‡†……ˆ‡…ƒƒ‚‚ƒ„„ƒƒ‚€‚‚€€‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€‚‚‚‚ƒ„‚‚‚‚€€‚‚„ƒ€‚‚‚‚€€‚‚€€€€€€€€€€€€€€€€€€€xpqy|}……„ƒƒƒƒƒ~|zwussstttsssrrttstststvvvvvvvvvuuvwwwvvvwxxxxwxxxyyyyyxxyyyzzz~|z{|}}{{{}~~~~~~~~~zzzzzzzzzzzzzzzzuuvvwwwxponnoprsssssssssyxxxwwwwwxxwwyywx{~~{yxyvvuuvxyz}ƒ‚‚‚€€€€€‚ƒ‚~}|zxvuuvwuvvwwxyywwxyyzz{yyyzzzzz||{{zzzz~~~~~~~~{|}€‚ƒ„„„………†††……††…„‚‚‚€€€‚‚‚‚‚‚ƒ‚‚ƒƒƒ‚‚‚‚‚‚ƒƒ‚„‡†‡†ƒ‚ƒƒƒƒƒ„„„ƒƒƒƒ‚‚‚ƒ„„‚‚ƒƒƒƒƒƒ€€€€€€€€€€€€€€€€„Œ‹‚}~~€€€€€€€…†ˆŠ‹‹‹‹ŒŒŒŒŒŒŒŒŠŠŠŠ‰‰‰‰‰‰ˆ‡†…„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚€€€€€‚|}}~~€€~€‚‚„„„……†††††††††††Œ‰ˆ†…††††††††‚ƒƒƒ„„„„ƒƒ„„„ƒ‚‚ƒ„„ƒ………„„ƒƒƒ‚‚‚‚ƒ„…‡‹‘’‘‘‘ŽŽŽŽŽ‹‹Š‰ˆˆ‡‡………†††††ˆˆ‡‡†…„„‡†…ƒ‚‚‚ƒ„„ƒƒ‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚€€‚‚„ƒ€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€}wwzzyzz~~~~~~|{zxwwwwwvvvvuuuttttttttttttttttuwy{zyxwvvwwwwvvwwwvwvvvvwwxyz{{}}~}{z{||{zyyyyzxxyyyyzz{{{{{{{{wxxyyz{{zzz{{{||vvuuuuvwrrrrrrrrtttttsssrttstuvtx{~}{xxxxwvuvwxy}€ƒ‚‚‚ƒƒ€€€€‚‚‚‚‚€~~}{zxvutuussttuuvvuuvvwxxxyzzz{|||~~~}}}}|||}‚ƒ„…………††‡‡……††…„‚‚‚‚‚‚‚‚‚‚€ƒƒƒ‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚ƒ‚ƒ††‡†ƒ‚‚ƒƒƒƒ„„„ƒƒƒ„ƒ‚‚‚„…‚‚‚‚‚ƒƒƒ€€€€€€€€€€€€€€€€„ƒ€‚ƒ‚‚€€€€‚ƒ„…‡‡‡‡ˆˆˆˆˆˆˆˆŒŒŒŒŒŒ……………………††…„„…††ƒƒƒƒƒƒƒƒƒ‚€€‚€€€‚ƒ‚‚‚‚‚‚‚‚‚‚ƒƒ‚„„„„…„……‡‡‡‡‡‡‡‡‡‡‡‡‡ˆˆˆˆˆˆ‡†…„ƒ……†…ƒ‚ƒƒƒƒƒ‚ƒ‚‚‚‚‚‚‚ƒ„…†‹‘‘’’’’’“’““’‘‘ŽŠŠ‰ˆ‡……„………„„ƒƒƒ…„…„…„…„†…„ƒ‚‚ƒƒ„„ƒ‚‚€‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚„ƒ€‚‚‚‚ƒ‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€|xyzyxyxyyxxxyyyyyyyyyzz{{zzzyyyxxxxxxxxuuuuuuuuy|~~|{{||{{zywvvvuuttssuuvvwxxx{}~~|zyy}}|{zzyyzzzyxwwwxxxxxxxxuuvwxyzzxxxxxyyyzzyyxxxxyyyyyyyywwwwwwwwtvvuvxxwuxz{xutuwvttsuuv{~€‚‚€‚‚‚€~}}zywvuuuvuuuvvwwwxyyzzzz{}}}~~~~~~~~~~~}}}}}}}}|}}ƒƒ„…††††‡‡‡……„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚€‚„ƒƒ‚‚ƒ‚ƒ‚ƒƒƒ‚‚ƒ††‡†ƒ‚ƒƒƒ„„„„„ƒƒƒƒ‚ƒ‚ƒ„„„ƒƒƒ„…„„€€€€€€€€€€€€€€€€ƒ…‚ƒ„‚‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„„…†††‡‡‡‡ˆˆˆ„„„…………†‡†„ƒƒ„†‡‰‰‰‰‰‰‰‰‡‡‡‡‡‡‡‡„ƒ€€‚„…€€€€‚„„„ƒ‚‚……„„ƒƒ‚‚„„ƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ€€€‚‚ƒ‚‚‚‚‚‚‚‚„„„„„„„„ˆˆˆ‡†…„ƒ…††…ƒƒƒ„ƒƒƒƒƒ„„„‚‚‚‚ƒ„…ˆ‹‘’‘Ž‹Šˆ‡…………„„ƒƒ‚‚††††…………ƒƒƒ„„…††……ƒƒ‚‚‚ƒ„„ƒƒ‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚ƒ‚‚‚‚„ƒ€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€{xxzxxxwwwwwwwxxxxxxxwwvzzzyyyxxzzzzzzzz{z{z{z{{|}~|{{{€€€}|{xwwvvuuutttttttt{}€~zwvwwxyzz{{zzzyyxxxwwwwwwwwvvwxyz{{wwwvvvvvyyyyxxwwyyyyyyyyyyyzzzzzxz{y{|}|x{~}{xxxzywvvvxxz}€€€‚‚€€€€€€‚}}|xxwwwxxxyyzzzz{z||}|}}}}~~~}}}||}}}}~}~~|||{|{|||}~ƒ„………††‡‡‡‡†…„‚‚‚‚ƒ‚‚‚€€€€‚‚‚‚‚€ƒƒ„ƒ‚‚‚ƒƒƒƒƒƒ‚‚ƒ††‡†ƒ‚‚ƒƒƒƒ„„…„„ƒ‚‚„„„„„ƒ„„„…††…ƒ€€€€€€€€€€€€€€€€„ƒ€‚‚‚ƒ‚‚‚‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€€‚‚ƒƒ„ƒƒ‚€€€‚‚‚ƒ‚€€‚ƒ‡‡‡‡‡‡‡‡‰‰‰‰‰‰‰‰„ƒ‚‚„‡‰ˆ‡‡†††‡ˆ†……„„‚‚‚……„ƒƒ‚…„„‚€€ƒƒƒƒƒƒƒƒ‚‚ƒƒ„„‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€‚ƒƒ‚€€‚‚‚‚‚‚ƒ‚‚‚‚‚ƒ„…‹ŒŽŽ‹ŠŠ‰ˆ‡‡†„ƒ„ƒƒƒƒƒ„„„„…„…„ƒƒƒƒ„„„„ƒƒ„„††‡‡…„ƒ‚‚‚ƒƒ„„ƒ‚‚€‚ƒ‚‚ƒ‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚€‚‚„ƒ€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€{vw{zyyxwwvvvvvwuuvwwwvvyyyxxxwwyyyyyyyy{{{{{{{{zzzyxxxx||}}}}||zzzzyyyyyyxxxxxx|~~zwvuvwxxyxwsttuvwxxttttttttuuvwwxxyxxwwwvvvxxyzzzyxwwwwwwwwxxxxxyyyxzzyy{{z{~€~{z{}}{zz{|}{~€‚‚‚€€€€‚€~}||xyyyzz{{}}}}}}}}}}}~}~}~~~~}||||||}}~~~}~}~}~}}}}~€ƒ„…………††††‡‡†…„ƒƒƒ„‚‚‚€€€€‚‚€€€‚‚‚‚‚‚‚ƒ€‚‚ƒ‚‚‚‚ƒ‚ƒ††‡†ƒ‚ƒƒƒ„„…„„„„‚ƒ„………ƒƒƒƒƒ…††„‚€€€€€€€€€€€€€€€€„Š‰ƒ€€‚…‚‚ƒƒƒ„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒƒƒƒƒ‚‚€€€€€€€€€€€€„ƒ‚‚ƒ…†ˆŠ‰ˆ‡‡‡ˆˆ‰‰‰ˆ‡‡††‹‹ŠŠ‰ˆˆˆ‡†……ƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒƒƒƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚ƒƒƒƒ€€€€€€€€€€‚‚‚‚ƒ„…†‡ˆˆˆ‡††ƒƒƒ„ƒ„„„„„ƒ„ƒƒƒƒƒ„„……†††ƒƒƒ„„………ƒ„„……††‡„ƒ‚‚‚‚ƒ„„ƒƒ‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚€‚‚„ƒ€‚‚‚‚€€€€€€‚€€€€€€€€€€€€€€€€€€wpr{€}||{{{{{wxyzzzyyyyxxxwwwxxxwxxxxwwwwwwwwwwvwwxwwwwxyyyyxzzzz{{{{{{|||||}~€~|zzz||}~~|{zvvwxyz{{ttttttttvvvvvvvvuuuttsssrsuwwwvvxxxxxxxxwxxxyyyyxyyxxyzxxz~}{xxxzyxwxxz{|‚€€€€€€€€ƒ‚€~}||{{||||||~~~~~~~~}}}}}}}}~~~~~~}}}}~~}~€‚ƒ……„„………†††……†……„‚‚‚‚‚‚€€€‚‚€€€ƒ‚‚ƒƒ€€‚‚ƒƒ‚‚‚‚‚ƒƒ‚„‡†‡†ƒ‚ƒƒ„„„……„„„‚ƒ„„…„„ƒ„ƒ‚„…†„‚€€€€€€€€€€€€€€€€Ž”‘…~}€€€‚„…ƒƒƒƒƒƒƒƒ‚‚‚€€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€€€€€ƒƒƒƒƒƒƒƒ‚€€…„„„„„„„‹‹‹ŠŠŠŠŠˆˆˆˆ‰‰‰‰‡‡ˆ‡ˆ‡ˆ‡ŽŒŠˆ…„ƒ‚‚‚‚‚‚‚‚„ƒƒƒ‚‚‚‚ƒƒ„„„„ƒƒ……†„ƒ‚ƒƒ„ƒƒƒ‚‚‚‚‚‚‚ƒ„…‚‚‚ƒ„„ƒ‚‚‚ƒƒƒƒƒƒ†††……„„„„„„„„„……‡††††………ƒƒƒƒƒƒ„„ƒ‚‚‚ƒƒ„„ƒ‚‚€‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚€€‚‚„ƒ€‚‚‚‚€€€€‚‚‚€€€€€€€€€€€€€€€€€€ypr}‚‚„„ƒ‚€~|zxvvvuuuttxxxxxxxxwwwwwwwwwvvwyzyxxxyyyxwwxxxyyzzzxxyyz{||€€~|zz}xy{}~~~}{{{{{{{{zzzzzzzz{{zzzzyyxxxwvvvupqtvwwvussssssssssssttuuvxxvvwwvy||yyyxwvvvwyz|€€€€€‚ƒƒ€~€~}||~~~~~}||}}}}}}}}}}}}}|||{|||}}~~~~~€€€~~~~~~~}~‚„……„„„…………†‚„…†…ƒ‚‚‚‚‚‚‚‚ƒ‚‚€€‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ„„ƒƒƒ‚‚„ƒ‚„‡†‡†ƒ‚ƒƒ„„„……„„„ƒƒƒ„„„„„…ƒ‚ƒ…†…„€€€€€€€€€€€€€€€€Š’{}€‚€€€€€€€ƒ…‡‰‰‰‰‰‰‰‰‰ŠŠ‰‰ˆ‡‡†ˆˆ‡††…„„„„„ƒƒƒƒ‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚€~ƒ‚€€€€€€€~~€‚ƒ„…‡‡‡‡‡‡‡‡‹‹‹‹ŠŠŠŠŠŠ‰Š‰ŠŠŠˆˆˆ‡‡‡††ƒƒ„„„ƒ‚‚„……„‚‚‚‚„ƒƒ‚€€‚‚‚‚ƒ„…ƒƒ„…†‡‡†‡††…„ƒƒ‚‚‚ƒ„…†‡ˆ‡‡‡‡†††…ˆ‡†…„ƒ‚‚‚‚‚‚ƒ‚‚ƒƒ„„ƒƒ‚‚ƒƒƒƒ‚‚‚ƒƒ‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚‚‚€‚‚„ƒ€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€wxyz{|~~~~~~~~~~€€~~}wwwwwwwwwwvusrqqsssssssswwwwwwwwwwxxxyyyyyyyxxwwyyyzzz{{}~~}}{zyzzzzzzzzyyyxxwww{{{{{{{{{|}|zyz{||||||||xy{}~~~~ttttttttrrrqqqpptrqrtutsvwyzzywvtuvvvwy{|€€€€€€€€€€€€€‚ƒ‚‚‚‚‚}|{||}}~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}ƒ„‚ƒƒƒ„„„„†„„……‚‚‚‚ƒƒƒƒƒƒ‚ƒƒ‚‚ƒ‚‚‚‚‚ƒƒ‚‚ƒ‚ƒ„„ƒƒ„ƒ‚‚ƒ„†††„‚‚‚„„…†…„ƒ‚„„ƒ„………„‡„……ƒƒ…ƒ€€€€€€€€€€€€€€€€„„ƒƒ‚‚€€€€€€€€……†††‡‡‡ŠŠŠŠŠŠŠŠŒŒŒŒŒŒŒŒ……………………………„„ƒƒƒ‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ„„ƒ‚‚€„„ƒ‚€~}€€€€€€€€€€€‚‚‚€€€€€€€€……†‡‰Š‹ŒŒŒŒŒŒŒŒŒŒ‹‰‡…ƒ‚…†‡†ƒ‚ƒ„„ƒƒƒƒ„…†‚‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒ„…††‡‡†„‚†††……„„ƒ††††††††„„„„„„„„…„„ƒƒ‚‚ƒƒƒƒƒ‚‚‚„…†„€‚…„„ƒ‚‚€€ƒ‚‚‚‚‚‚‚‚‚€€€ƒƒƒƒƒƒ„„‚‚€‚€‚‚‚‚‚ƒƒƒƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„€€€€€€€€€€€€€€€€xyyyyyyyzzzzzzzzzzzzz{{{xxxxxxxxzzyxwwvvuuuuuuuuzzzzzzzzvwwwxxxxwwvvuuuuxxxyyyyz~~}}{{zzzzzzzz{{{zzzyyxxxxxxxxyz{zxwwyzzzzzzzzwxz||}}|{{{{{{{{{zyywvuuwvuwz|{zuvxyyxvuuvvutuvx|€€€€€€€‚‚‚‚‚‚}|zz{{{||}||||||||~~~~~~~~€€€€€€€€~~~~~~~~~~~ƒ…ƒƒƒ„„„„…†„„…„‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚€€€‚ƒƒ‚‚ƒ‚€‚ƒƒƒƒƒƒ‚‚ƒ„‡‡‡…ƒ‚ƒƒ„„„„„„„„„„ƒ„„…„„‚‚„‚ƒ„‚€€€€€€€€€€€€€€€€…„„„ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚€€€‚‚‚„„„„„„„„††††††††‡‡‡‡‡‡‡‡…………„„ƒƒ††††††††€€€„„ƒƒ‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ€€€€€€€€‚‚‚€€ˆ‡‡†…„ƒƒ„†‡‡††‡‰……„„„…†‡‚‚‚€‚€‚‚‚ƒ„…‰ŠŠŠ‰ˆ†…‡‡††……„„„„„„„„„„‚‚‚‚‚‚‚‚‚ƒƒ„……„„ƒ„ƒƒƒƒ‚ƒ‚€€‚…„„ƒƒ€€ƒ‚‚‚‚‚‚‚‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€zzyxwvuuvvvvvvvvttuuvwxxwwwwwwwwzyzyyyyyyyyyyyyy{{{{{{{{zzz{{|||zzzyyyxx{{{{||||~}|{vuvuvuvuwwwvvuuuyxyxyxyyyz{zxwxyyyyyyyyyxyz{}|||zzzz{zzzwxyy{|}}}|{}€€{|~~|{{||zyyz{|~€€€€‚€€€‚‚‚~}{{||}}}}~~~~~~~~~~~~~~~~{|}~€‚€€€~~‚„…ƒƒƒƒ„„……†„„……‚‚‚‚‚‚‚‚€€‚€ƒƒƒ‚‚‚‚€€‚‚ƒƒƒ‚‚‚ƒ„‡‡‡…ƒ‚ƒƒ„ƒƒƒƒ„„„„ƒƒƒ„„„„ƒ…„ƒ‚€€€€€€€€€€€€€€€€€„„„ƒƒƒƒ‚„„„ƒ„ƒ„„ƒƒƒ‚ƒ‚ƒƒ‚‚‚ƒƒ€€€€€€€€‚‚‚‚‚€€€€€€€€€€€ƒƒƒƒƒƒƒƒ€~€€„„ƒƒ‚‚…†‡‡‰‰Š‹……………………„ƒ„ƒ„ƒ„„€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚‚‚€€€€€€ƒ„…ƒ€~€€€‚‚‚‚€‚‚‚ƒ‚‚ƒ„…ŠŠŠŠŠˆ‡†„„„ƒƒ‚‚‚ƒƒƒ‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€ƒ…„„ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚„„„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚€‚ƒƒ€€€€€€€€€€€€€€€€{{zywwvuwwwwwwwwtuuuuvvwuuuuuuuuvvvwwxwxyyyyyyyyxyxyxyxx{{|||}}}}}}}|||{{||||}}}}~~~}}|{uututututtstssrrtttuttttuvwvtssuvvvvvvvvtuvxxxwwzzzzzzzzyyyzz{{{|zyyzzxw{|~~|{{||{yyz||€€€€€€€€€€€€€‚‚€~~€€€~~~~~~~~~~~~~~~~~~~~~€€‚‚€€€}~~€ƒ„…ƒ„ƒ„„………†…„…„ƒ‚‚‚‚‚‚‚ƒƒ‚‚ƒ‚‚€€‚‚‚‚ƒ‚‚‚‚ƒƒƒ‚‚ƒ„†††„‚‚‚‚ƒ„„……„„ƒƒƒƒƒ„„„ƒ††…„‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„„……‚‚‚‚‚‚‚‚€€€€€€€€€€~~~‚‚€‚‚…„„ƒ‚‚††‡ˆ‰‹‹Œ‹‹‹‹‹‹‹‹ŠŠŠŠŠŠŠŠ…††††‡‡ˆ„„„„„„„„‚‚‚ƒ‚ƒ‚‚€‚‚‚‚‚‚‚‚€‚‚‚€‚‚‚€€€‚€€‚‚‚‚‚‚‚ƒ‚‚ƒ„…†‡††……„„‚‚‚‚‚‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ€€€€€‚‚‚‚‚‚ƒ„„„ƒƒ€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚„„ƒ„ƒƒƒƒ‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚…„‚‚‚ƒƒƒ€€€€€€€€€€€€€€€€{{{{{zzzzzzzzzzzzzzyyxxxvvvvvvvvvvvvwwwwuuvuvuuuxxxwxwxxxxxyyyzzzzzyyxxxxxyyzyzz{||||{{zzzzyzyzzyyyxxwwwvvvvvvvvwxywvuvwttttttttopqrsrrqutututuuwwwwxxyyzxvwxxwuz{}~~}{zyzzyxyz||~€€€€€€€‚‚~‚‚€€€€€~~}}}|‚‚‚~}|{~}}||{{{||~€‚ƒ„…„„„„……†††„„……‚‚‚„ƒƒ‚‚‚ƒƒ‚‚ƒƒ‚‚€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚ƒ‚‚‚ƒ„†††„‚‚‚ƒ„„…………„ƒƒƒƒƒƒƒƒ‚ƒ…†‡†„ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„ƒ„ƒ„ƒ„„„„ƒƒ‚‚‚‚„ƒƒ‚‚‚ƒ„……„„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚††††††††……††‡‡‡‡‡‡‡‡‡‡‡‡ŒŒŒŒŒŒŒŒ‹Š‰‡†„ƒ‚„„„„„„„„ƒƒ‚‚€ƒ„ƒ‚‚ƒ€€€‚ƒ‚‚‚‚‚ƒ‚‚‚‚ƒ„…„„„ƒƒ‚ƒƒƒƒƒƒƒƒ„ƒ‚‚‚€‚ƒ„…†‡††‡‡ˆˆ‰‰ˆ†…ƒƒƒ‚‚„„ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚„„„ƒ‚ƒƒƒƒƒƒ„„„ƒ„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚ƒƒƒ‚‚‚ƒƒ€€€€€€€€€€€€€€€€{||}}}~~}}}}}}}}~~}}||{{{{{{{{{{z{zzzzzzyzyzyzyzzzz{z{zzyyyzz{{{yyyxxxwwyyyzz{{{z{{|{{zz{{{{{{{{}}||{{{{}}|}|}|}}~~|{|}yyyyyyyytuvwwvuuqqpqpqqqnooqrstussstxzyyxy{||{yxxxyxwxy{|€€€‚€‚‚‚~‚€€€€€ƒƒ‚€€€€€€€€€{{zzyzyy||{{zzyyz{}€ƒƒ„„„„……††††„„…„ƒ‚„„ƒƒ‚‚‚‚€€‚ƒƒ‚‚‚‚‚€€‚ƒƒ‚‚ƒƒ‚‚‚‚‚ƒ„‡‡‡…ƒ‚ƒƒ…„„ƒƒ„…†‚ƒƒƒ‚ƒƒƒ„…„ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒ……„„ƒ‚‚‚‚‚€€€€€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒ……………………ŒŒ‹‹‹Š‹‹‹‹‹‹‹‹ˆˆ‡†„ƒ‚‚…††…€€‚‚‚‚ƒ„‚‚‚‚‚ƒ‚€€‚‚ƒ„……„ƒƒ‚ƒ„…€€€‚……………………‡‡‡‰‰Š‹‹‰‰Š‹‹ŒŒ‹ˆ…„„„‚„„ƒƒ€€‚‚‚‚‚‚‚‚‚‚ƒƒ„ƒƒ€‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒƒ„„†€€€€€€€€€€€€€€€€|||}}}~~}}}}}}}}~~~}}}}}~~~~~~~~~}||{~~~~~~~~}}}}}}}}|}}}~~~}}|||{{{||||}}}}z{||||{{{{{z{z{{|||{{zzz{z{z{z{{{|}|zyz{}}}}}}}}{|}}}|{{yyyyyyyyuutsrpooooorvxyxtuwxxwutvvvutsuv|~€€€€€€€€€€~‚€€‚‚€€„ƒƒ‚€}}}}}}}}zyzyzyzzzzzzzyyyxwwvuttsxy|‚‚‚„„……†††††„„……‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚ƒ‚ƒ‚‚‚‚‚„„…ƒƒ‚„…‚ƒ‚‚ƒƒ‚‚‚‚‚ƒ„‡‡‡…ƒ‚ƒƒ…„ƒ‚‚ƒ„„‚‚ƒƒ‚‚ƒƒ‡‡„‚ƒ‚‚€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ€€€€€€€€€€ƒ‚‚‚………„ƒƒ‚‚„„ƒƒƒ‚‚‚ƒƒ„ƒ„ƒƒƒ‚‚ƒƒƒƒ€€€€€€€€ƒƒƒƒƒƒƒƒ‚ƒ„†‡ˆˆ‡‡‡‡‡‡‡‡Œ‹Š‰ˆ‡†ƒ…††…„†‡………„…†‡‡‚‚‚‚€‚‚ƒ„…†…„‚ƒ„…†‚‚ƒƒ……………………‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‰Š‹ŒŽ‰†ƒƒ„„ƒ„„ƒ‚‚€€‚‚ƒ‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ††…„…‡€€€€€€€€€€€€€€€€|||||}}}||||||||{{{|}}~~}}}}}}}}€}|{{{{{{{{{{}}}}}}}}|||}}}~~~~~}}}||{{{||||}{||}}}||}}}}}}}}}}||{{{{{{{{{{{{{|}|zyz{{{{{{{{{zz{|{{yy||||||||}}||{{{{yyyz~€yz|}}|zy{{{ywvwx|€€€€€€€€€€€~~~€€‚€€…„„ƒƒ‚‚‚}}|{zzyxxxxxxxxxyyyyyyyy~}{xtqomnnmmkkjjvx{~‚‚‚„………†††‡†„„…„‚‚€€€‚‚ƒƒ‚ƒƒ‚‚ƒ…„„ƒ‚‚€€~€‚€‚‚ƒ‚‚‚‚ƒ„†††„‚‚‚ƒƒƒƒ‚‚‚‚‚ƒƒ‚‚‚ƒ†…}|{z|€€€€€€€€€€€€€€€€‚‚ƒƒ„„„‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚‚€€‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ†……„ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒ„„„„„„„„‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„ƒƒ‚€‚ƒ~~‚‚‚ƒ„‚‚‚‚‚‚‚‚‚‚‚€‚‚‚ƒ„……„‚‚ƒ„†‡ˆˆ‰‰ŠŠŠ‹‹‹‹‹‹‹‹‰‰‰‰‰‰‰‰…†‡ˆŠ‹ŒŒŒŽ‘‘‡„ƒ„ƒ„„ƒ‚‚€€‚‚ƒ‚‚‚‚‚ƒ‚€‚ƒ„ƒƒ„„„„„„†††……………‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€„‰Šˆˆ‰Œ€€€€€€€€€€€€€€€€}}}}}}}}}}}}}}}}}}}|}}}}}}}}}}}}~~~~~~~~||||{{{{}}}}}}}}||||||||}}}}}}}}||||||||||}}}}|{{{{|||}}}}}}}}}}}}}}}}}}~~}|||}||{zyxx{{{{{{{{zzzzzzzz}}||||||~}}|||}}~~~}}~~~~~~~~~€€€€€€€~~€‚ƒ‚‚‚‚††††††††‚~|zzzzzyxxyz}~{{||}}~~‚~zpjgdgosqlghnu}‚ƒ‚ƒ…………††††„„…†…ƒ‚‚€‚‚‚ƒ‚‚‚€~|{~~}|{zyyxxyz{zxu|‚ƒ‚„‚‚‚ƒ……‡ˆ…‚†„„„„…………‚ƒƒƒ‚‚ƒ…„|xuv{~€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€€‚‚‚‚‚‚‚‚‚‚‚†‡‡†„ƒƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒ„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒ„„„„‚€‚‚‚ƒ‚€€€€€€€€€€‚‚‚€‚€€‚‚€ƒ‚€‚„…‚‚‚‚ƒƒ†ˆŠ‹Œ‹Š‰ŽŒ‰ˆˆ‰‰ƒƒ„„„„„ƒƒ„…‡ŠŒŒ‰†‡‹Œ†ƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚ƒ‚‚‚„†‰‹‰‰‰‰‰‰‰‰‹ŠŠ‰‰‰Š‹‡‡†ƒ€ƒƒ‚‚‚‚‚‚ƒƒ‚‚ƒ‚‚€€‚‚‚‚ƒƒˆˆ„„€€€€€€€€€€€€€€€€||||||||||||||||}}}}}}}}}}|}|}|}}}}}}}}}}}}}||||}}}~}~}}||||||||}}}}}}}}||||||||z{|}}~}}{{|||}}}}}}}}}}}}}}~}}}}~~~}|||~~}}||{{||||||||||||||||}}|{{{||{{zzzz{{|}}~~}}|||||||||€€€€€€€€€€ƒ‚‚‚…††………………………ƒƒ‚‚€~~~}||~€~~~~~€}{wtutllv||xpkmu}‚ƒ‚ƒ…………††††…„„……ƒ‚‚‚‚‚‚ƒ„ƒ|zxwzzzzz{{{zzz{|{yw{~‚ƒ…‚‚‚ƒ…†‡†„ƒ…„„„„„„„„„‚‚ƒ……„„‚}xuw{€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ…††…ƒ‚‚ƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒ€€€‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ„„ƒƒƒƒ„„‚„…„‚€€‚‚‚‚‚‚‚€‚€€€ƒ‚‚‚‚ƒ„ƒƒ…†††„„‡‡………†‡ˆ‰‰‰‰‡…ƒ‚ƒƒƒ„„„ƒƒƒƒ„†ˆ‰‰ˆ‰‡……ˆ‹ŽŒ†ƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒ…†ˆ‰‰‰‰‰‰‰‰‰‰‰ˆˆ‡ˆ‰‰‡‡†„€ƒƒ‚‚‚‚‚‚ƒ‚‚‚‚‚‚€€€€‚‚ƒƒƒ‚‚…‹‰„€€€€€€€€€€€€€€€€{{{{{{{{||||||||}}}}}}}}|||{|{||||||||||~~~}}|||~~~~~~~~}|}|}|}}}|}|}|}|||||||||yz|}~~~~||||}}}}~}~}~}~~~~~~~~~~~~}}|||~~~~~~~~}}}}}}}}}}}}}}}}}}||{{||||{{{{||{||}}}||{{{{{{{{€€€‚€€€€€„‚€‚ƒ‚ƒ€‚†‡†„€€€€‚ƒ…††…„ƒ‚€€€€€€~~}~}{ury{tx~€wpou}‚ƒ‚ƒ„„……†††††„„„„‚‚‚‚‚ƒ‚€~|{z{|yzz{||}}|||}}}{yz|‚ƒ„†‚ƒ‚ƒ…‡‡…ƒ‚‚ƒ„„„„ƒƒƒƒ‚„‚‚„…†……‚~yvw|€€€€€€€€€€€€€€€€€ƒ‚ƒ‚ƒ‚ƒƒƒ‚ƒ‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„…„‚‚‚ƒƒƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚ƒƒ„…††„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚€€€€€‚‚ƒƒƒƒƒ††…„……‡ˆ‡…„ƒƒƒ……„†ˆ‰‰…~ƒƒƒƒƒƒƒƒ„ƒ„…ˆˆ‡……„„ƒ„†ŠŒ†ƒƒ„‚‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚ƒ„…†‡‡‡‡‡‡‡‡‡‡‡‡‡††††‡‡‡‡‡„‚€‚ƒƒ‚‚‚‚‚‚‚ƒ‚‚€€‚‚ƒƒƒƒŠŽŠƒ€€€€€€€€€€€€€€€€{{{{{{{{{{{{{{{{||{|{|||{{{{{{{{{{{|{|{{}}}}||{{}}|}|}}}}}}}|}}}||||||||||||||||z{|}}~}}|||}}}}~~~~~}~~~~~~~~~~~~~~~}}~~~~~~~~||||||||||||||||~}}||||}}}|||}~~{|}}~}}|{{{{{{{{€‚€€€€€…ƒ€€‚‚ƒ€ƒƒ‚€€€€€ƒ…††††€}}||~~}}|||vlowy~zrpu}‚ƒ‚ƒ„„„……††††…„„ƒ‚‚ƒ‚€‚ƒ‚~|{}~~}~}~}~~}}~~}{y{~€‚„…†‚‚‚‚ƒ…‡‡†„‚‚ƒ………„„ƒƒ‚‚‚ƒ„„ƒ„†ˆ…ƒ~yvx|€€€€€€€€€€€€€€€€€ƒƒƒƒ‚ƒƒƒƒƒƒƒ‚ƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒ„……„‚‚‚ƒ„„ƒƒƒ‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„„„„ƒƒ‚‚‚‚…†‡†„ƒ‚ƒƒƒ‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚‚€€€€‚ƒ„…„ƒ‚ƒ„„……………„…‡ˆ‡†ƒƒ…ˆ‹Š‰…„„„ƒƒ‚ƒƒƒ…„„‡‰‹ˆ†‚ƒ„ƒƒˆŒ†‚ƒƒ‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒ…‡ˆ‡†…††††††††††…†…†††‡‡‡†‚ƒƒ‚‚‚‚‚‚ƒ‚‚‚€€‚‚‚‚‚‚‚‚„Š‰ƒ€€€€€€€€€€€€€€€€€{{{{{{{{{{{{{{{{zzzzzzzz{z{z{z{z{{{{{{{{|{{{{zzz{{{{{{{{||}|}|}|{{{{{{{{{{{{{{{{||}}~}||||||}}}}}}~}~}~}~~~}~}~~~~~~~~}}}|}}}}}}}}||||||||~~}}}}}}||{{||}~|}~~~~||||||||€€€€€€€€ƒ€€€€€€€€€€€‚ƒ…†‡€€~|{{}}}}}}}}}€xihs|}~}~|snu}‚ƒ‚ƒ„„„„…………‡……„„‚‚‚€‚‚…‚|{{}~~~~~~~~~~~~~|yz|‚„…„‚ƒ‚ƒ…†‡ˆ„€ƒ†††……„„ƒƒ‚ƒ„„ƒ„†‡…ƒ~ywx}€€€€€€€€€€€€€€€€€‚‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„…„…„…„……ƒƒƒƒƒƒƒƒƒƒƒ„„„„…ƒƒƒƒƒƒƒƒ„…†…„ƒ„…„„„„ƒƒƒƒ‚‚ƒƒƒ‚ƒ‚ƒ‚ƒƒ‚‚‚‚‚‚‚‚„ƒ„ƒƒ‚‚‚„ƒƒ‚‚‚‚‚„…†…„‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚€€‚‚‚€‚„……„ƒ‚‚ƒ„„„„„„‚…‰‹Š‡ƒ„„†‡‰Š‹‹†…„ƒƒƒ„„„‚ƒ†‹Œ‰†„…ƒ‚ˆŽŒ†ƒƒ„‚‚ƒƒƒƒ‚‚‚ƒƒƒ‚‚ƒƒƒ„…†ˆˆ‡†„†††††††††††††††††‡ˆ†„‚‚ƒ‚‚‚‚‚‚‚ƒ‚‚€€€‚‚‚ƒƒƒ‚‚€†‹‹‡‚€€€€€€€€€€€€€€€€{{{{{{{{||||||||zzzzzzzz{{z{z{{{{{{{{{{{{{zzzzyyzzzzzzzz||{|{|{|z{z{z{z{zzzzzzzz|}}~}}|{{{{{||||}}|}|}|}}}}}}}}}~~}~}}}}~~~}}||~~~~~~~~||||||||~}}|||}}||||}}~|}~}}}}}}}}~€€€€€€€€€€€€€€€‚€€€€€€€€ƒ‚‚ƒ…‡‚ƒ‚‚€~}~~~~~~~~~~xlku~~||€|uqu}‚ƒ‚ƒƒ„„„„………‡………„‚‚€€‚}{zz{|}z{{|}~~~~~~~~~}{{|‚„ƒ‚‚‚‚‚ƒ……‡ˆ…€‚††………„„„„…ƒ‚‚„……„…‚}yvx|€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……………………„„„„„„„„ƒƒƒƒ„„„„„„„„„„„„„†††„„…†………„„„ƒƒƒ„ƒ„ƒ„ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„ƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚„ƒ‚‚ƒ„……ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚€€‚ƒƒƒ‚‚„………ƒ‚…„ƒƒƒ„…†ƒ„…‡†…ƒ‚ƒƒ‚ƒ„‡ŠŒˆ‡…„ƒ„„…‚†ŠŒˆ„‚„…„‚ƒ‰ŽŒ†‚ƒƒ‚‚ƒƒƒƒ‚‚‚ƒƒƒ‚‚ƒƒƒ††‡‡‡†……………………………††‡†††…†ˆˆˆ„ƒ‚‚ƒ‚‚‚‚‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‡Œ‹†ƒƒ€€€€€€€€€€€€€€€€||||||||||||||||{{{{{{{{{{{{{{{{|||{|{||{{{{zzzzzzzzzzzz{{{{{{{{zzzzzzzzyyyyyyyy{|}}~}}|zzzz{{{|||||||||||||||||{{{{{{{{|{{{{{{{||||||||{{{{{{{{||{{{{{{||||}~~{|}~}}}}}}}}~€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚ƒƒ„„„‚€~~}}||{|}}vmpy}€}||uru}‚ƒ‚ƒƒƒ„„„„……†…………‚€€€ƒ‚yyz{|}~~{{||||}}~}}}~}||{|~‚ƒ‚€‚ƒ‚ƒ…†‡‡„€ƒ…„„„„„„„„…„‚‚ƒ„ƒ‚„}xvw{€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„„ƒ„ƒ„„ƒƒƒƒƒƒƒƒ‚‚ƒƒƒ„„„„„„„„„„„ƒ„……„ƒ„…†…………„„„„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„…††††††††…………………………………………„„„„„„…„„„ƒ‚ƒ…†…ƒ‚‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚€‚‚‚€€ƒƒƒ‚ƒ„……„„ƒ‚ƒ„…†…„„„„ƒƒƒ„……„ƒ‚€‚„‡‰Š‰‡…„„††…ƒƒ‡ŒŒ‡‚ƒ„„ƒ‚„‰Œ†ƒƒ„‚‚ƒƒƒƒ‚‚‚„ƒƒ‚‚ƒƒ„‰ˆ‡††…††††††††††„…†††……„†ˆ‰ˆ†ƒ‚‚ƒ‚‚‚‚‚‚‚ƒ‚‚‚‚ƒƒ‚†Œˆ„‚€€€€€€€€€€€€€€€€}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{{||||||||||||{{{{{{{{{{{{zzzzzzzzzzzzzzzzxxxxxxxxzz|}~~~~yyzzz{{{{{{{{{{{{{{{{{{{yyyyyyyyxxxyyzzzzzzzzzzzyyyyyyyy{{zzyyzzyyyyz{||yz|}~~~~||||||||}€€€~€€€€€€€€€€ƒ‚€}€€€€€€€€€‚‚€~}‚„…„ƒ€~~}|zyxxy}~ulqz{{~ƒ|qmu}‚ƒ‚ƒƒƒƒ„„„……†……†…‚€€€‚ƒƒ}}~~~}|€~||{z}||}}}|}||~‚ƒ~‚‚‚ƒ…‡‡…„‚‚ƒ„ƒƒƒƒƒ„„„„„„ƒ‚ƒ„|xuv{~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„„„„„„„„„‚ƒ„„ƒ‚ƒ„††………„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ„…………………………††††††††‡‡‡‡‡‡‡‡††††‡‡‡ˆ‡‡†…„„„„„†‡†„‚‚ƒ‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚€ƒƒ‚‚ƒ€‚ƒ‚‚ƒ„„„„„„ƒƒƒƒƒ„„…„„ƒƒ„…†‡‡…ƒ‚‚ƒ„…‹Š‡…„…†‡ˆ††‰ŽŽˆ‚ƒƒƒ‚‚…‰ŒŒ†ƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚„ƒƒ‚‚ƒƒ„‹‰‡………†‡††††††††ƒ„…†……„ƒ†ˆ‰‰†ƒ‚‚ƒ‚‚‚‚‚‚ƒƒ‚‚€‚ƒ„…„‚…‹‹…€€€€€€€€€€€€€€€€|ywwz}€}€€~~}}}}}}}|}}}}}}}}}}|{{{|}}}}}}}}}}~€}|~}}}~~€}zz|~}|||||||||x{‚‚~|zzzzzzzz}|zyxxyyzz{{{{{{{ywvvx{}zzzzzzzzzzzzzzzzyyyyyyyyzyzyzyzzuwxyyz{}yz{|}||{yyzz{{||}€€‚~€€€€€€€€‚‚€€€ƒ‚€€€ƒƒ‚‚€‚‚‚‚‚‚‚‚ƒ…‡†ƒ‚ƒ€}|~vorvzymmx~vmmu{€„…„ƒƒ„„…††‡ƒ„……„ƒ‚‚€ƒ‚||}}}}}|}}}}}~}}}~~}~~|{|~ƒƒ‚‚‚ƒ„…‰ˆ‡„‚‚ƒ…ƒƒ„……„ƒƒƒ‚ƒ…ƒ‚ƒ‚~yuvz€€€€€€€€€€€€€€€€€„‡‡‚€€€€€‚€~~‚€€€€€€€€‚‚€~~€€€€€~~~€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒƒƒ‚ƒ„„ƒ‚‚……„„…†‡ˆƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„„„„†††††††††††………„„ˆ‡†„„„„„……„„„„„„…„ƒ‚€€€‚‚€€€€€€‚‚‚‚€~‚„„ƒƒ……†††‡‡‡ƒƒ„„……††………………………Š‹‡…‰ŠŠ‰‰ŒŽŠƒ……„ƒ‚†’Œ†‚‚‚„„„ƒƒ‚ƒ‚‚‚‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚……………„„„†††……………„……††…„ƒ‡†‡ˆ†ƒ‚‚‚‚€‚ƒ‚€ƒ‚„††ƒ…‡ŠŒŠ„€€€€€€€€€€€€€€€€€|yvvy}€~€‚€€€€€€€€~}}~~|{xxxxxxxx{}~}{{|~{|||}}~~‚|}€}}}}}}}}xz~€}{||||||||€}|{||}~~||{||}||zzzz{|zzzzzzzz}}|{yxww{{{{{{{{xxxxxxxxyyyyyxyyz{{||{zyyyyzz{{{|€€‚~€€€€€€€€~€€‚‚€~€‚‚‚‚‚‚‚‚ƒ…‡…ƒ‚‚}{yqkovx|xnmw€~|slnu{€„…„ƒƒƒ„……††„„………„‚‚‚€ƒ‚|}}~~~~~}}}~~~~~~~}}~||{~ƒƒ‚‚‚ƒ„…‡‡…„ƒ‚ƒƒ„„„ƒ‚ƒ‚ƒ…ƒƒƒ‚~yuvz€€€€€€€€€€€€€€€€„ˆ‹Š†‚‚ƒ€€€€‚€€€ƒ„‚‚‚‚‚‚‚‚€‚ƒ„ƒ„†ˆˆˆˆˆˆˆˆˆƒƒƒƒƒƒƒƒ„ƒƒ‚‚€€€€€€€€€~‚‚~€€€€€€€€€€‚ƒ„„…„ƒ†††††††††††…………………„…„………††††††††‚‚‚ƒƒƒ„„ˆ‡†…„……†††††…†……„„ƒ‚‚‚€€€€€‚‚‚€€ƒ„„„„‚ƒƒ„„…††…………„„„„……………………†‰‹‹ˆ‡‰Œˆˆ‡‡‹Š„‚ƒ„…†‰ŒŒ†‚‚‚„„„ƒƒ‚‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ………………„„††…†…†…………†††…„„‡†‡ˆ†ƒ‚‚‚‚‚ƒƒƒ‚€‚ƒ€‚………ƒ„‡‹ŒŠ„€€€€€€€€€€€€€€€€€{xvvy}€€‚„ƒ‚‚‚‚ƒƒƒ„……†ƒƒƒƒƒƒƒƒƒƒ}zuuuuuuuuz{}|zy{|{{{{||}}~{yx{||{xxxxxxxxwy|~}{z{{{{{{{{~}{{{|}~~~~~~~~}|{z}}}}}}}}~}}||{{{zzzzzzzzyyyyyyyy}}|{zzyx}}~}}{zyzzzz{{|||~€€€€€€€€€€~‚€€~}}}~~~€‚ƒƒ‚‚‚‚‚‚‚‚€„†‡†ƒ€‚‚{vnlrtquvomv€€|wskiou{€€ƒ…„‚‚ƒƒ„………„……†…„ƒ‚‚ƒƒ}}~€€~~~~~}~~}}||}|{|}ƒƒ‚‚‚ƒ„…†††„ƒ‚‚‚ƒƒƒƒ‚‚ƒ‚ƒ…ƒ€„…‚}xuvz~€€€€€€€€€€€€€€€€†ŠŒ‡ƒƒ„€€€€‚€‚„„‚‚‚‚‚ƒƒƒ…‰Œ††††††††‰ˆˆ†…„ƒ‚‡‡‡‡‡‡‡‡††††††††‡…‚€€‚…‡…„…„…„…„‚‚‚‚€€€ƒ„†„ƒ‚€€„„ƒƒ‚€€……………………ƒ„„……††‡„„ƒƒƒ„…†……………………„ƒ‚‚‚‚€‚‚‚€ƒ„…………‚‚‚‚ƒƒƒ†……„„ƒ‚‚……………………‡ˆ‰‰‰‰ŠŠ‡‡††ŠŽ‹†‚…‰ŽŽŒ†‚‚‚„„„„ƒ‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…………………………†…†…††††††††……‡†‡ˆ†ƒ‚‚‚‚‚‚ƒ„„ƒ€‚‚‚‚‚‚‚‚ƒ€€ƒ„…„‚„‡‹Š…€€€€€€€€€€€€€€€€€ywtvy~‚‚„……„ƒƒ„ƒ„„……‡‡‡††††††††‡…„†‡…€{vvvvvvvvz|}}{z{}|||}}~~~|yvwxzzywwwwwwwwxy{||{zxwwwwwwwwzywvvwxyz|‚ƒ‚€~€|ywyzyzyzyytuvxyz{|{{{{{{{{zzzzzzzz~||}}|z€€€~|zy{|{|||||{~€€€‚€€€€€€€€~}|{{|}||}€‚ƒ„‚‚‚‚‚‚‚‚€€„†‡„‚‚€}vqryuprumhow~~wpjdeou{€„…„‚‚ƒ„„…………††…„ƒ‚‚€ƒ‚}}~€€€~}}}~}}}}}}~~||{~ƒƒ‚‚‚ƒ„…†‡‡‡„ƒ‚‚ƒƒƒƒƒƒƒƒ„‚ƒ„‚€…‡ƒ}wuvz~€€€€€€€€€€€€€€€€„ˆ‹Š…€€€€€€‚~~~~~~~~€€~~€„‡‹Œ‹Œ‹Œ‹‹†††‡‡‡‡ˆ‰‰ˆ‡†……„ŠŠŠŠŠŠŠŠŒŒŒŒŒŒŒŒŠ‡……‡Š‹‹‹‹‹‹‹‹ˆˆˆˆ‡‡††„ƒƒ‚ƒƒ„„ƒƒƒƒ„…‡ˆ††††††††ˆˆ‡†…ƒƒ‚„„„„„„„„€€€€€€€€‚‚€€ƒ„…‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚„††‡††……„ƒ‚€„„ƒ„ƒƒƒƒ……………………ˆ‡†‡‰‹Š‰‡‡†‡‹ˆƒ„†Š’‘ŽŒ†‚‚‚„„„ƒƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ……………………………†…††††††††††…‡†‡ˆ†ƒ‚‚‚‚‚ƒ„…„ƒ‚‚‚‚‚‚‚ƒ€ƒ…„ƒƒ‡Œ‹…€€€€€€€€€€€€€€€€€xutty~‚ƒƒ„††…ƒ„„‚‚ƒƒ„„……††††††††ˆ‡ˆˆ‰†‚}xxxxxxxx|~~}|}~~~€€€€}zz}~~|}}}}}}}}yyz{zzyxwwwwwwwwwvuuuvwx{}€‚ƒ‚€~|xvssssssssnnpprsttrrrrrrrrwwwvwwwwzxwy|~}{~~~~|zxwzzzzzyzyz~€€€€€€€€€€~}|{zz{|z{|~€ƒ„‚‚‚‚‚‚‚‚‚€€„……„ƒ~vqtyxrstkcgn{|xrmeelu{€€ƒ…„‚‚ƒ„„………†††…„‚‚ƒƒ||~~€~}{{|}}}}~€|{|}ƒƒ‚‚‚ƒ„…†‡ˆ†…‚‚‚„„„ƒ„ƒ„„„ƒƒ„‚€ƒ‡‰ƒ|vtvz}€€€€€€€€€€€€€€€€„‡Šˆ„€€€€€€€~~~~~~~~~~~~|{}‚…ˆˆˆˆˆˆˆˆ„………‡‡‡‡††††††††…„…„…„…„†††††††††ˆŒŽŽŒˆ†ˆˆˆ‡ˆ‡ˆˆŒ‹‹ŠŠ‰‰ˆ‚ƒ„„„„ƒƒ„„„…†‡‰ŠŒŒŒŒŒŒŒŒ‘‘ŽŽŽŽŽŽŠŠŠŠŠŠŠŠˆˆ†…ƒ€€‚‚‚‚ƒ„…†‚‚ƒƒ„„ƒ‚‚‚‚‚‚‚‚ƒ„†‡ˆˆˆ‡‹Š‰†„€€‚‚„„…†……………………ˆ…„†ŠŒ‹ˆŠ‰ˆ‡Œ‹…ƒƒ‡ŒŒ†‚‚‚„„„„ƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…………†…†……………††††‡‡‡†††††‡†‡ˆ†ƒ‚‚‚‚ƒƒ„……ƒ‚ƒ‚„„ƒ‚‚‡Œ‹…€€€€€€€€€€€€€€€€€vtrty~‚„‚„…†„ƒƒ„ƒƒƒƒƒƒƒƒ…†‡‡…ƒ€xxxxxxxx}€}}~€€€€|yz{~}|~~~~~~~~{{zzzyyy{{{{{{{{{zyyyz|}€€~€€}ywwwvwvwwwxxvusrqqoooooooorrrrrrrrsqpty||zzzzzzxwvxxwwvvvvy~€€€‚~~}|zzz{{zz{}~€‚‚‚‚‚‚‚‚‚ƒ€„…†…€~uopqqostkflsx|}}yohku{€„…„‚‚ƒƒ„…………†††…ƒ‚‚€ƒ‚|}}~~~}}~~|{{||{zz|}~~||{~ƒƒ‚‚‚ƒ„…†††…‚‚„„„„ƒ„„„…ƒƒƒ‚„‰‹„{utwz|€€€€€€€€€€€€€€€€†ŠŒŠ…€€€€€€‚€~‚‚‚‚‚‚‚‚~€€€‚†‰ˆˆˆˆˆˆˆˆƒ„„…†‡‡ˆƒƒƒ„„„……„„„„„„„„ƒƒƒƒƒƒƒƒƒ…ˆŠŠˆ…ƒ……………………‰‰ˆ‡††…„€‚ƒ„„„„†……„„…††……………………ƒƒƒƒƒƒƒƒŽŽŽŽ‘‘‘‘‘‘‘‘‘ŒŠ‡…„†……„…†‡ˆƒƒ„……††‡„ƒ‚‚‚‚‚‚‚‚‚‚„…†ˆ‰Š‰‰Ž‹ˆ…ƒ~€‚ƒ…†‡……………………†…„†‰ŒŠ‰‹‹ˆ‡‹Š„ƒ‚ƒ†‰ŒŒ†‚‚‚„„„ƒƒ‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ………†…†††……………†††‡‡††††††‡†‡ˆ†ƒ‚‚‚‚‚ƒ„…„ƒ‚€€€‚‚ƒ„…‚~‚‡Œ…€€€€€€€€€€€€€€€€€usrsy~‚„ƒ„„ƒ‚‚ƒ‚€~~~~ƒ~|~€yyyyyyyy|}~|{}~~~€€€~{xxz||z{{{{{{{{}|{zzyzz||||||||~~}}}‚„ƒ‚€€€‚‚}{||||||||~}zxutsyyyyyyyysssssssssposz~}zyz{{{zyyyyxxwwwvy~€€‚‚€€‚€€~~}|{zz{|z{||~€€‚‚‚‚‚‚‚‚‚‚ƒ…†€€wrqnlowwnlu{y}vmmu{€„…„ƒƒƒ„……††……†…„ƒ€‚€ƒƒ}~~~~}}|}€}{}~}{zyz{{{|{|}ƒƒ‚‚‚ƒ„…‡‡†ƒ‚‚ƒ„„ƒ‚ƒƒ„„…ƒ‚ƒ‚…ŠŒ„zttwz|€€€€€€€€€€€€€€€€ˆ‹ŽŒ‡‚‚€€€€~€‚ƒ……„„‡‡‡‡‡‡‡‡‚„††††ˆŠ‰‰‰‰‰‰‰‰„„…†‡ˆ‰‰„„„„ƒƒƒƒ††††††††……………………‡†„‚‚„†‡††††††††††…„ƒ€€‚ƒ„………„„ƒ„„…†……………………‚‚ƒ„…††‰‰‰‰‰‰‰‰‡‡‡‡‡‡‡‡‹‰‡„ƒ‚†…„ƒƒƒ„„ƒ„„…†‡ˆˆ„„ƒ‚‚‚‚ƒ‚€‚‚…†ˆ‰ŠŠŠŠŒ‹Šˆ†„ƒ‚€ƒ„……………………………„…†‰ŠŠŠŒŠ‡…ˆŒ‡………„…‡ŠŒ†‚‚‚„„„„ƒ‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…………††††„„……††‡‡‡‡†………††‡†‡ˆ†ƒ‚‚‚‚‚ƒ„„„ƒ‚‚‚‚ƒ…„‚€}‡Œ…€€€€€€€€€€€€€€€€tsqsx~ƒ„€‚„„‚‚‚‚‚‚€~}||}}}}}}}}y}€}xw{€{{{{{{{{z|}|zz{}}}}~~‚||€€~~~~~~~~~}|{zzzzzzzzzzzz~~€‚ƒƒƒƒ‚‚€‚ƒƒƒ‚€xxxxxxxxyxwvtsrrwwwwwwwwwwwwwwwwwsrv}||}~~~|||{{zzyx~€‚‚€€€€€‚‚~}|{{{{|{{||}~‚‚‚‚‚‚‚‚„„‚‚ƒ…~€‚|wvqpv~zomvz{}}€xppu{€„…„ƒƒ„„…††‡…………„ƒ€‚€ƒ‚~~}}||~€}}~€|{|||||{{~ƒƒ‚‚‚ƒ„…‰ˆ†„‚‚ƒ…„ƒ‚‚‚‚ƒ„…ƒ‚ƒ‚…‹…zttwz|€€€€€€€€€€€€€€€€ˆ‹ŽŒ†‚€€€€}‚…ˆ‰‰‰‰‰‰‰‰‰‰‰ˆŠ‹‹ˆ‡‡‡‰‰‰‰‰‰‰‰……†‡ˆŠŠ‹‡††„ƒ‚ƒƒƒƒƒƒƒƒ……………………‡‡†……†‡‡„„ƒ„ƒ„„„†…„ƒ‚€…„ƒƒƒ„…†‚‚‚ƒ…‡‰Š……………………}~ƒ„††ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹‹Šˆ‡…„ƒƒ‚~‚‚ƒ„…††‡…„ƒ‚€€€‚‚ƒƒ‚‚€€‚‚†‡ˆŠ‹‹‹Šˆˆ‡††…„„‚‚ƒƒƒ……………………„„…†ˆ‰Š‹‹‰…ƒ†Š‰…‡‰Š‰ˆˆ‹ŽŒ†‚‚‚„„„ƒƒ‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ………†††††„„……††‡‡‡‡†………††‡†‡ˆ†ƒ‚‚‚‚‚ƒ„„„ƒ€‚‚‚‚‚‚‚‚‚‚‚„…„‚}‡Ž…€€€€€€€€€€€€€€€€wursx~ƒ‡†…„ƒƒƒƒ€€€€~~}|{{{|}|{zyyz{|zzzzzyyy}}xuvwwzzzz|~~zx|€€~~~~}}~~~}|z|~~{wx{~~|{{|wz~ƒ‚€€‚ƒƒ‚€ƒƒ„„ƒ~yxwvuvxzy||wuvxwvwxyyxwvtuuuvvvwvutvz|}}}~€€}|}~}{yxy{€‚€€‚ƒ‚€€€€€€}}|{{zzy{{|}~€€€€‚ƒƒƒƒƒ‚‚ƒƒ‚‚€~€}vpqz‚€€€{smtyƒ„ƒƒƒ„„„„…………†……††ƒ€€€€€€~~}|||||}}~~~~~}}||||{{}ƒƒ‚‚…‡ˆˆ‡†„ƒ„…ƒƒƒƒƒƒƒƒ††…„…ˆ‹…}vtv{~€€€€€€€€€€€€€€€€„ˆ‹Š†‚ƒ€€~~‚ƒ„„………‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‡‡ˆˆˆ‰‰‰ˆ‡ˆ‹ŒŠŠŒ‹ŒŠ‡……„ƒ†††……„„„„„„„„„…………………………„„ƒ‚ƒ„†‡‡…„‚€€‚ƒƒ„„ƒƒ†„‚‚„†„‡‡ƒƒ…„‚‚„ƒ„‰‡‡‡‡‡‡‡‡‡‡ˆ‡ˆ‡ˆ‡ˆ‰Š‰†„ƒ„‚~{|}}~€„‚€ƒ„„„ƒƒ‚‚‚ƒ‚‚‚‚‚‚‚ƒ†††‡‡ˆˆ‰‹‰‡††…ƒ‚‚‚€€…††††…„ƒƒƒ„„…††‡~€„‰Œ‹‡„…„ƒ„†‰Œˆƒ‚ƒƒ„„ƒƒ‚€‚‚‚‚‚ƒƒƒƒ„……†‡‡‡‡†………†††††„„…††…„„…†ˆ‡…ƒƒƒ‚‚‚‚€‚‚ƒƒƒƒ‚‚€€€€€€€€‚‚‚‚‡ˆ‚}ˆŒŠ…‚€€€€€€€€€€€€€€€€wsopv†Šˆ‡†……………ƒƒƒ„ƒƒ‚‚€~}|}}~||{zz{|}||||{{{{{~~{z|}}z{}~€€€|z{~~}~€~}||}~}|z{}~|yz{|}}|zyx{~‚‚€€‚‚‚‚‚ƒƒ„„„ƒƒ}|zywxz{y||wuvxwwwxxxwwvvvvvwwwwvutvz}~~}~€€~}{}~~{yyy{€‚€€€‚‚‚€€€€€€€}}||{zzz{{|}~€€€€‚‚ƒƒƒƒ‚‚‚ƒ„„ƒ‚€~~~|wsu|‚ƒ‚€}xqmty‚ƒƒƒƒ„„„„…………†……†…‚€€€€~~||{z||}}~~~~~||}}~|{{~€ƒƒ‚‚„‡†‡†…ƒ‚ƒ„ƒƒƒƒƒƒƒƒ…†„„„€‡‹…}vtv{~€€€€€€€€€€€€€€€€†Š‹†~~~~}}‚ƒ„„„„†††††‡‡‡ˆˆˆˆˆˆˆˆ‡‡‡ˆˆ‰‰‰†…†‰ŠˆˆŠ‹‹‰…ƒƒ‚€†††……„„„„„ƒ„ƒ„……………………………„ƒƒƒ…†‡†…„‚‚‚ƒ„„„„ƒ‚‚ƒƒƒƒ‚‚ƒ††‚€‚„ƒ‚‚„ƒ„‰‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆˆ‰Š‰†„ƒ„~{|}}~€„‚€ƒ„„„ƒƒ‚€‚‚ƒ‚‚‚‚‚‚‚ƒ…†ˆ‰ŠŠ‰ˆ‹‰‡††…ƒ‚‚‚€€„„…††…„„ƒƒƒ„„„„…†††‰‹Š„€€„‡‰Œˆƒ‚ƒƒ„„ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ„††‡‡‡††…………†††††…††‡‡‡†……‡ˆ‡…ƒƒƒ‚‚‚€€‚‚ƒƒƒƒ‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€yvrrx€‰ˆ‡‡††††††††……„„„ƒ‚€}}||||}}{{{zzyyy{~€~€}~€€€€|{{~~|}|}}}~}}|~|zz}~}|}{z{}}zvz{‚‚€‚‚ƒ„…„„ƒ„„…†€~|yxxyzy||wuvxwxxwvvvvvwwwwwvvvvutvz}~}~€€~}{}~}{yyz{€‚€€‚‚€€€€€€€€}}||{{zz{{|}~€€€€‚‚ƒƒ‚‚‚ƒ„ƒ‚€~}}{|{wsty}xxxvspnmuy~‚ƒƒƒƒ„„„„……………„…†…‚€€€€€~~~}}||{}}}}~~~~~~}}}|{{}ƒƒ‚‚‚„†………ƒ‚‚‚ƒƒƒƒƒƒƒƒ„…ƒ‚ƒ†‹…}vtv{~€€€€€€€€€€€€€€€€„ˆ‹‹†}|~~~~~~~~€‚ƒ„„„ƒ„„„……†††‡‡‡‡‡‡‡‡‡‡‡‡ˆˆ‰‰…„…ˆ‰‡‡‰‰‰ˆ†………ƒ††…………„„„ƒƒƒ„„„……………………………„„„…†‡†…ƒ‚‚‚ƒ„„„„ƒ€‚…‡‡…‚€„‡‡ƒƒ…„‚‚„ƒ„‰ˆˆˆˆˆˆˆˆˆˆ‰ˆ‰ˆ‰ˆˆ‰Š‰‡„„„}{|}}~€„‚ƒ„„„ƒ‚‚€‚ƒ‚€‚‚‚‚‚‚ƒ„†‰‹Œ‹‰ˆ‹‰ˆ††„ƒ‚‚‚€€‚‚„…††††………„„„„„ˆ…„†‹Œ‰…ˆˆ‡‡‰‹ŽŒˆƒ€‚ƒƒ„„ƒ‚‚€ƒƒ‚‚‚‚ƒƒ‚‚‚ƒƒƒƒ„†‡‡‡††……………†††††††‡‡‡‡‡†…‡ˆ‡…ƒ‚ƒ‚‚‚€‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚†ˆ‚}ˆŒŠ…‚€€€€€€€€€€€€€€€€~|yy|†Š†††††††‡†…„„ƒƒƒƒ……„ƒ‚€~~~~~~{{zzyxxx|€‚€€}~~~~€{y|~||{|~€}|~|z{|~~~~|{{|{yx{}‚‚€€ƒ…†ˆ†„ƒ‚‚ƒ~zxwwvvy||wuvxwyxvvuvvwwwwvvuuuvutwz~~€€~}z|~~{zyz{€‚€€€€€€€~}}|{{zzz{{}}€€€€€‚‚‚‚€‚‚…„„ƒ‚€€xnijmmnnmihikuy~‚‚ƒ„„„„„……………„„†…‚€€€€€€}~}~}~~~||}}}}}~}~~~~}|||{{~€ƒƒ‚‚€‚„†………„‚ƒƒ‚ƒ‚ƒƒƒƒ„‚‚‚~…‹…}vtv{~€€€€€€€€€€€€€€€€ƒ‡ˆ†~|€‚„„„ƒƒ‚‚ƒƒ„„…………††††‡‡†‡‡‡‡ˆˆˆ…„…‰‰ˆ‡‰…†…ƒƒ„…ƒ……………………„„ƒƒƒ„„„……„…„…„……………………†…„ƒ‚‚‚‚ƒƒƒƒƒ‚„‡‰‰‡„‚‡ŠŠ†„†ˆ‡‚‚„ƒ„‰ˆ‰ˆ‰ˆ‰ˆˆ‰‰‰‰‰‰‰‰ˆ‰Š‰†„ƒ„}{|}}~€„‚€ƒ„„„ƒƒ€‚‚‚‚‚‚‚‚ƒ„…‡‰ŠŠ‰‰‹Šˆ‡…„‚‚‚‚€€€‚…†‡‡‡‡‡††……„„†ƒ…‹ŒŒŒŽ‘’Œˆƒ‚ƒƒ„„ƒƒ‚ƒ‚‚‚‚‚‚ƒ‚‚‚ƒƒƒƒ„††††††……………††††††††‡†††††‡ˆˆ„ƒ‚‚‚‚ƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€€}|}€„‡††‡‡‡‡‡‡…„ƒ††……„ƒ‚‚€€~~~}||{{z|€ƒ€€~~~€‚ƒƒ€{y|~}{{}}~~~~~}|{}~}~~}{z{|}~€€‚‚‚‚‚€ƒ…††„ƒ€€€‚~zwxwvuy||wuvxwyxvuuuwwxwwvvuuuvtuw{~€€~‚€~|z|~}|zz{{€‚€€€€€€€~~}}|{{zzz{|~~€€€€€€‚€€€‚‚€€€€‚xlddhmnnjgegivy~‚„…„„„„……………„„†…‚€€€€€€~~~}}}}}||||||||}}|{|{|||{{}ƒƒ‚‚‚‚„††††„ƒ‚ƒƒƒƒƒƒƒƒƒƒ‚ƒ‚‚~~„‹…}vtv{~€€€€€€€€€€€€€€€€‚†‡†‚}ƒ………ƒ‚‚‚ƒƒƒ„„„„……†††††‡‡‡‡ˆˆ…ƒ…ˆ‰†‡ˆ†‡†ƒ‚ƒƒ‚………………………„„ƒ„ƒ„„„„…„…„„„…………………„„„ƒ‚‚‚ƒ€€‚‚‚‚„…‡‡‡‡…„‡ŠŠ‡…†ˆˆ‚‚„ƒ„‰‰ˆ‰ˆ‰ˆ‰‰‰‰‰‰‰‰‰‰ˆ‰Š‰‡„„„}{{}}„‚ƒ„„„ƒ‚‚€‚‚€‚‚‚‚‚ƒ……„…†ˆ‰‹‹‹Šˆ†ƒ‚‚‚‚‚€€€‚„††‡‡†††…„ƒƒƒ†ƒ‚„‹ŽŒˆƒ€‚ƒƒ„„ƒ‚‚€‚‚‚‚‚‚‚ƒƒƒƒ„…………††††………†††††‡†††††‡††ˆ‰‡…‚‚‚‚‚ƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚†ˆ‚}ˆŒŠ…€€€€€€€€€€€€€€€€~}||€…‰‡ˆˆ‰ˆˆˆˆ†…‚€€€„…………„ƒƒ‚‚ƒƒ‚€~}|{zz|€‚ƒ„ƒ€ƒ„„‚€~||}|zz|}}}~~~~~}}}~~|~}{{}€€€‚‚‚‚‚‚‚ƒ„…€€€€€‚„zxyzxvy||wuvxwxwvvuvwxyxxxwwvvuutw{~‚}|y{}}{zz{{€‚€€€€€€€€~~}}|{{{zz{|}~€€€€€€€€‚€€€‚€€€xmghlmmmlkklnwz~€‚„†„„„„……………„…†…‚€€€€€~}{{zz||||||||{|{|||{{|{{~€ƒƒ‚‚‚‚€ƒ…‡‡†…ƒƒƒ„ƒƒƒ„ƒƒƒƒƒ„‚‚~~…‹…}vtv{~€€€€€€€€€€€€€€€€…†‡‡…‚}~~~~~~~~„†‡†„ƒ‚‚‚‚‚‚‚‚‚ƒƒ„„……††††‡‡‡‡ˆƒ‚ƒ†‡……‡†‡†„„……ƒ„„…………††……„„„„„„„„„„„„„„„„……„„ƒ‚„ƒ‚‚ƒƒ€€‚‚‚‚…„„„„„„……ˆˆ„‚„†…‚‚„ƒ„‰ˆ‰ˆ‰ˆ‰ˆ‰‰‰‰‰‰‰‰‰ˆ‰Š‰†„ƒ„€}z|}~„‚€ƒ„„„ƒƒ€‚‚‚€€€‚‚‚‚‚ƒ…„ƒ‚„†ŠŒŒŒ‹‰…ƒ‚‚‚‚‚€€€‚„…†††„„ƒƒ‚ƒ‚‚‚‚ƒ†ŠŽ‘ŽŽŒˆƒ‚ƒƒ„„ƒƒ‚‚‚‚‚‚ƒƒƒƒ„……………††‡………†††††ˆˆ‡‡‡‡‡ˆ‡ˆ‰ˆ„‚‚ƒƒƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€€€‚†‰‡ˆˆˆ‰ˆ‡‡†„‚€€‚ƒ„………„ƒƒ„„„ƒ‚€~~|{zzy~ƒƒ‚ƒ„…„‚~~||}|yy{{{|}~~}}~~~~}~~}}}ƒ€€€‚ƒ‚‚ƒƒ„ƒƒƒ€€€€€ƒ}xwyzyvy||wuvxwwwvvwwxyxxxxwwwwutuw|€‚‚€‚}|y{}}|z{|{€‚€€€€~~~~}||{{zz{|}~€€€€€€€€€€€†…„‚€}}}ysomlmpppruvwvwz}€‚„†„„„„…………†……†…‚€€€€~}}||{{z}}}}}}}}z{|}~|{z|{{}ƒƒ‚‚‚‚ƒ…‡‡‡…ƒ‚ƒ„„„„„„„„„ƒ„‚‚ƒ…‹…}vtv{~€€€€€€€€€€€€€€€€……„ƒ‚€~}}}~~~~€‚…‡ˆ‡…ƒƒƒƒ‚‚€‚‚ƒ„„……††††‡‡‡‡ƒ‚ƒ†‡……‡ƒ„„‚‚„„ƒ„„„……†††††…„„„……„„„„„„„„‚ƒ„„„ƒ€ƒƒ‚‚ƒ„‚ƒ„„„ƒƒ„„„„„„„„…ˆˆ„‚„……‚‚„ƒ„‰ˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰ˆ‰Š‰†„ƒ„€|{{}~„‚€ƒ„„„ƒ‚‚‚€€€‚‚‚‚‚ƒ„„„„…ˆŠ‹ŒŒŒ‰…ƒ‚‚‚‚‚€€€€‚ƒ…………„„…………††‚„‡ˆ‰‰ŒŽ‡ˆˆˆˆˆ‡‡Œˆƒ€‚ƒƒ„„ƒ‚‚€‚‚‚‚‚‚‚ƒƒƒƒ„†……„……††………†††††ˆ‡‡††‡‡ˆ‡ˆ‰‡„‚ƒƒƒƒ‚‚‚ƒƒƒƒ‚‚‚‚‚‚‡ˆ‚}ˆŒŠ…‚€€€€€€€€€€€€€€€€ƒ‡ˆ‡††‡†‡‡ˆ‡‡†……ƒ€~}}~€ƒ„……„„„………„ƒ€‚€~}||€‚}{}€€‚‚‚‚‚|y{}{yx|{zzz|}~€€~}|€}{|‚ƒƒ€€€‚ƒ‚ƒ„……„‚‚‚ƒ‚€~|zutwywty||wuvxwvvvwwxyywwwwvvvvutux|€‚‚€‚}{y{}}{{{|{€‚~€‚€€~~~}||{{zz{|}~€€€€€€€€|yvsqpqmikqwyy}{{}€|xz}€„†„„„„…………†……††ƒ€€€€|||}}~~~~~~~~~~~|||}}}|||{{}ƒƒ‚ƒƒ‚€ƒ…†††„ƒ‚‚ƒ„„„„„„„„„„ƒ‚ƒ†‹…}vtv{~€€€€€€€€€€€€€€€€€~~~~~~~€€€‚…ˆ‰‡…„…„ƒ‚€‚‚ƒ„………††††‡‡‡…„…ˆ‰‡‡ˆ‡‡†„ƒ„ƒ‚„„„……†††††………………„„„„„„„„‚‚ƒ„ƒ‚€ƒƒ‚‚ƒ„ƒƒ„…………„„……††……„†‰‰…ƒ…‡‡‚‚„ƒ„‰ˆˆˆˆˆˆˆˆ‰‰ˆ‰ˆ‰ˆ‰ˆ‰Š‰†„ƒ„€|z|}~‚„‚€ƒ„„„ƒƒ‚€‚€€€‚‚‚‚‚ƒƒ„…‡ˆ‰Š‹ŒŒŒ‰…‚‚ƒ‚‚‚€€€‚„„„„„‡ˆˆ‰ŠŠ‹‹‰ŒŽŒ†ƒƒ„…††††…„„Œˆƒ‚ƒƒ„„ƒƒ‚ƒƒ‚‚‚‚ƒƒ‚‚‚ƒƒƒƒ„‡†…„„„……………†††††‡†…………†‡‡‰‰ˆ„€‚ƒƒƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€€€ƒˆŠˆ‡ˆˆˆˆˆ‡‡‡‡‡„~||}~€ƒ„…………………„„ƒ„‚‚ƒ‚€}‚„}|zz~~~€‚€~zy}}yxzz}}{{}€‚‚~||~€‚ƒ‚€€‚ƒ†‡‡„€~€‚€€{ttwzywz|{vsuxxyxwvvwyzvvwwxwvvvutw{~€€‚‚{x}}}|yz}€€€€€€€€€€€€€€}}}€~|||yz{|}~€€€€€€€€€€€€‚|yvqichfflu|~~€€~~}}z{~€‚ƒ„„‚ƒƒƒ„„„„†„ƒ„„‚‚„ƒ‚€‚‚~}}||{{zz{||}~~~}}~~~~}}~|{|€‚ƒƒ‚‚‚‚ƒ„„‡ˆ‡ƒ‚ƒƒ‚ƒ„„ƒ‚……}‡Š…~xwy}€€€€€€€€€€€€€€€€€‚€|{}~}~~~~~~~~~…‡‡‡††††…„ƒƒ‚‚€€€‚‚‚ƒƒ…†ˆ‰„„†Š‹‰ˆ‰Š‹Š†„ƒ‚…„ƒ„…†……†………†††………………………„„ƒƒ‚‚ƒƒƒƒƒƒƒƒ€‚„†‡‡…„…ƒ‚„††„…‡ˆ‡…„…‡ƒ‚‚„‚€ƒ‡‰ˆˆˆˆˆˆ‡ˆˆˆˆ‰‰‰‰ˆŠ‹Š‡„ƒ„€~||||~€ƒ‚€„…†…„ƒ‚€€€€ƒ…†…ƒ‚„‡Š‹‰†ƒ‚€€‚ƒ‚‚‚ƒƒƒƒ„……†‰ŽŒˆ„ƒƒƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€‚ƒƒƒƒ‚‚„…„‚‚„††……††‡‡†††††‡‡‡‡††………………‡ˆ‡…‚‚ƒ‚‚‚‚‚„……ƒ‚‚ƒƒ‚‚‚ƒ„‚‚‚‚‡ˆ‚‡ŒŽŒ†‚€€€€€€€€€€€€€€€€€€ƒˆŠˆ‡ˆˆˆˆˆˆˆ‡‡‡…~||}~}~€‚ƒƒ„„…†……„„„ƒ‚‚ƒ‚}€‚~}}€€€‚‚€~zy|}zy|~}|||||}}€€~}|}}€‚ƒ€€‚ƒ„†…„‚€€€€€€€{utwyxvz|zvsvxxwvuuuvwxwwvvvvvwvutw{~€€‚‚‚€{x}€}}{y{}€€€€€€€€€€€€€€}}}~}{{|yzz|}~~~~€€€€€€€€€€~vkchfflu|~~€€~~}}z{~€‚ƒ„„ƒƒƒ„„„„……„„†…ƒ‚ƒ‚€‚‚}~}}||{{}}}}}|||}}~~~~}}~|{|€‚ƒƒ‚‚‚‚‚ƒƒ„‡ˆ†ƒ‚ƒƒ‚ƒ„„ƒ‚ƒ„…}€†Š…~xvw{~€€€€€€€€€€€€€€€€‚‚€|{}~}~~~~~~~~~…‡‡‡†‡††……„ƒƒƒ‚‚€€‚‚ƒ…†‡ƒ„†Š‹‰ˆ‰‡ˆˆ…ƒ„„ƒ…„ƒ„…†………†††………†……………………„„ƒƒ‚‚ƒƒƒƒƒƒƒƒ„„„………„„„„ƒƒ„…„„‹‹‰‡„„†‰ƒ‚‚„ƒƒ‡‰‰ˆ‰ˆˆˆˆˆˆˆ‰‰‰‰‰ˆŠ‹Š‡„ƒ„~||||~ƒ‚€ƒ††…ƒƒ‚€‚€€„†‡…„ƒ…‡‹ŒŒŒ‹ˆ…‚€„„ƒƒ‚‚‚‚‚‚‚ƒƒƒ…„ƒ‚ƒ‡‘ŽŒˆ„ƒƒƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚‚ƒ„„‚‚‚„††……††‡‡†††††‡‡‡‡††………………‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚‚‚‚„‚‚‚‚‡ˆ‚…ŠŒŠ„€€€€€€€€€€€€€€€€ƒˆŠˆ‡ˆ‰‰‰ˆˆˆˆˆ‡…‚~}|~~|}}~€€‚ƒ„…†††……„ƒƒƒ‚€~€‚€€€‚„„‚zy{}{|~|z|}|{||}~~~}|}}~€‚‚‚ƒ„……‚€€‚‚€€‚‚‚€~}zvuwyxvz|{usuxxwwwwwwxxwwvuuvwwvutw{~€€~‚ƒ‚‚€zy~€~||{y{}€€€€€€€€€€€€€€}}|}~}|{z{yz{{|}~~~}}}}~€€€€€€€€€€‚„ƒ{ofigglv|~}€€~~}}z{~€‚ƒ„„ƒƒƒƒ„„……„ƒ…‡†ƒƒ‚€‚‚}}~~~}|{~~}}|||{}}~~~~}}~|{|€‚ƒƒ‚‚‚‚‚„„†‡†‚€‚‚‚ƒ…†„‚‚‚„„}„ˆ„~xvvy{€€€€€€€€€€€€€€€€‚ƒ}{}~}~~~~~~~~~…‡ˆ‡††‡‡†……„„„„ƒ‚€€€‚ƒ„ƒƒ…‰Š‰ˆˆ†ˆ‡…„„…„…„ƒ„…†……„…‡†…„…†……………………ƒƒƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚ˆ†„‚‚‚„„„„„ƒƒ„†ˆ‘Œˆ„ƒ†‰ƒ‚„ƒƒˆ‰‰‰‰‰ˆˆˆˆˆ‰ˆ‰‰‰‰ˆŠ‹Š‡„ƒ„~||||~ƒ€„…†…„ƒ‚€‚‚‚‚…‡ˆ‡††‡‰‹Š‹ŒŒ‹ˆ…‚†‡ˆ‡‡„‚‚‚‚ƒƒƒ‚ƒƒƒ„†‹ŽŒŽŽŒˆ…ƒƒƒƒ„„……††‰‡„‚‚ƒ„„„„‚‚€‚ƒƒƒƒ‚‚ƒ„„‚‚ƒ„††………††‡†…††††‡‡‡††………††…‡‰‡…‚‚ƒ‚‚‚‚‚ƒ…„ƒ€‚€‚ƒ‚‚‚‡Š„ƒ†ŠŒ‰„€€€€€€€€€€€€€€€€~‚ˆ‰ˆ‡ˆ‰‰‰‰ˆˆˆˆ‡…}}~}}}~€€ƒ……††††††……ƒ‚€‚„‚€€}ƒ……„ƒ€|y{{{|~|zz{}||}{{{||}||}~~€‚€‚ƒ„……ƒ~€‚ƒ€‚ƒ€}{{xuuwyyxz|zvsvxxvwwyxxxwwvvvuvvwvutw{~€€}~‚ƒ‚‚yz~€}{{zy{~€€€€‚€€€€€€}}{{|{{zzzyzz{{|}}|||||}~€€€€€€€€‚‚|smjhgmu}~}€€~~}}z{~€‚ƒ„„ƒ„ƒ„„…………„„‡…ƒƒ‚€‚‚|}~~~||~}}}|}}}}~~~~}}}~|{|€‚ƒƒ‚‚‚‚ƒƒ„†‡…‚€‚‚ƒ‚‚ƒ……„ƒƒƒ„…~}ƒ€{xvwy{€€€€€€€€€€€€€€€€ƒ„}|}~}~~~~~~~~~…‡‡‡†‡‡‡‡‡††……†…„‚~€‚„ˆ‰‡†‡ˆ‰ˆ…ƒ„„„…„ƒ„…†……„…††„……†……………………ƒƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚ˆ†„‚‚ƒ„„……„‚„ˆŒ““Œ‡…†‡‚‚„ƒ„ˆ‰Š‰‰‰‰ˆˆˆ‰ˆ‰‰‰‰‰ˆŠ‹Š‡„ƒ„~|}}|~ƒ‚€ƒ††…ƒƒ€‚ƒƒ‚‚ƒ†‰‰‰ˆˆ‰ŠŒŠ‹‹Œ‹Šˆ‡‰Š‹ŒŠ‡‚€‚‚‚ƒƒƒ€ƒƒ„†‰‹ŒŽŒˆ…„„ƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚ƒ„„‚‚ƒ…††…………††…†…†††††‡††……†††…‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚‚‚‚ƒ‚‚‚‡‹‡†‡ŠŽ‹†€€€€€€€€€€€€€€€€~~‚‡‰ˆ‡ˆ‰‰‰ˆ‰ˆˆˆˆ…‚}}~€‚ƒ……†††‡‡‡†…„„……ƒ‚€€€€‚„……ƒ‚}{z{{||z|}|{|}|zzzz{{|}~~€€€‚‚ƒ„„„€€€€‚‚‚€‚~{yuttuxz{{z|{utuxxtuvwwwvuuuvvwvvuvutw{~€€}~‚‚y{~|zzzx|~€‚€€€€€€€}}{zzzzzzyzzzz{{||{{{{|}~€€€€€€€€ƒ€€{upkiimv|~}€€~~}}z{~€‚ƒ„„„„„„……††‡…„…„‚ƒ‚€‚‚|}~~~~}~~}}||}}~~~~~}}|~|{|€‚ƒƒ‚‚‚‚‚„„†‡†‚€‚‚ƒƒƒƒ„ƒƒƒ„ƒ„…‚}|~}{ywxy{|€€€€€€€€€€€€€€€€„„‚}|~~}~~~~~~~~~…‡ˆ‡‡†‡‡‡†‡†††‡†…ƒ‚‚‚‚€~€€€ƒ†ˆ†…†‡ˆ‡ƒ‚‚„ƒ…„ƒ„…†……†…„„†……„……………………‚‚ƒ‚ƒ‚ƒƒ‚‚‚‚‚‚‚‚…„„ƒƒƒ„„„…†……‡Œ’””‘Œ‡„„‚‚ƒƒ„‰Š‰‰‰‰ˆ‰ˆ‰‰‰‰‰‰ŠŠˆŠ‹Š‡„ƒ„}}}}ƒ€„…†…„ƒ‚€€‚ƒƒ‚‚„‡‰ŠŠŠŠ‹‹ŒŒ‹‹‹Š‹Š‹‹‹ŒŽŽŒ‡ƒ€‚‚‚ƒƒƒƒ‚€ƒ‰‹ŽŒˆ…„…ƒƒ„„……††‰‡„‚‚ƒ„„„„‚‚€‚ƒƒƒƒ‚‚„ƒƒ‚„…††……………†……†…†††††††††††‡…‡‰‡…‚‚ƒ‚‚‚‚‚ƒ…„ƒ‚‚ƒ‚‚‚ƒ‚ƒ‡ŒŠ‰Š‹‹…€€€€€€€€€€€€€€€€}}‡‰ˆ‡‰‰‰ˆˆˆˆˆˆˆ†‚}~~€€€€€~€‚ƒ„„„„…‡‡†………††‚€‚‚‚‚ƒ„…„€~{{{{{{{~}{{{zzyyyz|}~~€€€‚ƒƒƒ‚‚€‚‚€€€€~|yxsstvxyz{z|zvsvxxuvvwwwvvuuvwwvuuvutw{~€€~~€€€z|{xyyx|‚ƒ€€€€€€€€}}{zyxyzzyzzzzz{z{zzz{|}~€€€€€€€€€€€€|tmljinv}~}€€~~}}z{~€‚ƒ„„„„„……†††ˆ†„…ƒƒƒ‚€‚‚}}}}}~~€€~}||||~~~~~}||~|{|€‚ƒƒ‚‚‚‚ƒƒ„†‡†‚€‚‚ƒƒƒƒƒ‚ƒƒ„ƒƒ…ƒ~{{yxxxy{|}€€€€€€€€€€€€€€€€……‚~|~~|~~~~~~~~~…‡‡‡†‡†‡†‡††††‡†…„„„„„‚‚€‚€€ƒ‡ˆ†…†„†„‚€‚„„…„ƒ„…†……†…ƒ„…†…„……………………‚‚‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒ„„„„ƒ…††‡ˆ‹Ž‘‘”–”ˆ„‚€ƒƒ‚„‰‰‰‰‰ˆ‰ˆˆ‰‰‰‰‰ŠŠŠˆŠ‹Š‡„ƒ„}}}}ƒ‚€ƒ††…ƒƒ€‚‚‚‚„‡ŠŠ‹‹ŒŒŒ‹‹Œ‹ŠŠŠ‹Œ‹Ž‹ˆƒ‚‚‚ƒƒƒ‚‚ƒˆ‹ŠŒŒˆ†……ƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚€‚ƒ„‚ƒ„†††………………………†…†††††††††‡‡…‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚ƒƒƒ‚‚‚ƒƒ‚€‡ŽŠŠŠ‹‹ˆƒ€€€€€€€€€€€€€€€€|}†‰‡‡‰ˆˆˆˆˆ‡‡‡ˆ†ƒ~~€€€€~~}~€‚‚‚‚€‚„…„ƒ„†‡†€}€€‚„„ƒ~}|{{{|{z}~~}}|{zzyyyz|~€€€€‚‚ƒ‚€€€‚‚‚€€~}{yxwtuwwwwwwz|{vsuxxvwwwxwxwuuvvvvvuvutw{~€€€€~€€{|zwxyx|‚‚ƒ€€€€€€}}{zxxyzzzzzzzzzzzzzz{|}€€€€€€€€€‚‚|skmjjnw}~}€€~~}}z{~€‚ƒ„„„„……††††‡………„€ƒ‚‚‚}||||}€€~|||}}~~~~~}||~|{|€‚ƒƒ‚‚‚‚ƒ„„‡ˆ‡ƒ‚ƒƒƒ‚‚‚ƒƒƒƒ…ƒƒ…ƒ}zyxxyyz{||€€€€€€€€€€€€€€€€…†ƒ~|~~|~~~~~~~~~…‡ˆ‡††††††††††‡†…………††……„ƒ‚‚ƒƒ‚‚…ˆŠˆ‡‡†‡†‚‚„……„ƒ„…†………„„„………„……………………‚‚ƒƒ„„ƒƒƒƒƒƒƒƒ‚‚ƒ„„„ƒƒ††‡‰‘‘’”•’ˆ†…€ƒƒ‚…Š‰‰‰ˆˆˆˆˆ‰‰‰‰ŠŠŠŠˆŠ‹Š‡„ƒ„‚}}}}‚ƒ‚€„…†…„ƒ‚€€‚‚„‡ŠŠ‹ŒŒ‹Š‹‹‹Š‹‹ŒŒ‹ŒŒŠ‡„‚‚‚ƒƒƒ€‚ƒƒƒ„‡‰ŠŒŒ‰†…†ƒƒ„„……††‰‡„‚‚ƒ„„„„ƒ‚€‚ƒƒƒƒ‚€ƒƒƒƒ…†††……„„………………†…†††††††‡‡ˆ…‡‰‡…‚‚ƒ‚‚‚‚‚ƒ…„ƒ‚ƒ‚‚‚‚ƒ€†ŒŒŒ‹ˆƒ€€€€€€€€€€€€€€€€||€†‰ˆ‡‰ˆˆˆˆ‡‡‡‡ˆ†ƒ€~~€€€~~}}}~€€€€|‚ƒ‚‚ƒ…‰…~z{{z{|}€ƒ…„‚€zzz{||{z}{{~}||zzyyz|~€€€€€‚‚ƒ‚~€‚ƒ‚‚}{yxwwwxyxvuttz|{vsuxxuuuvvvvvvvuutuvvvutw{~€€€~}€€||zwxyx}‚‚ƒ€€€€€€}}|zxxy{{zzzzzyyyyzzz{|~€€€€€€€€€‚|slmkjow}~}€€~~}}z{~€‚ƒ„„„………†††‡†……‡†‚€€ƒ‚€‚‚}|{{{}~~}||}~~~~~}||~|{|€‚ƒƒ‚‚‚‚‚ƒ„„‡ˆ‡ƒ‚ƒƒƒ€ƒ„„ƒ…ƒƒ…ƒ~yxyyzz{{zz€€€€€€€€€€€€€€€€††ƒ~|~~|~~~~~~~~~…‡‡‡††………†††††††………†‡‡‡‡…„„„„„„„†Š‹‰ˆ‰Š‹ˆ…‚ƒ„……„ƒ„…†……„………„ƒ„………………………‚‚ƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††‡‹“’‘””“‹ˆ‡‡€€ƒƒ‚…Š‰ˆˆˆˆˆˆ‡‰‰‰‰ŠŠŠŠˆŠ‹Š‡„ƒ„‚}~~}‚ƒ‚€ƒ…†…ƒƒ‚€€ƒ‡‰Š‹ŽŒŠ‰ŠŠ‹ŒŒŒ‹‹‹‹‹‹‰†„‚‚‚‚ƒƒƒ„ƒ‚€€ƒˆŒŠ‹Œ‰†††ƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚ƒƒƒƒ…‡††……„„…………………††††††††‡‡ˆ…‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚‚€‚€ƒ‚‡ŽŽŠ…€€€€€€€€€€€€€€€€{}€„‡ˆ‰ˆ†ˆ‰‰‡…†‡ˆˆ„~{||z}}~~€€€€€€€‚„„€€‚‚ƒƒƒ‚~~~zy||||}}~~~{x{~~~~€€€‚ƒ„ƒ€‚€‚ƒƒ‚‚€|zxwvvwxxxxvutx{{ustvuxussuwxxwwvsstututtvz~~~€~{zwxxwy~€€€€‚|}zxxz{{zyyyxyzz{yyyz{}~‚‚€€}‚ƒ€xpkokhlt{~}|}€€}|yz}€ƒ…††„„„……†††††…„„ƒ‚‚€ƒ„‚}||~~{~~~~~~~~~}||~ƒƒ‚‚ƒƒƒ‚‚„†…††‚~}‚ƒ„„„„„…†…ƒƒ…‚{xxvyytty}~€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~|„†††‡ˆ………………………†‡‡ˆ‡†…†††……„„„‚ƒ†ˆ‰‰‰ˆ‰ˆ‡…„„ƒƒ„„„……„„„……………………‡‡‡†…„ƒ‚…„ƒƒ‚ƒƒƒ‚ƒ„„………„‚‚‚ƒƒ…†‰Œ‘’“”Ž‘‘Œ‡„„…‚ƒ†Š‰‰ˆˆˆˆˆˆˆ‰ŠŠŠŠŠŠ‹‹‰†„„…€}|~~~€ƒƒ‚ƒ…‡†……ƒ€‚‚€‚‚‚‚‚‚‚‚€€ƒ‡‰ˆ‰Š‹Œ‹‹ŠŠ‹‹‹‹ŒŒŒŒŒŒ‰…‚‚……„‚ƒ‚€‚†ŠŒŒŽŽŒ‰…„„†††…„„ƒƒŠˆ†„‚‚ƒƒƒ‚‚‚‚‚ƒ„ƒƒ„‚ƒ…††……„„……ƒƒ„……†‡‡††††††††ˆ‰‹‰†ƒƒƒ‚ƒƒ‚‚„†…ƒ‚‚‚‚‚‚‚‚‚‚‚ƒ„‡‰ŠŽŽ‹†‚€€€€€€€€€€€€€€€€{}€„‡ˆ‰‰†‡ˆˆ‡‡†‡ˆˆ…}~~|€€€}}~€‚€€€€€€€€ƒƒ€€€~€‚‚‚‚~~{z|||||}}}~~yvy|}~€€€€ƒ„„ƒ‚‚‚‚€‚ƒ‚‚~}{yxwvvwxxxwwutx{zustvuxxvvuuvwutttssttuttvz~€€}}{zwxxwy~€€€€‚~|}{yyz{{zyyyyyzz{yyyz{}~|||||}}€|vokliglu}€€}~€€~}y{}ƒ……†„„„……††††‡‡‡…ƒ€~€€ƒ„‚€~}|~~~~~~~~~~~~~~~~~}||~ƒƒ‚‚ƒƒƒ‚‚„††‡†ƒ~€ƒƒƒƒƒ‚ƒ„……ƒƒ…‚|xxuyyvv{€€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~|€„†††‡ˆ†††††††††††‡†††††††………„„ƒ…‡‰‰‰ˆˆ……„ƒƒƒ„„„„„„„„„„……………………‡‡‡†…„ƒ‚…„ƒ‚‚‚‚‚‚ƒ„„……„„‚‚‚ƒ„†ˆŠ‘’’“Ž‘‘Œ‡„„…ƒ„ˆ‰‰ˆˆ‡ˆˆˆˆˆ‰ŠŠŠŠŠŠ‹‹‰†„„…€~|~~~ƒƒ‚ƒ…‡†……ƒ€€‚€ƒ†‰‡ˆ‰‹‹‹‹ŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒ‰…‚„„‚‡†……†ŠŽŽŒ‡ƒ‚„„„„„„„„‰ˆ†„‚‚‚ƒƒ‚‚‚‚‚‚‚ƒƒƒƒ„ƒƒ…††……„………ƒ„„……†‡‡††††††††‡‰Š‰†ƒ‚ƒ‚ƒƒ‚‚„……ƒ‚‚‚ƒ„†ˆŠ†‡ˆ‰‡„€€€€€€€€€€€€€€€€{}„‡ˆ‰‰‡‡‡ˆˆˆ‡‡‡ˆ…~€€~€€€~~€€€€€€€~‚€~€€‚ƒ„…†††~~{{|{||||}}}{wvx{|~€€€€‚‚ƒƒ‚‚ƒƒ‚€‚‚‚€€|{zxwwvvwwxxxwvuwzzusuvuwxywvtvwwuvwwttuuttvz~€€€~}|{zwxxwy~‚€€€€€~{~|{z{{{zzyyyyyz{zyzz{|~~€~€€}}}|ytpmjhhmv}~~€~}z{~€ƒ„……„„…………††‡‡†…„‚€€€ƒƒ‚€€~}|}|~}}~}~}~~~~~}}}||}ƒƒ‚‚ƒƒ‚‚‚„†‡ˆ‡„€~„ƒƒ„ƒƒ‚„……‚ƒ…ƒ|yyy||yy|€€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~~~~}€„‡‡†‡‡†††††††††††…†…†††††………………†ˆ‰Š‰ˆ‡ˆ‡†„„ƒƒƒ„ƒƒƒƒƒƒ„……………………††‡‡†…ƒ‚…„ƒ‚€‚ƒ„„…„„ƒƒ‚‚‚ƒ„…‰ŠŒŽ‘’’‘ŽŒˆ„€ƒ„ƒ…‰‰‰ˆ‡‡‡ˆˆ‡ˆ‰‰Š‰‰‰Š‹‹‰†„„…~}~~}‚ƒ‚ƒ…‡†……ƒ€‚‚‚€‚‚‚‚…‡†‡ˆŠŠ‹ŠŠŠŠ‹‹‹‹ŒŒ‹‹‹Œ‹‰…ƒ‚‚„††…ƒ†…„„…ˆ‹ŒŽŽ‹†‚€€‚‚ƒƒ……††ˆ‡…ƒ‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚ƒƒƒƒ„‚ƒ…††…„…„……„„……††‡‡††††††††‡‰Šˆ†ƒ‚‚‚ƒƒ‚‚„†…ƒ‚‚‚‚„†ˆ‰‚„……„‚€€€€€€€€€€€€€€€€{~…‡‰‰‰‡‡†‡‰Šˆ†…†ƒ}€€€€€€~~‚€‚‚ƒ„…………€~}|}||||||||zxwxz}‚‚‚‚‚€‚€‚€~zyxwvvwwvwwxxwvuvzzusuwvuwxxwwwxxxxyxvttuttvz~€€€€~}|{zwxxwy~€€€€€}{~}|{{{zzzzyyyzz{zzzz{|}~}zwutsqppomkjilkkpv}€€}}}~}}}}z|~‚„„…„„„……††††…„„ƒƒƒƒ€€‚ƒƒ|{}}{|~~~~~~}~€~}|}|{~ƒƒ‚‚ƒƒƒ‚‚„†ˆ‰ˆ…€€‚…„…„„ƒ„„……ƒƒ†ƒ}zz€€}{{}~€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~~~~~…‡‡†‡‡††††††††‡†……„…†‡††††…†……„†‡ˆˆˆ†…‰ˆ†…ƒ‚ƒƒƒ‚‚ƒƒƒ„„„„„„„„…†‡‡‡…ƒ‚…„ƒ‚€€€€‚ƒƒ„„„ƒƒƒƒ‚‚ƒ„…†‹Œ‘‘‘ŽŠ…€ƒ„„†Š‰‰ˆ‡‡‡‡ˆ‡ˆˆ‰‰‰‰‰Š‹‹‰†„„…~}~~}‚ƒ‚ƒ…‡†……ƒ€€‚‚ƒ‚‚€‚„‡‡‡ˆ‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹‹Œ‹‰…‚„„…‡Š‹‹‰‹Š‰‰Š‹ŽŒŽŒˆ„ƒƒ„…………††‡‡†…ƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚ƒ‚„„ƒƒ…††……„………„……††‡‡‡††††††††‡‰‰ˆ…ƒ‚‚ƒƒ‚‚„……ƒ‚‚‚‚ƒ…‡ˆƒ„…‡††…„€€€€€€€€€€€€€€€€|~…ˆ‰Š‰ˆ‡‡ˆ‰Šˆ†ƒ„|{}~}}}~~€€€€€~~~‚ƒ€‚ƒ‚‚ƒ„…………€€~}}||||||{{{z{~ƒ‚‚‚ƒƒ€‚€€€€~}yxwwvvwwuvwxxwwvvyyusuwwwvwwyxwvuvwvvvusuttvz~~~€~~{zwxxwy~‚€€€€€€€€|z||}|{{zz{zzyzzz{{zzz{|}~}yuqnlkmmmmnnnoqqrtx{}}{{{z{{{{{|€ƒƒ„„„„…………††ƒ„…††„ƒ‚ƒƒ}{|~||}~~}}}}}~}|}||}ƒƒ‚‚ƒƒ‚‚‚„†ˆ‰ˆ…€‚…„……„„ƒ„…„‚ƒ…„~{{€€|{|~€€€€€€€€€€€€€€€€‚„ƒ|}~}}}~}~~‚†ˆ‡††‡††††††††‡†…„……†‡††††††††ƒ„†‡‡†…„„„ƒƒƒ‚‚ƒƒ„„„„„„„„„…‡ˆˆ†„‚…„ƒ€€€ƒƒ„„„ƒƒ‚ƒƒƒƒ„…‡ˆŒŽ‘‘‘‘‘ŽŒˆƒƒ„ƒ†Š‰‰ˆ‡‡‡ˆˆˆˆ‰‰‰‰‰ˆŠ‹‹‰†„„…‚}~~}~ƒ‚ƒ…‡†……ƒ€‚‚‚€‚‚ƒ„‡ˆˆˆˆ‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒ‰…‚‚‚„‡‹Œ‹‹ŠŠŠ‹ŒŒ‰‹ŒŠˆˆˆ‰ˆˆ‡‡‡‡††…„‚‚‚ƒƒƒ‚‚ƒ‚‚‚‚‚ƒƒ„‚ƒ…††…„…„……„„……††††……………………†ˆ‰ˆ…‚‚ƒƒ‚‚„†…ƒ‚‚‚‚ƒ„…†‡‡ˆ‡‡††…€€€€€€€€€€€€€€€€|~…ˆŠŠŠ‰ˆˆ‰‰‰‡†ƒ„|z||{{{|}~€€€€€€€€€€~~~~€ƒƒ‚‚ƒ„…†††‚ƒƒ€‚€~~~}}}}||~}{z}‚‚‚‚ƒƒ€€€‚€€€~||zyxwvvwwuvwxxxwwuyyusvxwzyvvwwussuvuvxxvuttvz~}~€€{zwxxwy~€€€€€€€€€€|yy{||{{{{|{zzyzz{{{zzz||}}zxvuuwwxyz{{{wwwyy{{{|{zzyz{|{}‚ƒƒƒ„„„……†††††††„ƒ‚‚ƒƒ€~}}~€€}~~~}}}}||}~~~~||}|{~ƒƒ‚‚ƒƒƒ‚‚„†ˆ‰ˆ…€‚…„„„ƒ‚‚ƒ„„‚ƒ†„||||}~|}€€€€€€€€€€€€€€€€€‚„ƒ|}~}|}}~~~€ƒ‡ˆ‡††‡‡‡‡‡‡‡‡‡††…†…††††††††‡†‡‚„…‡‡‡……‡†…„‚‚ƒ‚€€‚ƒ„„„„„„„„‚„‡ˆˆ†„‚„ƒ‚‚‚‚‚ƒƒƒ„ƒƒ‚‚ƒƒƒ„…‡ˆ‰‹ŒŽ‘‘‘‘’’‘‹†ƒƒƒ‚„‰ŠŠ‰ˆˆˆˆ‰ˆ‰‰‰‰‰‰ˆŠ‹‹‰†„„…‚}~~}~ƒ‚ƒ…‡†……ƒ€€‚‚‚‚‚…‡‹Š‰‰ˆˆ‰‰‰ŠŠŠŠ‹‹‹‹‹ŒŒŠ‡„€„ˆ‹‹Šˆˆ‡‡‡‡†††‰‹‹Šˆ‰ŠŠŠ‰ˆ‡‡††…„ƒ‚‚‚ƒƒ‚‚‚‚ƒƒ‚‚‚‚‚ƒ„„ƒƒ…††……„………„„„……†…†……………………†ˆˆˆ„‚‚ƒƒ‚‚„……ƒ‚‚‚ƒ……ˆˆ‡‡……„„€€€€€€€€€€€€€€€€|~‚…ˆŠŠŠ‰ŠŠŠˆ‡††††ƒ}{||z{{||}}}}€€~~~}€€~~~‚‚~~~€‚‚‚‚ƒ……‚‚„„~~}}}{~zx{~‚‚‚‚€€€‚€}|{{zywwvvvtuwwxxxwuxyusvxxzywuutuuvvvvvwxxuttvz~€€€~}{zwxxwy~‚€€€€€€€€€€€~{yvy{|{z{||{{zzzzz{{{z{{|}~|{{{{{yz|}}|{zz{|||{{{~}|{{{}~|}‚ƒƒƒ„„…………††‡†…„ƒ‚‚‚ƒ‚‚ƒ‚€~}~€€~|||}}}~~~~~}}}}}}||}ƒƒ‚‚ƒƒ‚‚‚„†ˆˆˆ„‚„„„„ƒ‚‚ƒ„„‚ƒ†…}}yy{~}z|€€€€€€€€€€€€€€€€€‚„ƒ|}~}||}}~~„‡ˆˆ††‡‡‡‡‡‡‡‡‡††††‡†††††††‡‡‡‡ƒ„†ˆ‰‰ˆ‡‹‰‡…„ƒ‚ƒ‚€€‚ƒ„„„„„„„„„‡‰‰‡„‚ƒ‚‚‚‚ƒ„„ƒƒƒƒƒ‚‚ƒƒ„„†‡‰ŠŠ‹‘’’‘’“”“’’’‰…ƒ‚€ƒ‡‹ŠŠ‰‰‰‰‰‰‰ŠŠŠ‰‰‰Š‹‹‰†„„…ƒ~~~|~€ƒ‚ƒ…‡†……ƒ€‚‚€ƒ†‰Ž‹‰ˆˆˆˆ‰‰ŠŠŠŠ‹‹ŒŒŒŽŒˆ…€€ƒ†ˆ‡†ŠŠŠ‰‰ˆ‡†…‡‰‰‡††‡‡†‡†††††„„‚‚‚ƒƒƒ‚‚ƒƒ‚‚‚ƒƒ„‚ƒ…††…„…„……„„„„…………………………………‡ˆ‡„€‚ƒƒ‚‚„†…ƒƒ‚‚ƒ„…ˆ‡‡……„„„€€€€€€€€€€€€€€€€|‚†ˆŠŠŠ‰‹ŒŠˆ†††ˆˆ„~{||z||||{{{{}}}~~~~~€€~~~~||}{‚‚ƒƒƒƒ††ƒƒ……‚€€~~~}{~yvy||€€‚‚‚}~€€~~€~}{z|{yxwvvvtuvxxxxwtxyusvxxwwwussvxxvuutssuuttvz~€€€€~}|{zwxxwy~€€€€€€€€€~{xux{|{z{}||{zzzzz|{{zz{|}~~}|{||}}~€}zx{|~~}||}€}||}€|}‚ƒƒƒ„„„……†††ƒƒ…………ƒ‚ƒ‚‚ƒ‚€~}}}€€~{||}~€€~~}}|}}}}||~ƒƒ‚‚ƒƒƒ‚‚„†‡ˆ‡„€„………„ƒƒ„…„‚ƒ†…€}~zy{~|xx|€€€€€€€€€€€€€€€€‚„ƒ|}~}|||}~~„‡‰ˆ††‡‡‡‡‡‡‡‡‡…†‡ˆ‡‡†……†††‡‡‡‡„…‡Š‹‹ŠŠ‹Šˆ‡†………ƒ‚€€‚ƒƒƒƒƒƒƒƒƒƒ‡‰‰‡„‚‚‚‚‚ƒ„…†ƒƒƒƒƒ‚„„„„†ˆ‰‹‰ŠŒŽ‘’’‘“”•”“““‘‹†„‚‚†‹‹Š‰‰‰‰Š‰‰ŠŠŠŠ‰‰Š‹‹‰†„„…ƒ€~~~|}€ƒ‚ƒ…‡†……ƒ€€‚‚‚‚‚‚‚‚‚‚€€ƒ‡‰ŽŒŠˆˆˆˆ‰‰‰ŠŠŠŠŠŒŒŽŽŒ‰†„ƒƒ…‡‡…„††††…„‚„†ˆ‡„‚‚‚ƒƒƒ„……††„ƒ‚‚‚ƒƒƒ‚‚„ƒ‚‚‚ƒƒ„ƒƒ…††……„………ƒ„„„„„„„………………………‡ˆ‡„€‚ƒƒ‚‚„……ƒ‚‚‚‚‚‚‚‚ƒ‚‚ƒ„ˆˆ‡††††‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆŠŠŠŠŠ‰ˆˆ‰ˆ„}z{|{{{zyyyyy||~€€€~~~||~€€‚„…„ƒ…„ƒƒ…†††‚‚€|}~|zy|€‚„„‚€€‚€€}{{|||{zyyxvuttuuvvvvvvyxvvwxxxuuuuuuuvttstuutstssvz}~}€€‚}{z~€|yzzwx|€‚€€€€€€€~}{{{{{{||{{{{{{{{zzzz{{{{|}~~~~}|~~~~~~~~}|{zz{|}}}}~~€|}‚ƒ„……„„„ƒ„…††…„…‡†ƒ‚ƒ‚€~}}}}}~~~~~~~~||}~~}||€~‚ƒƒ‚‚‚‚ƒ„„ˆˆˆ„‚„ƒƒ„„„ƒ‚‚„„„„ƒ€z{{zz|‚€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}~~}†‰‰ˆ‡ˆ‡‡‡‡‡‡‡‡††††‡‡‡†††††††††…‡ˆŠŠ‰ˆ‡‰ˆ‡…„ƒƒƒ€€€€‚‚ƒƒ„„ƒ…‡‡†…„…„‚‚„†††€‚„„ƒ‚‚ƒƒ‡‰‡†ˆ‰ˆŒŒŽ‘“””••••””“•’Œ……ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‰ˆˆ‡††‚~|}}|‚ƒ‚‚ƒ†‡‡†„ƒ‚€€€ƒ„ƒƒ…ŒŠ‰ˆˆ‰‰Š‰‰‰‰ŠŠ‹‹ŒŒŒŒ‹Š‰‡†…„ƒƒ„„…………………………………………†††……………†…„‚ƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ…†……„………………††††……††††††††††††…„‚‚‚‚‚€€ƒ„„‚€ƒƒ‚‚€€‚‚‚ƒ„†‡††††††††€€€€€€€€€€€€€€€€||„ˆŠ‰ˆŠŠŠŠ‰‰ˆˆ‰ˆ„}z{|zzzzzzz{{{{|}~~€~€€€€€€€€ƒƒ‚‚„…†…„…„‚ƒ„††…‚ƒƒƒ‚€€€}zyz|€‚ƒƒ€€€€€~|ywxzz{zyyxvuutuuuvvvvvxwuvxyyyvvvvvuuuvuttuvutsssvz}~}}~€~|zy~|yzywy|€‚€€€€€€€€~}||{{{{{{{{{{{{{{zzzz{{{{}}~~}}||||||||~}||}~||}}~~~}~€‚ƒ„„„„„ƒƒ„…†‡…„…‡†ƒ‚€‚‚‚€~}}}~~}|}€~}}}|}~~€~~‚ƒƒ‚‚‚‚‚ƒƒ„ˆˆˆ…€‚…ƒƒ„„„ƒ‚‚ƒƒƒƒ‚~z{zzz|€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}~~~}†‰‰ˆ‡ˆ‡ˆ‡ˆ‡ˆ‡ˆ‡‡ˆ‡†††‡††††††††…†ˆ‰Š‰ˆ‡…„ƒƒ‚‚‚‚€€‚‚‚ƒƒ€‚…†††‡ˆ„ƒ‚ƒ………€‚„„‚‚ƒ„…‰ŒŒ‹Œ‹‰ŒŒŒ‘’“””•••••”—”…€€ƒ‡ŠŠŠŠŠŠŠŠ‰‰‰‰‰‰‰‰ŠŠ‰‰‡‡††ƒ}}}|~‚ƒ‚‚ƒ†‡‡†ƒƒ‚€€€ƒƒƒƒ…‹‹‰‰ˆ‰‰Š‰‰‰‰‰ŠŠ‹‹ŒŒŒ‹‹Š‰‡†„ƒƒƒ„„„„„„„„„„……………………„„„„„„„„…„ƒ‚‚ƒƒ‚‚‚‚‚‚‚‚€‚ƒƒ‚‚ƒ……………„………………†††……††………………††††…„‚‚‚‚‚‚ƒ……ƒ‚‚‚‚‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰Š‰‰ˆˆ‡‰ˆƒ|y{|zzzzzz{{|{zzz{}}}~€€€€€‚‚‚~|}~ƒ…ˆ‰‰ˆ…ƒ‚‚„……„„„…„„‚€‚€~|||{z~€‚‚€€€€€}zvtuwyzyyxwvvuuuuuvvvvvvutvz|{zxxwwvvuuwuuuvvvutssv{}~}|}~~|{y~{yyywy|€€€€€€€€€€~}}}||{{zz{{{{{{{{zzzz{{{{}~€€~}}}}}}}}}€~~€€}}~~~~€ƒƒƒƒ„„„ƒ„„††…„…‡†ƒ‚ƒ‚€~|}~€~~|{|€}|||||}~}}‚ƒƒ‚‚‚‚‚„„ˆˆˆ„‚„ƒƒ„„„ƒƒ‚‚‚ƒ‚‚€~}zz{zz{~€€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}}~~}†‰‰ˆ‡ˆˆˆˆˆˆˆˆˆ‡‰Š‰†…†ˆ††††††††„…‡‰‰ˆ‡†‡†…ƒ‚€€€€€‚„…††‡ˆ…‚ƒ„„ƒ€‚„ƒƒ‚„…ˆ‘‘Ž‹ŒŒŒŽ’’“””•–––•˜”„~‚…‰‰‰‰‰‰‰‰ˆˆˆˆˆˆˆˆŠŠŠˆˆ†††„€~}}|~ƒ‚‚ƒ†‡‡†„ƒ‚€‚€€‚‚„†‰‰ˆˆ‰‰ŠŠ‰‰‰‰‰‰ŠŠ‹‹ŒŒŒ‹Š‰†…„ƒƒƒƒ„„ƒ„ƒ„ƒ„„„ƒ„ƒ„ƒ„„ƒƒƒƒ„ƒ„ƒ„ƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ…………„„„………………†……………………………††††…„‚‚‚‚‚‚„†…ƒ‚‚‚‚‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰‰‰‰‰ˆ‡ˆˆƒ|y{{zzzzyzz{{zyxxy|}}~~‚‚|{|}€‚…‡ŠŠ‰„ƒƒ„ƒƒ…†…†…„‚‚~||}{|~€€€€€€€~zxutuwxxyyxwwvuuuuuuuvvwussw|}{zyyxwvvuuuuvwwussssvz}~}|~€€~}y}{xyxvz}€€€€€€€€€€}~~}|{{zz{{{{{{{{zzzz{{{{}~€€~}~~€€~€‚‚‚‚‚„„ƒ„ƒ…†‡…„…‡†ƒ‚€‚‚‚€~~~€€€~}}||}€~|}~~~~}|~ƒƒ‚‚‚‚‚ƒƒ„ˆˆˆ…€…„„„„ƒƒƒƒ‚‚‚}}z{zzy{}€€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}}~~}†‰‰ˆ‡ˆˆˆˆˆˆˆˆˆˆŠ‹Š‡…†ˆ‡‡‡‡‡‡‡‡„…‡ˆˆˆ†…ˆ‡†ƒ‚€€‚€€‚€€€€€€€€‚„……„„…†…ƒ‚„ƒ‚‚ƒƒ‚ƒ…‡‘“’‘‘ŽŒŒŒŽ‘’’“”•––––•’‹„~~‚†ˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰ŠŠ‰‰‡‡††„~~}|~ƒ‚‚ƒ†‡‡†ƒƒ€ƒƒ†‡‡‡ˆˆŠŠ‹‰ˆˆˆˆ‰‰ŠŠ‹‹ŒŒ‹ŠŠ††„ƒƒƒ„„ƒƒƒ„ƒ„ƒƒ‚‚‚‚‚‚‚‚ƒ„„„„………ƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚€‚ƒ„‚‚ƒ………„„„……………………………„„………………††††…„‚‚‚‚‚‚‚ƒ…††„‚‚‚‚‚‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆˆˆ‰‰‰ˆˆˆˆ‡‚|yz{yzzzyyyyyzyxwx{~€~~~~~}|€€€€‚„‚‚ƒ„††…„„‚€€‚‚„…………„ƒƒ‚|}€~zy|~€€€€€~}wvvwxxwvxxxwwvvuvvuuuvwwurrw~~zzzyxwvvursuvxvsqtssv{}~}|}€€~}x}~zxxxv{}~€€€€€€€€€~~~~||{zz{{{{{{{{zzzz{{{{}~~}||}}}}}|~}~}}}}}}~€‚‚‚‚„„„ƒ„„††…„…‡†ƒ‚ƒ‚€~€€}|{}~~~~€€€€~}{|}ƒƒ‚‚‚‚‚‚„„ˆˆˆ„‚„„„ƒƒƒƒƒƒ‚‚~|{{{zzz~€€€€€€€€€€€€€€€€€ƒ…„|}}}}}|||}~~}†ˆ‰ˆˆˆˆ‡ˆ‡ˆ‡ˆˆˆ‰Š‰‡†‡ˆ‡‡‡‡‡‡‡‡„…‡ˆˆˆ†……„ƒ‚€€€‚‚‚‚€~‚ƒ„„ƒ„…‡‡…ƒ‚ƒƒƒ‚‚ƒ‚‚ƒ†‰‘””‘‘Ž‘’’’“”••••‘Ž‰‚~„ˆˆˆˆˆˆˆˆˆŠŠŠŠŠŠŠŠŠŠŠˆˆ†††„€~~~|‚ƒ‚‚ƒ†‡‡†„ƒ‚€€ƒ€€ƒ………‡‡‰‰ŠŠˆˆˆˆˆˆ‰‰ŠŠ‹ŒŒ‹‹Š‡‡…„„„……„„„„„„„„„„„„„„„„……††‡‡‡ˆ„ƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ……„„„„„……†……„„„…†„„„……………††††…„‚‚‚‚‚‚‚ƒ…††„‚€‚‚‚ƒ‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆˆ‰‰‰‰‰ˆˆˆ‡‚{xzzy{{zyyyyyzyyxyz|}~~~~~}{{~}~€‚€€€‚„…„ƒƒ€€€‚‚ƒ„„„ƒƒ…‚€{wwz|~~~€€€€~}|uvvxyywuxxxwwvvvvvutuvwxvssx‚~yyyxxwwvvrstvwvsqsssvz}~}{|}~~}{zx|~zwxwu{}~~€‚€€€€€€€~~~}}||{{||||||||zzzz{{{{|}}~~}}|{{{{{{{{z{{|||{z{{{{zzyy{|~€‚ƒƒƒ„„ƒ„„…†‡…„…‡†ƒ‚€‚‚‚€~€€€€€~}|{~€€~}~€~}}}}}{{z}€ƒƒ‚‚‚‚‚ƒƒ„ˆˆˆ…€…„„ƒƒƒƒƒƒ‚‚‚ƒ€~}|}|{z{~€€€€€€€€€€€€€€€€€ƒ…„|}}}}||||}}~}†‰‰ˆ‡ˆ‡‡‡‡‡‡‡‡ˆ‡‡‡ˆˆˆˆ‡‡‡‡‡‡‡‡„…‡‰‰ˆ‡†ˆ‡…„‚€ƒƒ‚‚ƒƒ‚‚€~~€‚ƒƒ…ˆŠ‰‡„ƒƒ„‚‚ƒƒ‚‚„‡Š”•”Ž‘‘ŽŽŽŽ‘’‘’“”””””Œ†}„‰‰‰‰‰‰‰‰‰‹‹‹‹‹‹‹‹ŠŠ‰‰‡‡††ƒ€}~~~€ƒƒ‚‚ƒ†‡‡†ƒƒ€‚€‚„„…†ˆˆ‰ˆˆˆˆ‡‡‡ˆˆ‰‰Š‹ŒŒŒ‹‹‰ˆ‡†……†‡……………………ˆˆ‡ˆ‡ˆ‡ˆ…††‡‡ˆ‰‰†…„ƒ‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚€‚ƒ„‚‚ƒ……„„„ƒ„„…†…„„ƒ„…†„„………†††††††…„‚‚‚‚‚‚„†…ƒ‚‚‚‚‚‚‚ƒ„†‡††††††††€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰‰ŠŠ‰‰‰‡‡‚{xzzy{{{zzz{{zzzzzz{{||}}}}|{~|zyz{||~€„…†…ƒ€€€~‚ƒƒ„„…ƒ{xux{}}~€€€€~|{uuuvxxwuxxwwwwvvwvuttuwxwtsy€ƒ}wwwwwwwwwutttvuustssvz}~}|}~~~|zyw|~zwxwu|}~~~€‚€€€€€€€~}}}}}|}|||||||||zzzz{{{{{{|}}|{{zzzzzzzzzz|}}|{z|||{{zzzxz}‚ƒ„…„„„ƒ„…††…„…‡†ƒ‚ƒ‚€~~~~}~~~~~}||||}{zz|€ƒƒ‚‚‚‚‚ƒ„„ˆˆˆ„‚„…„ƒƒ‚ƒƒƒƒƒ„ƒƒ~~~}|{|€€€€€€€€€€€€€€€€ƒ…„|}}}}||||}}~}†‰‰ˆ‡ˆ‡‡‡†‡†‡‡‡…„…ˆŠ‰‡‡‡‡‡‡‡‡‡…†ˆ‰Š‰ˆ‡‹‰‡„ƒ‚„ƒ‚‚‚‚ƒ„ƒƒ‚€~}€‚ƒ…ˆ‹‹ˆ†„…„ƒ‚‚ƒƒ‚‚„ˆ‹”––’‘‘’“‘’’“““’’Œ‡€|}‚‡ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‰ˆˆ†††‚}~…ƒ‚‚ƒ†‡‡†„ƒ‚€€€€‚‚ƒ„…†‡ˆˆ‡‡‡‡‡‡‡ˆˆˆ‰Š‹‹ŒŒŒ‹‹Šˆ‡‡‡ˆˆ††††††††ˆ‡ˆ‡ˆ‡ˆˆ„„…†‡ˆˆ‰‰ˆ†„ƒƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ……„„ƒ„„„…†…„ƒƒ„…†„„……†††‡††††…„‚‚‚‚‚‚ƒ……ƒ‚‚‚‚‚‚‚ƒ„†‡……………………€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰ŠŠŠŠ‰‰‡†‚{xyzy|{{{||}}z{{|{zyyz{|}}}}}~||}}}~€ƒ……„ƒ~€~|}‚ƒ„„‚€}{tw{|}}€€€€}|{vtssuvwvxwwwwwwvwvuttuwxxutyƒ}uvvwwwwwwxvtstvvwsssvz}~}~€€}{zw|}zwwwu|}~~}~€ƒ€€€€€€€~||}}}}}}||||||||zzzz{{{{zz{||{zz||||||||z{}~~}{z€€~~}}wy|‚„…†„„ƒƒ„…†‡…„…‡†ƒ‚‚‚€~~~~~~€€€€~}~~€€~zyz|€ƒƒ‚‚‚‚‚‚ƒ„„ˆˆˆ„€‚„…„ƒ‚‚ƒƒ„„„„„ƒ‚€~~~}||€€€€€€€€€€€€€€€€ƒ…„|}}}|||||}}}}†‰‰ˆ‡ˆ††††††††‡„„‰‹‰†ˆˆˆˆˆˆˆˆ…‡ˆŠŠ‰ˆ‡Š‰‡†„ƒƒƒ„ƒƒ‚‚ƒƒ„„ƒƒ€~}‚‚‚‚ƒ†ˆŒ‰†………ƒ‚ƒƒƒ‚‚„ˆŒ”—˜”’’‘‘’“‘’’’’’‘‘‘Ž‡€||€…ŠŠŠŠŠŠŠŠ‰‰‰‰‰‰‰‰ŠŠ‰‰‡‡††~}~€‚†ƒ‚‚ƒ†‡‡†ƒƒ‚€€€‚‚€‚„…†ˆˆ‡††‡‡‡‡‡‡ˆˆ‰Š‹ŒŒŒŒ‹Œ‹Šˆˆˆ‰‰‡‡‡‡‡‡‡‡……………………ƒƒ„…†‡‡ˆ‹Šˆ…ƒ‚ƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ…„„„„ƒ„„„†…„ƒƒ„…†„………††‡‡††††…„‚‚‚‚‚€€ƒ„„‚€‚‚‚‚‚‚‚ƒ„†‡……………………€€€€€€€€€€€€€€€€~}‚‡‹ŒŒ‹‹Œ‹ŠŠŠ‹‹ˆƒ~{yzz{||yz|}|{}}zy{||}|{{}}|{}€€}{~€€„‰Šˆ†‚~}|}€~~€€……„ƒ€wwwwy|~~~}|{utsuxyywuuvvvvvvvvvvwwwwrsw{|yxxxvuvwyyywtrrsurrsw|~}|}~~~|zyz{vvxxz}€€€€‚€€€€~€€€~}{{{}}||||||||{{{zzzyyz{}~€~~~~~~~~}wy{~‚ƒ„…„…„…„…„……†…‚€€€‚ƒ‚€~~}||||~~~~}}~~€~}~€~~|{|‚ƒ‚ƒƒƒ‚ƒƒ„…†††…ƒ‚ƒ„ƒƒƒƒƒƒ‚‚ƒƒ‚‚€€€~~}}}}€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ„ˆˆ‡ˆˆ‰Š‰ˆ‡ˆ‰†…†ˆŠ‰†„†††…ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒ„„……‰ŠŠ‰†„ƒƒ‚ƒƒ„‡Š”–—”Ž“Ž‘“’‘‘‘‘’“ˆƒ}{€ˆŠ‰‰Š‹Šˆ‡„†‰Š‰‰Š‹ŠŠŠŠˆ†…ƒ‡„ƒ„ƒ‚ƒ…ƒ‚‚ƒ†‡‡†ƒƒ‚‚‚€‚‚‚‚‚‚††††‡‡‡ˆ†††‡‡‡‡‡ˆ‰ŠŒŽŽŽŠ‡†‡‡†…‚‚‚‚ƒƒƒƒ€€‚„„ƒ‚‚‚ƒ„ˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚ƒ„„‚‚‚ƒƒƒ„‡†„„……ƒ‚„„„……††††………………†…‡ˆ‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚ƒ‚‚‚‚ƒ„ƒ‚‚ƒ„†‡‡‡†…„ƒ€€€€€€€€€€€€€€€€||}†‰ŠŠŠ‹‹‹Š‰ŠŠ‹ˆƒ~zzzz|}|zy{{z{~}zxz{{|zyz|}|z}€}€€ƒ„ƒƒ…†††‚€}~€~~€€€~~}}yxwxy{}€€€~|zyutstwxwvvvvvvvvvvvvvwwwwrsw{|yuwyyxwwwzxwvwxyywsqu{}zxyz{{zxwy{vvxxz}€€€€‚€€€€~€€€€~}|{|}}||||||||{{zzzzyyz{}~€~~~~~~~~~~~~~~~~~~yz}€‚„……„…„…„…„…„………‚€€‚€‚‚‚€~{|}~~~~~~~~~}}~~}~~~~}~|{|‚ƒ‚ƒƒ‚‚ƒƒ„…†††…ƒ‚ƒ„„„„„ƒƒ‚‚„ƒƒƒ‚€~~~~€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡†‡†‡ˆˆˆƒ…ˆˆ‡ˆ‡‰‰‰‡†‡ˆ……†ˆŠ‰‡„…†…„‚€ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒ„„„……‰ŠŠ‰†„ƒ„€‚ƒƒ…ˆŠ“•—•‘‘“’“’‘‘‘‘’Ž‰„}{‰ŠŠ‰ŠŠŠˆ‡…‡ŠŠ‰ˆˆŠ‰ŠŠŠˆ‡…„‡„‚ƒƒ‚…ƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚‚‚‚‚……†††‡‡‡†††‡‡‡ˆˆˆ‰‹ŒŽŽŽŠ‡†‡ˆ†…‚€‚ƒ„€€€‚ƒˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚ƒƒ„‚‚‚ƒƒƒ„„„……„„……„„„……††††………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚€‚‚ƒ‚€‚ƒƒ„„…„ƒ‚‚€€€€€€€€€€€€€€€€{{|…ˆŠ‰‰Š‹Š‰‰‰Š‹ˆƒ~{yzz}}|zzzzy|~~zxyzzzyyz|}}{~€‚€€„…„„…†‡…‚‚‚‚~€€€}}}}}}}}zyxwyz|}}zywvuttuvutvvvvvuvvvvvvwwwwstw|€}zuwyyxwwwzwux|€€~wqsz}xvwyzzyxwy{vvwwz}€€€€‚€€€€~€€€€€~}|||}}||||||||{zzzzyyyz{}~€~~~~~~~~~~~~|}}~€€z{~€ƒ…††…„…„…„…„ƒ„…„ƒ‚‚ƒ‚€~}~€€~|{}~€€~}|}}~~}}}~~|{|‚ƒ‚ƒƒ‚‚‚ƒ„…†††…ƒ‚ƒ„………„ƒ‚‚‚„„„„ƒƒƒƒ†……„„„„ƒ€€€€€€€€€€€€€€€€ƒ†…}}|{|||{||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ‚„ˆˆ‡ˆ‡ˆ‰‡…„…†ƒ„…‡‰ˆ†„…††…ƒ‚‚‚‚‚‚ƒƒ„„„ƒƒƒƒƒƒƒƒƒƒ„„„………‰Š‹‰‡„„„€‚ƒƒ„…ˆ‹“––”’“”‘‘’““’‘‘‘‘’Š„€~}}ƒ‹Š‰‰‰‹Šˆ‡†ˆŠŠˆ††‡ˆˆ‰‰ˆ‡…„†ƒ‚‚‚€‚…ƒ‚‚ƒ†‡‡†ƒƒ‚‚‚€‚‚€…………††‡‡††‡‡ˆˆˆˆ‰Š‹ŒŽŽŽŠ‡†‡‡‡…ƒ‚‚€~€€‚ƒ€‚ˆ‡†ƒƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒ„……„„…†„„„………†††………………†…‡‰‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚€€€‚€€€‚€‚‚‚€€€€€€€€€€€€€€€€|{|€…‰ŠŠŠŠ‹Š‰‰‰Š‹ˆƒ~zzzz|}|{zzzyx{{yx{}}zzy{~€€‚€€€€‚„……†‡‡ˆƒƒ‚~€€€€}}}~~~~yxwwxz|~€€}{yxvuuttttsvvvvuvuuvvvvwwwwstw|€€}zxxxwuvxzxutx€……‚ƒ}wvz}}{wyz|||{zy~€{uuwwz}€€€€€€€€€€€€€~~}}}}}}||||{{zzzzyyyyz{}~€~~~~}}}}}}}}{||~€y{}€‚„…†„…„…„…„…ƒ„……ƒ‚‚ƒ‚€‚‚‚€~€€~}|}~€~}}~~}|}~|{|‚ƒ‚ƒ‚‚‚‚ƒ„„†††…ƒ‚ƒ„„„ƒƒ‚‚‚‚……………„„„‰‰ˆˆ‡‡‡‡€€€€€€€€€€€€€€€€ƒ†…}}|{|||||}}}|~ƒ‰‰‡†‰‡‡†‡†‡ˆˆˆ„…ˆˆ‡ˆ†‡ˆ†ƒ‚‚„‚„†‡‡…„………„‚‚‚ƒ‚ƒƒ„……ƒƒƒƒƒƒƒƒƒ„„„„……†‰Š‹Š‡…„„ƒ„…„†‰ŒŽ‘•—–”””’‘’”““’‘‘‘‘’‹…€~„‹ŠŠ‰ŠŠŠˆ‡‡‰Š‰†„ƒ„†‡ˆˆˆ‡†…†ƒ€€„ƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚€€€„„„……††††††‡ˆ‰‰‰ŠŠŒŽŽŽŠ‡†‡ˆ†………„ƒ€€~~~€€~~}~~€‚ˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚ƒ‚‚ƒ‚ƒƒ„……†…„ƒ„„„„„„…………†………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚€€~€‚‚‚‚‚€€€€€€€€€€€€€€€€}}~‚‡ŠŒ‹‹‹Œ‹ŠŠŠ‹‹ˆƒ~{yzz{{{{{zzz{}}yxyzy|{{}ƒ„ƒ…ƒ€~~~€ƒƒƒ…††……€‚~}~€€||||}}~~wvvvx{~}}~}}{zyvvvutssswvvvvuuuvvvvwwwwsux}€~zwwwvuuwyussx†…‚…ƒ|z{~€yz}~~}|x~€zuuwvz}€€€€€€€€€€€€€€~~}}|}}}||{{{zzzyyxxxz{}~€~~~~}}}}}}}}{|}}€xy|~‚„„…„…„…„…„ƒ„†…„‚ƒƒ‚ƒ‚€~|}~€€€~~~}€~}~~|{|‚ƒ‚‚‚‚‚ƒ„†††…ƒ‚ƒ„ƒ‚‚‚‚ƒƒ……………………†††……„„„€€€€€€€€€€€€€€€€ƒ†…}}|{|||{||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ‚„ˆˆ‡ˆ‡‡ˆ…ƒ€‚ƒ†ˆ‰ˆ‡‡„„„‚€‚‚ƒƒ„……„„„„„„„„„„„„……††Š‹‹Šˆ……„‚ƒ………‡ŠŒŽ”––•””’‘“””“’‘‘‘‘’ˆ‚€€€„‰Š‰‰‰‹Šˆ‡‡‰Šˆ…ƒ‚‚……‡‡ˆ‡‡††‚~€„ƒ‚‚ƒ†‡‡†ƒ‚ƒ‚‚€‚€€€ƒƒ„„…„……††‡‡‰‰ŠŠŠ‹ŒŽŽŽŠ‡†‡‡‡…ˆˆ‡†„ƒ‚‚~}|||}~~~~~€‚ƒˆ‡†ƒƒ‚‚‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚ƒƒƒƒ†…„„……„ƒ„„„„„………†………………†…‡‰‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€€€‚ƒƒƒƒ€€€€€€€€€€€€€€€€~~ƒ‡‹ŒŒ‹ŒŒ‹ŠŠŠ‹‹ˆƒ~zzzz{zz|{zyz|~}zwxyx|{|ƒ†‡‡ˆƒ~}~€€ƒ††…„€€~}~~~~~~~~{{z{zzzzvuuvx{~|}}}||zzuvwvtsttwwvvuuuuvvvvwwwwtux}~{suwwvuuuutuz„ƒ„…„€|{}z{}~~~|{x~zttvvz}€€€€€€€€€€€€€~€~}|~~}}{{zzzzyyxxxxz{}~€~~~~~~~~~~~~|}}~~€€wy{~€‚ƒƒ„…„…„…„…„…††„ƒ‚‚‚€‚‚‚€~|}~€€€~~~~€~~~~|{|‚ƒ‚‚‚‚ƒ„†††…ƒ‚ƒ„‚‚‚ƒ„„„„………††‡‡††…………€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡†‡†‡ˆˆˆ„…ˆˆ‡ˆ‡ˆˆ†‚€€‚…ˆŠ‹ŠŠŠ‡‡…„‚‚ƒ„‚‚‚ƒƒ„„„„„„„„„„„„…………††‡Š‹‹‹ˆ†……ƒ„…††ˆŠŽ’”••””’‘‘’“““’‘‘‘‘’“‹ƒ€€ƒ‡ŠŠ‰ŠŠŠˆ‡…‡‰‡…‚‚‚ƒ„…‡‡ˆ‡‡…~~}}ƒƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚€‚‚ƒƒƒƒ„„„…†‡ˆ‰Š‹‹‹ŒŽŽŽŽŠ‡†‡ˆ†…ˆˆˆ‡†……„€~}|}}~‚„…ˆ‡…„‚‚‚‚ƒƒ‚‚‚‚€‚‚‚‚ƒƒ„„ƒƒ„…††…„„„„„„„„†………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚‚ƒ‚ƒ‚‚‚€€€‚‚‚„„„ƒ‚€€€€€€€€€€€€€€€€}|~†Š‹‹Š‹‹‹Š‰ŠŠ‹ˆƒ~{yzz|{{||yxyvyzxx{}}zz{~ƒ‡ˆˆˆƒ~~}~€~}€„†……‡ƒ€€~‚}}}}}}}}}||{zyyxwvvvxz|~}}~}|zyxuvwvutuvwwwvvuutvvvvwwwwtvy}~{rtvvutttvxz~‚‚‚‚‚€}|||||~}|zw}yttvvz}€€€€€€€€€€~€€€}|~~}||{zzyyyyxxxxz{}~€~~~~~~~~~~~~~~~~~~~xy|‚ƒ„„…„…„…„…„…†‡†„‚‚‚‚ƒ‚€~~~}|~~~~~~~~~|{|‚ƒ‚‚‚ƒƒ†††…ƒ‚ƒ„„ƒ‚‚‚ƒ„…ƒƒƒ„……††‰‰‰ˆˆ‡‡‡€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ‚„ˆˆ‡ˆ‰‰‰†‚€‚…ˆŠ‹ŠŠ‹‰‰ˆ…„ƒ„…ƒƒƒƒƒƒƒƒ………………………………††‡‡Š‹ŒŠˆ†……ƒ…††‡ˆ‹Ž‘’“””‘‘‘‘‘“”’‘‘‘‘’“‰€‚…Š‰‰‰‹Šˆ‡„†‡‡„‚‚ƒ‚ƒ…†ˆˆˆ‡…€}|||ƒƒ‚‚ƒ†‡‡†ƒƒ‚‚‚€‚‚‚‚‚‚‚‚‚ƒƒ„„…†‡ˆ‰Š‹ŒŒŒŽŽŽŠ‡†‡‡‡…†††††††…„ƒ‚€€€ƒ„†‡ˆ‡…ƒƒ‚‚‚ƒƒ‚‚‚ƒ‚€€‚‚‚ƒƒƒƒƒƒƒ„…†††„„„„„„„„†………………†…‡‰‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚ƒ‚ƒ‚€‚ƒ‚‚ƒƒƒ‚€€€€€€€€€€€€€€€€€{{|€…ˆŠ‰ŠŠ‹Š‰‰‰Š‹ˆƒ~{yzz}{{}{xww{}}ywxyxyxz}‚†‡‡‡‚~}~€ƒ††„„‡…‚€„}}}}}}||€€~|{zzxwvvwy{|}{ywvtvxwutvxwwwvuuttvvvvwwwwtvy~‚{tttsrrtvx{‚€~~}zx}~€~|{w}~yttuvz}€€€€€€€€€€€€~€€}|~~}}{{zzyyyyxxxxz{}~€~~~~~~~~}y{}€ƒ…††„…„…„…„…†‡‡†„‚‚‚‚€~€}}}}~}~€€~~}|}~~|~|{|‚ƒ‚‚‚ƒƒ†††…ƒ‚ƒ„†…„ƒƒƒ„…‚‚ƒƒ„……†ˆ‡‡‡††††€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡††‡‡ˆˆˆƒ…ˆˆ‡ˆ‰Š‰†‚€€ƒ‡‰‰ˆ‰Šˆ‡†ƒ‚ƒƒƒƒƒƒƒ‚……………………………††‡‡‡Š‹Œ‹ˆ†……ƒ…†‡‡ˆ‹Ž‘‘’““‘’‘’”’‘‘‘‘’‡~}~…Š‰‰ŠŠŠˆ‡‚„††„‚‚ƒ‚„†‡ˆˆˆ„€||{|ƒƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚‚‚‚‚‚‚‚‚ƒƒƒƒ…†‡ˆ‰‹ŒŒŒŽŽŽŠ‡†‡‡†…„„„„…………‡†…ƒƒƒƒ„‚‚‚ƒ„†ˆ‰ˆ‡…„‚‚‚‚ƒƒ‚‚ƒ‚€€€‚‚‚ƒƒƒ„„…†…„ƒ„…„„„„„„„„†………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚€‚‚€„ƒ‚‚ƒ„‚‚‚‚‚€~€€€€€€€€€€€€€€€€€‚‡‹‹ŠŠ‰‰ˆˆ‡ˆ‡‚|yz{y{{{zyxxx|}}{yxy{|yxy„ˆŠ…„‚€€€‚ƒ…†‡‡ˆ‡~~‚€€|}~~}|€~}|}}}|||{{{{{{~}|{yxwvuuuuvvwxwvvuuuvvvvvvvvvvttv{‚}yuvvussux~„„~zz{{{{||{}~~|zxz{|zwuvxy~‚€€€€€€€ƒ€~€€~€€€€}{}{zyz{||{zxxwww{|}€€€€€‚‚‚€€~€{{|~ƒ…††………………………………„ƒ‚€€‚}~~~~~~~~|}~~}|~}}}~~}|}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†„‚‚ƒ‚‚‚‚‚‚‚‚€‚„…†††ˆ‡‡††……„€€€€€€€€€€€€€€€€‚ƒ‚€|z{}||||||||}„‰‰……‡‡‡‡‡ˆˆ‰‰ˆ†……‡‰‰ˆˆ‰ˆ„€ƒ„†ˆŠ‰‰ˆ†…„‚€€€‚‚ƒƒƒ„„„„„„„„„„„……„„„…††„…‡ˆˆ†„ƒ………‡‰‹‘‘‘‘‘‡}~ƒ‡‹Šˆ‰‹ŒŠ‰…„ƒ‚‚ƒ…†‡‡‡‡‡‡‡‡„‚~||~€ƒ…ƒ‚ƒ†‡†„„ƒ‚‚‚‚‚‚‚€€€€‚‚€€‚ƒ‚ƒ…„…†‡‰Š‹ŒŠ‹ŒŠ‰ˆ‡†††††…„„ƒƒ„„†…………„„„‚‚ƒ„…†ˆ‡…„‚‚‚‚„„ƒƒƒ‚‚‚‚‚‚‚‚ƒ‚ƒ………………„„„…„ƒ„………„…………††††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚€€€‚~€‚„„„ƒ‚€€€€€€€€€€€€€€€€†††ˆŠ‹‹‹‹‹ŠŠ‰ˆˆˆ‰‰„}z||{z{{{zzzz{||{xxy{{yx{€…ˆ‰ˆ†ƒ~~~ƒ„…†††ƒ|~‚€€€€}}}}|{zz{{|||}|{zywvuuuuuuvvwxwvvuuuuvvvvvvvvvttv{‚}yuvvussux€‚‚€~zzzzyyyy{}~~}zxz{|zwuvxy~€€€€€‚€~€~€€€€}{~}{zyz{|{{yxxwwx{|}€€€€€‚‚‚‚€€€~€€{z{~‚………………………………………„ƒ‚ƒƒ‚ƒ„„|||}~€~~}}}}~~~~~}|}~}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚ƒ„„„ƒƒƒ‚‚€ƒ„†††…ˆ‡‡††………€€€€€€€€€€€€€€€€€~|{{|||||||||}„‰‰†…‡‡‡‡‡‡ˆ‰‰ˆ†„…‡‰‰ˆˆ‰‡…€ƒ…‡ˆˆ‡†ˆ‡…ƒ‚‚ƒƒƒƒ„„„„„„„„„„„……„„„…††‡††…„………‡‡‡‰Š‘‘‘‘‘‘‘‘‘Žˆ‚}~‚‡‹Šˆ‰‹ŒŠ‰„„‚‚ƒ„†‡‰‰‰‰‰‰‰‰„‚||~€‚…ƒ‚ƒ†‡†„„ƒ‚€‚‚‚‚‚‚€€€‚‚‚‚€‚ƒ‚ƒ………†‡‰Š‹‹Š‹ŒŒŠ‰ˆ‡†††††…„„ƒ„„„„…„……………‚‚‚„…‡ˆ‡…„‚‚‚‚„„ƒƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ……………„„„„…„ƒ„………„……………†††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚‚‚€€€~€‚ƒ„ƒ‚€€€€€€€€€€€€€€€€ˆ‰ŒŒŒ‹‹‹‹ŠŠ‰‰ˆˆˆ‹Š…~{}}|zzzzzzzzy{|zywyzyyz}‚†ˆ‡ˆ†ƒ~~~€‚„…………‚~{|~}~€‚€~~‚~~~}{yxyz{}~€{zyxwutsuuuuvvwwwvvuuuvvvvvvvvvvttv{‚~yuvvussvx€‚~}}zzzyxwww{|~}{yz{|zwuvxy~€€€€€€€€~€}{}|{zzz{{{zyxxxxx||~€€€€€€€‚‚‚€€€€zyz}„…„………………………………„ƒ‚„‚‚‚„ƒ}}~}~~~~}}~~~~}}}}~~}}€}|}€ƒ„ƒ‚‚ƒ‚ƒ…‡‡‡„ƒ‚ƒ……„„ƒƒƒ‚‚„…†††…‡‡‡††………€€€€€€€€€€€€€€€€}|}||{||||||||}„‰‰†…ˆ‡‡‡‡‡ˆ‰‰ˆ†„„‡ˆ‰ˆˆ‰ˆ„€€ƒ…†††…‡†…ƒ€€ƒƒƒƒ„„„„„„„„„„„„…„„„„…††‰‡…‚‚ƒ…†ˆˆ‰ŠŒŽ‘’‘‘‘‘‘‘‘‘‘“Š‚~~‚†‹Šˆ‰‹ŒŠ‰ƒ‚ƒƒ„†‡ˆŠŠŠŠŠŠŠŠ…ƒ}|~€‚…ƒ‚ƒ†‡†„„ƒ‚‚‚‚‚‚€‚‚‚‚‚ƒ‚ƒ………‡‡‰‰‹‹‹‹ŒŒŠ‰ˆ††…†††……ƒƒƒ„„ƒƒ„„…†††„ƒƒ†ˆˆ‡†ƒƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ…………„„„„ƒ…„ƒ„………„„„…„…………„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚„ƒ‚€€€€€‚ƒ‚‚€€€€€€€€€€€€€€€€…‰ŒŽŒ‹‹ŒŠŠŠŠ‰‰‰‰Š‰„~{|}{{zyyyyxwxz{{yxxzxx{„‡ˆ†…„‚€€€‚ƒ……†††|{~}{|~~}~€~zxwxy|~‚ƒ||zyxwuuuuuuuvvwwwvvuuuvvvvvvvvvttv{‚}yuvvussux€‚€}z{||{zzxxvvz|}~}{yz{|zwuvxx~€€€€~€€€~~€€€€}{||{{{{{{{zyxxxxx|}~€€€€€€€€‚‚‚‚€€€~€€yyy}€„„„………………………………„ƒ‚€‚‚}~~~~}~}}|}~~}||}}€~}}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚‚ƒ„„„„ƒƒƒƒƒ„…††……„†††……………€€€€€€€€€€€€€€€€€}{{|}|z|||||||||~ƒ‰‰††ˆˆ‡‡‡‡ˆ‰‰‡…ƒ„†ˆˆ‡ˆ‰‡…€€ƒ…†††…†…ƒ€ƒƒƒ„„„„…„„„„„„„„„„„„„……†‡†„ƒ‚‚‚ƒˆˆˆ‰‹Ž‘‘‘‘‘‘‘‘‘Ž”‘Šƒ~~‚†‹Šˆ‰‹ŒŠ‰‚‚ƒ„†ˆ‰ŠŠŠŠŠŠŠŠŠ†„€}|~€‚…ƒ‚ƒ†‡†„„ƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ…†††ˆˆŠŠŠ‹ŒŒŒŒ‰‰‡†…†…††…„„ƒ„„„‚‚ƒ„…‡‡ˆ†„€‚†ˆˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€ƒ………„„„„ƒƒ…„ƒ„………„„„„…„………„‡ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚…„‚€€€€‚‚‚‚‚‚€€€€€€€€€€€€€€€€…ˆŽ‹‹ŒŠŠŠŠŠ‰Š‰ˆˆƒ|y{{z{zyyzyxwwy||{yyzyy{€…ˆˆ‡…„‚€€€€ƒ„……†…|{}~|{{}~~~}~~}{xvxz|‚„†~|{yyxvuuuuuvvwvvuuuvvvvvvvvvvttv{‚~xuvwussvx€~{xy{}}|{zyxxy{}~}|zz{|zwuvxx}€€~€€~~~~~€€}{{{{{|{{{zzyxxxyy|}~€€€€€€€‚‚‚€€€€yyz|ƒ„„………………………………„ƒ‚‚€€€‚}||}}~€~~}}}}~~}}~€€}}|}€ƒ„ƒ‚‚ƒ‚ƒ…‡‡‡„ƒ‚ƒ‚‚‚‚ƒƒƒƒ„„………„ƒ‚„„„„„„„„€€€€€€€€€€€€€€€€€}{z|}|z|||||||||~ƒ‰‰††‰ˆˆ‡‡‡ˆˆ‰‡…ƒƒ†‡ˆ‡ˆ‰ˆ„€‚…‡ˆ‡‡††…ƒ€ƒƒ„„…„……„„„„„„„„„„„ƒ„„……„„…„„‚€………†ˆ‹‘‘‘‘‘‘‘‘ŽŽ“‰‚}~‚†‹Šˆ‰‹ŒŠ‰‚ƒ„…ˆˆ‰Š‰‰‰ˆ‰ˆ‰‰‡…~}~€‚…ƒ‚ƒ†‡†„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ…††‡‡‰‰ŠŠŒŒŒŒ‹‰ˆ‡†…………†……ƒƒƒ„„‚‚ƒ„††‡ˆ†„‚…ˆˆ‡†ƒƒ‚‚‚ƒ‚‚‚€‚‚‚‚‚ƒ‚ƒ…………„„„„ƒ…„ƒ„………„„„„„…………„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚…„ƒ€ƒƒƒ‚‚‚‚ƒ€€€€€€€€€€€€€€€€ˆŠŒŒ‹‹‹ŠŠŠŠŠŠŠŠˆ‡‚{yz{y{zyz{}{zvz}~|{z{zz{„ˆ‰‰ˆ†ƒ~~~~€‚ƒƒƒƒ‚}z{{{{}}~€€~}~~}~~~|zwx{}€ƒ…†‚‚€}|{{vuuuuuuvwvvvuuuvvvvvvvvvttv{‚}yuvvussux€~|yxyz}}||{zyyy{}~|{z{|zwuvxw}€~€€~€~~~~~}~€€€€}{yz{|||{{zyyxxxyy}~~€€€€€€€‚‚‚‚€€€~€€zzz}„…„………………………………„ƒ‚ƒƒ‚ƒ„„}}}~~~~}}}~~~}}~}|}~€}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚‚ƒ‚‚ƒƒƒ„„„……„‚€‚‚‚ƒƒ€€€€€€€€€€€€€€€€€~||{|{z||||||||{}ƒˆ‰‡‡Šˆˆ‡‡‡ˆˆˆ‡…‚ƒ…‡‡†ˆ‰‡…€‚ƒ…‡‰ˆˆ‡ˆ‡†„‚‚„„„„„………„„„„„„„„„„ƒƒƒ„……ƒ„……ƒ~|ƒƒƒ„†‰‹Œ‘‘‘‘‘‘’’‘‘ŽŽŽ‡}}‚‡‹Šˆ‰‹ŒŠ‰ƒ„†ˆˆ‰‰‰ˆ‰ˆ‰ˆ‰ˆˆ‰†‚~}~€‚…ƒ‚ƒ†‡†„„ƒ‚€‚€‚‚‚‚‚‚‚‚‚‚‚€ƒ…‡‡‡ˆˆ‰‰‰ŒŒ‹‹‰ˆ††…………†…„„ƒ„„„ƒƒ„……††‡†„€€‚„†ˆ‡…„‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚‚€ƒ…††…………„„…„ƒ„………„„„„……………„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚ƒƒ‚‚ƒ„†…„ƒƒƒ„„€€€€€€€€€€€€€€€€†††ˆŠ‹Œ‹ŠŠŠŠŠŠ‹Š‰ˆƒ}z{|z|zyz|}|{wz~€}||}{{}‚‡Š‹ˆ†ƒ~~~~~€‚ƒƒƒ‚~{{|z{}~~~~~~~~~}}}~~}|yz|~ƒ…†ƒ‚€}|{vuutuuuuwvvuuuvvvvvvvvvvttv{‚~yuvvussux€}{yyzyyzzzzzzzzxz}~~}{z{|zwuvxw|€~~€~~}~~}~~}}€€}{yy{|}||{yyxxxxyz}~€€€€€‚‚‚€€~€{z{~‚…†…………………………………„ƒ‚„‚‚‚„ƒ~~~~}}}|}~~}|€€~|z{~€}|}€ƒ„ƒ‚‚ƒ‚ƒ…‡‡‡„‚‚ƒ‚‚‚ƒƒƒ„„ƒ„„ƒ‚~~€€€€€€€€€€€€€€€€€€€€}{zz{||||||||{}‚ˆ‰‡‡Šˆˆˆ‡‡‡ˆˆ†„‚ƒ…‡‡†ˆ‰ˆ„€‚ƒ…‡ˆˆ‡‡‰ˆ†…ƒƒ‚‚„„„„……††„„„„„„„„„ƒƒƒƒ„………„„‚~}‚‚ƒ„†ˆŠŒ‘‘‘‘‘’‘‘‘ŽŽŽŽŠ…|}ƒˆ‹Šˆ‰‹ŒŠ‰…†‡‰‰‰ˆ‡ŠŠŠŠŠŠŠŠ‰‡‚}~€‚…ƒ‚ƒ†‡†„„ƒ‚‚€€‚‚‚‚‚‚‚€€‚‚‚ƒ‚ƒ…‡‡ˆˆˆˆ‰‰ŒŒ‹Šˆ‡‡……„……†…„ƒƒƒ„„„„…………………„ƒ‚‚‚ƒ„ˆ‡…ƒƒ‚‚‚‚‚‚€€€‚‚‚‚‚ƒ‚ƒ…†††††…………„ƒ„………„………………††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚‚‚ƒ…†‰ˆ†„„„…†€€€€€€€€€€€€€€€€€‚‡ŒŠŠŠŠŠ‹‹‹ŠŠ…~{}}|}{yz{|zxw{€~}}~|z|‡‹…„‚€€€€ƒ„„„„€}|~~|zz}|{zz{|}~}||}~~~z{|ƒ…†‚‚~}|{vuuutuuuwvvuuuuvvvvvvvvvttv{‚}yuvvussux€|yxy{zyxxxxyyyyxz|~~}{z{|zwuvxw|€~}€~~}}~}~~}}€€€€}{xy{}}}|{yyxxxyyz}~€~€€€€‚‚‚€€~€€{{{~‚…††………………………………„ƒ‚€€‚}||}}~~~}}}}~~}{|}}}}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚ƒ„„„„„„ƒƒƒƒƒƒ~|}}~~€€€€€€€€€€€€€€€€€€€€~zyz{||||||||{}‚ˆ‰‡‡Šˆˆˆ‡‡‡ˆˆ†„‚ƒ…‡‡†ˆ‰ˆ„€‚…‡ˆˆ‡†ˆ‡†„‚‚„„„………††„„„„„„„„ƒƒƒƒƒ„„…‡…‚€~~~ƒƒƒ„†‰‹Œ‘‘‘‘‘‘‘‘ŽŽŽŠˆƒ~{}ƒˆ‹Šˆ‰‹ŒŠ‰†‡ˆŠŠ‰‡†‹‹‹Œ‹‹‹‹Š‡ƒ}~€‚…ƒ‚ƒ†‡†„„ƒ‚‚€€‚‚‚‚‚‚€€€€‚‚ƒ‚ƒ…‡‡ˆˆˆˆ‰‰Œ‹Šˆ‡†…„„„…†…„„ƒƒ„„†…………„„„„ƒƒƒƒƒƒƒˆ‡…„‚‚‚‚‚‚€€€€‚‚‚‚‚ƒ‚ƒ…‡‡††††………„ƒ„………„…………††††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚€€€‚…‡ˆ‹‰‡…„…†‡€€€€€€€€€€€€€€€€‚„‡ŠŒŒ‹ŠŠ‹ŒŠ‰‡†„|xyyyzzzzzvux~€}}~{{}€…ˆˆ‡‡†„‚€€€€‚ƒ„…zwxzz|{{{{{|}}{||{~€}z{|}~€€xwutttvwxwvutuuvyxxwvvuuttw{€|vutsstuvzzzzzxwvttuuwwxxzyy|€€|xy~~yvwxvx{€~~}}~~}}}}~~€€€€‚ƒ}yz{}~~}{zyyxxyz{|€€‚‚‚‚‚‚‚‚‚‚‚€{z{~‚…†……„„„„…††‡…………‚‚ƒƒ‚‚‚€|}~~~~€~~€€~}~€~|{|‚ƒ‚‚‚‚€„†ˆ‡…„ƒ‚‚‚‚ƒ„„ƒƒƒ…‚ƒ„…„{www{}~€€€€€€€€€€€€€€€€‚~~}|z{{{{{{{{}}ƒ…†‡‡‡‡‡ˆˆˆˆ„„‚€ƒ‰‹ˆ‡Šˆƒ€‚ƒ…‡‡‡†…‡†…ƒ‚‚‚‚„„…………„„……………………ƒƒƒƒ„…†‡………„ƒƒ‚‚ƒƒƒ„…††‡‹’““““‘‘ŽŽŽŽŽ‡†ƒ|}‚†‰Š‹ŒŒ‹Š‰‹‰‡††ˆ‹‘’““‘‹†}|…„ƒ‚ƒ†‡†„„ƒ‚€€‚‚€€‚ƒƒ„‰ˆ‡††ˆŠ‹‹ŒŽŽ‹‡…………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€ƒ‚‚‚‚‚ƒ‚„ƒ‚ƒ„………„ƒ‚ƒƒƒ„„………„„„……††††…‡‰†„‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚„ˆŒŠŒ‹†„†ˆˆ€€€€€€€€€€€€€€€€‚‚‚„‡Š‹ŒŒŒŠŠŠŠŒŒ‹‰ˆ‡†ƒ|zzzzzzzzwvy~|{}{{|…ˆˆ‡‡†…ƒ‚€€€€‚ƒ„……€{xyyz{~||||||{{z{{{}€|{{|}~€€zywuttuuwwvvuuuuxxwwvuuuttw{€|vvtsstvvzzzzyxwvsstuvwwxzyz}|yy~~yvwxvx{€~~}~~~~}}}~~€€€€€‚‚}yz{}~~}{zzyyyyz|}€€‚‚‚‚‚‚‚‚‚‚€{z{~‚…………„„„„…††‡…„…„‚‚‚‚‚‚€}~€€~~~}}}~~€~~€~|{|‚ƒ‚‚ƒ‚€ƒ†ˆ‡…„ƒƒ‚‚‚ƒ„„ƒƒ„„‚ƒ„…„|xyy|‚€€€€€€€€€€€€€€€€€€‚€~~~}|z{{{{{{{{|}~€ƒ„…†††‡ˆˆ‰‰††ƒ€ƒ‰Š‡‡Šˆƒ€‚ƒ…‡ˆ‡†…‡†…„‚‚‚‚„„…………„„……………………„„„„„……†………„ƒƒƒ‚ƒƒ„„…††‡‹ŒŽ‘’“““ŽŽŽŽ‡†ƒ|}†‰Š‹ŒŒ‹Š‰‰ˆ‡†‡‰ŒŽ‘’“”“’ŽŒ†}|…„ƒ‚ƒ†‡†„ƒƒ‚€‚‚€€‚‚ƒ„„‰ˆ‡†‡ˆŠ‹‹ŒŽ‹‡…………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€ƒ‚‚‚‚‚ƒƒ„ƒ‚ƒ……„„ƒƒƒƒƒƒƒ„„………„„„……††††…‡‰†„‚‚‚ƒ‚€€‚ƒƒ‚‚‚‚‚„ˆ‹Œ‹†ƒ†ˆˆ€€€€€€€€€€€€€€€€ƒƒ„…‡‰‹ŒŒ‹ŠŠŠŠ‹Œ‹Šˆˆˆ‡„}}||{zyyxwy~{z{{{}€…ˆˆ‡‡†…ƒ€€€€‚ƒ„„…|yyzyz|}}}}|{zy{||{}~||}}~€€|{ywutttvvvvvuuuvvvvuuttttw{€|wvuttuvwzz{zzxwvrrstuuvvyy{}~|yy}yvwxvx{€~~~~~}}~~€€€€€‚€}z{|}}~}|{{zzyz{|}€€‚‚‚‚€{z{~‚…†……„„„„…†††„„„„‚ƒ‚‚€~€€€~~~~}}}}}}€€€~|{|‚ƒ‚‚‚‚€„†ˆ‡†„ƒ‚‚‚‚ƒƒƒƒƒ„„‚ƒƒ„„|xzz}‚ƒ€€€€€€€€€€€€€€€€€~}~}|{|||||||||}}~€€„„…†ˆ‰ŠŠˆˆ…ƒˆ‰†‡Šˆƒ€‚„†‡†……†…„‚‚„„…………„„……………………†††…………………„„„ƒƒƒƒ„„……††‡Š‹‘’““‘‘‘ŽŒ‹Š‰ˆ‡„||…ˆ‰Š‹‹Š‰ˆ‡‡††ˆ‹Ž‘’”••“‘Œ†~|€…„ƒ‚ƒ†‡†„„ƒ‚€‚€€‚ƒƒ„„ˆ‡††‡ˆ‰ŠŠ‹ŒŒŠ‡†………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€‚‚‚‚€€ƒ‚‚‚‚‚„ƒ‚‚ƒ…„ƒƒƒƒ„…ƒƒ„„„………„„…………†††…‡‰†„‚‚‚‚‚€‚ƒƒ‚‚‚‚‚„ˆ‹‹„‚„‡ˆ€€€€€€€€€€€€€€€€„„…††ˆŠŒ‹‹ŠŠŠŠ‹‹ŒŠ‰‰ŠŠˆ†„ƒ~|zxwwvy~|{}{{|…ˆˆ‡†…ƒ‚€€‚ƒƒ€|yz{z{}||}~}{zy{{z{{}}}}}}~€€~}{yvussuvvwwvutuuuuuuuuttw{€|xwvuuvwx{{{{yxvurrrssttuxy{~~~{zy~~yvxxvx{€~~€~~~~€~€€€}{|}}}}}||||{{z{|}€€€‚‚‚€{{{~‚…………„„„„…†††„ƒ„ƒ€‚‚‚‚‚€€€€~~~~~~~}}~€€~~~~|{|‚ƒ‚‚ƒ‚€ƒ†ˆ‡…„ƒƒ‚‚ƒƒƒƒƒƒ„„‚‚ƒ„ƒ}yzz}‚ƒ€€€€€€€€€€€€€€€€€€~}}}~|{|||||||||||}}}}}‚ƒ…†‰ŠŠŠ‰†‚ƒˆˆ…‡Šˆƒ€€ƒ…†…„„……ƒ‚€€€€„„…………„„……………………††††††……„„„„„„ƒƒ„„……††††‰Š‹Ž‘’“’‘Ž“’Ž‹‰‡†‰ˆ„€||€„ˆ‰Š‹‹Š‰ˆ…††ˆ‰‘’“•––”’‘†~~€„„ƒ‚ƒ†‡†„ƒƒ€€‚€€‚ƒ„„…†††‡‡ˆˆ‰‰Š‹‹Š‰‡†………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€‚‚‚‚‚ƒƒƒ‚ƒ„„ƒƒ„„…†„„„„…………„…„……†…††…‡‰†„‚‚ƒ‚‚€€‚ƒƒ‚‚‚‚‚‚‚ƒˆ‹‘‹„€ƒ†ˆ€€€€€€€€€€€€€€€€…†‡‡†‡‰‹‹‹‹‹‹‹‹‹Œ‹‰‰Š‹ŠˆŠˆ…‚~{xwwvy}}{{}€…ˆˆ‡„ƒ‚€~~~~~€€{yz||}~z{}}}|{zyyyyyy{|~~~€~}{yvtstuvwwvvuuuuuvvvvttw{€|yxwvvwxy{{|zzwvurrsrssttwy|~~}|{y}yvwxvx{€~~€€€~~~~€~~~€~|~}}}}}~~~}|{{|}}€€‚‚‚‚€{z{~‚…†……„„„„…†††„ƒ„ƒ€ƒ‚‚‚€€~}}}~~~~~~~}}}~~~}}}}}~|{|‚ƒ‚‚‚‚€„†ˆ‡†„ƒ‚‚‚ƒƒƒƒƒ„„„ƒ‚‚ƒƒ}zyy|‚€€€€€€€€€€€€€€€€€€~}||~~}|||||||||||||||||€‚ƒ…†ˆˆ‰‰…ƒ‡ˆ…‡Šˆƒ€ƒ…†‡‡†…‡…„ƒ‚„„…………„„……………………„…††‡††…ƒƒ„„„„„„………†††††ˆˆŠ‹Ž’““‘‘‘‘’‘Š‡…„‰ˆ…|{€ƒ‡ˆ‰ŠŠ‰ˆ‡……‡ˆ‹‘’“•––•“’Ž…~~€ƒ„ƒ‚ƒ†‡†„„ƒ‚€€€€€€€€‚‚„„………††‡‡ˆˆˆˆ‰‰‰‰ˆ‡‡………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€‚‚‚‚€€‚€‚‚‚„ƒ‚‚ƒƒƒ„……………„„„…………………………………†…‡‰†„‚‚ƒ‚‚€‚ƒƒ‚‚‚‚‚‚‚‚ƒ‡Š’‘Œƒ€‚†‡€€€€€€€€€€€€€€€€†ˆ‰ˆ†…ˆ‹‹‹‹‹‹‹‹‹ŒŠˆˆ‰ŠŠ‰Œ‹ˆ…‚|{zy|}{{|…ˆˆ‡„ƒ€~~}}~~€€€~zy|}}}z{||}}|||{{|{z|~}zxutuuuvvvvvvvvwwxxxttw{€|zyxwwxyz||{{ywutsssssssswz}}|{{y~~yvxxvx{€~~~€€~~~~~~|}~~}~}}|}~}}|}}~€€€‚‚€{{{~‚…………„„„„…†††„ƒ…ƒ‚‚‚‚‚€€~}}}~~}}}}}}||}}}}}}||~|{|‚ƒ‚‚ƒ‚€ƒ†ˆ‡…„ƒƒ‚‚ƒƒ‚ƒ„„„ƒƒ‚‚ƒƒ~{yy|‚€€€€€€€€€€€€€€€€€€}|{|}~}|||||||||}}}}}~~~~‚ƒ„…‡‡ƒ€‚‡ˆ…‡Šˆƒ€ƒ…‡ˆ‰‰ˆ‡ˆˆ†…ƒƒƒƒ„„…………„„……………………ƒ„…‡††……ƒƒƒ„„„……††††††††‡‡ˆŠŒ‘“““’‘‘‘‘’Ž‹‰‡…„Š‰…€{{ƒ‡ˆ‰ŠŠ‰ˆ‡…†‡ŠŒŽ‘’”––•”’Ž…}~€€‚„ƒ‚ƒ†‡†„ƒƒ€€€€€€€€€€€€‚‚ƒ„………„…†‡ˆ‡‡†ˆˆ‡ˆ‡‡‡‡………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€‚€‚ƒƒƒ‚ƒƒƒ…††……„…………………………………………†…‡‰†„‚‚‚ƒ‚‚€€‚ƒƒ‚‚‚‚‚‚‚‚ƒ‡Š‹…ƒ†‡€€€€€€€€€€€€€€€€‡‰Šˆ……‡ŠŒŒŒŒŒŒŒŒŒŠ‡†‡ˆˆ‡ŠŠˆ‡†„ƒƒ€~€ƒƒ}{|{{}€…ˆˆ‡…„ƒ€~€€€€{z|~||}{{{|||}}~}}}|{}€€€€~|ywuuuuuvvwwwwxxyyzzttw{€|{zyxxyz{|||{ywuttttstsssvz~}{{|y~~yvwxvx{€~~~~~€~~~~}||~~}€}||}€€~}}}}~€€€€€€€€€€‚‚‚€{z{~‚…†……„„„„…††‡…„…„‚‚ƒ‚‚‚€}~~~~}}~~~}||}}}}}}}|~|{|‚ƒ‚‚‚‚€„†ˆ‡…„ƒ‚‚‚ƒƒ‚ƒ„„„ƒƒ‚‚‚‚~|zz}‚ƒ€€€€€€€€€€€€€€€€€|{{|}~~}{{{{{{{{}}~~€€€~~~€€„„~‡ˆ…‡Šˆƒ€‚„†‡ˆˆ‡†ˆ‡…„ƒ‚‚‚„„…………„„……………………„„†††…„‚‚ƒƒƒ„………††††††††††‡ˆ‹Ž‘““““““’’’ŽŒŠˆ‡……‹‰…€{{‚†‡ˆ‰‰ˆ‡††‡‰ŠŒŽ‘“•–•“’…}}€€€‚„ƒ‚ƒ†‡†„„ƒ‚€€€€€€€€€€€€€€€‚‚ƒƒ„……†ƒ„†‡ˆ‡†…‡‡††††‡‡………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€‚‚‚‚€€‚€€‚‚„ƒ‚‚ƒ„„…………………………………………………………†…‡‰†„‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚ƒƒ‚ƒ†‰ŽŒ†ƒ„††€€€€€€€€€€€€€€€€‡Š‹‰…„‡ŠŒŒŒŒŒŒŒŠ†…†‡‡†‡‡ˆˆˆ‰‰‰…ƒƒ…ƒ|yy{{|…ˆˆ‡‡†„‚€€€‚‚‚‚‚‚€}{}}|{|{{{{{|}}|zz{yxz€€€€€~~~}zxvvuutuvwxxxyyz{{|ttw{€|{{yyyy{{}||{ywusttttttttvz~}{{|y~~yvwxvx{€~~~~~~~€~~~~}{|}~~€}||}€€~}}}~€€€€€€€€€€‚‚‚€{z{~‚…†……„„„„…††‡………„‚‚ƒƒ‚‚‚€|}€‚}~~~}}~~~~~}}}~|{|‚ƒ‚‚‚‚€ƒ†ˆ‡…„ƒ‚‚‚„ƒ‚ƒ„„„ƒƒ‚‚‚‚~|{{~ƒ„‚‚€€€€€€€€€€€€€€€€|{z|}~~}{{{{{{{{}~~€‚‚}}}~~~~~‚‚€}€†ˆ†‡Šˆƒ€€ƒ…†…„ƒ…„ƒ€€€€„„…………„„…………………………†‡†„‚‚‚ƒƒ„………‡‡‡††††††…†‡Š‘““””••”’‘Œ‹Šˆ‡†…‹‰…€{{~‚†‡ˆ‰‰ˆ‡††‡‰‹ŽŽŽ‘“••”“’…}}€€€„ƒ‚ƒ†‡†„ƒƒ‚€€€€€€€€€€€€€€€‚‚ƒƒ„…††ƒ„†ˆˆ‡†…‡††……†‡ˆ………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€€€€ƒ„ƒ‚ƒ†…„„„„…†…………………………………………†…‡‰†„‚‚‚ƒ‚€€‚ƒƒ‚‚‚‚‚ƒƒ‚ƒ†‰ŒŽŒ‡„…††€€€€€€€€€€€€€€€€†‡‰‰ˆˆ‰ŠŒ‹‹‹‹‹Š‹‰†…„„…ƒ…†…‡Šˆ…ƒ…†…ƒ€vvx~†ŠŠ‡‡‡…ƒ€€ƒ‚‚‚‚ƒ„……€|}~}}~~|z{}{}€€~~~€~}{yxwqsuvuvxz|{xwvwyzyxy|}|zwuuw{}~}zxvvvwwvusssstwy{}}|{yy}~zxyzyy|~~~€~~}~€~~~~~~~~~~~}}|~}}}}€‚€~|||}~€€ƒ‚‚€€‚‚‚‚‚€{z{~‚…†……………ƒƒ…†††……„‚€‚€€€y{~€€~|~|z|€|||}~~}||~|{|‚ƒ‚‚ƒƒƒ‚‚„††††„‚‚ƒ„ƒƒ‚ƒƒ„„ƒƒƒƒƒ‚€‚€„…‚‚ƒ€€€€€€€€€€€€€€€€~z{|{~}{{||||{{~~€€€€}}~~}}~‚‰ŠŠ†€‚€‚…‡†ƒ€‚‚€~€…‡…„…†…†…„ƒ„„‚‚‚‚‚††††††††††‡‡‡‡††„„…†Š‘”•””••”‘ŽŒ‹‰‡††††ˆ‡„{{ƒ†‡‰ŠŠˆ†„…‡‹ŽŽŽŽ’””’Ž†~~€ƒ„‚‚ƒ…†…„ƒ‚€€€€€€€€€€€€€‚‚€€€€‚„…†‡‡‡‡‡††††„„……††‡‡‡††……„„ƒ„ƒƒ‚‚ƒ…………„„„…††……………………‡†…ƒ‚‚‚‚‚€€€€€€‚‚ƒƒƒ„„„ƒƒƒƒ‚„„„„„„„„†……„„………†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚‚‚ƒ‚‚‚‚‚ƒƒ…„„ƒƒ„……€€€€€€€€€€€€€€€€‰Š‹Šˆ‡‡ˆŒ‹‹‹‹ŠŠŒ‹‰‡†…„„„††…†‡…y|~~}|~€{{}‚…ˆ‡†„„„ƒ‚‚ƒƒ……„„„…†‡„{}}||~}{|~|~‚€€€€~~€~}|{zzvvvtssvy}|{yyyyywvw{}|zwuuxz}|{ywvvvwwvuttttuxz|~~}|zx|}ywyzxy|~~~~€~~~€€€~~~~~~~~~~}}}}~}}}}~€€~}|}}~~€ƒ„‚‚ƒ‚€€€€‚‚‚‚€{z{~‚…………………ƒƒ…†ƒ„„„„„ƒ‚€€€|}~~~~}}|||}~~}|~~|{|‚ƒ‚‚ƒƒƒ‚‚„††‡†„‚‚ƒƒƒƒƒ„„ƒƒƒƒƒƒ‚€‚€„„‚€€€€€€€€€€€€€€€€~z{|{~}||{{{{||}}€€€€€~}}}}~€†††ƒ}~€€ƒ……‚€€€€€€…‡…„…†…†…„ƒƒ‚€‚‚‚‚‚……………………†††‡‡‡†††††‡ˆ‹Ž‘‘‘“••“‘Œ‹‰‡††††ˆ‡„{|ƒ‡ˆ‰‹Š‰‡††ˆ‹ŽŽŽ‘””’Ž†~~~€ƒ„‚ƒ…†…„ƒƒ€€€€€€€€€€€€‚‚€€€ƒ„…†‡‡‡†‡††††„„……††‡‡††……„„ƒƒƒƒƒƒƒ„„…„„„„„……†……………………‡†„ƒ‚‚‚‚€€‚€€‚‚‚ƒƒƒ„„„„ƒƒƒƒ„„„…„„„„†……„„……††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€‚ƒ‚‚‚‚ƒƒ‚‚ƒ„…€€€€€€€€€€€€€€€€Š‹‹Šˆˆˆ‰Œ‹‹Š‹‹Š‰ŠŠŠ‰ˆ†…„…††„…„}uwxuqpuz|„†‡‡‡ˆ„„ƒƒƒ„„„……„„……†‡ƒ~{{|{{}€~||€~€‚€€€€~€~~~}}|||{zxursux~~~}|zyxttvz€€~|zxvvwz{yxwvvvvwxwvuuuvvyz}~|{x|}ywxyxy{~~~€€~€€€~~~~}}}~}}|}~€€~}}}~~€‚ƒ„€ƒƒƒ€~€€€‚‚‚€€{z{~‚…†……………ƒƒ…†………„„‚€‚€€€€~}||}~~|}~~~||}~~|}}~|{|‚ƒ‚‚ƒƒ‚‚„…†††„‚‚ƒƒƒƒƒ„„ƒƒƒƒƒƒ€ƒ‚„„€‚€€€€€€€€€€€€€€€€~{{|{}|}|{zz{|}||~€€€€~}{|€‚€}|~€€ƒƒ‚~~~€…‡…„…†…††…ƒ~~€€‚‚ƒ„„……………………††‡‡‡††…ˆ‡‡†‡ˆŠŠŒ“”“‘‹Š‰‡††‡‡ˆ‡„{{€ƒˆˆŠ‹‹ŠŠ‰ˆŠŽŽŽ‘““‘Ž…~~~€ƒ„‚‚‚…†…„ƒ‚‚€€€€€€€€€€€€€€€€‚‚„…††††††‡†‡‡…………††††………„„ƒƒƒ‚ƒƒ„„„„„„„ƒƒ„„…………………………‡†…ƒ‚‚‚‚‚€€‚‚‚‚‚‚‚‚ƒƒ………„„„„„……………………†……„………††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€€€‚‚‚‚‚‚ƒƒ‚„…€€€€€€€€€€€€€€€€‡ˆŠŠŠŠ‹‹ŠŠ‹‹Œ‹Š‰ŠŠ‹‰ˆ†…„††„ƒƒzwywogejpz€‡ŠˆˆŠŒ‡…„ƒ‚‚‚ƒƒ‚‚‚ƒƒ„‚}y{{zz|~|{}€ƒ„ƒ€‚€€€€~€€€~}}|||||ywvxz~€€|ywssuy~€~|{xwvxyzwvvvuvvvxxwvvwwxxy|~~}{zw||yvxyxy|~~~~€€€‚€€€€€~~~~}~}}~}}||}~~~}~~~‚‚€‚ƒ‚€€€‚‚‚‚€{{{~‚…………………ƒƒ…†††……ƒ‚€€€€~}||}~€€€~}}~~}}|}~~~|{|‚ƒ‚‚ƒ‚‚ƒ…†‡†„‚‚ƒ„ƒ‚ƒ„„ƒ‚ƒƒ„„„ƒƒ…ƒƒ†…‚€‚€€€€€€€€€€€€€€€€{{|{}~|}|{{z{|}{{}~€€€€€€€~~z|€ƒƒ‚€~~~}}}€€ƒƒƒ€€€€…‡…„…†…†‡…ƒ}|}€‚ƒ„…†………………………††‡††……‡‡†‡†‡‡ˆŠ‰‰‹ŽŽ‹Šˆ‡‡‡‡ˆˆ‡„{|ƒˆ‰‰‹‹ŒŒŒŠŒ‘’‘Ž‹Œ„~}~~€„„ƒƒ…†…„ƒƒ€€€€€€€€‚ƒƒ……††††‡†‡‡‡…………††††„„„„ƒƒ‚‚‚ƒ………ƒƒƒƒƒƒƒ„„………………………‡†„ƒ‚‚‚‚€€‚‚‚‚ƒ‚‚ƒƒƒ††…………„„††††††††……„„„…†††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€€€‚‚‚‚ƒƒ€„…‡€€€€€€€€€€€€€€€€†ˆ‰ŠŠŠŒ‰‰Š‹ŒŒ‹‰‰‹‹‹‰‡†„††„„ƒy{zwmc`fmz‰‹ŠˆŠŒˆ†ƒ‚‚€~ƒ‚‚‚‚|yz{yz{{yy|…††‚‚€€€€€€€‚€~}{zyz|~}}~€€}{yutvz€~|{zxxwxxuuvvvuuuxwwvwwxywx{|}|zyx|}ywxyxy{~~}€€€‚€€€€€€€€€}}~}~~~~~~||||}~}}~~~~~€€€€€€€€€‚‚‚‚{z{~‚…†……………ƒƒ…†„„„„„ƒƒ‚‚€€€||}}~~€€~}~~€~~|{|‚ƒ‚‚‚‚ƒ…†††„‚‚ƒ„ƒ‚‚‚ƒ‚‚‚„…††††‡„…††€€€€€€€€€€€€€€€€€{||{}~{{{|{|{|{z{|~~~~€€€~}y|„…ƒ€~~~}}~€€‚‚‚‚‚„…ƒ‚‚€€€…‡…„…†……†‡ƒ||}€€‚„…††…………………………††††……„„††ˆˆˆˆ‰‡†‡ˆ‰‰‡Š‰ˆ‡‡‡ˆˆˆ‡„{{€ƒ‡ˆˆ‰‹ŒŽŽ‹ŒŽ‘‘”“’’’Œˆ‹ƒ}}~~€„„‚‚‚…†…„ƒ‚‚€€€€€‚‚ƒ„„…………††‡‡ˆˆ††††…………ƒƒƒƒƒ‚ƒ‚‚‚„„…„„ƒ„ƒƒƒƒ„…………………………‡†…ƒ‚‚‚‚‚€€ƒ‚‚‚‚‚‚‚‚ƒƒ†††……………††††††††…„„„……†††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€€€‚‚‚‚ƒƒ‚‚„†ˆ‰€€€€€€€€€€€€€€€€ˆ‰ŠŠ‰ˆ‰Š‰‰ŠŒŽŒ‹‰ŠŠ‹ŠŠ‰‰†ˆˆ‡…„~yyxtledjp|ƒŠŒ‰‡‡ˆ‡…‚‚ƒƒ€…„ƒ‚‚‚ƒƒ‚}yz{zz|zxx{€„††ƒ‚€€€€€€€‚‚€~|zyxx|€‚‚€€~€~}|xxx|}{{zyxwwvvwwwvvtswwvvvwxywy{}}|{yy}~zxzzyy|~~~~€€€€‚€€€€€€€}}}~~~~~~|{{{|||}~~~~~€‚‚ƒƒ‚€€€€€€€€€‚‚‚{{{~‚…………………ƒƒ…†…………„ƒ‚€€z{}~~}}}~~~|||}~~}|~|{|‚ƒ‚‚‚ƒ„†‡†„‚‚ƒ„„ƒ‚‚ƒ‚ƒ…†‡‡‡†„„…ƒ€~€€€€€€€€€€€€€€€€€||}{}~{{{||||{{{||}}}}|}~~~~}}z}„„ƒ€~}|}~€€€‚ƒƒ‚ƒ„…„„ƒ‚€€…‡…„…†…„‡‡…}~€‚‚ƒ„……………………………………†††……‚ƒ…‡ˆ‰‰‰Šˆ……††…„‰‰ˆ‡‡‡ˆ‰ˆ‡„{|ƒ†††‡‰ŒŽ‹Œ’“”–•””“Œ‰Š‚||}~€„„ƒƒ…†…„ƒƒ€€€€€€‚‚‚ƒƒ„„…„……†‡ˆˆ‰††††…………ƒƒƒƒƒƒƒƒ‚ƒƒ„„„„„„„ƒƒƒ„…………………………‡†„ƒ‚‚‚‚€€‚‚‚‚‚‚ƒƒƒ††…………„„††††††††„„„„„††‡†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€‚‚‚‚‚ƒƒ„„„…†ˆ‰Š€€€€€€€€€€€€€€€€‡ˆ‰‰ˆˆ‰Š‹‹ŒŽŒŠ‹ŠŠ‰ŠŠ‹‹‰‹‹‰‡„~wwuqlhinsz€‡‹Š‡‡‡ˆ…ƒƒ„…„‚††…„„„„„ƒ}z{|zz||zy{~‚‚ƒ€~}~€€€€€€€€€~}|zyyx{€~~}}}~€|{|~|{{{zywvuxxyxwusrvvvuvwxyz{}€}|z~{y{|zy|~~~€€€}}}}~~~|{{{{|{|~€~}~‚‚‚‚€€€€€€‚‚‚‚{z{~‚…†……………ƒƒ…††††…„‚€‚€€€{|~~}{|~~}|}}{{|||||{~|{|‚ƒ‚‚€‚„†††„‚‚ƒƒ„„ƒ€‚‚ƒ„„…„„ƒ„‚€{zz€€€€€€€€€€€€€€€€€|||{|~{||{{{{||||}}}|{z||}}~}}||~ƒ„ƒ€}{{}}€ƒƒ‚‚ƒ„‚‚‚€€€€…‡…„…†…ƒ†ˆ…~€ƒƒƒ„„„„„„…………………………†††……„ƒ„†ˆŠŠ‰‰ŒŠ‡…†‡†…‰ˆ‡‡‡ˆ‰‰ˆ‡„{{ƒ„„„…ˆ‹Ž‘Š‹ŒŽ‘“•—””””•“Œ‰{|}}€„„‚‚‚…†…„ƒ‚‚€€€‚€€€€‚‚‚ƒƒ„„„„„„…†‡ˆ‰‰‡‡††……„„ƒƒƒƒ„ƒ„„ƒƒƒƒƒ„„…„„„„„……†……………………‡†…ƒ‚‚‚‚‚€€‚€€‚‚‚‚‚ƒƒ†…………„„„†…†…†…††„„„„……‡‡†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚ƒƒ††……†‡ˆ‰€€€€€€€€€€€€€€€€„…‡ˆˆ‰‹ŒŒŒŽŽ‹‰‹‹‰‰‰ŠŒŒŽ‹‡„}vxupljkorv|ƒ‰ŠŠ‰‰Š‡„„††…‚‡†…„„„„„ƒ~z{|{{|~|z{}~ƒ}|}~€€€€€€€}}}|{{zzz|}~}~~}{{|~ƒ~~~|{{{zywutyyzyxusqvvuuvwxy|~€‚‚€~{€|z|}{y|~~~€€€€|}}~~~|{zz{{z|~€€€~~€€€‚‚€~€€€‚‚‚‚‚{z{~‚…†……………ƒƒ…†„„„„„ƒ‚‚‚€€€}}~~~~}|y}€}|~€~}||||}~~|{|‚ƒ‚€‚€€‚„†‡†„‚‚ƒƒ…„‚€€‚ƒƒƒƒƒ‚€~}xvw€€€€€€€€€€€€€€€€€||}{|}z}|{zz{|}}}}}|{zy{{|}}||{}~€‚ƒƒ‚|yz|~}{~€‚ƒ‚ƒ€€€€€€€€…‡…„…†…‚†ˆ†………„„„ƒƒƒ††††††††„……††……„„…‡‰ŠŠˆˆŽ‹ˆ‡ˆ‰‰ˆ‰ˆ‡‡‡ˆ‰Šˆ‡„{{ƒƒƒƒ„†ŠŽ‘ŠŠŒŽ‘”—™“’“”–•’ˆ{{}}€„„‚ƒ…†…„ƒƒ€€‚€€€€‚ƒƒƒƒƒ„„„„„…†‡ˆ‰‰‡‡††……„„ƒƒ„„„„„„„ƒƒ‚‚ƒ…………„„„…††……………………‡†…ƒ‚‚‚‚‚€€€€€€‚‚ƒƒƒ…………„„„„……………………„„„„…†‡‡†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚‚‚ƒ‚‚‚‚‚ƒƒ‡†………††‡€€€€€€€€€€€€€€€€…‡ˆ‡……ˆ‹ŒŒ‹‹ŠŠ‹‹Œ‹‰ŠŒŒ‰ŒŒ‰ˆ†€ywtoljjkkn}‡‰ŠŠ‰‰‰ˆ‡…„„„ƒ†‡‡†„ƒ„†„€|z|}|zyyz{}~~~€€€€€€€€‚€~~~~~~}}}{|}~}~~}{yz|}}}}}‚~|{{|}|xvyyywtrrsuuvtsrtvw{~~}yz~zxyyxw}€€€~€€€€€€€~~€€~~~}}|||{{~~~€‚‚‚€€‚‚ƒƒƒ‚€€€€€€€‚‚ƒƒ}||~‚†‡‡……„„„„……„ƒƒ„ƒ€€‚€‚‚€~~~}}}}~~}}}~€|||||||||{{}€‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚„ƒ„„ƒ€|yz{|}}||{€€€€€€€€€€€€€€€€~{|}}~||{{zz{{|{~~zy{|{}||||{{{}~ƒ„……~||}}}||ƒƒ‚‚‚‚€~€~€ƒ…††…„‚‡Š‡€}„„„„…………………………………„„„……………‡‡‡ˆˆˆ‰‰Š‰ˆ‡††‡‡‰‰‰‰‰ˆˆˆˆ†…„~y}††…„„‡Œ‘•‹Œ“–—”•”’“•”†‚~~~}€„†‚…‡†…†„‚€€€€€€ƒ„ƒ‚‚ƒ„„„„……††††……„„ƒƒ„„„„ƒƒƒƒƒƒƒƒ„„„„„„…………„„„„„„„ƒ‚…††„‚€€‚‚‚‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„……„„„„ƒƒƒƒƒ„……†††…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡…††„‚‚„†€€€€€€€€€€€€€€€€…‡‰ˆ†…ˆ‹ŒŒ‹‹Š‹‹‹‹ŠŠŠ‹‹‹‹‰‹Œ‰ˆ†€yxvrnjgggn|†ˆŠŠ‰‰ˆˆ†…„ƒƒƒ‡‡ˆ‡‡††‡€}zy{}}{yzz|}~€~€€€€€€€€€€€~~~~}}|{{}€}}}|{z{}}~}}~|{z{|{xuyzzxusssvwwvttvxy|~}}~{z~~zwyyxx}€€€€~€€€€€€~€€~~~}}|||||~~€€‚‚€‚‚ƒƒ‚‚€€€€€€‚ƒƒ~}}‚…††……„„„„………„„…„€‚€‚‚€~~~~~}}}}~~~~~~|||||||||{{}€‚‚ƒ‚€€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚‚ƒƒ„ƒ~|z{|}}}|{€€€€€€€€€€€€€€€€}z{}|~||{{zz{{|z|}}|}{z}||||{{{|}€‚ƒ…„„~||}}}|}‚‚‚‚ƒ€€€}}}~‚ƒ…†††„„ƒ‡‰†€}€„„„„…………………………………†††††‡‡‡‡‡‡‡‡ˆˆˆ‰‰ˆ‡†‡‡‡‰‰‰‰ˆˆˆˆ‰ˆ‡…y|ƒ†…„„†‹’ŽŒŠ‹“•–“”“’“–”†‚~~}}€„†‚…‡…„†„‚€€€€€€€ƒ„‚‚‚„„„„„……††††……„„ƒƒ„„„„ƒƒƒƒƒƒƒƒƒ„„„„„„………„„„„……„ƒ‚‚…††…€€‚‚‚ƒ‚€€‚‚‚‚€‚ƒƒ‚‚ƒ„……„„„„ƒƒƒƒƒ„……††…†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡…††„‚‚ƒ†€€€€€€€€€€€€€€€€‡‰Š‰††‰ŒŒŒ‹Š‹Š‹‹‰Š‹‹ŠŠ‰Š‰‹‹‰ˆ…zyyuogccdn|†ˆ‰Š‰‰ˆ‡†„ƒ‚‚‚……†‡ˆˆ‡…}{yy{}}|zz{|}~€€€€€€€~€~~~|zy|€‚€}|||{{|~€}~~}~€~|{zz|zxv{{{yvttuvwxvuuwy{}}||~~|z~zxyyxx}€€€~~€€€€€€~~€€~~~~}}||||~~€€‚€‚‚ƒ‚‚€€€€€€€€‚‚ƒƒ~‚„…………„„„„……†„„†…‚‚‚‚‚€~}}}}}~~~~~€€~}||||||||||{{}‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€‚ƒ„ƒ€~}yz{|}}}|€€€€€€€€€€€€€€€€}y{||}~{|{{{{{{||z{|~|{{}||||{{{z}ƒ……„ƒ~||}}}|~ƒ„€€€}}~††‡‡‡†…„ƒ†ˆ†~€„„„…„………………†…†………†††‡‡‡‡ˆ††††‡‡‡‡‰ˆˆ‡‡‡‡ˆ‰ˆ‰ˆˆ‡ˆ‡‰‡ˆ‡‚|}‚†…„ƒ…ˆŒŒŠ‰ŠŽ’””’““’”–•…~}}}€„†„‡…„…„‚€€€€€„„ƒ‚ƒƒ„„„„……†††………„„„ƒ„„„„ƒƒƒƒƒƒƒƒ„„„„„„………„„ƒ„…………„ƒƒ…††„‚€€‚‚‚‚‚€‚‚‚‚€‚ƒƒ‚ƒ„………„„„„„ƒƒ„„……†††…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡…††„‚ƒ…€€€€€€€€€€€€€€€€ˆŠ‹Š‡‡‰ŒŒŒ‹‹Š‹‹‹‰‹Œ‹Š‰‰Š‰ŠŠŠˆ„zzzumd`bfqˆ‰ŠŠ‰‰‡†…„‚‚‚‚‚„‡‡„‚|{zz{{{{{||}}~€€€€€€~}~€€€€}|{}€}|}}|||~~~}~€€~}{|||zx{||zwuuvuvwvtuwy{~~}}~|z~~zwyyxx~€€€ƒ‚‚€€€€€€€~€€}~~}}||}~€€€€€‚‚‚€€‚‚‚€€€€€€‚ƒƒƒ€‚„„ƒ……„„„„……†„„……‚‚‚€‚‚€~|||}}~~~}}}~}}|{|||||||||{{}€ƒ‚ƒ‚€€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚‚ƒƒ|zyxyz}}~~~€€€€€€€€€€€€€€€€|yz|{}~{|{{{{{{|{xz{{{~}||||{{{y|…††ƒ‚~||}}}|€€€€ƒ„ƒƒƒ€€†††‡‡‡††ƒ…‡…€„„„„……………††…†…†…†……††††‡‡††††††††ˆˆ‡‡†‡‡ˆˆˆˆˆ‡‡‡‡…†‡ˆ…€‚†…ƒƒ„†‰‹‹‰ˆ‹Ž‘““‘“““”—”…}}}}ƒ…€„†…„…„‚€€€€€€€ƒ„‚‚‚„„„„„……††…………„„„„„„„„ƒƒƒƒƒƒƒ„ƒ„„„ƒ„„…„„ƒƒ„……††…„„…††…€€‚‚ƒ‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„…………„„„„„„„……†…†…†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡„……„‚…€€€€€€€€€€€€€€€€‰ŠŒŠ‡‡‰ŒŒŒ‹Š‹Š‹‹ŠŠŠ‰‰‰‰ŠŠ‰‰Šˆƒ~z{ytjb`eju‚ŠŠŠŠ‰‰‡†…ƒ‚€ƒ……ƒ~~|{zz}}}}~~€€€€€~~~€€€}~~€€€€~€~|{|~~~~||}~~}}€}|~}|{|}}zxuuvstutssvxz}€}yz~zxxyxy~‚€€€€‚‚ƒ€€€‚€~€€}~~}}}~~€€€‚‚‚€€‚‚‚€€€€€€€€‚‚ƒƒ„‚€€ƒ„„ƒ……„„„„………„„…„€‚ƒ‚€}|||}}}~~{{{z{{|}|||||||||{{}‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€‚„|vtsvwz|~~€€€€€€€€€€€€€€€€|yz|{|~{{||||||{{{|}zz}}||||{{{y|„‡…ƒ‚~||}}}|€€€€ƒ„„„„ƒ‚ƒƒƒ„„††ˆˆƒ„…„‚‚ƒ„„…„…………††††††††……††††‡‡†††††…†…ˆ‡‡†‡‡ˆˆˆ‡ˆ‡‡†‡†……‡ˆˆ„‚…„ƒƒ„†ˆ‰Šˆ‰ŠŽ‘’’’”•”•–“Ž…€~}}|ƒ…€€ƒ†„ƒ„„‚€€€€€„„ƒ‚ƒƒ„„„„……††………„…„„„„„„„ƒƒƒƒƒƒƒƒ„„„„ƒƒ„„„„ƒƒ„„…††……„…††„‚€€‚‚ƒ‚‚€‚‚‚‚€‚ƒƒ‚ƒ„†…………„„„………………†††…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡„……ƒ€‚„€€€€€€€€€€€€€€€€‰‹ŒŠ‡†‰‹ŒŒ‹‹Š‹‹‹Š‡„„…ˆŠŠŠˆˆŠˆƒ}z{xrjcbfku‚ŠŠŠŠ‰‰‡†…„‚‚€€ƒ„„ƒ‚€‚ƒ‚|||~~~~~~€€€€€~}~~€€€€~€€€€‚{y{~~€}|}~~€}|~€€‚€}}}~}||}|{wuuvrsttstvxz~€€€}xz~~zwyyxy~‚€‚€€€€€~€€€€‚€~|€€~~}}€€‚‚€€€€€€€€‚ƒƒƒ‚€ƒ……„……„„„„………„ƒ…„€‚€‚‚€~|||}}}}}{zyyy{|}|||||||||{{}€ƒ‚ƒ‚€€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€ƒ…ztqquwy|~€€€€€€€€€€€€€€€€€€€}zz}{}~{{||||||{|‚…‚}zz}||||{{{z}€„……„ƒ~||}}}|~ƒ„ƒ„ƒ‚€‚‚…†ˆƒ„„ƒƒƒƒƒ„„„……………†††††††††††‡‡‡‡ˆ††††††……ˆ‡‡‡‡ˆˆ‰‡‡‡‡††††‡‡‡ˆ‡…ƒƒƒƒ„†ˆ‰‰‰‰Œ’’‘“•–••–‘‹„€}}||ƒ„€ƒ…„ƒ„„‚€€€€€€€€€€€€€€€ƒ„‚‚‚„„„„„……††……„…„…„„„„„„ƒƒƒƒƒƒƒ„ƒ„„„ƒƒƒ„„„ƒƒƒƒ„…………„…††…€€‚‚‚ƒ‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„††…………„„………†…†…†…†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡„„„ƒ€€‚„€€€€€€€€€€€€€€€€‰‹‹Š‡†ˆ‹ŒŒ‹Š‹Š‹‹‰ƒ}|†‰ˆŠˆˆŠˆ‚|z{xsmhfffs€ˆˆ‰ŠŠŠ‡†…„ƒ‚‚‚‚ƒƒƒƒ„„ƒ††ƒ€€~~€€€~~}}~~€€€€€€€€€€€€~{z|~~€~~~~€€}{}€€~{z{|{z{||zwttustuttuwz|€}zz~zxyyxy‚‚‚€€€€€€ƒ€~|€€€~~~€€‚‚€€€€€€€€€€‚‚ƒƒƒ€„…††……„„„„……†„„……‚‚‚€‚‚€~}}}||||||||{|||||||||||||{{}€‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€„‡ƒ{usttvy{~€€€€€€€€€€€€€€€€€}z{}|~|{||}}||{~…Œ‹†€|z}||||{{{|}€‚„„…„~||}}}|}‚‚‚‚ƒ‚ƒƒ€€€~ƒ„ƒƒƒƒ„„„ƒ„„„„…………†††††††††††††‡‡‡‡‡‡††††…‡‡‡†‡ˆ‰‰‡‡‡††††…‡††‡‡†‚~‚‚ƒ„…‡‰‰‰‰ŠŒ’’‘•—˜––”ˆ„€}|||‚„€ƒ…ƒ‚„„‚€€€€€€€€€€€€€€„„ƒ‚ƒƒ„„„„……††„„…„…„……„„„„ƒƒƒƒƒƒƒƒ„„„„ƒƒ„„„ƒƒ‚‚‚ƒ„……„„…††„‚€€‚‚‚‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„†††……………†††…†…†…†…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡ƒ„„‚€ƒ€€€€€€€€€€€€€€€€‰Š‹‰†…‡ŠŒŒ‹‹Š‹‹‹ˆ€xw~…‡‡Š‡‡Š‰‚|zzxtqmhdbp}†‡ˆ‰Š‹ˆ‡…„ƒ‚‚‚‚ƒƒƒƒ…€ƒ‡ˆ…ƒ„…~~€€€€~~}}}~€€€€‚€~€€~~€~|||}~|~€€€}{}€}yxyzzy{|{yvttutuvvuvy{~€€~}~|z~zwyyxz‚‚‚€€€€€€€ƒ}|€€€~~~‚‚~€€‚‚‚€€€€€€€€‚‚ƒƒ‚€„†‡‡……„„„„……‡……††ƒ‚ƒ‚€‚‚€~}}}}||{{}}~~~}{{|||||||||{{}€‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€…ˆ…}wvxtux|~€‚€€€€€€€€€€€€€€€€~{|~}~|{||}}||{‹‘Ž†‚€~}||||{{{}~‚„……~||}}}||ƒƒ‚‚‚ƒƒƒ€€€~}|}€„ƒ‚ƒ„…„ƒ„„„……………††††††††„„„……………‡‡‡‡††††‡‡††‡ˆ‰Š‡††††…………„„…‡ˆ„€‚ƒ„†ˆ‰Š‰‰Š‘“’‘–˜˜—•”†„€}|||~‚„€ƒ…ƒ‚„„‚€€€€€€€€€€€€€€ƒ„ƒ‚‚ƒ„„„„……††„„„„„………„„„„ƒƒƒƒƒƒƒƒ„„„„‚ƒƒ„„ƒƒ‚‚ƒ„„„„„…††„‚€€‚‚‚ƒ‚€€‚‚‚‚€‚ƒƒ‚ƒ„††††…………††††††………†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡ƒ„„‚€ƒ€€€€€€€€€€€€€€€€‰ˆ‡…ƒ„‡Š‰ˆ†…‡ŠŠ‰Š‚xsv~†‹‰†„…ˆ…{syvtsmedfr}†‡‡†‡ŠŠ‡„ƒ„†…„ƒ‚‚ƒ„…„……†ˆ‰‡†‡‡„€~~€€€€€€€~}|~~~~~‚€€€€~€€€~€€€€~||€€€€~~~}}}~~}{yxxw{{zywvutwvutuwz|z}~~~{z€|zzzx{~‚€€€€€€€~~~€~~~}€€€€€€€€€€€‚ƒ„ƒ‚€~€}~‚‚‚ƒƒ‚‚‚ƒ„…‡ˆ‡†……„„……„………„„ƒ‚‚‚ƒ…ƒ}}}}}}}}~~}|{{{{{|||}}~~zzz|€‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚‚ƒƒƒ„‚}yvuuwxz~}}€€€€€€€€€€€€€€€€||||{}€|{|ƒ‡‹Š†„‚z}|yy{€‚„…„‚€€~~}||}~€‚€ƒƒ‚‚‚~}}}~}€ƒƒ‚‚„„„„…………………††‡‡††„…††……†‡††††††††……………†‡ˆ†††……†††ˆ‡‡‡ˆˆ‡…}~„ŠŒŒŠŽŽ“•“–•˜š–‘‹…ƒ~{}~ƒ€„†…„‚€€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„………ƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒ„……„„„„„„„„„„„„…………ƒƒƒƒƒ€€€‚‚‚‚€ƒƒ‚‚‚‚€ƒ………………………‡††……„……………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚€€‚‚‚ƒ„……ƒƒ‚€„€€€€€€€€€€€€€€€€ƒ„ƒ‚‚ƒ‡Š‰…‚‚„†ˆ‰ˆtoqzƒˆ‹Šˆ†ƒ€|zzwtqkeeis~†ˆ‡†‡ŠŒ‰…„„……„„ƒ‚‚ƒ„„ƒ„ƒ„‡‡†††‡ƒ~~€€€€€€€~}}~~~~~€€€€€€€~€€€€~}|€€€€~~}~~ƒƒ‚}{zzzyxwvvuvuttuxz|z}~}}~|yz€|zzzx{~‚€€€€€€€€€€~~~}€€€€€€€€€€€€‚ƒƒ€€~~€‚‚‚„„ƒƒƒ„……‡†…„„„„…„………„ƒ‚‚€€„‚~}}}}}}}}|}}~}|zy{{{||}}}zzz|€‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚„ƒ‚‚‚‚‚ƒ„‚}yvuuwxz~}}€€€€€€€€€€€€€€€€~~~€‚‚}~‚…„‚€‡‰‘‘Œ„~{|}€ƒƒ}}|}€‚„‚€€~}}||}~€‚‚‚‚€€€€~~~~€}€ƒƒ‚ƒ„„„„…………………†‡‡‡††…†††………†††††††††…………†‡ˆˆ†††……†††‡‡†‡‡‡†…€~|~ƒ‰ŒŒŒŽ‘““”“–˜–“„ƒ~|}~€ƒ€„†…„‚‚€€€€€€‚‚‚‚ƒƒƒ„„ƒƒ„„„………ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„…„„„„„„„„„„„„…………ƒƒƒ„ƒ‚€€€‚‚‚‚€ƒƒ‚‚‚‚€ƒ………………………‡‡†…………†………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚‚€‚‚ƒ„……ƒ‚‚€„€€€€€€€€€€€€€€€€„„…„ƒ…ˆ‹Š}‚„Š‡}rknw€†‹ŒŠƒ|x|€{wsojeglt†ˆˆ‡‡Š‹‰…ƒ‚‚‚ƒ‚€‚‚‚ƒ†‡……†…‚~€€€€€€~~~~~~~€€‚€€€~€€€€~}|€€€~~~…†‡‡„€|zxxxxwwwwttttvx{|{~}}}{xz€|zzzx{~‚€€€€~€€€€€€€~~~~}€€€€€€€€€€€€‚‚‚€€‚€€€€€„„ƒƒƒƒ„…†…„ƒƒƒ„„………„„ƒ‚€€€‚€|}}}}}}}}||~~~|zy{{{{||||zzz|€‚‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚„„ƒ‚‚‚ƒƒƒ„‚~xvuuwxz}}€€€€€€€€€€€€€€€€~}~€€}{‡‰…ƒ…„‰‹‘—˜‘„y|{|ƒ‹Œ†||}ƒ„ƒ‚€~~}}|}~ƒ…„„ƒƒ‚‚€€€€~~~~€~€‚ƒƒ‚ƒ„„„…„………………††‡†††††‡†…„……††††††††††††‡‡ˆ‰†††……†††‡†††‡‡†„~|{}‚‡‹ŽŒŒŽ“——™˜–—’‡ƒ|}~€ƒ‚€€„……ƒ‚€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„………ƒƒ„ƒ„ƒ„ƒ„„„„„„„„„ƒƒƒƒƒ„…„„„„„„„„„„„„…………ƒ„„ƒƒ‚€€‚‚‚‚€ƒ‚‚‚‚ƒƒ………………………‡‡††††††………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚ƒ‚‚‚‚‚ƒ„…„ƒ‚‚…€€€€€€€€€€€€€€€€†‡‡†……ˆŠ‹y~~‚‹‰tmox†Œ‹†~uu{‚|wrnifiow€‡ˆˆˆˆŠ‰‡ƒ€~}}}~}}~€€€ƒ†††…†„~€€€€€€~}~~~~€€€€€€€~~€€€€~}}€~€€ƒ…‡ˆ†€{wwwwwwwwwtttuvy{|}€~~~|xz€|zzzx{~‚€€€€€€€€€€~~}}~~~~~~~~€€€€€€€€€€€€€€€€€€‚ƒ…†‡……„ƒƒƒƒ„…………ƒƒ€ƒ|}}}}}}}}}}||{|{{{{{{{{{{zzz|€‚‚‚‚‚ƒƒ„…†…‚ƒƒ‚‚‚‚ƒ‚ƒƒ„ƒ„‚}yvuvxx{}~€€€€€€€€€€€€€€€€€~~~|€‰Œ…‚†…~…Œ”š˜Ž€w||‡ŽŽ‡€ƒ…‡†„~}}}}}„†‡††††……ƒƒ‚‚‚~}}}~€‚ƒƒƒ„„„„„…………………†‡‡‡††…†††………†††††††††††††‡ˆˆ‰†††……†††††…†††…„}zy|„‰Ž’Ž‹ŒŒ‹’™š›–“–•‹ƒ|}~~€‚‚€„…„ƒ‚‚€€€€€€‚‚‚‚ƒƒ„ƒ„ƒƒ„„„………„„„„„„„„……………………„„ƒƒƒ„„„„„„„„„„„„„„„…………„„„„ƒ‚€€‚‚‚‚€‚‚‚‚‚‚€ƒ………………………‡‡††††‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚ƒƒƒ‚‚‚ƒ„…„‚‚€€…€€€€€€€€€€€€€€€€…†‡‡…†ˆŠ‰}x{~|€‰‹‚xrt{ƒ‡Ž‰‚zvw|€{vrojgjqx‡ˆ‰ˆˆŠˆ†ƒ€|{z{|{{|~€‚‚„†‡†…†‚€~~€€€~€€€€~~~~~~}~~~€€€~€~~}~€~€€€‚…ˆ‰†{wvvvwwwwxttuvxy{|~€}yz€|zzzx{~‚€€€€€€€€€~~~}~~~~~~~~€€€€€€€€€€€€€~€€€ƒ„†‡……„ƒƒƒƒ„………„„‚€‚ƒƒ‚„‚}}}}}}}}}}||||{||{{{{{{{{zzz|€‚‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚‚‚‚‚‚ƒ„‚~xvuvxyz~~€€€€€€€€€€€€€€€€‚€~€€~ƒŒŽˆ…ˆ‡€Š–™’†}y{…‰‹‰…€ƒ†‡†ƒ~~}}}}‚…‡ˆˆˆˆˆˆ††…„„‚~}}}~€€ƒ„…„ƒ„„…„………………††‡†††„…††……†‡††††††††††††‡‡‰‰†††……††††………††…„~yxz}†’ŽŒ‹Œ”–˜“–™“„|}~~‚ƒ€„…„‚‚€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„………„„„„„„„„„„„„„„„„„„„ƒƒƒ„„„„„„„„„„„„„„…………„„…„„‚€‚‚‚‚€‚‚‚‚ƒƒ………………………‡‡††††‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚ƒ‚‚‚‚‚‚‚‚ƒ„…ƒ‚…€€€€€€€€€€€€€€€€‡ˆŠŠ‰‰ŠŒƒ{vy{{}ƒˆzvx|€‚‹…~yy{}~yurplikqz‚‡ˆ‰ˆˆŠ‰‡…}{{|||{}€‚ƒƒƒƒ„‡‡†…†€~€~€€€€~~~~~}}|}~~€€€~~€~}~~~€€€~ƒ†‰Š‰„{vvvvwwwwvwwxyz{{}€}zz€|zzzx{~‚€€‚€€€€€€€€~~}}~~~~~~~~~~~~~~€€€€€€€‚€€€€€ƒƒ‚‚‚ƒƒ„†…„ƒƒƒ„„……„„ƒ‚€€ƒ„„‚ƒ„‚}}}}}}}}}z|}~}}{z||||{{{{zzz|€‚‚‚‚‚ƒƒ„…†…‚ƒƒ‚‚‚‚‚‚‚€ƒ„‚}yvuvxy{€~~€€€€€€€€€€€€€€€€~|{{}~ˆ‘‰‹‰„~‰””Š€~|‚‰‹ˆ„ƒ„‚€‚ƒ„~~~~}}~€ƒ†‡ˆˆˆˆˆ‡‡…„ƒƒ€€~~~~€ƒ…†…ƒ„„„…………………†‡‡‡††„……†……†‡†††††††††††††‡ˆ‰†††……†††††…†††…„zwzz{‚ŒŽŽŽŽ‘”•– ›„€|}~~„‚‚ƒ„ƒ‚‚€€€€€€‚‚‚‚ƒƒƒ„„ƒƒ„„„……………„…„…„…‚‚‚‚‚‚‚‚…„ƒƒƒƒƒ„„„„„„„„„„„„„…………„………„ƒ‚€‚‚‚‚€‚‚‚ƒ‚‚‚€ƒ………………………††††††‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚ƒ‚‚‚‚ƒ„…‚€€€…€€€€€€€€€€€€€€€€‰‹‹‰†ƒƒƒ{wttwxz{{vuvxyy€|ywxyyxvtsrojlp{‚‡ˆˆˆˆ‰‡‡…€|z{|}||~€‚„„„„…†‡…„…~~~€€}~€~~~~~~~~~€€€~~}~~~~€€€~}~~„†‰Š‰†‚€wwvvvvvvxyyzzz{zz}~~~}zz€|zzzx{~‚€€€€€€€€€€€~~~}}}}}}}}}~~~~~~~~~~€€‚‚‚~~€€€€ƒ‚‚‚‚ƒ„‡†…„„„„…………„ƒ€ƒ„ƒƒ€|}}}}}}}}z{}}~}{z}}}||{{{zzz|€‚‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚‚ƒƒƒ‚ƒ„‚}xvuvxy{€€~~€€€€€€€€€€€€€€€€}{z{}€‹‘Œ‰‡†ƒ‰†‚……‹‹‡„†ˆ…ƒ‚ƒ„‚€}~~~~~~}ƒ†ˆˆˆ‡ˆˆ‡†…„ƒ‚€€~~~~€‚ƒ†‡…ƒ„„„„………………††‡‡††……††……†††††††††††………†‡ˆˆ†††……†††††††‡†…„€zxyyw‰ŽŽŒ‹˜ž¢Ÿ—…€}}~~„‚‚ƒ„ƒ‚€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„……………………………ƒƒƒƒƒƒƒƒ…„„ƒƒƒƒƒ„„„„„„„„„„„„……………………„ƒ‚€‚‚‚‚€‚ƒƒ‚‚ƒ………………………†…………†‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚‚€‚‚‚ƒ„…‚€€€‚…€€€€€€€€€€€€€€€€ˆˆ‡‚|vsrutrqswwuxurrstsqttttttsrusstpllp{‚‡‡ˆˆ‡‰……ƒ{yz|}}|}‚‚„„„††„ƒƒ~}€}~~~~~~~~~}€€€€~~€~~~~~~€€~}}}ƒ…‡‰ˆ†ƒwwwvvvuuzz{{{{zzx{}||}|yz€|zzzx{~‚€€€€€€€~~~€~~~}}}}}}}}}~~~~~~~~~~~€€‚ƒƒ~}€~€€€€€€‚„…†‡†……„„…………„„ƒ€‚€z}}}}}}}}|||||||}~~}}|||{zzz|€‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚ƒ„„„ƒƒƒ„‚}yvuvyy{€€~~€€€€€€€€€€€€€€€€ƒ€„‡‰‰ŠŒŽŽ‹†„…ˆŠŠˆ…„†ˆ‚†Š‹ˆ‡‰‹‰‡†……„~~~~~~~~}€„†‡‡‡†‰ˆ‡†…„ƒƒ‚~}}}~‚ƒ†‡…ƒ„„„…………………†‡‡‡††††‡†…„……††††††††……………†‡ˆ†††……†††‡†††‡‡…„{xywu}ˆŒ’‘Œ‰„‰•žŸ–‰…€}}~~„ƒ‚ƒ„‚‚‚€€€€€€‚‚‚‚ƒƒƒ„„ƒƒ„„„………………………………………………………„ƒƒƒƒƒ„„„„„„„„„„„„……………………„ƒ‚€‚‚‚‚€‚ƒƒ‚‚‚€ƒ……………………………„……††‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚‚€€€‚‚‚ƒ„…‚€€€‚…€€€€€€€€€€€€€€€€ˆ~rnqtsomortutsrqqrrqpontrpnmnpqopqrsuuv~‚…ˆŠ‹ŒŠˆƒ|zzz|}}~‚ƒ€ƒ†ˆ†ƒ€~~€€€€€€€€€€€~~}}}}~€€€~~}||}~~€€€€~~}…ˆˆˆˆ†‚}wsuwwwx€„…€|{yvy}~}|~|x|€€|y{{z|‚€€}‚‚~~}||~€~~~~~~~~~~~~€€€‚‚€€€€€€€€€€‚‚ƒƒ€€‚ƒƒ„…„…„…„…„ƒ„…„‚€‚ƒ‚€~}}}}}}}}{|}}}}|{}||||{{{|{z{‚ƒƒ‚‚‚‚ƒ„‡†…ƒ‚„ƒƒ‚‚ƒƒ„‚ƒƒ‚{wuvxy{€~€€€€€€€€€€€€€€€€……………………ˆ‡…„ƒƒ„„ƒƒ„„…††‡…„„…†‰‹Œ‰‰‰ˆ‡††…‚‚€~~~~}~‚…‡ˆˆˆ‡ˆˆˆ†„„„€}}}‚‚ƒ„………………………………††††††††‡‡‡‡‡†††„…………†††ƒ†‰ˆ†…†ˆ‡‡‡‡‡‡‡‡†…………†‡‡‚|xwxxy|ŠŽ‘‘‘Ž‹…|™œ–Œƒ}€‚€€€ƒ…„ƒ‚‚€€‚‚‚‚‚‚ƒƒƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„‚ƒ„……………ƒƒƒƒƒ„……„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„………†…………„„„„ƒ‚‚‚‚‚ƒ‚‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚€€€€€‚ƒƒ‚‚‚€‚‚‚‚‚„„„‚€„€€€€€€€€€€€€€€€€‚ypnrwwuoprssrqptttttsrqrqnmlmnommnpqrstyz}€ƒ†ˆˆ‡†ƒ€~}}~}~~€‚ƒ„‚‚‚„††„‚~~€€€€€€€€€€€~~}}}}~~€€€€~~~~||~~€€~~~}…ˆˆˆˆ†‚}wstvvvw€…‡„|xty~~{{zxz~{xyzx{}€~€~‚‚~~}|}~€~~~~~~~~~~~~€€€€€‚‚€€€€€€€€€€€‚‚ƒ‚‚‚‚‚‚„…„…„…„…ƒ„…„‚€‚€‚‚‚€~||||||||{|}}}}|{}||||{{{|{z|‚ƒƒ‚‚‚ƒ„‡†…ƒ‚‚‚ƒƒ‚‚‚‚ƒƒ€€~zvtwyy{€~€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ„ƒ‚€€€€‚ƒƒ„„„‚‚‚‚„†‡‡‡‡‡††††„ƒ‚€~~~€‚……†…„„…†…ƒ‚‚‚€~}}‚‚ƒ„………………………………††††††††‡‡‡‡††††……………………ƒ†ˆˆ†…†ˆ††††††‡‡†…………†‡‡‚}xxxxy|ˆ‘‘‘‘Œ„zz„‘ˆ„|~€€‚ƒ‚ƒ…‡†…ƒƒƒƒƒƒƒƒ„„ƒ‚‚ƒ„„ƒƒƒƒ‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„‚ƒ„…………„ƒ‚‚‚‚ƒ„„„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„………†………„„„ƒƒƒ‚‚‚‚‚ƒ‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚€€€‚ƒƒ‚‚‚€‚‚‚‚‚‚ƒ„ƒ‚€„€€€€€€€€€€€€€€€€„}vtx{|zvwxxxwvuwvvuuttttsqpopqqlmnopqrsrsvy}€ƒ„…„}||}zz{{}€‚‚ƒ…‡†„‚€€€€€€€€€€€~~}}}}~~~~~~~~}|~€~~}…‡‡ˆˆ‡ƒxstuuuv†Š‡ƒztz‚{yyyz}~zwxywz}€€}~€‚ƒƒ‚€~~~~}~~€€~~~~~~~~~~~~~€€€€‚€€€€€€€€ƒƒƒ‚‚‚‚‚…„…„…„…„„……„ƒ‚ƒ‚€~||||||||{|}}}}|{}||||{{{|zz{‚ƒƒ‚‚‚‚‚ƒ„‡†…ƒ‚‚‚‚ƒƒ‚‚‚‚ƒƒ‚‚|xvxzz|~~€€€€€€€€€€€€€€€€‚€€€€‚‚‚‚ƒ‚‚‚ƒ„„„………†††††„ƒ€~~ƒ…‡††…‡‡ˆ‡†„ƒ„„|}~‚‚ƒ„………………………………††††††††‡‡‡†‡†††††††………„„…‡‡††‡ˆ†††††††††…………†‡‡ƒ}yxxwy{†Œ‘‘‘‘„zw|…‡…„€||}~ƒ…ƒƒ„‡ˆˆ‡……………………†……„„„…†…„„ƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„ƒƒ„…………„ƒƒ‚‚ƒƒƒ„„„ƒƒƒƒ„„……„„„ƒƒƒƒƒ„„……………„„„ƒƒƒƒƒ‚‚‚‚‚€‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚€€€€€‚‚ƒ‚‚‚‚€‚‚‚‚€‚„„ƒ‚€€‚…€€€€€€€€€€€€€€€€‡‚zwxyxwttuuuuuusrqpooppssrqpppptsrqpnmmnoqtx|„‚€}zyxxwwxyz|}~„ˆ‰‡ƒ€€€€€€€€~}}}}}~~~~~~€}}€~~~€~}€„†‡‡‰ˆ…ztsttst†Šˆ…‚~z|€~|zzz{{xyzx|‚€€€ƒ„„‚€~~~~~€€~~~~~~~~~~~~~€€€€€€‚€€€€€€€€€€€€€‚‚‚‚‚‚ƒƒ„…„…„…„…„………ƒ‚€‚‚‚€~{{{{{{{{{|}}}}|{}||||{{{|{z|ƒƒƒ‚‚ƒƒ„††„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„………ƒ|zy{{|}~€€€€€€€€€€€€€€€€‚ƒƒ„„ƒ‚‚‚‚‚‚‚‚‚ƒ‡†„ƒ‚ƒ„…‚‚ƒ„„…††ˆ‡‡…ƒ~„‡‰‹ŠŠ‰Š‹Šˆ†††…ƒ€~}€‚‚ƒ„………………………………††††††††‡‡†‡†††††††††………„…………†‡ˆ††††††……††………††‡„~yyxwx{‚‰‘‘’‘†|y{{~‚‚‚}|}~ƒ„ƒ‚„†ˆ‡†…………………………„„ƒ„……††…„‚‚€‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„ƒ„„………„„„„„„„„„…„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„…„……†„„„„ƒƒƒƒ‚‚‚‚‚‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚‚‚€€€‚ƒ‚‚‚€‚‚‚‚‚‚ƒ„ƒ‚€€€‚…€€€€€€€€€€€€€€€€ƒzwwwwvxxxxyz{{{zxvvvwxrrrqqpooqqpppooomnoquy}‚}zyxwzzz{}~€€ƒ…‡†ƒ€~}|}}}~~~€€€€€€€~}€€~~~}€ƒ†…‡‰‰†„|uttsrs€…ˆ†………ƒ}|}~~|z}‚}{{|{„„ƒ‚ƒ„‚ƒ„…„ƒ€~~€€€€~~~~~~~~~~~~~€€€€€€€‚€€~~~€€€‚‚ƒ„„…„…„…„…„„…†…ƒ‚‚ƒ‚€~{{{{{{{{{|}}}}|{}||||{{{|zz{‚„ƒ‚‚‚‚‚ƒ„†…„ƒƒ‚ƒƒ„„„„„„„„„………ƒ€}{z{{|}}€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ‚„…†„ƒ‚………„„„„„‡†„ƒƒƒ„„‚‚‚ƒ„……†‡‡ˆ‡…ƒ€„‡Š‹‹‹ˆ‰Šˆ‡„„„„ƒ‚‚ƒ„………………………………††††††††‡†‡†††††……††††††…„ƒƒ…†ˆ‰†††††………†…………†‡‡…{yxwxz~‡‘‘’’‘‡~z{zz}}~~~~€‚€…†…„‚‚‚‚‚‚‚‚ƒƒ‚‚‚ƒƒ†……ƒ‚€€ƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„„„………„„ƒ……„„„„„…„„ƒƒƒƒ„„……„„„ƒƒƒƒƒ„„………………„„„ƒƒƒ‚€‚‚‚€‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚‚‚‚€€‚‚ƒ‚‚€‚‚‚‚€‚„„ƒ€€€‚…€€€€€€€€€€€€€€€€‚‚ƒ‚€€‚‚}zz{}zz{{{yxwrrqqppoonnnprwz}~~}|||{||}~€‚ƒ‚€€ƒƒƒ€€€€~}||}}~~~€€€€€€€€€~}~€~~}€ƒ……†ŠŠˆ‡~wttrrs„‡†…ˆ‰ˆ€|z||{~‚‚~{}}|€ƒ…†„„„…ƒ„…†…ƒ}~€€~~~~~~~~~~~~}€€€€‚€}}~~€€~~~~€‚ƒƒ„„…„…„…„…„…†…ƒ‚‚‚€‚‚‚€~||||||||{|}}}}|{}||||{{{|{z|‚ƒƒ‚‚ƒƒ„……„ƒ‚ƒƒƒƒ„„„„„„ƒ‚‚ƒ~{yy{{|}}€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ~€‚……„‚€†††………„„ƒƒ‚ƒ„ƒƒƒ„„„………†‡ˆ‡„‚€€‚„†‡ˆ‡†ˆ‰‰ˆ…„ƒƒ‚‚‚‚‚‚‚ƒ„………………………………††††††††††††††……………††‡‡‡…ƒ‚„‡ˆ‰‡‡‡†††……††………††‡‡{zxwwz{…Ž’’“““†}yzxxyx{~~~€€€~€‚„ƒ‚€€€€€€€€‚€€€‚„ƒƒ‚€€‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„„…………„ƒƒ„„„ƒƒƒƒ„„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„„……††………„„„„‚€‚‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚‚‚‚‚‚‚‚ƒ‚‚€‚€‚‚‚‚‚‚ƒ„‚€€€‚…€€€€€€€€€€€€€€€€………„„…‡ˆƒ~zxxxxywsqprtv€ƒ„ƒ~€|xtpmlonmmpswy~~~~~}}|z{{|}€„~|~ƒ„€€€~~€~}||||~~~~€€€€€€€€€~~~~€€€~~}‚„„†ŠŠ‰‰xutrrs~„ˆˆˆ‰‰†‚}{}}{|}‚}{||{€‚……„ƒ„…„…††…ƒ}~€‚€~~~~~~~~~~~~}‚‚€€|}}~€€~~}}|€€‚…„…„…„…„……†…„‚‚‚‚ƒ‚€~||||||||{|}}}}|{}||||{{{|zz{‚ƒƒ‚‚‚‚‚ƒ„…„„ƒƒƒƒ„‚ƒƒ„„ƒƒ‚€‚‚€~{yxzz|}~€€€€€€€€€€€€€€€€~„‡ˆ†„‚………„ƒƒ‚‚ƒ‚‚ƒ„†‡…………„„„„‚„†‡‡†ƒ‚€„†‡‡††‰ŠŠ‰‡„„ƒƒ„…ƒ‚€‚ƒ„………………………………†††††††††††††………††††††††…‚€€„‡‰‰ˆ‡‡‡††……†…………†‡‡ˆ|zywwyxƒŽ’’“”•‰}xxwwxv{|{~‚€~€ƒ„„‚€€€€€€€€‚€€€‚€€ƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„„…………„ƒ‚…„„ƒƒƒƒ„„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„…………††††…………‚€€‚‚€‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚ƒ‚‚‚‚‚‚ƒƒ‚€‚€‚‚‚‚€‚„„‚€€€€ƒ†€€€€€€€€€€€€€€€€‚ƒ‚€}||}†ƒ~yusrr{xurqsvx}~€€~|z€€}|zyyonllmptv~~|{yx{{{|~‚‚€}}~€‚‚€€€~~€€~}||||}~~€€€€€€€€€~~}~~€€€€~~}‚„„†Š‹‰‹‚yvtrrs}„ŠŠŠ‰‡ƒ‚}~zz||€€|yz{y~ƒ„ƒ‚‚ƒ„…†‡†„}~€‚‚€~~~~~~~~~~~~}€€‚‚€||}~€€~~}}||€€€€€€€„…„…„…„……††…„‚‚‚‚‚‚€~}}}}}}}}{|}}}}|{}||||{{{|{z|‚ƒƒ‚‚‚‚ƒ„…„ƒƒƒƒƒ„‚‚ƒƒ‚‚‚ƒ„‚€}{xyz{}~€€€€€€€€€€€€€€€€~~~~~~~~‚„ˆ‹ŒŠ‡…„ƒƒ‚€€…„„…†‰‹Œ‡‡†……„ƒƒ€‚…‡ˆ†„‚~€ƒ†‰ŠŠŠ‰‰Šˆ†„ƒƒ}€ƒ†‡…‚€‚ƒ„………………………………†††††††††††††………‡‡‡††††…†‚€„‡‰‰ˆˆ‡‡†††…†…………†‡‡ˆ‚|zxwwyw‚’’“••€xxwyzx}zy~‚„€ƒ…„ƒƒ‚‚ƒ€€€‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„……………„ƒ‚††…„„„„…„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„………†‡‡‡†††……€€€‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚ƒƒ‚‚‚‚‚ƒƒ‚€€‚€‚‚‚‚‚ƒ„‚€€€€‚†€€€€€€€€€€€€€€€€„ƒ€„†„{uqrvyuxyvrrx~~€ƒƒ}tqstvy}€€~|yrnoqppq‚€~}|||{|}€‚ƒƒƒ}~~~~||}~€€€€€€€~~}}|{{{|~€€€~}}~€€}€}{yyyz~€€€€€€}}€…‡†ˆ‹ˆ„|tqrsryˆŠ‰Š‰ˆƒ€~~€}yz~€|yzzw~„†…„„„††…„ƒ‚‚€€€€€€€€€~~~€€€‚‚‚}~~~€€€€€€€€€€€€€€}}}}~€~~~€€~{~}}}~~€€‚„……„„„„……„ƒ‚‚‚€‚‚€~}||{{||}{{{z{||}{{|||}}}}||~ƒƒ‚‚ƒƒ‚‚„†…„ƒ‚‚‚‚„„ƒƒƒƒ„„‚ƒ}yxxuwz}~~}€€€€€€€€€€€€€€€€~ƒƒ€~~‚…ŠŒ‹Š‰‰…€‡„€‰“•’‘Œ‡„ƒ…†„…„…Šˆ~€ƒ…†††…‰‡„ƒ‚‚‚‡ˆ‡…ƒƒƒ…††…„……„„„………††……†††‡‡‡†††††………‡‡†………†‡„‚€€ƒ‡‰‹Œ‹‰†ƒƒ„††††††††‰ˆ„}yyxvy~‰’““••xyyvvy|}}|{|‚~‚†ˆ‡†…ƒ€‚‚‚‚‚ƒƒƒ‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„………ƒƒƒƒ„„……„„ƒƒƒƒ„„…„ƒƒ‚ƒƒƒ„„„„„„„„„„ƒƒƒ„„…‡ˆˆˆˆ‡†…‚‚‚‚€€ƒƒƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€‚ƒƒƒƒ‚€‚‚‚‚‚‚‚‚ƒ‚‚ƒ„„‚‚‚…€€€€€€€€€€€€€€€€„‚€„†„{uqruxwyyuqry€ƒƒ}tqstux|€€{vsnknu„ƒ€~~}}{{|}~€‚ƒzy|~~}|}}~€€€€€€€€~~}}||{{|~€€€~~€}~~|zxxyxxz}€€€€€~}€…‡‡ˆ‹‰†~vrrsrx€ˆ‰‰Š‰ˆ€}{|~|xz€|yzzx~„†…„„„„„ƒ‚€€€€€€€€€€€~~~€€€}~~€€€€€€€€€€€€€}}}}~€€~€€~|}}}}}~‚ƒ……„„„………„ƒ‚‚‚€‚‚€~{{{{{|}~{{{{{|}}{{|||}}}}|{}ƒ‚‚ƒƒ‚‚„†…„ƒ‚‚‚‚„„ƒƒƒƒ„„ƒ„„|xvvvxz}~~}€€€€€€€€€€€€€€€€~ƒƒ€~~‚†ŠŒ‹‰‰‰…€‡„€€ˆ’•“’‰…‚ƒ„„…„…‰Œ‡}„………„‡†…„‚‚†‹‹‡…„„…††…„ƒ„„…………†††……†††‡‡‡††††…………‡‡†……††‡…„ƒ„†‰ŒŽŽŽ‹ˆ……†††††††††‡†‚|yzywx|†”•––Ž‚xxywvy|}}}|}€‚„†…„ƒ€€€‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„………ƒƒƒ„„„……„„ƒƒƒƒ„„…„ƒƒ‚ƒƒƒ„„„„„„„„„ƒƒƒƒ„……ˆˆ‰‰ˆ‡††‚‚‚‚‚€€ƒƒƒ„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€‚ƒƒƒ‚‚€‚‚‚‚‚‚‚‚ƒ‚‚ƒ„…†ƒ‚‚€‚†€€€€€€€€€€€€€€€€ƒ€~„†…zurrtuxyxtprz‚€„ƒ}tqsuuwz‚ƒƒ‚€}xpls~†…ƒ€{{{{}~€‚‚{tty~~}||}~€€€€€€€~~~}||{{|~€€€€€}~}{xwuutxwxz}€€~~}€„‡†ˆŠŠ‡xsssrx€‡‰‰Š‰ˆ|z{~}yz|zzzx}€„……ƒƒ„€~~~€€€€€€€€€~~~~~~€€€~~~~€€€€€€€€~}}}~€€€€€€}}||{|}~~ƒ„…„„„………„ƒƒ‚‚‚‚€~{z{{|}~|{{{{|}}|||||}}}|{z|€‚€‚ƒƒ‚ƒ„†…„ƒ‚‚‚‚„ƒƒƒƒƒƒ„…†…‚}xvuwx{}~~~}€€€€€€€€€€€€€€€€‚„ƒ~~‚†Š‹Š‰‰Š…€‚‡„ˆ’–“‘‘‹†‚€„……„ˆŠ†~|~€‚„„„ƒ‡‰Šˆ†„„……Š’Š†„…†‡†„‚‚‚……†…††††……†††‡‡‡†††††………‡††…††‡ˆ‡‡‰‹‘’Š‡‡‡††††††††††ƒ~|||zyzƒŽ”•–•Žƒyxywvx|}~}}~ƒ€~‚ƒ‚€€~||}~}|~€ƒ‚‚‚€€€‚‚‚‚‚‚‚‚ƒƒƒ„„„……ƒƒƒƒ„„……„„ƒƒƒƒ„„…„„ƒƒ‚ƒƒ„„„„„„„„„ƒƒƒƒ„…†‰‰ŠŠŠ‰ˆ‡ƒƒ‚‚€ƒ‚‚ƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€‚‚ƒƒƒ‚€‚‚‚ƒ……‡„‚€‚‡€€€€€€€€€€€€€€€€‚€~~~„†„€ytssssyyxtps|„‚ƒƒ{tqsxwwz}‚„…~~~}xv}‡‡†„‚€€||{||~€‚ypow}~||}}~~€€€€€€€€~}}||{}~€€€€€€€€}|zwutttuwwwz}€~~~}„†‡‡ˆŠˆƒztrrrw‡‰‰Š‰ˆ~{||{}z{zx}€„…„ƒƒ„€€€€~~€€€€€€€€€~~~~}}}~~~~€€€€€€~}}}}~€€€€~||{{{||}€„„„„…†……„„ƒ‚‚€‚‚€~||{{{|}~||{{{|}~||||||||{zz|€‚‚ƒ‚ƒ…†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„……‚}ywwyz{}}~}}€€€€€€€€€€€€€€€€€ƒ…„~ƒ†‰ŠŠ‰Š‹…€‡ƒˆ“–”ˆƒ€…†…„…‡„~|~€ƒ„„„ƒ†‰‹Š‡……†‡Œ‘”‹…ƒ„…††„ƒ‚ƒ††††††††……†††‡‡‡††††…†……‡‡†††‡ˆ‰‰‹Ž’““’‘’‘ŽŠ‡‡‡†††††††††‡…€|zŒ“””’„zwxwwx{}~ƒ}}€~~{yyz{zy|}~‚ƒƒƒ€€€€‚‚‚‚‚‚‚‚ƒƒ„„„„„„ƒƒƒ„„…„…„„„„„„„„…„ƒƒ‚ƒƒƒ„„„„„„„„„ƒƒƒ„…†‡‰ŠŠ‹‹Š‰‰„„ƒ‚€‚ƒƒ‚„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€‚‚ƒƒ‚‚‚‚‚ƒ„…†‰†ƒ‚€ƒˆ€€€€€€€€€€€€€€€€€~}~„‡ƒ~wttttswyyurt}„ƒzrpsyxxy}€ƒ„|{|€‚„ˆ‡†„‚€~~~~}~‚xoov}~|||}~€€€€€€€~~}|||}}~€€€€~{yxwuuuwxwvvy}€~~~}~ƒ‡††‡ˆˆ„{tqqrv~†ˆ‰ŠŠˆ‚~{z~~|{€}{{{y}€ƒ…„ƒƒƒ€€€€€€€€€€€€€€~~~||}}~~~~~€€€€~}}|}}€€}|{z{{||~€ƒ„„„…††……„ƒ‚‚‚ƒ‚€}~}|{{{|||||{|}}~||||||||{zz|€‚‚‚ƒ…†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ‚„‚{{{{{||}}}}€€€€€€€€€€€€€€€€‚„†…‚~~„†‰Š‰‰Š‹…€‚…ƒ€Š”—”Ž‰„€…‡†‚ƒ„‚}}ƒ………„‚…ˆ‡„‚ƒ„†Š‘Žˆ„‚ƒ„†……„„„††††††††……†††‡‡‡†††††………‡†††‡‡‰‰ŒŽ’“’‘‘‰†……†††††††††‡†ƒ‚ƒƒ}y~Š’””’†{wwxxx{}€€€€‚„‚||}~~}|zxwxyyxz{~‚ƒ‚€€€€‚‚‚‚‚‚‚‚„„„„„„ƒƒƒƒƒƒ„„……„„„„„„„„…„„‚ƒ‚ƒƒ„„„„„„„„„ƒƒƒ„…‡‡ŠŠ‹‹Œ‹‹Š……ƒ‚‚€ƒ‚‚ƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€‚ƒƒ‚‚‚‚‚‚ƒ…‡ˆŠ†„ƒ€ƒ‡€€€€€€€€€€€€€€€€~||~„‡€{usuvusuxyxuv}ƒxpnqxxwy|€‚ƒ{{‚‡‡……ˆ‡…ƒ€~~€€€€zsrw|}{|}}~~€€€€€€€€~}}||~}}€€€~|zxwwwwxxyvuuy|€€€~€}}ƒ†‡††‡ˆ…}tqqru~…ˆˆ‰Šˆ‚}yxz|{y{€‚~{|{y|ƒ„ƒ‚‚ƒ€€€€€€€€€~~~|}}}~~€€~~~~~~€€€€€‚~~}}|}~~€~}}|{z{{|}‚ƒ„„†‡††…„ƒƒ‚‚‚€‚‚€~~}|{{z{}||||}~~}}}||||||{z|€‚€‚‚‚„…†…„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚€‚ƒ‚}|}|}|}}}}}€€€€€€€€€€€€€€€€ƒ…‡†‚~…‡‰‰ˆˆŠŒ…€„ƒ‚…Ž—˜“ŽŒˆ„€…‡†‚€‚€}}„………„‚„……ƒ‚ƒ„…ˆ‹Š†„ƒƒ…††………†††††…†…………†††‡‡‡††††…†……‡‡††‡ˆ‰ŠŽ‘‘ŽŒˆ…„„††††††††„†…ƒ‚ƒƒ{v{ˆ‘”””‘‡|vvxxxz}€‚‚ƒ…‚{{|~~~|zwwxyxwz{}€€€€‚‚‚‚‚‚‚‚……„„„ƒƒƒƒƒƒ„„„……„„„……„„„…„ƒƒ‚ƒƒƒ„„„„„„„„ƒƒƒ„…†‡ˆ‰Š‹‹ŒŒ‹‹‡…ƒ‚‚€ƒƒ‚„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€€‚ƒƒƒ‚‚‚‚‚‚„†ˆ‰‰‡……ƒ‚†€€€€€€€€€€€€€€€€~}||~…‡}xssvywtqv{{yx|€€}vnmpuuvy}ƒƒ‚|z€‡ˆ††Š‰‡„‚€~€€}xwz||{||}~€€€€€€€~~}||~}}€~}}~}{xwwxxxwwvutux|€€€€}}‚‡‡……†‰‡vrrtu}…ˆˆ‰Š‰„ywyzyw|€‚~|||z|‚„ƒ‚‚‚€€€€€€€€€€€€~~~}}}~~€€€~~}~~€€~€€€‚‚‚ƒ~}}|||}~~}~~~}|{{{|||~ƒ„„†‡††…„„ƒ‚‚‚€‚‚€~~}|{{{{{}}|||}~}}}|||{{}|{}ƒ‚€‚‚‚„††…„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚‚ƒ„‚|{|~}}}}}}}€€€€€€€€€€€€€€€€„†ˆ†‚~~…‡ˆˆ‡ˆŠ…€‚‚ƒ„‰’š˜’‘‘Œ‡ƒ€€†ˆ†||~€‚„„„ƒ„„„„„„………‡‰‰‡…†‡…†‡‡†………†††…………„……†††‡‡‡†††††………‡†††‡‰Š‹Ž‘‘‰…„„††††††††„††ƒƒ„ƒ€{vzˆ’”•‘ˆ|uvxyxz}ƒƒƒ„…~{z|€€|zxxyyyxz{}~€€€€‚‚‚‚‚‚‚‚‚‚………„ƒƒƒ‚ƒƒƒƒ„„……„„…………„„…„ƒƒƒ‚ƒƒ„„„„„„„„ƒƒƒ„…†ˆ‰‰‰Š‹ŒŒ‹‹ˆ†„‚€‚€ƒ‚‚ƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€€‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ„†ˆŠˆ‡‡ˆ†‚‚„€€€€€€€€€€€€€€€€~}{|}…‡{vqrwzxuou|}{y|€|umlorsuy~‚ƒƒ€{y~„‡‰ŒŒ‹ˆ†„‚}~€‚‚€~}|{{|{{|}}~€€€€€€€€€~~}}|~}}‚€~}}}}zxwxyyxvtrttux|€€€€€€}}‚†‡…„†‰ˆ€wssuu}…‡ˆ‰Š‰‡‚|yz{zx|‚|||z|‚„ƒ‚‚‚€€€€€€€€€€€€€~~~}~~~€€€€€~~~}~~€€~€€‚ƒƒƒ~~}|||}}}€~}}~~~}|{{|||~ƒ„…†‡††……„ƒ‚‚‚€‚‚€~}||{{||}}}|||}~}}}|||{{}||~ƒƒ‚€‚‚‚„††…„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚„……ƒ{zz~~}}|}}}€€€€€€€€€€€€€€€€„‡ˆ†‚~~†‡ˆˆ‡ˆ‹…€ƒ†Œ•›™’“’‹††ˆ†}~~|{}ƒƒ‚‚„‚‚ƒ„„…‡ˆ‡…†‡Š‡ˆˆˆ†…„…††………„„„……†††‡‡‡†††††………‡††‡‡‰‹ŒŒŽ‘’“’“‘Ž‰†……†††††††††ˆˆ…„…„‚|w{ˆ‘’“‘‰}uuxyxz}ƒƒ„„…~zz|‚}{xxyzzx{|}~~‚‚‚‚‚‚‚‚‚‚‚‚………„ƒƒ‚‚ƒƒƒ„„„……„„…………„„…„ƒƒ‚ƒƒƒ„„„„„„„„ƒƒƒ„…‡ˆ‰ˆ‰Š‹‹‹‹‹ˆ†„€‚‚€ƒƒƒ„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€€‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ„‡‰Š‡‡ˆ‰‡ƒƒ€€€€€€€€€€€€€€€€ƒ€}{|ƒ…ywuttuwysuwwvwz}}|zwtqontux{‚„†{yx|‚†…ƒŠ†ƒ€|{{…†€{ƒ~{yyz{}}~~~~}}~~~€€€~~}}}}~~~~€€€€€€~|{zwyzywvvwuuvwz|~€}~~~~}€~~ƒ‡‡…Š‰‡…‚|{|ƒ‡‰Š‰ˆ‚|x{}|{z{}€|yww|…ƒ‚‚‚€€€€€€€€€€€€€~}~€}~~~~~~~~~~~~~~~~‚€~~€~‚€€€}}|||}}~€~~~}}}|{{{{|}~€‚„…………………„ƒ‚ƒ‚€~~~}}}|||~~~~~~~~€}|||~~{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒ‚‚ƒ‚„…ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€€ƒ…„‚…ŠŠŠŠŠŠŠŠ‰‡„€~~€ˆ‰‹Ž‘”–—”’‹‡ƒ~‰ˆ‡…ƒ~}}~€‚‚‚‚ƒƒƒ„…††‡‡ˆˆˆ†††††††††…†…†…†………†‡ˆ‡‡‡‡‡‡‡†††…†††‡ˆŠ‹Œ‘ŽŒŒŽ‘‘‘’’‘Ž‹‡…†††††††††ˆ‡…„…„‚zzz|€„‰ŒŽˆ~wuvy{|~€‚~{{~‚‚zwxzyy{y|‚ƒ‚€€€‚‚ƒ„„ƒ‚‚„„„ƒ„ƒ„„ƒƒ„„„„……‚ƒ„„……„„„„ƒƒƒƒ„„„………††††„ƒƒ„‡ˆˆ‡ˆ‰Š‹‹ŠŠŠ‰ˆ†„‚€‚‚‚‚‚‚‚‚‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€‚ƒƒ‚‚‚‚„†ˆ‰ˆ‡ˆˆ…‚„ˆ€€€€€€€€€€€€€€€€~}{{{~‚yxvuuvxy{ytpot}„~~|zwvtsz{}€‚…‡ˆ‚€„†…‚ŽŒ‹‰ˆ‡‡‡‚}~€}y~|zyz{|}}~~~}}~~~€€€~~}}}}~~~~€€€€€~|{yywyzywvvwuvvxy|~€~~~~~~~~€~ƒˆˆ†‰Š‰‰ˆ‡††‚ƒ†ˆ‰‰‰ˆƒ}y{}|zy{~€€|yww|„ƒ‚ƒ‚€€€€€€€€€€€€~}~€}~~~~~~~~~~~~~~~~}}~~}‚€€€€€~}}|||}}~~~}}}}}|{{{{|}~€‚ƒ………„„„ƒƒ€€‚€‚‚‚€~~~}}}|||~~~~~~~~~~}|||||{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒƒ‚‚‚ƒ‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€ƒ…ƒ€~€‚‰‰‰‰‰‰‰‰‡…ƒ~~~‚ƒ†ˆŠ‹ŒŒ‹‰†‚|{„„ƒƒ€{{{||}}}‚‚‚ƒƒ„„„…††‡‡ˆˆˆ††††††††…†…†…†…†……†‡‡‡‡‡‡‡††††………††ˆ‰‹ŒŽŒ‘‘‘‘‘‘ŽŠ†„††††††††…††„ƒ„ƒwvvvwz|}€}ywwyyz|~€ƒ~{{~‚‚zwyyyy{z{}€€€€‚‚ƒ„„ƒ‚‚ƒƒƒ„ƒƒƒƒƒƒƒ„„„„…„„………„„ƒ„„ƒƒƒ„„„„…………†††…„ƒ…‡‰ˆ‡ˆ‰ŠŠ‹ŠŠŠ‰ˆ†„‚€‚‚‚‚‚‚‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€‚ƒƒ‚‚‚ƒ†‡‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€‚‚‚‚ƒƒ††„„„„††}xrqw‰ŠŠŠˆˆ††…‚ƒ„†‡ˆ‰‰‡…„……ƒ‹‹‹‹ŒŒˆzvxyzxyyxxyz|}}~~~~}~~€€~~}}}}~~~~€~|{yxwwxyywvvvuuvwz|~€~}}~~~ƒˆŠˆˆˆˆˆˆ‡††ˆˆ‰‰‰‰‰‰„~z{}{yx|~€€|ywv|„ƒ‚ƒƒ€€€€€€€€€€€€€~~€€~~~~~~~~~~~€~}}}~}}€€€~}}|||}~~~}}|||}}|{{{{||}ƒ„……„„„ƒƒ‚€€‚ƒ‚€~~~}}}|||}}}}}}}}|||}|{{z{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒ„„ƒ‚‚ƒƒ‚„…ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€ƒƒ‚€~€€€€€€€„„„ƒ‚}|}~‚‚„ƒ‚€~|{z~}}||||{ƒƒƒ„„„…………††‡‡ˆˆ†††††††††…†…†…†………‡‡ˆ‡‡‡†††…†…………†‡‰ŠŒŽŽŽŽ‰†ƒ†††††††††‡†ƒ‚}yxxwwwwwvvwy{{yw|~€‚€}{{~ƒƒ€zwxzxy{{{||~~€€€‚‚ƒ„„ƒ‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„…………††…„„ƒ„„„ƒƒƒ„„………………††…„ƒ„‡ˆˆ†ˆˆ‰Š‹ŠŠŠŠˆ‡„‚€€‚‚‚ƒƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚‚‚‚‚‚‚„…ˆ‰ˆ‡ˆˆ…„ˆ€€€€€€€€€€€€€€€€…†††„ƒ€‚‚‚‚‚}„ˆƒƒƒ„ƒ„„„………††‡‡‡ˆ‡†…„ƒ€€€‚ƒƒ„{vpnptvvttuwy{}}~~~~~~€€~~}}}}~~~~~€|{xwvuxxxxwwuuuvvxy|~€€~}}~€~‚ˆ‹ŠŠŠŠ‰ˆ‡……‹Š‰ˆ‡ˆ‰Š…z|}zxw|€|xvv{„ƒ‚ƒƒ‚‚€€€€€€€€€€€€~€~~~~€~}}~~~€‚‚€€~}||||~~}}||{|}}|{{{{||}ƒ„„……………„ƒ‚‚€‚‚‚€~~~}}}|||}}}}}}}}{|}~~|{z{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒƒ‚‚ƒ‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€€€€‚‚‚‚„…†‡…ƒ€}€€~~‚‚‚‚‚‚‚‚„„ƒƒ€€ƒ„„……†††„……††‡‡‡††††††††…†…†…†…†…††‡‡ˆ‡‡………………………†ˆŠŒŽŽŽ‘Œ‰…ƒ††††††††‡ˆˆ†‚}xuxxxyxxxxuwy|}|xv|~€ƒ}z{~‚ƒƒ€{wyyyxz{{zz{}€€€‚‚ƒ„ƒƒ‚‚ƒƒƒƒ‚ƒƒƒƒ„ƒ„„…„………†††……„„„ƒƒƒ„„„……………………†„ƒ…‡ˆ‡†‡ˆ‰ŠŠŠŠŠŠ‰†…‚€€‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚‚‚‚‚ƒ†‡‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€ƒƒ‚€}yvtuuuvvuuuoruutrstssttvvwwtttttsssrssrqppqqqqqqqqqpnllnprrpqtwz}~~~€~~~~}}}}~~~~~~~}{xwvvuxxxwxvvuuuvwz|~€€~}}~€~‚‡‹‹ŠŠŠŠŠ‰‰ˆŠ‰‡††‡‰Š…z|}zxw}€|xvu{€„ƒ‚ƒ„‚‚‚‚€€€€€€€€€€€~€€~~~€€~~€‚‚€€~}}|||~}}|}||{}}|{{{{||}‚„„„„„…„„ƒ‚‚‚ƒ‚€~~~}}}|||}}}}}}}}|}~|{{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒ‚ƒƒ‚‚‚‚„…‚|{{zz{}|z{~€€€€€€€€€€€€€€€€~~~€‚„……ƒ‚ƒ‚ƒ‚ƒ‚†‡‰‰ˆ†ƒ†……„„ƒ‚‚‚‚ƒƒ„ƒ„„‡‡†……ƒƒ‚ˆ‡‡……„ƒƒƒƒ„„……††„„……††‡‡†††††††††…†…†…†………‡‡ˆ‡‡†……………………†‡‰ŒŒ‰…ƒ†††††††††‡ˆˆ„}uquvwxyxxxxxyz|{yw|~€‚|z{~‚„„{xxzxxz{zyyz|~€€€‚‚ƒƒ„ƒ‚‚‚‚‚‚ƒ‚‚‚ƒƒ„„„„……ƒ„……††††„„„ƒƒƒ„„………„…„…„†…„…‡‡‡…†‡ˆ‰ŠŠŠŠŠ‰‡„ƒ€€‚ƒƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚‚€‚‚‚„…ˆ‰ˆ‡ˆˆ…„ˆ€€€€€€€€€€€€€€€€‚~{wurqqrsttsrqopqpnnpspppqrsssrrrqqqqqnoqponpqppoonmllqqpqppoonqtx{~~€€~~~}}}}~~~~~~~~}|zxvvvwxwwwwwutuvvxy|~€€~~~~€€~†Š‹ˆˆˆ‰‰‰ˆˆ‰ˆ‡††‡ˆ‰„~z{}{yx~€€|xuuz€ƒƒ‚„„‚‚‚‚‚€€€€€€€€€‚€€€€€€€€€€~~€€€~~€€€€€€€~}}}}}~~}}}}||}}|{{{{|{|~€‚ƒ„„ƒƒƒƒƒ‚‚€‚‚‚€~~~}}}|||}}}}}}}}~~~~}|{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒ‚‚ƒ‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€€„††…‡‡ˆˆ‡†…„……„ƒ‚‚„„„……††‡‰‰ˆ‡……„ƒ„„„„ƒƒ‚‚ƒƒƒ„„………ƒ„„……†††††††††††…†…†…†…†…††‡‡‡‡‡………†…†††ˆ‰‹ŽŽŽ‘‰†ƒ††††††††ƒ„‡‰†~wsvwwxxyxxxwvwxzzy|~€ƒ~|z{~‚„…|xyyxwyzzyyz|~€€‚‚ƒ„„ƒ‚‚‚‚‚‚‚‚‚‚ƒ„ƒ„„…„…‚‚„…††‡‡„„ƒƒƒ„„„……„…„„„„‡…„…†‡†……†‡‰ŠŠŠŠ‹Š‡…ƒ‚€€€€‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€‚‚€‚ƒ†‡‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€|yusrstnoqrrqonpppmklorpppqqqrrppppqqqqmprqnmoqtsssrrqqtuusrpppoqvz}~€€€~~~}}}}~~~~~}}}|{ywvvxxxwvvxwusuuvwz|~€€€~€„‰Š‰‰ŠŠŠ‰ˆˆ‰ˆˆˆ‡ˆˆˆƒ}y{}|zy~€‚€|wutzƒ‚‚„„ƒƒ‚‚‚‚€€€€€€€€‚€‚€€€€€€€€€~~~€€}}~€~€€~}}~~~~~}}}}}|{{{{|{|~€‚ƒ„„‚ƒƒƒƒ‚‚‚ƒ‚€~~~}}}|||||||||||~}||||}{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒ„„„ƒ‚‚ƒ„‚„…ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€‡„‚ƒ…†„……………………††„ƒƒƒ„„‚‚‚€€€‚‚‚ƒƒƒ„„……………………€‚‚‚‚‚‚‚ƒƒ„„„ƒƒ„„……†††††††††††…†…†…†………†‡ˆ‡‡‡……††††‡‡‰‹ŽŽŽŽŽŽ“‘‘‘ŽŠ†„††††††††„„‡‰†ywwwwvwwwwywuuwxyy|~€‚~{z{‚……‚|yyywwyyyzz|}~~€€‚‚ƒ„„ƒ‚‚‚‚‚‚‚‚ƒƒ„„„„……‚‚„……………„„„ƒƒƒ„„………„„„„ƒ‡†……‡‡†„…†‡‰ŠŠŠŠ‹Šˆ…ƒ‚€€€€€€‚‚ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€€‚‚€‚‚‚„…ˆ‰ˆ‡ˆˆ…‚„ˆ€€€€€€€€€€€€€€€€usolkmprpqsuusqpqrsqonpsuuuuuuuuppqqrrsspsusomorpppqqqqqtttsqqrsprw{~€€€€~~}}}}~~~~~}}}|zxvvwyzxwvvwwusuvvxy|~€~€€~€€~ƒˆŠˆˆˆ‰‰‰‰ˆŠŠŠ‰‰ˆ‡‡‚|x{}|{z~€‚€|wutzƒƒ‚„„ƒƒƒ‚‚‚€€€€€€€€‚€€‚€€€€€€€€€€~~~~||}~~}~€~~~}~~~~~}}}|{{{{|{|~€‚ƒƒ„ƒ„„„„„ƒƒ‚‚‚€~~~}}}|||||||||||~}|zz{|}{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒ………„ƒƒ„…‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€Œ‰…„†…‚~‚‚‚‚‚‚‚‚…ƒ€‚ƒ€€€€€€‚ƒ„…††€€‚ƒ„„‚‚ƒƒƒ„ƒƒƒ„„………††††††††…†…†…†…†……†‡‡‡‡‡…†††‡‡‡‡‹ŒŽŒŽŽŒŽ‘”‘’’‘Ž‹‡…††††††††ˆ‡‡ˆ…~zyxxwwwxxy|zwwwxxw|~€ƒ}{y{~ƒ……‚|yyywwyyyz{|}~~€€‚‚ƒ„„ƒ‚‚ƒƒ„„„„……ƒƒ„„…„„„„„ƒƒƒƒ„„………„„„ƒƒ‡†……†‡†„„…‡ˆŠŠŠŠ‹Šˆ…ƒ‚€€€€€€€€‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€€‚‚‚„†ˆ‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€zwsonoqrurppsutrsrppqrrqrtspnopqqrstuuuuvurqrrrrqqqrrsstssssssrrrvz||||}~~~~~~~}~€€}}}}}}}}~~}{ywxxxxxxxxxyyxxwvuwvuuw{~€~~~~}ƒ†ŠŠˆ‡†††††‡ˆ‰ŠŠŠ‰ˆ€|z|}{{|€{wuuy~‚‚‚„„ƒƒƒƒƒƒƒƒƒ~€€~€‚‚‚‚€€€€€€€€~~~~~~~~}}}€€€}}}}}}}}}}~~~€~|{zzz}{{}„……„„„„ƒ‚€€‚€€‚‚€~}}}||{{}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ……ƒ‚ƒ„…„ƒƒ„…€‚ƒ~{zz~|xxzz{€€€€€€€€€€€€€€€€ˆ†ƒ€‚ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚‚ƒƒ‚‚‚„…†‡††…………††††††‡‡‡‡††ˆ‡‡‡‡‡‡‡‰ˆ‡†‡‰‹ŽŽŒŒŽŽŽ‘Œ‰‡††††††††‡‡‡†„€{wwxy{||zxzyxwwxyy~~~€‚€~{{~‚ƒ€{xyzyy{xwwwy{~€€€€ƒ„„„ƒ‚€ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„…†…„‚‚ƒƒ„…„…„…„…„ˆ‡………†……~‚‡Š‹ŠŠŠŠŠŠ‡„‚‚‚‚‚‚€ƒ…„„„………††††††††††……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€€€‚„‡‰Šˆ‰Š‰„€„‹€€€€€€€€€€€€€€€€ywtrpppqsqnortrqqqpppppqqqqpnnpsuvwxxwvvtsqqrtuussssrrqqqrrrqqppruz}||}~~~~~~~}}}~€}}}}}}}}|}}|{yxvwwwwwwwwxxxxwwvuwvuvwz~€~~~€~}‚†‰ŠŠˆ‡………††‡ˆ‰‰‰ˆ‡€|z||{{|{wvvy‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€~~~~~~~~~€€€€€€~~~~~~~~}~~~~€}|{zzz}|{}€„……„„„„ƒ‚€€‚€‚‚€}}}}||||}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ…„ƒ‚ƒƒƒƒƒƒƒƒƒ„‚~{z{||yz|{z€€€€€€€€€€€€€€€€‰‡„‚€‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚ƒƒ‚‚‚„…†‡††………††††‡††‡ˆˆ‡††‡‡‡‡‡‡‡‡†††‡‰ŒŽŽŽŽŒŽŽ‘‘Œˆ†††††††††‡‡‡†…|xvwy{|}}|zzxwwxxy~~€‚€}{{~‚‚€{wxxwwywwwxy|~€€€€‚ƒƒ„ƒƒƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„…†…„ƒ‚ƒƒ„„…„…„…„…‡†……††…„‚‡Š‹ŠŠŠ‰ŠŠ‡„‚‚€‚‚‚‚€ƒ…„„„………††††††††††……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€‚„‡‰Š‡ˆŠ‰„€„Š€€€€€€€€€€€€€€€€xwusqppoqomnpqqonoqppopponooonrv}|{yxvtsrqpprsttsrqppqrsqrsrqoopquz|}|}~~~~~}~}}}}~}}}}}}}}{{zyxwwvwwwwwwwwwwxxwvvuwvvvxz}~~~~€€„‰‹Š‰†„„…†…†‡ˆˆ‡‡†€|z|}{{|‚{xvv{€ƒ‚‚‚€‚‚€‚€€€€€€€€~~~~~~~~€€~~~€}|{z{{}{{}ƒ……„„„ƒƒ€‚€€‚‚€}}}}}|||}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ…„ƒ‚‚‚ƒ‚‚ƒ‚‚„…‚{{{z{y{}{y~€€€€€€€€€€€€€€€€Šˆ†ƒ‚€€€ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚ƒƒ‚‚‚‚„…†‡††……††††‡‡†‡ˆˆˆˆ‡†‡‡‡‡‡‡‡‡††ˆŠŒŽŽŽŽŽŽŽŽ‘‘‘Ž‹ˆ………………………‡‡‡‡…‚}zwxzz{|}~{zyxwwxx€~~€‚€}z{}€‚‚zwwywwyxxyz{}€€€‚ƒ„„„ƒƒƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„…†…„ƒƒƒ„„…„…„…„…„………†‡†…ƒ€ƒ‡ŠŠŠŠŠŠŠŠ‡„‚€‚‚‚ƒƒ…„„„……………………………………„„„……†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚„‡‰Š‡ˆ‰‰„„‰€€€€€€€€€€€€€€€€zwsommnopnmnoqonnopqppopnnnooqty}{xutsssqpoooppprqommnopprsronnppuy||}}~~}~}}}}|||}~|||}|}||zzyxwwwwwwwwwwwwwwwxwwvuwwvwxz|~~~~~~€~~‚‡ŠŠ‡…ƒ…††…†‡ˆˆˆ‡†€|z||{{|€{ywx{€ƒ‚€€~€€€‚€€€€€~~€€}~}~€‚€€€€€€€€~~}|{{{{}|{}€„……„„„„‚‚€€‚€‚ƒ€}}}}}}}}}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ„„ƒ‚‚‚‚‚‚‚‚‚‚ƒ……ƒ|zzzzxy|zy~€€€€€€€€€€€€€€€€Š‰‡…‚€ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚ƒƒ‚‚‚‚„…†‡††…††††‡‡‡‡ˆˆ‰‰ˆˆ‡‡‡‡ˆˆˆˆˆ‰Š‹ŽŽŽŽŽŽŽŽ‘‘ŒŠ‡………………………‡‡‡‡†„€}zzz{zyz}{zyxwwxx€€~~}zz}€‚~yvyzzz}}}}~~€€€€€€‚„„…„„ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„………„„„„„„„…„…„…„…„„…‡ˆ‡„‚„ˆŠŠŠŠŠ‰ŠŠˆƒ‚‚‚€‚‚‚‚€ƒ…………………………………………………„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚‚‚„‡‰Š‡ˆ‰‰…‚„ˆ€€€€€€€€€€€€€€€€|xqljkmponnnpppnooppqqponopoqtxyzwtqqqqqqponoonmmnnoonnmnoqpnlmnpty|}}~~~~~~}}}|||{||~~{{{{|{{{zyxxwwxxwwwwwwwwwwxwxwvvxwxxz{|}~~~~~€~}€…‰ˆ…‚ƒ†ˆ†††ˆˆ‰ˆ‡‡€|z|}{{|‚€}yxy|„‚€€€€€€€‚‚ƒ‚‚€€€€€€}}}}~‚~~~~~}{{{{|}{{}ƒ……„„„ƒƒ€‚€€‚‚€}}}}~}~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ„ƒ‚‚‚‚‚ƒ‚ƒƒƒ‚‚ƒƒƒ……‚zyy{zvvxwx~€€€€€€€€€€€€€€€€‰‰ˆ†…‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚ƒƒƒ„ƒƒ‚ƒƒƒ‚‚ƒƒƒ‚„…†‡††††††‡‡ˆ‡ˆˆ‰‰‰‰ˆˆˆˆˆˆ‰‰ŠŠŒŽŽŒŽŽŽŽŽŽŽŽŽŽ‹ˆ†………………………‡‡‡‡‡…‚€{yyzzxy{{zyxwwxx€€~~|zz|}xwy|}‚‚‚‚€€€€€‚ƒ„………„ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„………………„„ƒ…„…„…„…„ƒ„…†‡‡„‚ƒ…ˆŠŠŠŠ‹ŠŠŠ‡„‚€‚‚‚ƒƒ………………………………………………„„„……†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚‚‚„‡‰Šˆˆ‰Š‡ƒ„ˆ€€€€€€€€€€€€€€€€}ztommnponnopqonoonpqrqpoppqtxyywtrqqpompooooponllnoopppmoppnmmnosx|}~€~~~~}}|||{{{{|}}zzzzzzzzxxxxxxxxwwwwwwwwwxxxxxwwyyz{{}}}~~~~~~|~‚†‡„€…‡††‡ˆ‰‰‰ˆ‡€|z||{{|‚€}zyz|„ƒ‚ƒ‚‚‚€€€€€‚‚‚€‚‚€€€€€~}|||~€~~~~~~}}~~||{{||}|{}€„……„„„„ƒ‚€€‚€‚ƒ€}}}~~~~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒƒ‚ƒ„„ƒ‚ƒ„ƒ„„‚}ywwzxtsvuw}€€€€€€€€€€€€€€€€‡‡‡‡†„‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„ƒƒƒƒƒƒƒ‚‚ƒƒƒ‚„…†‡†††††‡‡ˆˆˆˆ‰ŠŠŠŠ‰ˆ‰‰‰ŠŠ‹‹ŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŒ‹‰‡††……………………‡‡‡ˆˆ‡…ƒzwvz|{z|zyxwwxyy€€€}~€~|yy|€}xvy|}‚ƒƒƒ‚€€€€‚ƒ„………„„ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„……†††……„ƒ„…„…„…„…„ƒ„…††…ƒ„†ˆŠ‰‰Š‹‰ŠŠˆƒ‚‚€‚‚‚‚€ƒ………………„„„…………………………„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚„‡‰Š‰‰Š‹‰……ˆ€€€€€€€€€€€€€€€€}}{zwsponnoopponnnnnopppqporvyywrpoopqpnonnopponponmmmnonnooooooosx|}~€~~~}}|||{{{z{{|}xxyxyxyxvwxyyxwvwwwwwwwwxxyyyyxxzz||}~~~~~~~~~~|}ƒ‡†€}†‡††ˆˆ‰ˆ‡‡€|z|}{{|€‚€}{zz{„„ƒ……ƒ‚‚‚‚‚‚‚‚€€~€€~‚‚‚€~~|{{}~€~~~}}}}|~}|{{{||}{{}„……„„„ƒƒ€‚€€‚‚€}}~~~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚ƒƒ€|xvvwvssvtuz€€€€€€€€€€€€€€€€„…‡ˆˆ†…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ„ƒƒ‚‚ƒƒ„‚„…†‡††††‡‡ˆˆˆˆ‰‰Š‹‹Š‰‰ŠŠ‹‹ŒŒŽŽŽŽŽŽŒŒ‹Š‰ˆ‡†††††††††††‡‡‡ˆ‰ˆ‡…|ww|€}{{yyxwwxyz€~}€~{yy|€€}yvxzz{}}~€‚€€€€„…………„ƒƒƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„………†††…„ƒ…„…„…„…„„ƒƒ„…†…„…‡‰‰‰‰Š‹ŠŠŠ‡„‚€‚‚‚‚ƒ…††………„„„„„„„„„„„……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€‚„‡‰ŠŠŠ‹‹‡†ˆ€€€€€€€€€€€€€€€€|‚ƒ€yrmnnnopponmnnnmnoqronsxywuspmmnoomnmmnnonmnnmlllmmlmmnoonnnsx|}~~~}}}|||{{zzz{|}xxxxxxxxtuwxyxvuxxxxxxxxxxyyzyyx{|}~~~~~~~€~}~~}|~‚ˆ‰{~„‡…†‡ˆˆˆ‡†€|z|}{{|€‚~{z{{„„„††…ƒƒƒƒƒƒƒƒ‚€€‚‚€||}~~}||‚‚‚‚€~~~€~|{{|}~}}}||||~}||{||}}{{}„……„„„„ƒ‚€€‚€€‚‚€}}}~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒ„ƒ‚‚‚ƒƒƒ‚ƒƒ€{wuuttstwtsw€€€€€€€€€€€€€€€€‚ƒ†ˆ‰ˆ†…„„„„„„„„ƒƒƒƒƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„ƒƒƒ„ƒƒ‚‚ƒƒ„‚„…†‡†††‡‡‡‡ˆˆˆ‰ŠŠ‹‹ŠŠ‰Š‹‹ŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒ‰ˆ‡††††‡††††††††‡‡‡ˆ‰‰ˆ†€zx~‚zyyxwwxyz{€~}~€~{yy{~€€~yvwwvvxxy|€€€€€€€…†††…„ƒ‚ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„……††‡†…„ƒ„…„…„…„……„ƒƒ„…†……‡‰‰‰‰ŠŒ‰ŠŠ‡„‚‚‚‚‚‚€ƒ…††………„„„„„„„„„„„……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€€€‚„‡‰Š‹Š‹Œˆ‡‰€€€€€€€€€€€€€€€€‚†…}uroooooooonmmmlllkhkpw||yvssrqppoonnnmllkkppoonmmlmmmnnnnnkqy~}|~~~}|{{{zzyyxwwwwwwwxxxxwwxxxxwwvvvwwwwwwxyyxy|~€~||~~}~~~~~~~~}}~~}}‚‡†}ƒ†…†‰ˆ„…ˆ‚|{}|{|{|€}zxx}‚…„„‡‰ˆ…„„ƒ‚€€€€€€{|||}}~~€€~~~}|||||€€€€€~}||||}||{{{{{z{}~‚„……„„ƒ‚€€‚€‚‚€~~€~}}~€~}|~}}}}|z|{{}€‚ƒ‚„ƒƒ‚‚‚ƒƒƒ„ƒ€ƒ„ƒƒƒƒƒƒƒƒ‚ƒ„|xvvwvvxxvx|€€€€€€€€€€€€€€€€‡…{{†Š…ƒƒƒƒƒƒƒƒ„„„„„„„„†„‚‚‚‚‚‚‚‚‚„„„„„„„„„„„„„„„„‚‚‚‚‚‚‚‚ƒƒ„„…†‡‡…††‡ˆˆ‰‰ŽŽŽŽŽŽŽŽŒ‹Œ‹ŠŠŠ‰…‚„ˆ‰‡………‡††††††…‡‡‡‡‡‡‡‡†€{z‚{xxyyyz{|~~~}~|yy{~}xuvxwxz}~‚„ƒƒ‚‚‚‚‚‚‚‚‚ˆ‡‡‡††……ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒ„„„……„„„„„…†‡‡‡‡……………………„„………………ˆ‰‰‰‰‰‰Š‹Š‰…‚€€€€‚‚‚ƒ†……„„„„„„„„„……………………††††…‡ˆ‡„‚‚€€€‚‚ƒ…„‚€‚ƒƒˆŠ‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€|~†ˆxtppppppppttssrrrrpquz|{vrssrrrqqqsssssrrrtttsrrqquuuttssspv|€€~~~|{zxxwwwwwwwwwwwwxxxxwwxxxxwwvwwwwwwxxyzzyz}€~||~~~~~~~~}}~~}~€…ˆ„}}‚††‡ˆ‡…†ˆ‚|{~|{|{~ƒ‚|zy|„ƒƒ…†…ƒƒ‚€~€€€€}~~~~~~~}|||}{{|~€€~}||||||{{{{{{{|}ƒ„………„ƒ‚€‚€‚‚€~~}~€€~}||}~~}}}}|{|{{}€ƒ‚‚ƒƒ‚‚‚‚ƒ„…„€‚„„ƒƒƒƒƒƒƒƒƒ„„}xwvxwwxwvw{€€€€€€€€€€€€€€€€ˆ‡}zƒ‰‡…………………………………………‡…ƒ€ƒ„„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„…„…„…‚‚ƒ„…†‡‡…†‡ˆŠ‹ŒŽŽŽŽŽŽŽŽŽ‹ŠŒŠ‰‰‰ˆ„‚„‡‰‡†……††††…†……‡‡‡‡‡‡‡‡…ƒ}z}‚|zxvwz|{y~~~}~|yy{~}xuxyyz|}€‚ƒƒ‚‚‚‚‚‚‚‚‚‚……„„„„ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒƒƒ„„„„ƒƒƒ„…††‡††……………………„„„……†††ˆ‰‰‰‰‰‰Š‹Š‰†‚€€€€€‚‚‚ƒ†…„„ƒ„„„„„„„„……………………†††…‡ˆ‡„‚‚€‚€€‚‚ƒ„„€‚ƒƒˆŠ‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€{x{…‹…zsrrrrrrrrsssrrrqqsux|~|wszzzz{{{{zzzzz{{{}||{{{{zyyyxwvvvw{€~€~}{ywvuwwxwxxxxwwwwxxxxwwxxxxwwwwwwxxxxy{|{{{~€~||~~~~~}|}~~}~‚ˆ‡|…‡‰ˆ‡‡‡†‚||~|{|{‚„ƒ€}{z{€ƒ‚ƒ„ƒ€~~}€€€€€€€€€€€€€€€€~~~~~€~}}}}zz{|~~€€~}||||}||{{{{{{|~‚ƒ…………„„ƒ‚‚€€‚‚‚€€~}~~€~|zz|~}}}}|{|{{}‚ƒ‚‚‚‚‚‚…†…‚ƒ„„‚‚‚‚ƒ‚‚‚ƒ„…‚~zxxyxxyxuwz€€€€€€€€€€€€€€€€~‡‰€{ˆ‰††††††††††††††††ˆ†„‚‚ƒ„†„„…„…„…„…„…„…„…………………………„„„„„„„„‚ƒ…†‡‡‡ˆ‰‹ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒ‹Š‰Š‰‡‡ˆ†ƒ€€„‡‰‡†…††††……………‡‡‡‡‡‡‡‡……€yzƒ€{xvvy{zx}~~~}}|yy{~}xvx{z|~~‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒƒ„„„„„„ƒƒƒ„…†…†………………………„„……††††ˆ‰‰‰‰‰‰ŠŠŠ‰…‚€€€€€€‚‚‚ƒ†…„ƒ„ƒ„„„„„„…………„„…………††…‡ˆ‡„‚‚€‚€€€‚‚„ƒ‚€‚ƒƒˆ‹‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€{wz…Š„xpmmmmmmmmoooonnmmprw}}zyzz{{|}}{{zzyyyx{|{{{{{{{{{{{{{{z|~~|{}|{zywvuuyyxyxxwwwwwwxxxxwxxyxxwwwwwxxyyz{|}}|}€ƒ€~||}~€€€~}|}~~}|~~‚‡ˆƒ~|ƒˆŠˆ‡ˆˆ†‚||~||||~ƒƒ|zzz‚‚„†…€€~~€€€€€€€€€€€€€€€€~~~~~~~€~~~~}~}}}}}}€~}||||||{{{{{|{|}€„…†………„ƒƒ‚‚‚€‚‚€}~€~~~~~~~~~}}~~}||{{}€ƒ‚‚‚‚ƒ„†…ƒ‚ƒƒ‚‚‚‚‚‚‚‚ƒ……ƒ~{yyywxyxvx|€€€€€€€€€€€€€€€€€†‡„ˆ‡††††††††…†…†…†…††…ƒ‚„†ƒƒ‚ƒ‚ƒ‚ƒƒƒƒ„ƒ„ƒƒƒƒƒƒƒƒƒƒ€€€€‚ƒ…†‡ˆ‹‹Œ‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹Š‰ˆˆ‰ˆ††‡…‚€ƒ‡ˆ‡†††…†…………„…‡‡‡‡‡‡‡‡†…{y~‚ƒ{zyxvwxy}~~~}}€|yy{~}yvxzzz}€€€‚‚‚‚‚€€€€€€€€‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒ„………………„‚ƒ„………„„……………………„„……†‡‡‡ˆ‰‰‰‰‰‰ŠŠŠˆ†‚€€€€€‚‚‚ƒ……„„ƒƒƒ„„„„…„………„„„…………†…‡ˆ‡„‚‚‚€€€‚ƒƒ€‚‚ƒˆŠ‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€}y{ƒ†}rknnnnnnnnpooonnnnmpv|‚ƒ~yyzz{||}~~}|{yyx{{{{{{||{{|}~~xz{{xwy{xwwwwvvvwwwvwvvvwwwwxxxxxxyyyxxwxxxyzz{{|}~~}~„€~||~~€€€€~}||}~}||€„†‡‡{†‰ˆ‡‰‰†ƒ||~}|}|}‚~zyxz‚‚ƒ†ˆˆ€€€€€€€€€€€€€€€€€€€€€€~~~~~~~€€~~~~~~~~€~}||||}||{{{{{{|}ƒ……………„„ƒ‚‚‚€€‚‚‚€~~€~}€€€€}|~}}~~}||{{}‚ƒ‚€‚ƒƒ……‚‚‚‚‚‚‚‚ƒ„…ƒ~{zzwvwyyxz~€€€€€€€€€€€€€€€€…„‚„ˆˆ„……………………„„„„„„„„„ƒƒ…ƒƒƒƒƒƒƒƒ€€€€€€€€€€€ƒ„†ˆ‰ŠŽŽŽŽŽŽŽŽŽŽŽŒ‹‹Š‰ˆˆ‡‡‰‡†††…‚‚†ˆˆ‡†‡†………………„ˆˆˆˆˆˆˆˆ†‚~|zz…}|zwvvxy}}~}|}~€|yy{~~yvwyxy{€‚‚€€€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒ„„…………„„ƒƒ„„…„„ƒ……………………„„……‡‡ˆˆˆ‰‰‰‰‰‰Š‰‰ˆ…‚€€€€‚‚‚ƒ…„„ƒƒƒƒ„„„„„…………„„„„……………‡ˆ‡„‚‚‚‚€€‚ƒ‚€‚ƒƒˆ‹‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€~{|€~ulilllllllloonnmmmmnqv|~zxxxyyzzzzzyxxwvvuuuvvwwwstttuuvvsvyywvvwvvvvvwwwuvvwwxxxwwwwxxxxxxxyyyxxxxyzz{{||~~}~„€~||~~€€€€}|{|}~}|}ƒ†…†ˆ„}~‚†ˆˆ‰‰ˆƒ}|}|}||€}zxw{€ƒƒƒ†ˆ‡€€€€€€€~~€€€€€€€€~~~~~€~~~~~€€‚€~}||||||{{{{{{z{|~€‚„………„„ƒƒƒ‚‚€‚‚€~~}~€€€~~~~}}~~}|{{}€ƒ‚‚‚ƒ„ƒ……‚€€‚‚‚‚‚‚‚‚ƒ„‚~{zzvuvyyy{€€€€€€€€€€€€€€€€€‡ƒ€‚ˆ‹ˆ‚„„„„„„„„ƒƒƒ„ƒ„ƒƒƒ€ƒ…††††††††……………………††††††††……………………‚ƒ„†ˆŠŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒ‹‹‹Š‰ˆ‡‡‡‡‰‡†††…‚~‚†ˆˆ‡‡ˆ††…†…………ˆˆˆˆˆˆˆˆ…~{|zx{ƒ‚~xwwyxv|}}}||~€|yy{~}yvxzz{}‚‚€€‚ƒ‚‚‚‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒƒƒƒ„„ƒƒƒƒ„„…„„„ƒ……………………„„…†‡ˆˆ‰ˆ‰‰‰‰‰‰Š‰‰ˆ…‚‚€€€‚‚‚ƒ…„ƒƒ‚ƒƒƒ„„„…„………„„„„„…………‡ˆ‡„‚‚‚‚€€€‚€‚€‚‚ƒˆŠ‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€}{||vmiknnnnnnnnmlllkkkjnpu{{wqppppooolmmnnoppmnnoppqqrrqonmlknsy{zwvvwwwvvvvvvvwwxxyywwwwxxxxxxyyyyxxxyyz{||}|}~~}~ƒ€~||~~€€€}|{|}}|{„‡††‡…|~ƒˆ‰ˆˆŠƒ}}}|~|}€‚~{yy}„‚ƒƒ‚€€€€€€€€€€€~~~~€~~}~~€€€~}||||}||{{{{{yz|}€ƒ„…„„„ƒƒƒ‚‚€‚‚‚€€~}~~~~}|}~€~}~~}|{{}€‚ƒ‚‚ƒ„„ƒ…†ƒ‚€‚‚‚‚‚‚‚‚€‚‚}zyywvwyyy{€€€€€€€€€€€€€€€€†ƒ‚„ˆ‰‡„„„„„„„„„„„…„…„…„ƒ‚€€‚…†††††††††‰‰‰‰‰‰‰‰ŠŠŠŠŠŠŠŠ‡‡‡‡‡‡‡‡ƒ„†ˆŠŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒ‹‹Š‹Šˆ‡††††‰ˆ‡‡‡†‚€~‚†ˆˆ‡‡ˆ†††††………ˆˆˆˆˆˆˆˆ|yzyxy}„zwxyxw|}}}||~€|yy{~|xvy}~ƒƒ‚€€€‚ƒ€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒ‚‚ƒƒƒƒ‚‚„„………„„ƒ……………………„„…†‡ˆ‰‰ˆ‰‰‰‰‰‰Š‰‰ˆ…‚‚€€€‚‚‚ƒ…„ƒƒ‚‚ƒƒ„„„„…………ƒƒ„„„„………‡ˆ‡„‚‚‚‚‚‚€€‚€€‚€‚ƒƒˆ‹‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€{z{zqhhnllllllllnmmmlllkkmsy~{xppponmmllmnpsuvwxxyzz{||{zxuromklry}|ywvyxxwvuttvvvvvvvvwwwwxxxxxxyyyyxxxyyz{|}}|}~~}~€ƒ€~||~~~€}|{|}}|{„‡‡††……z|ˆŠˆˆ‹ƒ}}}}~}„ƒ€|{z‚„}}}}~~~~~€€€€€€€€€~~€€~}}}~€€~~€~}|||||||{{{{{yy{}‚ƒ„„„ƒƒƒ‚‚‚€‚‚€}~€~~zz{{|~€~}~~|{{}€ƒƒ‚‚‚‚‚ƒ„…„†‡„‚‚‚‚‚‚‚‚‚‚‚‚€|zyyywxzyxz~€€€€€€€€€€€€€€€€„ƒ„‡ˆ†††……………………††††††††…„‚‚„†ˆ„„„„„„„„„„„„„„„„…………………………………………„…‡‰ŒŽ‘‹ŒŒŽŽŽŽŽŽŽŽŽŽŒŒ‹ŠŠŠ‹Šˆ‡††††Šˆ‡‡‡†ƒ€~†ˆˆ‡ˆˆ†††††††…ˆˆˆˆˆˆˆˆ~{xxxyyyƒ}ywwxy|}}|||~|yy{~{ww{€ƒ†‰ƒ‚€€‚ƒ€€€€€€€€€€€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒƒƒƒ„„ƒƒƒ„„…………„„……………………„„…†‡ˆ‰Šˆ‰‰‰‰‰‰Šˆˆ‡…‚‚€€€‚‚‚ƒ„„ƒƒ‚‚ƒƒ„„„„…………ƒƒ„„„„………‡ˆ‡„‚‚‚‚ƒ‚€€‚€€‚ƒƒˆŠ‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€}xtqonkhnnnmmkkjlmonmllmmqsuz}upppoonnmlnrv{‚ƒ€~|}€€~|~€|upmhmuyyyxyxxyyxxwwvvwwwwwwxxxwwxxxxxxyyyyyzzzz{{{{~~~€€€~~~~{|~~}€}}}zwwy€‡Š†…ˆ‡‚}z|…‹ˆ€zxz|}~}|{‚‚€~}|||†…zyz{~‚€~€‚~~~~~~~~~}~€€€€~~~~~~~}}}}}~}~~~~}|{{{||||{{{{{{yz|||}€‚……„„ƒ‚‚‚‚‚‚‚~~~~~~~~~~~~}~|{{}|{}€‚€‚‚€€‚ƒ……†…ƒ‚ƒƒƒƒƒ‚‚ƒ„„ƒƒ}{yyvtvwwz~€€€€€€€€€€€€€€€€†„ˆŒ‹……‹‡‡††††‡‡†††……„„„†…ƒ‚ƒ„ƒ„†††„€‚ƒƒƒƒ‚€‡†„‚‚‚‚‚}ˆˆƒ„‚„ˆŒŽŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹‹‹ŠŠ††††††††††††…„ƒ‚‚„…‡‡‡‡††………††‡†‡‡†‰ŽŽ…|x|}yvxƒˆ‡}uw‚‹‡„}||~xyz|}€€}wtw€Š‘‡ƒ€€‚ƒ‚€€€€€€€€‚ƒƒ€‚ƒ‡†„‚‚ƒ„…„„„„„„„„ƒƒƒ„„„„„†…………„„„†††……„„„„……†‡ˆˆ‰ˆˆ‰‰ŠŠ‰‰‰ˆ‡…ƒ‚€€€€€‚‚‚‚ƒ…„„„„„„„„…„…„…„…„ƒƒ„„……††…†ˆ†„€‚‚€€€‚€€‚‚‚‚‚„†‰‹ŒŒŒ‹‹ŠŠŠ€€€€€€€€€€€€€€€€|xronnmkhjklkkkkijlmlkjjloqsx~ynnmmnoppmpsx}€ƒ„ƒ}|~}vplhmtyyyxyxxxxxxwwvwwwwwwxxxxwwxxxxxxxyyyyzzz{{{||~~~€€€~}~~|}~€~~}{{yvvx|„ˆ†…ˆ‡‚{wx}‚€|yyz|}~}|{‚€~}||{†…~yy{{~~€€€€€€€€€~€€€€~~~~~~~}}}~€}~~~~~~||{{||||{{z{{{y{|||}€‚……„„ƒ‚‚€€€€~~~~€€€€|~€€~}}~}|{}€‚€€‚„„………ƒ‚‚ƒƒƒƒ‚‚‚ƒ„ƒ‚€}{xwyvuvwwz~€€€€€€€€€€€€€€€€ƒ„‡Šˆ……‰‡‡††††‡‡ˆ‡†…„„……†…ƒ‚‚ƒ„†……„ƒƒƒƒƒƒƒƒ‚€€ƒ‚€€‚‚‚|€‡ˆ„…ƒ‚„ˆŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹‹Š‰‰††††††††††††…„ƒ‚‚ƒ…†‡‡‡††………………†ˆ‰‰‹Žˆyzxuw}Š‰‚ƒŠŠ‡ƒ€}}}~yzz{|}~~|vruˆ‹‹†ƒ€€‚ƒ‚€€€€€€€€€€‚ƒƒ€ƒ‡†„ƒ‚ƒ„…„„„„„„„„ƒƒƒ„„„„„…………„„„„†††……„„„„……†‡ˆˆ‰ˆˆ‰‰‰Š‰‰ˆˆ†…ƒ‚€€€€€‚‚‚‚€ƒ…„„„„„„„„„…„…„…„…ƒƒ„„……††…‡‡‡ƒ€‚€€€‚‚€€€‚„…ˆŠŒŒŒŒ‹‹‹ŠŠ€€€€€€€€€€€€€€€€|wpllmmlhijjiikmiikmnmkjklnov}€~sqolllmnoqv{‚„„ƒ€~~€€~||~~xpkhmuyzxyywwxxxwwvwwwwwwxxxxxwwxxxwwwxyzzzz{{{{|||~~~€€€~~~~}}~€€~{yyxuuw{‚‡…„…ƒ~yutwyxxzyz||}}||€€~~||{{€„‚}yz}|~€€‚€€~~~~€€~~~~~~~}~~€}}~~~~~}}{{{||||{{{{{{z{}||}€‚…„„ƒƒ‚€€€€€€€€~~~~€€€€€~|}}}||}‚‚€€ƒ…„……„ƒ‚‚ƒ‚ƒƒ‚‚‚ƒ„„ƒƒ€~{xwzwvwxxz~€€€€€€€€€€€€€€€€€…ˆ‡††‡‡‡‡‡†††‡‡‰ˆ†…„…†‡†…„‚‚‚ƒƒˆ†„‚‚ƒ…†„ƒƒ‚‚‚€€ƒ„‚‚|†ˆ…†„ƒ„‰ŒŒŒŒŽŽŽŽŽŒŒŒŒŽŒ‹‹Š‰ˆˆ††††††††††††…„ƒƒƒ…†‡‡‡‡†……„„„„†‰ŒŒŽŽ‰zxvv~‡Ž‘’ŒŽŽŒŠ†‚€€€zvy€†ˆ‡…ƒ€‚‚‚€‚ƒ‚€ƒ‡†…ƒƒƒ„„„„„„„„„„ƒƒ„„„„„„…„…„„„„„††…………„„„……†‡‡ˆ‰ˆˆ‰‰Š‰‰‰ˆ‡†„ƒ€€€€‚€‚€€ƒ…„„„„„„„„…„…„…„…„ƒƒ„„……††…†ˆ†„€‚€€‚ƒ€€€€€€€€‚ƒ…‡Š‹Œ‹‹‹‹ŠŠŠ€€€€€€€€€€€€€€€€}wojijiiklkiggjmiiikmnljijjmrywuqmkkklptx~„„„~}{}€~}~€‚€zqjhntyyyxywwwxwwwvwwwxwxxxxxxwwxxxvwwxyz{{{{{|||}}~~~€€€~}~~}~€€€€}yvwvutv|‚†„‚€|wxutuuuw{z{{||}|}~~}||{{z{}~}}~}~€€€€€€€€€€€‚€€}~~~~~~~~€~~~~~~}}}~~~~~~||{{||||{{z{{|{|}}|}€‚„„„ƒ‚‚‚‚‚ƒƒƒ‚‚~~~~~~~~~~~~}}}}}||~€ƒ‚€€‚„…„……„ƒ‚‚ƒ‚ƒƒƒ‚‚‚ƒ‡†…„~{z{xxyzy{~€€€€€€€€€€€€€€€€‡Š‡…‰Š‡ˆˆ‡‡†‡‡‡ˆˆ‡†††‡‡……„„ƒƒƒƒ††„ƒƒ„…†…„‚‚‡†„ƒ‚ƒƒ„‚ƒ€|~„ˆ‡‡…ƒ…‰ŒŒŒŒŒ‹‹‹‹ŒŒ‹Šˆ‡††††††††††…††††…„ƒ€ƒ…†‡††‡††……„……†‹‘‘’‘Žˆ{y{ˆ‘‘‘“ŠŒŠˆ…ƒƒƒƒ‡‡‡††………†…ƒƒ…†††„ƒ‚‚‚ƒƒƒƒƒƒƒƒ€‚ƒƒ€ƒ††……„„„„„„„…„…„„„„„„„…„…„„„„„„„„……………………„……†‡ˆˆ‰ˆ‰‰Š‰‰‰‰‡†…„ƒ‚€€€€€‚€€‚„„„„„„„„„„…„…„…„…„„„…„…………‡‡‡ƒ€‚€€ƒƒ€‚€€€€ƒ„†ˆŠŠŠŠŠŠŠ‰Š€€€€€€€€€€€€€€€€~xqkihgejkjihgikigggjjjiihhjnszzxtpnlllqtzƒ„„ƒ|{|„‡ˆ‡}~€ƒ‚|qhhmuyzxyyvwwwxwwwwwwwxxxxxxxwwxxxwxxyz{||||||}}}}~~~€€€~~~~~~€€€€}xtuvttv{‚~|xuwuuvutvz{{{{||}}}||||{{{ywvy~‚‚€€€~~}~}~}~}~~€€}~~~~~~~~~~}~~~~~}~~~||}}~~~~~}}{{{|||{{z{{|||}~}}}€‚„„ƒƒ‚‚ƒ„„ƒ‚~~~~~~~~~~~~~~}€€~}}~ƒƒ‚€‚„…„„…„‚‚‚‚ƒƒ‚‚‚ƒ†††„‚}{}{z|}{|€€€€€€€€€€€€€€€€€ˆŒˆ‡‹‰‰‰ˆ‡‡‡‡‡ˆˆ‰‰‰ˆ‡‡†††††…„„ƒ„†‡‡†…„†„‚€€€‚ƒ‹‰†ƒ~~‚„{|ƒˆ‰ˆ†……ŠŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹ŒŒ‹‹Š‰‡†………………………………†††…„„€ƒ„††††‡††††††‡‡’’““’Œ…ƒˆŽ’““’’•“Ž‰ˆˆ‡‡‡ˆˆŠŠŠ‰‰‰ˆˆŒŽˆ„„…‚‚‚ƒ„„„„„„„„„ƒ„ƒ‚‚„†††††…„„…„…„…„……„„„„…„……„„„„…„…„……………………„……†‡‡ˆ‰‰‰‰‰Š‰‰ˆ†……ƒƒ€€€€‚€€€‚„ƒƒƒƒƒƒƒƒ…„…„…„…„„„„„……………†ˆ†„€‚€‚€ƒƒ€‚‚‚‚€€ƒ…‡ˆˆˆˆˆˆˆ‰ˆ€€€€€€€€€€€€€€€€}ytqomjggghiiihgjigghjjkhggjkmry|xrnjhptz€ƒ„‚€~}~ƒ‰Ž~~€„„~qghntyyyxyvwwxxxwwwwwxxxxxxxxwwxxxyyz{{||}||}}}~~~~~~€€€~}~~~~€€€}wstuutvwz|}{yxwvttvustw|{z{{|}~{{{{z{zzxusv|‚„ƒƒ‚‚ƒƒ~{{{{{{{{}|{}~€}}~}~}~}}~}}}}~~~~~}}}}}~|||}}~~~~~||{{||{{{{{{||}~~~}}‚„ƒƒ‚‚€€‚ƒƒ‚€~~~~€€€€~€~~}}ƒƒ‚€€‚ƒ…ƒ„„„‚‚‚ƒƒ‚‚‚ƒƒƒƒ}|}}€€~~€€€€€€€€€€€€€€€€€€†‰‰ˆŠ‹‹‹Š‰‰ˆˆˆˆ‡ˆŠ‹Š‰ˆ‡‡ˆˆ‰ˆ‡†…‚„†ˆˆ‡…„‡…‚€‚„‰‡ƒ{yww‚„‚{zˆ‹Š‡…‡ŠŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‰‰ˆ‡†……„……………………„……††…„„€‚„…†††‡‡†††‡‡ˆˆŽ“”’“’‘‹††ŠŽŽ“”‘‘’’‡ˆˆ‰‰ŠŠ‹ˆˆˆ‰‰‰‰‰‘“‘‹…‚‚‚‚‚€ƒ………………………ƒ„……ƒƒƒ…†††‡††„„……………………„„„…„………„…„……………„„…………††„……†‡ˆˆ‰‰‰‰Š‰‰ˆˆ……„ƒ‚‚€€€€‚€€„ƒƒƒƒƒƒƒƒ„…„…„…„…„„„…„…„……‡‡‡ƒ€‚€€€ƒ‚€‚‚‚‚€€€‚„†‡………††‡‡‡€€€€€€€€€€€€€€€€|zyyzwsokiggiihfjjjiiijkighjifjq}zupmosz€ƒƒ€~}}~‚ˆŽ~~€„†rfhmuyzxxywwxxxxxxwwxxxxxxxxxwwxxx{{{||}}}}}}~~~~~~~€€€~~~~~~~~€€}wrruuuvvwyyxwwxxustuttw|{zzz|~zzzzzzzzwvvvy}‚„…„ƒ„……‚{{{{{{{{zyy{~~}}}}}}}}|||||}~~~~~~}|||}}||||}}~~~}}{{{||{{{z{{||~~~}}€‚ƒƒƒ‚€€€ƒ„„‚€~~~~€€€€€€€~{~}}‚ƒƒ‚€‚‚„ƒ„„ƒ‚‚€‚ƒƒ‚‚‚‚‚‚€‚€€ƒ‚€€€€€€€€€€€€€€€€€~€„‡‡…‡ŠŒ‹‹Š‰‰‰‰ˆ‰Š‹‹Š‰‰‰Š‹‹‹‰ˆ†„……†‡‡‡‡‡…~~‚„†„€|ywvv‚…‚{y€ˆŒŠˆ†‡ŠŒŒŒŒŒŒ‹Œ‹‹‹‹‹‹ŠŠ‹ŒŒ‹Šˆ‡‡††……………………………„……††……„€‚ƒ…………‡‡††††††‰”“‘’“’‘Œ‹ŒŽŽŽ‘’‘‘ˆˆ‰ŠŠŠŠŠ‡ˆˆ‰Š‹ŒŒ‘’Š„€‚ƒ‚€€ƒ†††††††††„…‡†„„…†…†‡‡‡†„ƒ……………………„„„„……………………††††„„„……†††„……†‡ˆˆ‰‰‰Š‰‰‰ˆˆ„„„ƒ‚€€€€‚€€ƒƒƒƒƒƒƒƒƒ…„…„…„…„………„…„„„…†ˆ†„€‚€€‚‚€€‚‚€€€€‚ƒ…†ƒƒƒ„„………€€€€€€€€€€€€€€€€{{|€€{wtngegiiggijjhghiighjgcelpty~€~}nsz€ƒ‚}{z{~„‡ˆ‡~~€…‡€rfhmuyyyxywwxxyyxxwxxxxxxyxxxwwxxx||}}}}}}}}}~~~~~~€€€~~~~~~~~€€~wqruuuvxxxwustv{vstuuvy}|zzz|~yyyyzzzzwyyxvx…‡…ƒ„††ƒ{|{|{|{|xwwz}~}}}}}}}}|{{{{|}~~~~~}|{|||||||}}}}~~||{{||{{{{{{||~}}‚ƒƒƒ‚€€‚…††…‚~~~~~~~~~~~~}}~€‚‚€}~}‚„ƒ‚‚‚€‚ƒƒ„„ƒ‚‚€ƒƒ‚‚ƒ„„…„„ƒƒ‚„„€‚€€€€€€€€€€€€€€€€|{†…‚‰Œ‹ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹ŒŒ‹‰‡‡†„„„†‰Šˆ…~}‚……ƒ€~{zzz‚…‚{y€ˆ‹ˆ†‡ŠŒŒŒŒŒ‹‹‹‹‹‹‹ŠŠŠŠ‹ŒŒ‹Š‡‡†††……………………………„„…†††…„€‚ƒ„………‡‡†……………Š”’‘““ŽŽŽŒŒŽ’’‘–˜”‰ŠŠ‹Š‰ˆˆ‰Š‹ŒŽ‘ŽŽ’”‘ˆ‚ƒ‚€€ƒ‡‡‡‡‡‡‡‡‡…†‡‡……†‡…†‡ˆˆ†„ƒ……………………„„„…………………†††‡‡‡„„„……†††„……†‡ˆˆ‰‰‰ŠŠ‰‰ˆˆ„„ƒƒ‚€€€‚€€€~ƒƒƒƒƒƒƒƒƒ„…„…„…„……………„„„„…‡‡†„€‚‚€€€‚€€€€€€€€€€ƒ„…‚‚ƒƒ„„„€€€€€€€€€€€€€€€€}{zz{|{zyxtnhegiggggggggcddefgghbgov}€€z|}~‚†„~~|{}€ƒ„„€~}‚ƒ€}}~~|zxxzxxxxxxxxxxxxxxxxwwxxyzzz{{{{||}~~~~€€€€€~}~~~~~|yvuuuuuwxxxxwvuuuuttuvvzzzyz{|}{{zyxwvvw}xvz€‚„†‡†‚~{{zyz{{{z~xv|€|z~~}}}~€|{}~|{||||||||||||{|}€€€€~~}}~~}}||{{{|}|z{}€€~~€‚…„ƒ‚€~}}„…„ƒ‚€}}~„†€€€~~}‚‚ƒƒƒ‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„ƒƒ‚ƒ„…†………„‚€~}||||}‚€€€€€€€€€€€€€€€€~~~€‚…‡„†‰ŒŒ‹ŠŠŠŠŠŠŠŠ‰‰ˆ‡†…………„„„~ˆ‚€€€€~}€~{|€ƒ‚‚ƒ‡‹ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹Œ‹Š‰ˆˆ‡††††………………†……„„„„„„…………€€‚†‡†…‡‡††††‡‡ŠŒ‘’‘’’ŽŽ‘‘Ž’’‹‰‰‰ŠŠ‡……†‰‹‘Œ‡‰’Žˆƒ‚‚‚‚ƒ„…†‡‰‰‡††‡‡ˆˆ†„ƒ…‡ˆˆ‡††…„„‡††††………††††††††……††††……„„„„„„„„„…†ˆ‰‰‰‰ˆˆ‰ŠŒ‹ˆ…„„ƒ‚‚€€‚‚€~}}~~~~~~‚‚‚ƒƒ„„„……………………„„„„„„„„ƒ„…„‚‚ƒ‚‚€€€€€‚‚‚€€‚„…†‹‡„„‡‰ˆ‡€€€€€€€€€€€€€€€€~~~~|wojptwwsnkijjjjjjjjmnnoppqqrtwyzywv{}}|€…„€zyx{~‚ƒƒ~~€ƒ„‚~}zwwyxxxxxxxxxxxxxxxxwwxxyzzz{{{{|}}~~~~€€€€~}~~~~~~|yvuuvuuwwxxwwvuvvuttuuv{{{{|~€~}|zywvvvz}|wux}ƒ…†…‚~{xwvvxxwv{vu|~}~}}}}~€€~zz|}|{||}|}|}|}}}||}~€€€€~~}}~~}}||{{{|||z{}€€~~€‚‚‚€~}}~€ƒ†‡ˆƒ‚€€‚~~}}}|}~€‚ƒ„‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„„ƒƒƒ„……ƒ„„„ƒ‚€}zxy}…€€€€€€€€€€€€€€€€€€€ƒ‡ŠŒ††‡ˆ‰Š‹Œ‹‹‹‹‹‹‹‹‰‰‰‰‰‰‰‰†††††‡‡‡…„…†ƒ€…††…ƒ~~~{{~€€‚†‹ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹Š‰ˆˆ††††††……………†……„„„„„„…………€€€‚…‡†…‡††……††‡ŠŒ’‘‘’’ŽŒŽŽ‘’‘Ž‹Š‰‰Š‰†„ƒ…‡Š‘‘ŠŒ’Šƒƒ‚‚‚„„…‡ˆŠŠˆˆ‡ˆˆ‰‰†ƒ‚„†ˆˆ‡‡……„„‡††††………††††††††……††††……„„„„„„„„„…†ˆ‰‰‰‰‰ˆ‰ŠŒ‹ˆ…‚‚‚‚ƒ‚‚€~~}||||||||€‚‚ƒƒ„„„„„„„„………………………††…‚€€‚‚€€€€€‚‚‚€‚ƒ…†„…‡ˆˆ†……€€€€€€€€€€€€€€€€{|}~~xqkpv}€}yusyyyyyyyyyzzz{{||~{yvtr~~|z}ƒ…‚xwvx}€‚‚~~~„…„‚€€~zwvwxxxxxxxxwwwwxwwwwxxyyzz{|{|{|}~~~~~~€€~}~~~~~|zwuuvvuwwwxwwvuvvuuuuvv}}}}~‚€~|zywwvxyxvuwy‚„„ƒ€}zvuttuvutuqrz€€€~}}|}~€}zy{}{z{}}}}}}}}~~}~~€€€€€~}}~~}}||{{{{|{{{}€€~€‚€€€~~}€~€ƒ†ˆ…………ƒ‚€€€€€€€€€~~}}|{{}~€ƒƒ‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒƒ„……………„‚‚ƒ„„ƒ‚€~{y{}‚„€€€€€€€€€€€€€€€€€€€„‡‹‡…„ƒ„†ŠŒˆˆˆˆˆˆˆˆ„„„„„„„„ƒƒ„…†‡ˆˆ„„†ˆ†€~€‰‹‹‡‚}~‚‚€}zz|~}}€„ŠŽŒŒŒŒŒŒ‹‹‹Œ‹Œ‹Œ‹ŒŒ‹Š‰ˆˆ‡†††††………………………„„„„„„…………€€…‡‡†††…………††‰Œ‘’‘’’ŽŒ‹‹ŽŽ’’‘‘’‹ˆ‡††‡†„‚ƒ†‰ŒŽ‘Ž‘„ƒƒ‚ƒ„…†ˆ‰‹‹Š‰‰Š‹Œ‹ˆ„‚ƒ…ˆˆˆ††„„„‡††††……………………………„………†……„„„„„„„„„„…†ˆ‰‰‰‰‰‰‰Š‹Š‡„~~€ƒ„……‚€€~~||||||||~€€ƒƒƒƒƒƒƒƒ…„…„…„……†‡‡„€‚‚€€€€€‚‚‚€€€ƒ„…€„ˆˆ…‚ƒ…€€€€€€€€€€€€€€€€}||}~~|z|~~€ƒƒƒƒƒƒƒƒ€€€€€€€€‚~|zzzz€€}yz……{zxz|€€}~‚„………‚‚~zwvvxxwxwxxxwwwwwwwwxxxyzz{{|||||~~~~~~~€€~}~~~~~}zwuvvvvvwwxxwvvuuuuvwxy~~}~€€~|{zyxxwxxxxx€ƒƒ‚|zvuttuutsnlnw}}}|||}€}zy|}|{|~~}~}~~~€€€€€€~~}}~~}}||{{z{||z{~€‚‚~€‚€€€€€€„ƒ€€„…‡‡†„‚‚‚‚‚‚‚‚€€}~~€€‚‚ƒ‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒƒ„…†††„„€‚„„…„„€‚‚‚€€€€€€€€€€€€€€€€~~~€ƒ†ˆ„ƒ‚‚‚„†‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„……††ƒƒ†Šˆ}}‡‹Œˆ€}~„‚|yyz{z{~ƒ‰ŒŒŒŒŒŒ‹Œ‹Œ‹Œ‹ŒŒ‹‹Š‰ˆ‡†††††…………………………„„„„„„…………‚€„‡‡††………„……†‰Œ‘‘‘‘’Ž‹‹ŒŽŽ‘““‘‘Œ‡ƒ‚‚ƒ……ƒƒ…ˆŠ‹Œ„„ƒƒƒ„…†ˆŠŒŒ‹‹‹ŒŽŠ†„…†ˆˆ‡‡……„„‡††††……………………………„„…………„„„„„„„„„„„…†ˆ‰‰‰‰Š‰‰Š‹‰…‚}~‚„„…‚‚€€~~~}}|}}~~‚ƒ‚ƒ‚ƒ‚‚„……„€‚‚€€€€€‚‚‚€€€‚ƒ„ƒ„„‚€ƒ†€€€€€€€€€€€€€€€€ƒ€}|~€‚‚||‚~~}~~yy„†‚}|~}|~€‚„„…†‚ƒ‚zwvwxxxxxxxxxwxwxwxwxxyyz{{{}|}|}~€~~~€€~}~~~~~}zwvvvvvvwxxxxwwttuvxz{}€~||{||€€~~}}{zyz{|{z‚‚€~|zvuttttsrjhltz|}€}||{|}~~{{}~}~~~~~~~€€€€€€€€~}}~~}}||{{y{|{{{~€‚ƒƒ~€‚‚‚‚‚‚‚ƒ„…„„ƒ€‚„†ˆ‡†ƒ‚……………………„„„ƒƒ‚‚‚‚‚‚‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„„†††…„ƒ€ƒ„…………‚ƒ„………„„€€€€€€€€€€€€€€€€~}|}‚€‚ƒ„ƒ‚ƒƒƒƒƒƒƒƒ……„„ƒƒ‚‚ƒ‚…ŠŠƒ}|‚…ˆ…€}€ƒ„‚~{zzz{zz}‚‰ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ‡†††††…………„„…………„„ƒ„„„„…………ƒ€€„†‡‡†……„………†‰‹‘‘‘Ž‹ŠŒŽŽ‘“’Žˆ‚€ƒ‡‡‡…‚ƒ…†ˆˆˆˆŒŽŒŽƒƒƒ‚ƒƒ……ˆŠŒŒ‹‹‹Œ‘‘‰‡‡‰ˆˆˆ††„„„‡††††……………………………ƒ„„„…„„ƒ„„„„„„„„„…†ˆ‰‰‰‰‹Š‰ŠŠˆ„€€‚‚‚€€€€~~}}}{|||}~~~€€€€€€€‚ƒƒ€‚ƒ‚‚€€€€€‚‚‚€€‚ƒ…‚€ƒƒ‚€€€€€€€€€€€€€€€€€~|}~~}}€~{xyz||||||||~~~}}|||~€€€‚zy~ƒ…‡„€~||~‚‚‚ƒ„‚‚{xxyxxxyxxxxxxxxxxxxxxyzz{{|}}}}}€€€~}~~~~~}{xvvwwvwxyyzyyxvvwxy|}~~|{z{{{€€€~}}}~~~}‚‚‚€~|{vussttsqkjnuyz{||{{{}~~{{~€€€€€€€€€€~~}}~~}}||{{yz{{{|~ƒ„ƒ‚€‚„„ƒƒ‚‚€‚…ˆ‰Šˆ‡ƒ„…††…„ƒ„„„„„„„„……„„ƒƒ‚‚„„ƒƒ‚€‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„……………„ƒ‚ƒ……†……‡†„„ƒ…†‡€€€€€€€€€€€€€€€€‚}}~€~€‚…„ƒ€ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„ƒ‚€€‚ƒ‰Š„~~ƒƒ€„…}{{|||{|~ƒˆŒŒ‹ŒŒŒ‹‹‹‹‹‹‹Š‹Š‹‹‹ŠŠ‰ˆ‡††……†…………„„„„………„„ƒ„„„„…………ƒ~€‚†‡ˆ††…………††ˆ‹Ž‘‘‹ŠŠ‹ŒŒŽŒŠŠ†ƒƒƒ†‰Š‰ˆ‚ƒ„…††……‰‰ŠŠ‰‰‰Š‚‚‚‚ƒ„…†ˆŠ‹ŠŠŠ‹Œ‰‡ˆ‰ˆˆ‡‡……„„‡††††……………………………ƒƒ„„„„ƒƒ„„„„„„„„„…†ˆ‰‰‰‰‹ŠŠŠ‰‡ƒ€€€€€€~~}|{{zz{{||}}~~~€‚‚ƒ…‚‚€€€€€‚‚‚€€€‚‚€€‚……~€€€€€€€€€€€€€€€€|{{|~~|z}€€}zxx€€€€€€€€~~}|||}ƒƒ‚€~~|z~‚„†ƒ€~}|‚‚€‚€|yz{yyyyyyyyyyyyyyyyxyyz{{||~}}}~€€€€€€€€€€€~}~~~~~}{xvvwwwxyzz{{zzyyyz{|}~|{{{{|~~€€~~ƒ‚‚€~}|xwvuvvtsppsy{z{|{{{{|}~}{z}~€€€€€€€€€~}}~~}}||{{yz{{{|„„„‚€~€…„„‚€€€ƒ…‡ˆŠŠ‡†„ƒ‚‚‚‚€€€€€€€€‚‚‚€€€‚‚‚€‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ……„ƒƒƒ„„ƒƒ……†…„„†…„ƒƒƒ……€€€€€€€€€€€€€€€€‚~~‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚†‰†‚€‚‚ƒ„„}{}~~~€„‰‹ŒŠ‹‹‹‹‹‹ŠŠŠŠŠŠŠŠŠŠŠ‰‰ˆ‡†…………………„„„„„……„„ƒƒ„„„„…………„‚†ˆˆ‡††……††‡ˆ‹Ž‘‘ŽŠ‡‡ˆˆˆŠ‹‰‡‡ˆ†ƒ…„„…‡ˆ†„€ƒ„………………………………€‚ƒƒ…†‰‰‰ˆ‰Š‹Œ‹‰†…†ˆˆˆ‡††„„„‡††††………„„„„„„„„‚ƒƒ„„ƒƒ‚„„„„„„„„„…†ˆ‰‰‰‰Œ‹ŠŠ‰†‚~€€€€€€€€‚‚‚~}|{zzy|||}}~~~‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€ƒ‚‚€€€€€‚‚‚‚€‚ƒ„ƒ€€€€€€€€€€€€€€€€€}{{}~}|}€‚‚€}}~‚€~~}z}„…ƒ€~}‚}{~‚ƒ„~€}|‚‚~€|z{|yyyyyyyyyyyyyyyyyyyz{{||~~~~~€€€€€€€€€€€~}~~~~~~{xvwwwwyyz{||{{}||{{|}}yzz{}‚‚‚€~}}~€€~€ƒƒ‚€~}{zyxyxwvutw|}{||{{z{|}~|zy|~~}€€€€€€€€€€~€€€~~}}~~}}||{{xz{{{|‚„…„‚€„„ƒ€~}}€€‚…†‹‰…€||||||||€~~}}~~€€‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ†…„ƒ‚ƒƒ„„„…†……„ƒ€‚„……ƒ€€€€€€€€€€€€€€€€~}}}‚ƒ…ƒ‚„€€€€€€€€€€€€€€€€€‚‚ƒƒ‚~…‰‡„ƒ‚‚ƒ„„ƒ„€||~…‰‹‹Š‹‹‹‹ŠŠŠŠ‰‰‰‰‰‰‰‰Š‰ˆˆ††…„…………„„„„„„„…„„ƒƒ„„„„…………„~~‚†ˆ‰‡‡††††‡‡ˆ‹Ž‘‘ˆ…„…†††‡…ƒ„ˆˆ…„ƒ‚ƒ„ƒ€~€ƒ„………ƒ‚‚ƒ„‚€€€€‚ƒƒ…‡ˆˆˆˆ‰‡ˆˆ†ƒƒ„‡ˆˆ‡‡……„„‡††††………„„„„„„„„‚ƒƒ„ƒƒƒ‚„„„„„„„„„…†ˆ‰‰‰‰Œ‹Š‰‰†~€€€‚‚‚‚‚€~||{||}}~~ƒƒƒƒƒƒƒƒ„„„„„„„„‚ƒ‚€~‚‚€€€€€‚‚‚‚€€‚ƒ„‚ƒ†€€€€€€€€€€€€€€€€|}}~€„‚€~}~€ƒ}}}~~}{xvwz~€€‚ƒ€~~}}|€€€€€€€€‚‚‚‚ƒ…‡ˆ„ƒ‚~}|yz|}~~}}|{zyyyyyzzzzz{|}~}}}}~€€€€€~}}}}~‚€~|||}~|yvuvwxxxz}~~|||yzz{||}}~~~~~~~~€€€~€‚„„ƒ‚€~{{{zzyyyuwy{|}}}}}}}|||}}}}~€€€€~€~~}||||{{{{{{|||||€‚‚€€‚ƒ„„„„‚€€€€€‚‚†‡‰Šˆ…~€€}}~~€€‚‚‚‚€€‚ƒ„…†…ƒƒƒ„‚‚‚ƒ„„†††……………………‚‚…€€€€€€€€€€€€€€€€€€~}ƒƒ„……„„ƒ~~~}}}}}ƒ€}}}z€‚ƒ……ƒ‚€ƒƒ„„…†††€€‚‚‚|~€~|{|~~~„ˆ‹ŠŠ‰ˆ‡†……„†ˆ‰‰ˆˆˆ‰‰ˆ‡†……„„„„„„„„„††……„„ƒƒ„„ƒƒ„„……„‚€€ƒ†‰ˆ‡††…†††ŠŒŽŽŽŒˆ……††‡‡‡‡††………ƒƒƒƒƒƒƒƒ‚‚‚‚ƒ„††ˆ…ƒ„††ƒ~€‚‚‚„„……†‡‡ˆˆ‡†………†††‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰‡ŠŒ‹ˆƒ}{}€ƒ„ƒ€€€€‚€€€€‚}|{{{|}~‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„ƒƒ‚‚‚‚€€„†…€€€€€€€€€€€€€€€€}~~~€‚~}~€~}{zz{||||}}|zxwx{~€€‚€~}}}€€€€€€€€€„…‡„ƒ‚€}}{|}~~~}||zzyyyy{{{{|}~~~~}~~~€€€€~}}}~~‚€~||}}~{yvuvwxxxz|~}{zzyyzz{||}}}}}}}}}€€~€€‚ƒƒ‚€~~|||{{zzzz{}~}}}}|||}}}}~€€€€€€€€€€€€€~}}||||{{{{{{|||}}€‚‚€€‚ƒƒ„„ƒ‚€€€€‚‚ƒ†††…„‚‚‚ƒƒ„„„‚‚‚‚‚‚‚‚€€€‚‚‚‚€€‚ƒ„………ƒƒƒ„ƒ‚‚‚€‚‚ƒƒƒ‚€ƒ„‚€€€€€€€€€€€€€€€€€~~‚€€‚‚€€€€~|{€ƒ„„ƒ€‚ƒƒ„„………‚‚‚‚‚‚‚‚~€€}|}€€€ƒ‡‰‹‰‰ˆ‡†…„„„†ˆ‰ˆˆ‡ˆˆˆ‡‡†…„„„„„„„„„„†………„„ƒƒ„„ƒƒƒ„……„ƒ€€ƒ†‰ˆ‡††…†††‹ŽŽŽŒˆ……††‡ˆˆˆˆ‡‡††‚‚‚‚ƒ„…†‡…ƒ„††‚~~€€‚ƒ„„„„………†…„ƒƒ„„…†‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰ˆŠŒ‹†‚~}|~€ƒƒƒ€€€€‚€€€€‚~|{zz{{€€€€€‚‚‚€€€€€‚„€€€€€€€€€€€€€€€€~~}}}€€~}}}~||{{{|}~z{{{zywvy|~}~~~~}}|||€€€€€€€€~~€„…ƒ‚‚€~}~€€€}|{zzyzz|||||}~~~~~€€€€€€~~~~~~‚€~||}~~{ywvwxxxxz}}|zyyzzz{||}}~}~}~}~}€€€€€‚‚€~~}}}}|||||€€‚‚‚€}}}}|||}}}}~€€€€€€€€€€€€€€~}}}||||{{{{{||}}}}€ƒ‚€‚‚ƒƒƒƒ‚€€€€€‚‚}~ƒ„……‚‚ƒƒ„„„„………………………„„ƒ‚‚‚‚‚€€‚ƒ„……„ƒ‚ƒ„„ƒ‚€~~€‚ƒ„‚‚ƒ…„€|€€€€€€€€€€€€€€€€~‚‚€€~~‚‚‚€€€~€~}~~‚ƒƒƒƒ‚ƒƒ„„„„……„„ƒƒ‚‚„‚}€‚‚„†‡‡††…„ƒƒ‚ƒ…ˆˆˆ‡‡ˆ‡‡‡†…„„ƒ„„„„„„„„………„„„ƒƒ„„ƒƒ„„……„ƒ€ƒ†ˆˆ‡‡††…††‹‘ŽŽŒˆ……††‡‰‰‰ˆˆˆˆˆ€€€€€ƒ‚‚‚ƒ„………ƒ‚ƒ…„‚€‚ƒƒƒ‚‚‚‚‚ƒ‚‚‚ƒ„†‡ˆ†„‚ƒ„†††………„„„„„„„„„„„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰Š‹Œ‰…€}|}~€‚ƒ‚€€€€‚€€€‚ƒ‚€~}|||€€€€€€€€~~€‚‚‚‚‚€€}}€ƒ†‡€€€€€€€€€€€€€€€€€€~|{zz~}}}|}}}zz{{|}}~{{zyxvuty{}}{yyz{{z{zzzz~~~~~}}|}}€ƒ‚‚‚€€€‚€€}}{{zzzz{{{{{|}~~€€€€~~‚€~||}~~~{ywwxxxxxz}~}|{{||}}~~~~€€€€€€€€€€€€€€€€€~~}}~~~~~~~~ƒƒ„„ƒ‚€€}}}}|||}}}}~€€€€€€€€€~~||}||||{{{{{{|}~~~€‚‚€€‚‚‚ƒƒ‚€€€‚‚~€€€€€€€€€ƒƒƒƒƒƒƒƒ„„ƒƒ‚‚‚‚‚‚€€‚ƒƒ„…„‚‚‚ƒ„„‚‚‚‚ƒ‚‚ƒƒ………ƒ…‡†‚€€€€€€€€€€€€€€€€€~~~†…ƒ€~}}}~~~~~~~}z|€…„„…………„„…†…†††††…„„ƒ€€ƒ……„€‚„ƒ€‚ƒ„„ƒƒ‚‚‚„†ˆ‡‡‡‡††……„„ƒƒ„„„„„„„„……„„„„„ƒ„„ƒƒƒ„………ƒ€€ƒ…ˆˆ‡††…†††‹Ž‘ŽŒ‡…„…††ˆˆˆˆ‡ˆ‡ˆ€€€€„ƒƒ‚ƒƒ„…ƒƒƒƒƒ€€€‚‚‚„ƒƒ‚€€€ƒ„…†‡ˆ†„‚ƒ„†††………„„„„„„„„„„„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰‹‹Šˆ‚||~€‚‚‚€€€‚‚€€€‚‡†„‚‚‚ƒ‚ƒ‚ƒ‚‚€€€€€€€€€€€€‚‚‚‚€€‚€~€„‡‡…€€€€€€€€€€€€€€€€€}|zyx{{{||||{vwwxyyzz}|zxutrrwy{zyvwwxxxxxxyx{|||}}}~||{{}~‚‚‚‚ƒ‚‚ƒ‚‚€~}|{{z{{|{{{|}~~€€€€€€€€€~‚€~|}}~~~~~{yxxyyxwxz~€€€€€€ƒ‚ƒ‚ƒ‚ƒ‚€€‚‚€€€€€€€~~}}‚‚ƒ‚‚€}}}}}|||}}}}~€€€€€€€€€~~~~}||}||||{{{{{||~~€ƒ‚€‚€‚‚ƒ‚‚€€€€‚‚ƒ‚~}}}}~~~~€€€€€€€€€€€‚‚‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒ„ƒƒ‚ƒ„…………………………‚ƒ€~ƒ€€€€€€€€€€€€€€€€}~}}€ƒ‰‡„~}}xyzz|}~~~|xw{„Šˆ‡‡‡‡‡‡ˆˆˆˆˆˆˆˆˆ‡†…„ƒ‚€…†‡…‚€‚„ƒ‚€€€‚‚€€€ƒ†‡‡‡‡‡†……„„„„ƒ„„„„„„„„„„„„„„„ƒ„„„ƒ„„……†„€‚…‡ˆ‡‡…†…††‹ŽŽŽŽ‹‡„„„……††††††††ƒƒƒƒƒƒƒƒ…„ƒƒ‚ƒƒ„‚‚‚‚ƒ‚€‚‚ƒ‚ƒƒƒƒ„ƒƒ‚€ƒ„†‡†‡ˆ†„‚ƒ„†††………„„„„„„„„„„ƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰‹Š‰…}}}‚€€€‚€€€‚……„ƒƒ„……„„„„„„„„‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚€€„ƒ„†Š‰…€€€€€€€€€€€€€€€€€~}zyxwxyz{|{{zwxyzzzyy|{yvutsswy{{ywwxwxxxxyyyz{{||}}}||{{|~€‚€‚ƒ„„„‚ƒƒƒ‚€~~||{{{{}}}}~€€€€~€€€€€~€~‚€~|}~~~~~{zxyyzxwx{‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒ„ƒ„ƒƒ€€‚‚‚€€€€~~~~€€€€€}|}}}}|||}}}}~€€€€€€€€€€€€€~}||}||||{{{z{|}~€€€‚‚€€‚€‚‚‚€€€‚‚€€€€€€€€€€€€~~~~~~~~~~€€‚‚‚‚‚€€‚ƒƒ„„„‚‚ƒƒƒ‚ƒƒ„…†„„„„ƒƒƒƒ~{yz~‚„…€€€€€€€€€€€€€€€€}~||…Š‡ƒ|{zzyzz||~~}yww}…Œ‰‰ˆ‡‡ˆ‰‰‰‰‰‰ˆˆˆˆˆˆ‡†…„ƒ‚†‡ˆ†‚€€ƒ‚€~~€€€€€€€€€ƒ…‡‡‡‡‡…………„„„„„„„„„„„„„„„„„„„„„„ƒƒƒ„……†„€€‚„‡ˆ‡††…†††ŠŒŽŽŠ…ƒ‚ƒ„„„„„„„…………†…†…†…………„ƒ‚‚‚ƒ‚‚ƒƒ‚ƒƒƒƒƒƒƒƒƒ‚‚€€~€€‚…‡ˆ†‡ˆ†„‚ƒ„†††………„„„„„„„„„„ƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰Š‰†ƒ~}~€€€€€€€€‚€€€‚€€€ƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ…„„ƒ‚‚‚‚‚€€„†ˆ‹Šˆ‚~€€€€€€€€€€€€€€€€~}|zyxwvwy{{{zyz{|}}{zyyxwuuvwxy{}}|{{|zz{{||}}{{|}}~||||}‚€‚ƒ„††‚‚ƒƒ‚€~~}||{||~~}~~€€€~~~€€€~~~~~‚€~|}~~~~}{zyyzzywy|€‚ƒ‚‚ƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚€€€€~~~~€€€€~€€€~}}}}}|||}}}}~€€€€€€€€~}|}||||{{{z{|}~€€‚‚€‚‚‚‚€€€€‚‚~€‚ƒ„ƒ‚„ƒƒ‚‚‚€€€€€€€€‚‚‚‚€€‚ƒƒƒ„ƒ‚‚‚ƒ‚‚‚ƒƒ‚‚‚‚ƒƒƒƒ}}~‚……ƒ€€€€€€€€€€€€€€€€|€~{|†Š…€|zz{}}}|}||||zxx}†ˆˆ‡†……†‡ˆˆˆˆ‡††……††……„ƒ‚‚†‡ˆ…€€~~~€€€€€€€€€€‚…†‡†‡‡†…………„…„„„„„„„„„ƒƒƒ„„„„„„„ƒƒ„„……†„‚€€„†ˆ‡†††…††‰‹ŽŽŒˆ„‚‚ƒƒƒƒ„„„„……†††††††††…„ƒ‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚€€€~~}}}}~ƒ†‡†‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰ˆ‡…€}}‚€€€€€€€‚€€€€‚‚€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚…ˆˆ†ƒ€€€€€€€€€€€€€€€€€~}|{zyxxuvxz{zyxyz{{zywuvuuuvx{|{}€€~€}}}~€€||}~€€}|||}‚€‚„…†‡‚‚‚‚‚~~}|||||}}|}}~€€€~~~~€€€~~~}}~~‚€~|~~~~}}{zyyzzywz}€‚‚‚‚ƒ‚‚‚‚‚‚‚€€€€€€€€€€‚ƒƒ‚‚‚€€€€€~~€€€€~€€€}}}}|||}}}}~€€€€~~}|}||||{{{z{|}~€€‚‚€€‚~€‚‚€€€‚‚€‚„‡†„„„ƒƒ‚‚„„„„„„„„ƒ‚‚€€‚‚‚‚€€‚ƒ‚ƒ„ƒ‚‚ƒ‚€€€€€‚ƒ„……„‡‰‰†ƒ‚ƒ€€€€€€€€€€€€€€€€|~€}z{‡‘ˆƒ}}}}|{zyxyww{……„‡†„ƒƒ„†‡††……„„ƒƒƒƒ‚€€€†‡‡…~~€€~}}~€€€€€€‚„††††‡††………………„„„„„„„„ƒƒƒƒ„„„„„„ƒƒƒ„……‡…‚€€„†ˆ‡††…†††‰‹ŽŒŒŒ‹ˆ„‚‚ƒƒ„„………†……………………††„ƒ‚‚‚‚‚ƒ„ƒƒ‚ƒ€€€€~~}}}}||zz{|‚„††‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰‡†ƒ}}€ƒ‚€€€€€€€€‚€€€€‚…„‚€€€€€€€€€€€€€€€€~€€‚‚‚‚€€€ƒ†…€€€€€€€€€€€€€€€€€~ysrw|tvy{}|{zzzyyxxwwttuvwxxyz{|}}}}}}}|||}~~xyz{}€€|}}{z|€ƒ€€€~~~~~}||}~~~~~~~€~€~~€€€€€~€~}€~|}~}ywvvvy|€‚‚‚‚€€€‚ƒƒ€€€€€€€~€€€€€€€€€~~~€€‚€~}}}||~}||}}~~€€€€€€€~~~~~}}}}~}|{zz{{|}‚ƒƒƒ€€~~€€ƒ€€~|‚‚‚‚‚‚‚‚„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚ƒ„…ƒ„ƒ‚€€ƒ„……„ƒ‚ƒ„€€€|}~‚ƒ„ƒ†‡„€€€€€€€€€€€€€€€€€}|yw{€’•‹~{{|€~}}|{{vx{‚„†‡†††……„„„ƒƒ„………„„…†††…„‚‚„ƒ‚ƒ…„‚€‚‚‚‚€€‚„„‚€€€‚…†…ƒ…„…„…„…„††……„„ƒƒ„„„……„„„ƒ„„„„„„…‡†„~~‚…‰‡……‡ˆ‡†ˆ‹ŽŒ‡†„‚€‚………††‡ˆ‰‰‡‡‡††………‚‚€€~~~~~~~~}}}}}}}}|||{{{zz|zxy~ƒ‡ˆˆ‡…„„„…………„„„…††„ƒ„ƒ„ƒ„ƒƒƒ„„„„ƒƒ„………………†‡‡ˆ‰ŠŠ‰‰ˆ„€€}~~€‚€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€‚ƒƒ€‚„€~~~€€€‚‚‚€€€€€€€€€€€€€€€€~~|wssvytuxz{{zzzzyyxxwwtuuvwxyyxyz||}||~}}|||||{|||}}~~|}}{z{‚€€~~}}~~}}}}}~~~~~~~€~~€€€€€~€~}€€~}}~|yvvvvx|€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€‚€~}}}||~}||}}~~€€€€€€€€~~~~}}}}}}|{z{{{|}‚ƒ‚‚€€€~‚€€€€€€€€‚‚‚‚‚‚‚‚€€€‚ƒ„ƒƒƒ‚€€‚ƒ„…„ƒ‚‚„‚‚‚‚‚ƒƒƒ„„„„ƒ…†„€|{|€€€€€€€€€€€€€€€€€~|{xvx}Œˆ|z{|€||{{zyyy€‚…†‡ˆˆ………„„ƒƒƒ„„„………„„††……„ƒ‚„ƒ‚ƒ…„‚‚ƒ„„„„ƒ‚‚ƒ…††…ƒ‚€€‚„†…ƒ„…„…„…„…………„„„ƒƒ„„„……„„„ƒ„„„„„„…‡†„~‚…‰‡……‡ˆ‡†‰ŒŽ‘Œˆ‚‚‚ƒƒ€€ƒƒƒƒƒƒƒƒ€€~~~~~~~~~~~~~}}}}}}}}|||{{{zz|zxz~„‡ˆ‡‡…„„„„…†……„„„……ƒ„ƒ„ƒ„ƒ„ƒƒ„„„„ƒƒ„„…………††‡ˆˆ‰ŠŠ‰‰ˆ…€€€~~~€€€~€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒƒ‚„‚‚€€€‚~‚„„…€€€€€€€€€€€€€€€€~|yvttuvstvxyyyxzyyyxwwwtuuvwxyyyy{{||||}}||{{{z~~~}}||}}}{zz~€€€€€€€€~~~}}}|}}}}}}}}~~~~~~~€~€€€€~€~|}~~~{xvuvux{~~~~~€€€€€€€€€€€€€€€€€€€€€€€€‚€~}}}||~}||}}~~€€€€€€€€€€~~~~}}}}}||{{{{||}€‚‚‚‚€€€~€ƒ„ƒ‚~~~~~~~~€€€€€€€€€€€€‚ƒ‚‚‚€‚ƒ„…„ƒ‚‚ƒƒƒƒ‚‚‚‚ƒƒ‚‚‚}ywyz€€€€€€€€€€€€€€€€}{zwtuy…Š„{z|}}}}}||{{†‡ˆˆ‰ˆ‡‡„„„„„ƒƒƒ……………………††…„ƒ‚„ƒ‚ƒ…„‚‚‚ƒ„„ƒ‚‚ƒ„…††…„ƒ‚€€„……ƒ…„…„…„…„……„„„ƒƒƒ„„„……„„„ƒ„„„„„„…††…‚„ˆ‡††‡ˆˆ‡Š‘‘Ž‰ƒ€€€~}}~~~}}}}|}}}}||||}}}}~}}}}}}}}}}}|||{{{zz|zyz€„‡ˆ‡†…„ƒ„„…††…„„„„„„ƒ„ƒ„ƒ„ƒƒƒ„„„„ƒƒ„„„……†††‡ˆ‰‰Š‰‰‰ˆ…€€€€€€~~~~}~~~€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒ„ƒ‚€‚ƒƒƒ‚‚‚ƒ„€€‚ƒ†‡‰Š€€€€€€€€€€€€€€€€|xwvwutsstuvvvvxxxwwvvvtuuvwxyyz{{|{{zzyzz|||||~~~~~~~~}{yz|€€€€€€€€~~}}|||||}}~~~}}~~~~~~~€€€€~€~{|~~~~~ywuuuuwz~~~~~~€€€€€€€€€€€€€€€€€€€€€€€‚€€~}}}||~}||}}~~€€€€€€€€€€‚~~~~}}}}||{{z{{||}~€€€€‚€ƒ„ƒ‚~~~~~~~~~~~€€€‚ƒ„„„‚‚‚ƒƒƒ‚‚‚‚‚€€€{|{ywx|€€€€€€€€€€€€€€€€}{{yutv€‡„}‚…„„„„„„„ƒ‡‡ˆˆ‡‡…„……………………‡†……„………††„ƒ€€€„ƒ‚ƒ…„‚€€‚‚‚‚‚‚‚‚ƒ€ƒ…„ƒ„…„…„…„…„„„„ƒƒƒƒ„„„……„„„ƒ„„„„„„……†…ƒ€ƒˆ‡††‡ˆˆˆŒŽ‘’’ŽŠ…‚~~}~~~||{{~~}}}}||}}}}}}}}}}}}}}}}}}}}}}}}|||{{{zz{zy|€…‡‡‡†„ƒƒƒ„„‡†…„ƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒ„„……†††ˆˆ‰Š‰‰ˆˆˆ†‚€€€€€€€€€€~}||}}}}}~€‚‚‚‚‚‚‚‚„„„„„„„„„„„„„„„„‚„…„‚ƒƒ‚‚„„……†‡ˆŠ‹‹€€€€€€€€€€€€€€€€€}zyzyvsrrrrssttvvvuuttssttuvwxxzzzyywvuuvy{~~||}€‚ƒ~zxx{~~~~}}|||||~~}|}}~}~~~~~~~€€€€~€~{|}~~~xvuuvuwz~~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚~}}}||~}||}}~~€€€€€€€€€€‚~~~~}}}}|{{z{{|||}€€€€€„ƒƒƒ€€€€€€€€~~~~~~~~~~}~€€€‚ƒƒ„ƒ‚‚ƒ‚€€€€ƒƒƒƒ„„„„}{|„€€€€€€€€€€€€€€€€€}|}{wuvˆ‡‚…‡‡Š‰‰‰‰‰ŠŠŠ††‡‡ˆ††…††‡‡‡‡‡‡‡†…ƒƒƒ„…‡…ƒ~„ƒ‚ƒ…„‚~€€~„‚€€‚„„„…„…„…„…„„„„„ƒƒƒƒ„„„……„„„ƒ„„„„„„…………ƒ‚‡‡‡‡‡ˆ‰Š‘‘’’‹ƒ€~~~~~~~~~}~}}|||||||}}}}}}}}}}}|}|}}}}}}}}}}|||{{{zz{zz}‚…‡‡†…„ƒ‚ƒƒ„‡†…„ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„„ƒƒ„……†‡‡ˆˆ‰‰Š‰ˆˆˆ†„€~}€€€€€€€€‚~}||~}|||}€‚‚‚‚‚‚‚‚„„„„„„„„„„„„„„„„ƒ…†„‚‚ƒ€€€€ƒ„‡‡‡†††††€€€€€€€€€€€€€€€€}{{{zvsrqpooprssssrrqqqrrstuuvwwwwwutrrrux|yz|„†‡}{wwy|~~}}||{|~€~|{|||}}~}~~~~}~~~€€€€€~€~|||}~}|xutvvvwz}~€€€€€€€€€€€€€€€€€€€€€€€~€€‚€€~}}}||~}||}}~~€€€€€€€€€~~~~}}}}|{{{{||}|}~€€€€€~~~€…ƒ‚‚€~‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚~}~~€€€€‚ƒ‚ƒ„ƒ‚€€€€€€‚‚‚†‡‡„€‚„€€€€€€€€€€€€€€€€€}|~~zwv‰Š‡ŠŒ‹‰‰‰‰ŠŠ‹‹‡ˆ‰ŠŠŠ‰ˆ‡‡‡ˆˆˆˆˆˆ†„‚‚ƒ„‡†‚}}~~„ƒ‚ƒ…„‚€‚ƒƒ‚€ƒ‚‚ƒ†ƒ€ƒ„„„…„…„…„…„„„„„„„„„„„……„„„ƒ„„„„„„…„…†„€€‚†‡ˆ‡‡ˆ‰‹‘‘’Œƒ€~€~}|~~~~}}}}|}|}||||}}}}}}}}}}}}}}}}}}}}|||{{{zz{z{ƒ‡‡‡†…„‚‚‚ƒƒ†…„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒƒƒƒ„„ƒƒ„„…†‡‡‰‰‰Š‰‰ˆ‡ˆ‡„}}~€€€€‚‚€~}}}|{|}€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„„„„„„„„††…‚ƒ€€‚ƒ„…„„ƒ‚€€€€€€€€€€€€€€€€€€|||{zxurrpommnpqqppoonnnppqrstuuuuvvvutssuy}€‚yz|‚…‡‰€€~zwvx{~~~~~~~~€~~~}z|€€~|z{{||||}}~~}~~~~€€~€€€€~€~~}|}~~|zwuuvwvxz~~€€€€€€€€€€€€€€€~~~~~€€€€‚€~}}}||~}||}}~~€€€€€€€~~~~}}}}{{{z{|}}}}~€~~~}}}~‚€‚€‚‚‚‚€€€€€€€€~~€‚€‚€ƒ„‚ƒ„ƒ€‚‚‚‚€€~~~}}}}„†…‚€€€€€€€€€€€€€€€€€€~{|{wv~‰Œ‰‹Œˆˆˆ‰ŠŠ‹‹‰Š‹‹‹Š‰ˆ†‡‡‡ˆˆˆˆˆ†ƒ€€‚ƒˆ…‚~||}~„ƒ‚ƒ…„‚€‚‚‚‚€‚~~‚‡„€€ƒ„„…„…„…„…„„„„„„„„„„„„……„„„ƒ„„„„„„…ƒ…†…‚€€†‡ˆˆ‡ˆŠŒ‘’Œ…€}}~~}}}}~~~~~~~~~~~~~~||||}}}}}}}}}}}}}}}}}}}}|||{{{zzzz|„‡‡†…„ƒ‚‚‚‚ƒ…„„ƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„„ƒƒƒƒ„„‚ƒƒ„†‡‡ˆ‰‰ŠŠ‰ˆˆ‡‡‡†}|~€‚‚‚€€€~|{|~€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ…†‡…ƒ‚ƒ€‚ƒ…†„„„ƒƒƒ‚‚€€€€€€€€€€€€€€€€z{{{yvsqqpnllmopoonnmmlloopqrsstuuvxxxxwtw{€z{}€ƒ…‡ˆ€€~zvvxz~~~~~~~~€€€~~~z|€€|z{{{{||||~~~~}~~~~€€~€€€€~€~}|}~~{ywuuwwwx{~~~~~~~~~€€€€€~€€€€€~~~~~~~~~~€€‚€~}}}||~}||}}~~€€€€€~~~~}}}}{{zz{|}~}}~~~~~}||}~~~}~‚€€€€€€€€€€€€€€€€€€€‚‚‚‚ƒ…‚ƒƒƒ€‚ƒƒƒ‚‚‚ƒƒ‚€~}|uy~€}}~€€€€€€€€€€€€€€€€|zz~{wu}‰ŒŠŠ‹ˆ‰‰Š‹‹ŒŒŠŠ‹‹Š‰‡†…†††‡‡ˆˆ‡…‚€‚ˆ…}{{|}„ƒ‚ƒ…„‚}~€€~}~|{{|~‡„€~€‚„„„…„…„…„…„„„„…………„„„……„„„ƒ„„„„„„…ƒ…†…‚€€†‡‰ˆ‡ˆŠ‘’Œ…€}}~}}|||}}}}}|}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}|||{{{zzzz|€„‡‡†…„ƒ‚‚‚ƒ„ƒƒƒƒ„„…ƒ„ƒ„ƒ„ƒ„„„ƒƒƒƒ„„‚‚ƒ„†‡‡ˆ‰‰ŠŠ‰ˆ‡‡‡ˆ†‚}{}€‚‚‚‚}{|~ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚†‡‡†ƒƒƒ‚‚ƒ„…‡ˆ…††‡‡ˆ‰‰€€€€€€€€€€€€€€€€|zwwvtpmlmpqqoljkoollnolllmnopqquuttssrrrtw{}~~~yyz|€~}}|wtx}~€€}||}}~~}}|~~}}||}}}}}}}}~~~~~~~~}}}}~‚|||{zxwvvvvuvwxx€€~~~€€€€€€€€€€€~~~~~~€~~~€€‚~}}}}~~‚‚€~}}}~~~~~~€~~€€€€€€€~}|{{zzzzz{}~|}~€€}}~~~~€€~|z}~€‚‚}€€€‚‚‚‚‚€€‚……„ƒ€€€~€€‚ƒ„ƒ„…ƒ‚€‚…ƒ‚‚ƒƒ‚„ƒƒ€~}~~€€€€€€€€€€€€€€€€€|ww{{wvz„ˆ„|€Œ…‹‰ˆŠŒ‹Š‰Œ‹Š‰‰‰‰‰ˆ‡‡††‡‡‡†…„ƒƒƒƒˆ‡…~}~€„‚€‚…†ƒ||||||||yz{{z{}€‚‚‚ƒƒƒ…………„„„„ƒƒƒ„„………††††††††„„………††††††…„‚€„‡‰ˆŠŽŽŒŽŽŽŽ‹ƒ~|~}}~~~}}~}}}}}|||}}}}}~~~~~~~~~~~~}}}}~}}|||{{{xz~‚„……„…ƒ€‚‚€„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ‚‚ƒ…†‡ˆ‰ŠŠ‹Š‰ˆ†…ˆ†ƒ€€€€€€€€~€ƒ„ƒƒ‚‚‚‚ƒƒ‚ƒ„ƒ‚‚ƒ„ƒƒ‚…††…ƒ‚ƒƒ€ƒ………††††‡‡‡‡€€€€€€€€€€€€€€€€zxwwyyvtqrtutrommopmmoomoopqrsttttssrrqqqsvyz{zzxwwy{|zy}}|{wux}~€€}||}}~~~}}~~~}}}|}}}}}}}}}}}}}}}}}}}}~‚|||{zxwvvvvvvwwx~€~~~~€€€€€€€€€€€~~~~~~~~€€€‚~}}}}~~€‚€~}}}~~~~~~~~€€€€€€~}||{z{zzz{}~€|}~€€€}}~~~~€€~|{|}€€‚‚ƒ‚‚€€€€€‚ƒ„ƒ‚€~€€€€€ƒƒƒ„„„‚‚‚‚‚ƒƒ‚€€€€€€€€€€€€€€€€€€€€€}urwzywxƒz}‡‹ˆŒŠˆ‰‹Œ‹ŠŒ‹Š‰ˆˆˆˆŠŠ‰‰ˆˆ‰‰‡†…„ƒƒƒ„‰ˆ‡ƒ€ƒ„‚‚„…‚||||||||y{{{z{}€‚‚‚ƒƒƒ…………„„„„ƒƒƒ„„……………………………„„„……………†††…„‚€ƒ‡‰‰‹ŽŒŽŽŽ‘ŽŠƒ~€€~}~~}}}~~~~~~}}}}}}}}~~~~~~~~~~~~~}}}}~~}}||{{{{x{~‚„……„„‚€€ƒ‚‚„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„‚ƒ„…†ˆˆ‰ŠŠŠŠ‰ˆ†…‡…‚~~€€€€€‚‚‚€‚ƒ‚‚‚‚ƒ‚ƒ„ƒ‚‚ƒ„ƒƒ‚‚‚„††…‚‚ƒƒ€ƒ…………††††‡‡‡€€€€€€€€€€€€€€€€|yxyxuswxyyxvsqnoonnoonppqrstuurrstuvwwrsvwyyxw|{{|~~|z|{{zxux}€€€~~}}}~~~}}}~~~~}}}}}}}}}}}}||||||||}}}}~‚}||zyxwvvvvuvvxx|}~~~~~€€€€€€€€€€€~~~~~~~~€€‚~}}}}~~‚‚€~}}~~~~~~~~~~~€€€€€~~}}|{{{{{z|}€|}~€}}~~~~€€€~}~}}~‚ƒ‚‚ƒ‚‚~€€‚€€‚‚€€€€€€‚ƒƒ„…ƒ‚€‚€€‚€€€€€€€€€€€€€€€€€€vqsyzxw~}zxy~…ŠŒŠ‰Š‹Œ‹‹Š‰ˆ‡‡‡‡‰‰ˆ‡‡‡ˆˆˆ‡†…„„„„‡‡†ƒƒ…„‚‚„„~||||||||z{|{{{~€‚‚ƒƒƒƒ………„„„„ƒƒƒ„„„„……„„…„…„…„ƒƒ„„„„……†††…„‚€ƒ†‰‰‹‹Ž‘‘Ž‰‚~€~~~}}}}~~~~~}}}}}}}}}~~~~~~~~~~~~}}}}~~}}|||{{{y{‚…………‚€‚ƒ„ƒ„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒ„…‡‡ˆ‰‰ŠŠŠ‰‡†…†„}}~€€€€‚ƒƒ„„ƒ‚€€€‚‚‚‚‚ƒƒƒ‚‚‚ƒ„ƒƒ‚‚‚‚ƒ„…†„‚‚ƒ€€ƒ……„……†…††††€€€€€€€€€€€€€€€€|yvuvwut{{|{zwutnnmmnonmnooqqsstqqrrrrssstvwxyyy{zz|~~}{zyy{ywy}€€~~}}}~~~~}}~~~~}}}}~~~~~~~~}}}}}}}}}}}}~‚~}{zxwwwvvuvvwwx|}~~~€€€€~~~~~~~€€€€‚~}}}}~~€‚€~~~~~~~~~~~~€€€€~~~}}||{{{{{{|~€|}~€€€}}~~~€€€€€‚~~€‚ƒ€€~€‚‚‚‚ƒ€‚‚€€ƒ€€€€€€‚ƒƒ„„„‚‚‚€€ƒ€€€‚ƒƒƒ€€€€€€€€€€€€€€€€€€„~yxyzyy~zwwuv~ˆ‹‰‰Œ‹Š‰ˆ‡‡ˆˆ‰ˆ‡‡†‡‡‡ˆ‡†…„„…………„€‚…„ƒ‚ƒƒƒ€~||||||||z{||{|~‚‚ƒƒƒ……„„„„ƒƒ„„„„„„„„„„ƒ„ƒ„ƒ„ƒƒƒƒƒ„„„††††„‚€†‰ŠŒŠŽ’““Ž‰€~~~}}}~}||}}}}}}|||}}}}}}}}}}}}}}}}~}}}}}}~}}||{{{{y{ƒ…††…~}„…„„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„„„…†‡ˆˆ‰‰‰‰Šˆ‡…„†„~|}~~€€€€‚‚€€‚ƒ‚€‚‚ƒƒƒ‚‚‚ƒ„ƒƒƒ‚ƒƒƒ„……„‚‚‚€‚……„……………†††€€€€€€€€€€€€€€€€nllnswzz{{{zyxvunlkmnnmlnnooqqrsrrqqqpppqrtvwyyzxxx{~~|zxyz{y{~€€~~~~~}}~~~~}}}}}~~~~~~~~~~~~}}}}~‚€~|yxvwwvvvuvvxx|}€€€€€~~~~~~~€€€€‚~}}}}~~‚‚€~~~~~~~~~€€€~~~}}}}||||||{}~€|}~€}}~~~€‚‚‡…‚€€€€€€‚‚ƒƒ„ƒ‚€‚ƒƒ€‚ƒ‚€€€‚‚ƒ„…ƒ‚€‚‚ƒ„ƒ€‚€€ƒƒ„„‚ƒƒƒƒ‚€€€€€€€€€€€€€€€€ˆ‰‡|z|~€zwwtrxƒ‹‰‰ŒŒŒŒŠ‰‰‰‰‰‹ŠŠ‰‰‰‰‰‰ˆ‡†………………„‚€€‚…„„ƒ‚‚}||||||||z{}|||‚‚ƒƒƒƒ„„„ƒ„ƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„†††…„‚€€…‰Š‹Ž’’”“‰~~~}}}~}||}}}}}}|||}}}}}}}}}}}}}}}}}}}}}}}}}|}||{{{y|€ƒ††††}}~„…„„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ……††‡ˆˆˆ‰‰‰‰ˆ†…„†„~|}~~€€€€‚‚~}}}}}}€„…‚€‚‚ƒƒ‚‚ƒƒƒƒ‚ƒƒƒ„ƒ„…ƒ‚€‚‚€‚„„„„„…„…………€€€€€€€€€€€€€€€€mjhjnsuvzzyyxxxxplkmoomloopqrsttsrrrrrqqpqrtuwxyvvwy}~}|yxx||||€~}~~}~~~~}}}}~~~~~~~~~~~~€€€€€€€€}}}}~‚|ywvvwvvuvvwwx}~€€€€€€€€€€€€€€€€~~~€€€‚~}}}}~~€‚€~~~~~€~€€~~}}}}|}|}||||}€|}~€€€}}~~~€€‚„…Šˆ†„‚€€‚ƒƒƒ‚‚‚ƒƒ„ƒƒ€€ƒƒ‚€€‚„ƒ‚€€€‚ƒ„„„‚„„„„‚‚‚‚‚‚ƒ„„ƒ„„……………€€€€€€€€€€€€€€€€ˆ‘Š€‚|yzwtw~ˆŽŠ‰ŒŠŒ‹Š‰‰‰‰ŠŠ‰‰ˆ‰‰‰Š‰ˆ†††††‰ˆ‡„‚‚„†„„„ƒ€}|||||||||{|}}|}‚‚ƒƒƒ„„„„ƒƒƒƒ……„„„„ƒƒƒ„ƒ„ƒ„ƒƒƒƒƒ„„………††††„‚€„ˆ‹‘‘’“”‹ƒ}~~~~~~}}}}~~~~~}}}~~}}}}}}}}}}}}}}|}}}}}}|}}||{{{{z|€„†‡‡†}|~€ƒ„„„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„†††‡‡ˆˆˆˆˆˆ‰‡†„ƒ†„}}~€€€‚‚‚‚‚€}|{{zzz|~ƒ…‚‚‚‚‚ƒ‚‚ƒƒ‚‚‚‚ƒƒ„ƒ„…„€€€~„„ƒƒ„„„„………€€€€€€€€€€€€€€€€sojikmooyyxxyzz{rmkorpnnppqrstuuutsrponmrrstuvwxsssuxyxvywx|~}~€€}}}~~~~~|}}}~~~~~~~~~~~}}}}~‚‚|xvvvwvvvuvwxx}~€€€€€€€€€€€€€~~~€€‚~}}}}~~‚‚€~~~~~€€€€~~}}}}}}}}}|||}‚|}~€€}}~~~€ƒ…‡‰‰ˆ‡†ƒ€€€‚ƒƒƒƒ‚ƒƒƒƒ‚‚‚‚ƒƒ‚€ƒ„„ƒ‚€€€€ƒ„…ƒ‚€‚„ƒƒƒƒƒƒ‚‚‚‚‚ƒƒƒƒ‚ƒ„„…„„„€€€€€€€€€€€€€€€€…‘Œˆ‡…‚}{||{z{…Œ‹‰ŒŒˆŒ‹Š‰ˆˆˆ‰‰‰ˆ‡‡‡ˆˆŠ‰ˆ‡†††‡ŠŠˆ…‚ƒ………„ƒ~}|||||||||{|}}|}‚‚‚ƒƒƒƒ„„„ƒƒƒƒ‚………„„ƒƒƒ„„„„„„„„„„„„…………†††…„‚€~ƒ‰‹Ž‘‘’‘’“‘„|}}~~}~~}}}~~~~~~}}}~~~}}}}}}}}}}}}}||}~~}||}}|||{{{z}€„†‡‡†~}}€‚ƒ‚„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ‡‡‡‡ˆˆˆˆˆˆˆˆ‡…„ƒ‡…‚~~€€€‚‚‚‚‚}}|yyzz|~‚ƒ‚‚‚‚ƒ‚ƒ‚‚‚‚‚ƒƒƒ„…ƒ€~ƒ„ƒƒƒ„„„„„„€€€€€€€€€€€€€€€€rnihknpqyxxyz{}~uomqtrppppqrsttuuuttsssrvvuvvwwxyxxy{{ywywx}‚€}}}€~~~~||}}~~~~~~~~~~}}}}~‚‚€|xvuvwvvvvvwxx|~~~~~€€€€€€€€€€€€€€€~~~€€€‚~}}}}~~€‚€~~~~€€€€~~|||}}}}}}}|}}‚|}~€€}}~~~€€€„†ˆ‡ˆ‰Š‰†ƒ‚~€‚‚‚‚‚‚‚‚‚€ƒƒ‚ƒ„ƒ€ƒ…„ƒ‚€€€ƒ„„ƒ‚€‚ƒ‚‚„…„‚ƒƒƒƒƒƒ‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€‰ŽŒŒ‰‚€}|}€€~{ƒ‹ŒŠŒ‹†‹Š‰ˆ‡‡‡‡‹‹Š‰‰‰‰ŠŠŠˆ‡‡†‡‡Š‰‡ƒ€€‚„……ƒ€~||||||||||{|}}|}‚‚‚‚ƒƒƒ„„ƒƒƒƒ‚‚………„„ƒƒƒ„„„„„„„„„„………††††††…„‚€}ƒ‰Œ‘‘‘‘“’Ž„~z{|}~}}~~~}}~}}}}}|||~~~}}}}}}}}}}}}}||}~~}||}}||{{{{z}„‡‡‡‡€~}~€‚‚„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„‡‡‡‡ˆˆˆˆˆˆˆˆ‡…„ƒˆ†ƒ€€€‚‚‚€€€€zzzz{|~ƒƒ‚‚‚‚ƒƒ‚‚‚‚‚ƒƒƒ„„ƒ€€~ƒƒƒƒƒƒ„„„„„€€€€€€€€€€€€€€€€wrljmrvx}}}|{zzzutsrrstuqqrsuuvwxwuttuvwvvwxyz{{{{{||}}}xyz|€‚ƒ~~~~~€~~~}~~}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}||{|}~€€}xuux{{wuvxxxy~~~~~€€€~€€€€€€€€€}~~}~~€€€€€€ƒ‚€~}||||}~€€~~}}}~€€€~€€€€~~~}|||||||}}€€~€€~~~~€€€€€ƒ„†ˆ‰‰ˆˆƒ€‚‚ƒƒƒƒ„ƒ‚‚‚€€‚ƒ‚€‚€€‚‚ƒ„ƒ‚€€€‚ƒƒ‚ƒ„„…„ƒ‚‚€‚ƒ‚‚‚ƒ€€€€€€€€€€€€€€€€‰‹‹‡‚{zzz|}|{ƒˆŠ‡†‰‹‹‹‹‹Š‰ˆˆˆˆˆˆ‡‡†††‡‡‡††………††……„„„ƒ…„‚€~|zy||||||||||||~‚€‚ƒ„ƒƒ„„„„„„„„„„„ƒ„ƒ„ƒ„ƒ‚‚‚ƒƒ„„„„………†††ˆ‡†…†„~ƒ‰‘‘‘…|||}~~}~}~}~}}}}}}}}}||}}}~~~}}}}}}}}||||||||{{{zyyyxw|‚†‡‡‡ˆ…‚€€‚€„„ƒ‚‚ƒ„„ƒƒƒƒƒƒƒƒ„ƒƒƒƒƒ„…„…‡ˆ‰ˆ‡‡ˆˆ‡††…„„‡†ƒ||‚‚€€}~€‚€~~}|{zyxƒ„ƒ‚‚‚‚ƒ‚‚‚‚ƒƒƒ„…ƒ€€€€‚‚‚‚‚‚€€€€ƒƒ„…………„„„€€€€€€€€€€€€€€€€~yutw{}~}||{{zzyxxxxwwvvwwxyyzz{yxwvvvxyzzzz{{{{yzzz{{{|yyz|}€€~~~~~~~~}~~}~~~€€€~~}}}}~~~~~~~~}}}}}}}}}||}}€€}yuux{{wuvwwwx}~~~€€€~€€€€€€€€€~~€€‚~|||||}~€€€~~~~~~~~~~€€~~~~}|||||||}~~€€~€~~~~€€€€ƒƒ‚‚ƒ…†ˆ‡„€€€€‚ƒ‚€€‚ƒ‚ƒƒ‚‚‚‚€‚ƒ€‚€€‚‚ƒ„„‚€ƒƒ‚‚ƒƒƒ‚‚ƒ„…„„ƒƒ‚‚ƒ‚‚€€€€€€€€€€€€€€€€ƒƒƒƒƒ€|x|{zzzzyy€„‡„„‡‰‰††††…………‡‡‡††………††………„„„†………„„ƒƒ„„‚€~|{z|||||||||||}}‚€ƒƒƒƒƒ„„„„„„„„„ƒ„ƒ„ƒ„ƒ„„„„„„„ƒƒƒƒ„„„………ˆ‡…………~‚‡ŒŒ‰‰‘‘“’†|||}~}}~}~}~}~}}}}}}}}}}}|||||}~}~}~}~}}}}}}}}||{{zzyyx}‚†‡‡‡ˆ…ƒ€€‚€„ƒƒ‚‚ƒƒ„ƒ„ƒ„ƒ„ƒ„„„ƒƒƒ„„……†‡ˆ‰ˆˆ‡ˆˆ‡‡……„„††„€}|‚€€€€€~~}|||ƒƒƒ‚ƒ‚‚ƒ‚‚‚‚ƒƒ„…„€€€€‚‚‚‚‚€€€€€€‚‚ƒƒƒ„……………€€€€€€€€€€€€€€€€~{xx{}~}~}}}|||{}~}{zyyyyyyyyyyxxxxyz|{{{{zzzyyyzz{{{||||}}~~~~~~€~~~~}€~~~~~€€€€~~}}}~~~~~~~~~}}}~€}yvvx{{xvvwvvx}~€€€€€€€€€€€€€€€~~~€€~~~}€€€‚}|||||}€€~~~~}}~~~~€~~~~}}||{||||}}€€€~~€€~~~~~€€€€€€€ƒ„‡„‚€ƒƒ‚€ƒƒƒƒ‚‚‚‚€€‚‚‚€ƒ‚€€‚ƒƒ„…„ƒ‚„„ƒƒƒƒ‚‚ƒ„………„„„ƒ€€€€€€€€€€€€€€€€€€€ƒ€}}~{w}|{{{z€ƒ…………††††‡‡†††………„„……„„„ƒƒƒ……„„ƒƒƒ‚ƒƒ‚€~|{{||||||||||||~‚‚ƒ‚‚ƒƒ„„„ƒ„ƒ„„„ƒ„ƒ„ƒ„ƒ†††…„„ƒƒ‚‚ƒƒƒ„„„ˆ†……†„‚~€…‹Žˆ„‡’’“’’†||}~~|~}~}~}~}}}}}}}}}~~~}}||}}}}}}}}~~~~~~~~|||||{{{z~ƒ‡ˆ‡‡‡…ƒ€‚‚‚„ƒƒƒƒƒƒ„„„„„„„„„„ƒƒƒ„„………†‡ˆ‰ˆˆ‡ˆˆˆ††„„„††„~}‚€€€€€€€‚‚ƒƒ‚€€€|~‚‚‚‚‚€‚‚‚‚‚‚ƒƒƒ„…ƒ€€€€€‚‚€€ƒƒ‚‚ƒ„…†††€€€€€€€€€€€€€€€€}{yz|}|z~~~~~~}}ƒ…„‚~|xxxxwwwwyyyyyzz{zzzzzzzz{{{||}}~€€€€~~~~~~~}}‚€~~~~€€€€~~}}~~~~~~~~~~~€‚€~zwwx{{xvvvuvx}~€€€€€€€€€€€€€€€€€€~}}~~~~~€€€~}|||||}~€€€€~}}~€€€}}~~€€~~~~}}||{||||||~~€€€€~}~€}}~}~~~€€€}~€€‚‚‚ƒƒƒ‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚€‚ƒ€ƒ‚‚ƒƒ„…„ƒ‚‚‚„„ƒƒ‚‚€‚„…†……„„ƒ€‚€€€€€€€€€€€€€€€€}xx{}zw|}~}{{{|x}}}ƒ‚……††‡ˆˆˆ†††………„„„„„„ƒƒ‚‚ƒƒƒ‚‚€~}|{|||||||||||}}€‚€‚‚‚‚‚ƒƒ„ƒ„ƒ„ƒƒƒ„ƒ„ƒ„ƒ„……„„„„ƒƒƒƒƒƒ„„„…‡†……†…‚€€€ƒŒ‘Ž‡Š““‘‘Ž‡||}~~{}~}~}~}~}}}}}}}}~~~~~}}}|}|}|}||~~~~~~~~}}|}|}||{€„ˆˆ‡‡‡…ƒ‚ƒ‚ƒƒƒƒƒƒƒƒ„„„„„„„„„ƒƒƒƒ……††‡ˆˆ‰ˆˆˆˆˆ‡‡……„„††…‚~€€€~€€~~~‚ƒƒƒ‚‚‚‚‚€‚€€€€€‚‚‚‚‚ƒ‚ƒƒ„…„€€€€€‚€€€€€€‚‚ƒ‚ƒ„…†††€€€€€€€€€€€€€€€€|{{}~}{zzzzzzzzz||zzyzyyxxxyyz{{|||{{|}}~€€‚‚†……ƒƒ€~~€~~~}‚‚~~~~~~€~~~~~~~~~~~~€€€|xwyzzwvvvtvx}~€€€€€€€€€€€€€€€€~~~~~~~~€}|}~~~~€€€€~||{|||}€€~}~€€~~~€€€€~~~~~}||{|{||||}}€€~}}~}}}~}~~€€€€€‚ƒ‚€‚ƒƒƒ‚ƒƒ‚‚ƒ‚‚‚‚‚‚ƒƒ‚€€‚‚‚€‚‚‚‚‚ƒ…„ƒ‚‚ƒƒƒƒ‚€€€€‚„……†…ƒƒ‚€ƒ„€€€€€€€€€€€€€€€€|xuuxyxvxz|{yxz}}‚„„†…‚‚ƒƒ„……††………„„„„ƒƒƒƒ‚‚‚€€~~~}}||{||||||||||||~‚€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ‚‚ƒƒƒƒ„„„„„………††‡………†…ƒ€ƒ€ƒŒ’Ž‡„“‘Ž†|}}~~{~}~}~}~}}}}}}}}}|||}}}}~}}}}}}}}~~~~~~~~}}}}}}}}}†ˆ‰‡‡‡†„‚ƒƒƒ‚ƒƒƒƒƒƒ‚„ƒ„ƒ„ƒ„„ƒƒƒƒ„…†‡ˆˆˆˆ‰‰ˆˆˆˆˆ††„„„†††ƒ€€€€€~~~}|}~€€‚‚€‚€€€‚‚‚‚‚‚ƒƒƒ„…ƒ€€€€€€€‚‚€€ƒƒƒƒ„„…„„„€€€€€€€€€€€€€€€€|xutvxwvsssttuuutuwzzzyxzzzzzzzz{|}€€€‚„……†ƒƒƒ„„………ˆˆ‡†…„ƒƒ€€~~~}}€}~~~~€€~~~~~~~~~~~~~€€€}yxyzxvvvutvy}~€€~€€€€€€€€€€€~~~~~~~~~~~~~~€€€€€~}|{||||}~€€€€€€€€~€€€€~~~~}}||{{{||||||~~€€€}|}~~|}}}~}~~~€€€€„ƒ‚‚ƒ„„„ƒ€ƒ‚„„‚€‚‚‚ƒƒ‚€‚ƒ€‚ƒ„„ƒ‚‚ƒ‚‚‚€€€‚ƒ„……„„‚ƒƒ‚‚‚„…€€€€€€€€€€€€€€€€}}~~~~~ƒ…ƒ~}‚…‰Š‡…‡‰‡ƒƒƒƒ„„„„ƒƒƒ‚‚€€€~~~}}}|||{{{{{{zz|||||||||||}}€‚‚ƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„‚ƒƒ„„„…………††††…„…††ƒƒ‚‹Œˆˆ‘Žƒ~}~}}~}}~}~}~}~}}}}}}}}~~~€€~~~~~~~~|||||||||||}}}}~ƒ‡Š‰ˆ‡‡†„‚‚‚„ƒ‚‚‚ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„††‡ˆˆ‰‰‰‰‰‰ˆˆ‡‡……„„…†‡…€€€€€~~~~}~~€~~€€€€ƒ‚‚‚‚ƒ‚‚‚ƒ‚ƒƒ„…„€€€€€€‚€€€‚‚ƒ„„„„„„ƒƒ€€€€€€€€€€€€€€€€yuomoqssqrrssttustuwy{|}||}}~~€‚„……„„…†††‡ˆˆˆ„„……††‡‡‡‡‡†…„„ƒ€€€€~~~}€€€~~~€€€€~~~~~~~~~~~}}}~€€€}zxyzvuuvutw{}~~~~~~€€€€€€€€€€€€€€~}}{{{|||}€€€€€€€€€~~€~~~~~}}}||{{{{||||}}€€}||~~|||}}~~~~€‚‚‚„ƒ‚‚ƒ„ƒƒƒƒ‚‚ƒ„‚‚‚ƒƒ‚€€‚ƒ‚€€€‚ƒƒ‚‚‚‚‚‚‚€‚‚ƒ„„…„ƒƒ‚ƒ„„„„…†€€€€€€€€€€€€€€€€€…‹Œˆ†‡Š‰ŒŽ‰‚~ƒ‡‹‹‡„…†„ƒƒƒ‚‚‚‚~~~}}}||{{{zzz{{{zzyyyyxyyyyyy||||||||||||~‚€ƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒ„„„„„„…………†„„…††„}€‰ŒˆˆŒ‘‘‘’’Š~~}}~~}~}~}~}}}}}}}}}}}}}}}}}{{{{{{{{{{||}}}}„‰ŠŠˆ‡†‡„‚‚ƒ„ƒ‚‚‚ƒƒƒƒ‚‚ƒƒƒ‚ƒ‚ƒƒƒƒƒ„…†‡ˆ‰‰‰‰‰‰‰‰ˆˆ‡††„„„…†‡…‚€€€€€€~}~€€€€}}~€‚€‚‚ƒ‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒƒ„…ƒ€€€€ƒƒ„„„„„ƒƒ‚€€€€€€€€€€€€€€€€~xqnpsvwtuuvwwxxvwwy|‚ƒ‚‚ƒ„…†‡ˆƒ„†ˆ‰‰ˆ‡ˆˆ‡‡‡‡‡‡„„……†††‡††……„„ƒƒ€€€€~~~}~~€€€€€€€€€€€~}}}}}}}}~}||}}~€€€~{yyzutuvutw|~~~~~~}}~~~~~~~~~~€€‚ƒƒ‚‚€€€€€€~}|{{{|}|}~€€€€€~}~~}~~~~~}}}||{{{{||||}~~€€~}{|~}|||}}}~~~‚‚‚ƒƒ‚ƒ„„ƒ~€‚‚‚ƒƒƒƒƒ‚‚ƒ„‚€€‚ƒ€€€€€€ƒƒ‚‚‚‚ƒƒ‚‚ƒƒ„„…„ƒ‚‚‚ƒ………„„…€€€€€€€€€€€€€€€€}†ŽŠ†‡‹ˆŒŒ†|vvz„ˆˆƒ€€~~}}||{{{{zzzyyxxxwwwvvzzyyxxwwwwwxxxxy||||||||||||~‚€‚ƒ„ƒƒ„„ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„†………„„ƒƒ‚ƒƒƒ„„„„…„„…††„‚~{~†ˆ…‡Ž““’’“’‹„€}~}|€}~}~}~}~}}}}}}}}||{{zzzzzzzzzzzzzzzzzzzzz{{||}}}…‰‹Šˆ††‡…‚‚ƒ„ƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒ„…†‡ˆŠ‰‰‰‰‰‰‰ˆˆ‡‡……„„…†‡†ƒ€€€€€€~}€‚ƒƒƒ}}~€‚‚ƒƒƒ‚€€‚ƒƒ‚‚‚ƒƒ„‚‚‚‚ƒƒƒ„…ƒ€€€€€€€‚ƒƒ„„„„„ƒƒ€€€€€€€€€€€€€€€€}{yy{||{€{wuwzwy{|~€ƒ……„ƒ…ˆ‰‡„‡‡‡‡‡‡‡‡††††††††ƒƒƒƒƒƒƒƒ……††…ƒ‚‚}}~€€~~~~~€€€€€€€~~}~}}~~}||||}}~~~~~€~}€~{yyzxwvuuwz}~€€€€€~~€€€€€‚ƒƒ‚‚‚‚„‚€€€}‚ƒ}€~~€}|{{|||{}}~~€€€€€€€~~~~~€~~~}||{{{{{{{{{{{{|}~€€~||~~|||}~~‚‚ƒƒ€~€‚ƒ„ƒƒ‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒ‚‚‚ƒ„„ƒ‚€€‚‚€€€‚ƒƒƒ‚ƒ‚€‚‚‚ƒƒƒ„„………†…„„„…‡ˆ€€€€€€€€€€€€€€€€~~€‚€}„€~{ywvvyy{~zv{zyxxy{|yyyyyyyyyyyyyyyy{{{zzzyyyyyxwvvv{||}}||{{|zy|‚‚€‚ƒƒƒƒ„„„ƒƒ‚‚‚‚ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ„„„„…………††………„„„€„„„‰‘’‘‰€~~~~~~~~~~}zzzyzz{{yyyyzyxwxyyzzzyyyyzzz{{{z{|}}}||€…‰‰‰Šˆ…„‚ƒƒƒƒ„ƒƒƒƒ‚‚‚„„„ƒƒƒƒ‚ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰Š‰ˆ†…………ƒ„††…ƒ€~€€€€€€€€ƒƒ‚‚€‚‚‚‚‚‚‚‚‚ƒ„ƒ€‚€€€€‚€‚‚€~€‚ƒ„…„„„„„„„„€€€€€€€€€€€€€€€€|{{}€€}€€}yvwxxz{||~€‚…„„………ƒƒƒƒƒƒƒƒƒ„„„„„„„„‡‡‡‡‡‡‡‡‹‹Š‰‡…ƒ€~~~€~~~~€€€€€€€~~}}~~}~}}}}}~~~}~€~~€€|z{|yxvuux|€€€€€€€€€‚ƒƒ‚‚„‚€€€€€€€€€~~€}|z{|}||}}}~€€€€€€€€€€€~~~}||{{{{{{{{{{}}~€€€~||~~||}~~€‚‚ƒ‚‚€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚‚ƒ„ƒ‚€‚€€€‚ƒ„ƒ‚‚ƒƒ‚‚‚‚‚ƒƒƒ‚ƒƒ„…†‡‡……†‡‡‡‡‡€€€€€€€€€€€€€€€€{{}}z|~|ywvutwwx{}~}||{zyxyz{||||||||zzzzzzzzxwwwvvuuuuuvvwww{||}|||{{|{z}‚ƒ€€‚ƒƒƒƒ„„ƒƒƒƒ‚‚‚‚‚ƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„††……„„„„‚„„„‡‘’ˆ}||||{{{€€€€~}zyyyyzz{yxxyyzyxyyyzzzzz{{{{{{{|{{|}}}}|‚‡ŠŠ‰‰ˆ‡„ƒ‚„ƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰Š‰‡†…………ƒ„††…ƒ€~€€€€€€€€€€€‚ƒ„ƒ€‚€€€€‚€‚‚€€‚‚ƒ€€€€€€€€€€€€€€€€€€€€€€€€yz{‚‚€}‚ƒ|xvuyz{{{z|}‚„…†…„„„‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰‹‹‹Šˆ†„‚€~€~~~~€€€€€€~~}}}~€€~}~~~~~~}}}~~€~}€~|}yxuuvz‚€€‚‚‚‚€€€€€‚€€‚‚ƒƒ‚„‚€€€€€~~€|{zz|}}}||}}~€€€€€€€€~~~}}|{{{{{{{{{{~~€‚‚ƒ€~||~~}}~~€€€‚‚ƒƒƒ€€€‚‚„„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚‚‚‚ƒƒ€€‚‚€€€‚ƒ„„‚‚ƒƒ‚‚‚‚‚‚‚ƒƒ‚‚ƒ„†‡‰‰†‡‰Š‹Š‰ˆ€€€€€€€€€€€€€€€€zy{}|y{}|{ywutswwwwxy||{zxxxxyxxxxxxxxwvwvwvwwvvvuutttuuvwwxxy{|||}||{|}|{~ƒ„€‚ƒƒƒƒ„ƒƒƒƒƒƒ‚‚‚ƒƒ„„…„ƒ„ƒ„ƒ„ƒ‚‚‚ƒƒƒƒ„††………„„„‚……ƒ„‡ŠŽ‘‘‡€€€€€€€€€~}|yyyxyyzzyxxxzzzyyyyzz{{{||||||||{|}~~~}}„ˆŒŠˆ‡ˆˆ…ƒ‚ƒƒƒƒ‚‚ƒ‚ƒƒƒƒ‚‚ƒƒ„„„„ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰Š‰‡……„……ƒ„††…ƒ€~€€€€€€€€€€€€€€€€‚ƒ„ƒ€‚€€€€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€xwx{~€€~‚ƒ„ƒzurwyzzyyyz~‚…‡†‡‰‹ŠŠŠŠŠŠŠŠ‰‰‰‰‰‰‰‰††††††††„……†…„ƒƒ~€~~€~~~€€€~~}}€€~€€€~~}}}~€~~~€€€€zxuux}„‚‚ƒƒƒ‚‚€€€‚‚‚€‚‚ƒ‚€€€ƒƒ‚‚€€‚€€‚€~~€|{z{|}}}{||}~~~€€€€€~€€~~~}||{{{{{{{{{{}~~€‚‚€~||}~}~~€‚‚‚‚‚€€€‚„…ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚ƒƒ‚€‚€€€‚ƒ……ƒ‚ƒƒ‚‚ƒ…‡‰Š‹‰ŠŠŒŒŒ‹Š€€€€€€€€€€€€€€€€|z{~~{|||{zxvtsxyxwuux{zzyxwwvvttttttttvvvvvvvvyyyxxwwwzzzzyyyy{||}|||{}~}{~„…€‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒƒ„……„„„„„„„„‚‚ƒƒƒ„„„††……„„„„……‚ƒ‰Ž’‘‰„€}~~€‚ƒƒ€}}{zyxxxxyyzzyxyz{zzyyzz{{||}}||{{{{||}~~~~…‰Œ‹†…†ˆ†„‚‚ƒ„ƒƒ‚‚‚ƒƒƒƒ„ƒƒƒƒƒ„„„ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰‰ˆ†…„„„„ƒ„††…ƒ€~€€€€€€€€€€€€€€‚‚ƒ„ƒ€‚€€€€€€~~€€€€€€€€€€€€€€€€|ywx{‚‚‚ƒ„„|uqtvxyyxyyz~‚„…†ˆ‹„„„„„„„„ƒƒƒƒƒƒƒƒ„„„„„„„„‚ƒƒƒ‚~~€~€~~~€€€~~~~€€€€~€€€~~~~~€~}~€€‚zxuvyƒ…‚‚ƒƒ„ƒ‚‚‚€‚‚‚‚€‚‚‚€~~‚€€€€€€~~€|{zz|}}}{||}~~~€€€€€~€€~~}}|{{{{{{{{{{{||}~€€€~||~~}~~€‚‚‚€€€‚€‚„…ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒ„ƒ„ƒƒƒƒ€€‚‚€€‚‚…†ƒ‚ƒƒƒ‚ƒ…‡‰Š‹Š‰‰ˆ‰‰‹‹€€€€€€€€€€€€€€€€}yy}~||~yzzywusruwxxvuwxzzzzzxxwyyyyyyyy{{{{{{{{{{zzzyyyzzzzyyyy{|||}||{}~}{~„…€‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒ„„…„„„„„„„„ƒ„„„…………†…†……„„„€€„…‚Š”Š…||}~‚~~~~||{xxxxxxyy|{zy{{{{zzzzz{|}|{{{{zzz||}~~~~„‡‹‰†‚„‡‡…ƒ‚ƒ„ƒ‚‚‚‚‚ƒƒ„„„„„ƒƒƒƒƒƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰‰ˆ†„„ƒ„„ƒ„††…ƒ€~€€€€€‚‚€€€€€‚‚ƒƒ‚ƒ„ƒ€‚€€€€€€‚€~~}~~~~~~~~€€€€€€€€€€€€€€€€‚~zy|€„†‚‚‚‚}vrrtwyxxxyxz}€‚ƒ€€€€‚‚‚‚‚‚‚‚„„„…„…„„………„ƒ€~€€~~~€€€€€~‚€~€~€€€€€}~€~~~€€zwuw{€ƒ„ƒƒƒ„ƒƒ‚‚‚€€€‚‚€€€}||€‚€€‚‚€€€~~€}|z{{|||||}}~€€€€€€€~~~~~}||{{{{{{{{{{{{|}~€€~||~~}}~~€€€€€€ƒƒ„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ„„„…„„ƒƒƒ‚€‚€€€‚‚…†ƒ‚ƒƒƒƒ‚‚‚‚‚‚‚ƒ…†ˆ‰‰‡‡………†ˆ‰€€€€€€€€€€€€€€€€{wwz|{z{wwxxwtrppsvxxxxx{||}}}{{||{|{|{|z{z{z{zzyyyxxwwwstuvxyzz{||}|||{|}|{~ƒ„€‚ƒƒƒƒ‚ƒƒƒƒƒƒ„‚‚ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„„„„………††††……„„„„‚ƒ…ƒ‚ƒ’”ˆƒ€~~}|xxxxxyyz}|z{{}}}{{zzz{||zzzzzzzz{|}~~~}}„†‰Š†ƒƒ†‡†ƒƒƒ„ƒ‚‚ƒ‚ƒƒƒƒƒ„„„„ƒƒ‚‚ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰ˆ‡†„ƒƒƒ„ƒ„††…ƒ€~€€‚‚€‚‚‚€€€‚‚‚‚‚‚ƒ„ƒ€‚€€€€€€€€‚‚€€€€€€€€€€€€€€€€€‚|{}€‚ƒ€€€€}xsqtwyyxxxuuwz~€€€‚‚ƒ‚ƒ‚ƒ‚„„„„„„„„„„„„„„„„…………„‚€~~~€€~~~€€€€€~€€€€€€€€€€€~€€€€€€~~€~}€€~}€ywvx}‚‚ƒƒƒƒƒ‚‚€€€€€€€€}|{{}~€‚€€‚‚‚€€~~€~}{{{|{z}}}~€€€€€€€€€€~~~~~~}}|{{{{{{{{{{||}~€€€~||~~||}~~€€~}~~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒ„„„ƒƒ‚ƒ‚€€‚‚€€€‚„†ƒ€‚ƒƒƒƒ‚‚‚‚‚‚‚ƒ„…†‡‡…………††‡‡€€€€€€€€€€€€€€€€|xv{}|{{yz{{zxusrstwyyxwwxz|}||{yyyyyyyywwwwwwwwxxxwwvvvrstuwxyz{|||}||{{|{z}‚ƒ€€‚ƒƒƒƒ‚‚ƒƒƒƒ„„„ƒƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„„……††………„„„ƒ}„„„…’“†‚€€€€€€€€~}|{yxxxxyyz|{z{}€€|{zyyz{{zzzzzzzz{{|}}}}|„…ˆŠ‰…„…ˆ†„ƒ„„ƒ‚ƒƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰ˆ‡…„ƒ‚ƒƒƒ„††…ƒ€~€€‚‚ƒ€€‚‚€€€‚€‚ƒ„ƒ€‚€€€€€€€€€ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€}{{}~}~~}yuruxyxwwwrrtyƒ„ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€‚ƒƒƒƒ‚€~}}‚€~~~€€€€€~~€€€€€€€~}~€€‚‚}~€~~€€~}}ywvy~€ƒƒƒƒƒ‚€€€€€€€€€€€}{zz{}€€€‚€‚‚€€~~€~|{{{zz}}~~€€€€€€€~€€~~~}||{{{{{{{{{{~~€‚‚€~||~~|||}~~€~}|}~~~€ƒ„ƒ‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚ƒƒ„ƒƒ‚ƒ‚€€‚‚€€€‚€„†ƒ€€‚ƒ‚‚‚ƒƒƒ„„…………†‡‰‰ˆ‡‡€€€€€€€€€€€€€€€€zy}€}~}~€€}zxvuuvxyvtrtvyzzyyyyyyyyyyxxxxxxxxyyxxwwwvwwwwxxxx{||}}||{{|zy|‚‚€‚ƒƒƒƒ‚‚‚ƒƒ„„„„„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒ„„††……„„„„„}€„…†‡’‘‹…ƒ‚‚€€€€€€€~|{yxyyxxyyzz{zz{~€‚ƒ}|zyyyz{yzzzz{{{z{|}}}||„…ˆŒ‹‡……ˆ†„ƒ„„ƒ‚„„ƒƒƒ‚‚‚‚ƒƒƒƒ„„„ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰ˆ‡…„ƒ‚ƒƒƒ„††…ƒ€~€€‚ƒƒ~€‚‚ƒ€€€€€‚‚‚‚‚‚‚‚‚ƒ„ƒ€‚€€€€€€€‚‚‚‚€€€€€€€€€€€€€€€€{z{|~}€€€€{||{zyxwutuvy}„‚‚‚ƒ„‚ƒƒƒƒƒ‚ƒƒƒƒƒ‚‚‚ƒƒ„„„ƒ‚‚€„ƒ„……„‚}€€€~~~€€€~~€€}}}}~~€€€€~~~~€‚‚€}{{zvwƒ‚€€€‚ƒƒƒƒ‚€€€€€€€~‚}zyz~€€‚‚€€€~~~}}}|||||z{|}~€€€€€€}~~~}}}}}}}}{{{{{{{{|}~€€€€~{z|~~~~}||~~|~~~~~~~~‚ƒ„…‚ƒƒƒƒ‚‚ƒ„„‚‚ƒƒ‚€‚ƒƒƒ‚‚‚‚‚€€€€€‚„„‚‚ƒ‚ƒ‚‚‚ƒ‚‚ƒ†‰ŠŠˆ††ˆ‰ˆŠ‰…€€€€€€€€€€€€€€€€{ywwy{||{zyxxyyy{zzzzyyyxvtuwyyxwxyyyyxwwwwwwwwwwwwwwwwwwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚‚‚‚ƒƒ„„„††…„„ƒ‚‚ƒƒƒ„„„„„‚‚‚‚ƒƒ„…………„„ƒƒƒ‚€~‚…‡‡”’‰‚€€€~~}~~~~}|yyxxwwwxz{{{ƒ……}zzzzyy{{{zzzzzz{||}}||€…‹Œ‰†…Š‰‡„ƒƒƒƒƒƒ‚‚‚„„…„ƒ‚‚ƒ††††††††ŠŠŠŠŠŠŠŠˆ‡†„ƒƒƒ„‚…ˆ‡ƒ|{~~ƒƒ~€€€€€€€‚‚‚‚‚‚‚‚ƒƒ‚€‚‚‚‚‚‚ƒ‚€‚‚‚€€~€€€€€€€€€€€€€€€€€€€€€{zyz{}}}€€€€€€€€~~~~|{zyvvvwz}€‚‚ƒ‚‚‚ƒ‚ƒƒƒƒƒ‚ƒƒƒƒƒƒ‚‚ƒƒ„„ƒƒ‚‚€€„„„……„‚}€€€~~~€€~€€‚€~€€€€€~~~~~€‚‚€}||{wx„‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚€|zz{~€‚‚€€‚‚€€€~~}}}}||||z{|}~€€€€€€~~~~~}}}}}}}}{{{{{{{{|}~€€€€€~{{|~~~}|}~}|~~~~~~~~‚ƒ„…ƒƒ„„„ƒƒ‚ƒ…„ƒ‚„ƒ‚‚‚ƒƒƒƒ‚‚‚‚‚€€€‚‚‚„…ƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ†‰ŠŠˆ‹‰‰ˆ‡ˆˆ…€€€€€€€€€€€€€€€€}{xxy{||zyxxwxxxzzzzzzzzyxvwyzzyvwwxxxwvwwwwwwwwwwwwwwwwvvvvwxyy{}~|{{ywwvttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ………„„ƒƒƒ‚‚‚‚ƒƒƒƒ‚‚‚‚ƒƒ„……………„„„„ƒ‚…‡‡”‘ˆ‚€€ƒ‚€~~}€€€€~}zyxwwxyyz{{|~ƒƒ‚|{yxyyyx{{{{{{{{z{{}}}||~ƒˆ‹Šˆ…„Š‰‡…„ƒ‚ƒƒƒƒƒƒ‚‚‚ƒ„„„ƒ‚ƒƒ††††††††‰‰‰‰‰‰‰‰ˆ‡…„ƒƒƒ„ƒ…‡‡ƒ||~}~€}€€€€€€€€‚‚‚‚‚‚€‚ƒƒ‚€‚€‚€‚‚ƒ‚€€‚‚€€€€~€€€€€€€€€€€€€€€€€€€€€€€€|yxz{}}€€€€€€€€€€€}|{xxxxz|€ƒƒƒ‚€‚‚‚ƒƒƒƒ‚ƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚€~„„…††„‚~€€€~~~~€€€€€€‚‚‚‚€€€€€€€€~~~~~}}}}€‚‚€}||{xyƒ‚ƒƒ„ƒ„ƒ‚‚‚‚‚€€€€€|z{}€‚‚‚€‚‚‚€€€~~~~}}||{z{|}~€€€€€€€€€~~~}}}}}}}}||||||||||~€€€€€}{{}~~}~}}}~~~}‚ƒ„…„„„„„„ƒƒ„……ƒƒ„„ƒƒ‚‚‚‚ƒƒ„‚‚‚‚€‚‚ƒ……‚€‚‚‚‚ƒ‚‚‚‚‚ƒ…‰ŠŠˆ‹ŠŠ‰ˆ‹‹ˆ€€€€€€€€€€€€€€€€~|yxzz{{zzyxwwxxyyzz{{||{yxxz{{zwwxxxwwwwwwwwwwwwwwwwwwwwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ„„„„„„„„‚‚‚‚ƒ‚‚‚ƒƒ„„……………„„„ƒ‚…†‡Œ‘‡‚€€€€~|{z|zyxxy{|y{{|~~{zyyyzyyzz{{{{||z{||}||||†‰ˆ†„„‰ˆ‡…„„„„ƒƒƒƒƒƒ‚‚‚ƒ„ƒƒƒ„„††††††††ˆˆˆˆˆˆˆˆˆ‡†„„ƒƒ„ƒ…‡†‚}|€€€~|~~~~~~~~€€€€€€€€€€‚‚‚‚€€‚ƒƒ‚€‚€€€€‚ƒ‚€€‚€€€~€€~~€€€€€€€€€€€€€€€€ƒ{yz}€~~}}||}~~~~}|{zzz{|~~‚ƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒƒ‚‚€€„„…††…‚€~€€€~~~~€€€€€‚‚‚€€€€€~~}}}}||}‚‚€}|||zz~€€€‚ƒƒƒ‚‚€€€€€€€|{}€€‚‚€€€€~~||{{z{|}~€€€€€€€€€€~~}~~}}}}}}}}|||||||||}~€€€€}{|}~||}|~~€€€€€€€€‚ƒ„…„„„„„„ƒƒ„……„ƒ……„„ƒ‚‚‚ƒ„…‚‚‚‚€‚‚ƒƒ……ƒ€€€‚ƒƒƒ‚‚‚‚ƒ†‰‹Šˆ‰‰‹ŒŒŽŽŠ€€€€€€€€€€€€€€€€~|yxxyyy{{zxxxxxxxyz{|}~{zyyyz{{xxxyxyxxwwwwwwwwwwwwwwwvvvvwwxyy{}~|{{ywwvttvz~€‚ƒƒƒ‚„„„ƒƒ‚‚‚‚ƒƒƒ„„„„‚‚‚‚‚ƒƒ‚‚ƒƒ„„………………„…„‚…††ŠŽ‹…‚€‚~€‚ƒ~~}{yxzywvvxz{yz{|}~{{zzz{{{{yzzzz{{{z{{}|}|||€…ˆ‡†……‡†…„ƒ„„„ƒƒƒƒƒƒƒƒ‚ƒ„ƒƒ„…††††††††‡‡‡ˆ‡ˆ‡‡ˆ‡…„ƒƒƒ„„†‡…‚~}}€~}}}}}}}}}€€€€€€€€€€‚€€‚ƒƒ‚€‚€€€‚ƒ‚€€‚€€€€~€~~~~~~}}€€€€€€€€€€€€€€€€„€{xz|~}}{zyxxzz||~}}}|||{||}}ƒ‚‚‚ƒ‚‚‚‚‚ƒƒƒƒƒƒƒ„ƒ„ƒƒƒ„„„ƒ‚‚€~„……††…ƒ€~€€€~~~~~~€€€€€€€€€~€€}}}}}||||‚€~}}|{{}~~~€€‚‚‚‚‚‚€€€€€~~€||~€ƒ‚‚€‚‚‚€€€~}||{z{|}~€€€€€€€~~~~}}}}}}}}||||||||||~€€€€~}|}~{{{}}€‚€€€€€€€€‚ƒ„…ƒƒ„„„ƒƒ‚„……„„……„„ƒ‚‚‚ƒ„…‚‚‚‚€‚‚ƒ……‚€€€‚‚ƒƒ‚‚‚‚ƒ…‰ŠŠˆŠŠ‹Œ‹Œˆ€€€€€€€€€€€€€€€€}zxvwxyx{zywwvvwwxxz{|}~zzzyxyzzxxxxxxxxwwwwwwwwwwwwvvvvwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚„„„ƒƒ‚‚‚‚‚‚ƒƒ„„„‚‚ƒƒƒƒ„„ƒƒƒ‚ƒƒ„„„„…„…„……„‚‚„……†ˆ†‚ƒ‚‚†„‚~~€~|{zyxwwxz{yz{{}~}zyyzzzzzzyyyyzzzzz{||}||||€…‡ˆ‡ˆˆ…„„‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚ƒƒƒƒ……††††††††‡‡‡‡‡‡‡‡ˆ‡†„„ƒ„„…†‡…~}~‚‚€~~}}}}}}}}€€€€€€€€€€€€€€€€€‚ƒƒ‚€‚€€€‚ƒ‚€‚‚€€€~€€~~~~~}}}€€€€€€€€€€€€€€€€~yxy|€~~}|{zyyz{|}~~~~}}}}}}}}€‚ƒ‚‚‚ƒ‚‚‚‚‚ƒƒ„ƒƒƒ„ƒ„„„ƒƒƒ„ƒƒ‚‚€€„…†‡‡†ƒ€€€~~~€€€€€€€€€€~~~€}~}}|}|||~‚€~}~}|}}~~~|}~€‚‚‚ƒƒƒ‚‚‚‚‚€€€‚€~}„ƒ‚ƒƒ‚€€€}|{{z{|}~€€€€€€€~~~~}}}}}}}}|||||||||}~€€€€€}}|~}{z|}~~€ƒ€€€€€€€€‚ƒ„…ƒƒ„„ƒƒ‚‚ƒ……„„……„ƒ‚‚‚‚ƒƒ„‚‚‚‚€€€€€‚‚„„‚€€€‚‚ƒƒƒ‚‚ƒ†‰‹Šˆ‰ˆˆˆˆ‹Œ‰€€€€€€€€€€€€€€€€|zwwwyyyzywvuuuuwwxyz{|}z{{zxxy{xxwwwwwxwwwwwwwwwwwwvvvvvvvwwxyy{}~|{{ywwvttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒ„„ƒƒ„„„„……ƒƒƒ‚ƒƒƒ„ƒ„ƒ„„„„„…‚€€‚„……ƒ„ƒƒ‚ƒ…„‚€€€~}|zzyyxxyyyzzz{}|zwxyyyxxyzzyzyzyzz{{}}}||{„‡‡ˆˆ‰†…„ƒ‚‚‚ƒƒƒƒƒƒ‚ƒ„ƒƒ„…††††††††‡‡‡‡‡‡‡‡ˆ‡…„ƒƒƒ„†††„€~~~€€€~}}~~~~~~~~~€€€€€€€€€€€€€€€€‚‚ƒƒ‚€‚€€€€‚ƒ‚€‚‚‚€€€€~€€~~~~~€€€€€€€€€€€€€€€€}zy{}€€€€€€€}}}~~}}}€‚ƒƒƒ‚‚‚ƒ‚‚‚‚‚ƒ„ƒƒƒƒ„„„„ƒƒ„„„ƒ‚‚€~„…†‡‡†ƒ€€€~~€€€€€€€€€€€€€€~~~€€~~~}}}}|{~‚€~~~~~€}}€‚‚€€€€€€€€~€‚‚~€€ƒ‚‚‚€€€€€~|{{z{|}~€€€€~}}}}}}}}}}}}}}}}}}||~€€€€}|}~€}z|}~~€‚€€€€€€€€‚ƒ„…„„„„„„ƒƒƒ„…ƒ„……„‚‚ƒƒƒƒ‚‚‚‚‚€€ƒ„€€‚‚ƒƒ‚‚ƒ…‰ŠŠˆ‰ˆˆˆˆŠ‹ˆ€€€€€€€€€€€€€€€€|zxwy{||{{yxwvvvvwwxyz{{||}{yyz|xwwvwwxxwwwwwwwwwwwwvvuuwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒ„„„„……„ƒƒƒ‚ƒƒƒ‚‚ƒƒƒƒ„„…ƒ€€‚„……ƒ‚ƒƒ‚~}|zz{zzxwvzzzyz}}{z|}}|{{{|{{{zzzzz{||}|||z}„…†ˆ‰Šˆ‡…ƒ‚‚‚‚‚‚ƒƒƒƒƒ‚ƒ„ƒƒƒ„…††††††††ˆˆˆ‡ˆ‡ˆˆˆ‡†„ƒƒƒ„†‡†ƒ€}~€~}~€€€€€€€€€€€€€€‚‚‚‚‚ƒƒ‚€‚€‚€‚‚ƒ‚€€‚‚€€€€€~€€€~€€€€€€€€€€€€€€€€}{{}€‚‚‚‚ƒ„„……………„ƒ‚€}}}~~~~}‚ƒ„‚ƒ‚‚‚‚ƒ„ƒƒƒ„„„„„ƒƒ„„ƒƒ‚‚€€„††‡‡†„€€€~~€€‚€€€€€€€~~~~€€~~~~}}}}{~‚€~~~€€€€‚~~~}}}||{{|||}}}}€ƒƒ€€}|{|~€€€‚‚ƒƒ€€€€‚€~|{{z{|}~€€€€€~}|}}}}}}}}}}}}}}}}|}~€€€€}||~€€}z}€€~}€‚ƒ„…………………„„ƒ„„ƒƒ……„€‚ƒƒƒ‚‚‚‚‚~~€€€‚ƒ€‚‚‚ƒ„‚‚ƒ†‰ŠŠˆ‹‹Œ‹ŠŠ‰…€€€€€€€€€€€€€€€€}{yy{}~~~|{zyyywwwxxyyz}~~}zz{}yyxwwxyywwwwwwwwwwwvvvuuvvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚‚‚‚ƒƒ„„„ƒƒƒƒƒ‚‚‚ƒƒƒƒ„„„„„ƒƒƒ‚ƒƒƒ‚‚‚‚ƒƒƒ„…ƒ€€‚„„„ƒ‚~ƒƒ€‚‚‚‚‚€€‚‚€€‚‚ƒƒ‚€}|zzyxz}~}‚‚€}}||{{zzz{||}}||x{‚ƒ„†ˆŒ‰‡…„ƒƒ‚‚‚ƒƒƒƒƒ‚ƒ„„ƒƒƒ„††††††††ˆˆˆˆˆˆˆˆˆ‡…„ƒƒƒ„†‡†ƒ}~€‚~€€€€€€€€€€€€€ƒƒƒ‚‚€€‚ƒƒ‚€‚‚‚‚‚‚ƒ‚€€‚€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}|}}~€‚‚‚‚ƒ„‚‚‚ƒƒƒ„„„ƒƒƒƒƒ„…„ƒƒƒƒƒƒ‚€~€€€‚†††‡‡†„‚‚€~~~~€€€€€€€€€€~~~~}}~~~~}~~€€€€€€€~~~~~~~xxy|~}zwxyz||}}}~€‚|{{}}}}}}}|||}~€‚‚‚‚‚‚€€€€~~}||}}}~~~€€€€€€€€~}}}||||||||{|||}}}~€€€€€|{~€~}~~~~~~~~~‚€€ƒ„‚€ƒ…†„„………………ƒƒƒ„„„„„ƒƒ‚‚‚‚ƒƒ‚‚€€‚‚€€€‚ƒ„…ƒ‚ƒƒ‚‚‚‚‚‚„†ˆ‰‰‰ŠŒŽŽ‹‰‰Š€€€€€€€€€€€€€€€€~~~~}}}}||}|}||||||||||||||}|{{zzxxxyyxwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvutstvy}€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚…€€‚‚‚„…†‡‡‡†…††…„‚€}{z{~€‚‚…„‚€€€~}}||{z{{||{zz{{|~€ƒ…‡††…„„ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚ƒƒ„„„……††‡‡‡‡…‡‰ˆ…„†ˆ††………„„„„††~€€~~}|}}~‚‚€~}€€€€€€€€€‚‚‚€‚„…‚€€‚‚‚€€€~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}}}~~‚ƒ‚‚‚ƒ‚‚‚ƒƒƒƒƒƒƒ‚‚‚ƒ„„„ƒ‚‚ƒƒ‚‚€€€€‚††‡‡‡†„‚‚€~~~~€€€€€€€€€€~~~~~~~~}~€€€€€€~~€€~~~~{zz|}}zxyz{|}}||}~~~{zyz}~~€‚‚‚‚€€€€~~€€€€}}}~~~~~€€€€€~~}||||||||{|||}}}~€€€€€|{~€~}~~~~~~~~~€€‚ƒ‚ƒ…†„„………………ƒƒƒ„„„„„ƒƒ‚‚‚‚ƒƒ‚‚€€‚‚€€€€‚‚„…ƒ‚‚‚‚‚‚‚‚„…ˆ‰ŠŠ‹‹ŠŠ‹ŒŒŠˆ€€€€€€€€€€€€€€€€~~~~}}}}|||||||||||||||||||||{zzyyxxxyxwxxxwwwwwwvvvwwwvvvvvvwxxz||||}zvutstvy}€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚„€€‚‚‚ƒ„…†††…………„ƒ‚€~}}‚………€€€‚ƒ€€€€~~}|{{{}~ƒ„……„„ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„………††‡‡‡…‡ˆˆ……†ˆ††……„„„„„††~€€€€€€€€€€~}|||}}~‚€~~€€€€€€€€€€€€€€€€€€‚„…‚€€‚‚‚€€€€€~~€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}~€‚‚ƒ‚‚‚ƒƒƒƒƒ‚ƒ‚ƒƒƒ‚ƒƒ„„„ƒ‚‚ƒƒ‚€€€‚…††‡‡†„‚‚€~~~€€€€€€€€€~~~}~~~~~~€€€€€€€€€€€~~~~}||}}{z{||}}}||z{{{zz|~€€‚‚ƒƒ„ƒƒ‚€€~~~~}€€€€€€}}~~~~~€€€~~||}|}|}|{{||}}}}€€€€€|{~€~}~~~~~~~~~€‚‚‚ƒ…†„„„……………ƒƒ„„„„„„ƒƒƒ‚‚‚ƒƒ‚‚€€‚‚€€€€€‚ƒ„ƒ‚‚‚‚‚ƒ…‡‰‰ŠŠ‹‰‰‹Ž‹ˆ€€€€€€€€€€€€€€€€~~~}}}|{{{{{{{{||||||||{||||{zzyxxxxxxwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvutttvz}€€‚ƒƒƒƒ‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚„‚‚‚ƒ„…………ƒƒƒƒ‚‚‚‚„…„ƒ€€€€€€€€€€€‚‚‚€}|zzz{|~€ƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ„„…………††‡‡…‡ˆ‡†…†ˆ………„„„„„„††~€€€€€€€€€€}}|{{{|}€€~€€€€€€€€€€€€€‚€€€‚„…€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}~€€‚‚‚‚‚‚‚‚„„ƒƒ‚‚‚‚ƒƒƒ„ƒ„„„„„‚ƒƒ„ƒ‚€€…†‡‡ˆ†„‚€~~€€€€€€€€€€}~~~~~€€€€€€€€€€€€€~~€~}}}||}}~~~}||yz{||‚…€€€€€€€€€€€€€€€€€‚‚~~~€~€€€€~~}}}}}}}}{||}|}}~€€€€€|{~€~}~~~~~~~~~}‚ƒ‚€‚‚„„…ƒ„„…………„„„„„„„„„ƒƒ‚ƒ‚ƒƒƒ‚‚€€‚‚€€€€€ƒ„‚€‚ƒ‚‚€‚„†‡‡‡‡ˆ‰ŠŠ‰‰ˆ€€€€€€€€€€€€€€€€~~}}||z{z{z{z{||||||||{{|||{zyxxxxxxwwxxxwwwwwwvvvwwvvvvvvvwxxz||||}zvuuttvz~€€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒ„„ƒ„ƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„ƒ€€‚ƒ„……‚‚‚‚‚‚‚‚„ƒ‚ƒƒ~{€€€€€€€€‚‚‚}{zyyyyz|}~‚‚‚ƒ‚ƒƒƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„„…………††‡†‡‡‡†††‡……„…„„ƒƒ„††~€€}}{{z{{|~€€€€€€€€€€€€€€€€€€‚€€€‚‚……‚€€€‚‚€€‚€€€€€€€€ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€~~}}}}}}}~€‚‚ƒƒƒ„ƒƒƒƒ‚‚‚„„„„……………„„ƒ„„„ƒ€€€…††‡‡†„‚€~€€€€€€€€€}}~~~~~€€€€€€€€€€€€€€€€‚€}}}~~~~~}|}~}~ƒ…€€€€€€€€€€€€‚€€€€€€~~~€€€€€€€~~~~}}}}}}}}{{||}}}}€€€€€|{~€~}~}~€‚‚€€€‚‚ƒ„„„ƒƒ„………„„„„„„„„„„„ƒƒ‚ƒƒƒ„‚‚€€‚‚€€€€€€ƒ„‚€‚‚ƒ‚€‚„†‡‡‡„†ˆˆ†……†€€€€€€€€€€€€€€€€€~}||{{z{z{z{z||||||||{{{|{zyyxxxxxwwwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvvutuwz~€€‚ƒƒƒƒ‚‚ƒ‚ƒƒƒƒ„„„ƒƒƒƒ‚„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„~ƒ~€‚ƒ„„‚‚‚‚ƒƒ‚‚‚‚|z{|}~€‚ƒƒƒ„‚‚‚}{zyyyyz{}~‚‚‚‚ƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ„„„„…………††‡†††‡‡‡†…„„„„ƒƒƒ„††~€€~}|{{z{{|}€€€€€€€€€€€€€‚€€€‚‚„…€€€‚€‚€€€€€€€€€€€ƒ‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}}}}}}~€‚ƒƒƒƒƒƒƒƒ‚ƒ‚‚ƒ„„…………„…„ƒ„„„ƒƒ€€„†‡‡ˆ†„‚€€~~€~€€€€€€€€~~~|}~~€€€€€€€€€€€€~~~€€€€€€||}~€‚ƒƒ……„ƒ‚€€€€€}~~~~€€€€€~~~~~~~}~}~}~{||||}}~€€€€€|{~€~}~~~€€€€‚ƒ„„„„ƒƒ„„…„„„„„„„„„ƒƒ„„ƒƒƒƒƒ„‚‚€€‚‚€€€€ƒ„ƒ‚‚‚‚‚ƒ„‡ˆŠŠŠ‡ˆ‰‰‰ˆ‡†€€€€€€€€€€€€€€€€€€~}|{{{{{{{{{{||||||||z{{{{zyywxxxwwwwxxxwwwwwwvvvwwwvvvvvvwxxz||||}zvvuuuw{~€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††„~€‚‚‚‚€€‚ƒ„‚‚‚‚€€‚‚||}~~~~~{|}€‚ƒ„‚‚‚€}|yyyz{}€ƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„„„„…………†ˆ†…†‡ˆ‡…„„„„ƒƒƒƒ„††~€€€€€€€€€€~}|{{{{{|}€€€€€€€€€€€€€€‚‚……‚€€€‚€‚€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}}}}~€‚ƒ‚ƒƒƒ‚‚‚ƒƒƒƒƒƒ‚ƒ„„„„„ƒ„ƒƒ‚ƒƒƒ‚€€€€~„††‡‡†„‚€~~€€~~€€€€€€€€~~~~|}~~~~€€€€€€€€‚‚€€€€}‚‚€~~~~€€}{{{}~~€‚„„ƒƒƒ‚‚‚‚‚€€€‚‚€~}|}}}}~~~~€€€~~~~~~~~~~{|||}}}}€€€€€|{~€~}~~~€€‚ƒ…„„ƒƒƒ„„„„„„„„„„„ƒƒƒ„„ƒƒƒƒ„„‚‚€€‚‚€„…ƒ‚‚‚‚‚‚‚‚ƒ†‡‰Š‹‹‰‰Š‹‹‹Š‰€€€€€€€€€€€€€€€€€~}{{z||||||||||||||||zz{{{zyxwxyxwvwwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvvvuuw{~€‚ƒƒƒƒ‚‚‚‚ƒƒƒƒ…„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††„~~€‚‚‚‚€€€€€‚ƒ‚‚€~ƒƒƒ‚€}|z{{{||}}~~}|yyz{}ƒ……„„ƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ„„ƒƒ„„…………ˆ†……ˆˆ‡…„„„ƒƒƒƒ‚„††~€€€€€€€€€€€~||{{|z{}€€€€€€€€€€€€€€€€€‚„…‚€€€‚ƒ€€€€€€€€€~~€€~€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}}}}~€‚ƒƒ‚‚‚ƒ‚‚‚‚ƒƒƒƒ„‚‚ƒƒƒ‚‚ƒ‚‚‚‚‚‚€€€„††‡‡†„‚€~~€€~~~€€€€€€}}~~~~|}~~~€€€€€€‚‚‚€€€{~‚ƒ~}~‚‚‚‚|~€~}}}}}}}}||~~€‚ƒ„„…„„„ƒƒƒ‚ƒ‚€~|{z||}}}~~~~~€€€€€€~~~~~~~~{|||}}}~€€€€€|{~€~}~€~}}‚€‚„…„ƒƒƒƒ„„„„„„„„„„„ƒƒƒ„„ƒƒƒƒ„„‚‚€€‚‚€„…ƒ‚ƒƒ‚‚‚‚‚‚„†ˆ‰‰‰†‡ˆŠŠŠŠ‰€€€€€€€€€€€€€€€€€~}|zz|||}|}||||||||||zz{{{zyxwxxxwvwxxxxwwwwwwvvvwwwvvvvvvwxxz|}|}}zvwvuux{€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒ……„„ƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††„~~€‚‚‚‚€€‚€€‚‚‚‚‚€€}}‚‚‚ƒ„……„ƒ‚‚€~|zxxz{{||{zzyyz|~ƒ…††……„ƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„ƒƒ„„„………ˆ†„…ˆ‰‡…„„„ƒƒƒ‚‚„††~€€€~}||||yz|~€€€€€€€€€€€€€€€€€€‚‚‚€‚„…‚€€€‚ƒ€€€€€€€€~~}~‚€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}~€€€}{{z{{{}€‚‚‚ƒƒƒ‚‚‚ƒƒ‚ƒƒƒ„ƒƒ‚‚„…†…„ƒƒ„„ƒƒ„„ƒ‚‚€€€€ƒ‰ˆ‡…ƒ€~~~€€€€~~~~~‚€~}}~~~~~~~~~~~~€€€€€‚‚‚‚€}}~~€~~~€€~}|||~~~|||~~}~~€‚‚€€€~|zy{|}~€€€€€}~€€€€~~~~}|}}}}~~~~~~€€€~}}€}~~~€€€ƒ~~ƒ†ƒ‚„ƒƒƒ„„……†…„„„„„„„ƒƒ„…†………ƒ€€€€„…ƒ‚€ƒƒƒƒ‚‚‚‚€ƒ„„„ƒ†„ƒƒ„……„€€€€€€€€€€€€€€€€€€~}}|}}}}}}}}}}{{|{|{|{yyxxxxxxyxxwwwwwxxwwwwwwvwwxxwvuwvuvwwxzz}~}}|zxuttvy}€‚‚‚‚ƒ„„ƒ‚‚‚„„„„„„„„‚‚ƒƒ„„ƒ„ƒ‚‚„ƒƒ„……„ƒƒƒ……„€ƒƒƒ‚‚€€€€€€€€‚ƒ……ƒ€€€€€€‚‚‚ƒƒ„„ƒƒ‚}~~~~}|{zzz{~…‡†††…„„ƒƒƒƒƒƒƒƒƒƒ„ƒƒ‚ƒƒ„…„„„„„„……††††††††„ƒ„ƒ„ƒ„ƒ‡†„€||‚€~~€€~}|{~}||}ƒ€€€€€€~~€€‚€€€‚ƒ€‚ƒ‚€‚‚€‚€€€€€€€‚‚‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€€€€~~}~~~~~}|{{{|}~€ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒƒ‚‚‚„……„ƒƒƒ„„ƒƒ„„ƒ‚‚€€€€ƒˆ‡†„‚€~~~~~~€€~~~~~~~~~~~€€€€€€‚€~~~~~~~~€€€€€€€€€€}~~~}|}}|}|}}}}~~€‚€€€~|zz{|}€€€~€€€€€€~~~~}}}}}}~~~~~€€€€~}}€}~~~€€€~~€ƒ~ƒ†…ƒ„„„„ƒƒƒ„„…„„„„„……ƒ‚‚ƒ„„„„…ƒ€€€€„…ƒ‚€‚ƒ„ƒ‚‚ƒ€‚ƒ„„„„…„„„……„„€€€€€€€€€€€€€€€€€~}|||}|}|}|}|}{{{{{{{{yyxxxxxxxxwwwwwwxxwwvwwwvwwxwwvuwvuwwwxzz}~}}}{xvvuwz~€€‚‚ƒ‚‚ƒ„„„‚‚‚„„„„„„„„‚‚‚ƒƒƒƒƒƒ„ƒ‚‚ƒƒƒ„……„ƒƒƒ……„€ƒƒƒ‚‚€€€€€€€€ƒ……ƒ‚‚ƒƒƒ……„ƒƒƒƒƒ€~}|zzz{~…‡………„ƒƒƒ‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚ƒƒ„„„ƒƒ„„……††…†…†…†ƒ„ƒ„ƒ„ƒ„††„€}}‚€~€€€€~}||||{{|~€€€€€€€€€‚€€€ƒƒ€‚‚‚€‚‚€‚€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€€€€~~~~}}}~}}|||}}€‚ƒƒƒƒ‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚‚‚ƒƒ„ƒ‚‚ƒ„„„ƒƒ„„ƒ‚‚€€€€ƒ††„ƒ€~~~~~~~~€€€€€~~~~€€€€€€€€€€~~~~~~~~~~ƒ‚‚‚€€‚€~~}{~}|{{{}}|}}~€€€€€~|{z||~~€~~}€€€€€~~~}}~}}}}~~€€€€€~}}€}~~~€€~}}~~~‚†…†‡……„ƒƒƒƒƒ„„ƒ„„……†‚‚‚ƒ„„ƒ„ƒ€€€€€„…ƒ‚€‚ƒƒ‚‚„€‚ƒ…„…„…„……‡†…„€€€€€€€€€€€€€€€€€~|||||||||||||{{{{{{{{yyxxxxxxyxxwwwwwxxwwwwwwwwwwwwvvwvvwwwwyz|~}}|{xxwwy|€€€‚‚ƒƒƒƒƒ„„ƒ‚‚‚‚„„„„„„„„„ƒƒƒƒƒƒ‚‚ƒ‚‚‚ƒƒƒ„……„ƒƒƒ……„€ƒƒ‚‚‚‚€€‚„…„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ„„………„„„„„„ƒ}|zzz{}„†„„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚ƒƒ„ƒƒƒƒ„„…………„…„……„ƒ„ƒ„ƒ„ƒ†…„€~|€~~}}}|{{{|}€€€€€€€€€‚€€€€ƒ„€‚€‚‚€‚€€€‚€€€€€€€‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€€€}}||}}}}}~~€€‚ƒƒƒƒ€‚„ƒƒ‚‚‚ƒ‚‚‚‚ƒƒƒ‚‚ƒ…„„ƒƒ„„ƒ‚‚€€€€ƒ„„ƒ‚€~~~€}}~~€€~~~€€€€€€€€~~~€€€€€€€€‚€€~~}}~~~~~~~~ƒ‚‚€€€}~~~|{~}||{||}{||}~€€€€~}{z|}}€€€€}|~~~~~€}}}}}}~~€€€€€~}}€}~~~€€~}|||~~~€‚…†‡„„ƒƒƒƒƒƒ„„„„„„……ƒ‚‚ƒ„……„„‚€€€€€€€„…ƒ‚€‚‚‚ƒƒƒ‚ƒ……†……„……‡‡‡…„€€€€€€€€€€€€€€€€~}|{{{{{{{{{{{{zzzzzzzzyyxxwxxxxxwwwwwxxxwwvwwxwwwwwwvvwvvwxwwxz|}}|}{yzyy{~€€€‚ƒƒ„„„ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒ…„„„ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒ„……„ƒƒƒ……„€‚‚‚‚‚‚‚‚€€‚ƒ„„„‚‚‚‚‚‚‚‚„„„ƒƒƒƒƒ‚‚‚ƒƒƒƒƒ‚ƒ„†……ƒ‚……„ƒ|{zzzz}€ƒ…ƒƒ‚ƒ‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒ„„„„„„„„„„ƒ„ƒ„ƒ„ƒ„……„‚~}~€€€~~~~~}}}|}|}}~€€€€€€‚€€€€ƒ„€‚€‚‚€‚€€‚€€€€€€€€‚‚ƒƒƒƒƒ‚‚‚‚€€€€€€€€€€€€€€€€€€~~}}}~€€€€€‚‚‚‚‚€‚ƒ„ƒ‚‚‚‚‚ƒ‚‚ƒƒ‚ƒ…„„ƒƒ„„ƒ‚‚€€€€ƒƒƒ‚€~~~}|€~~€€€~~€€€€€€€€€€€€€€€€€‚‚‚‚‚€€~~}}}~~~~~}~~€€€~}|{{}}}{}}~~~}}|{{||~~€}|{|}~~€€~}~~~~~~~€~}~~~~~€€€€€~}}€}~~~€€~}||||}~~€‚…‡„ƒƒƒƒ„„………„„„„„„ƒ‚‚ƒ„……„„‚€€‚€€„…ƒ‚€‚‚‚ƒƒ‚‚„…††††……†‡‰ˆ‡…€€€€€€€€€€€€€€€€~}|{zz{{zz{z{zzzyyzyzyzyyyyxxxxxyxxwwwwwxwwvwwxxwwwwvvvvwvvxxwwx{|}||||z{{{}€€€ƒƒ„„„„ƒƒƒ‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ……„„ƒƒƒ‚ƒ‚‚‚ƒ‚‚‚ƒƒ„……„ƒƒƒ……„€‚‚‚‚‚‚‚‚€€‚‚ƒ„‚‚‚‚‚‚‚‚„„„„ƒƒ‚‚‚‚ƒ‚ƒƒ„„ƒƒƒ‚ƒ‚‚‚ƒƒƒ€}{yzzzz|‚„‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„……‚}~€€€‚}~~~}}}}}}~~€€€€€€€€€€€‚€€€„„€€€‚‚€‚€€€‚‚‚€€€€€€ƒƒƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€‚€ƒƒƒ‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚„…„„ƒƒ„„ƒ‚‚€€€€ƒ‚‚‚€€€~~||€€€~}}}~€€€€€€€€€€€€€€€€€€€‚‚‚‚€~~~~~~~~~}}}}~~~~~~~~|{z{|}|{|}~~}{||}}~|{}}~~€€~~~~~€€~~~~~~~€€€€€€~}}€}~~~€€~}}~~|}}…†„ƒƒƒ„„…††……„„ƒ„„‚‚‚ƒ„„ƒƒ‚€€‚‚€€€€„…ƒ‚€€‚ƒ‚‚ƒ‚ƒ„†‡‡‡‡†††ˆˆ‰‡†€€€€€€€€€€€€€€€€~}|{zzzzzzyzyzyzyyyyyyyyyyxxwxxxxxwwwwwwwwwwwwxxxwwvvvvwwvwxxwvw{|}||}|z|||~€€‚‚ƒ„„„„ƒƒ‚ƒƒƒƒ‚ƒƒƒƒƒƒƒƒ…„„„„„„ƒ„ƒ‚ƒƒ„ƒ‚ƒƒ„……„ƒƒƒ……„€‚‚‚‚ƒƒ€€‚„‚‚‚‚‚‚‚‚„„ƒƒ‚‚ƒƒƒƒ„„„…ƒ~‚€~}zy{zzz|~ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„………„„„ƒƒƒƒ„„…„„ƒ„ƒ„„„ƒ„ƒ„ƒ„ƒ„„……ƒ~~€€€‚}~~~}}|||}~~~}~€€‚€€€„„‚€€‚‚€‚€€€‚‚‚€€€€‚ƒ„‚‚€€€€€€€€€€€€€€€€€€€~~€€€‚‚‚‚ƒƒ„ƒ‚‚‚‚€€‚‚ƒƒ‚‚ƒƒƒƒƒ‚‚‚‚‚‚‚„…„„ƒƒ„„ƒ‚‚€€€€ƒ‚‚‚‚€~}}|}}~~€€~}}}~€‚€€€€€€€€€€€€€€€€€€~~~~~~~~~~~}}}||}}}~€€~|{{}}|{{{|}~~||}}~€€‚‚‚€~|{}}~~€€€€~~~~€~~€€€€€€€~}}€}~~~€€€~~€ƒƒ~‚†‡……„„„……………„„„„„…ƒ‚‚ƒ„„„„ƒ€€‚‚€€„…ƒ‚€‚ƒ‚€‚ƒ„…†ˆ‡‡‡‡††‡ˆ‰‰ˆ€€€€€€€€€€€€€€€€}|{zyyyzyyyyyyyyxxxxxxxxyyxxxxxxyxxwwwwwwwwvwwxxxwwvvvwwwvwxxwvw{|}{|||{}|}~‚ƒ„ƒ„ƒƒ‚‚‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ„„„„„…………ƒ‚ƒ„…„ƒƒƒ„……„ƒƒƒ……„€‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚€€ƒƒƒƒ„„„„…„‚€€€€€}|{{zyz{~ƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„…„„„„„ƒƒ„„……„„„„„„„„„ƒ„ƒ„ƒ„ƒƒ„…ƒ€~~~€€€‚~|~}|{{z{{}}~|{z‚~€€€€€‚€€€‚„…€€€‚‚€‚€‚ƒ‚€€€€‚~€ƒ…€€€€€€€€€€€€€€€€€€~~€€€‚ƒ„„„‚ƒ„……„ƒ‚ƒ‚‚‚‚‚‚ƒƒ‚ƒƒ„ƒƒƒ‚‚‚ƒƒ‚ƒ„…„„ƒƒ„„ƒ‚‚€€€€ƒ‚‚‚‚‚‚‚‚€€~}||}}}}€€€~€€€€€€€€~~~~~}|}}}~~€~~~}}||||}}~€€}}}}{z{zz{|}€||}~€€‚‚‚€~|{}~~~~~~~~}}}}~€~~€€~~~€€€€€€€€~}}€}~~~€€€‚††ƒˆ‰††……„„„…„„„„„„…†„ƒƒ„…†……ƒ€€‚‚€€„…ƒ‚€‚‚‚‚ƒ„†‡ˆˆˆ‡ˆ‡†‡ˆ‰‰‰€€€€€€€€€€€€€€€€}|{zyyyyyyyyyyyyxxxxxxxxyyxxxxxxxxxwwwwwwwwwwwxxxxwvvvwwwvwyxwvw{||{{}|{}}}€}€‚ƒƒƒƒƒƒ‚‚‚ƒ„ƒ‚‚‚‚‚‚‚‚‚ƒƒ„„……††…„ƒƒ…†„ƒƒƒ„……„ƒƒƒ……„€‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒ~~€‚ƒƒƒƒƒƒƒƒ‚€~~ƒƒƒƒ„„„„‚ƒ„„ƒ€}|€€€~}{zyz{~‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚ƒ„„„ƒƒ„„„„„„……„„„„„„„„ƒ„ƒ„ƒ„ƒ„ƒ„…„€~}~€€€‚‚~{€~}|{zzxy{|{zyx‚~€‚‚€€€‚„…‚€€€‚‚€‚€‚ƒ‚€€€€ƒ~~€ƒ…€€~~€€€€€€€€€€€€€€€€~€€€€‚ƒ„„„ƒƒƒ‚‚‚‚‚‚‚‚ƒƒ„„‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ…„‚ƒ„„ƒ~~†‡‰Š†€}€ƒ~~}}}~~~}}~~€€€€€€€‚‚‚€€€€€‚}||||{{|}}}}|zz{}€ƒƒƒ}||}~|{|}~~~}}}}~~~~}}}}|{zzyy||||}~€€€€~~€€~€}}~~}~~~~~~€€€€}}€€~€€€~~~€‚‚‚‚‚‚‚‚…………„„„ƒ„„„„„„„„…†‡‡†…„ƒ|}€ƒƒ‚‚€~€‚ƒ††„‚‚€€€‚ƒ‚‚…ˆŠ‰ˆ‹Š‰‰‰ŠŠŠ€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyywwxxxxyyxxxxxxxxxxxxwwwwwwwvvvuuwuvxyxxz{|}}|{{{vwy|€€~‚ƒƒƒƒ„„„„ƒƒƒƒƒ„ƒƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„„„„ƒƒ„„„„ƒ‚€€ƒ…†††††…ƒ‚ƒ„†ˆ‚ƒƒ~||}ƒ‚‚ƒ…†…ƒ‚‚‚ƒƒƒƒƒ†…„‚‚‚‚‚‚„…„„„„‚„„ƒ€}}}{ywx{}~~|~€‚ƒƒ‚‚ƒ‚‚‚ƒƒ„„„ƒƒƒƒ„„„„„„„„„„ƒ„„………„„ƒ„„ƒƒ‚‚ƒ„†„~~~€€€€~}}~}|{zz{{|}~~}}~~€€‚‚‚‚‚‚‚‚„ƒ‚€~†„€€€‚‚ƒ‚€~~€€€~€€€€€€€€€€€€€€€€~~€€‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒ‚€€~…†ˆ‰…}‚~~}}}~~~|}~~€€~€€€€€€€€€€€~|zyyxxzz{||||{{{{}€‚‚‚€€~|{{{|}}~}}|{~~}}{{{{~~}||{{{||||}~€€€€~€~~~~~~}}}~~~~~~~€€€€€€}}~€~€€€€~~~€‚‚‚‚‚‚‚‚……„ƒ€ƒƒ‚ƒ‚ƒ‚ƒ„„……„ƒ‚~€‚‚‚‚€~€‚‚……ƒ€‚€‚‚‚‚„‡‰‰ˆ‹ŠŠŠ‹‹‹Š€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxwwwxwxxxwwwwvvuuwuvxxxxzz|}}||||xxz~‚€~‚ƒƒƒƒ„„„ƒƒƒƒƒƒƒƒ‚‚ƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„„„„ƒƒ„„„„ƒ‚€€„‡ŠŒŽŽŒŠ‡…ƒƒƒ„‡ˆ‡„~}~ƒ……„‚ƒƒƒƒƒƒƒƒ…………ƒƒ€€„…†††‚„„ƒ€}|}{yxx{}~~|~€‚ƒƒ‚‚ƒ‚‚‚‚ƒƒ„„„ƒƒƒƒ„„„„„„„„„„ƒ„„………„„„„„„ƒƒ‚ƒ„†„~~~€€€€~}}~}||{{||}~~€€€€‚‚‚€€€€€€€€€€€†„€€€€€‚ƒ‚€~€€€€€~€€€€€€€€€€€€€€€€~~~~€€€€‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒ‚ƒƒ€€€~€ƒ„††ƒ}~~~}~~~~}}~€€€~~~€€€€€€~~~€€~}{yxwxxyyz{|{{z|||}€€€~|z{|}}}}}{{z~}}|||||~~}}||||||}~€€€~€~}}~~~~~~~~€€}}€€~€€€€~~~€„ƒ‚€}|{€€€€€€€€‚‚‚~€€€‚‚‚€~€‚„…‚€€‚‚‚‚ƒ‡‰‰ˆŠ‰ŠŠŒ‹Šˆ€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxwwwwxxxxwwwwvvvvwuvwxwxyz{}}}|}~{{}‚‚€}‚ƒƒƒƒ„„ƒƒ‚‚‚ƒƒ‚‚‚‚ƒƒ„…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„ƒ„ƒ„„„„„‚€€…ˆ‹ŽŒ‰†„‚‚‚ƒ„„‚€~€ƒ„ƒ‚„„„„„„„„„„……„‚€~€€„†††ƒ„…ƒ€}||{yxy{}}}|~€‚ƒƒ‚‚ƒ‚‚‚‚ƒƒƒ„ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒƒƒ„„……„„„„„„„ƒƒ‚ƒ„†„~~~€~}}~~}}|||~~~€€‚‚‚ƒƒ„„„~€ƒ…††„ƒ€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€~~}~€€‚ƒ‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒ‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚„…„‚‚ƒ„‚€~ƒƒƒ~}~€~~}~~~~~€‚‚€€€€€~€~~~€€€€~}{{z{yz{|||{{}||}€€~}}||}}}}|{{}~‚~~}}|||||}~€€€€€€€€€~~~€€€€€€€€~~~~}}~€~€€€~~~€€€€€€€€€‚€€~~||~~~~~~~€€~}|€€‚‚€~€‚„„ƒ€‚‚€‚€ƒ…ˆ‰ˆ‡‡ˆ‰Š‰‡†€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyyyxxxxwwxxxxxxxxwwwxwxxxwwwwvvvvwvuxxwwyy{|~}}~~~~ƒ‚€}‚ƒƒƒƒ„„ƒƒ‚‚‚‚‚ƒƒ‚ƒ‚ƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ„ƒ„ƒƒ„„„„ƒ‚€€‚„†‡ˆˆˆ‰ˆ†…„„„„€~~~~}~‚ƒ„„„„ƒƒƒƒƒƒ‚‚€}}€}~€‚ƒ„ƒ……ƒ}||{zyz{}|||~€‚ƒƒ‚‚ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒƒƒ„„„„„„„„„…„„ƒƒƒ„†„~~~~}}~~~~~~}}€€€ƒƒƒƒƒƒƒƒ„„„„„„„„‚ƒ…‡ˆŠŠƒ‚€€€€€€€€€€€ƒ‚€€€‚€€€€€€€€€€€€€€€€~}~~€€€‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ…„ƒ‚ƒ…ƒ€€€€~~€~}€€~~~~~}~~~€€€€€€€€€€€€€~~~€€€€€€€ƒ‚€~}|}}z{||}}}|}||}~~‚‚ƒƒ„}z{|}~}€„†ˆ‡…ƒ~~~~~}||||||}~€€€€€€€€€€€~~~€€€€€€€€~~‚‚}|€€€€€~~~~€€€€€€€€€€€€€€~~~~~~~~~~~}|{€‚€~€‚‚„…ƒ‚‚‚‚‚‚€ƒ€…‡‰‰††‡ˆ‰ˆ†…€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyyyyxxwwwxxxxxxxxxxxwxwwwwwwwwwwvwuvwxvvxyz}}}|}~€€‚„ƒ€}‚ƒƒƒƒ„„ƒƒ‚‚‚‚‚„„ƒ‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„…„„‚€‚‚ƒ„„ƒ‚‚„„ƒƒ„„……………‚€}}}}|{|~„ƒƒƒ‚‚‚€~{{z||~~~}~‚„„…†ƒ€|{{{zzz}}|z|~€‚ƒƒ‚‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„„„„„„„ƒƒƒ„†„~~~~~~~}~~~€€‚‚‚„„„„„„„„„„……†‡ˆˆ‚€€€€‚‚‚€€€€€€€ƒ‚€€€‚€€€€€€€€€€€€€€€€~~}€€‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚ƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„ƒƒƒ„‚€€~€~€€€~~~~~}}||}~~€€€€€€€€€€€€€~~~€€€€€€€€€€€‚~||{|{||}}~}}}|{|~~€€ƒ…„~|}~€‚‚‚ƒ…‡‰‰‡„‚}~~~}||||||}~€€€~€~~~~~~€€}}~€€~~~~~€€€€€€€€€€€‚ƒƒ~~}|€€€€€~€‚‚……„‚ƒƒ‚‚€ƒ€ƒ‡ˆ‰ˆˆˆ‰‰‰ˆ‡€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwvuwwvvwy{|}|||}€‚„ƒ~‚ƒƒƒƒ„„ƒƒ‚‚‚ƒƒ…„ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„„„„„ƒ‚€€€‚ƒ„„ƒƒƒƒƒƒƒƒƒƒ……„‚}|}~~|zz|‚€~~€~zxwy{}}~~~~€ƒ…„††„|{{{zz{}}{y|~€‚ƒƒ‚‚‚ƒƒƒƒ‚‚‚‚‚ƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„ƒƒƒ„„„„ƒƒƒ„†„~~~}~~~~}}~~~€€€€€‚‚‚‚‚‚‚‚€€€€‚‚‚‚‚‚€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€~~€€‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚ƒ„„„„‚~€‚€€~€€€€~~~~~~}}||}~~€€€€€€€€€€~~}€€€€€€€€€€€~|{{{{z{||}||||{{|~~||~€ƒ„……€‚ƒ„„„„†††……„ƒ‚}~~}|||||}~€€€~€~€€€~~~~~€€€€€€€€}}€€~~}~~~€€€€€€€€€€€€€€€€€€€€~}~€€€€€~€‚ƒ…ƒ‚‚‚€‚‚‚ƒƒ†‰‰Š‰‰‰ŠŠŠ‰€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxwxwwwwwwwwwwwwuvwwuuwy{||{z{{~~‚„„‚ƒƒƒƒ„„„ƒƒƒƒƒƒ„„ƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„„„„ƒ‚€€ƒƒƒƒƒƒƒ„„„„„„„„„‚}}~}}~|{{}~~}||{}{yxxy{|~~~~€‚ƒ…††ƒ€|zz{zz|}}{x|~€‚ƒƒ‚‚‚ƒƒƒƒ‚‚‚‚ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„„„„ƒ‚ƒƒƒ„ƒƒƒƒ„†„~~~}}~~~~~}~~€‚‚‚€€€€€€€€€€€€€€€€€€€‚‚€€‚‚‚‚‚‚‚‚€€€€€€€€€€‚€}€€€€~€€€€€€€€€€€€€€€€~€€‚‚‚‚‚‚ƒƒƒƒ‚‚ƒ‚‚‚‚‚‚€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚„…„ƒ~€‚~~€€€~~~~€~~~~~~~€~€€€€€€~~}€€€€€€€€€‚}|{{{yzz{|{{{{zz|~|}~~~„‡‚ƒ„………„„…ƒ€€ƒ…~~€€~}||||}~€€€~€€~~€€€€~~€€€€€~~€€€€}}~€~}}~~~€€€~~‚‚‚‚‚‚‚‚‚‚€~|~€€~€‚€ƒ„‚€€‚‚‚‚ƒ~‚†ˆ‰‹Š‰‰‰ŠŠŠ€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyywwwxxyyyxxxxxxxxwwwwxxxxwwwwwwwwwvuwwuuwy{||zzzz}}~„„‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒ‚ƒƒ„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„„„„ƒ‚€€€€‚ƒ…†‡‡‡ŒŒŠ‡‚~}|}~|{{}~}}|{{zzzzzzz{{|€~}}~~…††„|zz{z{|}}zx|~€‚ƒƒ‚‚‚ƒƒ„ƒ‚‚‚ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„„„ƒƒ‚‚ƒƒƒƒƒ‚ƒ„†„~~~}}~~~~}}~~€€‚‚€€€ƒƒ‚€€‚‚‚‚‚‚‚‚€€€‚‚€ƒ‚€€‚‚‚‚‚‚‚‚€€€€€€€€€‚‚€~}€€~€€€€€€€€€€€€€€€€~~€€ƒƒ‚‚‚ƒƒƒ‚‚‚‚‚€€€‚‚‚‚ƒ„„ƒƒ‚‚ƒƒƒƒƒƒ„‚‚ƒ„„ƒ‚‚€€€€ƒ~~‚ƒ€~~}~~~€€~~}}€€€€€~}€€€€€€€~|zyyyxxz{{zzyyyz|~€€€~~~€„†‡‡…ƒ‚€€€€{||}~€€}|{{|}~~€€~}}~~€€~~~}€€€€€€€€€€€€€€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„ƒ‚‚‚‚€€€ƒ†‡‡‰‰ŠŠ‰‰€€€€€€€€€€€€€€€€|{zzyzz{yyyyyyyyxxxxyyyywxxxxxxxzyxwwwxxyyxwwwwxwwwwvuttvvvvwwwwz{||{{|}~€ƒƒ‚€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒ‚‚‚‚ƒ„ƒ„ƒ„ƒ„ƒ„ƒ‚ƒ„„‚€|~„†‡‡‡ˆˆ‰ŠŒŽŽˆ‚}|}~~€€~~|zxxy{|}}}}}}|||~|{{{}~ƒ‡Šˆ{yzzyz{~‚…ˆ…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„…„€}}}||}}}~~~~~~~€‚€€€€€€€€€€‚‚€€€‚‚‚€€€€€ƒ€€€~€€€€€€€€€€€€€€€€~~€€‚ƒ‚‚‚€‚‚‚‚‚‚‚‚€‚€€‚‚‚ƒ‚‚ƒ„„ƒƒ‚ƒƒƒƒƒƒ„ƒƒ„…„„ƒƒ€€€€‚€~~‚‚€~~~}~€€€€~~€€€€~~€€€€€€€€€~|{zyywxyzzzyx{{|~€€€€€€~~€‚ƒ„‚€€€€~‚€€€€{||}~€~|{{|}~~€€~}~~~~~~~~~~~}~~~~€€€€€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„ƒ‚‚€‚ƒƒ‚„‰‰‰‰ˆ‡†…€€€€€€€€€€€€€€€€||zzyyyzyzyzyzyzyyyyyyyyyxxwwxxyyyxwwwxxxxwwwxxyvwwwvvuuvvvvvwwwz{||{{|}~€ƒƒ‚€€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ‚‚‚‚‚ƒƒ„ƒ„ƒ„ƒ„„ƒƒƒ„„‚€„ˆŠŒŒŒŽŽŽŽŽŽŒ‰„~zz|~~~~~~~~}{z{}~~~~}}}}}}{{{{{||}€„ˆ†|{|zzz{}€„†……ƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„…„€~}}}}}~~~~~~€‚€€‚‚‚‚€€€€€‚€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€€€‚‚ƒƒ‚‚‚‚€€€‚ƒƒƒ‚‚ƒƒ„ƒƒƒ‚ƒƒƒƒƒƒ„„„………„„„€€€€‚€~~‚‚€~~}~}~€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€}|{{{z{{|||||~~~€€€~}~€~~~~~~~}}|‚€€€~||}}€€€~|{{|}~€~~~~~}}~~~~}~~€€€€€€€€€}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„‚‚‚‚‚‚‚‚‚ƒ‚€‚ƒ……†‡‡†††€€€€€€€€€€€€€€€€}|{yyxxxzzzzzzzz{{{zyxxxzyxwwwyyyyxxwxxxwwwwxxyywwxwxwwvvvvvwwwwz{||{{|}~€‚ƒ‚€€€€‚‚ƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒƒ‚‚‚ƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒ„„‚€€‚†‰ŽŽŒŒŠˆ‡†…………‚~|||~}||}~€~|||}~~~~~~~}}}yz{{|||{}„ƒ€}}~{zzz|‚„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„…„~~~~~€€~~~~€‚‚‚‚‚‚‚‚‚€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€~~€‚ƒ„‚‚‚‚‚€‚‚ƒƒ„„„ƒ‚‚‚ƒƒƒƒƒƒ„„„„„„„„„€€€€~~€}~~~}~~~€€€€€€€€€€€€€€€€€€€€€€€~|}|}}~~~€€€€€€€€~~€€~~~}}}~}}}|}}}~}||}}~~€€€‚‚‚€~|{{|}€€€~~~~~~€€€€€€€€€€€€€€€€€€€~}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒ‚‚‚ƒƒƒ‚€‚‚ƒ„……†……€€€€€€€€€€€€€€€€~}{zxxxx{{{{{{{{}}|{zyxxzyxxwxxyxxxxxxxxwwwxwxxywxxyyyxxvvvwvwwwz{||{{|}€‚‚€€€‚ƒƒ„ƒƒ„„„„„„ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒ‚‚‚ƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒ„…„‚ƒ‡ˆŠ‰‰ˆˆ‡†„ƒ‚‚‚~|{{}}||{|}}}{zz|}}}~~}}||}}}}}}}€‚}}~{{zz{~€‚††„„‚ƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„……~€€€€~~~~€‚€‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€‚‚€€€~}}~‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚…„„ƒ‚‚‚‚ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ€€€€€~~€€~}}~~~|}~~~}~~~~~€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€~~‚‚}}}||}~~~~{{|~~|yv}}~~€‚‚‚~}|||~€€€~~}€~~€€€€€€€€€€€€€}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„‚‚‚‚ƒ‚€€€€€€‚ƒ„„„„„‚€€€€€€€€€€€€€€€€€~|zzxyx|||{|{||~}}{{yyxyyyyyxxxxxxxxxxxxxxxxwwwwwxxxxxxvvvvwwwwz{||{{|}‚‚€€‚ƒ„ƒƒƒ„„„„„ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒ‚‚‚ƒƒ„ƒ„ƒ„ƒ„ƒ…„ƒ„……ƒ~‚ƒƒ‚‚€‚‚‚~}~~~}|{|}{{||}||{zyyz}~€~~}}}~~~‚„€€~|{{{{zz{~€‚†……ƒƒ‚ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„†„‚€€€€€€‚‚~~~~€‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€€€~~~~}~~€€‚‚‚‚ƒƒƒ‚‚‚ƒƒ‚‚‚ƒƒ„‚ƒƒƒƒƒƒ„ƒƒ‚‚‚ƒƒƒ€€€€~~~€€~}}~~~|}~~~}~~~~~~~~~~€€€~~€€€€€€€€€€€€€€€€€‚‚ƒƒƒ‚‚ƒ‚€€~~~€}{z{|}~€€€}}}~~{xu}}~€‚ƒ‚‚€}||}~€€€€~}}~~~~}}~~~€€~~~~€€€€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒ‚€€‚€€€‚„ƒƒƒ‚‚‚ƒƒƒ‚€€€€€€€€€€€€€€€€~}|zzzz|}|}|}||~~}|{{zzyzyzyyxwwwxxyxxxxxxyxxwvvvvwwwvvvvvwvwwwz{||{{|}€‚€€‚‚‚ƒƒ„ƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒƒ‚ƒƒ„ƒ„ƒ„ƒ„ƒ„…„„„……ƒ€€€~|z{|||zywvxyz{||}}z{|}}|{zzz{}‚‚€€~}}}~~~~€ƒ†ˆ„ƒ‚€}{zy{zzz|‚„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„……‚€€€‚‚‚~~~~€‚‚‚‚‚€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€}}~~€€~~}}}~~~~‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„…‚ƒƒƒƒƒƒ„„„ƒ‚‚ƒ„„€€€€~~€€~}}~~~~}~~€€~~~€€€~~€€€€€€€€€€€€€‚„„ƒƒƒ„…†„ƒ‚ƒƒƒ€€€€€€~|zz{}}~€€€}|}~~€€ƒƒƒ‚~||}~€€€€~}}~~~~~~~~~}}~€~~~~€€€€€€€€}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ‚€€‚€€€‚‚ƒ„…„‚€‚ƒƒƒƒ€€€€€€€€€€€€€€€€~}||||}}}}}}}}}}}}|}|||zzzyyxxxwwxyyyxxwxxxyxwwwwwwwvvuvvvvwwwwz{||{{|}€‚€€‚‚‚ƒƒ„ƒƒƒ„„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ…„„………ƒ‚€€€|yxz{||{ywvwxz|}|{y||||||||||}ƒƒƒ€~~}}|~}~~ƒ„…„~|{zzzz{}€„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„†…ƒ‚€€€‚‚~~~~€‚€€‚‚‚‚‚€€€€€€‚€€€€€€€€€€€€€€€€€€€||}}~€~~}}}}~~~}}€€€‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒƒ„‚ƒƒƒƒƒƒ„……„ƒƒ„……€€€€~~~€€~~}}~~~~~€€€€€€€~~€€€~~€‚€€€€€€€€€‚ƒ„ƒƒ‚‚ƒ……‚‚‚‚‚€€~}~|{||~~~~‚€ƒ……}~~€‚ƒƒƒ‚~}}}~€€€€€€~}}~~~€€~~€€~€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€‚ƒ‚€‚ƒƒ‚ƒƒƒƒƒ‚‚‚‚ƒƒ‚‚€€€€€€€€€€€€€€€€€~~}}}~~}}}}}}}}|||}}}}~{{yxwxxyvwxyyyxxvwxyyyxxyyyyxxwvvvvvwwwwz{||{{|}€‚€‚‚‚ƒƒ„„ƒƒ„„ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„……„…†…ƒ‚€€~{xvyz{}}|zyxxy{|~~~}}{{{||}}}~‚ƒƒ‚€~}}||~~~~~}}|…ƒ~}|{zyz{~‚…ˆ…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ„†…ƒ‚‚ƒ€€€‚~~~~€‚‚‚‚‚‚‚‚‚€€‚‚€€€‚‚‚€€€€€€€€‚€€€€€€€€€€€€€€€€€~€~~~€€€€€~€€€€€‚‚‚ƒ„„†…„ƒ‚‚ƒƒƒ‚ƒ‚ƒ‚ƒ‚ƒ„……„„‚€€~}~€€}~~~~~~}€€€~€€€~~~~~~€}~€€€€€€€€‚‚‚‚‚ƒ„…†„ƒƒƒ‚‚~~€€€~€|z{|€€€€€€~~~€ƒƒ„‚}}~~~~€€~~~~~~~}~€€€~~~‚€~}|}~€~~~}}}}}€€€€~€€€€€€€€€€€€€€€€€€€€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~}}|}}|||}}}}|zzzzzzzz{||{yxxywwxxxyyywwwwwwwwwwxxxxwvxwwwvwwwxz||{zz{ƒƒ€‚‚ƒƒƒƒƒ„‚‚‚ƒƒ‚‚ƒƒƒƒ„„ƒƒ„„„………ƒƒƒ‚‚ƒƒƒƒ„„„ƒ‚ƒƒ‚ƒƒƒ‚‚ƒƒ€~~€€}zyz{{zyxxywxyz{|||}}}~~}}}~~€€€€€~~}|{{{}~|zz~‚ƒƒƒƒ‚}|zzz{~‚†ˆ†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ€ƒ„ƒ‚€~€‚‚‚~€‚‚‚‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒ„ƒƒƒ‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒƒƒƒƒƒ„„‚€~}~€€€~~}}}~~~€€€€€€~~~~€€~~€€€€€€€€€€€€€‚‚‚ƒƒ‚‚‚‚ƒ„ƒ‚‚‚€€~~€}{{|~€€€~|zy~~~€‚ƒƒ‚}}~~~~€€~~~~~~~~~}~~~€€€€€€‚€~}|}~€€€€€€€€€€€€€€€€€€€€€€€€€€~ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~}~~~|}}}}}||{{z{{{{{zz{zxwwxxxxxxyxyyxxxxwwwwxxxxxwwxwwwvwwwxz|}||||ƒƒ€€€‚ƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„„„„„„„„ƒƒƒ‚‚ƒƒƒƒ„„„ƒ‚‚ƒ‚ƒƒƒ‚‚ƒƒ€~~€€}zyyzzzyyzzyyz{|}}}}~~~~~~}}~~€€€€~~}|{||||}€‚„ƒƒƒ‚}|||{|~„††…„ƒ‚‚‚‚‚‚‚ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚ƒ„„‚€~€€‚‚‚~~€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚ƒ„‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…„ƒ‚‚‚ƒ„‚€~~~~€€€~}|}}~~~~~~~~~~~€€€€€~€€€€€€€€€€‚‚€€‚ƒ‚„ƒ‚€€€~~~~~€€€~~|||~~~~~€~|{~~~€‚ƒƒ}~~~~~€€~~~~}}}~~~€~~€€€€‚‚€~}|}~€€€€€€€€€€€€~‚€€€€€€€€€€€€€€€€€€€€€€€€~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~€€~~~~~}}|{{{{{{{{yyzyxxxyyxyxxxxxzzyyxxwwxxxwwwwwwwwvwwwxyz|}}}}}ƒƒ€€‚ƒƒƒƒƒƒ……„„„ƒƒƒƒƒƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒ‚‚ƒƒƒ„„…„ƒ‚‚‚‚ƒ„ƒƒ‚ƒ„€€}zzyz{{{{}~{||}~~~~€€}~€€€€€€~}|{~{{|€ƒƒ‚‚‚‚€~|{~}||}‚„†…„ƒ‚‚‚‚‚‚ƒ‚ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ‚ƒ„„‚€‚€€‚‚~~~€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€€~~€€€‚‚‚‚‚€€‚‚‚‚‚ƒƒƒ‚ƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒƒ„ƒ„ƒƒƒƒ€€€~€~~€€~}}}~~~~~~~~~~~~€€€€€€€€€€€€€€€€€‚‚€ƒƒƒƒƒ‚€€~~~~~}}~€€}}}}||}}}~~~€€‚‚€~~~€ƒƒ‚~~~~~€€~~~}}}~~€€€€~€€€€€€‚€~}|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ€€€€€€€€€€€€€€€€~€€~}||{{{{z{zzyyzzzzzzyyyyxxwwyyyxxxwwyxwwvwwxwwwvwwxxyz{}}}||}‚€€€‚‚ƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒƒƒƒ‚‚ƒƒƒ„……„‚‚‚‚ƒƒ„„ƒ‚ƒ„‚€€}zz{|}~~}~€€€€€€€€€€€}||~}{~€ƒ‚‚€€~}{{}|{{}‚„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚„…„ƒ‚€€‚‚~}~€‚‚€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€~€€€~~~€€‚‚‚ƒ‚‚€‚‚‚‚ƒ‚ƒ‚ƒ„„„„ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚ƒƒƒ„ƒ„ƒ€€€~€~~~~~~~~~}}}~~~~€~~~€€€€€€€€€€€~€~‚‚€ƒ„‚€€~~~~~~~~~~}}~€~}{{}}}||}}}~~€}}|}}~~~€‚ƒ~€~~~€€~~~~~€€€€~~~~~}~€€€€‚€~}|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ€€€€€€€€€€€€€€€€~~~}~~€}}|{z{zzyzyyyyyzzzzyyyxxxxwwwwwwwwwyxxvwwxxwwvvwwxxzz{||{zy{€€€€‚‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒ„„„„ƒƒƒ‚ƒƒƒ‚‚ƒƒƒ„„…„ƒ‚‚ƒƒƒ„„ƒƒƒ„ƒ€€€|{z}}€€€€€€€€€€‚‚ƒ‚‚€€}||}}€‚‚‚‚€~~||{{zz{}€ƒ…†…„ƒ‚‚‚‚ƒ‚ƒ‚ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ‚ƒ„……ƒ€‚€€~}~€‚€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ‚€€‚‚‚‚ƒƒƒ‚‚……„„ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒƒƒƒƒƒ„„„€€€~}‚€~~}~~~~}}}}~~~€~~}~€€€€€€€€€€~€~‚€€ƒƒ‚€€€€€~~~~~~~~~~~~~~}{{|}}}|}}}~}{zz{|~~~€€‚‚~€~~~€€~~€€€~~}~~~}}~}}}~€€€‚€~}|}~€~~€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ€€€€€€€€€€€€€€€€~~}}}~~~~~}}{{z{zzyyxxwxyyyxyyxyxxxxwwwwwwwwxxwwwwwxwvvvwwxx{{{|{{yxz€‚‚ƒƒƒƒ‚ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„ƒ‚ƒƒƒ„„„ƒƒƒ„„€}{{}~~~~€€€€€€€€ƒƒƒƒ‚‚€€}|{z}„………†ƒ‚€}|||zzzz|ƒ…†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚ƒ………ƒ€€~€~}}~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€‚ƒ‚‚ƒƒƒ‚‚„„ƒƒ‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„„„ƒƒ‚€€€~}‚€~~~~~~}~~~~~~~~€€~~~}~€€€€€€€€~€€€€€€€€‚ƒ‚€€€~~~~~~€}||}}}|}}~~€~}{{{|}~~~€€‚~~~~€€~€€~~~}}~~~~~~€€‚€~}|}~€~~€€€€€€€€€€€€€€€€€€€€€~~~€€ƒ„‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚ƒ€€€€€€€€€€€€€€€€~~}}}~~}~~~~~}}|||{{zzzyxwxxyxwxxxxxxyyxxxxxwwwxxxxxwwwvvvvwwxy{{{|}|{yz€‚ƒƒƒƒ‚‚ƒ‚‚ƒƒƒƒƒƒ„„ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒ‚ƒ„ƒƒƒ„„ƒ„„„ƒƒ„„…‚€|{{|}~~~~€€€€€€€€‚‚‚€~}|{z}‚…††††ƒ‚€~}||}|{zz|~ƒ†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ‚ƒ…†…„‚€~~~~~~}}}‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~~~~€€€€€€€€€€€‚ƒ‚‚ƒƒƒƒ‚ƒ‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ…††„€€€~}‚‚€~~}~}}}}~~~~€€€~~}~€}~€€€€€€~€€€‚€€~~~€€€ƒ~}}}}|}}~€€||||{{zz~~~€€‚~~~€€~~~~}~€€€~~€€€€‚€~}|}~€€‚‚€€€‚‚‚€€€€€€€€€€€€€€€~}~€€ƒ„‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚ƒ‚‚‚€€€€€€€€€€€€€€€€€~~~~~}}}~~~~}~}}}||{{zyxyyzywwwxxxyyyzyyyxxwwwwxxxxwvvvvvwwxy{{{|}~|{{€‚‚‚€‚ƒƒƒƒ‚‚ƒ„„„ƒƒƒ‚‚„„ƒƒƒƒ‚‚‚‚‚ƒƒƒ„„ƒƒƒ‚‚ƒƒƒ‚‚ƒƒƒƒ„…ƒ„„„ƒƒ„„…‚€€|{{}~€€€~€€€€~€‚‚€~}{z{~‚…†…„‚„ƒ}}}}~}{{{}€†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚„…†…„‚€€}}~~~}~}|}‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„ƒ‚€~}€€€€~}}~~}}}~~~~~€€€~~~€~€€‚€€‚€€€€€€€€€€€‚ƒ‚€€~€€€€~~~~~~~~}}}~~~€€}|{{{|~~~€€€€~~~€€~~~~~~~~~€€€~~~~~€‚€€€€||€~€€€€€€€€€€€€€€€€€€€€€~~€ƒƒ‚‚ƒƒƒ€€€~‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~~~}}}}~~~~|||{{zzzzyxyyyyxyxyxyxyxxxxxxxxxwwwwwwwwwwwwwwxx{{|||{{{~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚ƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„„„„„„„„ƒ€}|{|€€€€€€€€€€€€€€€~~€€}|{|}~}„……„„‚ƒƒ‚}||||{{}€ƒ…†…„ƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒ†„‚‚ƒƒƒƒ‚„‡†‚€~~}~~}~€‚‚‚‚€€‚‚‚‚€€‚‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚ƒƒƒ‚‚ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚€€€€~~}}~~~}}}}~~~~~€€€~~€~€€~~~€€€€€€€€€€€€€€€‚ƒ‚€€~€€~~~~~~~~€€€~~}}}€€€€€~}|}}}€€€€€~~~€€€€€~~~~~~~~~~~€€€‚€}|€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~€€€ƒƒ‚‚‚‚‚‚‚‚~€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~~~}}}}}|||{{zzzyxyyyyxxyxyxyxyxxxxxxxxwwwwwwwwwwwwwwxxz{||{|||€€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚ƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ„„„„„„„„ƒ‚€€}|{|~€€€€€€€€€€€€€€€€€€~}|{{||}|}€‚ƒƒ‚‚}||||{{}€ƒ…††„ƒ‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒ…„‚‚‚ƒƒƒƒ‚„‡†‚~~~~~~}}}~€€‚‚‚€€‚‚‚‚‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒƒ„„‚‚ƒ‚‚‚‚ƒƒƒƒ‚ƒƒƒƒƒƒ„„„ƒ‚ƒ‚€~~}}}}|}}~~~~~~€€€€€€~€~~~~€€€‚‚€€€€€€€€€‚ƒ‚€€€€€€~~~~~~~~~€~~~~~€€€€€€€€€€~€€€€€€€~~~€€€€~~~~~~~~~~~~}}€€€€€€€€||€~~€€€€€€€€€€€€€€€€€€€€€€€}}~€€ƒƒ‚‚‚‚€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€~~}~~~~}}}}}|||{{{zzyxyyyyxyxyxyxyxyyxxxxwwwwwwwwwwwwwvwwxxyz||||}~€€€€‚‚‚‚ƒƒƒƒ„ƒƒƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒ‚€€~|{|~~~~€€€€€€€€€€€€€€€€€€€€{{{{||||{|~€~}€€~}||||{{}€ƒ…‡†„ƒ‚‚‚‚‚ƒƒƒƒ„„„„„„„„„„„„„„„„„„„ƒ„ƒƒƒ…„‚‚ƒƒƒƒ‚„††‚}}~~~}}~~€‚‚‚€‚‚‚‚‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„ƒƒ‚‚‚€€€€€€€€~}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€€€€€€~~~~~~€~~~~~€€€€€€€€€€€€€€€€€€€~~~€€€€€€~~~~~~~~€~~~}€€€€€‚€}|€~€€€€€€€€€€€€€€€€€€€€~}}~ƒƒ€€€€€€€€€‚€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€~~~}~~}}||||{{zzzzzyxyyyyxxyxyxyxyyyyxxwwwwwwwwwwwwwwwwxxxyz{|{|~€€€€€€€€‚‚‚‚‚ƒƒƒ„„ƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒ‚€€€€~}|}}~}~€~€€€€€€€€€€~~z{{}}}}}|}~~~}|}€€~}|}||{{}€ƒ…‡†…ƒ‚‚‚‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„„„ƒ„ƒ„ƒƒ…„‚‚‚ƒƒƒƒ‚„‡†‚~~~}~~~€‚‚‚€‚‚‚‚‚€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ‚ƒ‚‚€€€‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ‚‚€€€€~€€€€€€~}~}}}~~~~~~~~~€€€€€€€€€€€€€€‚€€€‚€€€€€€€€‚‚‚€€~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€~~~€€~~€‚‚~~~€€€||€~~~~~~€€€€€€€€€€€€€€€€~}~ƒƒ€€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€~~~~~}}||{{{zzyyyzyxyyyyxyxyxyxyxyyyxxwwwwwwwwwwwwwwvwwxxyz||{|~€€€€€€€‚‚‚ƒƒƒ„ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ„‚€€}|}~}~~€€€€€€€€€~~||}~~~~~~}}€€~}|}||{{}€ƒ…‡†…„ƒ‚‚‚‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„„„ƒƒ‚ƒƒƒ‚ƒ‚„††‚~~~~~~}}~~€‚‚‚€€‚‚‚‚‚€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€‚‚ƒƒƒ‚€€€€€‚‚‚‚‚ƒ‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚€€€~€€€}~}~}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€‚‚€‚‚‚~~~}}}}~~~~~€~~~~~€€€€€€~~~~€€€€€~~~€€€€€€€€€€€~~~~€€‚‚‚€}|€~~~~€€€€€€€€€€€€€€€€~~€€€€€~~~€‚ƒ€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€~~~~~~}}}}{{{{zzyyzyxyyyyxxyxyxyxyyyxxxxwwwwwwwwwwwwwwwwxxy{||z{~€€€€€‚‚ƒƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ€}|}~~~€‚‚€€€€€€€~~€€€€€€€€€€~}||||{{}€ƒ…ˆ‡…„ƒ‚‚‚‚‚‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„„„„ƒ‚ƒƒ„ƒ‚ƒ‚„‡†‚€~}}}~~}}}}~€€‚‚‚‚‚€‚‚‚‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€‚‚‚‚€‚‚‚‚ƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚€€€€~~€€~~~~}}~~~~~~~~~~}€€€€€€€€€€€€€€€€€€€‚€‚‚‚‚€~~~~~~~~~~~~~~~}~~~€€~~}|{{||}~€€€€~~~€€€€€€€~~~€~€‚‚‚€||€}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€‚ƒ€‚‚‚‚‚€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€~~~~~~~}}}}|||{{zzzzyxyyyyxyxyxyxyxxxxxxxxxwwwwwwwwwwwwwwxxz|}|z{~‚€€€€€‚‚ƒƒƒƒ‚‚‚‚‚‚ƒƒƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„ƒ‚€}|}‚€€€€€€€€‚‚€€€~~~€€€€‚‚}||||{{}€ƒ…ˆ‡†„ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„ƒƒƒ„ƒƒ‚ƒ‚„‡†‚ƒ‚€~~~}}|}~€€‚‚€‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~~~~~~~}~€€€‚‚‚€€€‚‚ƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚€€€€~€€€~}}}~~~~~~~}}€€€€€€€€€‚‚€€€€‚‚€€€€€€€‚€‚ƒ‚‚‚€€€€~~~~~€€~~~~~|}}~~€€~~~~|zyzz{|~€€€€~~~€€€€€€~~~~~~~~~~~~~€€€€~~€‚‚‚€||€{|}~€~~~‚‚€€€~~€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€‚€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€}}}}~~~~}}}||{{{zyxyyyyxxyxyxyxyxxxxxxxxwwwwwwwwwwwwwwxx{|}|zz~‚€€€€‚‚ƒƒƒ‚‚‚‚‚‚ƒƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚…ƒ~|~€€€€~~~}€€€€‚‚‚€‚}}}€€€€€€‚‚‚ƒƒ‚}||||{{}€ƒ…ˆ‡†„ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒ„„„„„ƒƒƒ„„‚ƒ‚„‡†‚………„ƒ~~}|||~€€‚‚€‚‚‚€‚‚‚‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}~~||||||||~~~}}}}xxwxz|€~~|}}~€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€‚€~~}}}}}}}}~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€~~}}}}}}}}}}}}}}||{{{yyyyyyyyyyyyyyyyxxxxxxxxvvvvvvvvxxxxxxxxz{{|}~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚€~~~~~~~~~~~~~~~~€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚€‚‚ƒ†††…‚|z||{|}‚„‡‡†…„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„„„„„„„„‚‚‚‚‚‚‚‚‚„…†„‚ƒ„…††…„ƒƒ}}ƒ‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}||}}~}}}}}}}}~~}}}|||{{z{|~€‚€€~~}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€~~||||||||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€~~~}}}}}}}}|||{{{zzyyyyyyyyyyyyyyyywxwxwxwxxxxxxxxxwwwwwwww{||}~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚€€€€€€€€€ƒ‚‚‚€€‚‚‚………„‚|z}}|}}€‚ƒ…„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒ…„ƒ‚„…†‡‡†…„‚~~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~~~~~~~~€€€€€~~}€‚ƒ~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}}~€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€‚‚€~~‚€€€€€€€‚‚‚‚‚‚‚‚€‚ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€‚ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ \ No newline at end of file diff --git a/venv/Lib/site-packages/pygame/examples/dropevent.py b/venv/Lib/site-packages/pygame/examples/dropevent.py new file mode 100644 index 0000000..060693c --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/dropevent.py @@ -0,0 +1,62 @@ +import pygame as pg + +if pg.get_sdl_version() < (2,0,0): + raise Exception("This example requires SDL2.") + +pg.init() + +def main(): + + Running = True + surf = pg.display.set_mode((640,480)) + font = pg.font.SysFont("Arial", 24) + clock = pg.time.Clock() + + spr_file_text = font.render("Feed me some file or image!", 1, (255,255,255)) + spr_file_text_rect = spr_file_text.get_rect() + spr_file_text_rect.center = surf.get_rect().center + + spr_file_image = None + spr_file_image_rect = None + + while Running: + for ev in pg.event.get(): + if ev.type == pg.QUIT: + Running = False + elif ev.type == pg.DROPBEGIN: + print(ev) + print("File drop begin!") + elif ev.type == pg.DROPCOMPLETE: + print(ev) + print("File drop complete!") + elif ev.type == pg.DROPTEXT: + print(ev) + spr_file_text = font.render(ev.text, 1, (255,255,255)) + spr_file_text_rect = spr_file_text.get_rect() + spr_file_text_rect.center = surf.get_rect().center + elif ev.type == pg.DROPFILE: + print(ev) + spr_file_text = font.render(ev.file, 1, (255,255,255)) + spr_file_text_rect = spr_file_text.get_rect() + spr_file_text_rect.center = surf.get_rect().center + + #Try to open the file if it's an image + filetype = ev.file[-3:] + if (filetype in ["png", "bmp", "jpg"]): + spr_file_image = pg.image.load(ev.file).convert() + spr_file_image.set_alpha(127) + spr_file_image_rect = spr_file_image.get_rect() + spr_file_image_rect.center = surf.get_rect().center + + surf.fill((0,0,0)) + surf.blit(spr_file_text, spr_file_text_rect) + if (spr_file_image): + surf.blit(spr_file_image, spr_file_image_rect) + + pg.display.flip() + clock.tick(30) + + pg.quit() + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/eventlist.py b/venv/Lib/site-packages/pygame/examples/eventlist.py new file mode 100644 index 0000000..7c31836 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/eventlist.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +"""Eventlist is a sloppy style of pygame, but is a handy +tool for learning about pygame events and input. At the +top of the screen are the state of several device values, +and a scrolling list of events are displayed on the bottom. + +This is not quality 'ui' code at all, but you can see how +to implement very non-interactive status displays, or even +a crude text output control. +""" + +from pygame import * + +ImgOnOff = [] +Font = None +LastKey = None + +def showtext(win, pos, text, color, bgcolor): + textimg = Font.render(text, 1, color, bgcolor) + win.blit(textimg, pos) + return pos[0] + textimg.get_width() + 5, pos[1] + + +def drawstatus(win): + bgcolor = 50, 50, 50 + win.fill(bgcolor, (0, 0, 640, 120)) + win.blit(Font.render('Status Area', 1, (155, 155, 155), bgcolor), (2, 2)) + + pos = showtext(win, (10, 30), 'Mouse Focus', (255, 255, 255), bgcolor) + win.blit(ImgOnOff[mouse.get_focused()], pos) + + pos = showtext(win, (330, 30), 'Keyboard Focus', (255, 255, 255), bgcolor) + win.blit(ImgOnOff[key.get_focused()], pos) + + pos = showtext(win, (10, 60), 'Mouse Position', (255, 255, 255), bgcolor) + p = '%s, %s' % mouse.get_pos() + pos = showtext(win, pos, p, bgcolor, (255, 255, 55)) + + pos = showtext(win, (330, 60), 'Last Keypress', (255, 255, 255), bgcolor) + if LastKey: + p = '%d, %s' % (LastKey, key.name(LastKey)) + else: + p = 'None' + pos = showtext(win, pos, p, bgcolor, (255, 255, 55)) + + pos = showtext(win, (10, 90), 'Input Grabbed', (255, 255, 255), bgcolor) + win.blit(ImgOnOff[event.get_grab()], pos) + + +def drawhistory(win, history): + win.blit(Font.render('Event History Area', 1, (155, 155, 155), (0,0,0)), (2, 132)) + ypos = 450 + h = list(history) + h.reverse() + for line in h: + r = win.blit(line, (10, ypos)) + win.fill(0, (r.right, r.top, 620, r.height)) + ypos -= Font.get_height() + + +def main(): + init() + + win = display.set_mode((640, 480), RESIZABLE) + display.set_caption("Mouse Focus Workout") + + global Font + Font = font.Font(None, 26) + + global ImgOnOff + ImgOnOff.append(Font.render("Off", 1, (0, 0, 0), (255, 50, 50))) + ImgOnOff.append(Font.render("On", 1, (0, 0, 0), (50, 255, 50))) + + history = [] + + #let's turn on the joysticks just so we can play with em + for x in range(joystick.get_count()): + j = joystick.Joystick(x) + j.init() + txt = 'Enabled joystick: ' + j.get_name() + img = Font.render(txt, 1, (50, 200, 50), (0, 0, 0)) + history.append(img) + if not joystick.get_count(): + img = Font.render('No Joysticks to Initialize', 1, (50, 200, 50), (0, 0, 0)) + history.append(img) + + going = True + while going: + for e in event.get(): + if e.type == QUIT: + going = False + if e.type == KEYDOWN: + if e.key == K_ESCAPE: + going = False + else: + global LastKey + LastKey = e.key + if e.type == MOUSEBUTTONDOWN: + event.set_grab(1) + elif e.type == MOUSEBUTTONUP: + event.set_grab(0) + if e.type == VIDEORESIZE: + win = display.set_mode(e.size, RESIZABLE) + + if e.type != MOUSEMOTION: + txt = '%s: %s' % (event.event_name(e.type), e.dict) + img = Font.render(txt, 1, (50, 200, 50), (0, 0, 0)) + history.append(img) + history = history[-13:] + + + drawstatus(win) + drawhistory(win, history) + + display.flip() + time.wait(10) + + quit() + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/fastevents.py b/venv/Lib/site-packages/pygame/examples/fastevents.py new file mode 100644 index 0000000..07ff793 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/fastevents.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +""" This is a stress test for the fastevents module. + +*Fast events does not appear faster!* + +So far it looks like normal pygame.event is faster by up to two times. +So maybe fastevent isn't fast at all. + +Tested on windowsXP sp2 athlon, and freebsd. + +However... on my debian duron 850 machine fastevents is faster. +""" + +import pygame +from pygame import * + +# the config to try different settings out with the event queues. + +# use the fastevent module or not. +use_fast_events = 1 + +# use pygame.display.flip(). +# otherwise we test raw event processing throughput. +with_display = 1 + +# limit the game loop to 40 fps. +slow_tick = 0 + +NUM_EVENTS_TO_POST = 200000 + + + +if use_fast_events: + event_module = fastevent +else: + event_module = event + + + + +from threading import Thread + +class post_them(Thread): + def __init__(self): + Thread.__init__(self) + self.done = [] + self.stop = [] + + def run(self): + self.done = [] + self.stop = [] + for x in range(NUM_EVENTS_TO_POST): + ee = event.Event(USEREVENT) + try_post = 1 + + # the pygame.event.post raises an exception if the event + # queue is full. so wait a little bit, and try again. + while try_post: + try: + event_module.post(ee) + try_post = 0 + except: + pytime.sleep(0.001) + try_post = 1 + + if self.stop: + return + self.done.append(1) + + + +import time as pytime + +def main(): + init() + + if use_fast_events: + fastevent.init() + + c = time.Clock() + + win = display.set_mode((640, 480), RESIZABLE) + display.set_caption("fastevent Workout") + + poster = post_them() + + t1 = pytime.time() + poster.start() + + going = True + while going: +# for e in event.get(): + #for x in range(200): + # ee = event.Event(USEREVENT) + # r = event_module.post(ee) + # print (r) + + #for e in event_module.get(): + event_list = [] + event_list = event_module.get() + + for e in event_list: + if e.type == QUIT: + print (c.get_fps()) + poster.stop.append(1) + going = False + if e.type == KEYDOWN: + if e.key == K_ESCAPE: + print (c.get_fps()) + poster.stop.append(1) + going = False + if poster.done: + print (c.get_fps()) + print (c) + t2 = pytime.time() + print ("total time:%s" % (t2 - t1)) + print ("events/second:%s" % (NUM_EVENTS_TO_POST / (t2 - t1))) + going = False + if with_display: + display.flip() + if slow_tick: + c.tick(40) + + + pygame.quit() + + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/fonty.py b/venv/Lib/site-packages/pygame/examples/fonty.py new file mode 100644 index 0000000..bdd77f1 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/fonty.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +"""Here we load a .TTF font file, and display it in +a basic pygame window. It demonstrates several of the +Font object attributes. Nothing exciting in here, but +it makes a great example for basic window, event, and +font management.""" + + +import pygame +from pygame.locals import * +from pygame.compat import unichr_, unicode_ +import sys +import locale + + +if sys.version_info >= (3,): + def print_unicode(s): + e = locale.getpreferredencoding() + print (s.encode(e, 'backslashreplace').decode()) +else: + def print_unicode(s): + e = locale.getpreferredencoding() + print (s.encode(e, 'backslashreplace')) + +def main(): + #initialize + pygame.init() + resolution = 400, 200 + screen = pygame.display.set_mode(resolution) + +## pygame.mouse.set_cursor(*pygame.cursors.diamond) + + fg = 250, 240, 230 + bg = 5, 5, 5 + wincolor = 40, 40, 90 + + #fill background + screen.fill(wincolor) + + #load font, prepare values + font = pygame.font.Font(None, 80) + text = 'Fonty' + size = font.size(text) + + #no AA, no transparancy, normal + ren = font.render(text, 0, fg, bg) + screen.blit(ren, (10, 10)) + + #no AA, transparancy, underline + font.set_underline(1) + ren = font.render(text, 0, fg) + screen.blit(ren, (10, 40 + size[1])) + font.set_underline(0) + + + a_sys_font = pygame.font.SysFont("Arial", 60) + + + #AA, no transparancy, bold + a_sys_font.set_bold(1) + ren = a_sys_font.render(text, 1, fg, bg) + screen.blit(ren, (30 + size[0], 10)) + a_sys_font.set_bold(0) + + #AA, transparancy, italic + a_sys_font.set_italic(1) + ren = a_sys_font.render(text, 1, fg) + screen.blit(ren, (30 + size[0], 40 + size[1])) + a_sys_font.set_italic(0) + + + # Get some metrics. + print ("Font metrics for 'Fonty': %s" % a_sys_font.metrics (text)) + ch = unicode_("%c") % 0x3060 + msg = (unicode_("Font metrics for '%s': %s") % + (ch, a_sys_font.metrics (ch))) + print_unicode(msg) + + ## #some_japanese_unicode = u"\u304b\u3070\u306b" + ##some_japanese_unicode = unicode_('%c%c%c') % (0x304b, 0x3070, 0x306b) + + #AA, transparancy, italic + ##ren = a_sys_font.render(some_japanese_unicode, 1, fg) + ##screen.blit(ren, (30 + size[0], 40 + size[1])) + + + + + + #show the surface and await user quit + pygame.display.flip() + while 1: + #use event.wait to keep from polling 100% cpu + if pygame.event.wait().type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN): + break + + + +if __name__ == '__main__': main() + diff --git a/venv/Lib/site-packages/pygame/examples/freetype_misc.py b/venv/Lib/site-packages/pygame/examples/freetype_misc.py new file mode 100644 index 0000000..21c5f70 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/freetype_misc.py @@ -0,0 +1,103 @@ +import sys, os +import pygame +from pygame.locals import * + +try: + import pygame.freetype as freetype +except ImportError: + print ("No FreeType support compiled") + sys.exit () + +colors = { + "grey_light" : pygame.Color(200, 200, 200), + "grey_dark" : pygame.Color(100, 100, 100), + "green" : pygame.Color(50, 255, 63), + "red" : pygame.Color(220, 30, 30), + "blue" : pygame.Color(50, 75, 245) +} + +def run(): + pygame.init() + + fontdir = os.path.dirname(os.path.abspath (__file__)) + font = freetype.Font(os.path.join (fontdir, "data", "sans.ttf")) + + screen = pygame.display.set_mode((800, 600)) + screen.fill (colors["grey_light"]) + + font.underline_adjustment = 0.5 + font.pad = True + font.render_to(screen, (32, 32), "Hello World", colors["red"], + colors['grey_dark'], size=64, + style=freetype.STYLE_UNDERLINE|freetype.STYLE_OBLIQUE) + font.pad = False + + font.render_to(screen, (32, 128), "abcdefghijklm", colors["grey_dark"], + colors["green"], size=64) + + font.vertical = True + font.render_to(screen, (32, 200), "Vertical?", colors["blue"], + None, size=32) + font.vertical = False + + font.render_to(screen, (64, 190), "Let's spin!", colors["red"], + None, size=48, rotation=55) + + font.render_to(screen, (160, 290), "All around!", colors["green"], + None, size=48, rotation=-55) + + font.render_to(screen, (250, 220), "and BLEND", + pygame.Color(255, 0, 0, 128), None, size=64) + + font.render_to(screen, (265, 237), "or BLAND!", + pygame.Color(0, 0xCC, 28, 128), None, size=64) + + # Some pinwheels + font.origin = True + for angle in range(0, 360, 45): + font.render_to(screen, (150, 420), ")", pygame.Color('black'), + size=48, rotation=angle) + font.vertical = True + for angle in range(15, 375, 30): + font.render_to(screen, (600, 400), "|^*", pygame.Color('orange'), + size=48, rotation=angle) + font.vertical = False + font.origin = False + + utext = pygame.compat.as_unicode(r"I \u2665 Unicode") + font.render_to(screen, (298, 320), utext, pygame.Color(0, 0xCC, 0xDD), + None, size=64) + + utext = pygame.compat.as_unicode(r"\u2665") + font.render_to(screen, (480, 32), utext, colors["grey_light"], + colors["red"], size=148) + + font.render_to(screen, (380, 380), "...yes, this is an SDL surface", + pygame.Color(0, 0, 0), + None, size=24, style=freetype.STYLE_STRONG) + + font.origin = True + r = font.render_to(screen, (100, 530), "stretch", + pygame.Color('red'), + None, size=(24, 24), style=freetype.STYLE_NORMAL) + font.render_to(screen, (100 + r.width, 530), " VERTICAL", + pygame.Color('red'), + None, size=(24, 48), style=freetype.STYLE_NORMAL) + + r = font.render_to(screen, (100, 580), "stretch", + pygame.Color('blue'), + None, size=(24, 24), style=freetype.STYLE_NORMAL) + font.render_to(screen, (100 + r.width, 580), " HORIZONTAL", + pygame.Color('blue'), + None, size=(48, 24), style=freetype.STYLE_NORMAL) + + pygame.display.flip() + + while 1: + if pygame.event.wait().type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN): + break + + pygame.quit() + +if __name__ == "__main__": + run () diff --git a/venv/Lib/site-packages/pygame/examples/glcube.py b/venv/Lib/site-packages/pygame/examples/glcube.py new file mode 100644 index 0000000..be2d7f9 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/glcube.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python + +"""Draw a cube on the screen. every frame we orbit +the camera around by a small amount and it appears +the object is spinning. note i've setup some simple +data structures here to represent a multicolored cube, +we then go through a semi-unoptimized loop to draw +the cube points onto the screen. opengl does all the +hard work for us. :] +""" + +import pygame +from pygame.locals import * + +try: + from OpenGL.GL import * + from OpenGL.GLU import * +except ImportError: + print ('The GLCUBE example requires PyOpenGL') + raise SystemExit + + + +#some simple data for a colored cube +#here we have the 3D point position and color +#for each corner. then we have a list of indices +#that describe each face, and a list of indieces +#that describes each edge + + +CUBE_POINTS = ( + (0.5, -0.5, -0.5), (0.5, 0.5, -0.5), + (-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), + (0.5, -0.5, 0.5), (0.5, 0.5, 0.5), + (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5) +) + +#colors are 0-1 floating values +CUBE_COLORS = ( + (1, 0, 0), (1, 1, 0), (0, 1, 0), (0, 0, 0), + (1, 0, 1), (1, 1, 1), (0, 0, 1), (0, 1, 1) +) + +CUBE_QUAD_VERTS = ( + (0, 1, 2, 3), (3, 2, 7, 6), (6, 7, 5, 4), + (4, 5, 1, 0), (1, 5, 7, 2), (4, 0, 3, 6) +) + +CUBE_EDGES = ( + (0,1), (0,3), (0,4), (2,1), (2,3), (2,7), + (6,3), (6,4), (6,7), (5,1), (5,4), (5,7), +) + + + +def drawcube(): + "draw the cube" + allpoints = list(zip(CUBE_POINTS, CUBE_COLORS)) + + glBegin(GL_QUADS) + for face in CUBE_QUAD_VERTS: + for vert in face: + pos, color = allpoints[vert] + glColor3fv(color) + glVertex3fv(pos) + glEnd() + + glColor3f(1.0, 1.0, 1.0) + glBegin(GL_LINES) + for line in CUBE_EDGES: + for vert in line: + pos, color = allpoints[vert] + glVertex3fv(pos) + + glEnd() + +def init_gl_stuff(): + + glEnable(GL_DEPTH_TEST) #use our zbuffer + + #setup the camera + glMatrixMode(GL_PROJECTION) + glLoadIdentity() + gluPerspective(45.0,640/480.0,0.1,100.0) #setup lens + glTranslatef(0.0, 0.0, -3.0) #move back + glRotatef(25, 1, 0, 0) #orbit higher + +def main(): + "run the demo" + #initialize pygame and setup an opengl display + pygame.init() + + fullscreen = True + pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF|FULLSCREEN) + + init_gl_stuff() + + going = True + while going: + #check for quit'n events + events = pygame.event.get() + for event in events: + if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): + going = False + + elif event.type == KEYDOWN: + if event.key == pygame.K_f: + if not fullscreen: + print("Changing to FULLSCREEN") + pygame.display.set_mode((640, 480), OPENGL | DOUBLEBUF | FULLSCREEN) + else: + print("Changing to windowed mode") + pygame.display.set_mode((640, 480), OPENGL | DOUBLEBUF) + fullscreen = not fullscreen + init_gl_stuff() + + + #clear screen and move camera + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) + + #orbit camera around by 1 degree + glRotatef(1, 0, 1, 0) + + drawcube() + pygame.display.flip() + pygame.time.wait(10) + + +if __name__ == '__main__': main() diff --git a/venv/Lib/site-packages/pygame/examples/headless_no_windows_needed.py b/venv/Lib/site-packages/pygame/examples/headless_no_windows_needed.py new file mode 100644 index 0000000..ac39662 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/headless_no_windows_needed.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +"""How to use pygame with no windowing system, like on headless servers. + +Thumbnail generation with scaling is an example of what you can do with pygame. +NOTE: the pygame scale function uses mmx/sse if available, and can be run + in multiple threads. + +""" +useage = """-scale inputimage outputimage new_width new_height +eg. -scale in.png out.png 50 50 + +""" + +import os, sys + +# set SDL to use the dummy NULL video driver, +# so it doesn't need a windowing system. +os.environ["SDL_VIDEODRIVER"] = "dummy" + + +import pygame.transform + + +if 1: + #some platforms need to init the display for some parts of pygame. + import pygame.display + pygame.display.init() + screen = pygame.display.set_mode((1,1)) + + + +def scaleit(fin, fout, w, h): + i = pygame.image.load(fin) + + if hasattr(pygame.transform, "smoothscale"): + scaled_image = pygame.transform.smoothscale(i, (w,h)) + else: + scaled_image = pygame.transform.scale(i, (w,h)) + pygame.image.save(scaled_image, fout) + +def main(fin, fout, w, h): + """smoothscale image file named fin as fout with new size (w,h)""" + scaleit(fin, fout, w, h) + +if __name__ == "__main__": + if "-scale" in sys.argv: + fin, fout, w, h = sys.argv[2:] + w, h = map(int, [w,h]) + main(fin, fout, w,h) + else: + print (useage) + + + + diff --git a/venv/Lib/site-packages/pygame/examples/liquid.py b/venv/Lib/site-packages/pygame/examples/liquid.py new file mode 100644 index 0000000..6bfad0d --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/liquid.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +"""This examples demonstrates a simplish water effect of an +image. It attempts to create a hardware display surface that +can use pageflipping for faster updates. Note that the colormap +from the loaded GIF image is copied to the colormap for the +display surface. + +This is based on the demo named F2KWarp by Brad Graham of Freedom2000 +done in BlitzBasic. I was just translating the BlitzBasic code to +pygame to compare the results. I didn't bother porting the text and +sound stuff, that's an easy enough challenge for the reader :]""" + +import pygame, os +from pygame.locals import * +from math import sin +import time + +main_dir = os.path.split(os.path.abspath(__file__))[0] + +def main(): + #initialize and setup screen + pygame.init() + screen = pygame.display.set_mode((640, 480), HWSURFACE|DOUBLEBUF) + + #load image and quadruple + imagename = os.path.join(main_dir, 'data', 'liquid.bmp') + bitmap = pygame.image.load(imagename) + bitmap = pygame.transform.scale2x(bitmap) + bitmap = pygame.transform.scale2x(bitmap) + + #get the image and screen in the same format + if screen.get_bitsize() == 8: + screen.set_palette(bitmap.get_palette()) + else: + bitmap = bitmap.convert() + + #prep some variables + anim = 0.0 + + #mainloop + xblocks = range(0, 640, 20) + yblocks = range(0, 480, 20) + stopevents = QUIT, KEYDOWN, MOUSEBUTTONDOWN + while 1: + for e in pygame.event.get(): + if e.type in stopevents: + return + + anim = anim + 0.02 + for x in xblocks: + xpos = (x + (sin(anim + x * .01) * 15)) + 20 + for y in yblocks: + ypos = (y + (sin(anim + y * .01) * 15)) + 20 + screen.blit(bitmap, (x, y), (xpos, ypos, 20, 20)) + + pygame.display.flip() + time.sleep(0.01) + + +if __name__ == '__main__': main() + + + +"""BTW, here is the code from the BlitzBasic example this was derived +from. i've snipped the sound and text stuff out. +----------------------------------------------------------------- +; Brad@freedom2000.com + +; Load a bmp pic (800x600) and slice it into 1600 squares +Graphics 640,480 +SetBuffer BackBuffer() +bitmap$="f2kwarp.bmp" +pic=LoadAnimImage(bitmap$,20,15,0,1600) + +; use SIN to move all 1600 squares around to give liquid effect +Repeat +f=0:w=w+10:If w=360 Then w=0 +For y=0 To 599 Step 15 +For x = 0 To 799 Step 20 +f=f+1:If f=1600 Then f=0 +DrawBlock pic,(x+(Sin(w+x)*40))/1.7+80,(y+(Sin(w+y)*40))/1.7+60,f +Next:Next:Flip:Cls +Until KeyDown(1) +""" diff --git a/venv/Lib/site-packages/pygame/examples/macosx/__pycache__/macfont.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/macosx/__pycache__/macfont.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdb5c928e501b2a19de25984c5df167a68231f4c GIT binary patch literal 5225 zcmbtYNpl;=6`mCs3^#BUwR$8=PT1gLqv%4o*f1YEGW{YS zXCphtx4O8?_0B|B(>1PdPj;r*Xjk{Ad6A8=;*sIc@R`m9Hs00oex@^<_1J`e5u;0N zk~wUOO?NH-GN0~T;g{J=*8pbLzo7cG>s8u+?_+-PTRnMy?;a>!>%7+09%x^@?R(tY zzRqtDFUgy#|GMJKK>sGcmGzn9UtHF{)n6FTwHMz%*O*b!N|z4)4U}VuKS1!?(K3fZiLJWy}8xZC2ylqm)=Gc^V?onXC8}^W*qK&k@TXv8+z+u z5>>tC{$^Oi(x}cFyK~-S=`mhw)DtN}$rCT(UvUw}USq?PTijiuEgS3Gyehp=N)fHM zfHmip8*(eEZ+d*M8cFIzb#DtS-S&Xsf?_S)!ET|qDR?M>7S@_E2Zy4^Mn?a(2Xb|( z_;nTgwXhy;@){=R++#ARa!F71Hv#gMme>fZykw>BdK}3h6e8SDhlx^^>AC+Lj<;p@MZV2D4#yk|NpXP(0){285 zHDg{+ZP|iQ{F_z6dmhQH2mGt3%2zlGAU0kP*5eir!nnB=Vnr=%mW+APxnJE1MeVI-SltOX zp)<^oDfFA3j*_)nSZySG)R0Ezn)_)X*yK{3U{4ptu1UQ5Rw zU@0eP)6|UWGA))X_ah03Jg&i7R(LbD!#HkK{Xa$ZNRlYC*Cd1GIIQy|$PD9o#CWg! zDB9c#)+3oLb5T*|86>KqiDfdQU@J`KmGq;8b_qqGq+fvuc^RS$*7xBJKwoL>_P5Gb z`qSk~Pn!?#E6J%vuw5&O4!H01w@&Tdh{>%qx5dGaRO-yY7@c;4B!Bj(*D#-uTr_=D z7njghY0&?XC4Ph_`5J(02)ddIxW+e{Z!(ivXf0;599o;@nS(Z`0;uNav+(IVY=n(s zzCZyIt;@#Q1ll14!zr}GY?{rW9bp&PEZR|o;7e%7*lX+xyNXa;WY?fY4^F$EPzJTagf>pO~UD-Ej~UGy4ABX*x0%(PW9EiA18iw_EQMn$A?9RWjdDl0rhuJOQSNKn zQ#66=pl5fLSnH!07f!}Xuy*+%e=B+GR&p!xEhRWuMo(@fSKI)X;xz&ufhz>A5}?xy zvd+|Q3V5kMwGOG{=#tk+l211(WcuUDxtXA3h+DMw4FV*-69*7CF}#f@nFY{Pz%g_K zL1#iQ0=k$f8V3^t0T1*x5HW>+3QY@m5=vTd++M&h>1EI+mVGBos+{bhq-V^WH=eDeC`gei9Q2@jF^o{%mu{^PWVX!8t7-aAEnvVZDR@6S-DqpM?6 zMn=>#y1G)|D-P<=W~8|JQS0|EaMwtE0#~-Y>!l+TWSd9T|Xl2EFwNQ z#l}F*#76e|3?r{RuZK-uabBg^NQQA#efTO;+3S~+qF|=nMlUO~eFd3eVwqwM#g~sy z5t=%!#6H5yNuAf?^;e&2gvhn}@$J)7^rlbK8(<7BZ_?#JpXA#rlxRDqn5A9-Gooav z7lV}%t5`sO+Vf*Sm&Mz2uADmXO=Vfj#10)sQ~rAr9{ULY4>umRRZ*kQO<@r9&okr_ zy-c^yu#Tmj`Zdej7QKnkMzjunpioi z_8Y@pZEqOZGmkxsv}Zft8SiS$L^bg@InlP|q@22sESEAc%Dy(OBkRzS)14VPy?p`L zvt126l(c^~+BS19YJfu*HSB5}7UZQi;a+YRkg2&{Q{C`R=ZdOcD7p{hLhI>O)6RFk z|4>Xo3}O->!t(>b59mQ^f-W@_S&rOq@@j+eYeFi7bs6FA2@}77;uxZ*lCiK3QK+sGJ!+oXW@-wQIeL=n z;rTd{6Do75V#9=z849bTx?@m%Hi|T9)SN)AHmqMVeyUID2cvx-%9f$P7I(3zG@c@n zr6d>isf$9j!CEo(hlAinD~z)@;wL~=@m0J@y`K@F1Wmj}V2;4g3A|0<7X+vT6z>pF z$unK(r%s^qEUI{ajL|?+D^PZ9Py!YOzM0 z3(|vc5j(y`-&4|Ds|lh!wbeJ7)IKw5dA;GtP_w4biZ-27*`)A9kxx@E;=aXQu zvM|5A_%dat&Ig(O+$(@gLNUQI>5Bo`;jFSv$8a6jDt_jwITtqT>Xu6CDXn*mqJ9(O F{{WZH^kV=3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist new file mode 100644 index 0000000..6e7346a --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist @@ -0,0 +1,8 @@ + + + + + JavaSourceSubpath + _MainMenu_EOArchive_English.java + + diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java new file mode 100644 index 0000000..558bc78 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java @@ -0,0 +1,68 @@ +// _MainMenu_EOArchive_English.java +// Generated by EnterpriseObjects palette at Tuesday, March 2, 2004 8:45:51 PM America/New_York + +import com.webobjects.eoapplication.*; +import com.webobjects.eocontrol.*; +import com.webobjects.eointerface.*; +import com.webobjects.eointerface.swing.*; +import com.webobjects.foundation.*; +import javax.swing.*; + +public class _MainMenu_EOArchive_English extends com.webobjects.eoapplication.EOArchive { + PygameAppDelegate _pygameAppDelegate0; + + public _MainMenu_EOArchive_English(Object owner, NSDisposableRegistry registry) { + super(owner, registry); + } + + protected void _construct() { + Object owner = _owner(); + EOArchive._ObjectInstantiationDelegate delegate = (owner instanceof EOArchive._ObjectInstantiationDelegate) ? (EOArchive._ObjectInstantiationDelegate)owner : null; + Object replacement; + + super._construct(); + + + if ((delegate != null) && ((replacement = delegate.objectForOutletPath(this, "delegate")) != null)) { + _pygameAppDelegate0 = (replacement == EOArchive._ObjectInstantiationDelegate.NullObject) ? null : (PygameAppDelegate)replacement; + _replacedObjects.setObjectForKey(replacement, "_pygameAppDelegate0"); + } else { + _pygameAppDelegate0 = (PygameAppDelegate)_registered(new PygameAppDelegate(), "PygameAppDelegate"); + } + } + + protected void _awaken() { + super._awaken(); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "unhideAllApplications", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "hide", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "hideOtherApplications", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "orderFrontStandardAboutPanel", ), "")); + + if (_replacedObjects.objectForKey("_pygameAppDelegate0") == null) { + _connect(_owner(), _pygameAppDelegate0, "delegate"); + } + + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "terminate", ), "")); + } + + protected void _init() { + super._init(); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "undo", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "paste", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "arrangeInFront", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "copy", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "showHelp", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "clearRecentDocuments", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "selectAll", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "performMiniaturize", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "toggleContinuousSpellChecking", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "print", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "cut", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "runPageLayout", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "checkSpelling", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "delete", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "redo", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "performClose", ), "")); + .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "showGuessPanel", ), "")); + } +} diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib new file mode 100644 index 0000000..1c6603e --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,13 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {}; + CLASS = PygameAppDelegate; + LANGUAGE = ObjC; + OUTLETS = {}; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 0000000..7d93905 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,21 @@ + + + + + IBDocumentLocation + 269 494 356 240 0 0 1600 1002 + IBEditorPositions + + 29 + 125 344 278 44 0 0 1600 1002 + + IBFramework Version + 349.0 + IBOpenObjects + + 29 + + IBSystem Version + 7D24 + + diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/keyedobjects.nib b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..8ef64c01b9601afcbef17deafd8a64ce0a99dd93 GIT binary patch literal 9442 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/README.txt b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/README.txt new file mode 100644 index 0000000..29573e6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/README.txt @@ -0,0 +1,17 @@ +********************************************************************* + THESE INSTRUCTIONS ARE ONLY FOR MAC OS X 10.3, AND WILL ONLY CREATE + STANDALONE BUNDLES FOR MAC OS X 10.3. THERE IS NO SUPPORT FOR + MAC OS X 10.2. + +Also works on 10.4 and 10.5 +********************************************************************* + + +Install py2app and its dependencies. + +easy_install py2app + + + +To create the bundle: + python setup.py py2app diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/__pycache__/aliens.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/__pycache__/aliens.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67789cb638e49b39e90259129acf9476f2f41242 GIT binary patch literal 8283 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 Gqx>I{q35Fj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/__pycache__/setup.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/__pycache__/setup.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fa92df638a7f3e9bc688ee3375c7abeab17c312 GIT binary patch literal 708 zcmX|8&5qMB5Kf$*W<$F|NL*GNa_xceb3!YG*e+dE35rD7MY5ueys?|Qo5YswNNwJs z?*K<0fmg|u6R)r*CT+twneluxnSA~{8I3{I59MutjZ( z3cExY+1=hL9PCgRyVS!T^O+0FqyCRU7jyK}W-cAjVCUn2A$mf?95J6hVgViQP;S%F zuAAd5tnq0x4Huc>(nL$4qPvWUW(4|`+|U*NMoTdagKH%w_Rs)bR&6hG~2ADNj|OL2ss^zd}Uvf7Y482TTZQC1ng zREQX>d^ z_fTD)C)XOzn|v2*!|sy{DL=q}lTRWeMe>c6GLhSCMO67*lI))3APFFy&VA_RPD+vq vy-5zIN`Z2EEG7MIw!zy{(7Isne4wD8fphJl9U#|s5wZ_!2r+Pw?K}Sfga6j- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/aliens.py b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/aliens.py new file mode 100644 index 0000000..5a23e41 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/aliens.py @@ -0,0 +1,325 @@ +#! /usr/bin/env python + +import random, os.path + +#import basic pygame modules +import pygame +from pygame.locals import * + +#see if we can load more than standard BMP +if not pygame.image.get_extended(): + raise SystemExit("Sorry, extended image module required") + + +#game constants +MAX_SHOTS = 2 #most player bullets onscreen +ALIEN_ODDS = 22 #chances a new alien appears +BOMB_ODDS = 60 #chances a new bomb will drop +ALIEN_RELOAD = 12 #frames between new aliens +SCREENRECT = Rect(0, 0, 640, 480) +SCORE = 0 + + +def load_image(file): + "loads an image, prepares it for play" + file = os.path.join('data', file) + try: + surface = pygame.image.load(file) + except pygame.error: + raise SystemExit('Could not load image "%s" %s'%(file, pygame.get_error())) + return surface.convert() + +def load_images(*files): + imgs = [] + for file in files: + imgs.append(load_image(file)) + return imgs + + +class dummysound: + def play(self): pass + +def load_sound(file): + if not pygame.mixer: return dummysound() + file = os.path.join('data', file) + try: + sound = pygame.mixer.Sound(file) + return sound + except pygame.error: + print ('Warning, unable to load,', file) + return dummysound() + + + +# each type of game object gets an init and an +# update function. the update function is called +# once per frame, and it is when each object should +# change it's current position and state. the Player +# object actually gets a "move" function instead of +# update, since it is passed extra information about +# the keyboard + + +class Player(pygame.sprite.Sprite): + speed = 10 + bounce = 24 + gun_offset = -11 + images = [] + def __init__(self): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect() + self.reloading = 0 + self.rect.centerx = SCREENRECT.centerx + self.rect.bottom = SCREENRECT.bottom - 1 + self.origtop = self.rect.top + self.facing = -1 + + def move(self, direction): + if direction: self.facing = direction + self.rect.move_ip(direction*self.speed, 0) + self.rect = self.rect.clamp(SCREENRECT) + if direction < 0: + self.image = self.images[0] + elif direction > 0: + self.image = self.images[1] + self.rect.top = self.origtop - (self.rect.left/self.bounce%2) + + def gunpos(self): + pos = self.facing*self.gun_offset + self.rect.centerx + return pos, self.rect.top + + +class Alien(pygame.sprite.Sprite): + speed = 13 + animcycle = 12 + images = [] + def __init__(self): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect() + self.facing = random.choice((-1,1)) * Alien.speed + self.frame = 0 + if self.facing < 0: + self.rect.right = SCREENRECT.right + + def update(self): + self.rect.move_ip(self.facing, 0) + if not SCREENRECT.contains(self.rect): + self.facing = -self.facing; + self.rect.top = self.rect.bottom + 1 + self.rect = self.rect.clamp(SCREENRECT) + self.frame = self.frame + 1 + self.image = self.images[self.frame/self.animcycle%3] + + +class Explosion(pygame.sprite.Sprite): + defaultlife = 12 + animcycle = 3 + images = [] + def __init__(self, actor): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect() + self.life = self.defaultlife + self.rect.center = actor.rect.center + + def update(self): + self.life = self.life - 1 + self.image = self.images[self.life/self.animcycle%2] + if self.life <= 0: self.kill() + + +class Shot(pygame.sprite.Sprite): + speed = -11 + images = [] + def __init__(self, pos): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect() + self.rect.midbottom = pos + + def update(self): + self.rect.move_ip(0, self.speed) + if self.rect.top <= 0: + self.kill() + + +class Bomb(pygame.sprite.Sprite): + speed = 9 + images = [] + def __init__(self, alien): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect() + self.rect.centerx = alien.rect.centerx + self.rect.bottom = alien.rect.bottom + 5 + + def update(self): + self.rect.move_ip(0, self.speed) + if self.rect.bottom >= 470: + Explosion(self) + self.kill() + + +class Score(pygame.sprite.Sprite): + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.font = pygame.font.Font(None, 20) + self.font.set_italic(1) + self.color = Color('white') + self.lastscore = -1 + self.update() + self.rect = self.image.get_rect().move(10, 450) + + def update(self): + if SCORE != self.lastscore: + self.lastscore = SCORE + msg = "Score: %d" % SCORE + self.image = self.font.render(msg, 0, self.color) + + + +def main(winstyle = 0): + # Initialize pygame + pygame.init() + if pygame.mixer and not pygame.mixer.get_init(): + print ('Warning, no sound') + pygame.mixer = None + + # Set the display mode + winstyle = 0 # |FULLSCREEN + bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32) + screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth) + + #Load images, assign to sprite classes + #(do this before the classes are used, after screen setup) + img = load_image('player1.gif') + Player.images = [img, pygame.transform.flip(img, 1, 0)] + img = load_image('explosion1.gif') + Explosion.images = [img, pygame.transform.flip(img, 1, 1)] + Alien.images = load_images('alien1.gif', 'alien2.gif', 'alien3.gif') + Bomb.images = [load_image('bomb.gif')] + Shot.images = [load_image('shot.gif')] + + #decorate the game window + icon = pygame.transform.scale(Alien.images[0], (32, 32)) + pygame.display.set_icon(icon) + pygame.display.set_caption('Pygame Aliens') + pygame.mouse.set_visible(0) + + #create the background, tile the bgd image + bgdtile = load_image('background.gif') + background = pygame.Surface(SCREENRECT.size) + for x in range(0, SCREENRECT.width, bgdtile.get_width()): + background.blit(bgdtile, (x, 0)) + screen.blit(background, (0,0)) + pygame.display.flip() + + #load the sound effects + boom_sound = load_sound('boom.wav') + shoot_sound = load_sound('car_door.wav') + if pygame.mixer and pygame.mixer.music: + music = os.path.join('data', 'house_lo.wav') + pygame.mixer.music.load(music) + pygame.mixer.music.play(-1) + + # Initialize Game Groups + aliens = pygame.sprite.Group() + shots = pygame.sprite.Group() + bombs = pygame.sprite.Group() + all = pygame.sprite.RenderUpdates() + lastalien = pygame.sprite.GroupSingle() + + #assign default groups to each sprite class + Player.containers = all + Alien.containers = aliens, all, lastalien + Shot.containers = shots, all + Bomb.containers = bombs, all + Explosion.containers = all + Score.containers = all + + #Create Some Starting Values + global score + alienreload = ALIEN_RELOAD + kills = 0 + clock = pygame.time.Clock() + + #initialize our starting sprites + global SCORE + player = Player() + Alien() #note, this 'lives' because it goes into a sprite group + if pygame.font: + all.add(Score()) + + + while player.alive(): + + #get input + for event in pygame.event.get(): + if event.type == QUIT or \ + (event.type == KEYDOWN and event.key == K_ESCAPE): + return + keystate = pygame.key.get_pressed() + + # clear/erase the last drawn sprites + all.clear(screen, background) + + #update all the sprites + all.update() + + #handle player input + direction = keystate[K_RIGHT] - keystate[K_LEFT] + player.move(direction) + firing = keystate[K_SPACE] + if not player.reloading and firing and len(shots) < MAX_SHOTS: + Shot(player.gunpos()) + shoot_sound.play() + player.reloading = firing + + # Create new alien + if alienreload: + alienreload = alienreload - 1 + elif not int(random.random() * ALIEN_ODDS): + Alien() + alienreload = ALIEN_RELOAD + + # Drop bombs + if lastalien and not int(random.random() * BOMB_ODDS): + Bomb(lastalien.sprite) + + # Detect collisions + for alien in pygame.sprite.spritecollide(player, aliens, 1): + boom_sound.play() + Explosion(alien) + Explosion(player) + SCORE = SCORE + 1 + player.kill() + + for alien in pygame.sprite.groupcollide(shots, aliens, 1, 1).keys(): + boom_sound.play() + Explosion(alien) + SCORE = SCORE + 1 + + for bomb in pygame.sprite.spritecollide(player, bombs, 1): + boom_sound.play() + Explosion(player) + Explosion(bomb) + player.kill() + + #draw the scene + dirty = all.draw(screen) + pygame.display.update(dirty) + + #cap the framerate + clock.tick(40) + + if pygame.mixer and pygame.mixer.music: + pygame.mixer.music.fadeout(1000) + pygame.time.wait(1000) + + + +#call the "main" function if running this script +if __name__ == '__main__': main() + diff --git a/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/setup.py b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/setup.py new file mode 100644 index 0000000..4c45283 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/aliens_app_example/setup.py @@ -0,0 +1,28 @@ +""" +Script for building the example. + +Usage: + python setup.py py2app +""" +from distutils.core import setup +import py2app + +NAME = 'aliens' +VERSION = '0.1' + +plist = dict( + CFBundleIconFile=NAME, + CFBundleName=NAME, + CFBundleShortVersionString=VERSION, + CFBundleGetInfoString=' '.join([NAME, VERSION]), + CFBundleExecutable=NAME, + CFBundleIdentifier='org.pygame.examples.aliens', +) + +setup( + data_files=['English.lproj', '../../data'], + app=[ + #dict(script="aliens_bootstrap.py", plist=plist), + dict(script="aliens.py", plist=plist), + ], +) diff --git a/venv/Lib/site-packages/pygame/examples/macosx/macfont.py b/venv/Lib/site-packages/pygame/examples/macosx/macfont.py new file mode 100644 index 0000000..cce23ce --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/macosx/macfont.py @@ -0,0 +1,136 @@ +""" +EXPERIMENTAL CODE! + +Here we load a .TTF font file, and display it in +a basic pygame window. It demonstrates several of the +Font object attributes. Nothing exciting in here, but +it makes a great example for basic window, event, and +font management. +""" + + +import pygame +import math +from pygame.locals import * +from pygame import Surface +from pygame.surfarray import blit_array, make_surface, pixels3d, pixels2d +import Numeric + +from Foundation import * +from AppKit import * + +def _getColor(color=None): + if color is None: + return NSColor.clearColor() + div255 = (0.00390625).__mul__ + if len(color) == 3: + color = tuple(color) + (255.0,) + return NSColor.colorWithDeviceRed_green_blue_alpha_(*map(div255, color)) + +def _getBitmapImageRep(size, hasAlpha=True): + width, height = map(int, size) + return NSBitmapImageRep.alloc().initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel_(None, width, height, 8, 4, hasAlpha, False, NSDeviceRGBColorSpace, width*4, 32) + +class SysFont(object): + def __init__(self, name, size): + self._font = NSFont.fontWithName_size_(name, size) + self._isBold = False + self._isOblique = False + self._isUnderline = False + self._family = name + self._size = size + self._setupFont() + + def _setupFont(self): + name = self._family + if self._isBold or self._isOblique: + name = '%s-%s%s' % ( + name, + self._isBold and 'Bold' or '', + self._isOblique and 'Oblique' or '') + self._font = NSFont.fontWithName_size_(name, self._size) + print (name, self._font) + if self._font is None: + if self._isBold: + self._font = NSFont.boldSystemFontOfSize(self._size) + else: + self._font = NSFont.systemFontOfSize_(self._size) + + def get_ascent(self): + return self._font.ascender() + + def get_descent(self): + return -self._font.descender() + + def get_bold(self): + return self._isBold + + def get_height(self): + return self._font.defaultLineHeightForFont() + + def get_italic(self): + return self._isOblique + + def get_linesize(self): + pass + + def get_underline(self): + return self._isUnderline + + def set_bold(self, isBold): + if isBold != self._isBold: + self._isBold = isBold + self._setupFont() + + def set_italic(self, isOblique): + if isOblique != self._isOblique: + self._isOblique = isOblique + self._setupFont() + + def set_underline(self, isUnderline): + self._isUnderline = isUnderline + + def size(self, text): + return tuple(map(int,map(math.ceil, NSString.sizeWithAttributes_(text, { + NSFontAttributeName: self._font, + NSUnderlineStyleAttributeName: self._isUnderline and 1.0 or None, + })))) + + def render(self, text, antialias, forecolor, backcolor=(0,0,0,255)): + size = self.size(text) + img = NSImage.alloc().initWithSize_(size) + img.lockFocus() + + NSString.drawAtPoint_withAttributes_(text, (0.0, 0.0), { + NSFontAttributeName: self._font, + NSUnderlineStyleAttributeName: self._isUnderline and 1.0 or None, + NSBackgroundColorAttributeName: backcolor and _getColor(backcolor) or None, + NSForegroundColorAttributeName: _getColor(forecolor), + }) + + rep = NSBitmapImageRep.alloc().initWithFocusedViewRect_(((0.0, 0.0), size)) + img.unlockFocus() + if rep.samplesPerPixel() == 4: + s = Surface(size, SRCALPHA|SWSURFACE, 32, [-1<<24,0xff<<16,0xff<<8,0xff]) + + a = Numeric.reshape(Numeric.fromstring(rep.bitmapData(), typecode=Numeric.Int32), (size[1], size[0])) + blit_array(s, Numeric.swapaxes(a,0,1)) + return s.convert_alpha() + +if __name__=='__main__': + pygame.init() + screen = pygame.display.set_mode((600, 600)) + s = SysFont('Gill Sans', 36) + s.set_italic(1) + s.set_underline(1) + done = False + surf = s.render('OS X Fonts!', True, (255,0,0,255), (0,0,0,0)) + screen.blit(surf, (0,0)) + screen.blit(surf, (2, 2)) + pygame.display.update() + while not done: + + for e in pygame.event.get(): + if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE): + done = True + break diff --git a/venv/Lib/site-packages/pygame/examples/mask.py b/venv/Lib/site-packages/pygame/examples/mask.py new file mode 100644 index 0000000..c7067ac --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/mask.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python +"""A pgyame.mask collition detection example + +exports main() + +This module can also be run as a stand-alone program, excepting +one or more image file names as command line arguments. + +""" + +import sys, random +import pygame, pygame.image, pygame.surface, pygame.time, pygame.display + +def maskFromSurface(surface, threshold = 127): + #return pygame.mask.from_surface(surface, threshold) + + mask = pygame.mask.Mask(surface.get_size()) + key = surface.get_colorkey() + if key: + for y in range(surface.get_height()): + for x in range(surface.get_width()): + if surface.get_at((x,y)) != key: + mask.set_at((x,y),1) + else: + for y in range(surface.get_height()): + for x in range (surface.get_width()): + if surface.get_at((x,y))[3] > threshold: + mask.set_at((x,y),1) + return mask + +def vadd(x,y): + return [x[0]+y[0],x[1]+y[1]] + +def vsub(x,y): + return [x[0]-y[0],x[1]-y[1]] + +def vdot(x,y): + return x[0]*y[0]+x[1]*y[1] + +class Sprite: + def __init__(self, surface, mask = None): + self.surface = surface + if mask: + self.mask = mask + else: + self.mask = maskFromSurface(self.surface) + self.setPos([0,0]) + self.setVelocity([0,0]) + + def setPos(self,pos): + self.pos = [pos[0],pos[1]] + def setVelocity(self,vel): + self.vel = [vel[0],vel[1]] + def move(self,dr): + self.pos = vadd(self.pos,dr) + def kick(self,impulse): + self.vel[0] += impulse[0] + self.vel[1] += impulse[1] + + def collide(self,s): + """Test if the sprites are colliding and + resolve the collision in this case.""" + offset = [int(x) for x in vsub(s.pos,self.pos)] + overlap = self.mask.overlap_area(s.mask,offset) + if overlap == 0: + return + """Calculate collision normal""" + nx = (self.mask.overlap_area(s.mask,(offset[0]+1,offset[1])) - + self.mask.overlap_area(s.mask,(offset[0]-1,offset[1]))) + ny = (self.mask.overlap_area(s.mask,(offset[0],offset[1]+1)) - + self.mask.overlap_area(s.mask,(offset[0],offset[1]-1))) + if nx == 0 and ny == 0: + """One sprite is inside another""" + return + n = [nx,ny] + dv = vsub(s.vel,self.vel) + J = vdot(dv,n)/(2*vdot(n,n)) + if J > 0: + """Can scale up to 2*J here to get bouncy collisions""" + J *= 1.9 + self.kick([nx*J,ny*J]) + s.kick([-J*nx,-J*ny]) + return + """Separate the sprites""" + c1 = -overlap/vdot(n,n) + c2 = -c1/2 + self.move([c2*nx,c2*ny]) + s.move([(c1+c2)*nx,(c1+c2)*ny]) + + def update(self,dt): + self.pos[0] += dt*self.vel[0] + self.pos[1] += dt*self.vel[1] + + +def main(*args): + """Display multiple images bounce off each other using collition detection + + Positional arguments: + one or more image file names. + + This pygame.masks demo will display multiple moving sprites bouncing + off each other. More than one sprite image can be provided. + + """ + + if len(args) == 0: + raise ValueError("Require at least one image file name: non given") + print ('Press any key to quit') + screen = pygame.display.set_mode((640,480)) + images = [] + masks = [] + for impath in args: + images.append(pygame.image.load(impath).convert_alpha()) + masks.append(maskFromSurface(images[-1])) + + numtimes = 10 + import time + t1 = time.time() + for x in range(numtimes): + m = maskFromSurface(images[-1]) + t2 = time.time() + + print ("python maskFromSurface :%s" % (t2-t1)) + + t1 = time.time() + for x in range(numtimes): + m = pygame.mask.from_surface(images[-1]) + t2 = time.time() + + print ("C pygame.mask.from_surface :%s" % (t2-t1)) + + sprites = [] + for i in range(20): + j = i % len(images) + s = Sprite(images[j],masks[j]) + s.setPos((random.uniform(0,screen.get_width()), + random.uniform(0,screen.get_height()))) + s.setVelocity((random.uniform(-5,5),random.uniform(-5,5))) + sprites.append(s) + pygame.time.set_timer(pygame.USEREVENT,33) + while 1: + event = pygame.event.wait() + if event.type == pygame.QUIT: + return + elif event.type == pygame.USEREVENT: + """Do both mechanics and screen update""" + screen.fill((240,220,100)) + for i in range(len(sprites)): + for j in range(i+1,len(sprites)): + sprites[i].collide(sprites[j]) + for s in sprites: + s.update(1) + if s.pos[0] < -s.surface.get_width()-3: + s.pos[0] = screen.get_width() + elif s.pos[0] > screen.get_width()+3: + s.pos[0] = -s.surface.get_width() + if s.pos[1] < -s.surface.get_height()-3: + s.pos[1] = screen.get_height() + elif s.pos[1] > screen.get_height()+3: + s.pos[1] = -s.surface.get_height() + screen.blit(s.surface,s.pos) + pygame.display.update() + elif event.type == pygame.KEYDOWN: + return + +if __name__ == '__main__': + if len(sys.argv) < 2: + print ('Usage: mask.py [ ...]') + print ('Let many copies of IMAGE(s) bounce against each other') + print ('Press any key to quit') + else: + main(*sys.argv[1:]) + + + + diff --git a/venv/Lib/site-packages/pygame/examples/midi.py b/venv/Lib/site-packages/pygame/examples/midi.py new file mode 100644 index 0000000..41d8e5b --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/midi.py @@ -0,0 +1,822 @@ +#!/usr/bin/env python + +"""Contains an example of midi input, and a separate example of midi output. + +By default it runs the output example. +python midi.py --output +python midi.py --input + +""" + +import sys +import os + +import pygame +import pygame.midi +from pygame.locals import * + +try: # Ensure set available for output example + set +except NameError: + from sets import Set as set + + +def print_device_info(): + pygame.midi.init() + _print_device_info() + pygame.midi.quit() + +def _print_device_info(): + for i in range( pygame.midi.get_count() ): + r = pygame.midi.get_device_info(i) + (interf, name, input, output, opened) = r + + in_out = "" + if input: + in_out = "(input)" + if output: + in_out = "(output)" + + print ("%2i: interface :%s:, name :%s:, opened :%s: %s" % + (i, interf, name, opened, in_out)) + + + + +def input_main(device_id = None): + pygame.init() + pygame.fastevent.init() + event_get = pygame.fastevent.get + event_post = pygame.fastevent.post + + pygame.midi.init() + + _print_device_info() + + + if device_id is None: + input_id = pygame.midi.get_default_input_id() + else: + input_id = device_id + + print ("using input_id :%s:" % input_id) + i = pygame.midi.Input( input_id ) + + pygame.display.set_mode((1,1)) + + + + going = True + while going: + events = event_get() + for e in events: + if e.type in [QUIT]: + going = False + if e.type in [KEYDOWN]: + going = False + if e.type in [pygame.midi.MIDIIN]: + print (e) + + if i.poll(): + midi_events = i.read(10) + # convert them into pygame events. + midi_evs = pygame.midi.midis2events(midi_events, i.device_id) + + for m_e in midi_evs: + event_post( m_e ) + + del i + pygame.midi.quit() + + + +def output_main(device_id = None): + """Execute a musical keyboard example for the Church Organ instrument + + This is a piano keyboard example, with a two octave keyboard, starting at + note F3. Left mouse down over a key starts a note, left up stops it. The + notes are also mapped to the computer keyboard keys, assuming an American + English PC keyboard (sorry everyone else, but I don't know if I can map to + absolute key position instead of value.) The white keys are on the second + row, TAB to BACKSLASH, starting with note F3. The black keys map to the top + row, '1' to BACKSPACE, starting with F#3. 'r' is middle C. Close the + window or press ESCAPE to quit the program. Key velocity (note + amplitude) varies vertically on the keyboard image, with minimum velocity + at the top of a key and maximum velocity at bottom. + + Default Midi output, no device_id given, is to the default output device + for the computer. + + """ + + # A note to new pygamers: + # + # All the midi module stuff is in this function. It is unnecessary to + # understand how the keyboard display works to appreciate how midi + # messages are sent. + + # The keyboard is drawn by a Keyboard instance. This instance maps Midi + # notes to musical keyboard keys. A regions surface maps window position + # to (Midi note, velocity) pairs. A key_mapping dictionary does the same + # for computer keyboard keys. Midi sound is controlled with direct method + # calls to a pygame.midi.Output instance. + # + # Things to consider when using pygame.midi: + # + # 1) Initialize the midi module with a to pygame.midi.init(). + # 2) Create a midi.Output instance for the desired output device port. + # 3) Select instruments with set_instrument() method calls. + # 4) Play notes with note_on() and note_off() method calls. + # 5) Call pygame.midi.Quit() when finished. Though the midi module tries + # to ensure that midi is properly shut down, it is best to do it + # explicitly. A try/finally statement is the safest way to do this. + # + GRAND_PIANO = 0 + CHURCH_ORGAN = 19 + + instrument = CHURCH_ORGAN + #instrument = GRAND_PIANO + start_note = 53 # F3 (white key note), start_note != 0 + n_notes = 24 # Two octaves (14 white keys) + + bg_color = Color('slategray') + + key_mapping = make_key_mapping([K_TAB, K_1, K_q, K_2, K_w, K_3, K_e, K_r, + K_5, K_t, K_6, K_y, K_u, K_8, K_i, K_9, + K_o, K_0, K_p, K_LEFTBRACKET, K_EQUALS, + K_RIGHTBRACKET, K_BACKSPACE, K_BACKSLASH], + start_note) + + + + pygame.init() + pygame.midi.init() + + _print_device_info() + + if device_id is None: + port = pygame.midi.get_default_output_id() + else: + port = device_id + + print ("using output_id :%s:" % port) + + + + midi_out = pygame.midi.Output(port, 0) + try: + midi_out.set_instrument(instrument) + keyboard = Keyboard(start_note, n_notes) + + screen = pygame.display.set_mode(keyboard.rect.size) + screen.fill(bg_color) + pygame.display.flip() + + background = pygame.Surface(screen.get_size()) + background.fill(bg_color) + dirty_rects = [] + keyboard.draw(screen, background, dirty_rects) + pygame.display.update(dirty_rects) + + regions = pygame.Surface(screen.get_size()) # initial color (0,0,0) + keyboard.map_regions(regions) + + pygame.event.set_blocked(MOUSEMOTION) + repeat = 1 + mouse_note = 0 + on_notes = set() + while 1: + update_rects = None + e = pygame.event.wait() + if e.type == pygame.MOUSEBUTTONDOWN: + mouse_note, velocity, __, __ = regions.get_at(e.pos) + if mouse_note and mouse_note not in on_notes: + keyboard.key_down(mouse_note) + midi_out.note_on(mouse_note, velocity) + on_notes.add(mouse_note) + else: + mouse_note = 0 + elif e.type == pygame.MOUSEBUTTONUP: + if mouse_note: + midi_out.note_off(mouse_note) + keyboard.key_up(mouse_note) + on_notes.remove(mouse_note) + mouse_note = 0 + elif e.type == pygame.QUIT: + break + elif e.type == pygame.KEYDOWN: + if e.key == pygame.K_ESCAPE: + break + try: + note, velocity = key_mapping[e.key] + except KeyError: + pass + else: + if note not in on_notes: + keyboard.key_down(note) + midi_out.note_on(note, velocity) + on_notes.add(note) + elif e.type == pygame.KEYUP: + try: + note, __ = key_mapping[e.key] + except KeyError: + pass + else: + if note in on_notes and note != mouse_note: + keyboard.key_up(note) + midi_out.note_off(note, 0) + on_notes.remove(note) + + dirty_rects = [] + keyboard.draw(screen, background, dirty_rects) + pygame.display.update(dirty_rects) + finally: + del midi_out + pygame.midi.quit() + +def make_key_mapping(key_list, start_note): + """Return a dictionary of (note, velocity) by computer keyboard key code""" + + mapping = {} + for i in range(len(key_list)): + mapping[key_list[i]] = (start_note + i, 127) + return mapping + +class NullKey(object): + """A dummy key that ignores events passed to it by other keys + + A NullKey instance is the left key instance used by default + for the left most keyboard key. + + """ + + def _right_white_down(self): + pass + + def _right_white_up(self): + pass + + def _right_black_down(self): + pass + + def _right_black_up(self): + pass + +null_key = NullKey() + +def key_class(updates, image_strip, image_rects, is_white_key=True): + """Return a keyboard key widget class + + Arguments: + updates - a set into which a key instance adds itself if it needs + redrawing. + image_strip - The surface containing the images of all key states. + image_rects - A list of Rects giving the regions within image_strip that + are relevant to this key class. + is_white_key (default True) - Set false if this is a black key. + + This function automates the creation of a key widget class for the + three basic key types. A key has two basic states, up or down ( + depressed). Corresponding up and down images are drawn for each + of these two states. But to give the illusion of depth, a key + may have shadows cast upon it by the adjacent keys to its right. + These shadows change depending on the up/down state of the key and + its neighbors. So a key may support multiple images and states + depending on the shadows. A key type is determined by the length + of image_rects and the value of is_white. + + """ + + # Naming convention: Variables used by the Key class as part of a + # closure start with 'c_'. + + # State logic and shadows: + # + # A key may cast a shadow upon the key to its left. A black key casts a + # shadow on an adjacent white key. The shadow changes depending of whether + # the black or white key is depressed. A white key casts a shadow on the + # white key to its left if it is up and the left key is down. Therefore + # a keys state, and image it will draw, is determined entirely by its + # itself and the key immediately adjacent to it on the right. A white key + # is always assumed to have an adjacent white key. + # + # There can be up to eight key states, representing all permutations + # of the three fundamental states of self up/down, adjacent white + # right up/down, adjacent black up/down. + # + down_state_none = 0 + down_state_self = 1 + down_state_white = down_state_self << 1 + down_state_self_white = down_state_self | down_state_white + down_state_black = down_state_white << 1 + down_state_self_black = down_state_self | down_state_black + down_state_white_black = down_state_white | down_state_black + down_state_all = down_state_self | down_state_white_black + + # Some values used in the class. + # + c_down_state_initial = down_state_none + c_down_state_rect_initial = image_rects[0] + c_down_state_self = down_state_self + c_updates = updates + c_image_strip = image_strip + c_width, c_height = image_rects[0].size + + # A key propagates its up/down state change to the adjacent white key on + # the left by calling the adjacent key's _right_black_down or + # _right_white_down method. + # + if is_white_key: + key_color = 'white' + else: + key_color = 'black' + c_notify_down_method = "_right_%s_down" % key_color + c_notify_up_method = "_right_%s_up" % key_color + + # Images: + # + # A black key only needs two images, for the up and down states. Its + # appearance is unaffected by the adjacent keys to its right, which cast no + # shadows upon it. + # + # A white key with a no adjacent black to its right only needs three + # images, for self up, self down, and both self and adjacent white down. + # + # A white key with both a black and white key to its right needs six + # images: self up, self up and adjacent black down, self down, self and + # adjacent white down, self and adjacent black down, and all three down. + # + # Each 'c_event' dictionary maps the current key state to a new key state, + # along with corresponding image, for the related event. If no redrawing + # is required for the state change then the image rect is simply None. + # + c_event_down = {down_state_none: (down_state_self, image_rects[1])} + c_event_up = {down_state_self: (down_state_none, image_rects[0])} + c_event_right_white_down = { + down_state_none: (down_state_none, None), + down_state_self: (down_state_self, None)} + c_event_right_white_up = c_event_right_white_down.copy() + c_event_right_black_down = c_event_right_white_down.copy() + c_event_right_black_up = c_event_right_white_down.copy() + if len(image_rects) > 2: + c_event_down[down_state_white] = ( + down_state_self_white, image_rects[2]) + c_event_up[down_state_self_white] = (down_state_white, image_rects[0]) + c_event_right_white_down[down_state_none] = (down_state_white, None) + c_event_right_white_down[down_state_self] = ( + down_state_self_white, image_rects[2]) + c_event_right_white_up[down_state_white] = (down_state_none, None) + c_event_right_white_up[down_state_self_white] = ( + down_state_self, image_rects[1]) + c_event_right_black_down[down_state_white] = ( + down_state_white, None) + c_event_right_black_down[down_state_self_white] = ( + down_state_self_white, None) + c_event_right_black_up[down_state_white] = ( + down_state_white, None) + c_event_right_black_up[down_state_self_white] = ( + down_state_self_white, None) + if len(image_rects) > 3: + c_event_down[down_state_black] = ( + down_state_self_black, image_rects[4]) + c_event_down[down_state_white_black] = (down_state_all, image_rects[5]) + c_event_up[down_state_self_black] = (down_state_black, image_rects[3]) + c_event_up[down_state_all] = (down_state_white_black, image_rects[3]) + c_event_right_white_down[down_state_black] = ( + down_state_white_black, None) + c_event_right_white_down[down_state_self_black] = ( + down_state_all, image_rects[5]) + c_event_right_white_up[down_state_white_black] = ( + down_state_black, None) + c_event_right_white_up[down_state_all] = ( + down_state_self_black, image_rects[4]) + c_event_right_black_down[down_state_none] = ( + down_state_black, image_rects[3]) + c_event_right_black_down[down_state_self] = ( + down_state_self_black, image_rects[4]) + c_event_right_black_down[down_state_white] = ( + down_state_white_black, image_rects[3]) + c_event_right_black_down[down_state_self_white] = ( + down_state_all, image_rects[5]) + c_event_right_black_up[down_state_black] = ( + down_state_none, image_rects[0]) + c_event_right_black_up[down_state_self_black] = ( + down_state_self, image_rects[1]) + c_event_right_black_up[down_state_white_black] = ( + down_state_white, image_rects[0]) + c_event_right_black_up[down_state_all] = ( + down_state_self_white, image_rects[2]) + + + class Key(object): + """A key widget, maintains key state and draws the key's image + + Constructor arguments: + ident - A unique key identifier. Any immutable type suitable as a key. + posn - The location of the key on the display surface. + key_left - Optional, the adjacent white key to the left. Changes in + up and down state are propagated to that key. + + A key has an associated position and state. Related to state is the + image drawn. State changes are managed with method calls, one method + per event type. The up and down event methods are public. Other + internal methods are for passing on state changes to the key_left + key instance. + + """ + + is_white = is_white_key + + def __init__(self, ident, posn, key_left = None): + """Return a new Key instance + + The initial state is up, with all adjacent keys to the right also + up. + + """ + if key_left is None: + key_left = null_key + rect = Rect(posn[0], posn[1], c_width, c_height) + self.rect = rect + self._state = c_down_state_initial + self._source_rect = c_down_state_rect_initial + self._ident = ident + self._hash = hash(ident) + self._notify_down = getattr(key_left, c_notify_down_method) + self._notify_up = getattr(key_left, c_notify_up_method) + self._key_left = key_left + self._background_rect = Rect(rect.left, rect.bottom - 10, + c_width, 10) + c_updates.add(self) + + def down(self): + """Signal that this key has been depressed (is down)""" + + self._state, source_rect = c_event_down[self._state] + if source_rect is not None: + self._source_rect = source_rect + c_updates.add(self) + self._notify_down() + + def up(self): + """Signal that this key has been released (is up)""" + + self._state, source_rect = c_event_up[self._state] + if source_rect is not None: + self._source_rect = source_rect + c_updates.add(self) + self._notify_up() + + def _right_white_down(self): + """Signal that the adjacent white key has been depressed + + This method is for internal propagation of events between + key instances. + + """ + + self._state, source_rect = c_event_right_white_down[self._state] + if source_rect is not None: + self._source_rect = source_rect + c_updates.add(self) + + def _right_white_up(self): + """Signal that the adjacent white key has been released + + This method is for internal propagation of events between + key instances. + + """ + + self._state, source_rect = c_event_right_white_up[self._state] + if source_rect is not None: + self._source_rect = source_rect + c_updates.add(self) + + def _right_black_down(self): + """Signal that the adjacent black key has been depressed + + This method is for internal propagation of events between + key instances. + + """ + + self._state, source_rect = c_event_right_black_down[self._state] + if source_rect is not None: + self._source_rect = source_rect + c_updates.add(self) + + def _right_black_up(self): + """Signal that the adjacent black key has been released + + This method is for internal propagation of events between + key instances. + + """ + + self._state, source_rect = c_event_right_black_up[self._state] + if source_rect is not None: + self._source_rect = source_rect + c_updates.add(self) + + def __eq__(self, other): + """True if same identifiers""" + + return self._ident == other._ident + + def __hash__(self): + """Return the immutable hash value""" + + return self._hash + + def __str__(self): + """Return the key's identifier and position as a string""" + + return ("" % + (self._ident, self.rect.top, self.rect.left)) + + def draw(self, surf, background, dirty_rects): + """Redraw the key on the surface surf + + The background is redrawn. The altered region is added to the + dirty_rects list. + + """ + + surf.blit(background, self._background_rect, self._background_rect) + surf.blit(c_image_strip, self.rect, self._source_rect) + dirty_rects.append(self.rect) + + return Key + +def key_images(): + """Return a keyboard keys image strip and a mapping of image locations + + The return tuple is a surface and a dictionary of rects mapped to key + type. + + This function encapsulates the constants relevant to the keyboard image + file. There are five key types. One is the black key. The other four + white keys are determined by the proximity of the black keys. The plain + white key has no black key adjacent to it. A white-left and white-right + key has a black key to the left or right of it respectively. A white-center + key has a black key on both sides. A key may have up to six related + images depending on the state of adjacent keys to its right. + + """ + + my_dir = os.path.split(os.path.abspath(__file__))[0] + strip_file = os.path.join(my_dir, 'data', 'midikeys.png') + white_key_width = 42 + white_key_height = 160 + black_key_width = 22 + black_key_height = 94 + strip = pygame.image.load(strip_file) + names = [ + 'black none', 'black self', + 'white none', 'white self', 'white self-white', + 'white-left none', 'white-left self', 'white-left black', + 'white-left self-black', 'white-left self-white', 'white-left all', + 'white-center none', 'white-center self', + 'white-center black', 'white-center self-black', + 'white-center self-white', 'white-center all', + 'white-right none', 'white-right self', 'white-right self-white'] + rects = {} + for i in range(2): + rects[names[i]] = Rect(i * white_key_width, 0, + black_key_width, black_key_height) + for i in range(2, len(names)): + rects[names[i]] = Rect(i * white_key_width, 0, + white_key_width, white_key_height) + return strip, rects + +class Keyboard(object): + """Musical keyboard widget + + Constructor arguments: + start_note: midi note value of the starting note on the keyboard. + n_notes: number of notes (keys) on the keyboard. + + A Keyboard instance draws the musical keyboard and maintains the state of + all the keyboard keys. Individual keys can be in a down (depressed) or + up (released) state. + + """ + + _image_strip, _rects = key_images() + + white_key_width, white_key_height = _rects['white none'].size + black_key_width, black_key_height = _rects['black none'].size + + _updates = set() + + # There are five key classes, representing key shape: + # black key (BlackKey), plain white key (WhiteKey), white key to the left + # of a black key (WhiteKeyLeft), white key between two black keys + # (WhiteKeyCenter), and white key to the right of a black key + # (WhiteKeyRight). + BlackKey = key_class(_updates, + _image_strip, + [_rects['black none'], _rects['black self']], + False) + WhiteKey = key_class(_updates, + _image_strip, + [_rects['white none'], + _rects['white self'], + _rects['white self-white']]) + WhiteKeyLeft = key_class(_updates, + _image_strip, + [_rects['white-left none'], + _rects['white-left self'], + _rects['white-left self-white'], + _rects['white-left black'], + _rects['white-left self-black'], + _rects['white-left all']]) + WhiteKeyCenter = key_class(_updates, + _image_strip, + [_rects['white-center none'], + _rects['white-center self'], + _rects['white-center self-white'], + _rects['white-center black'], + _rects['white-center self-black'], + _rects['white-center all']]) + WhiteKeyRight = key_class(_updates, + _image_strip, + [_rects['white-right none'], + _rects['white-right self'], + _rects['white-right self-white']]) + + def __init__(self, start_note, n_notes): + """Return a new Keyboard instance with n_note keys""" + + self._start_note = start_note + self._end_note = start_note + n_notes - 1 + self._add_keys() + + def _add_keys(self): + """Populate the keyboard with key instances + + Set the _keys and rect attributes. + + """ + + # Keys are entered in a list, where index is Midi note. Since there are + # only 128 possible Midi notes the list length is managable. Unassigned + # note positions should never be accessed, so are set None to ensure + # the bug is quickly detected. + # + key_map = [None] * 128 + + start_note = self._start_note + end_note = self._end_note + black_offset = self.black_key_width // 2 + prev_white_key = None + x = y = 0 + if is_white_key(start_note): + is_prev_white = True + else: + x += black_offset + is_prev_white = False + for note in range(start_note, end_note + 1): + ident = note # For now notes uniquely identify keyboard keys. + if is_white_key(note): + if is_prev_white: + if note == end_note or is_white_key(note + 1): + key = self.WhiteKey(ident, (x, y), prev_white_key) + else: + key = self.WhiteKeyLeft(ident, (x, y), prev_white_key) + else: + if note == end_note or is_white_key(note + 1): + key = self.WhiteKeyRight(ident, (x, y), prev_white_key) + else: + key = self.WhiteKeyCenter(ident, + (x, y), + prev_white_key) + is_prev_white = True + x += self.white_key_width + prev_white_key = key + else: + key = self.BlackKey(ident, + (x - black_offset, y), + prev_white_key) + is_prev_white = False + key_map[note] = key + self._keys = key_map + + kb_width = key_map[self._end_note].rect.right + kb_height = self.white_key_height + self.rect = Rect(0, 0, kb_width, kb_height) + + def map_regions(self, regions): + """Draw the key regions onto surface regions. + + Regions must have at least 3 byte pixels. Each pixel of the keyboard + rectangle is set to the color (note, velocity, 0). The regions surface + must be at least as large as (0, 0, self.rect.left, self.rect.bottom) + + """ + + # First draw the white key regions. Then add the overlapping + # black key regions. + # + cutoff = self.black_key_height + black_keys = [] + for note in range(self._start_note, self._end_note + 1): + key = self._keys[note] + if key.is_white: + fill_region(regions, note, key.rect, cutoff) + else: + black_keys.append((note, key)) + for note, key in black_keys: + fill_region(regions, note, key.rect, cutoff) + + def draw(self, surf, background, dirty_rects): + """Redraw all altered keyboard keys""" + + changed_keys = self._updates + while changed_keys: + changed_keys.pop().draw(surf, background, dirty_rects) + + def key_down(self, note): + """Signal a key down event for note""" + + self._keys[note].down() + + def key_up(self, note): + """Signal a key up event for note""" + + self._keys[note].up() + +def fill_region(regions, note, rect, cutoff): + """Fill the region defined by rect with a (note, velocity, 0) color + + The velocity varies from a small value at the top of the region to + 127 at the bottom. The vertical region 0 to cutoff is split into + three parts, with velocities 42, 84 and 127. Everything below cutoff + has velocity 127. + + """ + + x, y, width, height = rect + if cutoff is None: + cutoff = height + delta_height = cutoff // 3 + regions.fill((note, 42, 0), + (x, y, width, delta_height)) + regions.fill((note, 84, 0), + (x, y + delta_height, width, delta_height)) + regions.fill((note, 127, 0), + (x, y + 2 * delta_height, width, height - 2 * delta_height)) + +def is_white_key(note): + """True if note is represented by a white key""" + + key_pattern = [True, False, True, True, False, True, + False, True, True, False, True, False] + return key_pattern[(note - 21) % len(key_pattern)] + + +def usage(): + print ("--input [device_id] : Midi message logger") + print ("--output [device_id] : Midi piano keyboard") + print ("--list : list available midi devices") + +def main(mode='output', device_id=None): + """Run a Midi example + + Arguments: + mode - if 'output' run a midi keyboard output example + 'input' run a midi event logger input example + 'list' list available midi devices + (default 'output') + device_id - midi device number; if None then use the default midi input or + output device for the system + + """ + + if mode == 'input': + input_main(device_id) + elif mode == 'output': + output_main(device_id) + elif mode == 'list': + print_device_info() + else: + raise ValueError("Unknown mode option '%s'" % mode) + +if __name__ == '__main__': + + try: + device_id = int( sys.argv[-1] ) + except: + device_id = None + + if "--input" in sys.argv or "-i" in sys.argv: + + input_main(device_id) + + elif "--output" in sys.argv or "-o" in sys.argv: + output_main(device_id) + elif "--list" in sys.argv or "-l" in sys.argv: + print_device_info() + else: + usage() diff --git a/venv/Lib/site-packages/pygame/examples/moveit.py b/venv/Lib/site-packages/pygame/examples/moveit.py new file mode 100644 index 0000000..194cd12 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/moveit.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +""" +This is the full and final example from the Pygame Tutorial, +"How Do I Make It Move". It creates 10 objects and animates +them on the screen. + +Note it's a bit scant on error checking, but it's easy to read. :] +Fortunately, this is python, and we needn't wrestle with a pile of +error codes. +""" + + +#import everything +import os, pygame +from pygame.locals import * + +main_dir = os.path.split(os.path.abspath(__file__))[0] + +#our game object class +class GameObject: + def __init__(self, image, height, speed): + self.speed = speed + self.image = image + self.pos = image.get_rect().move(0, height) + def move(self): + self.pos = self.pos.move(self.speed, 0) + if self.pos.right > 600: + self.pos.left = 0 + + +#quick function to load an image +def load_image(name): + path = os.path.join(main_dir, 'data', name) + return pygame.image.load(path).convert() + + +#here's the full code +def main(): + pygame.init() + screen = pygame.display.set_mode((640, 480)) + + player = load_image('player1.gif') + background = load_image('liquid.bmp') + + # scale the background image so that it fills the window and + # successfully overwrites the old sprite position. + background = pygame.transform.scale2x(background) + background = pygame.transform.scale2x(background) + + screen.blit(background, (0, 0)) + + objects = [] + for x in range(10): + o = GameObject(player, x*40, x) + objects.append(o) + + while 1: + for event in pygame.event.get(): + if event.type in (QUIT, KEYDOWN): + return + + for o in objects: + screen.blit(background, o.pos, o.pos) + for o in objects: + o.move() + screen.blit(o.image, o.pos) + + pygame.display.update() + + + +if __name__ == '__main__': main() diff --git a/venv/Lib/site-packages/pygame/examples/oldalien.py b/venv/Lib/site-packages/pygame/examples/oldalien.py new file mode 100644 index 0000000..d1f6d9f --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/oldalien.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python + +"""This is a much simpler version of the aliens.py +example. It makes a good place for beginners to get +used to the way pygame works. Gameplay is pretty similar, +but there are a lot less object types to worry about, +and it makes no attempt at using the optional pygame +modules. +It does provide a good method for using the updaterects +to only update the changed parts of the screen, instead of +the entire screen surface. This has large speed benefits +and should be used whenever the fullscreen isn't being changed.""" + + +#import +import random, os.path, sys +import pygame +from pygame.locals import * + +if not pygame.image.get_extended(): + raise SystemExit("Requires the extended image loading from SDL_image") + + +#constants +FRAMES_PER_SEC = 40 +PLAYER_SPEED = 12 +MAX_SHOTS = 2 +SHOT_SPEED = 10 +ALIEN_SPEED = 12 +ALIEN_ODDS = 45 +EXPLODE_TIME = 6 +SCREENRECT = Rect(0, 0, 640, 480) + + +#some globals for friendly access +dirtyrects = [] # list of update_rects +next_tick = 0 # used for timing +class Img: pass # container for images +main_dir = os.path.split(os.path.abspath(__file__))[0] # Program's diretory + + +#first, we define some utility functions + +def load_image(file, transparent): + "loads an image, prepares it for play" + file = os.path.join(main_dir, 'data', file) + try: + surface = pygame.image.load(file) + except pygame.error: + raise SystemExit('Could not load image "%s" %s' % + (file, pygame.get_error())) + if transparent: + corner = surface.get_at((0, 0)) + surface.set_colorkey(corner, RLEACCEL) + return surface.convert() + + + +# The logic for all the different sprite types + +class Actor: + "An enhanced sort of sprite class" + def __init__(self, image): + self.image = image + self.rect = image.get_rect() + + def update(self): + "update the sprite state for this frame" + pass + + def draw(self, screen): + "draws the sprite into the screen" + r = screen.blit(self.image, self.rect) + dirtyrects.append(r) + + def erase(self, screen, background): + "gets the sprite off of the screen" + r = screen.blit(background, self.rect, self.rect) + dirtyrects.append(r) + + +class Player(Actor): + "Cheer for our hero" + def __init__(self): + Actor.__init__(self, Img.player) + self.alive = 1 + self.reloading = 0 + self.rect.centerx = SCREENRECT.centerx + self.rect.bottom = SCREENRECT.bottom - 10 + + def move(self, direction): + self.rect = self.rect.move(direction*PLAYER_SPEED, 0).clamp(SCREENRECT) + + +class Alien(Actor): + "Destroy him or suffer" + def __init__(self): + Actor.__init__(self, Img.alien) + self.facing = random.choice((-1,1)) * ALIEN_SPEED + if self.facing < 0: + self.rect.right = SCREENRECT.right + + def update(self): + global SCREENRECT + self.rect[0] = self.rect[0] + self.facing + if not SCREENRECT.contains(self.rect): + self.facing = -self.facing; + self.rect.top = self.rect.bottom + 3 + self.rect = self.rect.clamp(SCREENRECT) + + +class Explosion(Actor): + "Beware the fury" + def __init__(self, actor): + Actor.__init__(self, Img.explosion) + self.life = EXPLODE_TIME + self.rect.center = actor.rect.center + + def update(self): + self.life = self.life - 1 + + +class Shot(Actor): + "The big payload" + def __init__(self, player): + Actor.__init__(self, Img.shot) + self.rect.centerx = player.rect.centerx + self.rect.top = player.rect.top - 10 + + def update(self): + self.rect.top = self.rect.top - SHOT_SPEED + + + + +def main(): + "Run me for adrenaline" + global dirtyrects + + # Initialize SDL components + pygame.init() + screen = pygame.display.set_mode(SCREENRECT.size, 0) + clock = pygame.time.Clock() + + # Load the Resources + Img.background = load_image('background.gif', 0) + Img.shot = load_image('shot.gif', 1) + Img.bomb = load_image('bomb.gif', 1) + Img.danger = load_image('danger.gif', 1) + Img.alien = load_image('alien1.gif', 1) + Img.player = load_image('oldplayer.gif', 1) + Img.explosion = load_image('explosion1.gif', 1) + + # Create the background + background = pygame.Surface(SCREENRECT.size) + for x in range(0, SCREENRECT.width, Img.background.get_width()): + background.blit(Img.background, (x, 0)) + screen.blit(background, (0,0)) + pygame.display.flip() + + # Initialize Game Actors + player = Player() + aliens = [Alien()] + shots = [] + explosions = [] + + # Main loop + while player.alive or explosions: + clock.tick(FRAMES_PER_SEC) + + # Gather Events + pygame.event.pump() + keystate = pygame.key.get_pressed() + if keystate[K_ESCAPE] or pygame.event.peek(QUIT): + break + + # Clear screen and update actors + for actor in [player] + aliens + shots + explosions: + actor.erase(screen, background) + actor.update() + + # Clean Dead Explosions and Bullets + for e in explosions: + if e.life <= 0: + explosions.remove(e) + for s in shots: + if s.rect.top <= 0: + shots.remove(s) + + # Move the player + direction = keystate[K_RIGHT] - keystate[K_LEFT] + player.move(direction) + + # Create new shots + if not player.reloading and keystate[K_SPACE] and len(shots) < MAX_SHOTS: + shots.append(Shot(player)) + player.reloading = keystate[K_SPACE] + + # Create new alien + if not int(random.random() * ALIEN_ODDS): + aliens.append(Alien()) + + # Detect collisions + alienrects = [] + for a in aliens: + alienrects.append(a.rect) + + hit = player.rect.collidelist(alienrects) + if hit != -1: + alien = aliens[hit] + explosions.append(Explosion(alien)) + explosions.append(Explosion(player)) + aliens.remove(alien) + player.alive = 0 + for shot in shots: + hit = shot.rect.collidelist(alienrects) + if hit != -1: + alien = aliens[hit] + explosions.append(Explosion(alien)) + shots.remove(shot) + aliens.remove(alien) + break + + # Draw everybody + for actor in [player] + aliens + shots + explosions: + actor.draw(screen) + + pygame.display.update(dirtyrects) + dirtyrects = [] + + pygame.time.wait(50) + + +#if python says run, let's run! +if __name__ == '__main__': + main() + diff --git a/venv/Lib/site-packages/pygame/examples/overlay.py b/venv/Lib/site-packages/pygame/examples/overlay.py new file mode 100644 index 0000000..8329071 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/overlay.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +import sys +import pygame +from pygame.compat import xrange_ + +SR= (800,600) +ovl= None + +######################################################################## +# Simple video player +def vPlayer( fName ): + global ovl + f= open( fName, 'rb' ) + fmt= f.readline().strip() + res= f.readline().strip() + col= f.readline().strip() + if fmt!= "P5": + print ('Unknown format( len %d ). Exiting...' % len( fmt )) + return + + w,h= [ int(x) for x in res.split( ' ' ) ] + h= ( h* 2 )/ 3 + # Read into strings + y= f.read( w*h ) + u= [] + v= [] + for i in xrange_( 0, h/2 ): + u.append( f.read( w/2 )) + v.append( f.read( w/2 )) + + u= ''.join(u) + v= ''.join(v) + + # Open overlay with the resolution specified + ovl= pygame.Overlay(pygame.YV12_OVERLAY, (w,h)) + ovl.set_location(0, 0, w, h) + + ovl.display((y,u,v)) + while 1: + pygame.time.wait(10) + for ev in pygame.event.get(): + if ev.type in (pygame.KEYDOWN, pygame.QUIT): + return + + +def main(fname): + """play video file fname""" + pygame.init() + try: + pygame.display.set_mode(SR) + vPlayer(fname) + finally: + pygame.quit() + +# Test all modules +if __name__== '__main__': + if len( sys.argv )!= 2: + print ("Usage: play_file ") + else: + main(sys.argv[1]) + diff --git a/venv/Lib/site-packages/pygame/examples/pixelarray.py b/venv/Lib/site-packages/pygame/examples/pixelarray.py new file mode 100644 index 0000000..3092b18 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/pixelarray.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +import os, pygame +from pygame.compat import xrange_ + +main_dir = os.path.split(os.path.abspath(__file__))[0] +data_dir = os.path.join(main_dir, 'data') + +def show (image): + screen = pygame.display.get_surface() + screen.fill ((255, 255, 255)) + screen.blit (image, (0, 0)) + pygame.display.flip () + while 1: + event = pygame.event.wait () + if event.type == pygame.QUIT: + raise SystemExit + if event.type == pygame.MOUSEBUTTONDOWN: + break + +def main(): + pygame.init () + + pygame.display.set_mode ((255, 255)) + surface = pygame.Surface ((255, 255)) + + pygame.display.flip () + + # Create the PixelArray. + ar = pygame.PixelArray (surface) + r, g, b = 0, 0, 0 + # Do some easy gradient effect. + for y in xrange_ (255): + r, g, b = y, y, y + ar[:,y] = (r, g, b) + del ar + show (surface) + + # We have made some gradient effect, now flip it. + ar = pygame.PixelArray (surface) + ar[:] = ar[:,::-1] + del ar + show (surface) + + # Every second column will be made blue + ar = pygame.PixelArray (surface) + ar[::2] = (0, 0, 255) + del ar + show (surface) + + # Every second row will be made green + ar = pygame.PixelArray (surface) + ar[:,::2] = (0, 255, 0) + del ar + show (surface) + + # Manipulate the image. Flip it around the y axis. + surface = pygame.image.load (os.path.join (data_dir, 'arraydemo.bmp')) + ar = pygame.PixelArray (surface) + ar[:] = ar[:,::-1] + del ar + show (surface) + + # Flip the image around the x axis. + ar = pygame.PixelArray (surface) + ar[:] = ar[::-1,:] + del ar + show (surface) + + # Every second column will be made white. + ar = pygame.PixelArray (surface) + ar[::2] = (255, 255, 255) + del ar + show (surface) + + # Flip the image around both axes, restoring it's original layout. + ar = pygame.PixelArray (surface) + ar[:] = ar[::-1,::-1] + del ar + show (surface) + + # Rotate 90 degrees clockwise. + w, h = surface.get_size () + surface2 = pygame.Surface ((h, w), surface.get_flags (), surface) + ar = pygame.PixelArray (surface) + ar2 = pygame.PixelArray (surface2) + ar2[...] = ar.transpose ()[::-1,:] + del ar, ar2 + show (surface2) + + # Scale it by throwing each second pixel away. + surface = pygame.image.load (os.path.join (data_dir, 'arraydemo.bmp')) + ar = pygame.PixelArray (surface) + sf2 = ar[::2,::2].make_surface () + del ar + show (sf2) + + # Replace anything looking like the blue color from the text. + ar = pygame.PixelArray (surface) + ar.replace ((60, 60, 255), (0, 255, 0), 0.06) + del ar + show (surface) + + # Extract anything which might be somewhat black. + surface = pygame.image.load (os.path.join (data_dir, 'arraydemo.bmp')) + ar = pygame.PixelArray (surface) + ar2 = ar.extract ((0, 0, 0), 0.07) + sf2 = ar2.surface + del ar, ar2 + show (sf2) + + # Compare two images. + surface = pygame.image.load (os.path.join (data_dir, 'alien1.gif')) + surface2 = pygame.image.load (os.path.join (data_dir, 'alien2.gif')) + ar1 = pygame.PixelArray (surface) + ar2 = pygame.PixelArray (surface2) + ar3 = ar1.compare (ar2, 0.07) + sf3 = ar3.surface + del ar1, ar2, ar3 + show (sf3) + +if __name__ == '__main__': + main() + diff --git a/venv/Lib/site-packages/pygame/examples/playmus.py b/venv/Lib/site-packages/pygame/examples/playmus.py new file mode 100644 index 0000000..4b4e46d --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/playmus.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python + +"""A simple music player. + + Use pygame.mixer.music to play an audio file. A window is + created to handle keyboard events for playback commands. + +""" + +from __future__ import print_function +import pygame +import pygame.freetype +from pygame.locals import * +import sys +import os + +class Window(object): + """The application's Pygame window + + A Window instance manages the creation of and drawing to a + window. It is a singleton class. Only one instance can exist. + + """ + + instance = None + + def __new__(cls, *args, **kwds): + """Return an open Pygame window""" + + if Window.instance is not None: + return Window.instance + self = object.__new__(cls) + pygame.display.init() + self.screen = pygame.display.set_mode((600, 400)) + Window.instance = self + return self + + def __init__(self, title): + pygame.display.set_caption(title) + self.screen.fill(Color('white')) + pygame.display.flip() + + pygame.freetype.init() + self.font = pygame.freetype.Font(None, 20) + self.font.origin = True + self.ascender = int(self.font.get_sized_ascender() * 1.5) + self.descender = int(self.font.get_sized_descender() * 1.5) + self.line_height = self.ascender - self.descender + + self.write_lines("'q', ESCAPE or close this window to quit\n" + "SPACE to play/pause\n" + "'r' to rewind\n" + "'f' to faid out over 5 seconds\n", 0) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + return False + + def close(self): + pygame.display.quit() + Window.instance = None + + def write_lines(self, text, line=0): + w, h = self.screen.get_size() + line_height = self.line_height + nlines = h // line_height + if line < 0: + line = nlines + line + for i, text_line in enumerate(text.split('\n'), line): + y = i * line_height + self.ascender + # Clear the line first. + self.screen.fill(Color('white'), + (0, i * line_height, w, line_height)) + + # Write new text. + self.font.render_to(self.screen, (15, y), text_line, Color('blue')) + pygame.display.flip() + + +def show_usage_message(): + print("Usage: python playmus.py ") + print(" python -m pygame.examples.playmus ") + +def main(file_path): + """Play an audio file with pygame.mixer.music""" + + with Window(file_path) as win: + win.write_lines('Loading ...', -1) + pygame.mixer.init(frequency=44100) + try: + paused = False + pygame.mixer.music.load(file_path) + + # Make sure the event loop ticks over at least every 0.5 seconds. + pygame.time.set_timer(USEREVENT, 500) + + pygame.mixer.music.play() + win.write_lines("Playing ...\n", -1) + + while pygame.mixer.music.get_busy(): + e = pygame.event.wait() + if e.type == pygame.KEYDOWN: + key = e.key + if key == K_SPACE: + if paused: + pygame.mixer.music.unpause() + paused = False + win.write_lines("Playing ...\n", -1) + else: + pygame.mixer.music.pause() + paused = True + win.write_lines("Paused ...\n", -1) + elif key == K_r: + pygame.mixer.music.rewind() + if paused: + win.write_lines("Rewound.", -1) + elif key == K_f: + win.write_lines("Faiding out ...\n", -1) + pygame.mixer.music.fadeout(5000) + # when finished get_busy() will return 0. + elif key in [K_q, K_ESCAPE]: + pygame.mixer.music.stop() + # get_busy() will now return 0. + elif e.type == QUIT: + pygame.mixer.music.stop() + # get_busy() will now return 0. + pygame.time.set_timer(USEREVENT, 0) + finally: + pygame.mixer.quit() + +if __name__ == '__main__': +# Check the only command line argument, a file path + if len(sys.argv) != 2: + show_usage_message() + else: + main(sys.argv[1]) + diff --git a/venv/Lib/site-packages/pygame/examples/prevent_display_stretching.py b/venv/Lib/site-packages/pygame/examples/prevent_display_stretching.py new file mode 100644 index 0000000..9e728a6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/prevent_display_stretching.py @@ -0,0 +1,89 @@ +# coding: ascii +"""Prevent display stretching + +On some computers, the display environment can be configured to stretch +all windows so that they will not appear too small on the screen for +the user. This configuration is especially common on high-DPI displays. +pygame graphics appear distorted when automatically stretched by the +display environment. This script demonstrates a technique for preventing +this stretching and distortion. + +Limitations: +This script makes an API call that is only available on Windows (versions +Vista and newer). ctypes must be installed. + +""" + +# Ensure that the computer is running Windows Vista or newer +import os, sys +if os.name != "nt" or sys.getwindowsversion()[0] < 6: + raise NotImplementedError('this script requires Windows Vista or newer') + +# Ensure that ctypes is installed. It is included with Python 2.5 and newer, +# but Python 2.4 users must install ctypes manually. +try: + import ctypes +except ImportError: + print('install ctypes from http://sourceforge.net/projects/ctypes/files/ctypes') + raise + +import pygame + +# Determine whether or not the user would like to prevent stretching +if os.path.basename(sys.executable) == 'pythonw.exe': + selection = 'y' +else: + from pygame.compat import raw_input_ + selection = None + while selection not in ('y', 'n'): + selection = raw_input_('Prevent stretching? (y/n): ').strip().lower() + +if selection == 'y': + msg = 'Stretching is prevented.' +else: + msg = 'Stretching is not prevented.' + +# Prevent stretching +if selection == 'y': + user32 = ctypes.windll.user32 + user32.SetProcessDPIAware() + +# Show screen +pygame.display.init() +RESOLUTION = (350, 350) +screen = pygame.display.set_mode(RESOLUTION) + +# Render message onto a surface +pygame.font.init() +font = pygame.font.Font(None, 36) +msg_surf = font.render(msg, 1, pygame.Color('green')) +res_surf = font.render('Intended resolution: %ix%i' % RESOLUTION, 1, pygame.Color('green')) + +# Control loop +running = True +clock = pygame.time.Clock() +counter = 0 +while running: + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + + screen.fill(pygame.Color('black')) + + # Draw lines which will be blurry if the window is stretched + # or clear if the window is not stretched. + pygame.draw.line(screen, pygame.Color('white'), (0, counter), (RESOLUTION[0] - 1, counter)) + pygame.draw.line(screen, pygame.Color('white'), (counter, 0), (counter, RESOLUTION[1] - 1)) + + # Blit message onto screen surface + msg_blit_rect = screen.blit(msg_surf, (0, 0)) + screen.blit(res_surf, (0, msg_blit_rect.bottom)) + + clock.tick(10) + + pygame.display.flip() + + counter += 1 + if counter == RESOLUTION[0]: + counter = 0 diff --git a/venv/Lib/site-packages/pygame/examples/scaletest.py b/venv/Lib/site-packages/pygame/examples/scaletest.py new file mode 100644 index 0000000..a38ad81 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/scaletest.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python + +import sys, time +import pygame + +def main(imagefile, convert_alpha=False, run_speed_test=False): + """show an interactive image scaler + + Args: + imagefile - name of source image (required) + convert_alpha - use convert_alpha() on the surf (default False) + run_speed_test - (default False) + + """ + + # initialize display + pygame.display.init() + # load background image + background = pygame.image.load(imagefile) + + if run_speed_test: + if convert_alpha: + # convert_alpha() requires the display mode to be set + pygame.display.set_mode((1, 1)) + background = background.convert_alpha() + + SpeedTest(background) + return + + # start fullscreen mode + screen = pygame.display.set_mode((1024, 768), pygame.FULLSCREEN) + if convert_alpha: + background = background.convert_alpha() + + # turn off the mouse pointer + pygame.mouse.set_visible(0) + # main loop + bRunning = True + bUp = False + bDown = False + bLeft = False + bRight = False + cursize = [background.get_width(), background.get_height()] + while(bRunning): + image = pygame.transform.smoothscale(background, cursize) + imgpos = image.get_rect(centerx=512, centery=384) + screen.fill((255,255,255)) + screen.blit(image, imgpos) + pygame.display.flip() + for event in pygame.event.get(): + if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE): + bRunning = False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_UP: bUp = True + if event.key == pygame.K_DOWN: bDown = True + if event.key == pygame.K_LEFT: bLeft = True + if event.key == pygame.K_RIGHT: bRight = True + if event.type == pygame.KEYUP: + if event.key == pygame.K_UP: bUp = False + if event.key == pygame.K_DOWN: bDown = False + if event.key == pygame.K_LEFT: bLeft = False + if event.key == pygame.K_RIGHT: bRight = False + if bUp: + cursize[1] -= 2 + if cursize[1] < 1: cursize[1] = 1 + if bDown: + cursize[1] += 2 + if bLeft: + cursize[0] -= 2 + if cursize[0] < 1: cursize[0] = 1 + if bRight: + cursize[0] += 2 + + +def SpeedTest(image): + print("\nImage Scaling Speed Test - Image Size %s\n" % str( + image.get_size())) + + imgsize = [image.get_width(), image.get_height()] + duration = 0.0 + for i in range(128): + shrinkx = (imgsize[0] * i) // 128 + shrinky = (imgsize[1] * i) // 128 + start = time.time() + tempimg = pygame.transform.smoothscale(image, (shrinkx, shrinky)) + duration += (time.time() - start) + del tempimg + + print("Average transform.smoothscale shrink time: %.4f ms." % ( + duration / 128 * 1000)) + + duration = 0 + for i in range(128): + expandx = (imgsize[0] * (i + 129)) // 128 + expandy = (imgsize[1] * (i + 129)) // 128 + start = time.time() + tempimg = pygame.transform.smoothscale(image, (expandx, expandy)) + duration += (time.time() - start) + del tempimg + + print("Average transform.smoothscale expand time: %.4f ms." % ( + duration / 128 * 1000)) + + duration = 0.0 + for i in range(128): + shrinkx = (imgsize[0] * i) // 128 + shrinky = (imgsize[1] * i) // 128 + start = time.time() + tempimg = pygame.transform.scale(image, (shrinkx, shrinky)) + duration += (time.time() - start) + del tempimg + + print("Average transform.scale shrink time: %.4f ms." % ( + duration / 128 * 1000)) + + duration = 0 + for i in range(128): + expandx = (imgsize[0] * (i + 129)) // 128 + expandy = (imgsize[1] * (i + 129)) // 128 + start = time.time() + tempimg = pygame.transform.scale(image, (expandx, expandy)) + duration += (time.time() - start) + del tempimg + + print("Average transform.scale expand time: %.4f ms." % ( + duration / 128 * 1000)) + + +if __name__ == '__main__': + # check input parameters + if len(sys.argv) < 2: + print("\nUsage: %s imagefile [-t] [-convert_alpha]" % sys.argv[0]) + print(" imagefile image filename (required)") + print(" -t run speed test") + print(" -convert_alpha use convert_alpha() on the image's " + "surface\n") + else: + main(sys.argv[1], + convert_alpha = '-convert_alpha' in sys.argv, + run_speed_test = '-t' in sys.argv) diff --git a/venv/Lib/site-packages/pygame/examples/scrap_clipboard.py b/venv/Lib/site-packages/pygame/examples/scrap_clipboard.py new file mode 100644 index 0000000..0fc6be9 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/scrap_clipboard.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +""" +Demonstrates the clipboard capabilities of pygame. +""" +import os + +import pygame +from pygame.locals import * +import pygame.scrap as scrap +from pygame.compat import as_bytes +BytesIO = pygame.compat.get_BytesIO() + +def usage (): + print ("Press the 'g' key to get all of the current clipboard data") + print ("Press the 'p' key to put a string into the clipboard") + print ("Press the 'a' key to get a list of the currently available types") + print ("Press the 'i' key to put an image into the clipboard") + +main_dir = os.path.split(os.path.abspath(__file__))[0] + +pygame.init () +screen = pygame.display.set_mode ((200, 200)) +c = pygame.time.Clock () +going = True + +# Initialize the scrap module and use the clipboard mode. +scrap.init () +scrap.set_mode (SCRAP_CLIPBOARD) + +usage () + +while going: + for e in pygame.event.get (): + if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE): + going = False + + elif e.type == KEYDOWN and e.key == K_g: + # This means to look for data. + print ("Getting the different clipboard data..") + for t in scrap.get_types (): + r = scrap.get (t) + if r and len (r) > 500: + print ("Type %s : (large %i byte buffer)" % (t, len(r))) + elif r is None: + print ("Type %s : None" % (t,)) + else: + print ("Type %s : '%s'" % (t, r.decode('ascii', 'ignore'))) + if "image" in t: + namehint = t.split("/")[1] + if namehint in ['bmp', 'png', 'jpg']: + f = BytesIO(r) + loaded_surf = pygame.image.load(f, "." + namehint) + screen.blit(loaded_surf, (0,0)) + + + elif e.type == KEYDOWN and e.key == K_p: + # Place some text into the selection. + print ("Placing clipboard text.") + scrap.put (SCRAP_TEXT, + as_bytes("Hello. This is a message from scrap.")) + + elif e.type == KEYDOWN and e.key == K_a: + # Get all available types. + print ("Getting the available types from the clipboard.") + types = scrap.get_types () + print (types) + if len (types) > 0: + print ("Contains %s: %s" % + (types[0], scrap.contains (types[0]))) + print ("Contains _INVALID_: ", scrap.contains ("_INVALID_")) + + elif e.type == KEYDOWN and e.key == K_i: + print ("Putting image into the clipboard.") + scrap.set_mode (SCRAP_CLIPBOARD) + fp = open (os.path.join(main_dir, 'data', 'liquid.bmp'), 'rb') + buf = fp.read () + scrap.put ("image/bmp", buf) + fp.close () + + elif e.type in (KEYDOWN, MOUSEBUTTONDOWN): + usage () + pygame.display.flip() + c.tick(40) + + + + diff --git a/venv/Lib/site-packages/pygame/examples/scroll.py b/venv/Lib/site-packages/pygame/examples/scroll.py new file mode 100644 index 0000000..1d4a9d6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/scroll.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python + +"""An zoomed image viewer that demonstrates Surface.scroll + +This example shows a scrollable image that has a zoom factor of eight. +It uses the Surface.scroll function to shift the image on the display +surface. A clip rectangle protects a margin area. If called as a function, +the example accepts an optional image file path. If run as a program +it takes an optional file path command line argument. If no file +is provided a default image file is used. + +When running click on a black triangle to move one pixel in the direction +the triangle points. Or use the arrow keys. Close the window or press ESC +to quit. + +""" + +import sys +import os + +import pygame +from pygame.transform import scale +from pygame.locals import * + +main_dir = os.path.dirname(os.path.abspath(__file__)) + +DIR_UP = 1 +DIR_DOWN = 2 +DIR_LEFT = 3 +DIR_RIGHT = 4 + +zoom_factor = 8 + +def draw_arrow(surf, color, posn, direction): + x, y = posn + if direction == DIR_UP: + pointlist = ((x - 29, y + 30), (x + 30, y + 30), + (x + 1, y - 29), (x, y - 29)) + elif direction == DIR_DOWN: + pointlist = ((x - 29, y - 29), (x + 30, y - 29), + (x + 1, y + 30), (x, y + 30)) + elif direction == DIR_LEFT: + pointlist = ((x + 30, y - 29), (x + 30, y + 30), + (x - 29, y + 1), (x - 29, y)) + else: + pointlist = ((x - 29, y - 29), (x - 29, y + 30), + (x + 30, y + 1), (x + 30, y)) + pygame.draw.polygon(surf, color, pointlist) + +def add_arrow_button(screen, regions, posn, direction): + draw_arrow(screen, Color('black'), posn, direction) + draw_arrow(regions, (direction, 0, 0), posn, direction) + +def scroll_view(screen, image, direction, view_rect): + dx = dy = 0 + src_rect = None + zoom_view_rect = screen.get_clip() + image_w, image_h = image.get_size() + if direction == DIR_UP: + if view_rect.top > 0: + screen.scroll(dy=zoom_factor) + view_rect.move_ip(0, -1) + src_rect = view_rect.copy() + src_rect.h = 1 + dst_rect = zoom_view_rect.copy() + dst_rect.h = zoom_factor + elif direction == DIR_DOWN: + if view_rect.bottom < image_h: + screen.scroll(dy=-zoom_factor) + view_rect.move_ip(0, 1) + src_rect = view_rect.copy() + src_rect.h = 1 + src_rect.bottom = view_rect.bottom + dst_rect = zoom_view_rect.copy() + dst_rect.h = zoom_factor + dst_rect.bottom = zoom_view_rect.bottom + elif direction == DIR_LEFT: + if view_rect.left > 0: + screen.scroll(dx=zoom_factor) + view_rect.move_ip(-1, 0) + src_rect = view_rect.copy() + src_rect.w = 1 + dst_rect = zoom_view_rect.copy() + dst_rect.w = zoom_factor + elif direction == DIR_RIGHT: + if view_rect.right < image_w: + screen.scroll(dx=-zoom_factor) + view_rect.move_ip(1, 0) + src_rect = view_rect.copy() + src_rect.w = 1 + src_rect.right = view_rect.right + dst_rect = zoom_view_rect.copy() + dst_rect.w = zoom_factor + dst_rect.right = zoom_view_rect.right + if src_rect is not None: + scale(image.subsurface(src_rect), + dst_rect.size, + screen.subsurface(dst_rect)) + pygame.display.update(zoom_view_rect) + +def main(image_file=None): + if image_file is None: + image_file = os.path.join(main_dir, 'data', 'arraydemo.bmp') + margin = 80 + view_size = (30, 20) + zoom_view_size = (view_size[0] * zoom_factor, + view_size[1] * zoom_factor) + win_size = (zoom_view_size[0] + 2 * margin, + zoom_view_size[1] + 2 * margin) + background_color = Color('beige') + + pygame.init() + + # set up key repeating so we can hold down the key to scroll. + old_k_delay, old_k_interval = pygame.key.get_repeat () + pygame.key.set_repeat (500, 30) + + try: + screen = pygame.display.set_mode(win_size) + screen.fill(background_color) + pygame.display.flip() + + image = pygame.image.load(image_file).convert() + image_w, image_h = image.get_size() + + if image_w < view_size[0] or image_h < view_size[1]: + print ("The source image is too small for this example.") + print ("A %i by %i or larger image is required." % zoom_view_size) + return + + regions = pygame.Surface(win_size, 0, 24) + add_arrow_button(screen, regions, + (40, win_size[1] // 2), DIR_LEFT) + add_arrow_button(screen, regions, + (win_size[0] - 40, win_size[1] // 2), DIR_RIGHT) + add_arrow_button(screen, regions, + (win_size[0] // 2, 40), DIR_UP) + add_arrow_button(screen, regions, + (win_size[0] // 2, win_size[1] - 40), DIR_DOWN) + pygame.display.flip() + + screen.set_clip((margin, margin, zoom_view_size[0], zoom_view_size[1])) + + view_rect = Rect(0, 0, view_size[0], view_size[1]) + + scale(image.subsurface(view_rect), zoom_view_size, + screen.subsurface(screen.get_clip())) + pygame.display.flip() + + + # the direction we will scroll in. + direction = None + + clock = pygame.time.Clock() + clock.tick() + + going = True + while going: + # wait for events before doing anything. + #events = [pygame.event.wait()] + pygame.event.get() + events = pygame.event.get() + + for e in events: + if e.type == KEYDOWN: + if e.key == K_ESCAPE: + going = False + elif e.key == K_DOWN: + scroll_view(screen, image, DIR_DOWN, view_rect) + elif e.key == K_UP: + scroll_view(screen, image, DIR_UP, view_rect) + elif e.key == K_LEFT: + scroll_view(screen, image, DIR_LEFT, view_rect) + elif e.key == K_RIGHT: + scroll_view(screen, image, DIR_RIGHT, view_rect) + elif e.type == QUIT: + going = False + elif e.type == MOUSEBUTTONDOWN: + direction = regions.get_at(e.pos)[0] + elif e.type == MOUSEBUTTONUP: + direction = None + + if direction: + scroll_view(screen, image, direction, view_rect) + clock.tick(30) + + finally: + pygame.key.set_repeat (old_k_delay, old_k_interval) + pygame.quit() + +if __name__ == '__main__': + if len(sys.argv) > 1: + image_file = sys.argv[1] + else: + image_file = None + main(image_file) diff --git a/venv/Lib/site-packages/pygame/examples/sound.py b/venv/Lib/site-packages/pygame/examples/sound.py new file mode 100644 index 0000000..6fa32f9 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/sound.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +"""extremely simple demonstration playing a soundfile +and waiting for it to finish. you'll need the pygame.mixer +module for this to work. Note how in this simple example we +don't even bother loading all of the pygame package. Just +pick the mixer for sound and time for the delay function. + +Optional command line argument: + the name of an audio file. + + +""" + +import os.path, sys +import pygame.mixer, pygame.time +mixer = pygame.mixer +time = pygame.time + +main_dir = os.path.split(os.path.abspath(__file__))[0] + +def main(file_path=None): + """Play an audio file as a buffered sound sample + + Option argument: + the name of an audio file (default data/secosmic_low.wav + + """ + if file_path is None: + file_path = os.path.join(main_dir, + 'data', + 'secosmic_lo.wav') + + #choose a desired audio format + mixer.init(11025) #raises exception on fail + + + #load the sound + sound = mixer.Sound(file_path) + + + #start playing + print ('Playing Sound...') + channel = sound.play() + + + #poll until finished + while channel.get_busy(): #still playing + print (' ...still going...') + time.wait(1000) + print ('...Finished') + +if __name__ == '__main__': + if len(sys.argv) > 1: + main(sys.argv[1]) + else: + main() diff --git a/venv/Lib/site-packages/pygame/examples/sound_array_demos.py b/venv/Lib/site-packages/pygame/examples/sound_array_demos.py new file mode 100644 index 0000000..142ed7b --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/sound_array_demos.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python +""" +Creates an echo effect an any Sound object. + +Uses sndarray and MumPy ( or Numeric) to create offset faded copies of the +original sound. Currently it just uses hardcoded values for the +number of echos and the delay. Easy for you to recreate as +needed. The array packaged used can be specified by an optional +--numpy or --numeric command line option. + +version 2. changes: +- Should work with different sample rates now. +- put into a function. +- Uses NumPy by default, but falls back on Numeric. + +""" + +__author__ = "Pete 'ShredWheat' Shinners, Rene Dudfield" +__copyright__ = "Copyright (C) 2004 Pete Shinners, Copyright (C) 2005 Rene Dudfield" +__license__ = "Public Domain" +__version__ = "2.0" + + +import os.path +import pygame.mixer, pygame.time, pygame.sndarray, pygame +import pygame.surfarray, pygame.transform +from pygame import sndarray, mixer + +from numpy import zeros, int32, int16 + +import time + + +#mixer.init(44100, -16, 0) +mixer.init() +#mixer.init(11025, -16, 0) +#mixer.init(11025) + + + +def make_echo(sound, samples_per_second, mydebug = True): + """ returns a sound which is echoed of the last one. + """ + + echo_length = 3.5 + + a1 = sndarray.array(sound) + if mydebug: + print ('SHAPE1: %s' % (a1.shape,)) + + length = a1.shape[0] + + #myarr = zeros(length+12000) + myarr = zeros(a1.shape, int32) + + if len(a1.shape) > 1: + mult = a1.shape[1] + size = (a1.shape[0] + int(echo_length * a1.shape[0]), a1.shape[1]) + #size = (a1.shape[0] + int(a1.shape[0] + (echo_length * 3000)), a1.shape[1]) + else: + mult = 1 + size = (a1.shape[0] + int(echo_length * a1.shape[0]),) + #size = (a1.shape[0] + int(a1.shape[0] + (echo_length * 3000)),) + + if mydebug: + print (int(echo_length * a1.shape[0])) + myarr = zeros(size, int32) + + + + if mydebug: + print ("size %s" % (size,)) + print (myarr.shape) + myarr[:length] = a1 + #print (myarr[3000:length+3000]) + #print (a1 >> 1) + #print ("a1.shape %s" % (a1.shape,)) + #c = myarr[3000:length+(3000*mult)] + #print ("c.shape %s" % (c.shape,)) + + incr = int(samples_per_second / echo_length) + gap = length + + + myarr[incr:gap+incr] += a1>>1 + myarr[incr*2:gap+(incr*2)] += a1>>2 + myarr[incr*3:gap+(incr*3)] += a1>>3 + myarr[incr*4:gap+(incr*4)] += a1>>4 + + if mydebug: + print ('SHAPE2: %s' % (myarr.shape,)) + + + sound2 = sndarray.make_sound(myarr.astype(int16)) + + return sound2 + + +def slow_down_sound(sound, rate): + """ returns a sound which is a slowed down version of the original. + rate - at which the sound should be slowed down. eg. 0.5 would be half speed. + """ + + raise NotImplementedError() + grow_rate = 1 / rate + + # make it 1/rate times longer. + + a1 = sndarray.array(sound) + + surf = pygame.surfarray.make_surface(a1) + print (a1.shape[0] * grow_rate) + scaled_surf = pygame.transform.scale(surf, (int(a1.shape[0] * grow_rate), a1.shape[1])) + print (scaled_surf) + print (surf) + + a2 = a1 * rate + print (a1.shape) + print (a2.shape) + print (a2) + sound2 = sndarray.make_sound(a2.astype(int16)) + return sound2 + + + + +def sound_from_pos(sound, start_pos, samples_per_second = None, inplace = 1): + """ returns a sound which begins at the start_pos. + start_pos - in seconds from the begining. + samples_per_second - + """ + + # see if we want to reuse the sound data or not. + if inplace: + a1 = pygame.sndarray.samples(sound) + else: + a1 = pygame.sndarray.array(sound) + + # see if samples per second has been given. If not, query the mixer. + # eg. it might be set to 22050 + if samples_per_second is None: + samples_per_second = pygame.mixer.get_init()[0] + + # figure out the start position in terms of samples. + start_pos_in_samples = int(start_pos * samples_per_second) + + # cut the begining off the sound at the start position. + a2 = a1[start_pos_in_samples:] + + # make the Sound instance from the array. + sound2 = pygame.sndarray.make_sound(a2) + + return sound2 + + + + +def main(arraytype=None): + """play various sndarray effects + + If arraytype is provided then use that array package. Valid + values are 'numeric' or 'numpy'. Otherwise default to NumPy, + or fall back on Numeric if NumPy is not installed. + + """ + + main_dir = os.path.split(os.path.abspath(__file__))[0] + + if arraytype not in ('numpy', None): + raise ValueError('Array type not supported: %r' % arraytype) + + print ("Using %s array package" % sndarray.get_arraytype()) + print ("mixer.get_init %s" % (mixer.get_init(),)) + inited = mixer.get_init() + + samples_per_second = pygame.mixer.get_init()[0] + + + + print (("-" * 30) + "\n") + print ("loading sound") + sound = mixer.Sound(os.path.join(main_dir, 'data', 'car_door.wav')) + + + + print ("-" * 30) + print ("start positions") + print ("-" * 30) + + start_pos = 0.1 + sound2 = sound_from_pos(sound, start_pos, samples_per_second) + + print ("sound.get_length %s" % (sound.get_length(),)) + print ("sound2.get_length %s" % (sound2.get_length(),)) + sound2.play() + while mixer.get_busy(): + pygame.time.wait(200) + + print ("waiting 2 seconds") + pygame.time.wait(2000) + print ("playing original sound") + + sound.play() + while mixer.get_busy(): + pygame.time.wait(200) + + print ("waiting 2 seconds") + pygame.time.wait(2000) + + + + if 0: + #TODO: this is broken. + print (("-" * 30) + "\n") + print ("Slow down the original sound.") + rate = 0.2 + slowed_sound = slow_down_sound(sound, rate) + + slowed_sound.play() + while mixer.get_busy(): + pygame.time.wait(200) + + + print ("-" * 30) + print ("echoing") + print ("-" * 30) + + t1 = time.time() + sound2 = make_echo(sound, samples_per_second) + print ("time to make echo %i" % (time.time() - t1,)) + + + print ("original sound") + sound.play() + while mixer.get_busy(): + pygame.time.wait(200) + + print ("echoed sound") + sound2.play() + while mixer.get_busy(): + pygame.time.wait(200) + + + sound = mixer.Sound(os.path.join(main_dir, 'data', 'secosmic_lo.wav')) + + t1 = time.time() + sound3 = make_echo(sound, samples_per_second) + print ("time to make echo %i" % (time.time() - t1,)) + + print ("original sound") + sound.play() + while mixer.get_busy(): + pygame.time.wait(200) + + + print ("echoed sound") + sound3.play() + while mixer.get_busy(): + pygame.time.wait(200) + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/stars.py b/venv/Lib/site-packages/pygame/examples/stars.py new file mode 100644 index 0000000..22e5ef6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/stars.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +"""A simple starfield example. Note you can move the 'center' of +the starfield by leftclicking in the window. This example show +the basics of creating a window, simple pixel plotting, and input +event management""" + + +import random, math, pygame +from pygame.locals import * + +#constants +WINSIZE = [640, 480] +WINCENTER = [320, 240] +NUMSTARS = 150 + + +def init_star(): + "creates new star values" + dir = random.randrange(100000) + velmult = random.random()*.6+.4 + vel = [math.sin(dir) * velmult, math.cos(dir) * velmult] + return vel, WINCENTER[:] + + +def initialize_stars(): + "creates a new starfield" + stars = [] + for x in range(NUMSTARS): + star = init_star() + vel, pos = star + steps = random.randint(0, WINCENTER[0]) + pos[0] = pos[0] + (vel[0] * steps) + pos[1] = pos[1] + (vel[1] * steps) + vel[0] = vel[0] * (steps * .09) + vel[1] = vel[1] * (steps * .09) + stars.append(star) + move_stars(stars) + return stars + + +def draw_stars(surface, stars, color): + "used to draw (and clear) the stars" + for vel, pos in stars: + pos = (int(pos[0]), int(pos[1])) + surface.set_at(pos, color) + + +def move_stars(stars): + "animate the star values" + for vel, pos in stars: + pos[0] = pos[0] + vel[0] + pos[1] = pos[1] + vel[1] + if not 0 <= pos[0] <= WINSIZE[0] or not 0 <= pos[1] <= WINSIZE[1]: + vel[:], pos[:] = init_star() + else: + vel[0] = vel[0] * 1.05 + vel[1] = vel[1] * 1.05 + + +def main(): + "This is the starfield code" + #create our starfield + random.seed() + stars = initialize_stars() + clock = pygame.time.Clock() + #initialize and prepare screen + pygame.init() + screen = pygame.display.set_mode(WINSIZE) + pygame.display.set_caption('pygame Stars Example') + white = 255, 240, 200 + black = 20, 20, 40 + screen.fill(black) + + #main game loop + done = 0 + while not done: + draw_stars(screen, stars, black) + move_stars(stars) + draw_stars(screen, stars, white) + pygame.display.update() + for e in pygame.event.get(): + if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE): + done = 1 + break + elif e.type == MOUSEBUTTONDOWN and e.button == 1: + WINCENTER[:] = list(e.pos) + clock.tick(50) + + +# if python says run, then we should run +if __name__ == '__main__': + main() + + diff --git a/venv/Lib/site-packages/pygame/examples/testsprite.py b/venv/Lib/site-packages/pygame/examples/testsprite.py new file mode 100644 index 0000000..123c0c1 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/testsprite.py @@ -0,0 +1,267 @@ +#!/usr/bin/env python +# like the testsprite.c that comes with sdl, this pygame version shows +# lots of sprites moving around. + + +import pygame, sys, os +from pygame.locals import * +from random import randint +from time import time +import pygame.joystick +from pygame.compat import xrange_ + +##import FastRenderGroup as FRG +import pygame.sprite as FRG + +if "-psyco" in sys.argv: + try: + import psyco + psyco.full() + except Exception: + print ("No psyco for you! psyco failed to import and run.") + +main_dir = os.path.split(os.path.abspath(__file__))[0] +data_dir = os.path.join(main_dir, 'data') + + + + + + +# use this to use update rects or not. +# If the screen is mostly full, then update rects are not useful. +update_rects = True +if "-update_rects" in sys.argv: + update_rects = True +if "-noupdate_rects" in sys.argv: + update_rects = False + +use_static = False +if "-static" in sys.argv: + use_static = True + + +use_FastRenderGroup = False +if "-FastRenderGroup" in sys.argv: + update_rects = True + use_FastRenderGroup = True + + +flags = 0 +if "-flip" in sys.argv: + flags ^= DOUBLEBUF + +if "-fullscreen" in sys.argv: + flags ^= FULLSCREEN + +if "-sw" in sys.argv: + flags ^= SWSURFACE + +use_rle = True + +if "-hw" in sys.argv: + flags ^= HWSURFACE + use_rle = False + + +screen_dims = [640, 480] + +if "-height" in sys.argv: + i = sys.argv.index("-height") + screen_dims[1] = int(sys.argv[i+1]) + +if "-width" in sys.argv: + i = sys.argv.index("-width") + screen_dims[0] = int(sys.argv[i+1]) + +if "-alpha" in sys.argv: + use_alpha = True +else: + use_alpha = False + +print (screen_dims) + + +##class Thingy(pygame.sprite.Sprite): +## images = None +## def __init__(self): +## pygame.sprite.Sprite.__init__(self) +## self.image = Thingy.images[0] +## self.rect = self.image.get_rect() +## self.rect.x = randint(0, screen_dims[0]) +## self.rect.y = randint(0, screen_dims[1]) +## #self.vel = [randint(-10, 10), randint(-10, 10)] +## self.vel = [randint(-1, 1), randint(-1, 1)] +## +## def move(self): +## for i in [0, 1]: +## nv = self.rect[i] + self.vel[i] +## if nv >= screen_dims[i] or nv < 0: +## self.vel[i] = -self.vel[i] +## nv = self.rect[i] + self.vel[i] +## self.rect[i] = nv + +class Thingy(FRG.DirtySprite): + images = None + def __init__(self): +## pygame.sprite.Sprite.__init__(self) + FRG.DirtySprite.__init__(self) + self.image = Thingy.images[0] + self.rect = self.image.get_rect() + self.rect.x = randint(0, screen_dims[0]) + self.rect.y = randint(0, screen_dims[1]) + #self.vel = [randint(-10, 10), randint(-10, 10)] + self.vel = [randint(-1, 1), randint(-1, 1)] + self.dirty = 2 + + def update(self): + for i in [0, 1]: + nv = self.rect[i] + self.vel[i] + if nv >= screen_dims[i] or nv < 0: + self.vel[i] = -self.vel[i] + nv = self.rect[i] + self.vel[i] + self.rect[i] = nv + +class Static(FRG.DirtySprite): + images = None + def __init__(self): + FRG.DirtySprite.__init__(self) + self.image = Static.images[0] + self.rect = self.image.get_rect() + self.rect.x = randint(0, 3*screen_dims[0]/4) + self.rect.y = randint(0, 3*screen_dims[1]/4) + + + +def main(update_rects = True, + use_static = False, + use_FastRenderGroup = False, + screen_dims = [640, 480], + use_alpha = False, + flags = 0, + ): + """Show lots of sprites moving around + + Optional keyword arguments: + update_rects - use the RenderUpdate sprite group class (default True) + use_static - include non-moving images (default False) + use_FastRenderGroup - Use the FastRenderGroup sprite group (default False) + screen_dims - Pygame window dimensions (default [640, 480]) + use_alpha - use alpha blending (default False) + flags - additional display mode flags (default no addiontal flags) + + """ + + if use_FastRenderGroup: + update_rects = True + + + #pygame.init() + pygame.display.init() + + + + #if "-fast" in sys.argv: + + screen = pygame.display.set_mode(screen_dims, flags) + + + # this is mainly for GP2X, so it can quit. + pygame.joystick.init() + num_joysticks = pygame.joystick.get_count() + if num_joysticks > 0: + stick = pygame.joystick.Joystick(0) + stick.init() # now we will receive events for the joystick + + + screen.fill([0,0,0]) + pygame.display.flip() + sprite_surface = pygame.image.load(os.path.join(data_dir, "asprite.bmp")) + sprite_surface2 = pygame.image.load(os.path.join(data_dir, "static.png")) + + if use_rle: + sprite_surface.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY|RLEACCEL) + sprite_surface2.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY|RLEACCEL) + else: + sprite_surface.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY) + sprite_surface2.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY) + + if use_alpha: + sprite_surface = sprite_surface.convert_alpha() + sprite_surface2 = sprite_surface2.convert_alpha() + else: + sprite_surface = sprite_surface.convert() + sprite_surface2 = sprite_surface2.convert() + + Thingy.images = [sprite_surface] + if use_static: + Static.images = [sprite_surface2] + + if len(sys.argv) > 1: + try: + numsprites = int(sys.argv[-1]) + except Exception: + numsprites = 100 + else: + numsprites = 100 + sprites = None + if use_FastRenderGroup: +## sprites = FRG.FastRenderGroup() + sprites = FRG.LayeredDirty() + else: + if update_rects: + sprites = pygame.sprite.RenderUpdates() + else: + sprites = pygame.sprite.Group() + + for i in xrange_(0, numsprites): + if use_static and i%2==0: + sprites.add(Static()) + sprites.add(Thingy()) + + done = False + frames = 0 + start = time() + + background = pygame.Surface(screen.get_size()) + background = background.convert() + background.fill([0,0,0]) + + + while not done: + if not update_rects: + screen.fill([0,0,0]) + +## for sprite in sprites: +## sprite.move() + + if update_rects: + sprites.clear(screen, background) + sprites.update() + + rects = sprites.draw(screen) + if update_rects: + pygame.display.update(rects) + else: + pygame.display.flip() + + + for event in pygame.event.get(): + if event.type in [KEYDOWN, QUIT, JOYBUTTONDOWN]: + done = True + + + frames += 1 + end = time() + print ("FPS: %f" % (frames / ((end - start)))) + pygame.quit() + + + +if __name__ == "__main__": + main( update_rects, + use_static, + use_FastRenderGroup, + screen_dims, + use_alpha, + flags ) diff --git a/venv/Lib/site-packages/pygame/examples/textinput.py b/venv/Lib/site-packages/pygame/examples/textinput.py new file mode 100644 index 0000000..6bb6124 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/textinput.py @@ -0,0 +1,151 @@ +import pygame, sys +import pygame.freetype + +###CONSTS +# Set to true or add 'showevent' in argv to see IME and KEYDOWN events +PRINT_EVENT = False +# frames per second, the general speed of the program +FPS = 50 +# size of window +WINDOWWIDTH, WINDOWHEIGHT = 640, 480 +BGCOLOR = (0, 0, 0) + +# position of chatlist and chatbox +CHATLIST_POS = pygame.Rect(0, 20, WINDOWWIDTH, 400) +CHATBOX_POS = pygame.Rect(0, 440, WINDOWWIDTH, 40) +CHATLIST_MAXSIZE = 20 + +TEXTCOLOR = (0,255,0) + +#Add fontname for each language, otherwise some text can't be correctly displayed. +FONTNAMES = ["notosanscjktcregular", "notosansmonocjktcregular" , + "notosansregular,", + "microsoftjhengheimicrosoftjhengheiuilight", + "microsoftyaheimicrosoftyaheiuilight", + "msgothicmsuigothicmspgothic", + "msmincho", + "Arial"] + +#Version check +if (pygame.get_sdl_version() < (2,0,0)): + raise Exception("This example requires SDL2.") + +#Initalize +pygame.init() +Screen = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT)) +pygame.display.set_caption("TextInput example") +FPSClock = pygame.time.Clock() + +#Freetype +#"The font name can be a comma separated list of font names to search for." +FONTNAMES = ",".join(str(x) for x in FONTNAMES) +Font = pygame.freetype.SysFont(FONTNAMES, 24) +FontSmall = pygame.freetype.SysFont(FONTNAMES, 16) +print("Using font: " + Font.name) + +#Main loop process +def main(): + global BGCOLOR, PRINT_EVENT, CHATBOX_POS, CHATLIST_POS, CHATLIST_MAXSIZE + global FPSClock , Font, Screen + + """ + https://wiki.libsdl.org/SDL_HINT_IME_INTERNAL_EDITING + https://wiki.libsdl.org/Tutorials/TextInput + Candidate list not showing due to SDL2 problem ;w; + """ + pygame.key.start_text_input() + input_rect = pygame.Rect(80,80,320,40) + pygame.key.set_text_input_rect(input_rect) + + _IMEEditing = False + _IMEText = "" + _IMETextPos = 0 + _IMEEditingText = "" + _IMEEditingPos = 0 + ChatList = [] + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + return + + elif event.type == pygame.KEYDOWN: + if (PRINT_EVENT): + print(event) + + if _IMEEditing: + if (len(_IMEEditingText) == 0): + _IMEEditing = False + continue + + if event.key == pygame.K_BACKSPACE: + if (len(_IMEText) > 0 and _IMETextPos > 0): + _IMEText = _IMEText[0:_IMETextPos-1] + _IMEText[_IMETextPos:] + _IMETextPos = max(0,_IMETextPos-1) + + elif event.key == pygame.K_DELETE: + _IMEText = _IMEText[0:_IMETextPos] + _IMEText[_IMETextPos+1:] + elif event.key == pygame.K_LEFT: + _IMETextPos = max(0,_IMETextPos-1) + elif event.key == pygame.K_RIGHT: + _IMETextPos = min(len(_IMEText),_IMETextPos+1) + + elif event.key in [pygame.K_RETURN, pygame.K_KP_ENTER] and len(event.unicode) == 0: + #Block if we have no text to append + if len(_IMEText) == 0: + continue + + #Append chat list + ChatList.append(_IMEText) + if (len(ChatList) > CHATLIST_MAXSIZE): + ChatList.pop(0) + _IMEText = "" + _IMETextPos = 0 + + elif event.type == pygame.TEXTEDITING: + if (PRINT_EVENT): + print(event) + _IMEEditing = True + _IMEEditingText = event.text + _IMEEditingPos = event.start + + elif event.type == pygame.TEXTINPUT: + if (PRINT_EVENT): + print(event) + _IMEEditing = False + _IMEEditingText = "" + _IMEText = _IMEText[0:_IMETextPos] + event.text + _IMEText[_IMETextPos:] + _IMETextPos += len(event.text) + + #Screen updates + Screen.fill(BGCOLOR) + + #Chat List updates + chat_height = CHATLIST_POS.height / CHATLIST_MAXSIZE + for i in range(len(ChatList)): + FontSmall.render_to(Screen, (CHATLIST_POS.x, CHATLIST_POS.y + i*chat_height), ChatList[i], TEXTCOLOR) + + #Chat box updates + start_pos = CHATBOX_POS.copy() + ime_textL = ">" + _IMEText[0:_IMETextPos] + ime_textM = _IMEEditingText[0:_IMEEditingPos] + "|" + _IMEEditingText[_IMEEditingPos:] + ime_textR = _IMEText[_IMETextPos:] + + rect_textL = Font.render_to(Screen, start_pos, ime_textL, TEXTCOLOR) + start_pos.x += rect_textL.width + + #Editing texts should be underlined + rect_textM = Font.render_to(Screen, start_pos, ime_textM, TEXTCOLOR, None, pygame.freetype.STYLE_UNDERLINE) + start_pos.x += rect_textM.width + rect_textr = Font.render_to(Screen, start_pos, ime_textR, TEXTCOLOR) + + pygame.display.update() + + FPSClock.tick(FPS) + +if __name__ == '__main__': + if 'showevent' in sys.argv: + PRINT_EVENT = True + + main() diff --git a/venv/Lib/site-packages/pygame/examples/vgrade.py b/venv/Lib/site-packages/pygame/examples/vgrade.py new file mode 100644 index 0000000..ff0a6b3 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/vgrade.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python + +"""This example demonstrates creating an image with numpy +python, and displaying that through SDL. You can look at the +method of importing numpy and pygame.surfarray. This method +will fail 'gracefully' if it is not available. +I've tried mixing in a lot of comments where the code might +not be self explanatory, nonetheless it may still seem a bit +strange. Learning to use numpy for images like this takes a +bit of learning, but the payoff is extremely fast image +manipulation in python. + +For Pygame 1.9.2 and up, this example also showcases a new feature +of surfarray.blit_surface: array broadcasting. If a source array +has either a width or height of 1, the array is repeatedly blitted +to the surface along that dimension to fill the surface. In fact, +a (1, 1) or (1, 1, 3) array results in a simple surface color fill. + +Just so you know how this breaks down. For each sampling of +time, 30% goes to each creating the gradient and blitting the +array. The final 40% goes to flipping/updating the display surface + +If using an SDL version at least 1.1.8 the window will have +no border decorations. + +The code also demonstrates use of the timer events.""" + + +import os, pygame +from pygame.locals import * + +try: + from numpy import * + from numpy.random import * +except ImportError: + raise SystemExit('This example requires numpy and the pygame surfarray module') + +pygame.surfarray.use_arraytype('numpy') + +timer = 0 +def stopwatch(message = None): + "simple routine to time python code" + global timer + if not message: + timer = pygame.time.get_ticks() + return + now = pygame.time.get_ticks() + runtime = (now - timer)/1000.0 + .001 + print ("%s %s %s" % + (message, runtime, ('seconds\t(%.2ffps)'%(1.0/runtime)))) + timer = now + + + +def VertGradientColumn(surf, topcolor, bottomcolor): + "creates a new 3d vertical gradient array" + topcolor = array(topcolor, copy=0) + bottomcolor = array(bottomcolor, copy=0) + diff = bottomcolor - topcolor + width, height = surf.get_size() + # create array from 0.0 to 1.0 triplets + column = arange(height, dtype='float')/height + column = repeat(column[:, newaxis], [3], 1) + # create a single column of gradient + column = topcolor + (diff * column).astype('int') + # make the column a 3d image column by adding X + column = column.astype('uint8')[newaxis,:,:] + #3d array into 2d array + return pygame.surfarray.map_array(surf, column) + + + +def DisplayGradient(surf): + "choose random colors and show them" + stopwatch() + colors = randint(0, 255, (2, 3)) + column = VertGradientColumn(surf, colors[0], colors[1]) + pygame.surfarray.blit_array(surf, column) + pygame.display.flip() + stopwatch('Gradient:') + + + +def main(): + pygame.init() + pygame.mixer.quit() # remove ALSA underflow messages for Debian squeeze + size = 600, 400 + os.environ['SDL_VIDEO_CENTERED'] = '1' + screen = pygame.display.set_mode(size, NOFRAME, 0) + + pygame.event.set_blocked(MOUSEMOTION) #keep our queue cleaner + pygame.time.set_timer(USEREVENT, 500) + + while 1: + event = pygame.event.wait() + if event.type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN): + break + elif event.type == USEREVENT: + DisplayGradient(screen) + + + +if __name__ == '__main__': main() diff --git a/venv/Lib/site-packages/pygame/examples/video.py b/venv/Lib/site-packages/pygame/examples/video.py new file mode 100644 index 0000000..21bf4e1 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/video.py @@ -0,0 +1,100 @@ +import pygame + + +if pygame.get_sdl_version()[0] < 2: + raise SystemExit('This example requires pygame 2 and SDL2.') + +import os +data_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], + 'data') + +from pygame._sdl2 import ( + Window, + Texture, + Renderer, + get_drivers, + messagebox, +) + +def load_img(file): + return pygame.image.load(os.path.join(data_dir, file)) + +pygame.display.init() +pygame.key.set_repeat(1000, 10) + +for driver in get_drivers(): + print(driver) + +import random +answer = messagebox("I will open two windows! Continue?", "Hello!", info=True, + buttons=('Yes', 'No', 'Chance'), + return_button=0, escape_button=1) +if answer == 1 or (answer == 2 and random.random() < .5): + import sys + sys.exit(0) + +win = Window('asdf', resizable=True) +renderer = Renderer(win) +tex = Texture.from_surface(renderer, load_img('alien1.gif')) + +running = True + +x, y = 250, 50 +clock = pygame.time.Clock() + +backgrounds = [(255,0,0,255), (0,255,0,255), (0,0,255,255)] +bg_index = 0 + +renderer.draw_color = backgrounds[bg_index] + +win2 = Window('2nd window', size=(256, 256), always_on_top=True) +win2.opacity = 0.5 +win2.set_icon(load_img('bomb.gif')) +renderer2 = Renderer(win2) +tex2 = Texture.from_surface(renderer2, load_img('asprite.bmp')) +renderer2.clear() +renderer2.copy(tex2) +renderer2.present() +del tex2 + +full = 0 + +srcrect = (0, 0, tex.width, tex.height) + +while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif getattr(event, 'window', None) == win2: + if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE or\ + event.type == pygame.WINDOWEVENT and event.event == pygame.WINDOWEVENT_CLOSE: + win2.destroy() + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + running = False + elif event.key == pygame.K_LEFT: + x -= 5 + elif event.key == pygame.K_RIGHT: + x += 5 + elif event.key == pygame.K_DOWN: + y += 5 + elif event.key == pygame.K_UP: + y -= 5 + elif event.key == pygame.K_f: + if full == 0: + win.set_fullscreen(True) + full = 1 + else: + win.set_windowed() + full = 0 + elif event.key == pygame.K_SPACE: + bg_index = (bg_index + 1) % len(backgrounds) + renderer.draw_color = backgrounds[bg_index] + + dstrect = (x, y, tex.width, tex.height) + renderer.clear() + renderer.copy(tex, srcrect, dstrect) + renderer.present() + + clock.tick(60) + win.title = str('FPS: {}'.format(clock.get_fps())) diff --git a/venv/Lib/site-packages/pygame/fastevent.cp37-win32.pyd b/venv/Lib/site-packages/pygame/fastevent.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..5fac8888acc8a099a871df7e3c261974da737951 GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/font.cp37-win32.pyd b/venv/Lib/site-packages/pygame/font.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..4f16e2e10746b91124aa3e69763e98e5dcc08bc6 GIT binary patch literal 19456 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 XOU_vD*hn~W&Qgn)LaEoq#MA!+z}l?@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/freetype.py b/venv/Lib/site-packages/pygame/freetype.py new file mode 100644 index 0000000..1a90753 --- /dev/null +++ b/venv/Lib/site-packages/pygame/freetype.py @@ -0,0 +1,45 @@ +"""Enhanced Pygame module for loading and rendering computer fonts""" + +import sys +from pygame._freetype import ( + Font, + STYLE_NORMAL, STYLE_OBLIQUE, STYLE_STRONG, STYLE_UNDERLINE, STYLE_WIDE, + STYLE_DEFAULT, + init, quit, get_init, + was_init, get_cache_size, get_default_font, get_default_resolution, + get_error, get_version, set_default_resolution, + _PYGAME_C_API, __PYGAMEinit__, + ) +from pygame.sysfont import match_font, get_fonts, SysFont as _SysFont +from pygame import compat + +def SysFont(name, size, bold=0, italic=0, constructor=None): + """pygame.ftfont.SysFont(name, size, bold=False, italic=False, constructor=None) -> Font + create a pygame Font from system font resources + + This will search the system fonts for the given font + name. You can also enable bold or italic styles, and + the appropriate system font will be selected if available. + + This will always return a valid Font object, and will + fallback on the builtin pygame font if the given font + is not found. + + Name can also be a comma separated list of names, in + which case set of names will be searched in order. Pygame + uses a small set of common font aliases, if the specific + font you ask for is not available, a reasonable alternative + may be used. + + if optional contructor is provided, it must be a function with + signature constructor(fontpath, size, bold, italic) which returns + a Font instance. If None, a pygame.freetype.Font object is created. + """ + if constructor is None: + def constructor(fontpath, size, bold, italic): + font = Font(fontpath, size) + font.strong = bold + font.oblique = italic + return font + + return _SysFont(name, size, bold, italic, constructor) diff --git a/venv/Lib/site-packages/pygame/ftfont.py b/venv/Lib/site-packages/pygame/ftfont.py new file mode 100644 index 0000000..78c9357 --- /dev/null +++ b/venv/Lib/site-packages/pygame/ftfont.py @@ -0,0 +1,187 @@ +"""pygame module for loading and rendering fonts (freetype alternative)""" + +__all__ = ['Font', 'init', 'quit', 'get_default_font', 'get_init', 'SysFont'] + +from pygame._freetype import init, Font as _Font, get_default_resolution +from pygame._freetype import quit, get_default_font, get_init as _get_init +from pygame._freetype import __PYGAMEinit__ +from pygame.sysfont import match_font, get_fonts, SysFont as _SysFont +from pygame import encode_file_path +from pygame.compat import bytes_, unicode_, as_unicode, as_bytes +from pygame import Surface as _Surface, Color as _Color, SRCALPHA as _SRCALPHA + +class Font(_Font): + """Font(filename, size) -> Font + Font(object, size) -> Font + create a new Font object from a file (freetype alternative) + + This Font type differs from font.Font in that it can render glyphs + for Unicode code points in the supplementary planes (> 0xFFFF). + """ + + __encode_file_path = staticmethod(encode_file_path) + __get_default_resolution = staticmethod(get_default_resolution) + __default_font = encode_file_path(get_default_font()) + + __unull = as_unicode(r"\x00") + __bnull = as_bytes("\x00") + + def __init__(self, file, size=-1): + if size <= 1: + size = 1 + if isinstance(file, unicode_): + try: + bfile = self.__encode_file_path(file, ValueError) + except ValueError: + bfile = '' + else: + bfile = file + if isinstance(bfile, bytes_) and bfile == self.__default_font: + file = None + if file is None: + resolution = int(self.__get_default_resolution() * 0.6875) + if resolution == 0: + kwds['resolution'] = 1 + else: + resolution = 0 + super(Font, self).__init__(file, size=size, resolution=resolution) + self.strength = 1.0 / 12.0 + self.kerning = False + self.origin = True + self.pad = True + self.ucs4 = True + self.underline_adjustment = 1.0 + + def render(self, text, antialias, color, background=None): + """render(text, antialias, color, background=None) -> Surface + draw text on a new Surface""" + + if text is None: + text = "" + if (isinstance(text, unicode_) and # conditional and + self.__unull in text): + raise ValueError("A null character was found in the text") + if (isinstance(text, bytes_) and # conditional and + self.__bnull in text): + raise ValueError("A null character was found in the text") + save_antialiased = self.antialiased + self.antialiased = bool(antialias) + try: + s, r = super(Font, self).render(text, color, background) + return s + finally: + self.antialiased = save_antialiased + + def set_bold(self, value): + """set_bold(bool) -> None + enable fake rendering of bold text""" + + self.wide = bool(value) + + def get_bold(self): + """get_bold() -> bool + check if text will be rendered bold""" + + return self.wide + + def set_italic(self, value): + """set_italic(bool) -> None + enable fake rendering of italic text""" + + self.oblique = bool(value) + + def get_italic(self): + """get_italic() -> bool + check if the text will be rendered italic""" + + return self.oblique + + def set_underline(self, value): + """set_underline(bool) -> None + control if text is rendered with an underline""" + + self.underline = bool(value) + + def get_underline(self): + """set_bold(bool) -> None + enable fake rendering of bold text""" + + return self.underline + + def metrics(self, text): + """metrics(text) -> list + Gets the metrics for each character in the pased string.""" + + return self.get_metrics(text) + + def get_ascent(self): + """get_ascent() -> int + get the ascent of the font""" + + return self.get_sized_ascender() + + def get_descent(self): + """get_descent() -> int + get the descent of the font""" + + return self.get_sized_descender() + + def get_height(self): + """get_height() -> int + get the height of the font""" + + return self.get_sized_ascender() - self.get_sized_descender() + 1 + + def get_linesize(self): + """get_linesize() -> int + get the line space of the font text""" + + return self.get_sized_height(); + + def size(self, text): + """size(text) -> (width, height) + determine the amount of space needed to render text""" + + return self.get_rect(text).size + +FontType = Font + +def get_init(): + """get_init() -> bool + true if the font module is initialized""" + + return _get_init() + +def SysFont(name, size, bold=0, italic=0, constructor=None): + """pygame.ftfont.SysFont(name, size, bold=False, italic=False, constructor=None) -> Font + create a pygame Font from system font resources (freetype alternative) + + This will search the system fonts for the given font + name. You can also enable bold or italic styles, and + the appropriate system font will be selected if available. + + This will always return a valid Font object, and will + fallback on the builtin pygame font if the given font + is not found. + + Name can also be a comma separated list of names, in + which case set of names will be searched in order. Pygame + uses a small set of common font aliases, if the specific + font you ask for is not available, a reasonable alternative + may be used. + + if optional contructor is provided, it must be a function with + signature constructor(fontpath, size, bold, italic) which returns + a Font instance. If None, a pygame.ftfont.Font object is created. + """ + if constructor is None: + def constructor(fontpath, size, bold, italic): + font = Font(fontpath, size) + font.set_bold(bold) + font.set_italic(italic) + return font + + return _SysFont(name, size, bold, italic, constructor) + +del _Font, get_default_resolution, encode_file_path, as_unicode, as_bytes + diff --git a/venv/Lib/site-packages/pygame/gfxdraw.cp37-win32.pyd b/venv/Lib/site-packages/pygame/gfxdraw.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..4ce27a20867934563d322f5d018ce55687927409 GIT binary patch literal 50176 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 SNr)njeEYRF`2W{`rog|tad1rl literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/image.cp37-win32.pyd b/venv/Lib/site-packages/pygame/image.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..61a78b3648c8b6d0fb71bb602a9c7546dacf4945 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/joystick.cp37-win32.pyd b/venv/Lib/site-packages/pygame/joystick.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..e16b004a97857ed970722f53eb6dc27f35b2513e GIT binary patch literal 15872 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 R*8SE)@n0`Mk^d#ve*kr&YAOH# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/key.cp37-win32.pyd b/venv/Lib/site-packages/pygame/key.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..0347006a3014e475eb67648c923bd6cc6a20078f GIT binary patch literal 12288 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 Hatr(q>SPpf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/libfreetype-6.dll b/venv/Lib/site-packages/pygame/libfreetype-6.dll new file mode 100644 index 0000000000000000000000000000000000000000..f9f312a9516ac13bbc70bf465deff26cdcc6b7d6 GIT binary patch literal 604160 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.XitbU7 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 YG}|wUXki1N$q$FE1Lefu|8NfcFDtpVLjV8( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/libgcc_s_sjlj-1.dll b/venv/Lib/site-packages/pygame/libgcc_s_sjlj-1.dll new file mode 100644 index 0000000000000000000000000000000000000000..f09ac7adb9117944bd1cc5d30ae3a144b95a8f03 GIT binary patch literal 99840 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 JUF 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/libjpeg-8.dll b/venv/Lib/site-packages/pygame/libjpeg-8.dll new file mode 100644 index 0000000000000000000000000000000000000000..b9f7a84b68bc795f1536507e7e090d2329b42b1a GIT binary patch literal 250368 zcmeEvdwg6~wf{^qq0=&ShB8RhC_y3?sn}wb*0wUx4u;xZV{NbkRn)ek1;H}G;%y!< ziR5q^8WFuHK8pDEdcoi2mReDgG$x@2ZVFKY4crl<&M>2l8fk<|f8X!gd!KXWkv`D- z$M5s`Rmq(FUVH7e)?Rzd-{HeP-){W!UrhcU`A-{?XP>@jw(tI# zkDRgFzv_`Q)?W3o>uayua_vXAeCV3mk9_D8pSU(r`{9kXTbe#m`>{{du6Xx*Yp=O> z!^U$@I%!s&uDT)a^R4pF^o`!Lxx=)U^36W;M1RFAeVYK;qxkOxpDz+cY6Sna5!#)b z<-0<`?MDpZmwz#Q;s1|+A>czY{?)2-EWq;kCqJo5pEZY}fUmBKztjAiAMmXTPLqb{ zKyAQRT_$-7^*&f8-b9_7*tj);!2KK09|FX_I-O9tuJkordG3Y}B|d~;4Wrn1cIxBA zf%`A!o8NQp7L~DX8REN<{to5S*UHs5tU=WbN>366j( zAMyXa!u)7AcJ9Y?yMjYhim~$jv?O28xy#qAW!>}mCxU$JM}L`oiK_*^TIQ?O`3B15 z+p_WMYd-?o;n-k|e6#R7RFdx^R`dV=O^<>1CUez;fx0&2NT)vnp4e*z>e6SuztY!n z;GQ73@}2)F%6@7xY}d7eBknbeHe#e&402A!4tstLu2IY0KTd5%6(O__kA# zoJ{){9I)Ry-~Wxx_b@&i?z+K;w$iBT@Gq0Oz#i6Njpf5XJT*lA?`it=-4T2wrz*nj zzd;%@pH9FY0$|c$vOjY92R_&r@>$P!J@^JB`I0aAC8cR%!`2-NZ3be$V@W z@*Zm-apB#>IHS4|W$jI71B;*jRM zDt;~K8LT26`F%?j`&o#*9~1AH69C4h?pp*8nKvTP-IX}Y$KFID-`EU%1^FWtF@O3z zw3f-eboj6tm9rUffDtGYP-T4hNe2ZkLO{G^29U++Z{z!{M=pJ@HE2Da%++)}W}O;r zyJvILC7N&&8`77rL#MB<3$jv__E}5o(lb6(=>tZsf#i#oiPaqk5|^N}CD6y{c}my`ru*y$tz*ad4o)-`cuRdT>pp4|zk`Uv=MIjd1~MEN`@at3->h z8v}J}1Plq*>*(3T#uBgK@XkgG==|`hQArG1eIW6fATQQ&__2rovUgKAs=>&*|D@Wv zc04#36Y@wlhZ+*+A#D2wW6_gPxBjkfFyD4#$ZDvOXxnEu28BUyYL4s#=G~&NFxdxV z)l5lIGOB=4zB1nxh0~S5gU*v8K3kgn)AW!P+HoH3G3+_iUEHbqHKwQtm{6|B&)T`l)sEnIje@5D)KF1CJPX z@TD)8M76k4Q9B;$1peZOSXuTBC}cMtLLY5($%;=Uo2PtvPGBNo@&25JT4#>17v6QPlj=#M!3osZQC(puHw)HB?KATT|vo zI)|#xA!IYwpOQ+0V7+tI7l^}Z2$=7neLJT?t0AakoC+9jYZDLy4h3sa+k2Xv-o4U+ z&?!pdk>ad+NqjPV%cmf>B&Mj(PF#3b?4))~uIHJI?b33{Acq-a)pji6i69}>f5{;v z8JIQ>0fhM(Qb0!O0`s{k@v<;1Fe-4Oc4JiLbBK<$bpa17cALskZN(?E5Gs-IE?;<8 zj|Fjt@_^KiPh$FyM}U}USHoeeF$ySu=8+IH;4j z1C4t}O@`4SdWD>H%wP&MBu^OVK(&X5Ao^2P%nk^tNC2Lw# z14O!TE!gR>mrP@n1Php31dn|?`K3S}tf`$&7?5|try+C*654b>R=@@gwUWYG&+fBE zzzyI9h=3bT00UU@$Y4B=B!#`LO1RjVOra!nVLqg)Tu6MZO?Nf#??cEkp<)DXI!>}I zM4$*q3hN^wP*lClV;cVdZB(}TfS=w}rGrCvMxio5%oNWkT3i?55Yl>vfS!Go2c44z z=$r&&IeY~cl}0CRUst`K6UHpiP$#sNNstw!7srxw2!jw~Z;~&_>X7JAYIX?8+^1#- zeB*yQ**kD;cc72Dtyo0W4CTo`vIzi-E`=sSi{ts`lkIrEtJ~Mcj-&BVb|xDI%}{rm zwAJ5Ojn(`3Gb#gPW1-grQ&U{E-6bePRBcDk)=x-cHCSODNeV(5+9fjh(o;}mRif!8 zCR~(4-lkFcs_kmvTsKRgSbWYr;CrYdXeuhA8Y%}v5{-~Qw9q!H%JHkzcZ?@~!+puWfefpThaN}#3?fKcb088x{v1tprMt@ICA;TT}bRBF%$ zVeFY+Bom^$`=M_>hKH>&Y;0SxgptTDw?))q28%eFxh&# zxWJUrNy`Xj$=ICebN2EO zf6+t@>@wE!8hl_xIz$y%PV89&H@!scg>So=qqLm-bA`Q}BXwpGt^b&F=<;f*s9Lf# zJ%s{=4D$uaG!3`h$i(-eY?K|Y9$YRQV&$nyEw9Zy2?!K4O|y|F*#n59nSKLT(}`@I zk=5Dd3eu(JAw9V~q#g=-?gjRR9CBs(Djt;#MV)noiEzdDnZ=0$l)m(xs#-x&RO)Zq zXS#>6c>UqSGkkhDdV(?>YIMW5tpwL5`{#*C!$@k(!AgK~(Mi_+dO?c<#90y*>guL0 zqM@PSnvHn9NXYy^CCR#R1=d0VtX`4TZd(V60>8db0#~X47FIc%%$!g5MUXkfb#4qb z7>$a6{QJAPg3U{fu-SA6knTjFgo!{KS4g!9sPCv2atqaRJtoz13iMXnh-#hHMFfdl zUF^6}77h8qSV*@rh@~`&qAo3C<%_eXimN%%eAQAx(lb)M^im--CEqDz0|l(N<0(6~ z0*F{4U-hn9pZ=r>Qz$9Si&U#Y=Mkz$5VfLkeKIwJEbBz95UI%QS|!SS31%3;*%j?T zP58nrXk!i>CnSwP$|^h1ZN$YyyD?Fw?A2q*-jKbbGXMs|Ov7YU7UZDYjT1^|%O#t0zNYycR|U$Xr^Bxy>*!+6 zKxUpmqbjy*CBU7q)^<|=3?drw-ttd@?pS}zLd1hvO)H)z_ApC)vZA0FQc(7-2iJoz zO)*yPDV9{lDhrCS2ZQkm{PiWT$-zdD^CdQwhitiU#DoGlXT{S}ksuG`nCtJ9+J+1WZfK5=F|2TA|=9?DjXR3Vh- z1Iqo)6UpWYU(@5sc%CYc-8K)nSrX5OcdW(CDaPY6tRn>5mI8o^b;cdm!IzhH-X@gf zu+F%!4)X}>AXpE=c3H=XP^_b}11OrKgfF0F3Ns)sia60?6-!XWK%`NZ$~pWs2L6Id zI~sl<&~PV4n}fFX6yO?kK2tS6lSZ) zdU-IsHRA8_kNAf`Nacy6=OCHOl>ud8ytEXQaQo+g?`b*XV^ZyS)i5%dhCPh463N-t z@_l^Aw3SASDn-}5-1yh$QRy4q(n$3t{}Ra{#Y)mvW+sF%8GbOHVz%TpX)tQq7jC~F zq4Es(1(Zj2HfqPykaU__!|iR;miaKs?BAFoRjGlYOk54h$Bmnv=~zFcYE`VSIA$8wf99{!O<}*(nep`W?6(^^_cy1K%_)cd@=M~m@NM4~ zl~vE0gmaPGo9W0*;m9k4-;e6O>^oN|%2g$75BugF_QjW%eLp4R@31dcVwm}uN7xrZ zurGsp=5rzx`|9jMl1AH*nJb<)rpsj@9*0|HHZ-$bTFr0ClwV1%oQIg3Ck4q~fi>Cs zU*6sVE+A0#784}CQy60+7x3!}`udY+$<-ZGE$7D3d?pzf^`p?a&bqa`J* zK!PHyl&ExsmCWs;50wb3loD2$=S5hJCYwi#g_Xo9VFir^zM;)l9Md3gw0SrSjTyvm3tjJ;=2zw_rpxmXU? zaAzlmv9#xE#}Jry)LdD@AgolH)unMTQYtw1s{ohUv0Csgo# zRB&*8xk3220Ru~?BY^QE)RMi*m7U~Z50qa*GO+2uP?Y?yEIqyCy#mROa>9hvV?&<+#)SQowOz!g0(a9ETt{ zjzP_FPK4q(mEGYu?0x0Yq%ZT9D$;zKt6PhGp8Z8r8h z3iX)1dbm)b9x*~nB|)?93@Ei)%?;D2)dSD5x2PM9ItpLre}r#}tDIiBZbL29*^Z!G zuV)rfu04$z?G`iD{MV-~EyE^*Bitq-#MVbr5+} z<@$RlyMN=jnqk$XIL!>(hMb}!_a9NY9;b5c=?6QYm1`Evyfqgsz zx9L}daSAS9<|UyS00k;lvbHgIRK@e104aNhJNm52BXQ;;S;>qXCRSI6_5uVQS|~j6 zBexn3x2Kw4=QMeur7=f*6}9ysGG$+Pa6M?z%~Mp-ovcU{#scCylESzVMG6Q|>sLoo z7#E-n2v3GwuxS*={$hnOcN_}if$Xu8^AC{|-4uoK$Ru?O>vTyfhq*Mo{duD-lDwck zw!GEt36;eXx*(P@c%Bh^vp`V1{QEIhyIze7N+>qtFkq0kT8nI>EO0i77f8j$8y46g zn?eHilL`z>ua|nbl!C>DD<}ALJXg1Kb9RaPe&bwxzqw4N%sEKF3XTPSH4opj)b}Ox zcWySOuJ58+7NyTb8BLS5B-|pd7u+&B&*@xax^#mc zAlQv*P8g7L=#T)8O*2{7#84DdXh0CJH`lFRrwBv}`|psE?+$3zt@+N5^4m z3%Bn?QJUK*VE%zFiJ7jrOFr~v`YzRayELtt?-NVPnfcd}DVD}o9O(4bqNgfwuykVtKpi>);TU(Cd{$*Ic3 zVzP)fKG?AsCMAdI=^DzG3w9|{UEnuw2XD5ZYAN8ll1y9Rv1KT*`Zx;wPYeZWq;a6D zOugNLYWS#b5ZowSE7i14;nJ9rG-|ClR79wo5vVSiZ8AY41UIkA%vyxBdN~+R6O)-d z@lR3#<7+81EDd!tp>fz=6QKGaisj^z_~`XPJ3eg37G<$bj^BEj_wlhJd@satyhmc^ zB9MYXSer95Tcr^|5nK`<+42gzF$K+v`->>JYH?q<>lYk=)zBcI48VXKfDKr+6X>dO zjLc)OnyspBX|oJ->UEnC&+Ir08pv2CvgbM*Tm zykKEQ?>f2P=(=lybnZN#f~ucu+XVm!0*Jt3MMzu(ZIo}!`S*3Lga#*7ti3fDeqhcf zE0RP`({8S{KYO(bsAkc*)%j^!JPR#qwJ1BUOp}fIqqg?2YRga7N6+W_4gX3znNq^aaK?`732;un7>65AJKLjrvuT z4xo3CM))&3rK&N_uSpoam^&6-5>JJ9G^s=ofms$|&}1*@hcK_oB%SQvaQS-r-_a-g zIssGB`-pry1U{@$#n{+d5L)I3Lgxqtuy1ZRj@xTO)-Pc@vuWdJD17fe2G{43dn0!A zOAweufX_+eh7himb!uZ0tb&0>R7i2lxR+ZVgu@pMcr8}|M$oDsgBDMbXu(*VS|}+n zl9Z~=3&|Q|$(}Z>9yeL>JzAb*t1&qkI`{X5ABgYSWK}o|_SCjiGET}%lM=VTNo2Fe zak%66Qh&;iHAIt(r{}Hs{jvf}XC9CY-(lrO<~K{zgz-#mL5-Be>CPhXY162aE{^FeDr>YF{P{?l1un zQI-iH@N(ALjvgh_9D$K*y;XQxW|uRKT$kD9uc*qIUDOKivxq7Maujk|O&242hRA~Q zK=vKr6WDN4{(ZgARFKNSvc1pDpivuhiA-48Ga((jF7k`Z&3IR58{uC)&fUVkfVJYY zL4|WR0i3r!rbHlu6oIW@EbdKs$9f?}^zUVfzcp&OQJj;pc#!^0l)q_&;G-(Bj1c^H zm~FKXyiyOmIA;JeSg~Mgl%b`j7rcsyF4o1#v!I4CtD97UF&gwezj){7w&s59PV8g} zwYMl0L1w11&AQHYQE)qD+@Sj9^bFrRG{D{W?}Xs#KOiZn9w{{@4bTG0xJtE)Xf3G%-}Ep=A{INfE1vJS9W84Fn*PG5w@!T; z6{?W>$4LOIxAxps4+B*XhX zXclLcf@9a{FABos$9n8ls1oo@R{4;_5lbfd;x9PKn6Ny_BT%_N_SlsV4T{ z;nV?9RFcf4Hf8&y|0e8V0KMVc@}O%`RE1{eax7i+=IwQy>TNi^#dDdZg1S&wL%?d3 zy#)|%gsdLbOfULuB-w)@@kT-iKqQrPPtM_FJnH``K)^vB{DBy-hO`IM5Vq{KZ!>0C zgeoL7Vl|F41aC#?W262*!H+3b;UA;9DkY<)f4ZP zVlYfbRTAho5vJs@D(R%CHZcSyqbdocn+R1hIpAN?lndX?Q#HwJszKk?zOc26`dt59 z<7gwOuPsJB)sK{m{acBpxWRsP3F@IUM*R;Fq1pA}U6tWo`L5*-8ppbpD-SQAIMG(HeBW$++nSAMEVn2g>>+gJVyGHk}d(V&10uOI-R;>)-3erIC=^F z0fUOs^YT&0HPqW(f}3ARaEplI9}Bfbx&o(%cfEqXyE*?ra<6~M`uvuxY3#-a)yYXw zh@>G*TDqa^4b#^z<60<4FdLQ15oo6dkTVS+){uWJyz5dwK}yMIMQ0>AP^n=Xb6{&r z_D2f{7X<*@Dl@lG>}B7tx)}$o_9AP{5vp*QED&kEBF(a=qV>G>r2mERt~mrC?;lh` zV9W1R``dOU<01ISMEwpNU-95b5S7e{B*vmh^aff{N+;Dx0t?USZcc}oVFrECchORW z9?VTnRfTU64X^aS0=C@F>U^A zOLm*Ic=ViWvujMwz>({GV^;OPuA`^*h>iQYrN##7Eo~%rpktle+g0qXV=Fqbw6{_k zxbo|BR`{%>IhYotTP}fpCuVX~G@U9Kp1*<^X8MeGBHck{O=;zsnE)um1G-WPfT=tt zU@Drzs)alt$n?wDD*Tsgbsh);$JE1s z=^0C(|EQ%dofEjG^nzR`5xi_k0e%P;}kVC*dU4r5@p7T zS98kX@s5884L{;o_ z_iTQ;_lckU4poI8=-|)&p-ooD1U{bl0skKON=m+&WOwj;)0=!T+E4cSlP_M-a+g|V zI=Fzf&A|oxuGfpnoUE!eMVJ+{Ua|!%X@+Gs4CvU-V%2c z&o3_d)0J-GtBMof{%$w%?;xate!lX(Zepr9@vcTUk^oH%iVn@Ihg z!nSQ3A5;p@!k;ZOxDWZZ?7tM$Isf+#xn~;+Qtp37QUIY32dDHH^P+^n+NUK21L$-2 z4a;~fbY~Y43M%N3Tmli)^PIh=&e{2AXm08C5Zy8(z`#3}Y##G%Jq>>=TXEWt)O} zLZ>D{lqrvWP_s7ySY1E55iuB!!i-Gkr0@ehJh=*!WFA(P`~}?PruZbP^Zx?9@;in~ zOuhd^xUevu9xkXGfUw=yhLy;j;d}e4e2~yM@8^NFrwG%izt@|PkAej zt+qUBHP++o$KlG(a2Ad*F6_g_IK`IN0qlCkC!PxY%t!qPyOSyB`>CpWiF+db^q-zs z-_Na9H2_#=Vb3*M#iE(Q6|3o-)1?yut*7L9W79Fs9mCPPL2>2;>SAef}TX=~}2K zP(M36`r(X}Y>xQ0!YwCK>AK}Cl$yvkysf2}gW7(=a=rwXbKt;8vQMrF$>LTK734tE z#wRZL4p$zzPMEoD`Yg$XCB{5Z*5(fNFiJ}?^2;WSXv)}t63O&Y*~!mg+f3ad0foCc z@7o#%PJkJxlr)03I7?^fMnFV?c*w%NaT5E%7E0iTlsl>(rwR8nrKnTN(oP~<^W*-!BZ0<|7j1l ziV}}wivs(Ta<>#*$bVyvE$-WPB-rH?Rl2A$?3H(dWQAElUqNDkbVlOf*50zyDt%@| zXY7V*$CDd0Cqg!Az%#cXD40c0lRdbgBL)*AdZw@o4uA*rXe+MxzzPpombTCjc&8l+ zT;RgqE+`O|%40945D)OEfKc@B!wv+%?Gyt)3N49`g|}ZL>n>8V+MqXr?e?dL9y}t=2{}@cZG$Xu2xkUvnv87wrh4h{y zEbq={vxBLK2U80B4yH=6kE4OHt3iWRnf-#!W5rwunB%TQ3FczgY1FN}&c$8A;4UG! zO8|Fp(Gc9-hkbN|Fz8G`kXwO4*%69=62(1uBE_@fbtD?=x`=E}XsasSDuUFi$l0yZ zTY=zqRN;;ud}eT|6jqQzT-qtdOZU@N(dkZ=BCv?Tbp2h9ao-}=X zIJSGd?cL&F~^7hY>?Lw=~2 z?Y(Lg;H-!bYd{%qXv*LJQpfX62a_+(Zc!59D0FT;+53!Q+igV{8^NgIW{W<{53n+l4PxSpMVbh(wmDO|UX1!f8se@;=Rg@BbA3((XW|Fg-~r@S12 zu@>rEta`4fplO?q9aI=BEjzfr7`x>pa-4YvEAw;MPsas{u!&};QputahhEF zgF;4(nWIAE)~_(-0iP)x)(4kItryS6l*o{^4Wa*m3ApOuf#h>)Q$AaTO{@Jcb{qhQ zy>z0h3BoF;$W&%qndWg=gpTV8!!rVW2%do*&nHf`riv2QU}Thm7^s^k_=Y11??}*S zqNmDrR5=7`3?=k@+oq9L?;uSa-L=0pTpS?>h(qyGL=ZH|pnENXil~!`h}rcFy3|;t zWl+Vk?>)My1`@|By#tA0@j&8erXEOq>4BW!KpxQ4ua8}pP)hOfa@j{@|97tgeljPL zrV7pWz>b_L4?i@95ej0cWETZPIOpI2D2W*97p<{_*yrxy0Ry3rjbYS5V;o-H9%+n0_eidaP&CHun#NWc z8iPJ7)0H{I!f{r|Xkpk_G>_56;Q=qTAy`apIQFcm4PTnt@}#zFFo;IfT?i$iSZ1WL zR1%>8;gM5>QaC+JE#Ft?$l>?tu<2y$4>f>rtoEW0p)%;x0D94fZlLdkSI~zbu*IN8 zpA(_b$Ltz?b!zb<`)A4x$q~FF0~L?Lisi)`g2h;aPqW4vzBJavJC>JGNMElYxADFc zXIMt$o2E<{Rk$04-ytoSnRF+)G`ra288D2UH4NgAn5iDhcRYV%#lfc`CV}mjtoy$* z1maD;=xYc zHjeRwHx`zO@pt4Bb$2DVR$cD z`9iXkf>AlJTL$uNs8P@*+L!~mpjF{Gd>ij0?l{~E8_u|o$H9PHiVFp#5gkCi((K0N za^4uIoLZMv@p>hVfGh+#U(aO z(nbMbuxP~{4ex57PYZ;sPNH_;K6ltfIh=5eL0U$u>-NGn2UgCX+z{p6aW{Nx-~;t=ewu!N3)P z*M;-PE_g4ZVDg$#tfWW7tq*ziBf^la^yo*k^a|vt7#bx{)XW!X+N&K@Roj6(i(v69 zShOi-O9_sCjZ?_3+P+33C3#w*AwbeLgH`GvG#A=ls)6{4b zI$Z9kXNxn{d_a-Z1=})Y$-}q|!5tKeT4QYcI);JG(~PV1UztEXZuMzQb>_aWkbMOY zIwBlJ8(dk-!N;7vwgbX`vTI=nsuK!=vm>r=k3a?C9koFZEMJEr=fW~9`HSXPqi)j! zU!N#&C(!VYRUSRJ-&JylM8kzedYE@jHjePL4)k(>3b%0BmErh`Ys4F&v)0Nuq|h|< zwt5F|UJ=4+Q=w5r2!fCp$27}c>9`}HW@mz(#J78lwvj1nx}7YXZV^lXlN_|SfP?kt zFptZtBCuh2)dqwp6EpuVc$7*(Q6oAtDT)Il6b1SLMU4wZrG%m;grd?yQ5<$qWfvw` zv>jE%>=;yy*-=R=y<(BpfM-Z@^$BDL*c$PT5dgk10>C#$09qVIAT1*RPx9L0^`A$) zmXWP{Az3R99#Fo4$G)ht+$|co@7T&Nq?LqG3ZTrF1Z|^75rS1v4zi!%@yzNfiacFY z^0^2m_126Au8c%;@Mi?R2Y)iR`&|gD3n8T3#R5g7&}AU_j>9e3^MJe%daQ<{P=A4J zfq-&|O<35-h4(0D7p#sKnGHd7BnMkJc5U?HU7s6QEBAbBigoD~AqESKKzA8g@iAy* zheDoLcH~)*M;KRNaSYmXWCu>^M7^>D;fRqPP=wcZM?p7779XgZl=(9le3&=th#E{= zA~1$juds_3HI^2=HpWKSTA)yi0_P@NiUo3L`7P{?Vr?8`kV2O^xQDp!OG`}o zOHkhFj`+huDq%Q_B5{ha6OpFCw1#CWmcfK-a%ro8YjC#pC^K0r}gi%u_2J}s&OKowCDKuQIfa} zfkK1K&zkIZLA}uaq;-b`csU*uh99K$2)4z($jY5QW z!FuOlv*{xo#hw~RUIf{3OxzPh4Qgtl&6%zL=VEA?*uI_+rqVZ4$lapIXH+tsmv`uz zW(Iu9T)`zg$XLO_>nFOn-)crx!%=&5IL;}BBMNzsF)M}RqXLI&25>l1T+K_6;y(hH z>1`Q|TG^{iP%$rgc*l+KmQdG<1pn=m;?VD?U*UFT35KeOT}W^ft}Sky=xn&!I{@V_ zH`%iRm3~wj2<+H|@5`lx8bi86^FouqT!n;-)c5?4%cT=I42I#w;GDz!#^HePXpx$L zXvjo$a)2WS{|kp2qDWNAx7C1sfV|h5jzBw#@?W+_u5r;2R3x0f2flT!M-OEvc2vM~SBFq$9 zfQVkFh;qyElowX?Ov@zqiRUYP*|!LD1RbKxlR0>@7>G&ZM^1A~D~d-he~LmIHPhco zR3YiTB7OMDn%WIY(2;wOE^&y7vi0LsR(O2@ z#Gk`r2SmRrzPv@zg;ojm+GsE~m$hkr#PY}`?d^y!A#HR5Sqd&?nf$avo!QIONF?P} zwGeA|B9y$y+p8y&y|}BOQy~N^R(c{8WYwZYWyS3nogwy6URBzO)*TVRSBbzsZ?#jy%}+{3v`eo5%!c$^ zVzIaU2(u;T7YY1Wln0E$5Hi6(uyr;PP=+s9pv(+WT;V8#AnrTs;bK~s{6(M4OkSWL zqsUP8HqMbxN*pXUwTMBQegwynI-WNrkhT>Sh(1LSRL60F*?XZnIotX8(rBMluVF!} z3dwCXyg3QO!?QgPwLuKkusNE%AnXX1S134lyDSu#bi0{J$;maVM03v@_vNgTz&3Uc z-GQsk?M$%Xwlvwb5{pexLp3Z8)v!45>7R&t0SF1aBL!qv@Kg@fz=G=GwsD6BP;S(b zHl)hJi$Gvn!LwAc2xtL5D-o{7AVDIWV~GiW_C48mJ6ZVpiev$cIaz=N5BAJScr5#a zNbp`0go|Nr{wvK-{R@?*0s|5dWhOl%JYxX6l+|*?7OoBJCQ_kF4EpLZ8i;g!>~r)Hj?MX5yI+xnI>-&`PjU`O&t3<8i;_A1rc?OxI&qKN&tj( z#|jh()@Rn~xR_V<(s8jBXZhG`?|JodZ=K*_1!64*8##snNCaOn2qJ_zOgm*6H!5c_ z{z^U4p83fu0H`;jhvd>0=(Iq&hvBY9jLD3Y-YHz{1!dl#NemmSyYdNS;mVtA=VNgT)VyiuX5=i9=^C?2J&P0;gzY^_cXHLuFz)O zbdUofv>}ap{1|>YLdvgOI!@mUd4~-SiVz7bh?RoB2M5QqiY--Cz=N9Kixk5dp#ZfQ z7?C|`Z$+8`d#zMS19}PAa7V^eD-B~SKi!)a!=WAw`s5(85VhloEa~4@(Z2!d9ykv# z=EyS)i@=1q`%Va+{$})oki$?I1+1P!kt}FQ#d=?&b3MHm0!_>Tu*-}M8UjkWydX+> zqZ3iuugZ{??gFG51;&B&RImU*H4db>yU20(gykTg>^a4Q!cOVFmljj7q?)SED6Gm; zZVz%f)jpw@R@v8^{8%2DIrKRXaiHfgA{4nK) zN>dt4zV+@RE_uByTmYf?x{h?M7I=pw)PqajIrtjHUy$;`?cD9);0?Qj_cZJRK!Wgq z2e*@m*4@f{7r8x6Vcy0}koRO>z&iLY0ATSxD8QS|mE-A7R1w~_1|sD#xLFl2(4;Jl z6siF_Y6m@oLgdUM5K0OgK^~`p`=l;;vA_ev50J%lH+uQx z8+8a?0EFgZH!7o}E^(vyNJCMsy*dh+OwaB^6rjg6MG03pkKW;=JzJ8t)k({iq+OxY z9%#!k4fD54qlAj>J<#^YlC(WYE5h>0rBN@z7r;B1tOqr6L;jx z&1`U^zNe$Eb))`GM}63hYS&R4-KbBN)-|c4kjcRH>(Z!45k;zr;fjUI1dhU0B~Ht} zkzj#}Ou18#DSI{}VWlyVFJZqRi$!h$HD(a0mQHw}8Sfzf9a8ZIN4e#?jExn@NUu<4 zLr{fyr#|Y{*gOZ32GNBw{9nI!~>Y?vSiV>O6lB&aNnFHBUJ zt!2cXhf<*u@`VXCP!3HKj)uflpmc<5jx-(W(l##jbV2?BS`>|mYlrkY)NIS4r`BJn zM%02^&iDY9DQS`yIU-wqaw>?2$=Dk*GD3+H2I9~8vY*0Vf06i4XJ036<3&|}EBXR3 zs`1$pU+F^+@uScB=4;Dx{>n`Sx}*%&cT-% z)X!lOHDkw~YVyE5Ls)c=s8|#BUQk)48*OM5XPa2WGd&fkg0S|ZK0Os-iAq%v{SKnM zcVakQC=WUHyrgo<;R3RkhhqK;zo*iP=teye8RHi2>B5B+*!U8V{|7RKaF|qeUX-1w z2Z9XCa5$boW4h3Nc)7tKg-ISh`8<+L??uO9?`16rV>@j3-aEa2t{#9;<}2vnE=HR^ zX6k^|Okq&gEU06ehdKTx&ta&nwOo3dtV#rVn|%~ng|2y!Z)Z{0eu0fe(=|42%n-Hc zJ+n%6#+Z#2xIhR0FT_(k_&$1@x%y?F`3iofTgQdkKC8bXcbTu~3tc*{dbKGbGRELu zps4Ac!b68mN`kB}`y@AJ1ZnHFW^V}AvMV!g&bMv~;G0}mJfy^xsBQD|uy5mM3uRG(o zcI`Sk@=V?jxp`ginCO7VKqd|OYrx}cgODW0%MaA`3Egx5b#&-V-o0*K7dpLYP%@5z z%*s;ejvINn-$%e}aGQ*=$K{y9qP z(ZL-9*)7wxNlOIV-09XcZJQ=8Y zB8;?50~T8-082%Pj#vbiUM$V{)JJfmVjHgfkozMCWyhxN$M`E1h85 z9t4*-!JZ!>IL{64Mi9#!=p-!L_5gx}T?J#i?%CXpkXhT#pw}R9L^z#j*sic;maW=z zff_2SoBKIT=JUx3Ian=^ghVB76|e(m8l=|YHc7|UaE2;eXlq~<%cy2M23-cq8+519 z#&J`!=(REIA@*VQk43lgaNRGJnQQLU+WhR)giRvk=E&El&| zs?4jMnn8DKR+%y|Zs=L2sK+Sv#p()AcT#ev2HbIxoPvt?`*uaX5wH$$vUZ*CI|H<2M_uqe1A=HuXr z5>V%h{O2AmHdSGiVSlof`#0v<8(HDt3j4ea6V~~oNEJr~YAmn_Q%zpn*Lu2S7MOV1 zQZRfkd_F^SzIgC&)(EKVhb498#Jjktu^`$$=Em4Zx#tNN{+DUYTNfIeE4Zo?^w0J8 zEbePLS$)en7(&Ch)__jQh^rWxB`jI$Oco@8yA>KOt&OxXZkjAAUS9AF=@062I>vpyVo>6fQLdjW@wz^ z#GbBkRYgduz{b9}ilke`e54P=7K)!9b{Jg~TzE&XY*v;w&_~g}Mz&_KEuVgyt}JME zhtT_E{|e>ma8qs_IE@gBOAKU=vzU*9w3xvCAbhHC;cn+tg1phBJ%VFVm<7O9@CAU? z?gH+~1qZ~o=I`q0!2|%oV)jJOG9KC3^q!Cl+9w8mU=CPA#E0~Pmfv$Dm95j#m}~v- zEW8YKb>Q|K;mL-(8i`@q5iQLAJIzO#yG1jd5=SH$i)pH+>8K^;s0&gAe||h}6niP}gXwuBMc0*XH5x1%w(WAjY=6 z7H6<7Xsu2*kNCFE!QWY}xW#5zd=Q6cxi?9{-AN;;eBZ`=P3Q77S7NQf^pQ(s0YwTo z*d1GLGZwQbg3vvT#acY;E>zb03>CD%qcdiFNJih7i zdn39u;!9k6Y(Qq;iOJM)5tJ(MC>1$m1e;k);={+<+rnx<@xy!*LBDY`8oq6f@Qu7e zDfI9xjQp9M=mJsDgh3p=pb3LG;%fr&5BrX_S;J*8c6+E@SZ>^Sz&mI?GOe3J;%RIE z-S%zFkadnz!4Lq32Sm7QwX=Dl?egz3kU(p|zGtv&^^||;O^YbDI4F*ma;}UTw_hfOm8(%qc5FR(;4`8L{dk_R6SL zAGKFjTlLlO`LgP3c>5L3)|IQ9=LG>7l}yZ_71{doxkS{NT;*y4sJa^KqUvP)5aymK z5y&!6EQwErcT|hufu;M9)y?74sF7(}P{aFh1_c?YDglV}Va)DfiNua~jn!)n5k2?= zyMb(c=hQ7;-4PTp#&;pKdI%HhNtBhFd)Dz`HDzXB0oPsJ>_7+GoGmw^P%ChEXf9;D zAjaxmCo%&;V!-O=R)(ZfMXD>a2LgZtxH0XQS!_rPs$*EGuuD4kplsqZpoa?c4@QQ- z@UF~`dyyhBbcR=}0cDf7y6X_b9XUDCX?4$4!NJ%fd@x}!w$%BG=`Wk-+2Ep%Pd8o92DlEXVniT{(g9~xsd^J= zk-l-U>zU)R*k!Vrjj_y_W|)e#Or=f5xWz?nDt(Vx|7*k?RsY)MmQc7uN9O5{Xd=&? zfiThU*``Yq4|G@s8qpzqLsi5#%%%92nAlQLWf2+kL_!?}4`}3r&jjU*rbYQ856bIV zjUJ?>)0SB3DFK>BiJ0MT_6zBcLbsq%yVm|x$(cB_~AV30dVTIicNX?{LS=dhOrbiQxD&Z&mFF311`DV#p zV}aOGQfiWOUMxbUXn!s0z{i%^a*M27etnK2JX&yODOW9ie$Sb>C^6u-46y^qI*ARe zl+>{kiP~NowN0Y91%tR?*Q!Fb*OyE1jZ8#U~coM z#M@u>$}AQ=dN%0@)FV6Tbtyf?@yrh?Tt_^s);T5w1DazARu)Hf)lPHl_sq1(W4qOEH&A;@ihyRRh~<6GACf}VhR9Pqv;mw zmTKJ5b!V+&-~3t>E~X`QvI1DMx``FG;ydsIvnhVpefldnroIMZCxMS388Gm`9?AH% zcz;X~Nqq$aK`n&w{c>LbkaQL5O-{{d#XKhobV=f6ux6!-uR+n5ROeikq`)U;Mk~h- z2+@u-wEqnVD*fU^&1PM6kqtGv__DWyRE8T$JXL35 zY=P)x94bYGzE{{>z)Da5itPI_SFtbZvVnFs zsv8&yu?p70o&vrN`1VpUj};_9Lm+dsFxRC)WLEM~im?hW{TdI6n-Nc9V7e)*j1(%0>Y>TNZW|zVyrh$>xwOr$e42eYI|( zkWo&&b4DoH6Lpr7<{)ZLv|S8~If(jaOoqzlgjZK4QKcMUb`S7JxQvB;FWOaq-k#Gt zvhT5m4nEuaLKQUdsngHy;{&sD^KUDTGvql$H#O%Ex5A>#Fh7JEBaB6&ip7V3K^q5G zGMlVWgIGSBCogEZS&}r;3z!!k{B+320AB^-p|hEsQ0{^0-WdVKQeEhjllkg`%y+2F zgcMbgF|R~sw;dcpKs(~-gXJ1M^QLQLt~64bv$O?1Vys$d4*H0wAe&D%2R9HOK~gdT z3tDII?u0e@iwB!=<{_9pX*UzjLFOI=0jztsCV?byfc{%pPg%T!Q~*IXuQTBrkmwRE zZuRmE`~m>Qfe-O?6fgXuFH7)b!HYQZQD?3DiE~KWSebDuA`b^e_f&*&(2unImJa$Y zGjYwW4;^&1IK4IP)#AVvIHzIHN%ox#6a(xiMJSv6A-re=AblEK!%vP#_G|@=A^#U- z41@X4-?N#e^f;cXR+d$r=mN9FbheZ5>&d3?Elu|D;;_(Pbf#wtGw~WNR9m&()b($w z$-{-&zV4FFTx5q*aeQnoW$=t`lPaxWLc0z+7ho$CMHs1|#RVV4nO;BPORt~sRUcHK z3Td(QyJRGV!quf5@_8R1Hhg|Qr44Nha@=76mjOEwJ5d-BxO_n8xKBk?X*LbFzy=MW z%sGz#BtTKke+Uf7$wc+V2}*r&qUV<_E}pVwrKc<@^0-PFwednSzA$$yOJZ^XwH;0o zvmV)DBQ4X8Ka8iUtgE^npV@1RB0s>$%NWU_)j2O=WSo(3aWRn#89ASk_%M;DGt$uu zVaZ~Gm#17#e|eP1b5jkdb3j~!S^Gd+o&aF>0UoXqADj?uE>&Z|h3%95Qk7W-E4E5w z#*Xn^23BF}UKM_TmIPp)Tz0-9tXxvHwt-aHHOSORTe^K+xkj(2@-?RTaaB&N#nvW! z))^Sz`43c6MaD1{UG%al%Dfq)?4W(x&N^5NswE6D>3mI#$&$`GMatsLX(Z}=RjV)J zte~@MIHns}r+86CnTt@)p)B25%?_TCUH-B#S<>0n|3Ebboy93~MW|)5hQzXDtl+6) z8ABpUDo=;C=_<-_q>qj@2kHM$lSmn?DFPwZ9P&K|+SfMqpqLafd9IS0=`5jl-d?^} zftfpD5&2D(ca;5wKWtLwHjY;)!}?&TquB zU)B+gSn$hcc4G}T0Fv<_SDsp#gwikD5ZQMW)^_MPYNMgwjvrbQ4{h6nTFf+rStHQ8 zPC$Z=Y1)w$TH_&m^&w?{cZ&X=0JxjR%G9oVf-b2Jpi9yL-X%hf5o=QFsu4_;AuLY-3EDeppuIF zBoAcgF=_Hd54Cn!0PX~%VzH_mn!bzx&eS)r-OW0nLC*@WhAuDqUN;j3)`0A9*lmpP zZhxTja&3z0G}V~HkLj{(#c56quOJTGIY6C_@w9PJWn*{39kZ2$v87Alj>9NSq~gbe z)V$K8bJUhjgC>bukts^1#IH<3EJRHPzalH~tCbij73Zo$mC{u^r7kEcrC41`g^#@y zYsCtZ5IzCh>NF6Vw&?g=1mQhyDFdPIU&xfw@!o!2HIj1mb&xkqYRG*yQD3qYm|LUmCDe5O|Wzk%~RgKRJ%|eY4}0=9-6US zpo$9_+$z6xZ=tnrAq|cgaf`85*wX1vp(Bikr{*K!sIcar;Ybw_YowfT*fszL=BAa# zb$~Pas>h7O%-jrvscb&}4#ueH1NZn^q`n{>xOO%cwx!aH+^4=il7$CKL_9wz+<4eZ z$cMLhpkhh_v8k!W%y+B`pIizZ-S%*@U*9dxTW(_>h;x~R7zfl!yHQkGbJ9%Lo=0#| zTBu?tc%OVc4O{cYaQVY00PO^zV$O#1*h1@<5H4MpasILAI9CaV{IKs#hyf;nyGHot z$SUuaLxf^&g11o14J_DUU8uv@#=|EffT)SHkpU6-1Vr<(UcN?>kU`^XabNRgW==kz zv3C-S%v3L#IDO>oChP*=7nEC1Rw-mrOxy)QRyg$`ELm6Ua>t{Rb{UOIm(V6 zcEaKOC7X<2qNx4i!55VqCaiU})_{$7iBaQ2(N%aOz;t~COO${ax|tNsl55f)Mbn8eAOUcOsM zcb_FzF=nYEhLEtAAyS4Rveyf4z!JD3>Ggs?#X}&drC^G+rYFKn>jaZW=Lm}FLdbgA zj0}W_9aJ0Pj;{$FffI}P!MSoM023WjQ;xMi?e7CU0&u<}AXe4OzfD7Ko-Cie0%YvX%97mt%ln5MsW2{5p~71! z_T~#q!C6?#5S?4mH{SnCZTqsfWLg|lFojG)=T}%Txb)*bA($YG{8RT)B=?(}fH`Yn zkhpy(n+c8$Y?>L?Z0W?%S!ax#L$BBY0SM58IpU-y-}ukCtEcG~yH7#vKEWv;bQYKz zk|Z+lqaYkP9j#Kf4>)(@$@tRZmHn7I)T~eFNM!GkhdO_hp%(5_$SW1f+cl!PagCBJ z>f~VrNRj9{m{ipbRxNQe_K*Ya*kesh+ER1PrTYs`YVqRZJ=41^eEKfC4Z5_Foz|nDc4+(d#P{B~|zln>Gn0CepdWY<{|aza20Vu!J{1xwZC)bX3}w7jNfJ$FM&Cy>Smc3lCUr#Z6tOgm>-hdM`faz{AGB&;RHBFLXwd z&-;^m;eo3iS<_qKmsF?>w06rQjvsV+xUQrhn4Tt%sULsE46fnAxIr|@ZG!kLp|z4e zAp-YkIr-Sn`44fLGw$~nI;0ZbRT?>d20*4K5hi5l@w^-fiQjt=5E z!;0j9>x4Y9nb@jJa0UrcNC&XUl))Owr3!ty zpb(dmv!Wob+8PoJj#xuLy^G8l3YqUTQDAKdDxi48MKExVK_JfEVbIkfk`+R>o6#{9 znkZBV5jaXa)u^f1q)priw6T&nO{u&`~LG>85`fyqfv+^()Zj6zm){ywVj^Z_J^t$(jh`b*l z3KQFd@-3W}%YM4BX*}qJ$5Irlmj~b+HU~~E0Dz3n*kcADd5ye_?rUmO-4kw0d+QcO zg`F#{8<9qcSdR)ZK?U*75KCow07HYCA)t%$Vkn^-<3a&aC{_J|7if-Yt6LVTSgrZ4 zew6xs8k+tu)t7idh}Rpv5wH+&78|cZnB_g@ykf04bGITcalTfj7BSD<$^{;eRnl-) zV!XLk8E=p(q%SK#L%*U*@_<$vizm5A89dM#z`_nM&oo^Gaf`)P)7u3-#m&cowzmDwOoS{zyN4f`R$eK>qb)BXz#WESM*^i8U-i#N5xL9PY zNepemVuj7d9(S9)MT(l*-uf8soW?ym<4`Uqc*wK~8)#z)U|o#BMTKo|`)}5x^5Pu{ zjNT+~jBn_~85dp36Mbc8{R!@#*&C$Yg3&5jI)!&MfRMbndn4}!Q;)Cn5Wq&KlF~cD z^!lQj#gEtRhm?t`Nlw&W-~Dz41&paM9vatKREsyqf^LL&N2^^l6Zpr7p0BC`z#qkz z1`OH<6lk-v1^+H2D>p-Y)AeeN+8$(xVaFp`6lcBPMq71=hlbEep3A^D{^EPCeB&>^ zuaNJUd|xTwEBM__#{mY-@qfF!#>9}~nS{1UVx>ZP& zICBTv&BSyD%qcv z6n%2NU@)}4&C1*Q35WRnDJyX1uZRFYaLJb^^y+T%yt$_w41#a`MZ9E@zo0K|5ZL+( zLf%@?Z7?95h83XdqH6&(XP_)36N7J&RPftwz#J>bC-F|-1c38pmxD>MY7ajUY5*6@ zSD<0j;$C`0t5)75otUl_z7vydp17a|>jWI|jZdzFTCq;y7goRUjzfxj;h{`130ciU zmI(O~TI!dZp+PbXp-^XcMp`2kRhXz}ov2C^rGz4G#nfaQ+GKU-bhZb&Pf*zqN6#@M z1Du&g@$>fmLcM@Q`DQ!UTRgSSbG^mJuQHdHsqausOq#nI; zM~$*;tNSlvK)234unKq5ENh{|ZkOIr6!8b?rxx#*;>oXWg=%%6f-4IGQm23wB?3VW zI}|1(0j_2?&!dRL48yL&14+a7nh-aq#&AYbg~IplWAHM(xq!p~uV%;lRv1L-lx&6Q z?I9z4DG~VE;r(g>4;YAFo-zLniJWYe%6x?=WC%ymCNtL}q;*aWWoEWyC1jcdRUn>OJ#l}*g+FP*l)JX0Z(xTJ zjIAj-DvISh#QRY1Gc%|-Vu71R9X{Sqf-_RE48dDvyzACB#96Dy(Z%h~DdGNY2eNQa zR{7y?0cOUn-~s*G2eYCMw6>k`&-(4PpWhySV9q8yeFw{is)gMEtG4#3*U%AM$`|u? zEaDPhY#}Zx!#h%DHok+1!m9y|+r36U9FD@706>95_aJzDU>h~GTe`DGnYA>nz?~v| zORLm2rk}z{0#7nHQ66{Ru~sDlkw60CMQ#c;{yP>ayU{*gp&~6huSE)x8_V(vq&Q6P zSeElbg?JyRO$Hj?kEs+j82Bv(-uP?z5;q;CGk`jI(P+?DRjw}jRX9oPA_)+J;jSHy zLv|J_8?N)8A;c*bc8sNdv%$QpGPC6Xk7Up`tj=WUvk>6YhJjX@Gz%_~ zd5zqnPA~EO4#X1)dz&STD@L^6kTH9TNFyrh1_K;Kb*&2T%fuZI$}%cy471GDS)@sX z=M@+EB~skeCmMq8N2RL-X5;Ph2_ZX#mduo(^R0ixalq%OGyhY=PL!glI$k?`4o(P% z+xc8Dq;|ODoC;m(T*MF^gRy!1%Dh1(xN{y);NYnr3fjynWI+&#RIo51-l#$|5rT~f zsu7N0`4h9beak|q%a_IEY%0i#;zms|p;{#spt{>t1&=wWOq4ndCgz3qMsw6qbZ361 z3yao5gZ3nvP&y2}ZW$q*BFW-q$taxVo%A>14vBmPuOG-&@|_w7uqLFgk<@oe>P041 zy6`^Mk2~0_W$BxyV1R%~LLNDM|^EO_I82;>c~{q>i5KGVnUb zHM_8I*YK@~V|yO4rYpMWVL2SZz5#pAaW5@16pU{oz)j6tCfcsVFRu??eabrHRbVd>8&wx~wq6C$C6R z?2RZn=K27{{Ty++v-}KqIAWY+jq*5@8E!Ye9=szh5s~~vrwdzovi3F25=AZZLsShi zufVZTk=jyEJz^>oxM&7502V1gIEF8PhgRu?th|~L6ALcx+s1qKn9OsMxbH+hZm$J^ zc%HT)nE4Q=B;??0j5w*^j@Ghfq=peVj*(&oz#oNycbx=FJ*eWyoK%gck<4XDSgC0Y`~&N3E&_!3#mJGxm@fabW-%lqhV7 z3ZWIDP}ukQB#g_?Th3umIE}ZcMu4kQjYKUBq|+}4>mH%6kF`Ut^Rc>67u1V#Z`LW~ zPI5VhZbSMw69~c8V(Rz^&@)_Hgldkd)0rP=w7i^t6V`57`QxLF7CYHNhYA+~ExDq! z+CjaSNR)3o^n0!zJPsPJgrfwKZk0ilnT#l&9G&1e*_J-IJYq{DfygtjG?m6<+u+R7 zJW~c`8;;KM1JH`Fz&DxxBrF1pCbH5Ahg7J=YAx$1!$u&{5rE-{AO?Z z>F}-tYQ~k0Ckr52U~~SUD=VOI1b)F=lFplbFXKr*kT;j;-iQ6veJqpKEVbP#2o#5m zd4%e|?_fkS-{h!V9D(V{x;TOl-1cNyj3WZKBL^2LKSqSu4`nd;W}mh9rWX$*vWZ;4 z5jx)!naFk=Xqxe3rpraE)}5?KDzPud6HvjKW7fq%whAk-ZuQ2~Bf8YCJuyg(I@E6(798 z@8i$lX#2&%#UtC6Eg0eI9q%M&FY`qI-if~HAVBhE zml`v$(%oFvORC{d2mROUTK zEgUlw0FEQag>=1*9Ve{g5XQQQN-oF`n^73o>ttM;WWtyCOCb(c(o{vWB5X<_6y^LC zjG>e<2XK^sAnrigtbrY^0MgN*ia-ey;kKyWm=M==G{Qc(z~Cx42bcs(7t0?;!>QJr5&?m#^Y%;4UY5ND&iuz=0j8veH#?a@C&slsh9Q@)?v5< zEIfJzf`>6;0Nlg{^RmgCPFQ6ZY!yWN*-hBOVQgko(@pN8Sj*2ryqk zfLV_-2AO*R6Y?f|yiabuD5o$+fkLdjNAZ?lVQuP+3Lcb9`x0wZJT#o*B>WZx+Ng9Z>sFxHhx$;CgVMYKCT7SU+;c^A=;pw_FibkPaFY z$7hNw5k)C&zZLRaArudnth?b~=c;k)@@^D8CQ`O#9eZR_ra3`cY)6Yiw%8Ohd*Jg( zS)8iIBnyQJ9oqa-M$t@-O}}DVv=1u>YyVIQ>0XPQrhvVw%#)}f`!7InB@NY5X97|5 z$A4KgwuA5$Q@&rd_C?@Z9)_kLHku-D|89y0h%{4p$M+FQkWme{-w(mhyGLqoi8sS?!QVB{Ps!F*8i4JX>vHK^8z?IK@{z&-wALl790ZVx*BG7@SrX}A$ z!dd6&%x;+KsClV+uzv-1P@Trp`^p`XZu&sm>L;aMADz z-Cv^%oLscfrQ}9X4Id^83T!fqM?%2fsHZ|++?w+YvR`%fO&G#Lp^UlGb2@6DJqLRx z_UiP^eZqM9syfAZlda!(nJ$^D7YG#3Ve|{8k91*APLrN6Ql^iz^aMfg^ube`Qj6lb z38*3Dxs=2?JU1@El5Q(jlxPZDB`?kX9JvW1EPE#9PqYK%f`)jPEk-jX&mV&fDzdYT zlThogq!Gi|8-$~z$o zXu{>2R3Wu}7dWG1gr+uZ&w+0c^itcMP~AM#hJDC9=_2zniFe0JD=tD`9>rypWgABw zEpr6e7xiVBEj121>PyOAJvzPmvKddzDfI<~P}@<|m!-&#ZCN0{!j2D>s4uUPWLz3O zA?k~PqdCpX!_rQxnSDj#b3~g2B6p?G74rmO+dh6W~i4rH+QIu0yWt4=K3dX9; zBdAX8P#3ZBT$Ll%jXI0@ID|BZUc92|FIW`7`Hz$mZm&Ys*>{tp9l+^HaE!V~A%R?o zx-x4afeS@p679LF0z^Bo1|D%$h2dgVAvcYx@Q=~&*TLeY^!wZAH2qFXDtjfz(MZLe zT;PQ+hhL~0j8Ql6Vm7?v@6ZbziKpgPD776>OuZ6M20&{H1*_O_JGP{i^wKL?Zn~<= zsX@^1P*3*g`yvs~OfXen!Ax!}2^1EZi>2sX1h`pMp-e-1QLOxCBp~y)RygnoPlXsZ zl>U*NI;rJ@tc9ZgWSMG|wb;I0rcib1hmUKN+hr;?Tk(w8iiWjApUNTXzw+wy?24EL z{+YBh9VJ74;x@RL|U_9$ za?U(vCQvC$I+UT7Yp%8Bb<(yXh;Rq}H6=pfB;3&_5#!1RLC3+Z*#8*|yRSu@=YZ1) z_Z&qr-c6C5wpw7iMNi+%%8h$Y3`J?i0f;1Wp(ct3T?7*eR!g4pH2s(|C?cwCeP@(DVf5*G&qybKgt)uMyI|QzFoRE^J?Z|Mk1Fh5a{Xtn&S@ z@%DdO)7N>M%bLD~v_T8n^o6ewIzmiAaVau=!Ewi!zUF#|=Rp)G86F;505!om|2sli zaL)gB<=vaj^6D(8%`z6aSD{-st|Dqo1Q`)qh~X9}i|K(j?*Dw!I|zvz3=kBJYw94l z%)VIxqR8?%A|Sm2U-1JHNNW;Vyh5Wqh@e=(-VlHXoq2^un)kj!Qzx&`6y1r7@t!n* zknntwGS~nNaBc(9!+)25spP9<-So)*vW@O0inJY54W?<7&n}4-InO34(FDy`yqI6MNI6L@GL67bYnJ);@-je& z7y{_E91*pQ7I(LATtzNK0xr?!eM$UcGxzIwI)_0~RpoQsdQ+%U^~v5U-yxA14Glzkv>E(-dL0efbpOQq7i~~z#)5Oox}ys-f!)*jK72)D@e!!7UaZB7Q~M$A%*aj zq%|Z3Mi0)qdo!>AM!(#AMZR>R#EFYw)KG=oegh#M@ws~k)9ez)_!@KpKy!~Bpi2!H zp%L>HiHAG@am?s}NXBtqyoYfEh{moT?iWGh>jndL9PIR(O(0nGJVaE6s6~SDgrwx+ z_G72v2wZ4Tp<78U;ZV2zpw@`4TIgJ;9n|UiZXkzZWDf5Dc&aRy=V_iIbTCqpRmyVt zPTZ;j83R%1YubdYuus=vE5@O*b2#Q`t$^i~3h=K^QdzwSjSl#fiL4gOzX9J95Qb2V zQ60cSf5l~!yEDRhdGtfMnP?JGlQ;yzk=r3627UA3SEY~wxyMGzGcKvFWd-j~hinL( z&Fx%#g#Isi?*kuqRpo!rvGVtw^*Yby-)GETD*~ zp!QGdB%0Z2AiB7Vio0cHSAIX)1+_v~t4>R7vKZF@QBn*zYF08%)SywLR(al^bMN=x z%p|R>?(@7}PnF62-oNLbd(OG%o_p`P!L;w9<-Oox1wnIjTuLW_mB^318AF<2GA}HH=GIDVNqBvoEwe)yKh9M1~(Y|63O3SST1Q> zIa@dz=q9K@x6b{C0kOqr1?twXS1ktBm^TE`!>1Un-|;Njhfw^K5yX0#>q*0C1UX?bcG)9}p*_&8-13 z3es2ql_po}H;qf@7BPt_7a^xKvki=}8M7nzFfRcJw^f=|s{AV|ue#tMuvMXMVytJ! zk?r7NtVkf}3~FNf9xk-Er&-Nqe8%qE6zCY{76#c_Sq_3Jt~Tfj1bOWW1b?{#QM8DL z(3~tgAv8lGKCrSS?=NJ+V$N~bDfR`oCO+&2l*6zDctcGWCrYwN!}wI7ixY79KJ@V5 zw!_Pq=20S*K~_Spm9f|WF)bLSC3bZOnX-|+ACDQ2jaqFh(x~$krTAId;?_GYat)of zz)ArsCmfSxplx>@;xBC(Dc2AThUgx>F?0QA%}%Qw0ih)Gf#s%qk9h)i7aADW<#wUr zQA`|;0O+ILX+Vb+omr$h9z-gv$RrzaN>Z18L>5=*287O&SDs>pb($n5QSJ3mV+x}K zQ$*#V=Mu~87z9L4Q$eb7g(73*VB`&@>0-`U;R3su(^UA|Zt}VayPGpsxCjy)&)wZp zxbS1FwN|tMg7Z-}&&8Z#c$>td&tJ?zUn+UOSlpV?o^tt@R8>W{18TkoP;l!n=5Wtw zk}Rpp8?_=lr?*&hzh<=he$BI>AajYpxKH%=byJ%AHH8gq*n#8^ISNq=x*l`CqX#}k z4?8|q-I>hwZ-PP$zagtqQ5{xww_{*ccRR+jst(wMW(qN>%oHE|rO^`?WK1B27i1hg zjaVY&D9DeRbe_i!^^r&?H+V_RL)^v~)i~Mbg*vj&zw~7E7iy_Y$^IzmPeqrETH*xM z){&Yhd(tOH?&69w54`)6o(K$pLE_;5@+PYjCmSZQ8q4jz4NtP;5y={Faf|E%-hkyg z*;rxoOpIQsu0Fl$K0jDhY00_cG*Y?^Go{np1mO#7B>v2q+vi7h^;xY3Cpo!)C9#Q= zjf_@)3#AnB;586!C^xbCYnKlXK@);8Sj?`0N|9zQSc>_>+%@S$+<08X4L>%TyK=JI z;6TiIS3&><$;@8!C5v|guH+~fhe1 zKTv)pRG?l+b&9CKrasPw_`O*U4nP!(;yKvUv;|WGXl3;5rgP)=FCwUT*U_%`#m93g z;)xeXereN!u5ku@;|J$PLz0G52mi7+R4!FSf^oMv!=*Qm-B9ExPCh%JY~e)J=O|<# zJq-IUs=UG~-K`O=BON}l)D2Cd5k2J%#i$G{&iTkp&$|G$j$qzm!ZDQRh!0uE~>Pt za`U7tRv%W5{`0Vpt7?-vHx{%rwVRPs1+>tqQ+ zaH4zLP^#+*W~*v~!Hm%S?A}6lZ$7)vG|ZwgvSM#5WN*u7?@9`tE&1%NL)j7G z-Y~jcjMIA=9rYr+d@7!jH9X?({$Aakb+URwI@~eOH@n$cR^nY4F~)OK-61#=;RjHR zg&#D&3yRD4zJ+FTU(zqzl|QEb%w4_TqXEQEruSii)X|fCpmxvd>}@(H-g}7^)o`iaYTQ?02O;u?4wL`;9fQBE|L&Lt+*;{JRa7n?)Jc)^q zi1Oksf_b^pQeBWGTQ zpOz~8q#SVn75BH<@nT%Fy!I(w_kkGpwKs}5o$|Edt9s6QBDeEk7ptnNP; zV$^X%OluWlJmE|Rh^ZkQ1mbN+ML3!ds_>(zKNx;|{Q-Wg?mrlQ)PGzzAhw}}QT{ZC za-7K}Ze6e$P6h^y6vbdVaTAA|L^NHvsUvsgM0f7WasC_YwwVJ>eZ-%^aMMBN17EdA zS5ZTpwmuqZ>zQ3+bMCA}E;}68@E-kzVD&4Pe!KJ=*%ubp*mn-L!w6n!xBDO$V|DG5 zt;ZA`o5i}|jZotbwru5X5c9!Uen2`tQ`J!FUrvw>4I@a?SA)=16y=q{LFTF{)#BFb z2CP%dC(1Vw&&+G;T8Wfsk$|DNly^Rvr6d_Zn_3H72rE1G9__NQ6krp1>LsUOSs$_# zz#?UNkkY13Ty`QvG_El^AYbcX!(^-P zsy7^t^~(#=7|t)sat!Z*HA8*qDMD=q#yj(mGEPKF_lU+Fn`B4rL^v>*C8BwNl^MIH z<4dajfknpCOz~@U9Z(e_Q1puBTr_adJs3jQcA|%~MHzF07u!9Pn9qqq_a16x zSI~oO1D7)%6xFwQPtP#RV$VQ-Hd`ib24q$VrJzf1_frO z^S<(1)2Yz!o_3AM0incl{PS09b1)rR4!StgS$ys*5K>xj*-l=p=np>i*ki78`B9N$ z?3pz0De7)h=DK$Pl`XN1i`J-H9E^7@dzB6E85aHiX67cCassF$iW$ zLMlCqbJ4<GQV5+$eor;ua3ffm*7FbZ;jF~pHvbde-&SK$w=pNu^8>I`>B%k~D zVKUbISTck*+j-xgJsmGJ2U6W+GFtF-u>B(u4XjMk0AnhPXGjcX>0OMP7Rb)~wyk^o z;3gs=4MtqMg0Y-jQebd-`&H*0T2*$`#<%h&grFZ!ur=<3bBKm;l%b&wqv=C7aLCj2 z41+jlco3D%FpvkB{2H~75kzQYaTRPMcJ(Ks(UOO#+~CS!w2b;&gHFy=-kalnq7|HvJ5R5f$;SOlYV%G_XU z0!A36sc`Lz0MhBo#op3T;S^xiay5o_fNd3%&ES_^KG{z&Z=VKJelC5`9J6n!NHUzc zZD#A|)r(xVwIP7zJs-=({j?j2tmn!SHR^;v?^F~vEaOk)ihDz=UJK9~Uo!sfCogh4 zQ-){jLpzdXroxrIX1#{c!u+3yN*KmrImHgh!@0w*JOfX}{jWvCeR1Z_rF~omJ+ZGv zz=O2K_#ZuM%gogeg|OZhgVowwD{LK=RD)ujR6|Q3fK(f`08(wl9xxKPfFH>!C%~$t z8fu7?qx3P8@VF=s3e&;wVC8du6NDU~Z8X%z0tuf*@zZ!gZcvug7EK?Je$Du*%ec z)p#mCWHLRU1v+!fq&+3z&h+lIesZDuErtl+(R3GPeAnm2Th0_7+8ef?YG>D!&26I% zNEc-$xV*S2J$jIbpMnh;nZ##zOjKSL)Ujv_CMDIe=@dhzcybdOd!dNw1&oYJV0CRrh zTU;-!n((|!ooY177=X`X+n$btugh$p6fUR|{5M<{oz2;#XtOv*Tf}~q;b(u#paDh! zD|ca-GtF)VSI@P!N6A~69$mKtD`ckUbmlu3yk4F%)-3{6nVuIjUKZT(rge+Rk?HwA zKxDxkf4WZoDl>F7+R=N$ygKiBuM zDD|11KMjJ^-eeFwM=_0-_%>D1V6m@I?O#&TG4v|a^Os6$w&18bve<$gp-PqiLAj2D zqcc6d%B3K^X~BM+>A_)J%7V1lU@^~BOp^uY6nuhVhvRUm@&*HigMyi!AE>5dE%aFu_e)-o9-tx}SLJ6hH~ z!D`ZuPxk$GE69cSlh_qwlnM^Vg!Nl8d@-EQ->d8FKyI!%>tBx1nUt<%jZW3!tK`d&8FEpFQ z4ACjw9*tDw&}uQG`=iVuQ z$&Fa-8&gQ4{d3K+YKwN4GpKghS38s~8FX*;8|d1Kh??R3EEF<~D#!LI-`@EUa?dCYEgfRE`BlZd+-|_8S%+UuPzmwpq%Q ziOlueP#0{G7@TDEYTSjuUTbBW7Jaao9k5L`PV%RU&kIl9E6ux~o~it$zSxs=792*c zrZT3xnYc2f9V)5aUs5@C`K*sExdSUX%%vxJ=`mlY^2MaC z`xjfdV&K?h;Tp9#lZnhu1_!tp@TM|48#b+}zg6}jTR5{wkxvZg2i=I`qLF z`zXsK+xND^=htS$e5~?D*U5UI>&^~7=0M-$u&oLkle4xgn`I>XZfJCOkjx=M#|+Tg zi41l+TekmQ|3_RR&h!teqFH0Q2`Z)WUZrKeTx452uxz~54%Y^iPvmdt9n?@jr?Hv@ z`In2xg0A~z8O=_8QK)b?_PGnU5bXC}%1M%`s>(Po*jI(6%VStVaeF0@7kUg9VS0Ae zs5h>1_|S~2vFsq#-QH!(EGWY|jRBd?HxE>F@tPo>UmY>pX@{2W*AqR|eh&BmOJj`# zbjTR%7CH?l!WMK}2ld6Z4Jk z1Om@wzfSZ|=Ue-%C-(LM3+eVWSDZ;r-?Q_8ZYA|`FAXd5l_o4wJFv&;cm~G?6Evk` zH~o6L%b(?F%3SwGz5@1mO&~Sftr#?yD_UDdjw88kBgS_lnFXm(O+&C8Y}&ea=b$+E zjnQjXr;2<}*UzQ~{c6EJse6Ln?Ng@r9r}s;ux02thp%%kleUVx);FHKZ|6E27SdIKz4E}cnn&dJ z-+yWIP`1T8WXcPfd56pm&3T@e1gjfb^6Q)Titu6%pUkkboCDXuRM@->|548i-^bFy z4%?iVdM%s}e8=t;6OIre(WZE4CQo-s3B4=TozhZga_))gZu)R%G@xALp&XHPzPsS8_~-r&fN-OMfjV zK-Rgz<$=Y6)2l0lyttc?fm@8qh_t}^R-4kA`!_Aoh10wD&n@Qq_{$U~9Qj~{8UqY_%f<-QP z;n{}T3@E-cB`dR)GJ!uGX|)_QLcii5+e&KEF<%KX?bjLssO7Tr$%8dsRGaBtg`%l^ zoFfwRE|W2MuMg@@@IF;{EyPkPY=X{8g^exwj$62rmhZTgJ8b!m+qk%r@3^DDIrQuv z^jB+Sn<05JG=2NCi_C`LkXSx%iGk5khN$O_qoT;4oWzEEF`?a`TT=%|p)av^=NS!~}`-}H@xn*jq zwM%t>b>`2utqz}EjtYI9xitcHhz1;}tA3XMb^g%(zb-U<-uUl8{$Aeg!nmd{yv!Z% z6IOAGvBJ}9`GcB7&gs21tw6r3_f|Ady7zUNX}@C;ctfit%r}6@2q*v7C^00=4?4nh*YN`ycl2&#)ZJrEKtjNzImi5U zEafC?y8N=EA?m9_qBaLPqgK&c+am*aISwG0V>TaNiM0JqX z6K4K_lZJSV53S1+>fBbq+~dDi4dv&c)j92{-x10HyzIzqkE5siA0Z7r4Tm_*8!MOQ z9?NXuX}LQxm5Yp`^1r&j#CU?3bI$zDww3UEHL%@yVFKx126s7(ulkJxv(WG*&q)uk ztpZ&@5fzx?4w&K&p2W&rck06IV1yB{!=yb*QIG7e2*_TyB-&$CKVxB$YC`{;w&+Mo zvyzHS>GK)Sh>#>k$#1GuAeK#9N_Rpm!vZq}0Xl*;5iU`*d4TP6QL% z7}DH|cTuMyjH+q|#c=APP0R2a{HT?55@v*OG$&FO64yGYakvfXtG)Q%Ta2bA3Rg8- zj8lS5unb!Sf`#W^N(`%m%H&J$Zc3T=nBGQ=qvc1DTe;sY+3~V)zU$&blGUvfDgB%& zW7yt5Ys1!9USeIm!#BQVkBTm_1zKfo|G9I8F9|5v?Xmn^Aa~%%!T#5;C@df7{Wen{ zmnR3A`qsFqZ?4k*MH4y~OXv)ml&A;5POSX-q29;d(^&2SY}hIUA^)5GziG%llIeXc z)6+{|bC0DXPZWWImx6@pq3LzOu2b(XcDyJg(|V2W!YdQR+E_lJs>$4s(;h{S#)-DE zux+gJ?!vaw$~$wv$#h-eM9U#3TE5-&`ZFKi_I%Tp>oxYwps`zQCW-n7#y(p*?>~ZQWU(;v!Z;SwMEf-o03$EUTQni?^#q?p0oadX3=Zj zet9S`b6qPugP49%z5b#)=6|J=Y90HW=bn<88cKZUZ|J>MgdeZf>PyL?k2zD4{40-$ zSuE4hpi+mYj)=;0aph#F{F>^H5$-&w%sSL~RI-ESM{Yh;vJ40?97APoPoE9uG%1GpoCsjJ!WF#qQQgkAaqLmeuC(BYG6~^Hf#J_c@VIvHd#xgSij@D{!rjhTF7(EMT zRFH!2O@}Jnwy&_cc;v;yXmas@d9VKB!Onh0OBQQ2I|B#B77q_enpwNTgFtU9;0eWS zciKMzr!Lx=G|gm_>Cqjz`il)~Db2S7v|+wTb5<^0lI1CLn$Ak+JcOiwq6PH(uOcI{^9 zJRt%5>adQ-gU%a5QD)A~@{bz+P=j00r{^;GvE3|8W^c&w9}Im17n?J?{uyyuc_AbI zym>%;`*a+=VmpW4RX;1Ik1#SXNEF==7X9P$!8&jnADM58)QuwIBh&Sw`A6k_m3Wsw z5|&@}v&!)fmy0T`2}Cku{Y>*t&HDJW=F8Y=t$QL#ytm%^c(<*OStYYRW|fS}i@;`m z%qp3Aw05Deb5KGyCUtYuwRW6H#Z?6{+s%s-r1v|MdZEbuwtXTiq@sG;4fdK)IW5)` zt%y@>H&|^Dt#_Dc-D9G4Zy;L#tiEVPpgTe2MCewN#D|&3Y59gN4n*M<%K9 zq-f=oUVYK33#>7_jJ5j1A0|m^)a0Jp4M6vzm22!W{#A)q+uqFdJVHu+(Q1t}Cc1WI z*u>+J1qsp0l4BIndYeS+D5CW?iB=pUx0L^4eg-y>uAYix`#}>=e|&6j1rc!ueskDv zf`Q+Y-f&B;%rdyY@JJl)XNBb-4=QgdwDz{&`N_*APtA*TBu{miAjkbJ{zIPL!b_Z) zUH`U#JT=&!k$~+3R8iO_oGvU+t?2iE5bxG2!=is&;{Oo<$A`ll^BKsA;Xt0wHyo=I zaQ~gjQ`hB4o}L&WGPmuPvoqKIysk9;N=%yWi==6>o-{>*Vr@i%B2AH?NK@>LNK-^_ zU1^#d46Thx&)Jj6z3}=66S^2v#shcpc+3CKJ$sf67pCoZl>C))r=dIi$g?L$_2=>I ziLG~;D&UOba>&9ETW<{?BAi`jf6HPjq3)!>0MJLncs# zK&WFnz$6uGh1IJ!^vJWP9JcT&8xWh=nf{~m?D_1lCrrf{ba;HC;qC35VZz~1b*7|MxTjgG-nuPp!eyoFA&bALNMnUiM`G9eU0fN<-o#(LO`X75XWpJbi zQ;!aVYD9|XN2Bwi3!>4v#Ua49@BB^_qZ7w}OC106Bmbm_+&+snjNz0+!|`!wU7(iO zAbfkm55mG2KM#!i?fr6t7k4q&>a#*}lHSHp{lEn0CRX}&HAtO#xJ6>snRSG#rm0HxaqQXjn(%mF$ z=q=t<3+AihH8xs}m`kD>Eoxd(VT}f+?qZB`8-rbzI1X+^J zqQWW-ql<0eyE#o)HShzKmXHp@mz{M=1+I77p17m=A^VHu3ODizsR`Pc)DF8c`%QR+ z+{$_f>&D3~OEtrn3M|#;83fjfyR_Z;dOHFiQ$TLAc36sWs?JU_{IB_?4R(VtMNXLj zV2T)M1{}MZz$h%<{@<0ef?THtxmrCM!*3G=Q-uw)x&1B32s@6b!vDny`taTHLhSkB z%+kM{`MJ-eV5oJ0d$`pa&B$Ee2ALTdJf|0*Bb302; zKszIESCG%#f6W$s`v>Gf(el74QE)lylRrx0CCb`Xo%Px%YXq2+a2_yyln=n5^Wg`v z0)p&DPj@s%2(SP{tx+4*7>eckF~=OWTfksOkT|jEA<;*9O)Vq|6q%3%N1Uju!I9F2 z10-#a+B2xCkd(-KL6kRw%?Vf!n?A}nAswr*lz`2NN`QM$9pEHG@ep*OyI)tTgxIJD zT{83MqRbI^PEvdD^ilpTKrRHHiQIWnx0vS%J#a6N+N%eg>Iw5cIm#Qs=ES{+O&{gI zs)a3-0Mu8Pz~q6;SnzW{Od=~H!?yk33v=~Hxgtp1Ea4&1NBIHB>?=OuvZ-A(ePAlYj6oUYZ>yXCQ&Ij1 zPHq`RaO%T0#}|TAAOOoem=ybw8t}slqBiScvMP6Dlske@Q)-AweUx9#jBpeX&WlOk zg9wxT7$d!at%u2){F|fv5uDtXir~~o`BR#f8Nd2dXMgio$&}K8GkDlWJQB3a)5TbN zfX)Br+*2IRD1Tes{GX5VM{sgcD}qxWWgXY6f-@nU_m>)0iLbkqDQeRuSEYp#EgQ90 zZ?qG6pAzMbV9Uf|(?{j4YBQ2r%lCh;A&_kk{C5%?Q7&X#nCml9uBaU?o~hVzr#`%z zW{nNI9?oVAKUHHgRY>S z;sB7TXPL4oQ|!`_!BHenZmy{d)zMvC@K8HN_rppK3`Q1ZM|Z6??*1OT{e?lXr;*XZ zPCpLHU}W+_s;cFo?iR27QEI5W)qm7MQTc;bHOGybdW+lJbV{ndi7UVI6G*U`NKShz zL}YaI{fQw!p|Y=B8(9N0)@uCB1DW%slT6Pt#E`5f8`w|G^qfmZ z0z00Wn_Hae(WN%VF4OZn0@#{*ZcrV%Mw**DIn(n#%Y1sKN6)_I=9Xo8)(|Man)G$o zlQYwEIh9**M_X?0uQNT1t+8vldTN1YtFA!>iR$y=40#A(>2-Pzc=)S9N0n`Bp z#Zgezm*ROtttK`EcsnPHQQ(K-c|-l8e%?#tdBZure%>?VdBfSZe%|BbdBYj6e%|i} zqai$mvrhfIpO5DaXMy^8^YOf)B(IydatY*MmmdB|4}D?Yi>Ac zk->Bt&M!{q<8!6e?8Kj+0Ry$4iPxlRlU&~Ug~vS)yUCD}%dMnjqXH(|f|4w9oji_} z9EeJ`CEC>Lxu%^rN4afY8VK5HuUGdOQSQ^J3cn4Qj=1r$ks+)nxqrw;S3T$t*whu8 zE*^R)nE40V0z68dt7!WQ?#s!%9SMB5DYcsn2isfHx~>LV{AcipfT7za1@lyKyQ8r} z_oM8R%HLU>G*fyR|>qBOAbH(|vifExMF9p^sVS!oKnfLXfiFb{Xq;(`T zfe$M=rVMy#Tcr#X{0tltk{gQ9&~(8>I1~;s5Pv`tp7g2)uPrL!aOZnPKLSoEyDMr5 zyZV%&5fuS6(jidVY~i&QwwU&{M(1Q`k43HsB87Z3F+=&9eB48L9OY}w)b3Ee-b%PZ zT03tEjvU7ai8k8pK_@VA4k(7;*-JtplNMsb;ALSP)0Jo0@F~A6u-x1FTPxeq)W3cs zw%YtTe@oZH`=~qat-ke?xn3^k0|nGeobs29{1SMap_)SbMpU21^2aQhPmWO=4z7I? zrsBmrS_F)q9azEfKK71G6BYrz$k&J721T-yL5KLC_h_Tf;70HJHJbBSbbZAnHz}L+ zc@V9AvDx3Ig)iHO+*sSi=b_m7E~;&nINNN`7EC*}&%ei!fU5gO4MZ|Z0zhKr!x->8s&7+H278H+!6A+l~kW47*mhO^NIjN@r-t@8?so}EsWwM22B1X7ik z69%FdHugdyTVYvh#>eZuobT>-8HB|DYhrh%g7tLvVEYNkXb%>bSbVRj{&+fkwjx9c z>uRfaG(6DbQ`)zld0@MVUh^TI_X#r<;%2mYJ5y;aAB+*LwWU#UD0cWah+5QH0P}q& z3n6ulD~vJPbLfwc@=*6K^6Fo}87ddh=rZC(qe>6zv9`r9`2iykaBg$}0PJi&a*g&M z2sQl)v|*vpT2ahOGZ|W^(LXY;Eedo01hu^4V zx}aZ*;2dX>Jirl+cZ*r;f~pl|Kz3#4-=0MkQW6H|l@}Akf2(Fc`paJh7hY`FWQyCA zncF)i=WCqbjVaM$Hl~#+%j(yB^41dj&0gQ8Qrx0{Fuz@LxnozEeId=w_gKCDs3QjMgn>{7- zMiG7MASu2$mg@*4^fI1)uy7*BZc=hQp=V}5!y=(U{;2K>YQ(u79?vaaqsT4vaC3S> z2%MzEl=Q6GG~O?IU3bF=1zc*qa$%+Qi#muV)3_9v&0K#i$PNI)J=E;#Y;>Z#WWz`= zIK`n}@L0~|R$i5!lZTK^j@Hh~&SkFuAgr1jJl$PM&rP?*28}r-r0D6PtWH_R2W__e zT&Rw!ZO{-cwbTe7K&24Y;c(CxN1_Wa<+s+N{Jwr6ntF9;X4feUQ!aa0@T!<3yA`sJf}?#s9*?~Wmlg%78; zV8)qcfB2)n zBH9B5s{(1^9kO^yN(S}D(|z83y) z#IKn@OpSVL)1BUB%OI$nYS}x+p~cnQH&hF;4(0~WaQv;imT|EhgZ(e6U@x544iLHh z&GHXGgJDDTqOq*2xnW0W_Uh1G8!p|W8!V!QMOo->@Nt(LOx0E(A<47;i+g@uLsVXJjmHi`jVv$T7 z!fRZ0d?T0OEw(*36F}Tfgd1#6PM)I~3P+@p4~V*02kC;eO$mK>cQoL>us?OE4uwiK zBq>(1sMaW00cWrp!-@HrFc|1#vIIv{>H$JkWH#zID zpbbq-7;wWZ==fZEN2n&BPMbXQf>xh;sNTg!;6GjceC+ERkVcZ*HkI0Pno3KkhfhHI zn{ThOef+ALb64u*?6h6k#6KLPQIyxqY-!=T79C|>XzUAD^dBsKYPwqs)F>Fp4-}8s z$Ga35bQyge%TNu8l97Tmt9DA&7nLGDOl|6EuUqxCRMW16pE?*ePuA`{X0l7Q^ z@(6Xd9Yvi`iw(@i68H=s^GO5NH zQ@-5d{;iI(wZOIuDlkhSus@C&aoRI9A~KC@gqV{el}; zxKmxc&lyQ4zdcbUuHCX1edBbi-4?Z4PG5fCrn$CMDUi03{6Ac05V!5N0QO~%cIo+6T1Ybnn$IFPZ8tP=L*oiM#jjv@9bNx*SL+v<* zHl6XzuJ_A;vmnxLHW_p@^fYQ+8_f?~b;Kb(|M#!7>xh-wlULQ;UVnJOafEcVm}?E5 z0PjR>wTM8@4XbC?EnU4w;tc!A(+++J>qIaH5Q}Q^5jKUIf17ArE?;0=th}V#5N2ck ziMhJWSl+(XR>-I^TSdP}J7C~1N9Pk#&zXUddPut|Nxd2UmDF>)Sx7QI>qxRq#u?Q` zuGI6{>@V>$#Y{|+VH27*saU_R=A*0&@1eOXXBU+}PLCI^QQnYhJ5&oD!hPY2-g(p& zl?0jwL=63!aL|PDWfpDkw=Z|WIxGfD$*Jz-Gb5+EPp?-?C>F?@*^ZBx$^MNDT1nR5 zroLS*6$$JBZ0JYTgF<1c zVNvL){)$3Jf!H5AjEbKN_YjHMEv!4$+289eAzvr%;~aX=%sPpe4$2xR>Qe4dc2cKeD=#FV)2{aFgif(mP9{dDQ!7tZfK#WH6O@_Lq?INDI(t0e z+blbm#RyL z_=`}F>2$g2HNvQ*;52Yb3eM`Uq@caFAZ?D%I#Mur+9X-zN?ju6>N)ETHbp~i4yv3n zc~!rz)kaFy&DYiiRbmBeSWx&c+|qtS`H@>PYdtzBP@htR0q;2X+FFd&1KF%qlBySm z!yQ|L)T)an^(OQFYW1}2m7+zd<;kI2={7nv!$TS^$7eq9_r~2!x2d(~WqSMEmkvS@ zac-vfnjm74B3_Z{eQOZ0*yrd7BG3!*Cz0vZP9Xptv<)1Fmby1W`%QfV+Q)IpE>>8@At zWt!!CBg~TgVI^noyf0MAI}|DSEHbg;gSXJEBD1zLiq1sMm?mlqB398z12yleGQmP5 z>R?mmF59^B(uPPG4u}-UQ6$5t;=)Wq>3l;7em!acV_==K1dazIOGnw)JD;ko>lcS* zJDPI`$arF+=fqLQ#U(lp43Vt4a+Z_Dt{os74VwZ=PTA(|7B(l2y3Pn%y(nrGYdWIO zM0U-lLb*UQ0e@6}?D~AK0CD*aqZJ$2I%vsFsDs!*7zJL$w^2`GC71Vx#fWOs|u{VA7<; zTQa>*4RCFv@s3QdJ3T=T8;v(-dUcA=Xhoy3_R>u6BSC~8jfm%ual>P>%8D#;5m62} zLtLR8upg~>F%jkP@5=QwR`ZpmMfkxze*03?VjXg?{E6J+ZU>{KKwBmjJCulIT&3RH9w>gZ^1GCNXr z;dxdLXghA@P`|DdkFqXranm9_(`RnpazHK`$qd>zyD!jQs;`rsd){%lpR! zuh=-=g>EtFx4Ae@q|IGsMuU+Lp2g?2Zf8WtXeev<%I16p||!pT(bDeCP%FP+~|vgf6- z2kEpgvWv&3rr(7zn*qMxeP!Oi1&rI;;q^8Qnp&~!*cBt;K;M<;gh{d@fjta3&S+p} zpr0th>8BwE2{f%1V!${U+%3HEFC6Mxj-7NIJ1vftn6-N&#<72*_i!&02^de;$#JS) z06tfhOBiqV4b|b;4PsMC=lQ48nsE^gZ;!L`h`d84fof=v9ZA;oBKos0@+B(DaU)!I|u3sqOkmY$$#UHfbKM^dSqV|5G zGJk4QN~ZsEWuCAcKUeS}3%;0O`M3I(`jP3`q3<8@1Db`r-D7d&J&{_=he@q>-kD~D zQrCYoUg{y$d2pUm6beecAyMj6Dm745N^Qs%7%O#hqSQN8>LOpt=T4r;cK!NMqF-mJ z)QYN7b=tZsQL0g;aO5WVO=|qP>&t>FaoIaR5OQDeU>r?%x|+DXr^-|heVbDf&q(d@@Oq&aps2mY z4mNO~;xB@py(Q5zHv_eV^3-(>Zj4LQX!t9qsv51ZSapXppRUQE>xUTihT4;rHySG6 z6e>aPdrNSj9hbzW$hoD1)?qWyh@(g3{?;HYwI`JO&7s_PAjfA)=J2mjXa`S>%^1CQ z^F^eD@^&Vc*#|5@sybS^)T|omTxp3ROBOdCFvifaC>FIvt8mNCd$`S9U5TZ+>{B(_ z)wXSF#k=#@MA}#+x`UB9q47x&1sG-JpzA!(z!gr{I$caToAS|^7#_JH=1A~~iPzDd zYC|BtN71b;aakM7-)2hlw8a9+4^lpR*y`0JrGNTp7xFC>3XekeFsJ{C6RIPJ zqh*J$-09~H$S~Fzw^CCmVm+~#3d(G)RhY?znW0o>kM4@$)}rCKfAgWH&wa*+mW|x% zL$bhzwvT610DK|?)WeW?t?JSa6Z*dU0CDrv}tT5?+x%u*)+nP(jwI!pSfoq_d7PH)}AzrqUEq^8( z;5F={wlwouX``5+^~Jg%PM1$Uh6NbkwtQ#FtPUFe6M$hau3Spucc^9iiwM}1j18qZ zSkuq+p9fFQx`UGOSi9HO+UFc{NwJCk{O26nJh z6)#F$+O==h`J##q+P_nk1!c^c3FVgo6u!8;8}(R)&Q+RE-}26|psP5U`r0tH;9TC= z#dyR&SFz(&I(fU?n%we?FwIvPPwn!;ywPNb`ELjwD8_Ap?&);t6tk%*f8zUPlja4j zwX{S=O_N=>h8L*Ars1-38}MM`;Wt%TeD9_3na2wkhNopy^0WXHg*ubvbvG6FPfpDni_@sA);)IJ%ZvgO-}>wiK_3mO$r>jWVbB zSIWun_7fDtb7-xQfk3H1xn!}7Jh81T910=JiXcm^f4t1~_adzj6QCfXCZX{je4(h7ISW(w<@Tm!f+%G`dpCUA|+eIIfDX8_7(`fBGhu8KBaMYC1G#k_bG*GE;H zUgt8xUz@=ZIN;63YtH0+$C`g~PS=@jq*uDtHDQ}<5$uY$urwdS8gu7$$Y?*m@ht-+ zASKR2O3*9nehZ|bsx*VX>@uR%w|_^WLUMrnrqHQQe&ZFoqD-}tB;3th5nRY;EU3s& zUEN#|t5%D_^iIr^q6Bhk23uj_nbQ=f3D5r(yeR>2B{2E%s+@pm27BfMp^s-?XVc#B zu>A+QD`&dN)=ep#d-!YzQ`}{DnW%mH6lEJz=of0I+qDq}G1Z=C_yEVj3LuZDKi;V|CFIO>b8f5wdk|`#`=xo4x z+EDJ4tycWSrP#CNs{CYb)T*u-JDomg|qNm9Mk*WH}hP#puJNV;q$A^~|3ee&IVLoELb8HZ$k&B(4( z(&A?bwvhjLU;np`2TDzMYHai>8!82F1e31dMcVa_th>kIFw$qg?7fzqX;p$eR_Ql+ zrlBI>RMW?AcH`f@n;y8<1Hc&XjHa5QEa4)zV1K2 z+tn@YDqNJ2=9~sG<3>s_!+>AROwYf&(f~s1ncjbLpRRy|jyE5IJl(Q~03`Yow;ETt zJ$2p7Mjh7RA!5x0tjf_i$!y5Cb_*YFQ-^Pt+SO!v$s)Ba%96SBf{S|Y>ss;!6Htv` zkjBr_hEYN{U~j<2yE&mkIW~j&IjCcP6*dz*h>L&gwGoNQ8f(X^$(D4J=*N=ON*pid zzo9m%{5q8gS?L|t1t{5c9U2z_YmG(_TI_<%*f0^X!HUl~V?2U>_3@o)n8<}2r1VDI!z_+jlqk=uP72HuBMFC{L@p7Tt zVGy~=*Z}u^@wKVd=#0O6pugQIbH5O8BY(PYfUE5WqIx}0i0Ogq(G59>lYXNy7nN?R)pR!c75Mo5{5E93? z_Q#Aiq3d~QlTNg*({lOuQ|^4bFLk|>RAaGBT@s(@6IJBJ=-OaKTd1BB79^{9mxK9v zIgo0Igx-MGJX^!O17bO<9!kCUD_Zp7Orl|IzlA*CNy_~cdrIPsh;GrDO>^|XD*`Db zL`_3XWYca)k0zfD%2CuOMm(DOmV1=~^F%kgm4CsCEiDMg{7Q|YoOIq-err0l^FXRQ zmD>O77I(5uHk??Ff5ruFbq+*w;G1fuv-sRsFm1DeMdkQdh!y?8ryhIE73E$oYKnG0 zy*`tOK33Racm8HVdz$K_J{!yE?7$>IS%-6CC}}eM=qq zC%^%mF$*lW;}^|R6I((zRSY+VH@Gbx3BHJwN*T+E;@Mg_-I(O!d-1U}S(XU|;sgPC z4k+8PCVOPmZ_)=b!#bDT+AEsidWIXjBAd`*98X{iy5h@zHlo|LfBE;oxgg|LfqMec@;B;Npdfo(l~fm;SY#Dd<0U zQDMWr=$oRtpJ~TEdY1%is*7`_v{a;zIZOmS9zjPB!he+B*Xefx_^NIXt_iM#82Plv z*d1bND%|17hZn;kAJ9nv@_}jyKt7`ufPCmzKt6hM2_6*rcrsaxG0;Ui@~NUJ$fuU3 zI6Ki=Sfd|pitmkxtK{7n)RGcM+#t8f0KJ0+?sEmiCHep;h$|wv5#k`O!O+v0-kyqx zE6T`I_l~$aX8K>2rfZoyIT7fIOO)2Pr2qAfxa@0D|LZ+*xzF6tVg%ztMK|m*(u_(& zU=7EmW5uVfIJ{&ncNF^@o@mL14SW02{jWiQ?SYtm1+Pgqzn|vkD_>jqrHcw3`_d1l zf9g)q>|dPUuvc%x>sVK&Hy5rzJ%MX)GD*~b%n=aoBgVGw*1`QYuy>Y624bkXNMYOF zz9so>d;9+)o&QFE>sh|5L~G#Ug>!@L0e^TGQGvRkrEHD*flP;Ir01AoEInuIU|hQ? zxJRqBY=?DF`c@jl$%rNUDB7AdqEEUqtZ=R$R%uf{Xjq!Q=~HE%rVLv6szIN2)llWa@``V}mO9w0^BCR15aaiULNmgJe9_Y**h^-j3LUa5SY zYvt~*Tir}!EM(pgfGKsvRAqn_pr!?AMk8#yv~j&&GpAJF@;|r+oJLa6fiR*Q%H2d) zQ0#T2ibg_1g4TFyFtNr_&p-TMH(y@a@Ou>a`Zp-B-0EWORHxnnDhq8PPHhIXR-4nA zaLvU?P_^cF3*9S@b+5-vdp#!fjaStjh#9;u1Mk}95}>AQ z7A}%HTR2ZDYkY|1;H#>kV0c|c&Z6aq*paiAR5<&SZYx;nzdYR?Mdt+=p8npw(N(<~ z{Y$!B0w-X!@QUWb=9&H9Uz9#1RE8v&@ET}JU4RVLrax3Uq2~uF}t8q7DxSKKD$v7_d5H-{rB(GF9t0Hg4SQgS%oXqGp3h}fQVvK+$ zfuzLKe5=b}Cxc(@nMm2Nys)%?dB0KRhGprm@u+9vosi>9;T6mFe|J&(QDF`Un;0Gn z1UE%$RAIxKP=qQB0)g6o12pmt;=~X>kG?`Q29EfI$9D9AJ{_Kn7F|bJRhk`vK}q$D zcyVWv#>OeI5;@tG>G@K?eGYCCp$ zbWdzp7h8&%V7s8&^Ks6|Y9}Bv{<>AL3Eju;_iZ&*{@l0YY!zaGrou%R>-Pfcx}SRL zd&={&(&nVlCmvA7*Kwgeoi&_+=ht(Wn7lF_Z*8o^xNgMxhZKbmcD;7}9SDk@zqXw- z4xCpy?e-imyvjE!gfJN{{KnJw^vlLF8M+W|#)a@x5nP4mbJn>0(Ygm@(W67zlEY_7E43R5bG$fIlv~hs*RUuIBWz`5BXV(?v)?0? zr|0MTuhkV9xM0gz<=Fgq|E6?bQ|`y<-e2ta=~&}jcP|WPuof~XP zK(N+BFp)%S;YeuJYBvVT_`;x!U;W(xn*km*cYqq1Nx|hr0+$oQ~c%}U2rQ#XfZM1 z`)nLCB}L;r6b&w;^fesJ{sbCh`Ji{Hx3E8?WF#9$RvMl)cJt+=^Io9A%q5J8Ezg2X zxr|Yj^G|}D;!>E%c@;xtu)J&p#cDnKn>Sxxb{ix&0MJD2#3#0L;Gi$3!;W=NR0HQR&|H zlT??TU4R-kF$@6`4_Z*TwVCQ-ajgt_f6k^F{)qLWe6%hJrab0J^$h2(&2=`QPh>4w zD zXcCTW&q`YiO=Zb0%h9?{ZP<<>`kC4F?Q}Dgs2vEqd(!Q;Wm?>Zr?zyCc$&jD{9g^|`T)#h3MRfFYr02)E-`L*YYbl=AyZ3zZa`C{cs3eAcP0A2j zbLu^3NRw>80`ff0Lb!BTq&JL+i~*%AW-DfKaYco*6+~QiR<>EMJ;ifII@}dP5Uq^E zaqHNUy2z_ly&d({eyGz91rCpnj)aI7e7801e|VMCEW%kx`VXG&w2J9RB? zOb>~-w~qF5gI5GIyNwK>#&ZCGM!5VGO&9|lWq`Yn{__-OE+gkDPIwSrJ3 zYGwqHlxRk_RAg5at#A}F%N6~7WTo8n?d(m5HqQ`Uo9+~Emt)!rN*4?&iQRH`Su`WL z8`V`=;`K~gCf%|QGWqM%5iq6svc&5_Bc?H3&JOC)y=;G{+Q9?I)Xx&HXY5dRW;{E7 zX!EE7ml7B`l${#SmJV$mR^Uc=nD%n{QL#QUbRcB&~}qBiv{``+sYU8x2$OQNAQG%5AYxcEc5ob3^V*Udq`vm&)W% zK~D?p#g`=I%S#`Zd|61cEGScsAWasOBhU(*Uq{F|&RV`AW;*-$aL{6=ir+`5g!|Xuu*3Ll64)q<@F7n}i+4n|Qap)X?tn{gd<0`F34QP;g$?%Fg-)q|H8-)yz* zqovNGmZ$o}PO(p!_OcDuS$q}T8;{)stT90Dz|LIA-l6=rQTgiZ9r>)6B!vyP7CQEZ zz%>`Lx313a)d2-quA#8uwnE3AFm-t$d)w;l9=*#HmnNUDktV-#(nJ%MlP21oGb{4p zc$^zQK%=cTmr$gCF0+>>@o1OdOB9!|JIwDTN<2EG4~Y*;K&H6by-bNBUEbf99vB8s z2?O1Nr_T2Tj zWlvp&M5F}~)t3=Ubi!vI?PAhIfH5B=ga|+fo-l@)QdtNEhT&`k%sQ`9HDj&UQKv!* zuMeC{o)yw?u>y|1EUza+IFZe#|H}hxNS^Vw4Da;5=bQXJf zd(vz}W1Ypb_AAVQU~8mlehE8yH3PDAnrR~5LH0zZF=s1&EFRy=Yhyk>k$-tXE*Gqx zAb(Qgon0gG-eDx2kZys*t0UW-$ZL}ik}9N6J8^p?5=}th=!YSzmaidMl8}HR zB*-KjRfM>I&fa87NPPpOT@q`@c+v2+0H)x-M!8 zN|K@P`fkb4Bq92glBFa_krYTVCTBlrau!2KZhDhUz$vC)*@Gww+nXWj%n#aWc-D>H z*k1lCqt?j09$#ESo9^7jD1lrtwl0KOi3p_};n-qNT1!kxBOF`7LA69U0bDdLuG54g zGRfPzjkshOy?!$;c{I}9P`XAW!kD5_vQE?WjZk*Zis&ZN4wQ*iIt1l@M>>lekCQMW zMw(w|@!e0?=P)(d=ZVMabI|0y)9i*NRtD4eaCQ@VVy0MTTEcL$PPXHmX#a^p1ir^tXAy?);$DpjOaW*T zwS*rdQ!Ym}6MXl6FHl`HwOI5gxxru~F@aAN;yOnkK1&n>u51GbFd9H+qF2N_8=e>XG zN8ZuSbGT&^&`!G_;*fUKz^{$(ajQnj zvcRN8wZ0ukar3qm(kUgvH7{Y`mP@8JT0#9fEmb4epl?*Y@y`36$2iCM656o!ssv9c zdt#EuuX;O+cOn79cw;ch0?klpL*dy0G$u(=>TI_Djv;=W5~{e?g8bc$g(oy8(yWnV zlA$qk-J9Hj#Mrd-4qG;Qb~dW0kqn^-NXP|=f&~U4QDcbyP(WCnA=)GHpjxZY-C3Mm zQ%4+F8KL~&vWD`2j)fk-FbuK&l9jOvP?jKslH~OLt)8C@E|2Zbd(@t(vy5cCTAf&c z%7pbQpd8ianTNw>IXz>mxKNJ2-A3!El!zD; z)zW>8iQ*hq40y^G8IGq|npN?XuQ?o47$vTtB$$Rtk!nEpY28dg{jFb3@egE)jK@2R z=bJ#Iev$DilWc)DKru#z`JR0f=$@gVg8jcf)-!<0ug*?1TI}4hQi16vaCa6z#{RjR zq}+VkdCxmJI98_?H??-&bMY6n3`;f=TR24(6U@_=Hs>qP+)}^VK+P|O z%7Rif=CPq&l)0|moq~u>)z>G6)(>GYu5i5sjUUZ$*g_zyCaf5!egqBFs)^E3fTRdG`NP<8hF%0HhdO+UBf@E_5WgI`7NKRnS`ec&f=MmT zwN2u=rv8m>W{;e5T$^n&Eeu1}Bz*b32A^jIQ~|mykEhFJ^GxB-vs?5*zYU^duGqc5 zbd0ElMt%89jCk3Jo@J21)NHtJjw{iC?XGl;5@2$4^+||<86v`Im~d=|8e|aRh}V^j zSs0)i5}nj@i80;0WQl&lw@Ir``)+KQbLvCjk})FGhruPgmg_*_l37{NLo+O(OW2kT zokF16Hqo$__h=Z{0?hA7V5VKhmJGW&{J*oPMSo+eNla+(lWG7viyu5i(;DTOi_sRb zc`BbR7};oQqDkp`!=GmM(^k}eHH1bNRpYj!P`jr)hbLInDVN%;%7ePj%*xgh#ttnJ z;>p+(6eZ)TmWyU7c(U0WpgST)G;O>$qa5@ZBO&VovQEne!mNN|ByfJ+EaG%6eCSkV zW?+GiMFCw!Wu1(-Ny2jL^q5X(>wUSfPp~#-gxRL9XY;#s%Top%W%g%p$!F)FPdb?@ zzYbkY=Gn?I7Js;Wo|zoX5<2JR7RD54uaZrmM4Lw|=& zFEZK-st*aSx`B|?NJumh5?OU4M^9dz#Sc9{wu*pz16yoS;6{{o;N)1gMNU*;V}H5E zBu;6{7f@PzKxxA-N>W<82v(XHW9e5lj@T~esD4Cj@oaXkIv}>6tV;p|u_-D+Y;&h6 zB1UZQX1^jBskUljQ&Y}p;)v}^+;Dkf^9!Jm-r`XCZ7cXJBDo;ltgBg`M75Wy@Kv7w zOlW=>?0!6wF?chiu4IgfO{lR-D#gTRtz?Xe%~DJ#+8VK6eF4av5{b5R+X%o zAV94{BlvWZ&dJze09>^H(&6K+AylpD&U-$GNYt|BzSpvFlH@cKGK$SEOaS_x=)A8L z(N+bChOTq;9nYXJ)&WM3E&k{I=&{En$xtHBY(`?qm>O+>hE_3H??-3ZsMejR1DhZ6B{qX8_^b?e`%4D*n#mz$n? zt2%(_hv>B4x9J1iv>8Re_)O6p6#a=8Bq{oQ%pabjTcAs$z6eA|(LcvZ9#Qm<9;v42 z(OYeL0V(ejf5eIUk{D4()iOJkQXZAiwGuRK)k^mB1Ihl{ozr(%i6$fQ8N!UjQLWcv zFS|fSRpzId=!e2d4E0{ZG0_h>5fN&fgkz!~TL}?P??t*0j){KgfCw+{jo0IAL=T)J zO;ts ziMAuN$7B@dynQ*;f+a?0@fuT&kT@VH!YT>B7X z;~!HuSQw0JY9dG#BM(s z$XEHTZ@DTNO(qLwMeQ?2D+l75=~Z={-)BtZTh445%jY+Znz~l9`*_@zq z5*Fme&f_$%~#T>VcWinBd8CZ8~v0*`DCZ4~p^}PyTR} zpmdk^aDubmZP@GiYO?db<%=LNvcp#=+!vPoJ{#TDCEZvgc=A780m^Q`qk6JH$dkJe zHVK}5uI~yGc#`pZLXbn#eeU(}rLv52%YRk`%C!c{FNbuw*=&xu)YF)sSFQj!} z#eLtVwj@ug)@q*o^uDmszy32ds;&JvPd;Cq>Y(b93?qZ%$u`H6acrA0Jvjo6yHkvG zV(S)yaSUL58I*_D*wDp}%JVRK2_}>OFx<9tP_wS{7RnS{RAssZ!P5TsnSz7277eAE z4&!rNY<`AqNsP~MvH2MeuA1Ls^D{UhF+K&y=4VETL^lPGS~xa8GlH7LG~A>?@MBtO zi8}1iG2Dy3$D!jvu;`Z(MWi{ZzD;8B$=r9-F)@|WXq}F_(`y55o}Vcv-@O7AOiV>O2<6oY*8)J){ggSP0TmSxxcU( z*@x37HmAh|!;PshpT}jen?ci)ouhWjQRXW%YK(V|nn~Y9FcX8ll4j6HP8QD;EkfEv zvHxj`V1O8e5%pkDKU1B>ztKXAAU2CBv=uj=;YP|b`C^qpWmwRX4V~cR&xa*ct5}Ol z$uOu4s3tFYvg19fe9DC5Jvs@Au*&-eb0r<_Z+5#icBJ$6ACqa=nnB_-X^z5-Lc_0* zm)b-eljd-B9Fu0TI*v(mBo>#LG@E0S=Gx?>`I6YA>5}HkZ-9+y+fSO8)SEQ@ObSVc zlUKMvgb;(-YqrjmS&~FBWJ7a)%2ZclbLsz(!D5g*>V-6bs4db0TyzceE;$vKx+GdS&)jPkY(Kj}Wan%oPevfh0Hd9pV zaMk;M67ooUEmsxma8=ir!V;>rmaG0nYeX;xS3Rjz#Z{*~Tkt2j>fC&S}kbkH@UoywHYAa!RZ+ zD<-GJD$`tYN+dCy^#~`YL?Xgjk8pBIB*IUFrsBp;iym@E`A`;F!-(PNtt>RylC1q&#MMevncDmrEO z#}5#cG8{>NOesuzzcSM&n@7w)Kb4jVz*usazuGvrs!0oV8Q>qeh~I5#bwgF&6e zMc;euF`I6H8r7t;_z@Ui(+!F_b{-C{nx>s>6-y`c`Cje>#V2Hj)K;(?Z9|J=V?@}> z^UvYGKz)|BJi5q?nGC}|f$&WaW69>@2;~6t#;?$0I)j?<0-uX+6q#*FlD3S&wSm1u&=ZD z+Vw)Ft%#B7mVx!{4d=Ql$#Aw7;ACLb!5vfebYifGW2)AgHyS|Vn5rkMp8@xfGmxWBj6rs{A{Y|N%=_QY7nvffLjV!c`)TolF$HVffyj6BuIkdq8ZpEFfN** zN`m8};rPH}jK$f-L0`2XxuhercxQ1P^GrB1LJN%$C?XZ8@jo?CZ-_ z%>MP`C=oC_;~6n~)GB7xqRmx~-<5!Jf~pYkdoxkmstfu3g+Q3#_b;-c%~gKS?`L4i z5tw!O{n&5NX~&*l@SO?y-Bl9s`v}j4Rq^}R>uvJ0)rm$H!w!7Au|) zVr%WzFG7j1vl=X#&9BSjSTr9WsSmJw)mk#9Tfp`th7&O1m~H|46A@0ogk!n|*e4>K zdu!TevG8rgK6AESI35VbfP_m5l&kMa?R^Xe(-4 zW$$A_wpy#~y;NrXcC~sOI8iV!7F_bYcyP({V!|aeiPDQYxNynyV#6iRiw~C!M!>|N z(V~7>$#PBE6cbxF1Q%W0Vw=_XMCb59jBd6Rn7}A5;j!OD3AC*1D#-;lqP8fF;LRty z#jzGhO-z=Z_k0Nsrf~_ay`A^zN=cPkLe6C<%ANNdW=4#1>P|{Br?Zzal=OrHB4!bh zbzr#-@rX`_?6Jcv8gDjK_Z*Ls!TAAOBB=MB#W`$Qw%o^LuqUlWJVRQNnsEWE8yz)e zrNTtsYU>8e33%KABzd#vo7p26^A*==)Rw14>tcF>;tnVtU+d+!4n*Hzv5k7UVF zh>{T?7qyros44a;DNadgQU?&k6G9tP0d`57xIh0WPOGMAvmmFT8#^`=70*tTXn*C` zr8H1w<89T}Eo!Se>LSW0o<<6*f|9tcOuS(L(T>n;5uhe2xOhM3oO|D&nfDYsK!GJG zwcgx&-+lL9FrQT$p6uT!Y@Uvnb05DuqM?SB{^N5*}SnL-B&AoQv|0tn#T zdRW+b?UY4B|thjz^R+>0Dt4fefHg_>bQAANE zrNakhdBn>{Q11h%dO>}kMA8F6y;*jeW`ce}D%Ur1z0B}rFN1obcRu0!#AOfZKa z`R>3(xy2Dtecq|4sBXoW#@nWdYM4|Lm)5%JHY3PZq^<=r{AXA*9W65a^SWJ!4sVd* z^+2XjhW|>O6Qquoj@6=4{EknU+<~5cNrG&#sft!mDgHcBIWNV>Wpg@^;yp1b{vkma z2sBcBQrwVOZz2=jbyAEs_pYklGuQv<&;DE8J&i$ucW6*REV&N~^m6@7f&v$XR=uXq zZPc-jn|yrbz^Zc{H~AC)g`S?n4VRm<+(dyf>u4D)d^Fy>Tz|xT?7Gc z8*?TKo2}U8sKOY9HlxK|V;rm?=6qDl`9Z#{;#`kW*&iR}hdSS5J-Jbz^EBF%I~wLZ ziEpWqbm4d~!6T~}EdD2ctKcEx1!uMjn=SN6v~1)JCIUPbFM`S;kvOTW^_Ob64|mCoDl{=?mw*D(t*=1mA^9Zw`8eT$OK2;vO=^rm?$j_x zNuEIGzoc4JQ#woib622O6w%+~B9rv~%YyzHi>@2t0Znk8?VlT2ktG38$SXV2V4}bD ziUqrb+{{E=8zI8CDgco65a9IC;EY0mAOJ8C2>@8t>BR|!0OohMmc+&=)ld|SQ6YfS zrJk4+D+o|asD&&7g$e=`3}~TF(ggwJ4lM*3gig0ANiD{Jx+s9)0Bef*^nn7E{MZOh za*+A@FuL)(9Xd&nI6?WAd~4u4aNm`V(a1cWSRchj|&T%Odoi&2}U5(&%?fYncfMD#AJFm zImKS42VQDSZ!-O`_ymDW_eNw|reYbmO4v}Q!-_RJ1Z`E+bF@^4A&52vk53P#HCq5vYJhpwiI5oL)zu0+1S&J;tU8r|R-H;htFHG;FtnFQ23GK@k7_0$25MUE=!|ViW1Wc+$mv4jdbEfl(^D%@ zS%}&Ri3f;X#uWYn5-tL4s+)KLuEjpda1G)G@6FLd(6n?DJ&g#5)n6MMnQ20E5+xn`b#gEXP7i7DUQ$=zL62VdVPxTSWo|tfGMi zR@^`ZD~5Mt*atdTMFJ(PqMjC3nxIfX|5K~_CaO~=VPIptKT)6X8uHZYb0zub>GVnO zTKYt~`Ra3JPu3^Fr)!j;?Xw!?o2F5^O``;)HJMb65-DpP5jIzy5-qK0sc02n+K7!# zpex+Vs(n68vdVpY{zU&Qj;Pu`tJ9MsAZb}Me*($|lrVsA#Az`VMmpB&CwgG(#%ktU8r+R-H;b zt4<}KRi_frs#8g5)esTl&4^i5J50bJ6(r#sOn9XxPD~O=8Yd>;K@y+}Amu?4k3q`= zlFA+=%}K~{vj5Rkki>gE29mVpcp^w*WoiO)3?zX#ik zQILTo;4=4nkOYchW%YgoNd|H}NHS*AyA33O92T8yemR=heNV1)5KRmz-OzOza z0xX9hi9vXf6tOy>C=ZgrKprG9%UOrDKv5nffq^_oVwPps02Jjx5_rjjBt(Fv0VGLc zSUpIRbjw&7AgNSe21uHSlnL-51}sN3a}@W_DC}vA9L0SYsK+xU(ZYvCL=;&I4+MN3 zMTn0S2st~hfCbXhS_3tTeY9}Fuc!rBd*sL$=5NcWiKQros!DzA@g@xk1F#D2=UK5K zSVhAite9cUiCE1+)~VHX66}iu1Y~K()e-3^35Eq2+mWVY?qT9i*jc7y>KPmqAEF~_ z^C$d49(4_ZBP9*M!NCgYnVw!6LEuYGmhun3Pg9q8IDB|cN18HlJJM99?2j}R&h|%| z$`kyNrtsRBrU~<}@m;r`C8;7_s-LHl^NFt!TY0hNznO z{c3W9W5j=zEey*yu+J3et#ZgjH(l@-31GvCuRVP7vL;v;W)2RCsu5&@Xn|YFOR2)x z9gcMqcH^Z6#$mfWFvMKP%_#+eA?7-6PALcsG1qZ(Nj-#dkXO^t*3XY62sC`qYGQm`IG8(v;K$dVBiR zgrGNtt96^2DX9tm9z1`Hnm_dOIm9jlJ;1tW7GJJL%^k#7qQrb?hRx8rMJ24Xjs(R9 z`qZK%9{Ne(BG#309frQXGpoSBQxWOTih&qBUvci3ZnrH6($g&`JM{CQu$q2HQu%dU zHr{yj_!fy7+P`CDhv|uCl)w<+20QfgDC?m=?aGoww+_WOPnm|IC#l3IP?=aW0NfH&`-re*sQuk zKOya;*kC*KQ)r;4#*%$&hkimde`;(uRE>^6NWaHI;K8W;VrvN8m&V@@lS4oA<#)K3 z!}7JA@RQC`>`recZg<}HBlULYwzIc85$gdvpvt0lCt^KdN-CpvCt^J+S{b!F5$gf6 z=FX_yaoSRB9X<$^QM+SmwIr2zAdJboaj?ht+UsMNWXO4mn+>#YmjSyL&6jtYF6Eqf zQKcgpRiSNr>@Q+q5Wam&y((Q$(|uMDKB5pCRcS;aHmcHyLTpr}5rx>ON=bL_AsxtyH;9G7m18(egck1Y^n(;I4 zSwSK2%q8$qo$BMWqncA<31k^T!?8fk4vU zHsGiR7z3g09NM~SF-D%eMoMVPU^=l;3;<-|FmU-oeGd!kOAJ(6Dq}jH-(&W!O zB2OGPD64g%H6s;Cr|Vi5-MW5u zzEDF)2J8IkLh0NGek6bbN*4v|&mI#JfT%2DMKQxB;_OH(dxa8{i5gNh?5)(6pL4=lbYu1TbVtw@;Jp(&4hjKG=YOwMR>VebHEVecyM*!O~ z*Zv$dI~+Ht5S8GF5}`%lSQ&+!`VF3H(X{ZXgk~+MMrSxc_MIT1tp83BQzvF?-w8sA z65zFPj$=*x&GbKz@RDMw*7hW}_3w5m#Lz zNx;!^z7r%w7k|#Tk0=uk3l6>$B=IoygFkL-q7JVJP)4Gl%^LBF=z(6tJ5azWj1a3Z z<9I_`e9WBCu4!(~Baw|id?-~9e(rUvj;PQ3Rj@=82;M>_hInj3s@aL8^l@&LP(1HoSv)HnoGt}-z#yh|$c(7NfM2QfN=q0M57uLA z7|ta>dd<}9$A|bngF~P3HO}JD=gWSuo&%dTtM06?b~=`!uh=*G5n4bYe^hphZgSU@Li)%< zwLQ-;Ycc{QYV_(yfO+9M0wo{>1wlNB>j;#96DSDcL0m_m1jdA(k!4L$tto6U-z5$h z<&mD9=phCrQio>jlsY)8P92`-Rrg81)K3nwS$o1_FTug1#*VYPKL>^gtO=$OEf->N z_6l(^0-I7-9ifb4HHBGBS7~EpQqp1aygf5K!K2v(HXuQJK!pJb;aCqOm^h%qfP~1A z2NGyew2yso5H$wCFd$(7!#+63a?CbKypDglW*z_uxbl<$06SeXHcQ|HFyn;O*83sc z3#bs3pK>qI0xr>>FJDQ$iXH};czosFXSdy9WAhcpU8Z2?Ifn}r^ zvQey2^XPj4P>|w1f?%E|#cqa{ts`PHv@Km}zhx;dg~i=gT$197FSfEt6_m+PP$qR# zmXVdDjD-S+qZ-B)hvP13I29a@8%U&`1tzGY*c@X=Likahp@XppITMvI|3HZ9DG-QH zoCaQOAWbyU(25i2U=<0Ju!?$GSSi#HHq|Uo`3I;E3nuQMYd)(>vBU7g&LW-B2$6lY z)n}tj@J-+_8-=InymyWJY!qcg5^;lUl!F3V>bKi1A4S_9jpU;QZG(gn%SR~@k`41w z@Dx}Ggxu$&KplN$$LFIU`ZPfFebVlX-tY5K0tDPYXZa{}&qjyON10H|rFUCC3ae6z zChZyzX#>kgDQi5>=cB+*q8E(r5FbtBlXjVe&qu)>n2^m88lZlBJ_m|P6lOW@8lb3rJ_?}^pO0di2e^JJ7BWveL zWn3f0?odqvASveiiOvvJ)#xD4?S0&+a^b$YqtCC1Pc!xLUc!-9`EN3IMDP`@G9^ef7sw6$AYtL)s zaPt%o)XKE4N@~Y3Yb;ES9^p-Tee)K2qb~SqUzLQyGC;w7K+YT%2})_)z`iO;y%p1o z7TZ@PW%~M-A#cgqS0$m9o-E1yS|BEz7tYE6YNfuc(>UC>%Y*##`)m5{do6hPePw8H zLG9l1bWZti(cXPu(bRIQT3P%>jp?Z?z1%t?T$&NHz@&J#+P!7nB#=TVK%rVaAlDvi z$vi1kn@6FuW0O*7+MYsZ#Sm_{k&Vq;w!6ortR#=6Y{i)#c@{c_F^tJ21Y}*u#6*eN zVn5ZJt#NskQWXD$l+8kMG7Ss4BXlMG`3V`PHcZKi8zyDN4b!q>mM=arE3TiKl_pNk zs!V0hiL7W$8$0e_2JekKfs-OMLQfx@gb648yYFnRpke*H?~^?e+41kbyMAzrj_QlD z{Uv+%9dha_?mFt=}z!3er@359Kx%8$-dT>ZceYf1QL$wo3 zCdJU~yXcu2nusldnsqiHVoQ*aItvi-`LXJ@6dqn`=r?B2Vu9M!Cz)KZaLLcIYMusj z07O#1?a4_5E_UR#qcEYoswL__umG*W7Kb0dj~&TvY<-BGVh!LSi`O5~&%q(0D?@{q>&aw+ezrqIO+Q=J%HmdyKA1WSbS^|x z{$f_4&J~^ywX@T?Q8i{7S6SIqb5!4AenaK#RI*xvvJxonKa|wiss8|TKmq&*L*Q6C zRoE!vSxuIWjNF#6VeG-e$4BoMTqb4K#fQxjW?+pI=U`RLLKz2rtMN8FL{vo2UN&~o zB=?dr@EBb>;SUjY%}`N+5{8*jQFe%Ew7RdiXt%mUL`!0uP;CAX(V%Uxt8RygGB}i( z9U`i`h-mzo{y95DR0{y#kmhlsK&XiH5C*UUmdv_C`?5Z%j;sVoj4 z8m7?O>=02_5V@F;h!JqhA0o;f{t!_*rGcK^i+S;fh|<6xBFZEY1OSa4B08Zj9P<#E zroZG55#=$;vx>Nd4ACgMAe=~9>qrLGt%yBZTG7%{q-~wfB;09-h>EuK=Y_nV>lDqo z?fhq^IU~xkQJ+PWBXbV48CKkMCECmD%8L2v5%BMNHl|JO+p2+_unktweY16tiDsa( zs3(}yzS+v+iF(?ixZ7iG(`}$>c&I)&W6BbcF<+-68MpsttKBbX)$f%z^rDf~ir*`b zR|oo#PnXq#ujs4{bjpK*zcwjsKd)fXnPFI-oB96&;PF%=SO( zzoIkK|7gNjbY$iF=jAt)906&?K=sz-2SOax!i$=A}h{~l-wblm{~kegY(~+n=kP%L!&F&P;ou- zjZNJ;hsJ`+{q~D|J-1nPlKQr&1KT>+P1JB_xo!uB3iP^9ndUv9FRJ86U!C|h>$To# ztm>L|TX6|mnl!_Q%F0Nj!#FDBro~Jp1U@brkzT+Ey1m1Em>r3wFbln?Ax30jE7GS# zM57}x`AistRV0kUDjLRN#f-$r8Q)JDJ}C3j*n?Ey-XZ5|&LjB>y^iR;)Ow<8T7vCd zJExA<Dl|XsiMf5LycoKzF3cC}QfruZsBC#<>Uvb{xf8x8oj>Kv30da8%-RI+ui1Gje8< z10Tl545(0kK*}l#hMYu=2+7YhW46v2Hq+%QcWNS z*42F~nd*qK#D9Sm>vr6Q$PCygteV^!`$ZB~4eQ8LeO6gQ!m1mTxfCNA;SWq?kg$r| z*kD$K14%uQgjKh3e0d72eaF|OzlgqEy76h*4-RW!IL}nFr`*6)EfK{ZVU~3V-WPlH z;>UDywyeS8$ClIw4Mjn!K8>wrWbLJ)Eiy=&E*2zwW{Wx`j+Ypsgd_m5LLEX8<)XSg z0R27)6?;$>ULC4=q9P*t&%rck)@Fp}`Rt!`?3Bq?ycOah!Tz4 zK<385Qg-lbx)PLh`;tXpvelRTgD>gzC6WZA{q*^gzwjk{e93*j`^ZW8 zb;^F_jy&-hrQO)c)=IPpLd|H;lS-D!leDC%gDZ4ZRY7LVpX9WCbRz zwj}eAg|Oek0J&2#9ldu%Yfs6n$u%I9@nQt3l~{wEo^ZuH(JZ14TZG)HgLenkA4VMlzm`O{*1Sy zn(pP|@m>C$YJ?ssP8<-JZs)JCHKvs?GK~l zxT(qU*g4&_-ZA1i-PG*(^_*^Mm78GdbGm7r7K~&@UFt= z57lmo+CjOH^S>n?Ld;fmxKu zW2i5s&2L%>MkM<&gq72>vLAlXGMqs)ZeO80uzLz>oQ>QQlzzk3aA#l*W1|R-pcSL} z-1sUw3z@sCVgJBJ9-2I>QA6kIh&0nBNZfDX5>>&2q%(CU(Mv#HoWfsb6{l9)G@wRw z3#Fz(Htr=rM39YspjCXgAvAe@tljRZWgV-moUhsAYD!uo>*dBeBCBEZ2<@7ytAuq# z-l--urf)d2F#uK`)1y%)qzvU&*6q$w-Dw?{GHlJ!9yxy3%}pmh=C)x^+I)4NdbGc^ z!B78)(rJubBb-bKBC6+z^ftrn^$84vh|{E=Oahs7NQ5P!lpb~Gpm4b3I-$HHu}R68 zoAf(ZZkGe<>xTx>?7f<;PfmrgphH+VL42WIbT{iQE;Dg3$D?o~0lc#8ZG|u^v~wR& zI~R%`#LO)I^3&Kk@kBEsB}#j>WcGVb)q|N+3#Whd!zk6 zXupeaU29y)XAb9n4{e=2w(Iwtt|$2>_j^u-<8uesMEQejg7(2Ro1MWm39-R73951} z%4~7B%Afajn1n2{*mCFnP-1QlY%liQ6*C)Y=tUgd z1@5J7iz|kb($*RFu+Z9mdnJMQJnELUBVxO88KSA48ijV`7H3u1@cp-428i(Ql#9yQB|c?j_v zjUcMXEuO0z3Fk;h)XCyooyKnz*f2M0IwCdQZbF1v=~Bl;l-3U=LM@9bE450NV=i>` zAz@^c>^e$<)H|l)KgqWPhj7WVXfhFxXC#r(GvQ_nRZEQz zVPgROJw(5KPn1Gbo-SDOQ8Rz?by)(|g<$pWloVVZdeoaT9-=M2HVc6#f06W;{2gE*4;8tN* z9}xS@wb*BWE%w=8i+%RjVxRrB*k^w&_L*z7&%bB(Su8J+HkgdjGg`kZa<0Ox?+SJJ zjvz~%XtTHNSrneh;JvLw^G^kD~h)STv|9!Idyf| z&NYcyc;OiR${rE+)D~EH6UdYvu<(=U%r$zz!ket7^sr7um*nE~F|>FwZtNj$;oqPZ zUfp5&N=^_WPBHJN1M`lYWfpU0*8&CYv~zW8Zxw@5Rf8fbygO(SdW8rEHHkJ!Ys9WQ zV^I>J4m`$6k8G}3mNphbjFivwhE*xi?1rjD_o>+MH+FJ3Dw`*&g+wdQZpmQ-$T_mF zwN)K5=KJ7z&1lAj)c29FwO`_U1+rYK>!run$zkR09iAlHWD`rWXFQTA_k|N1iB2rA z^p-G=S+J>D!gyKvvaCW{Zo;W^+q?ZGOBko#ifxwtB}*9RkrjP8o2gmCxLPgTJ_yC6 z>dell3`oFX#8B|U6vWg0UvE$D(q=#bI8YC%M^{{~`9S!1fj#NFg|$$e>D%lCb7{36 zXcqPT_AisM`e)F7Xt0jQ-l#m59N#Pnj1yH4q7$A|T^mumPFn^VSPbxY3io*R%6f6B zN|(jr5=$3J_VVu!{Cly3QyAW4q8Uq~8B0Tb=rv=EMxCPdXvR61G)*hf1A5JPCZz{7 zBYv!UE-5WqJV&L}`v*|2p=fhZ232TY<0m1%%fXQM?-l%>Wom{EU=+ZZEbjq97f z+n5gn54A{_ORk7VicYym)K=9o?3RZ*<{IUQ1??e0tB`%rhs_!qtXsst)J06zD&-`t zqN?O+m(K$y)j?;mSY8Q0Q?CSA4zC2hDbxocMyT)PCL-Qt5%01Jr!7U2Xi<-N!pbP-V1B=fcRoCSj@&TAi?a4=`onB>FZci_cFTLP`|UCBEj#7OYkqA zr39ZVYzZv5CC`eFhe(HMvyye7*c_aKqEp#n<(V?EZSfT~)s{vnGHiMwNrpY}K~C*F zDxS>|Pyew)%(*@X);-Zbr)N)D0nRed#+|Jb$v%}_6DY@u@&(9BROqfm1vq8ZtZg>0 zVc1DzyhlZ_ZWZ>eA%ZjXdKQNLn?`Uihfvtd;WtLoMmd`iIhz^kLrTz$i9D|L$Qi6q zNs|(KKuV1IjZ&gLuq0_lu+xbUYjVhoP`-TdX<&cuF53bF^<@@YQ-mkgW)Yx)rG?QX z@+M|LrZ3kp={LgZma#Z@C^u)01`MwWqVn3MFtuQGc-~@TzKqex5Tdz1Tg?bL8^h-l z(U;hma6b*(N@h@kbs?qiOTyYQ0=;kzz82-~`C3`cfz^OQXzPGNs=0+9)eTQ(O-BQj z_F(c2GneQ=V1OH0b5>Y$Rv9bZ1W*raicU*oO)TO7nL}#(O1ZX(%>5i+m@; z5@7((I}OgxSxn3`Qp!vk*Uf&GKFAhLw+#48Az zM7ndCggo|K2q_#uZ-`ScH6FWS^QrIs?D8Ytha5-5^S^&P0zyQCW8WhVTqZ+ zU)6(39S*Zr_)T+S0r0y}$Jk;T;yMAgS$d7mzL&4iD<2_MfBaIp<_4ty6bH@eQvh$= zubr0_zg5K-!o=u1J>a=H`K<$)Oto=54PBFj=HNVP`T{;}Rg4=1z^J<=tgB#@9T!jN zC_l-!^3=QJ0YE=Ko~H*8SO9E73Vwrcp6Wc97K4Pxbhc>jiT=`mxmYThA*SGjZgnsm zHYh9})}t@UdlwXp#QYoFx?#yl#U+5Q>X)gd>-L9c2ELoiGyuy)HaXb6V3Q-ZEm4vg zN=#L)db9S%?!{!?UdV_xn`Bjjhmv@(YbH$rlMeJ|4LH^D@Yoswr*R&hs)G@)gn-j` zI(K@r0Jm`27>ANl-6;5Wa#y2q8W){A?hhbOF;3JQoaQ5vNft_bAmVQ9?Z^ZU<5^rqid?=)KDi+t8Ou*jv_*NsylhrmCzFi7quZv{eyEV*RpZ9VJNZzhAbIG{tDC3tlhh85l9t`m?K zsDLDc^P@?IArdouMxx<2XVpoBMbN~$k^HUYdv6dBCT|ez*`2a65$?07Q8)|Ujj}9a z@Qt!8N~Dox5f8Zb8L@1mX*nvU<>*k~`3hlDlrr_0mPy1Z%`niSP1SnJW-|4d7BpY# zRxm9vPQvv`x?jhLX~8b1Zo1F|#>r$N$+S>Ux>!lize#;YtAa1YrLl*I{W(8-_ou_n zs&4qeRvP^Jss{MeiD=4!5(t$UNJ`|0Kn(Hq;thNhqOSc+4 zWs$Hkt&a<^7Ol8N90K0_{*@llxfmdIAGlw)o@d@FM(pe;x%$3!`lCteV&>T@a&I0D(&2}WsXV4%ILB+u%2OV zmC+^HSV5OmV`XlH+ENrb{I3=V*QdW!Y8NWPj+5k*Zj@_U7zsHUWP=opYk{<$n_xc) z))d-}X-DHiHh+HKt)I1RdsH1G6*p$?;ZMng^#(eHFxS0a2_qDharDo9>ZG*5`pE~l z1@&UMzUS2-L6 zQ4P$EShuofN{2p9U<66|^xNRQ>f?+@t&$l*tkQVc3>yaz#*CNQK_H45FVWDFT#Z7U zi1uct5L7$idutuZK&&;Lp@VAk>V)zG=W6rLX7~NOU);QngsZ%bgx$DQ8;SgI>9VU_ zR6&K|drMr>E$efDiz+yc7DcTZmbHu;S;MlLZAPY2dN8MLe2pHk%_eRsJz!Z;%bW|B z`V4HdNn%P5SXNZ^#2P(dn@vbldT7NiBt1T2cAt~I`-af$R?fogZjPJXpFK;nn`B%? zsrpzDNDy?Vt_Pw3O2c135HKW31{;-1X6!NSC#rdB@BD>pnCTN!drwdg$JkLCJVrxp z5SPc8?PVmIjf{CRy|4Zq=A7yh!|DldXHa^(2&2|xu~N(@qogLue8L*kB%4phN8K%f z(QU1W?ltdG#@S!`*zLiU%2UMTI%MqST)*}{)Zh)IG! z)bK*Yr>Kz9ieG^KQt=7t^Qe2H2z$n%8e?;Y9=LO?$9aVPrH6i0Zf>Hj>=)ng1+jx_ zh*{UWN_Gd&U)Un(sJcaxLAlUuY1?{YvcbNaf)SmS+jP?criL(s7{nGa7N6q0$GeA` z^wO+469bAZ;{yw!0qxahhzW@W5d#Xehy@9|wHaQdKE`^(fMUImMtjR>GXU|?pf@p~ zxUeyEtScs-aA1yGM`RHjyvdT3iXt(Coa{}0P%Uen+!fZatfLU4AMgLDnvX*ZtgMMmN)OmbbYN;=lOC|LCQ&IpnD==!&BD<`8wOB?Eu{x+qyUMe6@mBeAG@@*lom6^*K5ET&{MtJmsI4_5OjR=k~D zAu)%rVh|qfFLgghG>vui|Fdm`5fEFW9hE9CiQiJv?*I88#E695!()u-%j#2WN2RZ` zA=Tr;HDYJJdgcsICd{GUBP0AN^?|X{T1K1`oJFx@Ub_K|DOoxKvV`$jR0{-4ve`!D zWSebdPPW;nyq+bKOLqn_f;CygDv&LvKW#EMHm}ac-^&d08 zmiK-bj&{-WFJi1mm3II02V{n$Vv)HMANSAxR*0zu=6UOm-h;TpddsM`!}WdN)xnKC zmDy;!RqVNM2kB|e!ZEzR(^X}t1jk>=HH8{C#_Ro(jgR2~o>&~43A3v<$ru^Zn{e~x zCyau}{Ms1<34o0m7P`U8A5?>jC5;DxiOR-;zHe+M4!OF+p zck0$=D4sBlU93DvWV8_s5Cb3e4{aS0doCgB7;30Usi?vLHMEwbXxG>pn~Td|lf2V9 zC2^H1iR2jaktD0Xra%3?EdCx~z?xj@z9kaHrMloqfCm`QimxQXoxS)vD;a?#M+A}_ z8R~1t9aTYYG^AP&Bq@n=kYdc~0Z?Nyp3(!5q%0aUy$3*ziGNBD21!yw>Wl$UW11nQ z2OtR+XLOA*w1HSuX{7W3B*EyV!Xm~1s4;Dl(gTp?>F`Q>_U^wx!?-NyZcSQP8?RK@ z9**Sd{I74=@t2pU{C=-}XanaDn_=%}nR|kX6Lb>TN6Z>dJFx-t)G<^1itPnsqA=h| zCNTrno>A*{8hhnTHJnBZc~44e^gSvWET#$9X+|yu zy7bs~uvqf4l))RI5njX^Q!l(EWmrXKmz+Kx0@l0+F(dMwSZ*A-EYIp~o$% zLx6F723IM9pqH9*R1sAVgY=~@Dwbmdoza06e)Y@Ji$>acG&tq_@t^=ea;irNzp5EW zunYI-zvUc-3Y#z97crN^-XXeYqWrZ3r$B3GL1T2m@F#j>kaZsBf$#Kj9 zl8IrCJ=*MOJ>~#rvHk4!r+c*x-quWb;>oCPWE561`HWVf+3OM!#7>()t$gvE7XB~x%BT# zduIOjiZlb#ScZ*ljT9*&nF|-5yEN)al+RomQKm?RN@IZhO%ADNjlLyU^{Om6`SF;$Q<1~9~!ENXfWZ5qf$ zN2K(yUQ+{(tkDA~#FR&450Svgh1t6w34uo6Spbd6IMC?&HUvh*HMJBpOdHphe}fIe zcxXzn*h$?nV5PC=d|XUT92*4{#SWOYiil3>6KY4Tms`=yngs>OdH#>cHCBrb^y78f z8=?aen3pJu<^rf-s1Yl@hwlWcrDZtNx>e3_Fc}~W_BB8q2qLzOUp<14uxvct-Xyc9 z_pxIxPq&8p1WfmYbz)C+_(aa{w;+WM3Pxhubjx!PjdMmQ*yXhl3iGjmGz3dUDf03?h~jc9)|eqDJ`DWlWi$uDV=99?tQ6&m_tF=^yq zr+>wQK^Yc;XG(M=IRa8rb3VgDdvh+qDlz6UG%}*ikjFS05tJFV`3F5Xh(|yGez6G1 z9&LuF)DQuQA&6dWhB`F_f$eP_5l|uf9I;SIw>HFg8}*a02#ADAMxx`(XhX2qNYJn% zJ?=WXMyTWo4VBcXjbB{@quiT>QPvEVJgX4W6+!~Of$b^PPzsV8m2iqRv*CM6pq+t? z;F)_RCUWmk-$eig741eFs`cO*G;}JSp@$3A3M2I?J%DFW;Hh|q9@-TNpb%1e0MC>~ z<)&Z>da%tVbVW)J786Ou67&EfGBuLYgKg8KMpftmL}dCUr3diLBq#B$F^e|EmMET- z9>6;Ua2qQlVCSOj-G@W4bIVzPo%hGV&WFwt>?G~=s2Ov~0oYRPob9n&1XB$gNC1;p z@#bBfevBPuYFfqqCPhx@nVRHXq#2$hj;lES<^IwMA|~okaQzGFnNvQ~Kez5JVob|o zps|pc+rK5nPY@~vI@q}fYhnxgcnOv=3@h*FOnVR~;WjIpV1jqD8Vak&>vG!@1$$5iNoEu>SO7dn(n z9H9P^d}&!{P7cSS?#HuCR5D$l=S!s$c7?Jf@?10<5(3axKDw+JM~H48X%2&7C>a0o zHT?#%65BE^s8ZAdSG?XOmP!ah2i9Mb4>Kzcg6#5fWS%UTgoP>h&&kJ-T>%RNDB!vB z^=7?+`rr7cpdRc+4?pnQpa)h6&yvS*k9^+Qz?Sx0>YtOZD7&7SEKOdZFQ3tz%E5O? zCB)K<*BO163_2@;CW56YhPrRAG=uM+P@Q_Hzcb!`DU9?sL)VJgn0hc-p2i8wa`0<+n>pJX4yZLOWnX9B`kh(S-8 z#fNQc&31zHDB^z+P3_T{mVC~a2vpIMXOBJhS+W&HQXs?7lnCOq15Oki0u0z*diL03 zL*Ifsm0HgpdmM#UBPwFVq6`SB=>^ddD~pHJv>CA2LTbt1B(P(TLpkT3%;H*j3BtLhwR;C$_NXqH$j;mzAarTUZN{5 z6)(X8r+OrC3*(1}Yt9PfrPa@;I)!yqG-4A;A1_%u*v+`C~+fVSp_F(4tDcRKJ=>B&X&0Rt?J zcf$w_%Z-xtrXCtq-VKAFy!@FPCS&t%7}`n$#%L>Z!?Zxump<3rFqxNk!?d1p(Sx~R zS}-XyvN*SM!?=gj%Ng#tcf+(HlVv*QhA}EC%?(p`kQwMpaI#IP1Tr^_b`;BE>-Hd? z0}Nztm{r+*P@P3*@dGdv!At)9WbhJbCu}km{gBaw?(dBXx1?YdT7Z{8JBc8Js@kKos>OBdH^rMfvGV$TC{`hV9;Qq^|Jsk!MdqCg!BMjdLQmfY7gM0dxf9U zTY#7D?U5XSB(%d5z)MHgKz+0TFCFO-KQ*NX@X}Fm#mEx(>*J#Az>5raB4{ard(_r${pqEHokI474=SV{)G{-mh9O;spRKk1_%iG;} zj`WB&!>Yl7k*r^=OgU=D4{9?4e?jJqyvLk=lr;SKr$l9k2J6^tt*n<)Xs#`bBQV#f z-br4R^0{tY2f1!s8~yq840?5wkJ2C#u{a=wj5l60Uwv7H8Iv>(hloU z?#Yem$E5%kYM7Y~muqCbOit~cBimmcFXllw_ z4w}u#a?o_JXnbD(2kT5!oa0 zryIeA)FkbmAfD9p1^2X$h*q{2k!I9$(QT1$#WCT-`Y4%rHMA3$6G8ex3g$r>j!2n5 zEWEezu<$)90t?zna#;K)S;V2ix}_{=I43zQjvn!D-pthA83Y|=scv2gnedBHa^3^_ zg2kNakz8R`lcuWvp*q^q-i9s(&Z4??vr~I#=@i+=ty<7-fby!*=|=N}#H~{Ii)wn; z>WZ=o)o8U6c--I4L$w}VA&!rxGkZnPD7>O)vANWU^^9J+h&72h;mgZh+sn(6qaxZ% zXD34_iSoCXmya@#{yBSj`KYvDkg&JDyi6ni@-ke?gY-Uoc^RWLDw+TngKZ`M@-lZK zyLy}zwDm79(~wg=?B!*>gF656GS4ToONO@vXURF(-s9$x+-PAX9X{kC^~l0XS|EE# z%ph62`=is*tj3#-8U>ZC+8tRe247W9oYmw6Md9jwX#EqMJDYKJu#OvI_p% zy165M0K9xx6Ll8oGN;BGKH-q0TVX-;V3O93Ah+-01K{2FVbK_-Csq7Wwg^vjSG8{s zqT(!3v$pA78RETJK2aw$8H#RR zQTGW!-6b8Ys$GPVE>+Fqa`5Yf=&h6k^s7|+tVBikC^FOvs=VVtr|9*ood;#4y7#p(idu>YLWo?2!;1kD~`W1<(c~B=x5NhJ8W~ z)I&;i$RB=>mYT#GCCN7$+Gl^KMu%w8rdlc`Iz&C1k`=C|X-Zn4rLc$~i6lKoJ(`jw zOVzcskhimhLTNpqDJL)qYmA{4psm8wIEILxrR10EuDgKJqGOSHP%f$tDm5Np4C5CN25uNJtc!XI2{GChOS6Cejgiw zt_VInppgKt%S`Z9j|ECcU*kg1kgpSZjSk?a>JenM3bSd3IHIYj1VO`1CpQA^#{gAr z(4I?GC^X|T5=vL)14#FMqBeY2!5BD1+r7&!uj|`4GetM}Z)T!rERlzQxrweAivMP& zC_?|uOsVnT%;cF=&5H+)hT#$os~<1p@yyPDGm{FGxP3EIYWz1dO~vXxP{j8{DMaDv zfdEG0(EeKnNI8s>;z!P^rh$s7Qceq`99@+n<fy7%L$}BE#Bsgl8RH?=YYksjtyhY>$vQSVs^Xrp zqAts;Z>v%<;`w!nt@F*!)k0~Q)z(7)?JfpEG7oR9=H$RhmFq6Nho z_=9ED9*8FottJbI|EhyAXNnn|_aUj&O%htboS?*%O%m!65Y{(U#Av~nY!K2!5re(` z_n!E8MDV?*d~Hwsn+LV}W36*X!*`sQel`i^tMy9?exO)XLq?ddLzg<`>n{iH8;U+{ zaf6!MWK#kql*w9D99D|GZKAzh&{S7V9t}(BwX$R{ZDAtXwrhr{YG8Q7j1G)}jWOTV zdH>?fn$gh$<5<+})M`iY&5D{kW~d_hO%+`NF)u-rn2w^J{3ZsYzN_n`z6IzXyM^!C zSkEH*Z@x5T@BR!PfctPocYF~~N4@|Oesg0b;d3B-^kW&mOZmV@t+;DhPf`lLnZZ(? zb~9d)8L!BUa?3rrTF`{~oOWO7@EJb}3D))~>oO;wP5Tzrgw}aB?fcoZZwanow4P1- zMm72u>W+K|r+u&G0==IpI2UL}FEv~O8t0cH6|+Vl5G3EM5f(>PLD^d)EtuqPhqA0A z7s_!Rc@r3b7~A(yyoCW0ye07vLH?7{KgJN~z*gU!j;h`T5_9WZAe54aU6Ub(!!z++ zMJ8h|kWR+AKr&750+j{LNYXO@a#K}@;$0wain>6P-UZ^B(w}pIxP)r*wu3yL*?AX; z3Xrh5KvLsfAdI-b$Ks3H6QvLZLIl1AhR&OIpSp|-gkere|9HQecBq&dmZk+R5YROx zEKNNK5Avr5I%omP1S7Iv)fni|^l4lmfJ~|jL=P>BZ4+^7#04T{H{t>z+LgNBFlfiJ+vM2GePj6MiDhQwRRgtG^>j%q`=F!nBcSsPCHci9ty1MKPBX*hMV|Hd^!fFq&V za$B+99HRcYR4azU=29&q)&{$T`u2%Ix@GTkhM*>PP!C(2m90%w{s#9lAL~Jn-rmh` zkvv{bR+hXYG@!_u_+kBXc_Ka3m=O_?{nA)aa8!GgV=^@})SEpUX=4VDJW%s=zNlY_ zL#8pa4C!6G2BwA;`nikj_jtSo)c3dpO`r;o=a?LvYUh{stJYQY6GSVY#2#U+dk zgA$BO3jV`i^#?}Na!;^J+FB9`vy6{_hZCezLWYcznxqUB_?MdG3>A2kx?94zRKmGH zF{0ehp2@y4G~A}VT1E?aWh-i};Y@bha!0`f4ZRWAs>i0rY{k6L*lqavX4mM+C$ZC2 zOWF*@&Az{Hwx{t-cGdctvKThIO;0Kriy9~kf0ugFPh=-X{ClS*&8JT4)`}62hGw8L zwYPF%sQUrHfOv}$;}jrg3XIGSK*_Rh<9ee}rrJvt2#CVw|8iG`f9Dj@x)B4-a%%L?8Pz$kC?8 z3rV_gRP{0FJ=KGtMT?^M6c2)W^f6{3RUgv=eG7I8hZ$G7K1R&x-9e1_Q0;8e^%mkP z_w-q&pr@#1r{BfYX>PQSBYokQx>!Urx)f? zFu~%(4&;;p@L?|x@Zk>y_%fiR5IN7FCQ19+P@jqRm1$^*fN>xN*r*u>)9+4~RA6j5e9fu}u2dxo;0_Lr z?7K}f3fS-T8nmxLHTJzjcN537O#(b7-QcUL7wbf0pBjbaZ4JPbkLuLHW7ZIzrSKR? z&o2_p{ds0^(F_Wj^VD^l3tgmY1Vso_SDj82HK#gJ*n)h7Es_r7l_Mmj_$B90`(H{1bzcCe8Yq@#mG}oWjwP$9##%wU$iz5>ah60Rj5^d+L6 zw4~@uZn2Vm`_UF$Wlgo zdKrChbMenjohNJ61yy3nTGfJVXiLA(Cd$c2HobTD?5oFcw&0cswZ6+=J??{v&`A+3 z+@T6IdZ>%!JOV5u3Y`R`Nt9Pq5yPTrbL849Vt_HYFba(O;Ajj3+J`n#w$0zX+?3zH zoXOtvMpeY2EF)Q&#TTxjh$lp*GKjg4h`X#Mmo=jn6g@~Vc3!V1LtTnEcwHJ z9rw?noqb&2iGwKjl)OLxRw$Yf;)d!r0^+b+s!JKrTJLnCDtTFy+&l&`#W?^|r8o!BlS=66ttx6H_-q`yL$jLVDU-yml&BA~U=AsC83|qTXIowJ zXNU71;E)DRA^YU(!YNUjEZv%R)Ro}OB4;}sbn#3wa7e`gXZlrcOsDZ_hpeKla$+(} zn_I|r2kvx>$e^Q(csh~@(-EwSTap!Fd(C|bs{lBzcDa~ysWT52cdRfqiIT3fydTu9 zPjR7@4~E(t)d^yHS4nmv4ccvs=``P$_&zTS6e{E&;CEdMlJ!%Z?3o`O(Jv-3#7 z5-;vAWIwD$d5YMO+?K1{{sl_679QwOE0Crq0T|MhDb8@Wn~0=BD4vf`1cRxmi%pt@6q-Q{o?#;^S*XE zDYgt|j@^IL5;m!(>X?@Uf^O%EZ4l*mp88i6_IORkgf#o%2endX)x5M7PL6fZk$@m2d6&Uw&lUX+|ckDomOYlTyazVq%`fB9D}1Z}H)zFE{Bk$mAkBMQNRXq4;#=NPcti$u?WXp^&P{Fg zoogNdi2+rZh2ArZf2Pj>#;oKYY%8`5D;laoMpVo!oGXo%-VI*KSDT;R>KHBnwO1JQr@FWw6@lGuU+pnyS|Haajspa|l*@_I6A})z0jI|8M`O6PRte zx$Is4Nmrk)tH?BxBFnKYx01c5S1TC*iGnyrTtKQ$<&wANYulyeL0eqZFn3*>Uv1jg zF`cV?9h##6AL`xMv~&@_Wuo?*KMe$}9C|P#ERsf6*wB{fRI#@+Lf#*@r$oq$S{L&2 zrcE`!zmgev8Fv?Rg;TdsD;Cp1gYj%P0%XZ(e!!hH6_ zQ-{@Z9NNDuV?6NtI-Q);c1y41=BL7Q-A`nXWeziqWt$N5)czp z#aQ|^PlOv_%Bf0=D39f)xz@~I-hUIr%N{H7 z`8FQa+VpkN1`FD1y|k(gwKwPYFJ#`$X)Oy+&9i=0ncLF&{FEQsQ=#*aGgsLIACej5 z_pf9R6uH~kE*-byMg-7g3zr{5x$LD6%#EU9;+KxrKet^9Ak2?Za5vl_k)Q zQ<%%QKf*IJ`!HicX}vaUvo4?Z z#ST+Q!BXkU;E{V{A&tcF-IJ49pD6ZjCA#d?{gUF9qjfSnL}1nODjqA*g4CVT+e4!D#>? zVTmXtQ!0f8j*n=18Q~8{oLTMs@~}XtQtZ7lEGRohWlHF}#Sh5>MwxJVsNK54dQ#)=%* z71zKY&&-5R7y};)ade3|7 z?s2>>E-pM6?+fXNC3|>kZKv&+eFI}W~gZz@q+`U7`q`{G6Q1CKiDBU zoctXSaMPnhmvt=t01bICQdW*N8=x8Yh(MhP1ZqNyI-*76s#OCxgSv%jOF+5B`?c3o zO{Jz~{G|6c&6A`$wc1iRUJz*#EqlE1DPl%$0q5n%gkMcw%FP}-kK@dcI{8D=h_Bjm zys-P|P|FM5XH(||AXEwu7T|;%3*@JaHfhlUe?)4I>WEz7yb$PA)3p2}TK?u)m}3^^ zc&pN?LI-(p0-U`Kdfs(2+z?PY`##`3zYh29%%cWa5|!Z%$}u;1j>*?HN7!ZAxFla{ zmJhywiPY2zRDpR~unGyMziIK` zv_^jJx|pB;9BU}BoSNOQz)j<51i4=SBlq8=S6gWbKP|(c8}BUb z221;NjA;E`Pn|il_*=AJl+jp6U)-u4J=D8X3W~kkY41DvfUXF`y`i3_klj(tSUjMs zj7AL1kGxh~;wT~ic4?y!MjYKs_32!P-tDlG*&)C#-|!WU4c&6+y0fAR60f6KBS-`h z;WMoihQ&bu>`iC>^DAYpE7QGgU%Jd)wLj^vw$q6=>%GjbY?)dPfYEH&S7-yhmTx%G zI5q|O*}L=A;z)$|knv^hrhB`jrtu!3)|>gvFg0@d(y!>Hx-!kdN_6P^j1q%T)FTV( z9iOVeo7A?EJ?&act+L(W+DSy0s+rIYOKLeYcT}RKS2RgDIy22iy zPPB)7tv5otIn)YDS2I#Hu|)g|#f;p>1r{HH=b~Me8y6jl2e`lsM9o+6pR#u!)HSXZ za;ra}}fvs8{3{1BogHZx~gM(RdDWwjR}MK5;gAnTxTp{g1GBxn^vxIs(g45C6P5*^WDx59M*|f_HwMX(D*6C3tGen?f1Q>w7@D#WxaiPc1wi82h z=+05~?M?vRlt5j=F-gMsf{?o4fD;hYV&^*I`2(McFxDSMi2K_*d16!>)jWxZy?OCA zRrkaxK`wWE9}!FQ+1o|S|05^!6^<_f7^0=$&qpW<#|IzZ*Sh!yyLqb8Dzj}D7woE* z!qqLstJ(`!w->MKEL`1LTn7TXs;zK!Tk)!n!qpwcx3(15Nj%h1v{rm8EiFPCr)stM z)=utmZB?dF8Otuj4EeU@mQl(gvQmf`W4H+LE+06LpX3tob437-M3D!s#UlKQK3u$y zsV}^^Y3>m;7_w0*T-CzA*p9;br8nAe654=ow9VCsw2dsG5wx;K9m9ni!U(Pqav=Em z{rt=m8-}im7jIVt(~&Q4zW(POxaf-*fK$k!8UVrp>d#HHr^$cLWetF~&pJf$x2T`T z1;$}kmR*bkyvqf~0e0mA<4{t6ZFTX8(rOm1vslo}&@2F%nZCrK)hIoRaQA)YJvUvjfN)V)eKCt-wQBow7wEZe~Cz*;xaVEO!n@ZfZ_oo z&#{51&>SE$Ag+H0fibv%)r1Mz&?6XDI}CB9o@X~SAtDlQ($>%f*VLNS1G(a^_NmXd zCgO8pLfungR@1URu%Ce77yBz07^SQo+-bEPLAy@ZE)p~Q5=fY(q6FTn@u!U*BlSP- z!>Z;&00AMdisG^;9f`oUF;tjaLEHVnvw*6#+aD1MVY?-X!l2{ZbyNZurP%N-yi^Zb zl_rO3y`W1a@-4Xh3{&?b@Shng6n3)3JKq~c`|o0%aN?yD9o(sHiGCn1II~hp5D#bI z%pKD?dC4TRxEuM^-gSvjdrwcN{o1A=Jk44T{w zI4rNRsv2rQTqM0r5C1;FPNJOO~c$e_ixsF zQ7-j!IuR|ZE$z{PoH$_ZW0f|6SQj&@V>zr43=7p zmHos5uomn)o<={M29sv*`madEbWXO~QK-s$OAP6B@lL%@oNJ!A$}VDImnxVp6ymPa zvS;M`xP6WWDirt-$OW7`^udyLyKo2HE@dSa)-s(D{?6aLKzxBH{*qJQi*FMnD({PK zj4`>_Zs2l@jUZWK3ggU+ZHTD3NLw|V0Xi`tB2hwXt&10F-6=h*JusvqEeTY%i8^5+ zca@DBQP!=)%t%d03I3K13}Q_>+hVR;&FPE=9+ydB%q$Hkghb-87D#yQJSn`UxNp9= zzl0UjHZLu%yJGo3dw~eZtY~l!xoG-&{)-3m#{oB$CLgVPH@)ym()^*^oMei7f9~CX zE-EB<>JT9_2=9}z-u;`hx1?~OD|^=mF|dcqvM}D;lZBd9^b&Vbb%$YUe|z)P{*HB1 z`#Ui#?GS;f>fAc?x>@mTr!Su$8a%-R(6$}mK>oDLtW{fA_~X^@w19xziJ`%r*0?LU zO|;X=*Ry+RM21b~X=vP`YujXXz&IPhY3{ccm$e4a$ZF`<+DSmdVmFJlToA zd|9(Y6H7l(SRT5ix$vo>pTom`UiR3dL;`P=gL-s(W8DEY%Vh4Hci_J%bl<qTmkJK1ZhgoA z&HEQ;pPj$pw?qR7AMTzFi)gaS9*tp1wMA^`kUu9OgO=A?oIt_@8wV2(M!OtZ|Ksh5h^bQd+l&zhq~5b9wn9_rncS^7cR zv-YUVSrK5J0HW{en?5E(EPTDN?=FW^;RTHp7*5wMAXN($WL;7H1o~w0`D*ZIn@Yvq z!%g!N9$uHb%f*MMSSH{(irq>;J6}}vnEEm2S{(uQd(g~h2spI(a)K{BT z2n(xJntmSP%NOP>?|XUSU#I?cT|rtEb9d3gZ}vyn^EGPD9Uj{Fs-`DsIP{YYQo`&syRpzj85(0*_2gj|yy=O;e%ija>C@U4H7ICh z)!KeqkUFprJ44$lZFs{)7+Bv<<(ltT4(D$!V=K#uv)NxFOAW~aEks{L_* zb+D*a!P%11v}p7aJEW(+8@y`dZ9nyY z*p=wUs(>Ap!(<<)n&>Ag$H-d~az~^QW7JKF-}zxRkmPF7o!{j6Q5Aq?(ZAei+b9E9 zd7iu^$_O=4H1Ks>2Io@v+jrbc$IgJi_`u)N4NIAEYyffzjQ45aZ?MWf4Z{n~#q`!F zG|O^3VB76t;Q#)cEhxV3@f~ipx@91`@SE)lLdh1>0PcpZ*;Z{J4rs7Wj+{E7gH$&> z+sH{!&75E&573n@N=aoJ+Nkql?CQk^6j6Tg`)ca~nv{(usFF4){Bw7fvUlF+MkGm; zHIhBfOJ*=}?R662zz>lb!gJ1LlSMR>WYE=^WV@KwHTZ{#vA2br-sv{mSZo_ZZ=Jv? z1yz(@=ZJX?y11T&;g^848ZJ2Vi0HB9f^e#a4?ZkWD-v6FA0Hl;Js!#Q!~d3~JYps7 zstzO!AdrHZHYw!KmN~6aShTUYZ=(Y0W^Dq3=AxsxyK4y!ZXw7+Bd;SX%P_4#oMRsTTIQb(Q#lk*{ZjR|)UB>;vLIPPwL zd*-(F{M&SZEem^ccFiXTA%`k3K5scHvK4@Upp4tLc?Gb^6 z$ke63u7nli0GTB4{3cwR#aorSLWwY4Y>DNC?Jc)lrwM?7G%fl;YK#}0-Qga^r4X%$ z;5CC=VJij%6194=wkxr<6`6BG_@An9ZEdl)%YJPIdOoAIWnePk&>#HVbH$Ms0%Z0n z0fbua={xl44F6ggdj~?stu_lGvEz=N!|)rMZ~PQSeyEB*ehL6mF>H^_ z^^Y}DNfx@Lh3}u7Mpw5&&`5AORgjsqmPi!cdF~9WF^kML;yvz}adjmghEQi|F`fHMAj1=!G94 z?NWy1qEkhWi;e6+$}%6@wQyJg&_lg1h2s(1?XtRktSwy2h5QV8^_x7{7k{IJy(T_b z`Kf~iDqSXeUWiJ#L-9zU(aF8vF8oXDYB2+{1E^GGTLu~6Z=1ZJAObEP7rai9rUpl< z)ER@u6m6m>$za<@@QaSG!Tc<-f4HC>Unv*XF@L3F;i*X9lxpAcTHigTbg$-Y-%*9s zt&2aUzBy027V(rNG%1aycyGHDo%G{)uI&lgU|xGWJiKLrrLV5y?JgPl3IN8$*w zxS-smG|3Kr!u{xN0Y->hS}k7JUYIcr^%dEn6CaV?>DnEq}VP>w+bf$`{=Mk{$<;2C+{xMvd-dvRCq^LOq6b=C<>29 zVUeqnIb(yL236bDL%lDNzQgs(4n9wfnp?BQMQx|cmL0Sgx@B?P+!xlG`-0A$1cMG? zDSicWmojC6ghd9KY!*<-)LNXW`Omz~Pje#x{n))}1o%rwfQ66%JP!ga1O(v95r9sG z01=ML4qgZW^5x4cjUI{Fi6%ZwBCPC4VpwZ(A&881#44=#sNs`JDcQd45dhF$d`ssQ zbJ?G!NmXy{l2uU_UeMngdnBR(@i8xN3R<<)mx>VG(Yp8twqDpDVpNrb`%h#BwrMvP z%cGuG+_5ZgLVR4V+J}CYlO8I>Wq8$iB?!;RUaxZ~mafoSH$Q`0;VE>t+%6>b5-GDr zsIvEb4NI6W?@Xqh2>G+*J8SakTXJ1u24!oqQ`D~VUT+J^<(*I;s<#V#IA1PBVF$42 z1)ShxO$gOL-&7xRRUe#jn-YJE1c?O>5dc>I@f|&=f7;7 z7kfAAuphRk>(7pNZPCC@F!)3w03lc8eG~@9uJ4N8p+Ch@70-{!bu+m)YZJuX3GWtT z`rfWB_$a&^1i{ULmrzDRh~(A{7RkU~%4&UL=_T^0kg^Gb)3KaK*N_fP-!5DJLO*s! zwoDPJ#S@(iA;)(gV|+oQ!rvms7_!biW6XZb7-Od{3fqq8vS-K}KZmC(5uI-tZ?q}E z10bENcP}_QJ9w`W51R-atVsyBW_n@Z#atR7uJNJaXJaOwV8{m0MNjpU__5GF2J#tetNI%kxc+DHB=xjq{ajOGU z$U`;W0sJ#JUwr$9hei?UEecv29?B+$#Z3Oxi8}#)eP?;;`{+6{=ytKTWJL-FemAH> z)?M`GPG}HmcD_D_=(dj2fvUGt7-|z=DOwm%%*%@MCk%Vi81mE^6b*!QPz4wl6e^E( zz2~tDFpowKe$)qN1nd?D#E5KxReb=Tlf8QrjS;7S^fBqJC)i(B4ch&xfJKa^s zhj+QF&KrKlU3H!RHg~o0*bVNg`;$NKt~M?0aaWuF`t9y&tISt(9IyiydwNR@2sLl4 z<){}HD6a+dKcQoF?9Qkit8#U%5=N|E8xH4m%cc&3Th(_EXhR|d-wo`1DEGPBhH{@{ z(b|V#JqPQ%XotK=yy+rZliA&qJ(m02l{XI%{pIftdGVaXB_vCMHIVB$xn?9x!oO<| zRMkM^(nZ0F`=aH>qQ7Y@`nWFw2)iv6I$*(A$X7NphH}*e9Ik@Rt9!=9!iH%Y?d z@u6|HCCHeWe7XF|*EZ6mTl%>aPeJ#*i1f1U_0+t?o$t#WD*>_8W)K%xQ_d z`i@h(L27|&i}`ZNoZ z?_+qwyEM*y@qHZ(1gX`aJbyc7Zm)jRKlXlPAp6wZ{hie2%NJ|>8tQf^MY@C{wU*)y zn>t>3!=}zN8(JtR{LPsSZSr^e%!ZBf_aR*kq2Oj~Punj3f8(V~mwx)vuOIrlKBTL# z{M20G$7B?-hYe4RegDU{|MgEZkfn-@U(bu!Jl)#+*!?%1-;ya6b1g%=TBcjK^IK*G zfn?}~4K0t*)hctn|5~bG(EDrr(0QW8?~@s!SkG*@*ha;D-N@IO4OiOlGaE8oh#r%t z=zK5Jnzm{ak}jmv|7`s?LE#OuGt?n(#lSopA8gMky^A|Hi3cyd*sYE%j54u4lZmt& zIwm7_{3Pq2e|0;fYvz_s1J9Xm)gRI;Nx{#R^x$pza+ltJJx}?_=8hvb9r~L5JMd38 z4j0!kl;$&YBqLejzW*IxdKEzcHNpnf+aSPD zOYcz2;1BXMUsY$@4x91`6s{1Nm#!tx2$q9>Mr`a zPm0ljgF}?wx7qzT$dBTyFXq=rwo1{N?46g;_#@J|cvTxLogMrd1^MIchrT9-?|NhL z`Nf}VDPjUfZW`jWjS*zEoINIOJF<5^N7}A-XYU-;i?-~YJGc-+G5=MaKk;WLR(n@e zYw5#W?@PsZwG^M9Ki;mp(pNy5pjyKO2^p z>R%)!`~UmUmDlT<3|;n7CYWhjE_Mt)I`G8Mj@f{Du0`-s^D(x`-uVSu5AnhUGGU9_ zGQo8laYC7cWOzlmWNFCg^h&sYa2w14VFn-0-YIYSF81&{`@kU`{|-3(&?hq_ZQhvw zD=EojubD3HFLO@&$W2@3nx+fOh5fTt+1bcGK$88A(v1bZGa!5RJ%iHe1=8uU_1s#R zI`pt4fgXGfeNEMM^mgg!SZ?<4`lXK+rM1@gtn&|gJ@tjxEZtYUP`IY)OU2i<=qz6c zE{!qoU&&sBEnZm`?+^JM=m4`%8(G*Yy`0%_I&8{>U$hy@+1Z*x`KnGN#HOG^w8 zy?p)g3CMe9X{GRFME~m;Fst2+BTK7GO8^lEJA$DrAvUU6k+pah{ zuoW}nG=ms zK(ZEkpU!xL8FkxIFa1OH50Uc4pM~s#C#t_IzkY#V z#&YX=uRL^lUoMjwXvGwQR1e+ObwQIQG94HGf){Q)boq{-bM;G~h~vSZc`FvbT`etU(*VlH%WAALwPc;$XzT!*!s;u$P zOaH>}mp&<|;&y;183Zo`o#t2De*JnI~TWzZRC2V~0W3BR5s$qz0(@PxoEP zuc2Wn%RX?hQ~&((`k@<|y9WRFzKfQoZyeTlI5%JM&jUX!N=m>rS*0z7jhm`}gzE;w zJRzMw;ku`NdE=!|USC+2(?JxUUix^x))tNh{%ljA?8so_Iffo#JfDMF9jt(iN40~9 zdG#cfa@TRW@6uA(*E%q&-7ofx`@g93VJ7S8!0_wOT>4~i!&@P9`@n@V)<8b&{#V)k zpEr6Oj?iOhXH!@9fj6!ne0X4*XAeL5`j>YPoQLxGKGHPUugO2S`HGo+iAf+jfA-7}fYnGgaA z1PCOY0>flxk_?%PIUvC+DDL8oipnZ#5L8rFQ4tYcK@r9ELKg)U6OcHPx_xFMe^pL*)4s;;i)x=qsW?y%!p*Uk6_ROFlm`|0&QqC)tbCYsjrks~5=OxN{v2wmi zIWJPq3zc)Da=t=2*DL3katpZvfPK zQwAjeJhrLRD?ieKhJ2zC^Efhl^qbCSj(?p5)BEKsd^+tao^9xjcr=6w#O;!(0M$cZ_E*&%4 z?bMvx{$tg79lm6JI)>PVos6ts=kwWsF5OtCuI*XpZW`9Ln~L4q{px80dt^BV_53bp zaIY)4?6aRg_u`CedR}tQ!LGTzmv^ zFZ`ZaE_#kxxf__hUoCU=AIrD_7S^v*4tpqT&$NO;WhI4!yP1o!4-Xwa+wFMqGc9lEt`&@KjhMGx zZ7@w&8}pB;^2{q$Cd({UzBNl_w*9~?_BWZ$@i?<_x3ZTDdtFvOOgm zo}V&hLZ2~HD{d*8R{5#rvWee{(%J-v)Lb_@7`S_4sBT>Ox1k=>!h!x14~4#&I%iJbX}?g-C%xUbtf?+Ex~c8~ z@CG=duxe~m-3;9O8jKp#RQDFhfm^GH3bssnpkml)R#3{X=)bDxmMQ%%KOU{B-7;lk zaTncHnGaMPj}`_hs~)I$rm!%#*SW(+SJhTlT{UIc=zf+B*_$(1i}0oV#^PrR`&ml) zYX;|Cu)Eue{#|s1xf`-q^v}CsW3O8}t?GGIX0LNMXRPYEyW1_DKF2Vdjzf-vu9Bz9 z^*=cN7#efi6JH&5Jl4~Huxi_Pj>LV-#z!{!2JUyfz`cI?{PBAnGaiq8HgVN^4yI}x zA^V}fTtV~if9zMM`BC+};jdkMS^c7boe&)}D0!MK5S0eDhGV+fWBvH?AL#`u`g zJdMC3Ty{1%ADDp^eg*(as{o7#wO|gI4)mY^j0F@gg=+xyzza$M`E!CQ5C$GV{@j4_MtPugE(PS4 z3f;qEvsCV3E$)#&3P&}s z&&kgS&9pt+_3EcDY=8E6SBL&{GWZ3zE$=vB*i$c`GvU2M1BI%{HJv*5J~#8c^RosG z&K`2HXfWoP^36rVi${zsDIHZ&IdRhDDO0DpJ>Ke?THowwEIxN$eZ%}~7hd<9-!8iT zhTHF0a_3!lFa6y;53X4G(8G_cdi1fUpIQ6ty64tEzu}e5uWotm^{sFG@%=w-|KP(N zJ3sn(&li8*`{iH0+PDAf!`~e_`uz_-9{cHMJjIj?jK6J`SgqA+v>m9#D)qdRm-Hle zAb_6QcK!72dlioF;F@!Ge||y7jA6Gef9mB<1B3~O&Z&yL*SYsVaZlD^5`iRve@p<^ zoR$QV0!S(UNpdbZ@8924m-#iO(O}X^2rBL;@UZ!YOPAMm1xAHgI1{Hz|9Rb;RvW4dX zdTKocTmm`)wCkjeya>Okf5-s_K>Y^w3+Dn33pgw@?IrSlA zTl)jD|70t9K(>^=NJjn705A~f0NHx#Td4n`z9S*Dla>EuWhc3`Rc?|A<*{X%Ngk9x zDqCuKNfwkhk_VMJQC1GWDc>YRk`tAg%1JVyvXb0Mwp3m!*RMU=Dt}vLr@C!f?nM8U zT4t(C(jN{a%1d=fa-%X+IjF2uCXyM+hss4|KAodw{#)jq^f@)(J#bBFC-O{sn~*)_ zm-_64PEz@P=}1jKHEn7WiFBzAQ2U`YDGeIeP`>C$ginN}c1Yo<%~9K;gZ$8aa&LLi zy@Y>?lVnV~eKj~iz{3f6IDrUHz{3f6H~|kQ;9>BL<#nP{#+vdw;dXNyZi#zeoZ?=> zk2teA{-m3dUd!tn{t3T{uzL^&MLg}}#ih&ZzH7mj7T2lw-#Nv-gufmCfS-il-T#E& zM40^u^VWvtb<4miuoi4m_-6$%EL0PZash8N>ZM_#rNfaj=L>Qb<0_hOM?zsP;++%sMq_MvQ6>C)tE+u(AB70T zK{Xd~1#1u^#{Re;b-Vmt4_D<6x$C&7Z$1^L9`Oc4F)kVpheMH=m&#X^OxG9mcH?bE6BxMRempr5u`8ZgZH3v z+ZPNYi|&v=6p4miZm;4zs=Rn)YuA7)QU@{ly}_DTEt^ad=OmwaL=tgD8o0UMNEC6K zxr75MhBAc``w`GvANIOqIkVpDCr`G_C;f^n9>F$=_d<;JCV3Mmei8wdWb<|>Y}o?QJutF*GXK-@myad z7I*nMS0v(U;9PDuM8$^54J1s@yF9J)B-b5O6A#EL;?b}-C`p|(8cv~k2vh5gpam2a zl}<3~^v$|UUVPAFZvf?ow+3&FbfXfg0IhA1br64*CKxqK`V??cbAZ3pdY6oDZPdJuTw(>VV#fcRM!m$RqQhWh2N!i24mZi7e zA#8%z<>9I$p#WDrrh=<>`OxIiVtlAL)M$zuY=X}d9E|#x8V77o1YT;PP_Q`(#iuq} zjVMqgMC*-2LJ`Ks#bZhLc~Z>M4K6n~H(_@?z9>u#wQKaHBO+*LXbh;^q*k^i{)EMl z+LmOWWZMyfT&q!;R6k>UXg_HEX?|sIk{(NbT=l*{JkV^@P|+kVj}LV%>4&6=T-aCd z^+y%4%JzuL%E}{N*t$5x;SGAoil*Evas?^tF&NgUlur*T5rPfG{V^Z3iHoBXK#)0c zS1{(APX;n!0wukvNNKU2kT)t-pA=ibC+RFl2Bf*I%DR;n8+8(#8x;l1KDI3_o*?%L zQ0i*0T#k9JC>KHkr08hzq}5cZF$e?#D?}aE!WjA7im`@L>iBw&LQ!EQ+YK!m=5p6b z_8&&mo33{(Q6F+uoFoFICD{!sA}og26`)oVbNPalkX%dfGrqO#P8uNzz$Lc{syj2; zs0b|mJQRr<7nMUk!Td#GOqBjnvE|ur>a?>wG@W2d-73QNrnHDG>WtA-Ns^Pgll@TxO7p-fyxuy+w82=lysKC{+4Qx(e^N8W3d0!IxRoYL4ID$W z2wDsc4^Xj^O~kmzOTtgJ|H|kjO@NcqIx}T_M?(=BP9n}Y9+s9$R*7Pt=R=dGu?M=# zXmhtDWhKR;Pie!Vr??e`!VM8$O>K$fV<@KO3Gn0qo^oHC~u3#>OAiXMb#mQ`$+c08L^v-1OP<0_!gvPtbbQRhV$wg|0 z2w&(4Re8C>@^ZbXsE9c+K$AMrYQL){Dz!>cZk%F$j%-m8TOiTD)&)cJf)tBRiG<50 zV>D_+>4+gY%1{vF38^lUev>K6o~4|m`5sQ=P-L#zU^Ug!aJ$S~y|SYx=2t0H6A%DEWb(70+& z(ifDMQ;sab!<_;~qDmEDYAp-4bgl| zo(sqomKxc_pgfX+_|p6^MO<8#7(W$>euug^*e2w~hCdfe|77zYZS6&#z+g_{^<##C zq!CPZlbS|q$IS{cKu*s*rU^8-q0z21P{0sjLPaGF6e4pZ`V{oI zBAB5hCNt7xOzIaZBwd5TVBi%<*mN@)nHZ)Q7=hP%$x28+n+LekltYqL^Zbuyep#Mc zOcLjEbI5}nHO4oxE+$i=VGVgr?I20)=}~#yG`n%pUnC^WdvZ8w;*%rKd~lMcK1KeJ zG~7=!`yBd(aTwu4$m#t7-8hNfQ8$-MWu$o*1x(lIRQ18wgxX7M-3?>bjFHo6g`F^R z*r~%!43ZAi1Th;=5gsP|G+CAZ<#3q%!~>)YQ;VvKB8uf8!{3JGNOwj*rPxNvCd-2u zX}Bqw+QclD=KPUJ9J9#e_{y4YPve6ygy_7pJd)jPJwr$i*-nyPbtn!So>mmhDj-G37_CWe^ojX7 z4VRKr>!@T$Wa-9y=sGAV^s%QHt4Q-#n&c-2E0n3zI2s>VQMVMV2cLpt;M}Gabvd96 z)Pwb42ly6fm#?VH1XI8wuo7$q?7{vI*`B_Is$0IR_^@I5#VOiw^w;12L0*a$uaKZCQMME!s; zSPk}q%r$TW!+{?x0Xsp)Q%DE+!98F-I0X7UjXJ}T6{V-~zvgHhene|z;MjiS4Y(d$z#3W6NmJOQJJj_p>v7Fy;Yjy)9VZ$K)`V{=d+~~E zi=K(zI&S0D-0mLRat`#_HQ>)@|LM|$7k%C|YjOE%|FY>T+;>zw8G69kajWT=_Eqs{ zmp3hc>+pKskBdsy*DoBtHg@Ca7cT$p$mix|@5|gdaBs%;OTM|_lfhq|yJJ=D(kUxF zODZ3)yZ5q3YVMw_eue+;tat2xSG}x1-0f}K|6DWd>Buc(U%F~R;Zt*N9`lDQ`+w2v z{h{Ap_*uU_J>SdyYu`^Fth#-|6T$muE_dBF{`Z0VW_13e`RDep8Gq>XM*dIjwiv#@ zVbq5CzZtP^?)9b5H(XczZ2aP{&;NMPUwVHyWdC^|Wqof3v9JEeC>pHZ)l2|99nx(ZJTEpQ0tzXgF4z0y#K|4TeG-m@^)9eRm zEsoaIXtLZN&^i{a4bj>St;^7w46WVJ`Vp;X4FDGdT3a*$T3@6I#wB1Np!F?U`=WIj zS{F;K1=6~n0B9|e)+$9nYk;(Vh~*h+t&rCJ41m@-X)Tl1LoWq+AhCXlM^DmP&*`2K zTv}WD-;&?SWY?C=TFNR_MhV%FOis7#iEt!?UvvDc^{*}6YpHLk`jv&ulRlCDB+7KU z=hKnH>6X7`+e>Y4iMB;;=yc1H2=_~6`bYAgYC974f^0(~jnh3--r7n(VY|p)oo?KT zaFoWWjzs!oI}>3}_k5~!+PYT&ql)cp(y<7FrIFv5;xR1C@5yq*wE$a=3btYVQoEvV z45kP3a_1REE)vIsXH5I(`4>Go?2P9z9-97eSz$~VnxC}hMloZ>a~@2^l&4kW<1`ml z9-PsW9ZW&wu{a(YyOOa`hLT~*BcT}LNraN-@-(8RCn-;qT{W-i-jG#PWlp{TDuH#*xtI~U`2T@E)a z?(@e`01m<#IXQPSgo7k!Bez31acKTfva2cK=lOyH|IdV{KI%;Pr2Nmw?~MMOX+Qsj z{W)Vl&e+d0{l}U9Lm9uE=|9i(pJ)2d)9*ij?fCyp_+K}FIwQY-ul#;(|MBmxzthS; zrr`h8$L9EfiB!P#f6++K!dBrok-b~Pwtk^uwO?x3HRT#M2pk)yVdoh%?6WZ%rsredtuN zg;z0FRkJtjt|_tqGEmB8usLyDt7&cDz*j>{uk|K?C8_j3yO#M?f-&x zhP8}sdxo*4pkT3v9Y?s~_$bE4{fxzTA=54ud**rM<5~QKp9u(eA*^|vntg`2 zDnC=PwO^>1?kmUvix6esF!qPTSX=OFSa;AL9QSD0(XX-J^&vGA@PA)#eO%2Pkm z->TW74QgiEtY(|PQnTf6s@W~u)$ESX)NJSjYIbO#hJB^durKdZvr7hO*pYkHYz&7u zu_Gn^J2kuT0u39{Tf_Lf)a+0AZwHJ1N6o^wtJ#Ro8g}{3YIYs=Z(i_|n%#uBrp!|_ z|5a+X>^eYsLB9UdRmGw>$9tfza4uM_yKhN z3NipjFbY(G`QSG2DA)*gfWLxv_$p{$U;rb*RNx0!gS)^g@FJkEhwcMEfgbxci~}MV z1ttO?xEd@0kAauL+u$pp`5N*8A}9y7;7V`SG}tOu`w?cfV=2%G@j4ro{(a4|4}kzgY5fCy*=i$N1u1Ga!&;2<~wy8l(f zE(E!t7)%5n5CaRr9bg4`2D}2^2Va20-~{OQEp!YF0ePSpQ~(zUfh)mH;2!WOcn)j< z+rby$FgO9a9Yj5WTwnv^fd@oDBe)sd3!VV4fDggf;P0T_#7MsUB82z01t+PDIfr@2DHkcMw`@P)w4ZT zF*{y&v|3(d#crUh%4Hmp@TSOF`p*huWFFJ+_HXjaC?VDJ4n?B^fPCa?-t$tJQ%*oi-dO=Z*AW!QT^gU!V5`&rDz zs<5-(gI)R6*nMBid~7zWV}9)R53&&U<3U(#C3OnH% z*#dSAyOu3v*RkKQ-?ByQdUgXoz<(3Fncc!}WsBKu>~?ksTf**Scd@(KQuaG`54)Ew zWB0N9*#oSJEoTq16>KGYh&{|6Vc3H+JM68=HA&wsneE1FsZMFrku!pq_~mQqwKXp} zMA>YQZ!Uh}4H+k1i=9pTgq(WX@!?FoiXBm0`8Hjpmz10yyhr8nCVa|ncp)jp&F!Qe zQurfnw!+J}N~~^Y0B>Ek?M`1?N!&?##~VlCgkwrH^oBS&)Bq|Gkgl<4G_o1C;!Bv~BAP1+=q$cS8CDPdUxN_ONo@|}U2q(?7yWRXgw7bN8x zO6Dw*ULmLV3~7yvk>V+C!y)rjS63A_xXB)*pD0wT+iBUNsIclKYoSxx*`Nf+)*`o4 z5>_i$NoCVK;}tqrl^hTotK3d0i^;txN|vQN*tCa@HO^M|@Wx#{;B`t>p+rP&3j4mW zXT#-pHoq*ExEt|0PZF8OTkXPL6%;s$sNJ?)##&Jxi`Q znD1z93nihwpKxrYBeJussY-CX74MYxVy0Zn`}?HmYrL`4+jN<77t7nu#7-s7&qKxuoLgADv zrNX7Fq%ta3>Gu?+lI|syQMpRZe^MExdr4(fu2S>Ttc=plq%ulZ&B~};D(bIXrKZ@d zjMB}dGD=s?%BWnXmLsW*(!CUAl&({hQNC_g#zf~u`#fV_S)&N?7p1!;2~%x@?n^?1}>q&X=Sljf#~C(TVMYMPs(nQ3l{Fw@)= z9SeHr$re4}!U&3Tf{naEXO&CZvFD7^jy>5O{gWR%KB#rj9&Xu@I&FkczNf7;8_Bs= z>Ch=s$syvJ=ae=nO6f>W%`Y1(ZqbII+ZhWX05&Qldfh0tRAU???_ZNVM$vp*c0}Z+ zbW%z-$c0{Ic15TwrrgW9CU<3of%iISCmVLBCgV-_DsA<3!kfGU8*jbH9w~P%jFpt* zR<=rZO*K`~n8zvah*hG(APsrIPSe!xAHIAc#Fo%5`8uglw0oQeE^-j1z|wfBjrx$? z15SD;N6vr3CAE?iH%ZQ^zS8SW_SK@|WXHq^AUPz*4C&1Azb^r+^d_#H?nAymCHtqZE5XR>S1rBxK`GZ*@Yw1s1d#l zqp@OnZ~i%SJtpLd`@JR7w!%VuFOb|Qa^*!p#x5t9iUv$P1C@AJurN9Td#C9ayPNJ* z`rLIzn2*QsUtFk5>9ZZMy7OC=X^^IjzLL?ZOm}Fc7YWO;YajbLUDy;PMTS{njkdxY zn;4Y0EqRLT-QF<0fr!*;3LMi`_`TjRyGC1yKGuhR&YKVkyIx!Ak0NW6=&K3rF6~Jp zVe7QY+l&ZHZzeMKe8NS_7QG|xbmEJu*vDOuUj8=bbOoX{PU(WpRAHJ$8|Bf-SK)W4 zilH4j>60les&*=2N;J-RP;$FSD^Dvg(V{Oj}J=$i~pwi?*e$mW(g{>mh9o^d~r%vEORxyA~AZty+v)(B0vAEd6qa z8}Ou68&%?ZN*g6RUX3T$TFlq*l@!J{(XXI85N3O{a}$Y5t&7^&zmCzx6UG*o3B2^E z2Qgv#y=~Y(1wp>Zj`$=$GhU(Z8kNssBQ+<}>&U z_0`sQ z5XXbMiv+7MRhTQ>A*>PJ7QPlbhy%q!ai(~=xKw;rd|x~$b~Ow!j4-$jjfVRS8w@)P zM-4rVLye=2wZ`j=FB(5I9x`5L+GFaF|6u+T`Rnq(&Ucy-aahh{re&ZdU}>=2Zn@u* zVdbnZ(Y}aAxh(hUhVU2|OZi>HZ{T0$-{E)iU+@R`M{VnEuiHMfeQ7(2Joln7Yvlbv zTlDYhKhk>)w;A3r95GDHn~`@#-om`)d5`98&D)muX8sOJdy~9x?jhSI+sCxYY@57a zt||Yq{Hx4M%`cn3H+Q$#ENr*z?}X4v{Bu719g_3)5xwAxwWWdhd!8}dINVrae8*_Z z-)w!`y2Dy&n`x`HS!go})^9nSF3}lu4qd6PLicCgUv)p~RQfJ@72l0#oJy*v@rKI` zR^tfc$Hu+JL-zKLpD3(OC4IBmrn^PAM)$g|oBmS$T>TEn|9^xY;sDVomWtEGka!Jh zf0g)x_>QyPaC!vb{f7h{2g^-L7iM?Y|86u$~1AN z=S&}v+zRA8PUPKukUx&PJRhMtnqRSRvwuSO%T>}Izn;2_bQkOTikBeeTEkq!0>hn# zBl#!tGtC3d>nyKW`q|>PKic}(Blb7!7de6sHcKVdTMu1>wchq9wFm6?+uybS z%|6&s;kerIxMPQdh2``$x=VFe8ULR58`EObJ*JhWV*7mi-I6Y-B)#sCk=N=^)1U;C3F$?Tl!iD zTW4Bpt*=_A*siy+Z7OLW*<}3|F9Q}~}#Ih;!K?dEaj8RoG0GRxzZ0_%9I(;Bhj2Hp># zy7V_*fcyWLu1^;zTAtF7nR2S{}whkZo9PS0j( zShfmdUtu#^;|^hu@Qv`jKpJ|s*jKy*nsBG#1;bm04#ta&`NlcMYmK)WA2zNtzGB>E zJZx0wW#$?4M(0h>^W^#SF3-C^Zw1=L&b{oU2L+L9yUE= zdf&9u^jFiw{BZuw`Rnsv%kN+|n1`8b%nQx8nIAU)-u#03ZSx-UVRIKtj>T>%vXoey z7Qbb_sQtz*6y}U zo7Fbm7K07C-?jm*@-^GLwhwF_?PuBh*(cgPb|3Vr!G4YXA^T?N*Sq$k_Mh$j9D^Ns zj;W40j;kDt94j2ZcdU23hpfJ{&A@4uv-qU@q`%-s6SE_gEG$Xl>c7_?*N@;Ucqbp{7xGK_`}j}z!~6-posc2mThhWS!XJhAg^z_V(DJ?$ zeiqbXXR()fzSv*9SmZ^sI7}QRP7tTT7S9$V;w|Dz5s5a+^(AepU5xh+P+tZ7aOg=H zU(Q$ZQ~2rpEZ)P{@_xQiSSTzKZW0y?ON6DuGGUY9Rl`=)-!{W`wA)>V-G;q}eTD-D zX40Z=x|({JGSGVap#2UsWt(&+(PT1NO$DamrbgRB+alXdw#Bw3wxzaZwkF$3+bY{? z+Zx+iSj!h7)mLp>ZExAO*|ytu+IHD?L$~+Y4%iOCh90vW$C9zcp}vmUk7G$(>*(m{>geIfaAZ3AI5@{ZN46u!p>v21 zlf&vLa13{pILaJs4de%zHKIlq@i*~{`6Z~CWqcFAl3&HI=GX9R`StvZ{3i4WTlu&6 zZTxoh3%mH;{9b+^dWS>&QT`Zz982?Bp`*}M=z+S-6#599Fi^-Aas-_q3MTYw1;TKl zL?{!=g-T(HFkP4>c!XNPFNB2{p0Hmbw5*#ZVWqH2SdD>*~BrQP?EBDr^?-yUGsH}>kI13t%ocM*ohXVX(JB^*!^IM@ zOe_~G#VN4nvqTSibiWuDV|Z@QSqECPt*nPu+T-0-m#OQcBRe8rYjquUU3ERk<;?LP HCV~G08J%eC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/libmpg123-0.dll b/venv/Lib/site-packages/pygame/libmpg123-0.dll new file mode 100644 index 0000000000000000000000000000000000000000..d9b029998b61e8c2282ef09d7e4a14706bc31086 GIT binary patch literal 322560 zcmeFa3wTu3)jvFw3^0Mfi8X4_RHGej(A1KawuwNULeMCnQG=w48kJHnsMJn0@*+$) zGnmuE!L&%LRr+e}#THwv2t~ssLy!S)x3$+^YwfkKXY6$?u3VSP<-z|{%H>*$C;$BN`_F%Z2p(|OO9NalZ?}SWx(0lupF3xus{m9b@V~d)RZxg11^8b=N~>9l5-L``tG@oii8lvs#_MD+epq+1s<3-RziUd{h41+#jg? zgqPr{)a9k_@%^sB{tItc@f5GYaMtIQooIHl83}V6xCx!gy!{ ziTC#t#Jl$glkd6JrP>f}={gnhHy;;o1he`7Iaxc4d7&gx0w zHf_!+2-Xws@~!5#THKdUdYbqS&AQKpvJ%KDwOQZed5L)#vHjX#P8owj!fg%jJXHfg zKait^-a{B7pM^)FtDnau1?sB{uD|i7RrxNX(^~db1iAD>ZV734f8tZr!}3nE&SMT| zp&h58yvmps%11fra<`ydV?T=gvR&l%@~w8EZY^{+V#*up5c(L|Wr9vaPQlr-A#e0cS=u55F_vGunSZOy%R=g6rTguy#-$|uX4*gG&$7K23 z&%yFGV@=?DPm$w91%Wc!^$t(v_WL#S{{A zB2?ZM?L|HkeyA7g*`0Z<RN#K{456Ot}6W5`% zPo98 zHC$#3PGDkUbSEl3+2>`ZNbNF)`4W9nxh`~8pVPvYM?A_XTe6Mi$wl*FWuGnFKBS;=!UIcecy zMDCf9+a|9EbKW|tsP2Kj)h>1&xo?Mwn4+k^+DX5d@nRmSjq5&bpVWeE(6X67P~kyQUKCMC zjWh6`ytt1iiylw%%FO#XF;HdZ@DR!{13o_rrYk`~7e4^ce993CVxNTKlSk1a0iQRu z#dz8ByIBnc3iF_qUqa?+?)E@_cyGhtmj)xvB%{Eb?5l!Kg43SVDQ}}JhM&ZKYQt-4XO@1^Afvv|u)bA3Kk8hK0*a9%>r5NT=LvZL!W_M``H?ex;k|(y!&@6pUsLsE*I-f^?lit0$T7}Dos~{Pa>(*-#X~O(!G{bF z#+;y7l-cpjq?Yon9ly5)bR|je-kzEIov=P6nQbcdQtfKjr%2UD+7$KqZm(|jIe(>U z)oC|StXZk^10MI*OtsLEw!W}_J?oP$HZ4l1UJCtAkzJo>Gt%7BV)h+xM6bO@TN3c* zYD+v`ZOH`9tu2|R<>(QQ(KoWQC~tq{y@JSYZ(b~qQq*oMo?SlpVQjvpX&3!iqkSn& zW@O(<`krBf_IItKH)f3S6&w1IF|b{sA!t8ii?KPX@5ej;A|IWMwE2*>E_Y;KUwyaR zD!bTd-GgBFNA518wO}lgY%tz5);GQ5+V65Tec(bS=OWl;{4KKA8%Y#IKFT*16fxeL zMr%HwTlD>IefMDf1FxZbfrxzMiR{faHXG}W))I+;Lc#lU+dzW8+hZ*7N%BadcjTiS z{e#@dzP#`{LoX(_wG_YFBN6>TuCbtu@VqwTZ`zWiwq&hwz*tlWlpb-1+KdI08Q+Y7 z_`s=V>lD0&Q(E&tl;l2UEE}A@s>5leAICjMl%Cyt!l-tY9Bq=X;L1h;<5gYTB-R@cLA6-2u_>CObrgx1Ek98f))yWsD@rcpNdUxEUw^pEXZtdaO zC_0M`Pat2gK?_yE2$B_Hx(ALuF@>p7U5G}2BKpY@mrM%p)j}r$V@d%{sbGJXYX$kD z%~=IDq?s9B#4aQ1xuBHj@f{a`O+fHr3jD&UZQfPKI4Ek~QvftRP!)SqTk??)G=xB1bFB|dS%9a@7(*)&;& z{>ZzY+_{RHd2OIz=Y=j;ni{*6hK12tr&LQNp9jA(_NBbdmLSCeid2@|%xkmCUd{u_ z#sZ2z?Ry{a{+~4|DYr= zyu1@_8$L=0B3=3Ycrm}0uKjs-mJ^ue%YLKGm-q}WTJjaf8lH~TMq1IrOUa|CpFYkT zh~*U2@e5Sb)R&=rYnrbNy?JrEldFNBrp>vT(gpLif>zC3z=&ea&>r)$7_^ zyw z0zmRtj3ok-_Jb-YQc75!f|r^cjcD2ZKbYh(XVSu2`TpFWNC8QA!O-?`SdlC=uss<02Id2T~!3@)Sn#+Ue@i1Dc@>Lt* z^}wL9hXf{vQ-PcGkKFoll96l9e|s|0hwJWQ??|ZDh73s`4F`~tf5!YqKw9YVmso%mV1YgOFe!*$J zQkNEf97V$vSfJ1hvk97x!FsyLYKWpXD+o$#1JMFd#lb8@H5+IID&?W|!V`g#40?lh zC^hGaJwpRtU8WK-F4Tl05icGoHf{~47y`xy_!?}pgVJWkaOYVa)aC(l;B< zA1!ndF-(yUVh{3H3!Mj?-IO4^wxPe%dUL?BXgDFQkG9(c%};0T>IH(C5wb-_lKCFi zeY5fz!3oJc2AnmPSs#!r8PJ7W^*y6BEht%zs7R@>TPa)ryCk? z?IccOY2lgz#;rnru)not*bj(tSOLu#h0wGqP~+t?!>S`G;R*QF!rz0e>&xj6!Xn8{SzTa@HTzWh(1_=^ zEj!fJV_=E{7wZQ-fp5U=37oAT z>>Vfwu3!oz=ZrAwAFKd8CkvkGzztJXc*DK+^A7uY3!W@9P=VA9wZTTWtKo`ZV~(q# zI@p-&Y8Vl0^tc*^1si+08onKD?Cok89Bl04YB*nS^D_3G!7dQ zH}6v|q@!*-Cc{ozH09gEZO8-c+P+Q;HK9;#b^yQZz#hI6fH_|}pyKPTF#}WVdo1=n zTUFl^>t8#jdXhQ604QyV#h7OCe0DvX-or?-WGm)TwjbOcp&5cS`dIAtgWKjyk!@~c zjUjTSZ$!h_vnpE*5xHk_AOJ(O@KYewoc97k%=ypZw{i<}h2ZZD}rN?}`4gzpW8k zXz~E|Cd}N85=-HDml^Y`@oFp{gWtgU=JEoRg)}AEt@_Qd7uavk%g1ltDlPOW$k3LA z+4qFnrsrXjxmjM!<+Kmx_%e*1deL-lG%fb5C+d$mIQtdYqc1;z)^Tfd;^?v9rqvo^ z2&MZ?o(d;-QVR`N^7?~tLezX=+BU8`U>n&i+qjsx?zS{&eg%Q@bIRtDGYDantugNPzlk!2N;Fjdktnn71pdPRykh4T*`cBFe9`E zGW4c4(a4q45FhK*LSLfE#d9>Og{lUORZZ_opK?g~0p$o+Jk0b4Y*<9^)_aXd@1->t zu|pP*B>AJR?D2~22!tMCF{~Bk8 zacJw&2cthp_qT^#K-uikW^w-A?r)z&$%+qHXQ*Mr|FizqO7|aEec}H0x~%^8isSm* zVJGNsOMycbCZkKdZl83Cp;Lg;jJLoSBib<|?H}1yd9xFdu)6RyL`pt@pLBTBJ3&-f z3!7+1bAAs;2JA}?1rsEb>4j|GX?RVpWs@j*wY3@=7r>0<1opxM+3$(>VP02;$#l_{ zP3Gb$_qbeZM3+QRzQnEv4lla8A%?iYhDArzIG~(VHNR)HcWvz2l(z{225&*%-$@<) z9l(_!%WfTt5t^`@7}XRf8xf%;BW#da4_g^xkl2hVX^I(#GFoUZ-3BWN^5A2$6_ZCl zLj`5pI$ghMs2_ZWhHp5I&1)dS>@T)zg4ihUJ0L=6se-MF_>FvDVmKz^qhZ#ZGn7Je zawiIP#t&;?t=%gqxyh?R2IysE`0cLb4#aD*%ZG1+%*#{Br-95&a-6PeE%TB;XP%r6cZs@co?;K0J-1;xL|^4MFe&*IVl<&%%ClYw*U&Dk;Ue1+pI&a) zwxQISnJDRAWDE1d1O;Zf6Mjz93j?WLwno{5g<5bltxGHvtIiX(&`*$=t&E6{Ap

    S+29-h!-v?poZUZ47bAI)y z!xYL*!_YKi(qhms$YHJbjP9KIi_K{+V4U|6ID=Yeq|r9c5UFI#Ct31f*ZEu&Onvn@ zLN3c(V#5NXE04{%)NU)1rG?*v=-Bfz=r7At;E#8XEsg6*hnkmJxDPUMGa5QG|0C`{ z`=C}(0W|YdX4(oji^7KRTe~J4#^ZZy!n5$Ww0Yh`c(9OZsIznkVEA|}nrO{4FyywC zNw?^0r#pTvd;$6@#XwAVorxEvKFnuecis)7AVY)3fOjA61=0J_L(2M_YA1d;q;#iR5x^O9KpJ~aG?$kWO%%L-E z$qCFz#;jO5eXr!1AiQ>VqS6(GxAqtXhL3)nN~JAEct2i}7iaWL3x5a9V)gsmZRHyU z&rbXw+t)d|2bDhwvC{Th+D93wy8T)9A-sqDOslz<_KkLKO<#3V(t-@HM8A_tjzg&3 zU#Qx#&gI>iyq-*kgNJ#=L{|s0d=X9l2Q>y=jsC`nbRQ@_N8Fn31H~tZYcD^H8HjvL z(}ic_y=iwF3TjI6S9@gDxqJ>+FKrd8wD4_+lT4vy#KLvsikf$w3St~9+z&NLQjXK@ zVJ?@cmL;0Dlqh@}4(uyY;<-O}mlHw9M0SgDMteU%$cNx&r@LTJzDq-fSpyoF(nO`q^;TTOskxWq9`~hn@g1imtNm93SE0?`Kt)@CZJOG+#*dvqA>~adVf#0WPfC{@QF;< zJ(IDfvAdn%^TA0eG2Y_Luj2jXu(zjev+&z}cCH*(2TJU?yWeSE9g-E?$b%Sq=3J z$49osT$(^bp>WZ_?6HnN0Yw{=y4w&cHZBD=hKYmD{! zyL|vfur4-_;+%KP-M(p;8u{7+{b{7bYs?qXEl?7c1G#$ zk|Fj}%Vnw%e%FU&9!Euy@`IdC66Wj{wya7kYKSE^N9>o*M4YYA;#GQZr@uTe;jJA`O)PpU|zvK{7K9BNe zS|Vd%kueX4SYA4si9(ih7r2axy*lGSBJeI#$P8n&b4`I3T7~hD{%%PF2C$s;%+Vem zE@K|iFQ^mLqylQ{&k5A%ZMj1+H=|iQ(07<&7Ry`{CCqcVl6t3BBpI@%;8u)fiaOD%k}&?M9h3ewrZ?>ZaVXd5LC@HzEvfUuqkhoUJi#{&vp$No)6Z5NqlF%yV$lW?NR!>| zJ@x^1^uRfL5jMcJB96dMf2W1Y@TNNY_`Wzy7L511B^|xD#X54f#b6HVtRLlB5A=mW zsWTU|NnrX0}O`HN6lo8gJ zyh<7;BNm0p_5(hDAK~J5z>TaET7rjj0!7-acVR(;hrL?pk03aBI1kfvz$l%gHG=Jg ztwcMMw6p`8GyNONU5xKzVa+IP8~g#=O>Aailobe_?d!1esC0$0`ml%<@m^I>4C_ap zc&};z$i0-j02j_eFA(^S8-!LE@wQ~IX3R7a$iW<9XM4`pb=%_X89%k|?>(vMy_DP7 zfkcRc)Ov?Ic-VdaxuJD|bD8BBZOPW)!Q36_uC}j>*FG`1;Y%?{V0^+8lRNsNDbme> z!WBJ=7;Q=Mcm5q3^eD(6UySWS!X%hAcXt{njcFPx{uvEm^5KSC(~W+elDIgQJ;>k} z(hOcDBd@Q%m+KORK=>4f$I{`-<>-TOyS1g01HaMc5QkDW!}3R=li}2iGbQ)%GkD`) zG)z4I;`5&bWG;S!@j4~mlxX-_Cm!)C-fsYbWc=n>|Hb9VI!uZp2u)pT-S4&=v@)ly z18w>#$S5^F24jc1BfC6#Z!i|3RN%iqa_lTTs=&s|9K@*1#gaVpla@v+qa!!s#v6zR z-S}pjP3H?2L{i}DlM}_Zt)2!u3KMbkoirz&@oS+S@YPVLA5Ll&EK(s#ECN@Q%P*6a z=HeGn8Je*P811vOZ#^IO`gbZ}Df;at69&4C`TMD`VNRLYq-b-vCZbvmY1K9*(xO_d zLFf>JPjQiz0WrK(jO6R^5@1~FVU;If=-X&b@No}N)@N=0Ar+&Mc&x$6aEXFZilCI$0;otp3cee z^m|B}oQW99_HV=RF)dj!xYcNjQhO!(G{lT2wxOCr$it3@Uxn1kA3!jt^+QWzx$vR= z5Vi77BbF=tIC(KS0m_UpIcF>;7n9>C$uf!rf4qM1C#zu|$@1tQ-j2#CkDlfp_C2{1 znldd9O`tt=PXgIsdI}ongY|hec_R?Y%@t?v>q(MQzHaz?6$4!NdyF;Z>pGz=i=SiT zSk%M7w^48*8wk(z&cJ;89qtO^VZIsVdZDq2lfH_k78eORrG-Dn(9vP^`*@M&flU$J zoXTpbCW>zZpW6|^>0`a$Q$?nQv4WAY=#ROP#N&uun6KnKriH}8zLi;v55P2F znE_OJ*j$Ore~7uc4|iiE`A!hoYN0njM5EkF7cy|3i~HM=t^{)FGi6WJp!K;r4Fx&` zy^%~f(=^xPIcP(!DT{ry1L7%q68ql9^q@}Xnt#~#etmmK|LpC1Ey&-CMkp{_WGezT z%ib_;w0mCx2SG;tDgc)4d;=mtubvn(w4TU{@Jtw8Gzq8wKt2xwP320o3Naf?rdwMrQGS z;kN1JrdcH!Pygz+7+2d+KuM=Q1UNs~U4lH-qTIUe2et5xl9)PT&Xv9@lD9z%Ek^TK zZqcmye4<=!b{*o)IH?l!XfwwEPLEgim9HyrE8j>fw*A%kE3tRt>$b0o@7wVSYy;FX zgr%oFw3#;)W9q%YY$!(eQVQuVGrntF;W2M00UB&7F?t)x6E>^NAOQ4HHx`!D~?Pw%0!6uON4m2GJDi;?sQJ1x;mGklf6+(f(TN z`z~a|huOnYHrV!0977b5iexWj8S7sM zO-=p+p_5v)+4rGcDnW@hb26ahSo~Z7sp3*zk|!LHdkL)l1uD;*nP&{ANctcr%m+g) zz|G{J@TTTp)9vDH5#8!pp0N+fA0lGqer;wg@<|@Xix`LGi+GjvuxAC}B{xWf3fRsQ zd=S*e+t5Y>*e(N9JLD^yK&6Dgcm^t7jNW>(FMlgcGM)pFhgZjGopvx#ZNGX{*eK@9 zwiR1F^T|h;43BTC$G81p$6s5_W@QAl(9hU*kBZyTLRrC-Tk~|_j6$C>wy^%59c6Mr z;lXM5)8^j$@7P>LO|fhS!-{;dDth}tRl_m90gEANa9Zu!6tgzT{%8o{59-7dP|o^L zJkhb*DfJ)NfA2DbSw|nTVWE4|<1~7>!nh=b2EIBAN`*ez5Bpn)kNnGD!#B7=_nZL!RHhrZgU78Y%L zsvm>wp9${U?`dllU$^z+ZSnh7qe2ihkD2eYN!Y&5F5VdBF~+)fEFhc714{3i+apST z*{a7;k}ezi)mfe@-5q<%8?JA#_&Oj z21oTV$Ors{Ls7yU1sd!?r4Cf)K!bhhctaeh%7LmKD0FT*p5MXM$s`O*qjd2vQG#B~ z(3hhBhQcMz!J9RA0+Jf~GT`C~OMe^5qxv(W5!+AbSqFNKP>{GfyNGyAag?}=qkiD| z@TfQ4}gw@d>Yqruzot0L@?N08=DA@(c86bFITMPwKZI0%?)A{uQ(<@$!8 zwaAYuV(OtY%c*KC1TRP|PqWb#|YZDIicN^OFc+EYG zv&RY9??9h9&}4_LQyeIObgE&wHq5`MoFpJ$qPia?^DnAbIZ(9&ahr?^t#KgIs&Lg# zezgvcdjMQubyS}K2vf;`>Hz^I?Rp1V%9`s%{HQ(=_+G$62$-q>5bU!3^e_Y_C$V%F ztcpo)M)l7i3H-x;F)uk-xRD+(!}u4~s~u>J1JyWCtqrjyp5F`J?~CfS4)5w5h->*O zzZx62Z7#hKl!RY2athpXplSyi<3KeIRO>)AL2L(Q0FW6~Ull{6s-S63(dj*p@dO%u zayq=iiOD$#m4*hFfAO7BohF!nQGF>OMd~sK8f=Gdd%OiuR9|bqNA=enXov$n3Wzzx z=ROH2sz2ep{{~Qe?lbr`rE#PBdcdmO`nwbqfBaeC(8%`tV_mVRo}L27_Ax`Bf{?Da z(D-;NN+;WpF*g7x%F(+kI+CJ;j2fM2(;VnYKq~Y%4%Fg6k2uhy4)lZrJ>x*nI?!_t z^nwF5JJ4(g3OZ28fhv4yJsSpyf0VPIK;vNntVJ9cCdx1x{CA}^s&hXJ|DtkCNkLP_ zrkSvMBm__)#zqj-z?T80w0_(ijx-ou4 z-_{=08P30SSg8|+^N#j;Ma*cMn6LYPL9g-QpFye9YwW?>|EGJ61x~MlDUB5qRj+Yv zIJ?)V!1mH`=RfZ){xkgq`zCB!hYg3D{9S7@7#&7)*f~}1-p)uIKy81pW5}ecK@$k z|6jXK`vw2dwq#NLKX2EchfZSJ(OMvOy%vYT{vWaHunGsRgk4`GcD?g~GrP7AT_kpW zk=XU3^wDNDzmjFmVXkqi*>8s@udZ=p|FH5Z)BY#*+aDz7(q7>TamM~1at*Ki9*aKS zDSVNhV6qkS{4LkW=I8XJ>0FK{FmsqEQ=gn)!qNd<&BPvD2!bOCIwRm5_`1M0dW&a1 znyU^kb-ZDZ*KmH{p8msJmlvsN!xDc+>TsLUu7#dJ$#B5@9$||gi|!!NpRXPTd~AEP z2uY%THBaqV)6@)bMT4B75XfIFk6;NA9tQbX4xQs*DIlQ4IUeg*ro9X}RywK=W(pJ( z=pDt*E%~rM!24( z*en7rVjd08=*;v0%9_dHR?{jD!J-IpMp80%dS4L1iSXN0kPN2&v%{#U|A;DuBQ!#l z>$UKY0GGF6URd_miaS!m0jwzlSaVSgbRGwo2AFfp099_*9%=^hraoBkfr83K#0TUC zlg%$fO5|N%qh-dubeom9iC_U_97*7vZ^!%+|~qQKJ=#AKYk%Jy~8 z)bXTB%O;n!9Sk@^xg z7I79JQ!7K*3F)KkWyqK5xsHT0pMYCaAW|jfOfgSw4_w?8gBs4HX)13U`V$(e`}^su zi__EkO{-+R#P$eQjHVZgK3zgJ9-vLMdb_DGCh7H95PO#eS^6Sn7>j@Z?ajrF#Fm`g2KxDtj?CYaLGO3Q&c(X^6f4_E%x z#AJ|7=UsyoI%nL`YoB7yzBO26o&Y}AqO3aHMT5MfbRxOAtO$Kyar9CTUs2dp({v%&T;Rbk z_=->uW(mC*KIY?Dl6YfbuB&nl5|)A3lKZA&8~Vb8v9@a$V*1>Zu}obBXAHY1P!>8R zVeEH|@gA;oo1TMa?Lm)j%5*p`(&@II)~OE%n{u>pJ4nf%_fF4-bMrzv5&QvtpPS`s z3-{S6Su&{zG?EUiS{7Y^1#{H9_>3yt7Iy$^kUvG%+MJpA1$jlNL9r2|61m<>rH0D- z=8XB%yhCMr{{Fe9PF7h{aBq&VBY=hbg=^py?(ceUMscHkM`9bYCtMXjFlyM8J;~*u*YwXK7n}TQ)-%A0ST{bJP!xu zr(cC5-wnkSDp0^?Diz`S>IApT&PHu|!g4X33Ge&xTk-V7IHXXUpWa?d*8;a@mT$bC zZnyTQ^_vdK0c`!95^dBfZPX@a>5N~vUa0)7Ko5e>B|$YL=nT|_8z|WhAPBx?@`LZY zapeZ&y&F9Tj;Cjg&;!E)dMMAP-0Xx*HXSh9{rx^~^@ex;{B#PJ7Z zui0kPS)}T6QgsR&34@E|AkgBBSL_{|HiHImK%QpMD!&2MZ~ZGhWXhZjOU$5aEIjVj z#hVU1Mt+UImi%CeWS3U9nA*$XX{;RoC19J}a>u}<6gQM4G@@{PP# zO~$)s3(Lny1%l;4OTlMV_ub?tDxa0;j0#4l$N%CW=8Nb+RY56NdxwD93MwNu>On;Y z8$acW3hbKE)JP!U^Gv&A`mN!;jS~^ugAEoF%*UkQW5!2KYfeJD@tT6av@r6EkMMU# zBz2Z?Ok22LTe!)+x$8amCl`2l-rLhlVq>|d=}E@>Dc5N_zLg#iLm}^fG%7*RM_06o z!3tvL3St2YdeniOWt=8w8K=qVX`7yN;=N!)`s#c!G(Gm8W%9x?x&p1%|hCohw%&ZJQj)nX0v<)xDJ-Tqo{CyLb|yh zL+HLBUEU`>=+0qzGB0Y(C6nv{K{o|Gfx%et0=rRGms%kPk4E(&E}x%hn$^xW-QLQ+ zY{owB&WN%vo0F?y^}2^|LCwf%%k-l{Ko0FTf%J1Hv)1olZ4aO>W(z&>e z7tb1>8wbi?FJGVcvKG3O@4T^s7G4fvqMI#*ihH4ovakISm<8aj>K0E~jBcwhSVt0=27`yKZQ5YG868fxM@*NMGZp;XA@&Fb(qZ z^SR1CsiywoYp--F9kms$fcT+9chpv-Tj3nFJ;5x!*8Iz~B#%luo6?^bAp*MT|8u!6M zf2)I=zNK@*{25U+}~dKa0R01}rvYwn`_kh~{6m(S3}F+MIXso0e#; zIgl=LfdJ^2Zefw=xYJVnYmP}I6P2OyayqrK;5KA!%$%$w8mUO{tVn=ETYhvbIB*8bvAxGu7lyU{SCd9<_`SF+2)PHa}xmke}ov8{cSU!zX(ye#w5qQvjcc z87E?~^OJ!{T)44vgNA^)ahfo%>&lbA!jf!E(Stu}z-^zc5@)m*T47!al3< zg}zitBF;h-w@Y6{ox$8e*&EoB30zuU()Na@&Z=NXgAu}6)FKm~k&?jxeF{x{NtQ(#V5STm2TG2TqRPi0f( ztGr}XM=7HQykaD^gueP)#;VNIK8rM6ju7Qkb(T)*1200`}*7BuWbEf+gsYq=TRtj@#x&!saE}YIORED zxl2Btc-xc|ZLwGIjuUP7Rc?!8`}I1dAv7rO+C$W5uD}p=6}1CLGzxhxjc3skKYb?G z#WQFfo^7#h@ohSH81DGEp|5Fj11jdKPQw8wR7CAP#JtwYXt31!?)$6ZAKY+cU1t9} zGMY=e6x~Sld+dJRC|}^(-&SAS8qDQcl_p_y#YH{SFN3XeBEiQk4{_SMqUzaz&> zO40_>W1t?O-ixUaR=|MzzW#fu1CN=M#@BW9X~9p9BrAQpe>HYiBceCntA-Ff&N=f{ zm2tvhIhq6Z1hlovHc4&Xs^pEJXj@DzS)EH0dY=pX4UTKC2hd*GE%nR^Tk3cJxTP-o zf-SZCcXmtlYRPV@z&Sk{sFyU5-6XcY*p1oncO0Mo0Q*OJw$JnbuzfE6546wM6y^VJ z`|Nw%X`kr7XrCh0KA7IBfc5gH)qWbmK71yVB zZj140&rfB`e-^94Z-V{FE5YL)^Doo~Y)vt5$j6~Rb8LY*t`JIoFK4;81*!Pk&fpTj zwjiy^wt;3d%@>Z%tqYt5LE8#*7$~zmkH+`uOT`QzYAhb4-eU^=oNcG~v?oZi)Yi}T zjx~^9oK+HwqbAKaf*ukg2MY(7E!@y;2CMPAu3cihges)gWxn`<@5Q`{6EkaY@9&;5 zY|jgRhe6Z|ZlyHsE(6&9EnKqVp%Z-d4{ky)TZ}ub@hH0UK%0fSvVL{Qz@>$;BiMx#|CKmCKK&2DWtxpX6FFJ`l_Th%Wzc;DolCSf=YB9S6SN20 zC#?VSsGtemf;LD{FBSAX1ko+MvkjzNX5}}Nnsl+hmzcd(%+tDMGFyWBs36?Eo>laZ zB*?3R-su)}tpw$%AbuYxQ`S%hjqZyRai|MFPa}L9=D!nsYP5zeb$11qRSG*AzG02- zr{d|7g^fPL8lA7ule5scuL*C)tLBjTZC6#RFCrNY@Rn2?rTq`|!^ODg#g!b7*yv9- z9I|CDsgrr4kj=)N!8U5o z!kiNjEwcOL`^R|1GehW0k;)j%Ni{bo^XkMTeqK(eZu3D>_+E8MHBDsR5~6Dz;Bbt!MwEwV1ng>nwYEg0x2tV=z3 z_^eBN;ZbT`+8d8DBi6M(7uQJOW@sGBEata|hG-AZLeY@X!NFxkwwA61=MbSNFK}0I z>QZR)2Iwb`apnak1gEYBVv$1l@&coSQ`ZAAPa#V40v83Rz753v3Q?997!;hE0OEFJ zYF*k#KadwVEjaZvU`8WKIMt9Bya+G6=hYhR)>pZQQgcF_(*RXNc#iWaP$&dv6YI5! zJ)stSnhsA@(i(*M<6o9zM>ErVwXXNyA%5>L~)3vXz`O9X<|7Ug#Km?83Jg~$*&QXw)#o~sZUB2PPx$b-N*MB)RIxcW@Bv~`)=cr}}Q z>89R>Nz!hF?NXFx2wSTV8N&Xk5E;T|D@2B{>BzJ@_v#VFA?y;o7;%yoQH>qu1V5ar zA=Y@>aNeX*gfY)BD|GVCyO34wNuRmbT2~%(V->?1e*}XopLPFH4vwwyhw&(}#&e;o zloi3r^50OPYkj`pveRuDIg=C~Oc}3ep@$F{Y^;aG^(XRJ%J?L3U$C(jh$A2y>5BD3 zslctl#%iFF3ROZ>O|WqoQ2h2HVwDm#JlHrGsCJ;N@dt^yAlQg={NcX{<^VARgN;SN z{5LRq${Xk#Y|O{&*I9VGo7as~>%;86l0P{BTXa}Pf3}r}flr=}+f0^1gw=dIbXNLb z&H5v+M}Zo{K;Thy=ieGFPm_Cpa9OTh>y5al1S+Mvl4*z?T;{fe7E4f$3c9&l&@Uw@ zR|Q?tEog=Wc~lTDDa>RzQG$A@paKN3*Sj+XlKhtEAySnt`XY(hTgBXkmrT%E64XZp zz1l6vBSBsj^jx=~B)Ddc&Qn42x&^(#ppktmVe_;(QxQZD0cZa2#Jm#v;uqN$R|rcQ zzGIE-r{Y~LS=i_jYh=Dc56wd3o@2a;e{HlU?_jf~zvtMk|6R#uQ)c}pn20;Ytb1ly z`7^D;0l{S_+pRH3$aJf6zKw{%Wd(|=r>v1V3eBN~gZ_y%GFPFwG?7MY;d>xO)<};E z+Dl2dGt$Df3>s}W&_)C~#CSkV@8GhNY+`x&FL2OIlYaM zUItCSKU3;JB|_$Z_$e(+zGmJr$KgtL;>ut<9D40a?#jGFv0cf{nRi%iT#M?wOHZFn!0W&r z2wz8EFEeY&a|ub&XAqJ?P9h}P_aP)19mN@krBcMFfGBKqc9N%}WoQ}F(_h?4P@LqM zNlX&@U@(i5pOQncl{A~OVoIZd0Z4H&u0o2;Ve^DP4;ChWf%>kL0>2ANR|;W6NOLOr zH6nz9uMiUY1`-mQHA2F&UW6nIA6inSIGvEBC?F&$dJ~cqM{rG!D(VwJD5`@9s!;MB zA~q(kLxp;b4^br#Y>gMAx!%zn(vRU`@2HCo6~DjOJv<08P~jL9IpMD-^kB%849$OXs6;FsaE)#3mqViN4n@jxFF) ze1Zb{qCycfx4}TNk=_q{on2_*K%TR{DMTkYDBN)9W&Uf3^elNFM}ToC%oc z1b7i}UM66g6Of01{=t>Es)iD85<`F-d|i-HrolB&HJk;PtHj;F?~B%vuXvVHK=I@m zh;-AgKviv_dx@YDI!-ItLiZX$)wF*lsG9cI1Xa^6Ca9YB1%g>Z_X0%dp9Hw?QyAcMGHw z%0PN<2z;?y;P31}`fdp1p|wo5h8-yK218ReeTE`&7)V?pa!)e9W0Q&d%}|i>5lFQK zt|pV$aOQPTiCbj`eV&b`u$_}Z^V{*PD+O(ZEoi(+OMkZn*J2UC9iOh1Kg4YMihBIK zbQ^xOsxF`hyKu8DgwXZUj|4~4TBsKHvd&2H{ujuirx9`N4UPR;aGTpv2&d}5aiwB4 z&Nxt5jgO63VhpZrrWM68df z#-bAuuK`DjkS+R&vk_)iAT01B?cok2)(^qu$9GGx`aKNj^?<|;z;Q&pN_V8Mo-A{3 zDtT0Aa**T-TsQ**l={HS##|?Kj&_;b#gC6xnu3lc0~)&BwE$$T~R7~LqC0YA6p*Z%$CPu zP{Lc=Z!7z_0GAHNvlOwU*OKU?5SShhKtNr|uR8g^2-drjr)Az@-d)K)nRj%Ku4EVdRhvHa z39jUB=N+|v3oj1;%2Ti`!;-fm0~t?>1KiQ!go|t3u{HBfdOBXsypx`e*33KU=~$3? zCp{gHiyPhXh)hCuSV~+dvdTQTkO{1o*dTnW1S1Q`;B%0{I{_xw;s?$CD4Jbye-0tx zdx(&5U@9Tu%@jhywMm489}@@(C$0uWcff^K|9~*V0mlh5C%~^0W?q0Jgqa&)exFLV z^Z@nke&AR|6hg{3F{VU^_FBZJ`DH%0d2RgUeM4`PMd zmY;D;2Lf$;fOB%{nDq@_tX-9Nj`WlSzG+?KvqqQTRPD$TL_%Zm>#h7dK2IL3y@}t` z9GWwIZF;@X`%j2J8N_$|s>R`lbBdh=;QOX1DQyEo+-YY0xY268jldPn*iTVBkLJAT z@On_AdPDtiz4~TE(_!``TIgy-#wT^oCVYv&?0WG1Muo2@e4&CNELw=ZPt)O2DLpFoF4fA27QpXQLvLSSmJNBO-adc77piqz@yKNeV(|AE3w`EiA>XPK`nSjvwG ztjgzom?$3?1K4G^H$Nd|Ti3ZUPr$klXVn8U^aJ&Qsl!?0z>kNsu)yTu(#8H@xT_v- zHx8Ha;P~Op7Srn%n_C03NKAnuJGWa z7CKkK(o_QlR!t=mLQ$cLrkks+x$2~nCa@~|1;7|ZYoP@ItSgS_ z@1X4eCVV*zqBw)fAl^+`zg@}tElSp}SF&EKWPPlX^-GkjUrbrQNL2=3Yh9HiV*VmT zj&47$A}$T|!kkw_U$hL)uiuD1PR#*6qU0MFE}y-oa(~0icUCQ{XvFGenLD%UJN}j#}=L)!AEDqOORu?TyhZODN-U| z*+Wja>;g?K_kX`l!-*Z@xa5-#wSk@D8=9aj+!m@PV7CwwkLPtl;_=XD7cWXKq*bPT zA#fNeJ;NYzfqq3u+@ePS^_b60_t)Lrg>Ng`%(40OOVnjNpvnt*^l;p8Dcoyg6|S+_ zh|d+xodVZnDJq_leJefkzXsmD7egtY_$t6+c!)R2*pngk1eGp+pP*93>j)}MyoaDt z#1KKHhuj}(Plj-RyFD4g{UkCO(n>#5eZ<#%OcuXm*cPx=3;z`Orb9}ee+L-D+E$XS zg&vgCLwo?DoR587b)w!_p5?)*#r}FmP=lePK5*Zv$1y)*~>#h8z@;3J? z!I#8I)aJF}n%q}&f-kK{?~hwM+OY!)_NIJm$5UdXJANth+X_u|bUL-#d&6R_alXLHu8X^C57oszwgr*fp_&dUK~(YwL8SbNAhI`5f_UHc?ZWWv z`5dJnI3J=!@h-4l42$9?J{tDnS)q*$6{yn?3tx0DeC&EROhIsJiHkBA(bqu+sZfx? zNPCN_r$~9jLL3Hvjq?0lzmC7!;}yu~Y$cyz<$sDiKIXKS$gAAzt;$z+?>PihF^?c8!?B6(E{yLE8wYUsxa$LL;or1{+uW~W zv1gSzi_>QAxbdnH#o-if;UR5d%sANft~-7`P9~$LLo;)|sC#~#>HDAO=bQ(}L@!hd z9~+ST^5y&rdJlYV?JODGUN8lF-ybK1=t0n#$j2ynfO-N(z5@`b%dzfp3j0Anpy%5$;I}a`nQmnJ*21MbXi!s~ZvP2;U@z5r8aMLe0x!;Z+HM#1L3vx@N`Sc62VrTIyZ}Zh-8U?N!L!vi ztTCqC%w;}aiujR^obXmF|4}W(@q+P&SutphzRwfcm!t3MgXOp86(=Jx#UW@^=xrW& z5usP{#t#+02SX?h6P;U3Uj`n;iHE?g`Y})7GW}Suz}NL-y>Zn;DJGkmf5B`x#0VOt z$i^(-_x;Yng>X%)1X)025if}Ee+rQ8f-E9(Fpqy!Fy>NjSjwCzF$lUVKtH61;(%z{X@65a!5^NSAj7^y_D4;JEKg! zeDP@9t8rsF ze?(-4G*!?cB6}9}a(8J(CBnZ&m68v_15TG^R(q@(5Azj$QTbMT%n=?e0W{wV9qJ`q z7~wJR^-?beQ>|1<_j=8#`BaM|Ujk0mXllNBM*-EZIir4e6quJ6vWQyZR1udKnj?x> z#FI#C7g1!5C?==3p+Q8o47yNFoPG*w;mZND3{>D!fHM61z32maOD+5i6D<&(m|FrR z*s#|c_9w=!Y*jkZ02WydDeOMeLWhBm_wsRL%E$U%e#1^bn%d#HH?}Tb{5(DegkW^- zQ?Oega6NakkH(R~z)=05Cvbs&uvg#={b27vza5@C82^u0>;JzGqWr)Qkc~AeWi=eL z#vYZdcX&qdInx?-Bu$;waCnF3a$NN^2mf=o#afJ3 z@+sMXIc7DU6QxkL1e2*~s?b1mz*d>4hFM?@X^wzPAM~LKP4!13+CphndoZsi6FF$} zP#+jA{V2RFQH`TijiXeJqg0KfRE?uljY`VQ(gBXlRO%6rIfz1YE0IbI1`&A@3%o*e z3OtEON&e!Al6y{+{BIe0Gs%BRq>@;c&dI^cAx63|CRdwvI?6OwX-h75TT?yOlw9Lz zvlnkU&DHoq#pSup)j6g~DKqvDdR>3nGgJgmduT2MM_Y0wwixC%4*-zUd(N6+6$^jO*mq zc!n-w6Kk_7p(-td)*5mVX1d==cXs%|rZojqG&paJ5rfT-Mvr-kDF4raQ<`~+$GqDs z?ZarQeeU*}*XFZ%zD}HyhimiA8}WrEt$Aoa;8c%#V}UunkVW(%PO*G?p?QfY|Bo|8 z6j_%Pv#Z~Ubp`2`mGV2f4SCMC?i4!SSIMuz zcdCv2f90$EThTJUO1|<{BL;-hYEagQ+p3egN5vlCJ`9wWj9S~>f;LP(VPt*!u!M}6rr~fhH1qc;bzjO z%n1ymiwVcl6F7%1<|%YBz3F6M^vM#Yq6A4dsp--jR}jA*`Ry&gUis}SzxnbzfCLs) ze$?eM@Bt_5eguJ| zp_xefuatVo2=Vl1;Ib&&#}$LzXw8wMfy_e%WdB_#(&NOQ=Va!^lT5Yi(VN<-Bf<|h9O zCH_;R_!dO@e~lt7Y}%G~H;TOIVAdcoiG60Z+kzu=FP*f$c*|+N98OntZu8}7C+(9g z7fO5RXAn5)GgtL+(i;DflXfez%d;Bkq_Kd$s(^k@0oJwMoU|c`(;xSdi<4G;OvO%R z#m+O<9OtABdIeWa!$Kr?eB?L>+N?`pZoY68?_c!Asu%h~)zcoj3SImEq>9NRB;y-9*O*Xc@L57?PcY*HpT zbUKpSUB`Em=OKnY-)g6yDd{m)g7ni*kUsnssA+VBickW$Cw(6=gAo{IBZEDFo$!Oe zfWTG>m#NI;((G`%i`a`33eihc`VRp+>20s~MG05wmt=?A=`WT175}QT^S6i0Crh~E zUqN=bP2UdYKSD9^?c?(g{jImdzl)N;M+BRH>Gu2lW29&8UCB=X_T+!~+t}A>hkp}b zCfug)hD`W%-NNnqU5D@S+Ai~WfSL5R{G6K!Kc`!`o&SE)r(Ev6-RQH!f0_xO(=FW2 ze`AM3|K9*+%D3qomPudPEj_nHp#7I+(!Y43^g}c0E4rn(%Wuu3U)n9bP5-P+xZW+? zrthju_!Zs4?fieY-{H^G05kQox)g# zLJ3#${%m%*O%J=p=qM%cjoIOL{+CL)E$`XkcK#^;zHdfe`gD^Q zJN=_@{cL%d2QWjQ9bQU%qFml{0cOJO{J)$DKfPPH&7Tb!d3z&U-qQU2dWOETZuHsh zyFQct^=|3y@^2*lioWZ+(QnJoHJR|56NP_9d!y2Sd?I_3%!Kdi7H;R?J40V?H~MV; z9mdDkZT=nrcpU$FWzy$#OKa$Yg4x*Na~Tu>f++BAhNyIBU6gWxry$@T!msfe&OttK5<^F{01&v z+Hw=}k`b`VG3kXy|63{N_e}XBj2qU#AE$Xx&G!~n8NC~Nt^ou`5p*RN(IBfBhd_Dy z6TH_n?P*3gVt(266`W`c`5xuVBfb_sX8X7YDej*ZbHxjN@h5!E$SCe_jQc&?BXKP8 z0X17tfwzmF zpvJ`gg9SAhsHK9cj{AoQY6wuv1XUIHR|u*Cs5U|Q+dQxYqO4W%#ge zt#1slF~OF`>T6@8OM$Ba?rp*OV)b?Lk^BU2t#2Z*I|W-3tDg`bSt8h4VBZ&Pajd>R zHo7?e2(BO}$BSb16Jw)`kg^VO_6V*pR)1S;bRpvGm-m8L{p8r_0>qhsIG+hFKUO~_ zHaZ`14#>MVRv(Cs_Trtp$RH)L`o`F358ipyB<_mUPkYJ(F^lyBin}l4Zy>+=IKCVl zL8e|}u%9mm#ltK2F5`6wUMW=t>UA()DN%*$wG6M6rXuxPidRZfv3m94l~PoqUQ6&w z3G%7e;@CuANvxWfQiUl3#uuw*5^iHc>4m_Q#;Td;V1+3FrYu&?LWd|!J}`r0)ugII zVZ6W$iB*$q?rw~uLcmnSs#z~TF&-Zf^)be%QZa_b*5IXDz4&8f$Qbof67c!s{d(Zo|S$trRekFR#ZY;#F#Xn+mMk{z3dT zRrATjyn+}ts@_vnj0wPuQS}Z0gSTo`=SIAlU-q(HC;F;Xt*5CNepTb3dK(t=S|Mda zp74c$i;v8YkMzbzdg8g3-TXn?0PL5K`Tg;_wz$78=C6v^t&aO^WB%%R-P*XnCgvX# zuX`=-9|PTpy%w)qANN;NAzqEw{XOolf*#;Txw=@~?}zYXF{$otSg^Ri9=xdAN$Uku z=AQ_Ot9w8055)bqF(485Pl@{{6Wl{deEq7oyQxsJ8mFwp!F$QA8s#36KRu4QM5i7lW^RSw(z<0Lnh! z@0q!~n-Kij-}C%G|0f^Vd+*GdGiT16IdkUBTe~i3z8?Xi5QCyBkuA%W@mdFL`CJ-jt4r-ZUOq+|aNAZCNStVh4NF*Px0U#eA0!<7B023V-6dftK zlOj=tK~a(tHV9$Vm`KYgp{NL9RICUi3ZZB)!bH;rMNdlZLlM>l06bnH9H|_JMDjt3 zM&M()!Vpw?Ehwr{axO)(HkF#HQNqd)#t)=p6gWQxI#DG;*xL+Shi}nlK~aj5>o|mU zA`*`+gdrspkU&0O$45Cn+8INPlL7WMKI|XmP z$9ja_fG}!Lgb|5gya{1G%5_i_qU1jvA08Fp8R#N;3>PhxU)OqHa0*k6ro5LqCR`8u*d zC(A_4Ac;|#P4WA6R)Y{TSYnEFnj)Ph7cs*mW~h!CtkVod%!rOAXdu-7w%C?+9qT$E z{5XPCz)J-j&7K9{F7h=3kz;NP=-1f2oEpL(F7}Dc{m8@T|jZ zgie*vDH?t(;2ARxF*ixf4H}-cmXFZs$TNcX3EMt~B76-YGZ4}WDt30fzHNO6Q~MBF z3FVrDDuB&|FZLbe7(1L?KosD8Si6rU%-gmK`jWNt27dDqSp;3miY)V2wXX&WjBQZM ztc@+JQR$0CAPABP;9&q847os8x1~k(g*YQrNF0p7vMrI0Hvu+OuxI0~6rmG<_jNGa z&BqTmF0N)iAazR%I*G;9y7(HjWhIKVn3;phR-`BCxm#M%`BI&r^KBJDWKqTfCCa#E zwLHfOwK%B~*|Z=$Ur>>YEUpj9sUujWAb)X_%6+g@#NtwX0mDI8QrA&mM~YpXEJ=H*)Kdu3}Xb zAVUYx6c>m-I-o!T@DcubUs81ks5F)xhy1MHz$|Kt0Wi&ct*LhM0k8=-IGSs#YsbQ~ zewC)vntTx0WnT0BbIoBL>{-_Y-iQowb7_kaoCjR8A=$2aApz)u zjS?^;cpWpmz-w29k|3=FLJuYdK1u`f6fmnwz0(93A^@!eyvmpcn|6qzMybEem;ib8k-hnrX;k4u%gT>#0d@AAf1ptPQfPr}z82;Y^4 z-Ko|v>$p46huoEB?PucQd>p9gQ+-!@Ja8G)e}1*qMGVvGkp4g*8)3z99kzlTjXkIJ z1JWF*SpO=+uow}G;jK*T%;**Pgv^cUa&E<&I-{Ud`ZKm)oSFRT2pqIAISj8w^e2D- z?{QW~96O+m2Ui-)+Q16gJZWw}K<1(UFED~7=!C%N^5V^CPbue(@KU}(;Sr<4*{2)J zd_Oam74>WG%=AXB)iob^FcQO*ECz)}kei3it~o-@9sNdnGI9Gz+>E4q_nWP0B{*^8 z&gURO6L8ETviDgy0AwK2vFU7P)2YJ6djso=*T#+q5@SC1ht;O@OvdIk96?%On2%A2 zSk*Affv7xOG$1?zW`qx9<&GjrZB|Ro`$Ez_l2ozGST_B1Xy3r7w3Fjd6wRIefUWtX zOz$@}A2A>t9K>T>M)J0DD2;hMpQd@o5#~xC;LLTqYA^rRYH8k)t^1zKzq4AP$eVXS ztyd$g_WU?I+{+ILfpf1Tr!g?Hj|aaefXoRjFBT%UmJN@4?3;Yntx$s9?@tWh%EPFN z?i_)VO@Znxz-pz?Cn%|A6Y)VIMZd=BLS)smWWsd+gwSsL8jlfr9lASqpRug!XDH^l zere60WP0D6hV#q5oral_Efr6)D6MJE@1)CwypD|bMP1GB2U4Xh=E^i(oOMko4$9(i z|9hhTS@@Od=DN<>Ll)k-3JF+JsAJU^qiV|(y`fJT2S=*~xBUbxp6*$Gwpf`yK-uLA zqe2YXiD=8^>fi@#r;J{Rc?KfldO<|BR{Lgv4Uy_hKIAPs@s^W#%T2uHCEoHAZ~nwv zLE^0_@ir*&HZ<`zIPo?j@it7qrQ9FF{W-;P-aEqnb17l5kz%xN&-PL#@$L*?kYk}} zBjJn*Um-W7pNUudk^(F)&$O_+HFg2E{6xIwYX9&C;<$aay@W||KnYBp*AZ(kWf^dG z2!4eNrb`$1!z@RT^uGt%n? z`nI(2#ktly(DtO|AtphkF2r;A62i}%l8V{dNkA0mRt-2!aHlKWGY2Q|nh_uI{+px# z@3{m=Y0e?u2BBjv*T!K%9P%js49YwD!5Eg5wGc5AHDwZ(e=O-scv_z~f0B{jz$yw~ zm}^Fan$C@g0E%`z!xK?bVlhk$@IsM5&+1mvr4TPV0O)6&Wlu;!OYQQSN zjgks%aRRToT1vW!q@bh|2@X=m6YmnCLrPj_FCi7GQoG7nR0<((*2ORXA|`?P$D%gk zsVkKdnyl1saCiba`5B&4sl;NK3ji-933T^LZDA4=^<_MVFCqNQ>!ngP=0v3~(t!5~ zZWL8u&raa&QK>f*9Hd-NybVH!6jhmhb_3Cq75z}!h{-ShMNC5Sue+J(?w_L$d=w^Y ztLY;gZa_{X%uc-JB;IlpZ+VHg{KT6pJ*g7qW}ixu%lg#naNAh2-KmXvx_vAAS#8Xd zBK_x-hMFR#OREulAEi}HYwpZg0p;ikkL#Noo|Mb;#oxe9IobZgcW|N>^rE@5pm}G8 z`LUNKcw-Y3=vRL;9%?e~Zyts{X1VC^ta`F7Ji1`G&#%s2hTi7honRMYO`M$ONIIC= zn4V*HF$8El8E7pBQNaNjIw+V3lEd`~^>!j?xC=GZ4GPiKW0|ZNr-EqV zQnN)1q3;WBqb;zMEgb?D9(QzZ_<~&frf;n`3nS*|1m}?X5ZjIV4py_!6y#|W_Dx?`&q50ha{dbi)KMp-Mh(D6xU#^$?OUw74t_-h zx9LN_{T%MDwLT#cWl!-r@**L_x=%cgOSkdqMYa=SE-=`&Pv}KkM;r zB)%mpxiCt>t8eZpmhS{(n=rn1n(@;^s!v00Nl;R%hq*yXsh;EpC8hdr&`wspNcA5% zwtoH;a3EQchl2vgpf%)HEe{=b98%zhv@m2Pep1HMZruHht51cV&X8MDLoQ&*h4|?u zJug;pj=_&5suMCLI>02=Xn?U2t)F3PTQ#C3CKQ-WhEfL+w)lz*ZARXgszORx(g~j@ z)CN_?N~(<40xu|4u}PAS14|36`Bc!czo`hp8Mw4j_^duIQ+h*vR5S{2Rn`k(_Z3)m z*!_en^BYSiS7ci~n4G6L)j+`z#-i4N`y>EJ$x4(^la;5Lu~=>+B92%P+sJ%Gtinx2W+ zido6m+mo-q3SS10s^_JB-^UCUBo{I8h>_u>Xd%{;?L4F#JeX7JUaaVnZt$7v2 z)s;THe~Ybb6(?6$X5f8)ct%DAE&=F+cPz&5gTs$2`{I3Xct+pA;yT=^*S_Zqo?eaP ziLNhvi;M)L2f;Zp1?^-qy4G^r_w-n>PV+b3sazPwvM!8UGEXG;tJEdH!^#tDrTp-7 zr&dZClrrTF{cMq1xrD|w2sy|gh<8nM5cCHkXeq_u300O8eeY-D3Mndl%eg_zE9If) z(}%%9W0{((wx5zY=n?VSGXI%I@HaqZKk^EekHaHyGb!ZSCKzb!;p3OfUb|DF%`klQ z-(0;nUW=2haW@-M8Ox^lZ!wmY`=>MRR%2P2|2G&*`){+}tHsn+)+S^yBCC}GLtbfZq4Ox*+u!2V@{#BEUl10Nn z=q%Sbf(CX;DA|BkD}qe8JY9j56iv<5OIIh#r%M;n&Z;_1SLnBpN2x<2$m@&Az#-jA zO4M&?2DYV?7EOgE^^vfFECwXVSaz?l$l8Z_qS`PmelmK^IpW;q&8I`HmBYnlJoZ1NM#9sR(w z5yJ!i5m1!izOgJs+QZpHpjO8DOGl)k$qX}=d2!jG*^(ZveAU`pz4zEV4l|>JM`RiE zpO7?VL$GP3N6Z2plXg%H7ZXA8Rvd@+IpkoJJoOJmW#WGs+<`ZO^iuGfbsHUgwy2Xb z?>p61{$XjYWw|$kQ7hme!uOf!MsPG57}0`7|e^^;wt8eMP}q;4Ff&Lyu<>GE*EeMs%Ep z*~{HykOPvU@mxKvlzxdAYcq#Mg|2SsH#h6K$JGB6Bj%8X?>6bEml zc0hQnw`8wjMiA@m2#*+Ut+Dp)X+s+v=50fB7Ts@l_Qg3&aJt9ifoy1%vf4>rIlVXh zbMNqSG{fL4XdC3)C*Y@?^Y^m6=mQeXu5=6?yL^Ew&902V&&;kqf#azzf=xjBJ0R^x zqH295^wM!UJMI737**WYQ96@Rib!(YI7NEESumB zPgcQqcMDDnPfio)?!oEd$?3fW`@)lby#!~3Cuj5$+$TJ_PtV}+guYUc(76;M6haCE z34&CNLq%ct86-OH5A8zJLVMz|Jj?n)W0e^Tu7I)uICL-cptS}w?`S#WaCI{5Xz$)= z=0 zP}WbQng1X=8dAK0)H3s$?VMa;yT($E>h}wb2U?6}>sVxDjbfHZp_!Gbf;um5(z=K- z1j00sX30L*?hR=)F{yeU7b~8omnrv-QS({C{DqGT^vMxu~ z*52q_pxk`LUyXb*l-P>Wg3!m(J29oRG1QWwQ zC9E2D4XShGr{0UFS-JlBCMbqb2jWDRgv(cW%$Ip#X}YnHhozBD91*uR{^c`5@|rzu z*nnIO*5N#VUL9;Sj_ZpatE_K&^Y+ZFHI%B&_}|_?0IBJ?pBJ9GWDV9`;_TCSSutd( zG-1m5&Zk7Rl!Bt@`=?7UQ5x%mqgv9ownygj&Sd^Y<_cwabN(T=mk*|wbl6oxyv?0C z?1D41B2FdwiMg0?h&Cy;cXU>#OeBWJV#l?!jPWv$>e|;&>CWl~-C3avWbI4>Db7ml zfijjAbFB%~B5LTOwC0cVnm@?N`iezfNkhrmhpfMLD&*;`L0Mb|pKZ&f<&f1p z3w8;8rRosT>Hb_wfP;?5Y%Qhi+`x_=y?O=mL5I#0)58xINz)y~rdtSs(r8(wMhM+u zQc>&%BDN&a6UMU4>b>cA_O)}v)D&uxODl>AkTsh7FnkX~PFhjihmn~yMwb8Q>8kmK z&&zdNUC$=R){Z7OHA#~ZdJ-LNLUHj*ONeKw(OB-k2@>i5m3?8Z(OBgtOLLW!fh##I zc@s!Nk@Ad2Xd{Xo4Ree;!Jp`_icsH|5}6E@p5&aV5gf$;G*7D80kxREG=irg=m{R{ zE~B3Glw;jbrJN!gv{c$IQO$rdj7j#MhB^(=uO1G|?}Nke4!X)fl*A*JrD6 zG=&TOQqw^mWokDBfK2H{=JkC$FwAM6F zWOP1g^87~d_#>kW_+=}6<(XST8`&apb}92h-G(p4ej#dOtf!6617m1GdkbyiPHiuLIWwzOjE$p~|cqh0>cm%`3sU3iq$>9m?pUMlH85167 zU||yd4~Vh$MF&WxT;sB{Teh4)hVLE4Dwj$}rftBIiTN4ki~ObWzKl&x$b$qnggsCf8 z*{WOo5mGxD$proBmHY5Ufj~fVvlnkfPz|%WS-auat3g03lNQ?06KRe3Oo?~4)p zHyOvqg(JWqc;!~J@nWfWnuYH0y!6`9X^6hj8japSOtJ8#-_}k@M_74u7?>b-(PTqi zfqM7O+v_xf+XywS3#3rAxOQxVsk-j`!ni)MCMJHRJ zyp+oe6d;b53JpuxJFtK*iqi3-cM-j!1Hq$^vTZvr{z1;d_-81uao=c+$Y) zwGqt2La+SAQq*y|zmn-b!n^YbIzlZ^zous;A%LyAVdm(}kRXVRoaxB~bmBNu@SPBo zOWCasgo5wZA?Bg#DNWAPXvuE*PfY574LYkS%u4BiW092|qC`@4c5y59ax`0b3NzAI zP((4g$!T*?bpndPq8*K=9cB_NHNNA*nr4CDp21qMB@LklpP;&h$AQukVK<*<8n082 zkVHY|;X_)8Eie{(quD3JT$V2=1H3U6|D3A;%WC0APdj=_iXFWL_2_U(C@Q0p3A||A zpvfK?g+ZyTNv_B!hGebqgw?8l^Hthy>`6+Eg=d4|iJUfSVkx*3Lke6j&yOvO-j1A5 z|M!w2Bj{nhYSBPv@`gX%)A3NMae1l|#kAQ!rg7=2Q)O2wHF^)yBy7t037c}h(1uK$ zhgmEP7D!zNi=}m7@C?)fXp)HjjL>#-@MuPiQxV57!d0u^kz9@H#1vGaNe~m&1#AHb z7zd`5M>m}$eNAboiHxvD7htRo#fRpYIBNZ2fVj+JyRXd0NtRH835CXu=|0Ng#iB) zE%qEoDY35yZJO+gGhJycOmgUCofKfS42J;&tB2m|_fACpYbvirxN1$VG=;K}1ef)o z+L<<79@1kpE(k3%7Mk3#?Y3RlI18)MD40?Xhvfs!K!zM9M~_DEde)zA4Z^*SQQo}|D3G+Bx zu@60JFayxueSG+)o54ECKrTmMxxB0sB_FK?$lz(WWd&FXs*&pA8lhRhPfj5(kFz1! z3==hXPcMnaB9U9nA5e7<>k_l-{GbR$6y4B*@NQLCF=@HfwyrtnJkXPn>`!pWk@IG1 z&l83cPBxFnk(9-+VmnsFj|_x3{)$jqx3u?Cn7e`ZS+BDPdAXbS@x-+%pXS1uGzdux zfEF%Pg`Q7%$~X-ZuU|7xtRlbF${>Pi`qg?z=sf{3SLJ$lU45-A4A$$3m*)Zx4;I(o zs9s-q^j@>`yFh06;&0HM-I*=c=~wE$+VI6Y<&*u~r{<2s;RHUm3C@M4G!>8OKJ(KY z5L}>+-+lsP&{{~)69(3X()OzV8nlWkrT=*TEQV!2c*6}~)?TcRxdq?hp$kp9LNG0y zyVRch{C}aOrWEm>ula7T2MXNV&ZN%;@IJEoxC^FPOWP!P2Q=`=f=y#Eb^Iz{>)zpO z5Wpj6{F|@)8S0VH)6sE`eD-aI4&iHoymk?wZ4E*nXdbz13!g2S8;sCp1bK8Pp>gIM za9n>OUVlQ&ZKv>cpuE08fK|kibMysx<>h80J=YQ78NSXqk*|N@Yw3rC{R3YgJ(;j! zzPA0E0CV|TH<+(?@^$Jrgq<$1XAt%meBJe10$jn@oDqD*`f+5jkFceD^$aB}JorFX zK>*m8DCl{7g;*k43t<=VwKRvYCSRYuiU5^-Z90yxw@9e4^?JV64J7O&zP8;!fN^|% zw2-go@wM6^UQFR2i=Pk{!)Ro23jxsha81Kmd_9VgasorH`J`5(4H=9s>H=@6f$4=t>Y%vb6qXbg;=JAYAjW2Mv0GX?D zEVPj866r=cq4Qv3dF4crL+DJMURt%20JyLEHMEm_|EoyPw}lC)Elre}a~t#0Q6h8a;W!=d*o}KO;^H6Y3u;2euc@z4R63DT z-OunEqV#$olj^}a40gY)XL0YS3;h%zh+m^Fk_K-5>E^iTve0LZ>JZ&zc*1t{OV<;*tbCkD&TV4=>9g(}w*L z^t^#UxuMY6L5z^6#v_;?jZE1by=rwa=*KHQDC=%)qIbTsq0zKfnmR1=VQx zCj>4S!k)_YNRjMc%>7uhvj>>5XEXFUp631xs@E1H^e_49gS+nV(nzhWD23;Tl%iA& zt2sc06$!1vH+6F)^fun8mEAr&|4Fd6;v!XFDq$ORa%`fs|IKnQkJX0!g9h}8{Q@zo zoLJXlu;o8E4VM{8PJtDO0|dL6NT?G0%E{;3FuYa&=z?iAD;TRZ=Nyn)v*HzeEA@Gu zd^h1+>Cl1jht;eg<if^TLd1-geicj&aRPU?uy$jz;|IWd; z{UD`>>ydu^O)nUD5ez0G9_TX9(Y9n|61vdAmSuao*1%6Vqg1lz^ zVH4!{auw2aG8Q-uajmZ49#j?f4XrA&+V$eh=T8CIvXXn)C88;@;^F{12(?^>?aWj0 zhW#|>60lfwl^!sZ`^ArO7!3~e6>xHJz;N=>(A1Anf8yrA2bwcC1Wr*RK`g~<1(^sA znr{A+5Dw=^HhIFMrBHJ#aJ*<)rTrip{g9$6tRg-e@~Ta#-FvX7A_=%*05$-CyL14Mtx&)lkxc&_(_fdyXq`hh z^z{;*F6dS2ZpZ@?&0SKxBA+PH8HYlCwnXToccD_k*JU0Gd51)2nfr5% z(5qmisKw%qVG+KhVr-xW{OWPhj;ivytHgxHH0Hg5@g}^MrFe)CKtWdHKJncd*F(!y zD=SE$I84<)q@7*7Qa&_5BOz)98jO+9w`@MLW;(HkQP>7{~bk|Go&bXF5 zOJUxAxS8*36E4JI*w$0{;;YXiDql=KMY04YzzEY zIy~LooeEJwPiM8UuiM}lAWPc!krj8_N3mnv(*pX^0t2vxkJW#auKtSb2AVX^JMd+= z{9wTUtn!beZaDz6K-*WU?{#W`To>6cDn=TO9jvFfY#Q8fw+m zU$7}~l6{m|A~*!y0mor}aIY1nvuID0H9HFhHq!|4y6gn3Rf(^|q)Js)8o_A@Q8EZ) zMb{h$i;euD3|1%^beOU~g#qq%2m!7`Or#VSlNeOAELBReT3j6GC>)O?MbaMH6G4Wh zfxGOph&Ag#&BuZ_^ZyLB zS7=uvncLpsFW~7L^L8UE=NQy@kNYKYUsw}e2E6i~_YMV*hxVpL8$1Fp$}4kFAIQZI zL9Pc6|3>wHPfPz7lm1U4KO*}M>iZ;W9iqb5^z8Q}>YozTv(J+#)<^i7p8Xx70<*%` z^z7#tJS}`p&;E_UmxizD*{?BpSooTr{TYK#3}2)AG2Y%Qt{St){ag6f7Ll&MPxIlV zKn>Z254flp{{4mX$&jLEa>Xom7?UD!q`{;T4qm5LFrf2;b$ zZt+rJb##w-*_NX@#b4%+@?Sw7<4PW}aWEFYCv3n4j`L|@-!nOLxCwFEBU4UoQo4<_+Su4>KaeC5FA z&OA(K;`2wcu7=B;PsnP6Q*WqR=98udbV#H7m*r@yapG|Mn@_oSqZIj{k<1@0O;&TI z=6^Qx_cH$xE0Lm%M-i0y&j6YE);cxW`u z%eS5Qz8o26OPv5yrU*i4bLD9YlYL(fP!zV5yfx=|Z~G!k(1$iwW~b(G^-8-Y4`7m3 zfk+|M{jGvJMLxkQU!jWV_bjie*^#D;rk)+Lis^NsrvaL=?_Yp zQl1}@{`>Op$q(NDnu)674%VFA)vWl^z;Sl%r+C4#=E3$K-e!Hn3x0KcJL(&6IgrV0 zyRMDl81C8CU3j}XuFj)S&2eSIzoqss6#;vxZD*od?Rv@-PmX$N`|O#S zCA(&gE^LMB$}joGxa6C3b#M>VY2h~(ro_+hgK}Kz^ZwT7y%X1C&FKeyq=^9Y@?HDG zzOD!;OYHNrtqY4H=Vz0$$oX(lf#%x=dF@HKekah+x+>ec&KH|It{tAy__h~H?LH(mxu&pfc+fuoNcfGh<7q0=8llCYefNB|g=m2JD%~Mz#==h! zC;h2pY0no$*H)skwN~3NG7saDrzF>s)s}iO7RHbcPRHZzOME38X7`WXW?$>`z6J$( zlhtA0ksaDyv9tKI5(RBbu7Unf6s$nuF}cJ0RBKkT{8m)NWm=uZC1m;5j_3y%^T4bN z(f%vkRz5e#(W@d5{N^) z&oA7EP{JZf86Jfj3S-zKcu7b4(KsDO&7FC-(rAoAygb&sX!ZH&vwbK>y0j@>4%NWs zJZ`<`{1_xC-pC!+)9N&514pQGNkOl+qC7k&IsMJ45!92fi588Tpm-h`#$JQGC1&Dp z)IigJ1)vsL6u1yTJ^1C;WSyF5fXa{+#+U2F9wt`ntu8}ixp+D01vna_Ksvx;PGw(4 zU^oMy9;3N{w!6uK!`s&E7uo1nu=}-Mq;NU~kY);w?w{QKo;+5DYn!m&bGJ#Y>;q}J z6@yEbmW}s#=JcyNrNk`7+Z`vUX^dk)g6LlNz!hx|K(*&$k4PI`a_`6;UWPq73;zzxMwnYTMZTBNhytegL_d^e9!$D? z+ty))kz@Z2rR_u8$&CLz7kTGV;aaa3?<-y{)Mf23LRYcQvBeVQE26$NSI5n^xFy+J zLQYBRoSa$xP!e2@&6+Ry{Ejc#`WN~r(}9l_skXqzHVy|aW9~1Bl^sS)H+#l89-ht= z{yGg_>=sS(oBbb`X!8E^>`+tXk3$=U(8^=%MXaBacjxrC+Oe=wY!zJIeD%sb@4{p` zL0dG7q@k}Yd3W|v_99W}l1z7l)9Sn}R-1JnF)c!>Xg5R0Y6HF=_KDixSp#>`d_^ql8^ML2h7wx5P9bbV{xJXOVzP7%M{R?x@!M`G@ zZSI0BaO}wb77amW$suVzF1E4j#d5%0d7HJ`+Q6xcKa<`i(#zTG<*cZ+?yg6KS7Nio z?yGwuGf-gLqPD-mE+0tHqCH#9O(LOt-YbDL&B{+od~BtnZ;=qlYMng^7hErumUR{+ zqV6E78pLjaVz2*}6o4}47X;MpMd2O4FXz&n!S|<6$(c&+&+ORv&Sk|(q-R*BB z=hzoAK1#KpRNZ640T;kNkr^>r6#i9=e4;ck&|dmAt7CWIFuOrmk3znKsX`6pVz-a6 zutcQ_u6+xR`T(AGgEGtpLrQTT4SqxMz-jhv*(F~p^JM00wwPVm_GDd}Z8Z!9i1j%p ztm>Jh;@>6j80J@?Lz!y04Aef{suv)vQ9FV;p=0mIoR%c>2v3XyzhE%taWkzERmPhv_th2)m zArAS`@4ii=5wV);*a-fe32?<2mc8LS+NmPPz@X){4DM1VB6T^9B}KC)W35Gn75mm=Sj&cO+E+rVZ` z=kZB&+|94(?1suxB$}(!6pb!*+hMp;HjLoHB)at~kj4IhZR1eXr5{Ay{Tf}MOjA~q zMD+)X1**iS$fGp&B(dZTOC;Wy-v~ujhvSUEZ~i4mA`uxnsj%EcEIU6H#_^nbR*RQ>p?Ng#Ii^;6>o)2w)mo7%pQ)jQ za+x|+`HW4ZzN1p7oRn=FNqzZ#mrD6Ap5652_+-jaNs32lijmh7Oo_Z7Wy(}td2u48 zF+T@ttKZEs=d*cS)X@9sYG%GE29y1rjJXCRM?8NtE9rR4FY{GzTlKF+G&lNeP71BAUj- zlL(hk8Hir#MQNeO0#m>mrL@dZ0Cp)|huvkW@Pm?wUr>Q8{AEN;wIGCcD?F7}Pde{T zpySa~n$BrSbm<8?yP<-5A&Cbmt)c|Fdy?pmNuqn64dYPMr5{Ay)^Ai{1LtbW)~kRq zp1>_iVF?Q%GCdU5`0SEhx+k350)-VZo3y-bPZ-dljVk}j38{E3p}`UwWMm3|$RUxrYFF94v8TVs-i<9z z`j1k_qhf!WojxN()}VGL;{dk>kEkNZraFwjFWMc&X0m0inU+Ti01DG#!01H`D-qj^LjRj}3q0Qg0G6Y2a79zX@!jVL#f~uix^(nkqzMr(BTx4^qxoa_cq%5@ zOUAOo>~X9xRc%s*&RxhSDGydV+_3wt2uxMx7{!n#e^H^pA6w7DI2Uz;=V9XLn!fwO zRc7m%Y)`@;YJJH;5hyR*=iQM?{p=eHBcb@5_cZ0LWoKce(VcvIX(=+qfJYpM|3DUS zA|S-Ht1%zoa|%HTLu~!xokf2&l zwr};7?3i^-?3|?h(7hQedAI6RYpZr|$_k+3IEMCPu?S&f#obnytCNdAt3yj08;Z|< zw>TclWd1;V3Csx|wmY_P2ON{Ai?YJ~g&SN)WS8rRe2>x;o&Gs&A;72K>VrQLjz}Sz znJKT#oM&*7$j0U!1D(53LN)TPwqK&nD6>x1OVsVo&6FKg{+FLUZp^eRE^mAk56&*q zGBrO$+qdl~e;dX^_#!5?LDP|AxU{US1!J?aH!xl{IaOlW^gPV&7cu$F$r&?E$#^L? z__E0-yeg&8U=WdPJVaFR;In7v0R5MTvgWgx^s;0DK7p}~7#qY-1BWs3r(&!|v4|0m zxV=QW8@MqxL9N%W6jCV8;Uz(q2w>G9fJz2VBzTa_rfMVfFu=GV-(&53^(iP&9u&F; zp9ums;v-oko>fNz5XdL|7z#6=wk-r;?^qk^BZzac&m|3*z@fUuv19wprntE=Zf(G6 zL$xOfee5;}AtVs2x1Qc=v6j**zzMhOd{zU^0-@EaXL9${)53K|;|?rroKXB3tKB3Rh!^0+9RP$jnL_eX}y=BUffIEAi~OZh5*)F(?@9}ucdm>1a>qFGNae}T_T83 z8_G|m>)1I4iX=5nw;Eh3X@uX7`^BAn2yG%*LSgdiXjbU6>_nBr{KQY8H~vL>MJv_;Ma1N6N&!Uv zhYsMrfB4p$wWsYmho#5*G0D3rk$2~*SQ#}3<=6HP)CYIa%M_?J!5=9tB1f#T1(DK0 z!W;g0uzEs0r0qpYRo!! z({z_5?eq$fWR6u!!PIZZ-3S4F%&J;j5Ql~ger6@^I=+`Oo zRf>WHb%*H`>5{?-4PqTY{x1}UM=lg@V}ArZxvBf9IQq{;3on3n8w6(h!}HkFM13Eq zHOhg*ch8d^yn!+u$T3&ta{W$XzlqxgW-}TBn#r9o6x8gS6J22?_QAO6TzePBEi}8# z!C3!>cJ(V$AG)?cnf@g^jC-GiR2T~u;WuH=XkV&~=MuiuGvL&OXG&Zt#=MIFuSTur zYOgiP^{2wxQNzHB4X`-prTA03`z2bUs+wQMvzve5mUvMi-9Jxqx5tA1AqvtVciZ3So>ts^bp9+#s*NzFKFqjgV_hrgd z$HdKvlnH<8PVG;1y1OPepwr3oeqnCsIRHh`r$15lB$`v6_NTh8iM(i?isT@9GPyCbi5-j(-sdGs9e*Cr6oLuaW6)-#g`hm%IvHIe6ybn`gN zxSw7d?V6xJ6-MG9w8cD^;!_hDoSe+yh-3yyhb=A<>yBQe0B!&m)s~Ok!oLg6q-l+) zKo*|!_Pw}g;hqTJ+QXlEUjkK%KeZ}}s*I?_X%fC7{rjo9K%)wb)fAnTMDrc!G;!7> zc_K{gj%q2Ll_1ZU`vy9qq<)|Rfjarm`@huDzB~B9c>5eStY|xI(N~T>Yh)E zIotwc{xk&HwixPErPFZ*%$pQItc)pa$=xFccz zxLLw?XdVNo*t^sPXE8&na(DjB^_PTAj>Oox{NrvYT-6I>>0m@mAg~T$|2I6#y;(Nq zs-(X~^&hf*mUcPTIE>drq(=4#IJFoZhV0>0{+ZBj_lmu%l1|v`arw9YqR! zxL(SMzOv11ufQz_QxoQD)D8jg+pi9MtFT~QK0Y8Cd{*s_G`mF?&X zWNSOR)Esy8`6tcuXOleN3_vw0%heV#Ky#*|oZ5anSl)hi7n?VkqS{$+jG>*Zm?bv7 zu*ed3+w4)@7`0qjlESU-jDoq52VPyBT<^A=Wlpky+)My*f$XF!iq~G=NW;MbM5-;Q|4TIV6C;;oox&!m+p<h0lytP-}~au^V<6tFm09p1mndr{|V5UJh0FAd^XQc%kO~B+{{~e zr~6N!B|>%g8`uvRKf3uU_T$=V><_G7R`+@7%g6lx|+JfbR ztE*Rrnyo_C3&8aP*0P3|3SAo4HeN5;1zg{Olje@}@c9Kek^zNo6pZhTbj3xLbCGcN zCgJQ7lyix-C;W$0d@FS=%l%^DYb*Gw_=gW(nvsx4eD6;ErhHR!w^)>KXE@@vw%dzj zPwVBoaWB9f{judJzy^m4^srtWO^9;8+zT#r+{bfGJ8FFV&98x=k1Rm25nPR;JmKwV z3S(YseBLKcN5q;=#k+TD@}xeuq%cI4mJ9maPMOvXVleGY=@dk{=!4;TQL zO<5$+2y$jXh)gX&=v)cqv7O;3zwHazd8ry@G#y{Z7?1f`ff*_2=THHF(#MKPdmos@VTpFOg5iicZ|v8v#Vo_kI!#QUawdt9IZore4APy_%849U6=ap zj&C`(HG?NZ+btb|&X9wh4cLWb9`G5#Opt0UXh9vA2e5nT5y)80fw}m6)q?|Kpl=c2 z>SudtEs$9I!WVj*_hmG9Wz^=5vTcTiC#4~zwyeZ!FOlyH(-~bpGEJokPx49psB{f~ zp(HOa@oD%;eI$NlhK9eeucRN3&pZwH9O1d zLiMRF8H9|}w5ds`C zme^0GFiZJ1?AQUu(+Jp68HANm3T$72E$Ks8kwm}>pyqouxf3;jvKHrEVBEXdNb?b1J(;*At3G=cuXpb7MAId|y?YzgSs zLgdm9*pZ;$#X!D*e!z|b{VoR54?tJ`(Hv9hmol(;%XF~H1=oYu3y5vt#@}rxakOcluQ1YXtS73<~B!PUb zU0m`3OZjmzXz~F|`EfCjd;q%b7R@r1|4I459oC?~kGXED(4Q(lQ*jID!SXXz$&YSW zF8x!L{Aj)B(hpe5kJcqF{eY$XxEM73fTjGn7)U<=UHPH9Pm%wm{PY$2A%8PSe|Pzr z(Y&MY!SXXh$xq+z@-supPv7qH16ayW-;~CV1`JrrkBdPU0I-xF7Xu3bKv#aG1EBo8 z>O}{o@L31;yko5^+=p}ec@eiy3y-lZ`*dEeJ`SQ|QW07$gt_>D1P;?0!rEDgBX}?P zjwz`WMVTmUqra6vx0h0om+V(KGrHm2r*P^T(m3}joVwH+XP3f>qkFTA&;t}ViuB1N)L!Z+*^f~=yX5aDIOL1t+#yR*=W1u33c0#iM zQDa8y%?^wVJHFV`e=vtn)BQylCJn;#boibI6@G4YjU*mpet+n$P?Mbhq(sIji-dpY z4dF7Qqo9k8+NS`9ft=rZ9YZ;Pd;dYer}8*t4rRz;wH4Jl{1XU5O)o>mz*|m+VLBE! zX4dRuVNtp0P$Sq&O&5P?V=@oJIuq5<{!@;Ct#3L$J49)8Ud~Setj5Qr^_wIfh2g(V zFKZJxzpT!BPt4-yqAC(QQ*uD0tR3LBfOJhw{tbKpYO?M5Hh1m7ci3E#tPl8CJq4IA zsX{z_G-C1vN;6n^OXT0l>JE=7l3!@_e*k*rqjCLTK;qPZTL)Vup_>s5nliZ(g|vB) zIMxh*$K}>a^V0$jjXinbGp3Ibi;`qU2bZhw)_A>-qwo4butdFP6$TPqR=pTi=K79C znGM6>Pxa0|OFNBr0YgqRSeKNKcC3!n+U&tfi7*De>C%vNg9J);IPyR;1p~^O$Elj&^Da^yNls1W&X+GC$lEeX!8$iFVG$PYlO%M}OZ8=4B8R z+{2McYZLQVJ@;!)d26WmjZ}HdY*2ycx?Q(yYV7H+FFnjQ5SB z{wrs&{&5!*>VIY6BGiP`570#4h+_%v7+Jyu7DPXP9_8usRvaEN1E>U{Wo>K;i@Iun z)K#<$cwXXh1+n{I!nnp03u{M`yMJkU@AT!Q(ATFI`nJ5T=^L9u&lw~StFIw5+_N;H z7xJ27Pm#QnHF=K%jT~tftCy3-VheiA$AbR})>UNNa!Non(um2#%`fw0@W3#$D>rau z@x~H4LoQG#m5v++BC|WCugpHSRGgRO6bscxrYl>WJR+!_qxZwdwz2+`k!r`w zS`~1ZhQ1~N{j9S8CoU&d)<V`=`F3s6p9y?pa_DjX z3JHMPs=opFV$ZnaKg5sE;Yr8b(tFXE9Qc=!M{$!IFW7`AIZ6bST{J!iZZ3Nqz+&6$ z1pl746J?nKh^ z{bO=o7J8bDizYIwdisJLjt^b_SoKp7#M=3+4=d6LqCVj{XIAh|c$}_;|3k`0dM6VJ zmwpI=Tp_a^kYJ8wPDKJ3k0|6ZePLLp0s|M4GzS-{L%gCFO7JN-4u~W*k~Odl#vn%e~^F7E|LY-A@<=>a zU>Wn98IR(O&Q2+>mdE7+vQQQxj?a14ZLXs;3EHhZV{)=a`y@1lU*txjeOYNK_~~?6 zP8kw3uD*giV1ff80bv+OU3F(arKj?Ki}{hcY-vm*4Ldb|`+m_^P+S9wn?TmumG)d} z9I77V8vERy%jO0ySYCW~qPXZ?-?r~(i&nfD5L=flkBWcZzMt*ajsHh#Jg$Yrj=Ax< zTjx@bY&}+`nA?%@HI$2_*m4hJUXzr_{5(mG zqhb+a-!GF;QeOjPB^a{R@dXl3RjFxm&%e|0oSm}or;c>vdH-WFeJ5-Berg6c{;h8D zO%hM-;KncQ7XPTkQyaPQ_1)sDC7wFOji1>qeyYS%r?~N#t9Vx*puf@rz-@Wgpi2r| zAv$3=ng?{k4G;s$6Bti@ZjS-~sRy>^ap}_GcvBTn+_dE$hWE<-jdM{coWwESZCU`2s_4`JX*-R@NeC8+Xs?A&@hY#gz0r2YOF zEGk|rEjZTh@+X-zEk?Cc(;_wpjO#DkVL>({tEUv@`utVbzEQmgBt>-~r(zQ8&g)72 zc+&nO&=okFmtawIa4@Ixh3>f;^9sJj9d%ncukeQ{_>Ih+j9*kIih$UThZi$67G-_o zgMhKk?);}liSdv|`A<#WE9^v+z21dZ3Hr>gfp-oBQ;&x}OADNZ-}Jzd`1Mv~bp+=! zkF_g1cH)084!j;_%X$fW0uR&3fSnTGX#bZF z2Wj|evt*^A?N5|}AjCjMR8U9J=iWmwZMU!*>|nt4Ph4H5Ptl02?k+F?L4J$8Zhk&; zgjOR*Z=(;+@7y1l-_H(JzEfDfLgrWh=`FMXu?;zC|L1fbRKnNCBul6b??TY1gySv9 zU$6WvJXHQiG5;r_eEDqNdQf)PreycF^uN90KkHEVW$|OX$QlsQCDLl8Q@ev^vi9b#W2Upg3`MGtQ_mD2HZ47Pl!(G~n}9--I4LME0+`-gJO zjS(wYD$o&(UG_ruUIT>}9EFX-y5$a%&;pPpj zO}iB0FlSIz=5Tu|zGt2=+zjAZb+kHXYPdZEUxxWMaH;w!$2b32lP7=yI3CUj@>*rt z+r=X;%m$%#_P~glpbfy=v22309hszU!gx?nU(R2f1+p7R4d%JwO&V^KKGZHkEP*lZ z<>sC_nZp}M>Foi#fd(QD`Uv6>OSuIH>-E3|_(QX4fkxl^SDGga_rgUqxp8<86hoY^ zwS1ry%DZMZNQ;V?bZ_y`2o{6Ti13f!4%9CE%km8_{&ToZJ{b#n#bniE!y6Qz9>!O! zKFM#j(8#XmrV3kjS>TwH+##~PY{=3z2+jJ^2>u!PMJKxpyc6<>0Cl>XUiJ-pW4b*= zc~wXizNfGzzRqCL$i0M9PP}&PiPjv3xCU~wq=8(HP;cm(uj)4^U)MYqhDXC%egZ73 zZa;F!%t|FFwjfykHKMtiXcJWPv%qLIJda;z6oOS1CWzo=!0-%WsgZPwTcN3(C%_}u z9$M~!4Vf~&!kRRngrRRc%)W;T2ac05&G7SyeE|OyRV;mbgYAl3IHD)DRX^HiN; zETE5RxVTW~l~=g#x8? zgmO22dCqDH46=pE z+K+urj+Jg5jj={Q$QaJ-G3GVk#rZvcLHPbydESu9;V2ZznU{ zhpQ>YDGs>{hEdFPsb5u>uD`v%%dmwD$PkmH@-JeNbp9!_WMf=Xu8KFtR$$f%Ahvlg zenAU8x6+s0k9jS0$D15p_5epbfouT+_W)HS?Z$4Pu#r{XF6>ia8;>r3(e>lYMH0eY zp~$W$HGs*HYCr^z@JNa?tK(r*2djaMQJOPqCDEOP2CX~3g#TLkTir&8aa1P9gG13< z4sOz#zqhuKWP-g^`mnQNoLa0~|AqGR zKA5gFnKAbrysP$;(ilN(KJqJdz4oQjkMI;+2b6dS1}fDLC#g# zx;{*yvpsqS=D<*^7RhqON^54fKhXBZ+%l4JBFOmu{v=!uz8nWIH@)^u$k_(Eziq0_ z86u||=>B$BU^;sNB#KKf0B!L%bbCr(7=wCOG3X!AyX1E7Z;jCVY@nj#QJCP*0F4tQ z`FaLk^^jyaZr_SKCooR6IMMTojuTy?>NxAA4_99V!I;)~xMyZRP%c*qae{?vjequ1_G?%uAL_!`RLi+;f0fGQ!fDF4c5izn zU#YeS<4MVVY<$w5NlJ4mn`T0qm%*m!MVha9LP_&OjD|qX!bC#Cg!-k@0K-L~i?Ua7u|3+H zEe8lDIRfU@^46)80bC}quq8yI&*UpsasQAE;9e&NHGq552+m;}-lqm|+%Mc5Pb=AL z1l#f2eE@gLc1KW3s;@^q~3{wHU3XeJOVOe_+dppF^8-MFB^^Qpb-=lI^3n@ng(R#&;V(zKS`kLyaGgQu#Mh894enDF3pdA6pJ>G?;!G?29a!mNt1qR>X`~77tieVlZlie{&mLMX*n}`L zc`?TBhw1}vW&d!>D?OEBDVNIe@ zf7`YnY}Dg8L1oa}u0cP>SnxjNLK*b4eu@bh8Nw**bXJblS6ul8Ju%lh z&MCt;RGd(B$6C97I%AZ*57US}r?&T{A1>KvEadbp?EPkA{~lDpuCJkZ&xs6+6}# zW(}EDKMsfso7Er()@ASognqvbPd4^u!#n37XV->#whK}>1UiW4+{`OSjFW>O-QPD# ze_sihWbYe$P}}@gsK2G4)D}ZS1%WzVe%L!v2>wkEn3@+)$@GSZ;@zJo<`m@{kdW_f~ zO|U;E=0?zZXn)8E8#iB}OGL|gHZd548)giqRxw1x(MBi_M^BGYOjP6Rz-*>%79rv^ zA$+*_5{ywNr-Edp$f4i08i!7dMh|@2LQp zbEG?*J{DiPe0n^+^d^#s0S3p;J;&3Wu15QM$Cxku<2x8puPxq~waWDRV(51!&U&0jvCvc{B53-B?3|SS*A~0`7Hbkk& zyOiL=F-kS&dLYlRr`yPI@z->>IRlCrI7j&Aq=m&My*etrL+$-YC`Lt0-=~+fH#z^9 zv^Sr}S1l0h?sXWVZ7NuDai<+W zfinC1hf97LD{;bfGgJYbZdCSIM5laeGF*ynPwi3Grxc0r=;ulCzIVs@kZB3YIar2a`Ew~j#PPi&f+z&bnu`oaDTE(H(N`Uz*Aw+ z&w~xpqWXFM`d={uQZ3)%_E5KzD}^!QyaEQ`A_X)Wf_rx{9Z*CkB-7lCG|LZ1DV>kd zBX%3}zKsCg?=4O3_n<(c&)~>0tJ!%8xnRXLGO!y21e@-WmEZB9@UCM(&o8_4-+DRc zHCQu~13COD+ViQ(nmeCvStv~1!A6~z*^VksHXAq>enbF^ebm|jWxq3!e|o(D3KEaK zr)FOUB3NWS_J%7j-TT9Qdb^}Q%g}Nz2i8dT`Ik!vP}K}8H{o`@S%IzO>A=TabN8YseKj|MI z-~NB6e|-J--TTMSzWM*Pf82&s8-H;B_*m!vK}PL$p2CQ*a0orvwvKTF!qnx zxVX7TAC~C7IzRuu{?P;mBisoU2aV#&lk|@qlDqn@2ksvI;|b@w{UgUf(my^y!czLj z*Dz<0>>sDe)XLP}`p9FTcD{dDmIsJlJIvd3hxsJ(cK(E)|4rVzz(-YG`{S8pfI*@s z=v1RlHLcU$pwT9pTN90TLIMT?7)wO7(dwfUlqlCqr^PoCGgbYisMhx4o^m zw#60&6~Tm802M*3%=kdm*5(kk_$c9-{J!6{&zU)s2R{0`|IeS+%-QeP+UvE~UfWA7 zdzQJx>~0b>x}i^_Pn6sg>6$Eb&O?SEp~2RHM6cVAVSrN6@is3H?1^4z&dUM4A(5f@ zM0(f=dwUR?uQ`N9i;YBsijrWKGwfbGKR6_rqZgSJ#c^qbP#*g+lFuQC?>2C@4#DOd z-G4O$@Y7U%Ui)ZB^)#x=HRto1NtgWPU|f5wf$!b9_BKiTIuK~g7fyuUK`C;3*JBl3 zRkPMA)JfkBT_zRg&m)i6S(y4kL>WgJ6U9X4=MMss%@CLvV`4xY_S32Zu5pncHg8(< zL-LWO#pp`2YhpI!7&KCd0_NfX|LS@8+chy4@fmt2hGb04F{TBhqY#IxkRgl=pyhsj zS}tzG<}$QVLVip$LoY}OcL53zGA4$&{a%AyZkoGip@JWkNOT^ogrhmDG~Ft*`Fu~_;W{azh(1TE1t!SJ7;CRb5?x8P84UbzIgX*&YCVj&>oLJPH)9r19dw_DpUy*t6x!qt;6%q zB)^-+-}CYiaMx>aS)(=o4zuqbQQuO+zDFP!@xJG)c-Ki=UKc)NIV|1l!UeFhE_fYw z5coaAgjNSQH0*8zb=c;fb40Hk;_P}#()Mb+V|#TD^}%xFRfu+nJ>8{?kQ98V_4R1W z(BnIP=mci{SnCefaC>c-_r3z~1V+{|bPQBU=*xr|hTl9Mg^eNdmgsn6$_sJ~hPv z&lHtm=_bwkAFdSnBS#bR+gI_DmS`W2aqUdR&$7~1L}2%C{tB3+6mFNz#Sh^NFMVy& z7Ai{q5h^oRJj!&q*E5$sg0DMsw1xeMFNF(5Z9YL(o{Q={&HRCsK2d)FzdmS0$HKXk zf_Ln-5cV7%l)5GA?zubhmZLWRBEW#Lz36$sUarwq)H?>h*niH6c=T!)?QoUehP9=! zUdgSX!LB8&v0eDQD%h*?4KNHo7qx}N;J{T=eEXxKj-nToIT`4ixk8lRkm-4MaWNy&zRal|M1lvl$0Dfgt9f73 zoEpG&60k2b&AY{n^8Tw))@%|q`&*LL(wFCb4j!Ukc9@h@e_#=|`=&pdzm;C^ne)17 z_c7m(i@@QfL-|1pttX((>*Kc-QU|Uj|gR zG-43P+}Di1?hLAT4ox{_)$4&8IDwWqMFx65Sb#^^^AdwMRU-;uVdq7V4{ls3|p*E}U~d?>ypMw1(XRXoK!P*LWFc zbel(i5Un>`WKBDw*J8ucy&R{g`ye#F#u~GQtDJ=NvasiE#j)5k3FE_YofskN zMX8WH1dybc(DdxF{{_(J@^|-1D{w~63sA(8+tdjx+UsenUj+A`=pC`N*&^`H1FQQ4 z-Z8`Wb4V~YoF+*|;>7kO%mZoIkFXTgnLNsB=VdE&G9O@4puZ6zmTJXZ0qW1qlJe$q zF6=QY|@x`sU=C@GN1B#5@-0Yx<2DenYy!7bOJ_@k9VC>*b`N zl2;+Kdf|(>l{j`>{P+*DTDTvMk^Nz>!Qudo7@Lb;GCm~a6|EorAzab}G|UGDCIId@ zsO|50$b66%2iQ&cs~^bF7V>(S*5+fAq$dt&UImkjUPT$*z{D)%Afy$vzfxR21QhDg|!>&*i6oP}&}|JmQPzV1%dSM);BM*D5{ zUDal(rLYxTr$H+%!^bBn1sY-$+*2A>IXkVt6Bru5&To^UQ zfX>tfw)O+Ih!eE7Tk%(zhxNvGz69C{5D-`cBT9n*7a0*f;d){f%JO)hz_AnYTooTT7^fg^&fUiX78lljrd8 z#`-%>VAA+jnUadzS0VC_ zZ@{b#>raw=4qESdNZQu{Lj8(>?dC+>&$+bgP=JC~%N_VoV9ebz5RC0&Bn$q5{W~~d z&`7$tfyD?~MYms!VVUWcn+~~q8acm^nV#5`#JL^crq>ZuHk@g>!ej|B75nqb@*O4&P5ZHagCphSCJszX6=2 z+QS3Fzku0O@0`;)yWjl)9Rl4>;?LLOj2`(g(39L2Qr+rl^dM>K`I7ay@Zjq63LT;D z-+%zsi!6TS|KGK|&|0rU5*vB{eT-T?WsE7~00E`oPX$_C5vYGg9y!&EQAR04#)!fW z{?Hg>%IbyaFo)O13FZZ?0N&F#V@bRF4C){7B5#Z^r^sjl1Pee?9{$V6)gb47AC1XC zOVO|Ux#hdpx+SXxTG+aES#ja@iY|Ro}|`fh7u5iF4c%ofsH$J8k%fZzJHAXlIFJ8zY8qK{3L{SP_0&yw7jx#Sr2&QZK=g=1z;rt1G~D!10$KrnN*GD^z(;>J?$d1D3lzhjZE zlUbW{w%|^X9W1G6t2rlR)<8hJZ{`w{PP#ihB~Q9}kiB~mIEJ3(*nwwvDGfEXbo$

    HJU|k(=-J`0dByJ zd{=2R#-d^1FBnFR!WVQ1&l|fPT(yGS7%iuf97$|TH{m;9TgaO+cOHe7L#0U5=0B^D1pAT)OGCbQ-n@sv>3Pu0 zSk2xRZQzE7P`E*BUdtRvO8QM$nS;h)s4dqrYd-3xga5K)q4-ElRIU9Cr?I(e}f@R9P=|%D4a+)ZJ@UlE(!f2oA`g#A;+_|x!bk#pBfzYLk=CSk*9a5Gv<0%3$eVXpGG2 z!X1D?t&OL#s=G?$TpGE6!W~RA~=-*^=;OME1)g;s7>GC;l_>C_J{k?o89-@J@|DLnopy0Vg+2~ ziU!O^zLB|R(V+8gud6xOdmM{_H?83tC*4<_qXszoSX3jvDlk7D{yPWu(%{bEdnVQ& z9oaRC&B3r>q`HFa-d)DQD_hogX3Yt>TZ)sr6t$z=Xtju$bMjF%U@i8eW#d?wfTIi@ z(!ft^rXeA>u%$O6%^20Qnd`;J6#`;YXV!(YA#0zGL7ZmZ&GPDAxUogwnH@dWY~rBw zHxKBW0=QEv8E_MPO;-~Yl3zgIg{mYU?j1rO4Aw!|Ndt}v!k?q}7wAW^Rf{?r_h;RF zgtlz8>5ttQ#iNKRc?EU^c<%*oy`X!AdfzCmr;k0N>FzWCy;Fb zX$i{)P6gXB(B1ttK-f3nGYFFCJ#cp}54E`Z5WLiaDJa8~daD2pB`61g$g{g2I$U|D z{Q>3K73>Su{xydwk8<5J;rkHdD8V?&8XIx|qOqv}QC!68^JC~G@TP%&_>E%t--GZ7 z#~JIj=F^Y^Er@x<@*~k2Qn%j@`+%d7;Nc&J9v|i~HNFk!4?jQbA6--qH-9O41BVXN z3DI+MaP~ms;EmCL1r7QBYRvlgI|8fcdpi z#uyh+6=a=&o+{SwPlQ*uJ$2=uM^>;#pnm+7XpymH^oD4mIe{8>y4J(uXIqQe9wv&f z=x`RhPrydg_x4BOS59`NVvADE>{1cjjy*dTrMIVUH%Cty&VS5UPS^cU^ueZ2>V|)T zq;sLK_w~7kM?LW*z6L%>b1hUfT-D<0=X_MnChAwJ-?yRHl7^D?rP_NFCf<$}Mo(%# z5ufRMPn&z3Rg?YrmDof2{xLU?GX3{NWZx~q4vfJ4QqrF)_otu-s1-(<;!O&!7qAe{ z{$_o^kNM^zq5*yXX>-45O?GPDCpBBDW@o>N(@-`ijVxNk@?Dr}?A%CzP?>xzGNdBK zVy7#Tr$TCvN2m#e2@>&_{th+Td1gf}x^a|w4EhagN9#fe6zIk21oSwb)J>}?ic1Zi#E}!pRV|um~E%Fw4r#S>;gv@YM(xB3z8{jR;2(EV%F;+2OqRTLF;R(D-_lY;~2J0M{ zUC%ks$TBNJ#_hSKU9(3Rw}&8BRA*~THlS+XCe#V^G(D)V4XMN3N0q*QZAko~T)swK zvjPzbOhfggLmBh1y>Pt>u9YXubstE7+Sv#$eWdjIP8qgAEw0b2k9mYKCxEvJtpYW(w}qahy2zTd7q3MYbiS9RzdZ`ie>PJ#21O9> zHrN_~>^?$vA0fMskljbf?n^@UlZ0sn-e&Pd=B$fA0>>J&#`^Wu0n>kx*?vE;6HNC^XiHj>Uvul!IWQUSa}W+9T!?Tn z!np_oZ(Ia1^`c6I^AHXrT!U~e!ubdnAbcglS0h}AFu0tHZbUeWa0$X?`s#>uDmI7Y zehttIHV=S+z!1d>B(x<}*+#s#K7b<%!p(Ny^Tv%i#x22~F-ksyXG6FRpqh%3$Ohy0 zMTd%Zk6x$6ULj-7XKii|nX_~4A0SA5vcRLlceC(PH`#{V-n8_G*)cP z4j8xd{_J^p&KBFu3cia46JvaI6l)Xi{`_nZsOoIIdw*R>cIb1mlK`K5cSh|b2P5-< ztmiG%>vx_89!L<c$BUu_|aMaWq&J@mh9yl3vF4%qbH>GzR>ScvT-iuqmkwM2VeF zRp6in;w1AJ60rH#5-~+JFx#{JseE|Y-SE)gGQv(OuG$EKb(m??_LA19~Fxh3<5C<)yU#T%JuU5S;Ygg`r|B6U-X}W(fq9 z^Us~_hYmeC)_YY8|0XRUI^e?3Yd6Bf{OrKvoPW%LU|w9fq;p3MFS(pMkj*9bvYbU7 z&IA|j=~-fC^+36#@HPBtE?4a2Bhvr0{!S1F=NR!s)Mr*>PobGYV?*zj()BlAY?U2V zdb?lKN&DD8wM?&EBa?GBx_-MKWqNMl{>Zm(@tu3Se{Nwa7rUbtkoY4kNU@;hYShyM zJ-0gJ(fh#UTX*gu$B9fqt z$2Q@0A1`W7(hp=s&(#n3qo?Z!M!>uEfsxT8^=_Za%G>(M0FRQLz??bm$1L~bTkgkY z){SseVeHnLbJ&rxGc)E~;HI75*l=cFhBdKoPBFd?;p@n!gzjjoF7^4gczVBDTlTWH>LPUC z+jn++wYI7}D>Y+0<3VY^Z?&g%hqesEE+650c~HiY12cATDlQu3ZAR}5$P}T!u^Mnl z^^5QZ?;}3D6pX(@bKIP31aH`3L@u(*`|T6uL(v1p@Av`qkRP??BLPofl&Bk+93T+v z#NvWWqQyn7dDi;Mqxv(<8v@qFeK>f5LSYMD+;MUkTeHS!%ZiK-8uuS*e1P?9e!+MR zKgO=+m!o4CeS{XflbMUd`rBD}BNG#B`omx|bJzO__C{yc)C_IeSYsQi(C%5?{7Ngh z^55eNhNruX1E}YS#_4W%6aTz=0KJCS7heEfpgqZa|8qWFOKCo z9Y-h|a$r?6JIvL_sjyL{D2l$;pS0J-`!9f_{+@(O&(=aKC8-1XP4%8YQvZ;-DwQIJM>_fN6?dcjFh1VctbOL70VW%W6ydwdD^SJs)DKw*1kf8}VDZ z1J-vi$dOZ&_pOOOV^{CiaUW!1OZXDnvL8HsCq&veM!{M(r?oB<8jwF@ow-jI;Fmtf zze^Y7m(d0J1#q7pE#?EmU(olBi~=s(I#Jr1nAtkzOtk)k4%XG-Ypu)a*Os-qA<*$p zo`&Km%1%j-reyXiam(f zRVwxnGWD@$r;%1PFz3N>yM60uq^`yI#0VuLf-hI%U+OvQS~Jat^|b{8Hh7Bm0(7#f zzZtXid(6_U?^>6h-+16$t>s)4Z``+9YkmRIjr;x_{c_{J*R=(kRY+SvX}WP=@2V{P z&ON?y-@)Ve=<7%HXpMLJo+f1mO+OnCM)-753TOExDkj9HS5WnF~ymE9Sqz48tZ`muIOF+NlwF^ znJcvgXQC$iOGv?$=%)}XgS11e9{>n^+x?fTGjXh8KZr!NMb!SF{-nkL$21RoCi2!8 zU3=#9%rDRUT@`f8b8gX}l=rZ-w$q5=)kEr0=;xuXp{k~_DXFUYA)3G&i#Pjl|DXxh zIrt64`tN|ts5>XInLUkCvDVD%Ho$~6B2FknNUoIooT{Qf=Sc-|r=l%*S^nABo;xY(v6oL~ zGCG^yQ28=pG{Sr;R|3_is!HX`O3Sr$m|Xs}T-GqTMtE{XuN$hhk=`6!2xn-i{?OFL z?KONsZ~~z6@NG!uSQF5HpHcL(@#msmSYXCpBM`yx5z7G0-qK%T`i-Rz;cs#U0iSC9 zj(65?EY|Nx;L`RomL>eAw0=0{6RqEWra9L_R`O`8j8amSmPp0S%Lo_wgn_=1z8Af?C zoX!jY3V&+Ys{`UD|&DA4lVWvS$s9$`r4r44qSeLww}0!+AlNNvs2-x*eGO&Xk#! ziG*f|Oj&7}em!(1e_E#2p)-x}WQzX#5KWErW|%lchEd)OUt$KVhd(v!^|BW48~clP zjozfz0>GYc#JF>f7s7c^EE?J9a^^vh~(^|fIdJ|+2cSx*b= ziG;L^c4_A+LxpC}K*t!2?7=YlbSX)>oi+4H~ua#?6^a|TqDfkZ) zj;X`lU|G8|{u=Lb7ZzW~%q8ZlRHAD9UTP;$6?ks0zQDH^mT3F!zcrz z#Le3L|H2oRMI8eGSP{%vWNby0kS^IK`%XqsHk;yQ1a)HJe4S$n{eGw7ahs1J^p`6@1)7A5($@4^L9v0k!xx#CeqQ4#3!JhSUqX*9> z0%GACLav6cNs4!i6n>dyJ{6W-*Q|aX2sdJI=A+?e{w&J>F8(gzBTdG>to!m1ioJ_v zt<_@hVyxgtVswIJem|{_CrgljL>~TFH`60auKu=W+?d-7X&!6QT)`6gR`4in}fmH2GTG{a?=!?$>MagbxR#iSo6H@(qcOL|u4FqWsxJ z`4;)ENtC~csH#MHT*76E@>dbgO_cA%PdHKj2mItG%DeGXkSKo#KZS|%-S{a^lz)Vu zl0^C5#Iy0qfkbBf`5m2!@wq!TB{sz;=j`Z22;5P8az1{-@yU4-GrlDL48q0n$%QKH zk3X9jpB;Y&AsY!*@yS8_z0Ud-s5+HRm{MMV!0B^m6RO$&XE+RdxFPT;%;SxzJlKQ)Qxth(ODrp^wC zNY=_m)Pn_zAf+m?*=|PA;h$C};pbF+wO_X*P?5sNZ8NVEBz%c-f1*5)D9=um=OoI5 ziSk_30=Nj_2XK*xAHYQzKY)vT`~WTr@B_Fg#1G)27(alE68r$}$`a2cp2btun-k9` zHYJ{mSMNRqbu=Dym~kPe6(Xt;yElIKDz-s)$iY80~IX9oXQ#CLct39{}PEb>T72y zt%Pe|k9}%ShwY|&K2~p>YU2bX8Fm`IRSFZhdc0N(MD)FQKz|t zGhsZ)@6^3s;BBEI=)NcfP=t(0|9y{=JIp@Akg`IpLfZ1;#c-Z@k#&<#Tkc<4Z}`7w z-ISU7%u0RwQ=cPJpLiG3Ej9|a4Ep{&H)76DA=iP{gbe9r(^`&15nm;5&{_mm1~B0O z6?gnXVe;91;&uG`-L5ZY*OiMXD|&3B^^-=VXv>e%me26(>+`UZZ`K<#-qw~+>qgW& z2=7ApJ%o27{1L(*AiM|Ry$Byfct65@r90+4DIB)Czb^!Tmb;=3;d(0EjJC{0Bw6Mo zobRkhglyqn_%BBQF#AmfmRhVDLGx~|yZI{t2d66QwtmwpLo^6oP{^46C)}*feG<1M zGRAGv_n&;{Sf`S%Cg$V6-Y!mp*1X=2>hc9DLo4x}p}$pT)vjb+{;Zh~@rqEECB~Cb1{34s_{mL-Cz%W-#*<9uCB~CXh7;pS zCi4^HNhS*t<4Gn96XQuHL9F&B#vcS?1-bJHr6iG?lndH9DQCx8U_fHGNu-r|@kykW zYk)!Hn-DIHPa>^E*dKom;ga~IY=nF88H`UNwG724kyz<63@Ky;cKsGE%f)27*U6q*FV%2z*AucXYX;rM4Up*oJ^q1UW{JQ zKzOP!;dLaI*d(>sB#}fDiDujqg4vWI-&|54?It0ZmJrM)A(&Q@U^WTCw1i+bbL zDaCR^FfAdNO(d9TcS_t!63xmJA`UcJ7mYO*6F!`gZG7eZ*Am(S+7G@KPbZ!nIr>~> zS)`E|K@GtNlT>1Te_JEWQHx$d02Ir%0MIUe#QWABXsSG^lH_2uK-6=}mT)lDB&Z1G z1j!`j3@OT)rzj@~C@CihC@CihC@CihC@CihD2QhnDCVA>8C@W2t|5V9(e9mT*~Mu{WodE6oVRZCE>O%T$$L2 z+?51N`xKJZWJ(b6L228*6kT-J&w=mv=idBU{K+JZoe{Bnl-kg|#t*%1I(@CN>OMz| z1mfzF)_dSd%q}8n{a<#`!J+#4Oh>S=rtSn{3o0u6G_kEw6|^4#)l7Df+z8KDRR{m_9t{n3j_|<=`98-q9^{M2TwSZ|?j=_QEKsm;pM=%SD*m|VMeA{Q$51WATfr>CMCa&gPTcxm&h-8WjwKPNn*T`U&jCQ<(Dy-mX8---X?S$ zB6^#5g%V#dHxwqmcQ83cE+)nk)gLRqr1Wot<(F|o$}dW;W|LP$>{HO4&mh12=l}XL zK9l^i^lk}!NCXY`Uvc_b z@>+%=p55h&ZuexoOn|z|V0Jl5f7l^hd5|g8H4Z(A;Ki$Zp!=6#jC;QC;y39}A^8&2 z5dm$iG@brvu||@}#lpG^tBkvX>^~50<`x)EKU;${Wh|2!D0BDPbyU$hQ9&#uVl}3JuO6lPpYSdD4`@zS5Hg+2C~DjdRpMRruCTk z#-=__me!72%iX#6?0~fRORgC9L6>xD>k^x;$YI_rU;*+txf0|SkWCD zAx0|p#`Lf^<^cA_^sqN(9?MbJsMs6R!`_&mguU6C#@<|*=jdzEzos>f6gi<+rtmC` z&Lv^JD`G8t56ZQEL{LksV?Gw8VCPKgXV)|~*@Pgn$n>X|$VycB6BU6(MRuYhM|hQr zV4^~?ITeb{sUVw^m#83{6HZhpVY5OBn-xmftWd&cMMzYD@kvzDPEtzR zNmSBKN-1e4b)&OTLcAjrC29<%rk&)fX`zImnih%-S4|6j1l6?AaJXt(s3oYTg>plw zX*b0ubwJ9Ul&++O@nJfQz_qIbBlBji6j{zu(q4PeJ5jOi$On;gq|)y|Q$Sf07g&#S zgf(5f4MtpDEr83e6%{S?LG{L&L-9A)rDVrT^6W370f)aaXNvp?`~g&gW<)=06`!Vb zvsP{XK?7!0GthPWQL0^2io8~2hQM6osAg9XUD;P4PrY$Np8Ygg8uZ7}$3hq-O%i$p z3EU2d3K!`Le>PxbKR|sLs~B-S8vZ^*qT@7MNdK~yh<>nx>NhP`LLDKFwfX?^=5n@d zE+O@|TI4)yZa>emBwnclcTpX9L{|&*@Sl6gbqC8kdO$ho5*@k8f&Vc~ z$Skv6^nP{WI-GOeCk^tHYq{tFEAnvqTN}O_yiE;y$=fSDX1)>@GP{iDdWw`htmKDv zzzAdX?nVbetnuTR7#Hfkh8^NTs2PcfKM@HeBH7ppkwhd%#KW112+?V7BEnshmxyrJ zgcA|&n*2nByQUx!;jSr6M7V2;6A|v3l0<~NrYsS`7gU1O=BaZpLi=QD^KkN|w0S_C z`QWiA%mBG6jUGF{M zYWS`JvbqxN5?A1AB}>NJJV$$Z z(Dqr^Q};JB@vPm3DwFzSsY;M=y-`F7b4}yvf`Dyx%sK!81Njn^1OWr(Do_#xoUagY zfkMEA2|>Wc2|>U>y9$&P0^W#IvW-B$Nu6K3ssr<1885gu@r=GYGhVe8s@u)+Dr)_z zl-93`TE8ks>ld%0&M!A!iqKKRj(qZAYSF_{0ie$)cF<1t6ZI5 zNxX_Wzp{AM1~vDt=I_-`IbO|0rv{*8`jb^;d)@>g*_<-2hKQc2xreG zG6(NLSqS!jy7C+4FgA8Z&c#| z4CWMw!I>8>p&};0m@s0FU`#$@vKdo=7#vN(eg-i)j44LU(TpiUOpq~Uh&h%q&{I~! z$1~MBxo{oW6V+hq4_w1upS8?5c`E-sNovg;7XP<=lFCu?F;xXjv zFC!i!o_#9f&pd5V{vKMjX5fIiPQskja_?@607*vgaGQJ^|#Bc;1Z#tH;QkPrXN7n3i9oqsJ#Z6gXSSMW)sP(vCo?I zPy~h}_wWn`c2qE60p)zX=c}o6kdspKh*G;&rcuoQ|H>nS>_$W$aqLDYkBENDBag_j zqRgR^N4zT6nz*BKCAm>5*F@6*g82_qx;}#yP65CbE_H-d0y1Aqv}Mfvyn~lF%U;S&SvBd(!N8&QC*s( zeU8%AGfy$T`3cfDO7vyv%2#ETHb@>h$t#Zxsc*gRX`zK|?T$P_cAOF<2fM zXm9t)^f@!N*h*kO>T_cF{dD@AQ&{4#`kbve!5*N`8B&+StpUtB$UeY({#5HZe}a7! zxj>jZsq?4G&txxk82t>S0P1Hxu^k;m3d#`>Cn!hIvTl$a9rZKApFdF-U6m$#w}q*b z@#wWWi3NZU5lz(=PSdrR*b|5e-9JGgL#d@I&8VwwH@b+C%uM01>vJ5X45%hV37}`P zc3f@DN3FGRa|U)2J|l_E)+M;a2jhy5Q-+icQifEi^>wNzNk`(D-d4Pv6$$K zAhoDtF%efFwWwn;5mz9!;Qxd0v%G1Xl%E`7;2R1dissIK9=IdP&ntvk<))Xy=IKl= zHUVld;K(fKLxm=w&nY<(Z~H9GU~pR4q~ zgXL*Sh+n1jhEa0C6Ofgz2Ayzik{^Op2Sj;|sgtjS<(A2MAe_{&E^F4~5j=u~7!;dj zY&P;QT@@8Fu%x0C4Gw`|2}>%n4d4(6 zmf#S`Hh@bYSV9LwwgEOkG9P=tjzPZp`R^{wi1LIPWa$SWCL|`gpRzr^y z--slLyHv;^OodD&JI-ym3ki^?iAEtg6OA$kA~V%7kdvv7VN4`m1@%x_{5c746m^W> zSjzc2tU9Kxmb()(>Jx=ly`d@Ia)g6WaVZwo=kPV#4+Q2YV5r4VN*D_rQ_AkYgB}KW zv@-6|#l#|ptbbAwQ-#&7LU*ZL+AqqbHriXEdsoVco@89TQRCuTUK4>v3A077^#U8# z%|WZVo5A%ujw#B-<+=$M)hz)`%Q9h#3$|6t7rlpY^J?FG#TY=)t$-OL3)D4^~G>$yP*zNa;JBC=^031cGjbXmytFh@wYNcijFoZ2GVRKuQHDeUbo%wrP& zDHY$PO2tP218mt3l6#Z;6S#ScGnRQ(3O6#n^u2oHeE64F7?{=p3&WzI*$4%VV5B@O zTTMzqquDjA?osj2hO+7ScfZts3&8fumBOQ{K3tz;ze}9$*jrIwp0sDa2Ds;H-|vZm z%tEX3SYc65!7-108_}ykA13?COiLFHjUYN|XddQ1vqvLSlKv0_)f<=O*mtszxE8v& zj+n}G{(b6;sCWsqHL3IKLiDy0P#yWq`kEJq(AVVr_4*oD&mu?h(%(;`Uty<``jwpn z^efPPKxIVT&}?*+Iu@m0K|GW~)c(w-TIpEoRuFg6-#|YC{+`+m9z4v!?*RV(WAr1( zu*6~YBUiNy(2tP!8&WqSnvp^D$>r~H`#~-}sN({#^`uT<>J@hnYcqAsR<78lPj(x^ zb6S8~GSAR#GY1%KBmNV!OAmj)8uUyE6SV${FyW*?>1E}lfMlmKjl*Y5I)}fDMx^N+ zevd7^j>Cx%|B6u8ddT;o;{`vfD@-SReKOV}{`86+NRoabb@Ac`^=){+ORg-!V~# zzT*$%!QJ!Mq`t%D=as&r4S8_>nq$*-hv)p&qwm-S?$|D2T})T!uTwxgt^t+2hUCX= zrF!4|CE0jmTh?6;BhMF|Vis;!BHz`x2^}la@Lh*8Q}7>;+{6sayr1`_o7M?qKat0# zdHPPxfYW6FlW{-qU+=*e++h9oD3rgL5^f3TTfp-F&dOG|4e5yzM+y2HWm!}G25tu7 zSuJ>9XCu9FM*@C~ygg#VR>Oh_yKc3M-naobUHeRRdz5x%wRi#Hh17XT7LH8S-8yKL za<#Tssp6av08BP!WOVju@o540@k&g{h#v*MYC>*&T5e)OPJCL9@L3b`cTYe`d$6 zN&Y5>v+Kd$qPH==Auis=-bF?F0XTSBEg$gaa-V$oqc_sy7`(5IjDAry)P4sVI*%Jd zTex&2nP6PM^s6SE91o;&d~fI+m!)!iW#}ALsT`jlI>*RVj&q03@u)x9(}lo^9F z4Pdb_J=ze_0j-Vh<_G4^*4jQdM0AeUmODgrP-{EU6OGn#ZM?9n@D~seZ?p&11~%fI z-I_I}#SgzZgytS8zWzfWxz-V;sG#{ReY8*+%i7Y+P;L*0g=#mL)cnC z=tm`rOVD?YGP=CVz_^*lB>a7Bv*_s|H=Vipi+Tbe=+0!l5de}1T5Tetbod=BiMI2w zrgS_$@(67Dejr&s7O3}Q_m7ef?Eb9)2EE^}HUCIHM!>^z|H$as?uFxT;F_a4wAQR; z_*Q}zoQZV!>y29uLNC|o-7jvj<}s;a3x_M_X1>{z`Oc5ae61(*h-~LK^M2^k3 zJ3U2$_MEhcG4@+%)RQ6Cz8)D;_|=_bkTAOhZ^ya_2w2BHhy53T7W`|k9gzOgfbjeQ z;n0BckpbzCBfOGmP)KOL0%gFpYhtt&q{jLQI{+LJG!mV*W;L|=JKxa8Jp&GfPI`E) zHlG}e;zHD2JZskOMpu6^G=Fi>TFPn@J3HUg;Oso%1I@>c$fWlm>h)>(3R47!jL4uk&Ugu{T#_8aN4eG*-^yBx+sG~`f~i-cTd;c}~o`e^N!rE+|8=p4DJ z9G4HBV`M7Fn4xp5MdzJL zq2waM_gS7%Td*5(_=}3+_=|ODtsak{oTmu6hrjrtN*RK`fS+fU8G^s4R4GI77k8?Z zA@~dGd{LXrUtIAq`~~08UFB?N&sZ^X4%f?H`~o>;SoOw8#b3B^=)_*(@D~H49sXiq zw8LKvjCS~ofzb|s;YQ;I(8ur>QJ22}mf&^Tb&YWA6Hf9MI8~se0!(o=?xs8-j;Er$ z(h)rE$CRb;z~%A8FxT{M*Z-6`?tt+V%3J!{DaMv>(1c8p5bQo};ZZ_DMyc1cME~i5 zAA1&LJa71%0pYj7?|9Sq4ha8jK=`Hs;WJPlfZCppUl)E;`1vGzCgM}!D{|~5=@Hp> zb9zL;zBE0;Z?g?g9l4_F^+W{iC~~CeM=I%Lp;j({0jlge_CHBK&XU)uz2Pecq<4cd zdDFi?AiQfp_+EsG`^}5}6j=53K4S~y%P_=NZ1W6w5`@rd&cg|lcF@2Dj6A&12B%Rd zVVC3WRFSvA8i=qAeQ+>S`88--Ct6_VE72y^Z|0gir=B8KfdB*nRIi5CLpc z+yWR<-nS3OMY)~tX7VYg50F(`evCB_=isC2jj>coWYFUWU8~|%wC_Qbi(U>fE;?23 z&%#4E{q&XJKO*{hif%`0%gf+zrtG38vBgl23V_G`jGv{uqP)Za%T)hj>o#yI{)_Or z0>8Ifx6zG_^GP>0&L`d2IG=Q5<9yy+{{o@k4?eDZR;i|e6PHb)m@A^AV^~UHmbW(jWom5Yxlj^hSq&lBYs*k6WYMe41 zQEyDnw5G#K`2<*})Ek%eY0J-%uiNl-gnUiL*Wpr2KZs654sH2uc&aE*TRyoP^}yNA zZEtJKFM9{kyU_?{Yw|~k$MNQEA0U1&;twKz58_~Sa$8^N2XwTPg9#htFRly>2pyc% zVB%`cnCNq@nPHe^#6+9BQPwwhGUl77SF_<-Pu23u)-QoA>VcEEOl?{4xYikcV6))coSOpD4IRT(P*R7*q`DfB;64+P{{i63(%xL7Kewk-P?^f1r(Kwtkw>w(wle8$+`I;{_EO0M1& zp{%Stx%HgtsYR`)cx>}5DF8uheo2e`E2@PDgPqm&fQI@;)vJG)-PrbY5(8DD7)O#A@i@i?zQ2x{MpxDeE!hhN$ z4}t5M4<;APWyoj6gsqfKY=0H8!hfp%PYIv#7~m0i@6+KiN_d0-|MW}tDE0yN2lohX z<(wbY;}}G2T8DK-L|cYe3}$5N>vLMC zz27?HLv7i#j}Wn^b=qHAXY?Y3cLrwcZ=JTUbp{?3n1+`GX7sgAJJdR(A5PO&D+`4I z??I^Zxle-6bG5$_J`Z{D`E$SoY4|+!G59=J@cCK8<8yd=8I01^{>NqyVE+pm$F>F< z$7XlXI5siRI5xL~#<69A#<7(hG!EPWG!CTUpz)xfai9nXjRQFVjTa=*IBv2D?I~w3S?Nzd!~Q2e$9wMzpIi5LfRL&S772ybU2irDtE-C@3ah8Q z*(j{8yxAzMp7Lg+u)6YQqp*6?n@u`azcL-GTMkywb+LMIEc%&eEqtB`y>*7d@5Xiq zqxYP_Z88X-_eAtgFNsd!^9nz$kF$6cyA$`l@*cHiZ*s$j{0qB$LDu{JU$N%fzNBcg;ReApXVMHpAScmJox;`;qdv(zaEIs9sigQ zgf{?3<7W0+qI7cK3&S0ZSuFhI!^H1a@hyf}`gVz>9a3p$tB^Z|aWH^D2t32@SMDYm z0sM;x6{NgxzYlzF*#grfFe+Z?&v*+2EXKIj?D5+2f>rgMhd_{?GaqISZP}C~Gg`B6 z!viLVNrPlEY&nQ3!=^!Y88!{V%&=*r^bW`aDp}u~H>kH-jOUvAQ{iVZKR(i*g6)j4l+)?;~AR_o9O;yEINq<4A4z5XFmNQ{vb7%~a#({OM0kV#mc zhI?~{Ov36k+#4J+35(NkZ|;yuSeu4>LqjIH{!?QoVFkd#(ouIvU!OO4))jsyz5P4Q zH(aXBRswUsJx4v^9;2X~l)t;Bpiff`rx#RFe*I=TjC6~aPfN35&AxpFYi?rq0 z_nIrz=3+TpTbBKm*6bR9YcgK;7veQY`>j*h*3giC%P%Rm7FEEGX~AqOEmCj`4x@Ko8wKKtH6fKN@s2*mLFp z{%eV>XQy+cRo1iibKu+hVC{khrDC0j%!iYyX(aj&kf^D2O)}PAiMoUdhn1*jaYc!s zey_|b#ePT0)8YjOR+xvAr&kH^Smb>aey9CD&TXj13d*SswoW+dFBKO|$BOm-xA7#5 z-K<1uuwEX|3ii2(P3QzzubBW z-nE3OW$T6644>M1$&m~fv|b2l7@TSAC7Qyr`dYaM@R|KBa8RE60L#!UR07q$*6A1k zOwg7=9Z)@@bvn8WFA~e33aB34Ivu%iOJEt)0M$pfPRA6$d&IKoN4HjwZJmA$LP3O% zZLR)X>-6Ig%0=je*6QP1r=N&W2%(c&t3Tg5{bVJbJN^~Qprrf9(}Tz*B8(4B52g&F z2hRvSz`_kf4+IC19;~6IyrKubLG%D3d8UZupa&4iK@S{}9P|JpIp~2Sl7k*VBnLfk zL~_srh~%ILjz|uA0L?1sfg_TG9zY}qJ#aLupa&w7gC3+r@=r()hTDHb(gVy06w@K2 zTY3Jren`CQJeZ;Uf4dK6DF5GghI$k~aaA|L?oxCV=w)eOHnyDF5Ggl}I_E z3U~1)fC#>#3U~FaeBVoC(v?CL?juI$swFAIsi0e7YoSe2AY=i=03_is^uYDFHZ(o> zKOvJ>4Mz@2KMgsc8EQT6+q&}jC!q%`g&r*a)bwE8bco`goF06vJpP`o4Mz_qW?AbUcgf&@b2VM08AKCVm{eK$caJcQGoertm1qRt2loEt2p1o zD$XCkD$e(?it`W0D#DAfLJCg{Qus-VRm6mYT4kThX(n5%cOB7sVW0KD%Nev>v@)=y z|2H_k1>XkqDTqxS<*Dhn1KjE*eWg6qi&d)WZ-8#CAG$R;D#&qpyCm;e zU+kv(7I^WD3%x(6zVawkOz7p@tLp|ZM7Rb?!>{q*b2!3-o`DY6G zO;HcnYaO$x1;TIQYO3Kl=-)-w_9gfHM)*w{rxk-H;_@o|eSH>wGd={r8Tjn{rpqrX zH`HEz*r&Na%1$Nu#ogLx;};d*mpspK&tv`>_&72Z{NMj4@iE_&bGNP_wZ8@*JBaQd zjFo@tV&xSwfK>yra)<`gA!6ij_7OKbSoxoTkFy3IY0tg(6QW|VuZZ#d8 zg9qWsVFS@atMYddb1@(4v>qXkgc^&fPbu1C^omMrZieqA$3u1-?aIj+!pn&-9)Ru) zrWwH)p~Isb1z8C{kWUk zX?L;H?wM$pxzA0@eXW~&h`LoTc`5~zb&b7{-RyGAua>e_3=6hb$Et2D;1Z^%qd7^& zqpx4*`X)ydMTk9`dsXvaK%_ zM1^&_rspWvKHc%r%InOyGLAVdF#m%9+WD3?ZU;Or!)gq^X<)4XE$qkF;UTeuCRBm?Z3P+U0JmMy>hF%m>5At7!Nr@L3CmLu%S@N63`&PjKc@ zr2>qA1D~VQa-aV(xdUi5Rrj&TjS8h=`!5~{wEu)9a>31(H&Rmk_RXUSUGlPh5+1(e zH-pgpj$Ib*{4=$u8@lIMq>@@I8s||+5 zP6NNR+F)4hH1JES4Ti-|1HZJ|U|6g)@Qc$P-bssyl?Hxkv%#gyJK*u4gc21`LHc@gd4!*F}wFRG7_(7p%!HWt|&%~4}WcLjK zAJGDDu$_i)++d4ds`q6^PbIcF}Ah9%D*g}@p1s<(s#9?wik(QIHi4tedAbA7TT- zG1xa@6GGl~He1ia^zqtXPv_@u{<7>(UK>wtv9EXok_@Z;{S$>xm@fNWE?~(1SK$u^q(830GB>m2dG)J}eX$pe=B4D@ zqQ{;l_Ar3Tdpfjbd&eCz5~Z0E2lp?m_VU5U0V`V$m)LgQ$FV*stRzkz=pyQt$;g08mLgWOPsC zCXw*>Ks32FA7^mpGo88!VC7g7G6{kU{u9}du5{Z1QIdWttQ=Z?hBO79#&a;9=4C3; z&3XXz)Yh8Jn=cwZ6JYaH>za|Jhgxg=TJ!6;{7V464shU<+4MR#$+rk3?l5Mkfb^*6 z2{})e@v;xvf|*XLjJO&B!jsc~oAnT$;A#-~_e$s8BuqJ0!f%v?yZ;01vVApfx}eCA zDBaG$Bo3SS*k0Hr0FT+V{J<>tJS}tm779u5IhlWDpHe_{^FWxFIC(z>KNj@@${tAU ze^T~X>IBeG_CQ!uan9|Y6vA`>3a9P`xPYU?4P`y#dv7alpR7aXqK%m53$5??T7yTa z99wtcBFBRNMH*6Wu)dSoT6>hwo5c4BR8kg_GE+%&Z&uNML}z)TuT;?^5bgIwPg2n% z5k0~aeWr>Yh3Jur(4&;f@Zo;B{Qki))uT# ziPyDGxz0(kuFZ54i9(^%O-syj6Pt!e^sB_V*9of}Ho)-H5-dcH*1l8;pApJWBzti-(aFUs zeB!oF0H3fqm&{Me4^)>CYzfAY=P_2Bzqti%o9$8j#m05)>9l2YFx~TT0zM(L^XH%C46RRM`!wvU@#c z*BLkYy@fwz!#4%=)j8hsLpH9OHa4*1?*+mCtB&LCck9t`2bRINPSsKRffhReItDxw z(f4aw^CL*akw>oa{y5v{(cL>y(Qm+lzfwOJIk=fA8BC&NP{u1!U*VOgFY-#%=XfP5 zfZOiKiHlR}_e$q?rt@3l{8l-?5v#&)Jtf^L-HS_YxBIndfqr{Hi+)+ZJzI9^-- z(G&FBgIYAG-=3>QkJ4`sX>2DC?ab+L;BHT>?D~uhuoMfwC^n~s=qL|u3Y*pvIt5~h zH?0SxEzCp&$d4?h(F=DD&*?q>&Yn#DEqE&!eG;W~3w}ej*uu|aya#;nOQkixFW;Hy zz&bybEi;f02~OybNJR)|GC9T}2l9GKof$9Ptu?o^Lpdxs?ihUC=$ETjN8__5VBMIF zu1Mmw5|fRt=itUBo)vk@TuNv|GupEAwPn))Z!u3jJ`;3bZ8d6EBJF)K}Cn#44>s^5TS)7gTS&Dcd=uTg5=O0I9;g|`R4KcD3 zXR@{CDUi}gFR^iRdag=FEc(ZASOftkTeRjvtRf~v5~DvbA5%N603mw=$3OZ76`nTowOa+DOiojDzQKf2VN--MN~d zYy&W;Edylzjh0=O5G4@Y(*-Eo=$i>!DBp5(!f8MQq32RO3fXE_YGY zLF#! zzleA@Mo}kF-qO8Vb0(+4oxs@XoV!43&@6fx>7pKbRV{>ac@Y zJ+q6hqSN0zh>mK_l%-V_9XUfy+whfOou!g&t+^ms$x!`Ro#V{>;I6O&mqg={J??jh z*^709Dbx3!thMjKgaL|z#_HY|^fyO!`E^8KrhL2rA^b2E-!aBP@%>#YzAw}FXGJg2 z_xq#8`u-8oFX;P6;!Q&st9JPpIE6v65o&TnxJcUNZ*fB~g6;CpcSC49)#%}BL5HH% zpnPssU6pjMN2Z|#XBP5HTF7vY^DE{p2JE5a39>~TtX=)M^vi)$@yMCGv#aIHDm$ziSS z)DsYU3pX>bR)_RI`4k%wIaa1T*R1f<|K^Voq-&uJs8({c=C5Ec!*=2{j5OE0BtX97 zYao7TDA$~x&EO9Z!~&`8G=gCo2vlBARq}irtYMy6hy4wL{8QA;Fv^&r)r{dz^5(c$ zHiuK=ZxF!x<(Z*Q+>cu3qHnM;GZZ-m3p0?M9{({EJLIL06gh^+yr&%wQ9l+xO#5bD4b{0H)b zZ;pTgunR$q4a{H;BmfioUqcv&dHLV(J7y_8e9dYdb#;y#X!OwxB`$eJCn@x28V&% z85q5L+fHlBSl^eh${EJy0sLcM*0`-`C*=EZTel$<8JSMctjoybg;WQdzv%%I-UUWW zU{!@}|8%VCu)tU+BX1t*Y3Q&!>@!1solI#nZU-hgvA?z z(mw*}b2F(7zaia%iz7Bt_wznRN^1Wvj2oj%w;R))*8=6alKKaEN0w=N>E z1(R$IYJnblBnWZVSc1L_eY;efttK5Il)k`UAeq#kBk z2fFOC608i&5b-Ar;@}~OR)7vm#oc6o$fo8hc8HWn_=>MMY{j&Lc*IDN^H7SMhaA35 z29Wq6JE1i{hk6ue0q(1d%*hQdbAnpd;9!sJ*if|utZNlpr8PguvFvJ4{UD8c5_Lm& z?%(!i)+J7Ls3i<1G)T=eXB^}N`!+fHo%q7Lh0h~Xn)osMHRlF2T?$#LYl7m|F21`;vxu3pL`43#{J31fqYj+mDC<~#Ru>-pT2)iPE$i_Wcx4Ue#)_INf zS<*B>RslX%IH54v2PgYuP9&R{=Q3_N!J;6!g`8HSDoq~icp>K%X6PfVrXgHX7Pp{i z)47c{of5zoM0^X#x2r(}ds!?XjgXejTtNr%Ov8TfPk?>6cUUr;udM?6@j^3P2C@>g z-7F^`P;W9~ch-<3Bbp3Ur7%*}DY8VK^v;M}G6LJA_F#kjU@I`6uO3YT7Uq)OYtiRF z1H1hw%KyowK=-r5l4U?luPp^!Dh!W^6rPJRTuuVQ?*{FmUcyNpvSMD~ON1^(8QmIXHI?;g4Vc(Z^}6&c=uR1*WLw&*%}O*gy}63nOSZ3O_Txhk?j9?TJWE z&*xXlij7mXN^bIC4TaM#LkwO&?~CP3Ec9X>W3 z+zdS`fvno;7M#0|qI1`8)4A(K5YW6>$f`p!|GDcjdkD{&A)&rbqM1<75azX*)FI*F zbV6#C$Ms-nRytu;G6$D`p@-554PZp-0m3v-5BQ(SG zIHlL0;W`NC#JQ{i#x$?$R26=lZ-T1xbj{!7E=3d500f0l*i)k?Ud5)Oo^PEx4%*j= z5eVar9tWvwljfgWPb4zAsD+U!W+ewyC_I!|kl4r#=6gO5-JOVlx}mL>5p%M;c`BYomZfCxEZUxjcgXvwr}X-%R}`x-Z1sYGS>JTGMh1Kc-^J=NBGJ1P z7=)4QW#*)^`5Eie_#Lxx5H$WBvft4OB6HTZy{q@;-sN~i!n(5LI(NQZ@EvS^lXR4$ zuJx)X1o@9xX|wU0X5)RpG+1`(j&NM-T!q2%lc*dx6HIis53lw0r1MhH=rY)B{F>Q# z7x0eBjK1s5+0V^0?gAce+e0e1)bB}Bc`{20`=cFs#vwKK;|w)dGZ6dNV+_d?-Q!ie zh^p7@$fz+$c8`6#k;EV*Nbx|U{s4k9bN1_P$j#|($d6?kQfM&t$|j!>plWx5J4qB) z3|T)j7GV;%3zL{UW_YhV<$xl}hhfkzi(#Yz!_3Bu(T)bzDQMD6SH@7|oShgfa!Gx= zmblGmQxQ5`^G-|LUR8BMJx-3<_i0PRhiJT&A}#xBN4t_D*zd@68%`P-bmXSx#(pqU zt*=jsPG?qhUvgV_HP@e0F{hDcd1NloyLf~>gADKnA>HtzZsCR9!gITY zL*2qN5QcB~0lP3I$Od%}dQkND2=Jg6p<5*6L+AzxCOWSM3tf2S!*q}Ocarsk;mEZbJnYEZM&s$RMZ~SCz?1< zt;Q=J)MgLMrNHf?lQI7}MVO(1n&0uGBGlRh$V7HxA<8bjdd!Cp~v>gncIUhE$knA9FsjZFE zq3yllydO&Qa)7W$x`y@N!G=GS!&-ID$LRA5sm+S z^2^1(k>k_xo(zM$6%=pl#;p(4RrUiO*yMR&mzyM$+SBE@^%$4l@ZYF;)wYM_sNXA= zp^NLiq_z)T3nfco5eYBwr}|Uc3_3z&H@%0hUWd1X%$!5u*z3YEISr%!ly>>@-gK+e zJHzK+!f(6D)nBHB>6ES1d7((S5MpTO@ognJ{E!&29d*Q7gnGnISteztCeg(e@dcZV zp%XDh^WwM&y`g!g!9lFGI-v6W?YAv8lA}yy1rM-T?-$~|p76k(U0uIO=6lx7_Y(6p z1r*MleHrgwgE5ic%Ut%Do39CZbIRj8_GU!Q2_CmQyZ!`?|9-j6Se1(2+H^bACwUKHdt;to=K7`H1f@4Mu!5 zhu9*O2R$_HPsKM*I7*b~AY&HzdO}==@177t`}Krq)eyS$e+QYAVRsmi>l*nT-|yBw zwas#_CW`8C$ye6QQ#N_j>2AtDBaAg(q~b6cP1o9y+QX8E#uIy5rkgU2OmtJ)5Vo4K z27--d=rYg{sc6RD+K(eIQYl$Hne%P4@di<9TM!T}x+Nl0Pfo=8xH=7+98soi-9($;tQwe3w=>q6d{VzyAZWVvN=+S1Hc-=msDi-h~ z@}I3F92%g%%|iXU#~u2|Gev?E0cKb1ggOvidj9>V!m}8Yk)V+N9H?-hmF$C zv#GR-Uyl^b;r0u+@eZ;_LAyW^SSN8>;9mgy0u>T0^Ehb8T|`)>&x2CJzS^&x7g(@3LUa=?s_C6;WC>(kio z;-)Gyr#15E85TF+<>JOT*OfHiAIdZra_a6*E}^1ETXIU!!|Ic^PH`^FWzA}w+PtohdoFZ+bnkiWI5;9b>Vy$b z8hk9)Tra~D6OMya_q3Bc_ZN^bnX%Qz#_e9-T-4Rw-A%KlIAJH)?HY+~p_w&;Y=I0mY{8 z3-xarJ>msi*U4DP8D9Md%kfw3w@3Pi$8ZaQariCAM2o)_Sc~#E5V-KViRul6Dg)8`%P4>uehFu{OWZQQSFnKX)&5sO> zzLkkdA`L`5a*?YF{1JKY7yErBe&}2ewq;dt5zUq}o>tY*;4~^qjZ8*-rm9||f=kt; z#kJp$+~>8h@~nPI1)J22<+bA@lYQ8^Rn_ZNaFd#}ruK%&eYx1hRn@PmU|h{;t-UHT zIS)I!s(QByzN04XsQr56zI^LsUse5q3La21+G`6UlMAeqURB+xaFS`#N3~~1?kiN) z9u@S$a^}HHK)5y+$@9aju-6RJf1{l6KsESYd9DFIz|9Pj{$3{)7*?|%AcZ+#Q-Sqy zR&BpX<>El3c5zwadCUXr*HB>ejlEj^UVZ=V)(5-6egQxQHo2u}4y=IRv zVr+#ByylEXK%8)vJEO0`w+GtK9+s&gbeadu_9AUqRw^Ill4*!X%Q4>^`nbbcuXH}% z`$Q#KUUn)UlU{FgmB6SvNAQ0J4N3zN{D0-aUdj<)zj z=tDozG^%3)jT1}R#e2_0Of;F{Xt6^wknNKw`H2f^Pd3!C;=R_#S33niH^b*rgx8eV zvv^!e-;vb!Ny+5^)}ED-xs@>TalI;+p=SDnPIfNX@-kavhwo!Hfi#fY4lQhlc$0HU zZ>^B)QsLbCiLJ12K3ZWna3}4(XX0-YfZ3`F{C(D*nt5ja{x}H@{sKDd%*>sTghopP z8uuWw&)nGGOlIgTKEP&1wohseuM28VHPq4KgtW$U>DI7PtpPJ3bWTthEF9nI+1#tp z_sZ^H%yWhQliB?MKoW0(-Kq07XOhrr7a=87_3uFdqEiBMLL23$c=#iy!+XKh3Mq8Pn<>337C< zZTgY?&ZtxJJG1Fw{D%B>$Xpi+PK?awHQ`8DE)G9Gewqx#)1b{clK@;Tf?{6}`DY-= ziyWxM*vR}`F6Ejr85xPDD0w;X_kwmNU|?5f&N??IZloOkrTNHYjO@$V8;j$1S#|V1 zPuBB3poq*~DhAor>9>b6k^AlpCNpz{exaVb14` zjW2+bjN*fOrwBVn2jv`w>O{fS=F6?iG1lRv1Z?n?>Ov6aw<~b^3(wJTqX72+YVXnB z6lL{puKG6T{u|_62~B`%n{lXZw-h0ZN|b|Ksuf#r;7q=f9X_nV0b6J^yEN=YPeswI zUu4nh8V^WftF*msyg@R|(7X6@SC!_f3uU#zB`h|7QSJ3Kl;yYW29kWekVT2cHnkr0 zM(y1S>)MkKIL=R!WHYR--F$gHKC6{)iQ48?om-=J1w4skmvq&IG$n%Rw9Ul;nJ-2< z7$I8Q-dE&qnzhTxSa*BwXjXBnu@NVJg{{e(11L-lU*=gQ_1p&Q^t#L}pqEO9FQLJ% z77dNDgPn#P|AKvM7p`G&5cxVLr_xfIC9i=)ynF$_kXpdnP&oH!{u%kJBfjTgPrW6% z3oE;o*u*v)v)Xo>jjd|_Oo#$2*tR>`4ns*qWCJHY6Md|vOa-4)Xo%$Ixt5zZ&6gc@ z`w2B)wn4-mTOINI76Q>rG3U3vZ8pC0zo;0^RO$!CQvzV%Pr$%xy#=g0q42K{`4?AD zYW`J$e^xY;ER4(MY_z>kYG>9sY`%Ozg@u*(p3w3}LC5JjT&e-zPRD*(+a9xV`=5n9 zQu!#hF-9Xn%=3VpI|j~c8!%agr`(`7*v?M+a-FO2CaoR~QSuU4p4(5F>XDc)^i;0)Or0>@Lywa*TCosPW** z6!jsLPYsr4!RT?kZVW7w%sJ0sV>r4e6R1W4B~kN@i)wpua$ZnIY*^wD+itoZC593^g!3faxH0EomB0Zr(0_a41_tr;gq>G!t{RkSuDTNUDsiBg z`q^w4j3z>AAzHE&69Fn${&Qy&ZjiGHH^@l?jR}#mb9IBdvj;ah#AF&LLjHzyrrB-~ z4Q@6LHIO(roro!22JIL$Ok>CzDi-S0!J90cR|cg;Nl9?e-Ec%PR$tCUEmoLeXnQuU zQF(4cZSo_t=dm`nr#_O4yH57(FBJJuS6u%Nc%4eyi@50SKF(7aXmB^tUfPE+Om%Lr zb1I+rI$z{695)P%`WP3<1F`a}{T7_6c9ASUjtUi4CG}1J#fsKhVFzqO@f?o zp*j*R=0|FYT`(W?VnnjbW<_^r6-OZ!)|<*1*#wL$+DB@l?bnRT+rCF5=TaaR zp06AGDX()G5{m435BfHq^(d ze9CLjlTV-n4TMJs76^(K4j@B_S5OkL4a*yBdyJg}Vd67G_py1|J%Dbb z&8JqgmqAcZPc-H%HQ1vEKeMrq!Zg0eNRzmkBLZWp^5lI{@RJ>)95#V+ zT(1#LCPiZFoaM-lIRh%1)xDfk5K{t+J^|>mb7))1@r~#hk^=##DIfCjp&m>gU7Nr zB9JKowT;Z?EEK%b1<2YBVh9fS+d7m+uW5&NHE2H5SLH-moDr*wa2pq9Z}&B#8X0O+ zqUn`V+d9ZC+jB8APzBP;P-l`J1ljrEoAVRVE`6NUkOfg(&MbC*r2CaEq zrtWB=adXE82hjvY`-qB4{1Z2PG4e!~@un0C89Cq&=JkI-RDnHviA+e|&9P460@cmH zt6ma=1_rnS@yCZVWpj!VZ_m$wsc&w^alWN zT6+ZPIInGnHb?;T$6rbSW`jBjcxrFw+3l-%cKcFo?TrPPlo6{-;zXIypFI+@g^Ici zZ1D>$|KMg}9e@6Z(^&mKk{Z&IrYRTUx{ME9dh0T<#U$xgrf7+>p%)MGXx{P*Ib2%+|BOBn;|gXD931X4MxS=wD|_zUpdwuv0DjB zL(W1KDk%jfn?}=oxe50zh`4ur$^05&Z%EWO!EwU1`4~_xaNbgiS3rQ)TZL+W+@ zz}o~SvL4eN4WsJyl#Q;mr;YBYYoyu_E|#f7u#nj|dX+&7*-;eDm*_Y!7K+`B)-uf0 zL-gH>b_wucDX$!!VmDK->)Q$(Ia^V$Qf;w=$&Ev@w%Ki=%1!Eh6i}+oc1AM_%~u=L zLEt~dfL5l?QP+F)xGnR29EEMlHI4vNp|zJD^x>!B)$Zho;jqW;i8L|pxpUom`cl9t zX3KUC5^O=?#zARC@Sk&*VTKViSM?>UaXweya@c}eu5NozhRSq>WEO(KsCczLu?K_Q zwl*@`tsGf?NE;=;?^WOTS2xedjAbO-v2rSo3P?9Z!Ux#4@}*Pv-tnN9WUdPERe7f z{srxL*wdgLFEJDs@L?+&%TY05;1KpIZtlFuotwn7xL@K98qagkFdHva2km<@dzg)f zq^#3aJKNMDTw8~MnoDBIWE?YJKI+=4%k|RAeo1zR5?P`r@b<&Mj7;<4k^*YEZGWWV`KEjv&%sSgXuaJ2Y+()@ zFj|_}k+NpwW~ylcGxQ~DKOA4N%N_)T9E^#!`!LYi1=H-jC&&Xj=b&!HE;La2)YfPs z%X+^rYMmSA0d8C{!GNuL7OCgYxTkVI@2UJV_drHj z$Fph&TgN@M{jKBKwO_Q3_rcMUJU@)Fu|aIDj7XV3=6RVR#6=45u_F25!N>CC2V7@s z*9Zjr#5@DG)?Nq7+ZZuteAJe*1KPfRQT<@ zN6-M6>iG;X(KirlN;BMsPK7yQKFAOjsJ+_O!BxeF<|D5GC07*>;g`2S@1WZ~%n-9` zt9T3an<=+@CaNnpgJOdl*EaOs64H;C$i<={YpwWd}kpJwAf;F?A)&Jcy3Uf zCQx5o!LEymH_9tyd6;a$q1Z%dlZc+|IxMAAN?EBl9Yz~QGp^A^qkG{_MZF0@RRRjG zx4jSD75&g_ysiY;E#*Fs9MI9lup!+0nz#`Vk*c9Sol=g@#zWd#dvQb3W8eg^OxCa= zDc}%vtk;coD5*y|6;E`-2w=>gJO31nq$|l`4{0XaAqQk)VX}` z&%?QulL@T3&SiLKUN7MBSiN4sIj0;POoB#MVgcC5y$B|8xE z;ZFws-xP0#ks#`9i1%AG=DLZg-vU3Z2=6-4_&ZMaLL|UY&=kkXs9k%V!A0?w_@Dp^ zffVB%<2c?d{&^jYjSk+`MM?p_Ftfu8$?-ujoMNG!fnxeSLoCg(RYaX8XTz=!Sd_%A zaXfw?UmNeYfD~-r^;W#!(+sTvc+0MLkOmrez2yupiEoS#sswrzjO@emQha%mPB2{QQC<4+KYuRs;DOmr0w@4lOR5nuR@N(`xWl*tEg9B@gL%srn*ka3O3!w|M#KcW&_s zKV}KfgmZX~IzCGns@W=BnME!pdFeyCe9GVb&W)AMjREJz3g^ah=f*PU76@0l6R0G= zO31H5vMP^%y#IZE;aP3)t3dPX8V^`UPF(}9R=KD0sJkq6=g|g;&PJC<;GFO>DN0Qg zrcKT*C4c~zZpkN`@LkAnu*vUa?b-;=8_q>!&^38vsIcZ5FPKSbxyA=>T5CMFj%#+` zLodT1?p=owDg%Em;GZw>&xQPxpM^gc8TfNC|6Ia91)2DBDgRu?KVKwBA^&`dfBw#c zKY!0Zej@lXb9{wxUu9|$t$77a6atwfRi( z*rW1TV>A2&2ZSYJ_*kIluvaMuYW0}ecuXx%4hC&+%RqpU!vj|;IP;M-O;9^aK4Xi9 zR)S02j~UNZ5lQ)6(BaU>=ZVhy8PQ?E-PWVBscPz~xs}Dv{b!=iMYm18sfSPus~AOv z%bJTx?&aDg%9!H!v8}l0?6s$2?zHGnYO6edx2DqQIjq4_U~FNt>0)&a27Zy}N7f|$xbd!BbrSVw9XQHu3tI?t-a~~nbE>OD3jIlT~j&^dn z`amvQ&am(2`yf~X;QZk!z3dC<7C2qhOCRgO6tvc#*Tp_Fwm-eW&P3av-dGyjpV7Zk zP5)`#%l0T3N`317TxdpKPw>UAR-c(QKbT z(p2l6T6ayY+1QOvsmW)k{dDxU&!1B4+Wu)s6KW^iG_e=&_ZlDS7PAYk(+vf)gx77X zd-LqFOYA%OzJ@Q+f(@6{`5labk?Y_V%r1Gw*oPq(YT69HPHXyHip@%zAgE~J;VH6& z8q4-Qd*n5B+H5&nTKzA-7_z&8(7i758fE&P7$n`EUZ{@IbV0vwU+YF&!fZ^Stz98_(14ZTLvPN<;J(K=4tf5)CJz#wBJT~C zG>!ZUSWi>kqNY8>@A0B0OZ&TyY7RzA`BR6R} zT*;e*mqScN<-ADS0pBa)tU~kO9#?`*Ll}j8Zq+vEIm9QAOQ_m=u25hs(n6v2h>T>e z7d*IvxLEgSt(%Pfr)VdPNYqa-Oug4vYaOUzH@pvn~rXFKju=>^A18~ zbzi6?yV)CDsGy&{j&!lNe<=M-XVTNjqxMYnGc9_<(9gb+LU|@}d7TD)thO*Si(MxN1XSg-kItT91y0!Y@AfsQ2S=%QI*Il@h8Uy z%_wLi@ac%!PqD&vNLO1Mhf=&p2a{^q_i;?{$(V3H=bXTgabY~iqEn0MUWVY0l=i24ETi9Q^$i* z91kEGun%)lY_!@Hb+KzlQt{bkKV-iQzX?_=r>|%HGW?<(H!0x&} zM?m{7ZoX)fs4fMkm9%R)+TDwfM((I+YZt3@@zLmRULhG;u9_oN-j`|YEnc_n$^nNP9>z~3(Xj%QM&Bpm$mbrb8?6@EE55rWPOMdeT&h5B7X^oQTO zY{N`pe5CS;d^Amk?OPjoA~;cwMpuIt&Z};r*YjY~{~ss_H{Cr#UXreioU1lQu7SsL z9JIsH24E;f4a>|%SkQ<2hi7HFMUX2sNG*48!WgY+55~iUY>-N1E4QVDQtRY}=EF8g zhlO0V;~|0MEu&v^h{vfgB>3US?s{lLdrYTw^g{EIufysHVJft1GW9`+m24KXvDzr! ztP)7^!+*#1xv-+|wf5#pmVGd1qRxeOb(Xa+AFT0P>+;oWNynRkOgS2hH~wIk$8{Z^ zd^r}~ixcB{BfytdQ|&+r%89=3Fh#FsPp1vz0RA?S)a^lPygtYoIjZ4<~ndnt{>bWW!cj|I5o#VxH;NS&2g!l@QykT z;yYNkTZFoXuRw%wh3A;Z+HFRUdW*L}9c{DTGOeTVviW~G&&8?Qhe0LyQZmu%Gc~am?To4YF=S31FdwF0awHVu4NE*<0hI8&t^Pwx z-6gIRw(XHMg5T=EGft4a{|hr8nZSIwikt+$)s@;P-e|z-Xo`?sm1}k6N+vqEOJ)L3 z@HWZhES*zI;epNKs9lBAlPC-aa9$`R7mpVo#Hq=HM_xD9wY?AKTFoYQH(|Ck8!DvI zPbOKE*v?Up2anE2d*VW)8F~{jtmdK9s~NzXtx39jtL8CO^Eo^~0)&B2s3vBG(tmfELswobuN{rW~p7xEN8Iv7PvWgcazQS4CAKmv@-3E7d zLqIM`@X>8oU?k?^#CnJn_~6Hj*Ehzw-HoH#xd-f&iM+}iaRdh*juEEw+~7pd29VpsF<8W|CX4` zGVL*$AYtr8ps3dOi%YCTuGMuRL_TOfJe!h8RPwel;VMOyG@$uZ&L_16A;E0&M#Ka`Zj@voU}@8&=} z)obP|(1}iMs!nR!;kY6T2C`-ydE}qDD%1MVFt*!6GXeF3i_x(*{9v!qB$36dk*rf@ zyhp|(Zw2{a=M5ywRuUx+CWQZZ_b3b~yf1Wi1P}W(djVXD?{YAu2!)m-QyCyj&BmOp za}P%%iXpppTdtg1eZYme&$nqbE@j9P?e)IW+<9YAws)NV(N zALq3iE^`q(=R!*m7zrG>%iJ>TysJQ6fMkWYOPz68BXUk;99A#%KT!$zbe*BS04a4o zTj6{)>%2!fI9(xiz7=(j5P%Q5qt5zivr-gSWF?G6^Z-(1hPFe8lGkt1ai?4V$5~Bi zSd*i|0)ErTO( z7+a$sX5zHSfT%g^mq>-1zVBIGMr}17udN+qb!Fk5!7dNp74FKe#T#dRYR|H(ys;{@ zF=k-=17cl&9%l|PRX>R{AbQVLI%_N-c&w(vSfHJ_Vu26zkH}Ok@R9!Nb;)GU>Q8Iq6Z>Jrp4NnXa}2fjqC zR!4vX=<|#xm|)fAJh;cc>qG0k14nk*BdM>%kU&Cd97>QH%K#sr^;||XvL!V`V*BB~o&WRzSI4Cw1pDB3AtDW~93gr+C0Tjr@ zJ>AkFQx&4~)K>Kx^bkWUj;g+ z36UkvZYT+7+=0YT0q@##Mk2b&*=_ChLcs)`ixLjgQvQOGku_q{Zq&)SIPp&$sk)^* zyD`v(5jmh8U8vT42W8u>~`rF1+#(J`b6oJh{9; z3gv?-2!_(ZIyY#0?!leP$f7lV+-00wiB$zA&67}gC74`;)d_F5a?buSh)AwaDv%kg zFZOc8marx8Th3VgPT_B|XY=fO<#YL{cx7_^u^ss^cliQmhu^0v531Mod=JYEG+t;v zQ-F_`J*jX$#@fLm&RLXLJ!MPS)rR(#hqVLN4d2yPUOz@ndqk)C$Xy&bt22`z0ET{) z^Ss5l5JP2&wZpIjnAwcVwK%Q$2WALnSsnS<$c1|Mt2ug(7|7Hm!gqYHD~9(#S#rg2 zTWZCyGd=HL3jn=h*mwGhVG$DbgnjbqD~3oir#<7D?O?ra7H@`s0zMQ^4;g5-FyE&_JM%Dn8Ey#$I5$r&AAW;0_P8+T zw0iwO5R4_VeyC*gl$qgU=w2`@&Gb*ft(O-m#u1YZ*SC6~>w&tEa0yML8ut&JTIyac?5lzw~0&b5; zBt)a2Q(%RmHt27Xj5X)8V=EDlV`r!kN37nph2X4P{7afUH*H$;;U=qayezuaJy{)URO|7d6-3)rM zF)S;U%k7v^`&zx&nBpJ*LLn(TUYx+1DskjBNNBTZti?sFhW|kScBlVF7ptAP52Dnq zk`v6(CRUqm2cEH_v**%~^D}oV5P|1xBV|WN0wr+012^ zxy(xiKhi&*2L`#`!a~a(C@^55yg=k3nI-M>+Cf8!J8iSERBQ92ZSQfhby!we{|DvR zlQQLoOYs)vnxrNf+{EH4tAog_eR`EuPT*--XrzEFuH4s0sx#d+7jJ*$w3*9L--#HF zRRQ45RhwNNj0aDG9T({RvQ=KazM6#fRg0{z+OfWB(d(=A<|;3ULJHPbtUWR!a{#t` zKIQZctsSXtgXSt8Ppa(SgqHL#GVrvyUW81+Z2Zc|P!B$9fC9IbB9Sp(duVRtCLc1C z0lWm38YJ^ZRz>7&g}bs?iQsu~$U;h7_%@=erA|{#$O?G@5oMywS9mE;(YE7Z4EXxs zHLzlm+04Tt<394?F41`?Zp$)_8^w?!{-~|A)7hoSre@100 zA&fvp&CoXF4eujo%{gUY^8k3GFdzN{WHL2@EBxcbd`hA4?kg!>K;VmfEBThf!(bsQ zI&cC3TVxembSOC0dr zxtV<}A2c1XSmM-(qGV4S><0j6jplcC8Xn73gGw;*H;H#p8Hg*y*eScZiF0s?GpVPbVvH_V$=rpT2q{JFs+m?? z!GtVhs+jmC?ssv$m~xm zJtqmd9q&7xvF>MC&1WZp|4V>BvHD4{hXw2t>z)J~->vAer?V&tHUMDubi*kS6KVZP zvk=`fOe^Wm?2PrniT#`46p{n^w40V+7RGOF$BoNZ;djQyUtHUW-dtI0 zz%k>kgS5^X)Ao`(`Q4LeuYw=W8hoc|D*IvC%X{XR~;C8-NY9@!k?8;<{3M)*P|oETXuY_3BS$-b+_UC_@#u|nZ4Xi zSt2Rz2hKxo${XQR{QY)JeUigLU8 zZCUoH3+%hUYF|6RigH4qZ{H?DjUgxB9(AF{F5Uu8vW28~-CZo``HBDSYX@3uJyHx~ zfC2}oyKsJb^R7c+&ZFck-XM-|+;z}-^dt08=ax!Ag%X5d7j1W(No+}y)`FlYA3iE{XiTikCaY?fDoY*2vuJCo2%k2vFwa@uABI3YyYca*@XyQem~Rw2<^8# z2o)i8|G<6-l^}HUpaO(S5jyPo7D8nRRTkflP&q=*osVDboQ!2xAiTHg2x0>WjhweE z5X`Ck_8^HN4rzJuAW@>*%WMo_)dvqq-)PBGV1FUqKsb|^O z`%aSwO85rnIPMQ@lD@F;yt7b0LE@xmwE*m( zv+xoE+2hW!)}1BE?0C|@lZ9QK#FDH_e1moJB4+&urof$$7MuP3w>wRVb*SfD=)FRy zS1*1c-2w1{!{EPPg+ZffN567>JK3G+NpN#qvJ*7n|3d1xCo^tAQ*QcWv*_&_grOCm z%t!|6Zboq-6XLql0c!8g?4XN!*y*U-(LoBH3=knPHxUWG^-mKp@hx|lf#v=qna|qq z%&rDTsFOoG<4$`R72*Y>_))0sP0Wo}cJiLg;Lk=~5%3Dgr4+Yj7;*U70@W=lVn@ra zjb>;iw#A$l)(o?Hz5nRY8+0#xdf*?=$S3q#=zxvr`x_H27|$@j-5Kx6j*8PUw1bt9 z#Y8)DU=HrD?%#w#uG)|0!tY4;x5lTx$MQRJ1(!=ZxoZ1vms7{_<3$cH+Y-)#C18O) zGba-+lm;9#L*GK1@Gj|-NTxacL7LP51ty%@5!O);t?SvfU$u_*sXf=J>m(iz0G$QP z$;i-LVs;kJB~EKKoE`lIB1ohteT^LZjo4Cm%XC5uGzGd=WBNFu1|88L)f@^JLOmhQ zIu*iqD#SU~>f8axdV=+YF~if)Z>*0EbIuRJJ^TKXP8~;Z8t*c;eF#H0_F(op3zmW_ zrhPLR+@%k@VmHPN(Zb0cnd#h-xs^LIgSjJfId^2vcj`_M6ID1CS_@w4#^&9pGx{$S zHDIr4KTQf;mJh`)ugCsjA5f&*I>{Y;pUP-Nxs3r#6z7+2hd!*^~=xjs9Z*!fl4%gRO976O5PW7L^%;6B|O=r|Bpd8{%bS z$A+-i;U}M8YDgYDS#31dBTs4T-d3Dr-m8ZA&BiwMjo6R^$U%m>IX5<>NPssQQQ+_2 z+M#YJiw!AZ_r$s9*bp&;#)eb~(4B>`AwdZp#u{yXY{+nu&HuY_QQ36GB#jQSfcKorcM?|twbsJ?BJ7T*!S!) zhV{PDfWe9sw5U0RRyBD%DNv1#Lz+wQ?T-a~EL8m8sUQvz=aWORKmlV_5c`NlWJ)X` zn=SUNCHNSKVaG1J&Mv#l4AG*3EzU`1<0!)(m&sk@X+6=CS1VXs70h$dx9&v&jCZl) z&I}4*geq4v@H*RrYDOW}?3H%e=9s>Y{k3hsqbXb%`^zHGw@+9o?zh{iuC?CZDdDfwwBw z5Yb88AyzY*?1~5NvIoe=qwqFPplPq-T?!#{x0>{hnsGn{KLV{nX81OA3XmAUn!Xf* zOg}sj;!)#Omi^uF>RyjJklgOAl2%9>RGLa-Re3^Cl{5lg6{#v9rLihM32g0%Rq4j4 zDq%EF^rC$mxJh=EdLZ`&=2Z_A!n1+#$8J0d`c$w$da0@o**D^ij)k~s*iTrgsu%Mm zj_OUZx)~swXk!6!92yHOa0}JUba{wE(af=ca8fO&4pwlNK4UJJq-y37u>oe$EBmx( z(5)sdB_%qSFihABp8gfon5vKg{bP*SU{Re&Df!4e4u8W zuq$rjD4xEY@Tb`-Pjw#<>`(F5c-RrS$$Wpb3JOsdhW6QHt z$ssj-gU7y8;ts1a8ZgT}_PyBzr>r=P$W{gDuVc&mNNys%}1k_!5bq0w1X`$CR4k8L)1xpi2!{ccW^p zT35HZ6q+@r&Q{U-&4E(voNuY)-wjRpTerD?{nkK#2;gLon(kG2NO)K-a^05)myz@X z5Ubzpl{`Vo)4;zi>-l%9SF+`+=>=*;p&I6AwxV>lAd>61& zM`*5uUP7oMJ2Qwp&SXl zgV1#nYDY*(=mUgWBy<3wb0zcNnj3FRR)NJ9AtJtUz5gjP$a5TUaqGV3 znHuWB=N-9qn?2A(L-A4tR5|I`+(+G!&nO?GgrXLy#2r+}L*Zf;u_(H}Me1`$31bTw zOFB>ubw`;RT8N02I#y(8k&4!}G^wGbD%y{Pt3ef@$P0=_Xc)_=@rWznU%dbXB-fn)}MQ%K^>v$YU^`;BLC^V9s>vKxQlDir7D2)&|?f2|Py zTFuq!*>ZkHD)@O4T-psTbvs)J8;j#yAO@-n>S#sM7OV@zI&}d}Q#2O2R+fk0CXWY! z-SgOdzv^Y4CF8~vkBwt#$oV2K))n}>-f$K^*K`F6$JKB5`&oYD^(cHYmLP6a*6C5q zbP5#aZKp={IX$ZH=}}&5T}~?2I{8DlTr)fz~p7$aF>`7XmB$ z#cJM@%nOU1xh!?kh_)7p+vlnU5 z%rk=4cL&WnBWP83P|q1b&+ZPIeFo46Dy`-|E~(b>3u`L@D-6JLATP~ow_dM8WYuip zRbnf`$@87WF;A)s9CyDI!5akTvdNX!K0~!fKmH;(c`UPduiIW9g7;uozG_%sgb<&F zSawHM@31@utzkE%VS~NECQSQ{6l`l6c4+UgKTE;BnuZr(s9;4tp3qK=b#5G;B@pu**`g2hy-( zdWXF)1^ZDNc5LskSEpb*)3D=uf!%CAl0{ffE1o?8SSvOa>$CiF{3&24Z)|-RFB6#I zRvhoO)|AMhW!SG>;Y=KW?Tu(;+0sK{-$Uq#;3n2)(O9SOZOoQ5}oXZ z8b8^Wcq#o&)+g%H-)y!-W%`>+Xe^b8)rMF5M1qyDRc(WIou#R?`i>DkuxSA?&KIn ze{qb;bH)G>9DBv#feyD|oiSb~6W-`RB6hu;F&=CY`QkWQfzJ|WOeH?O@fbe5&X@{( zCA7OVWD;j`&f54}@wbrruCqDbw2OQz*tHgrg$_KcMdK6v9@o*`8i2v}vuh1@ zW^hG^$dGNVlg+(Ec)MHeY}vI3TXX&9(iq}v3XY%kT_ix zUmfqqy+-8n!;Kp^8xdXP7T5%Tc9?FUa!p_e1b)|kYzyJM6I|@kof{Fr5uWT!?rK4U z(61ZZ@NI+(xE8>9#JO7&;ItUvh$@`DVRC|)Qn&UnssMX4V#;kCyU)w=4d0r?hv2BH=%@Xkkf zb7)iiPx+9IR%|+=$=NP${lN+GEXaL1)*YpC^BC-X%aKiAFdJu@h)3im$pHE#d<)b@ z2ujHlI!>ChN zhZ&yEUe4?zopC;0yiXVJLpF>i@nCs;a5>OnPXPr7bX}dg5VLc0eOyI6SnZ7SvTS%@ zgjYRbtz@l;53T?jowZ!D)-@m_xf_TFhvVg4W`mnaI0j@k5)}^y;)4Sy(JLjwmn6z9 z0?~D|nF@YYlHj0o8S(;EJPS_!f|c>XmB^1g)|yKA@au8@jr0Hd52m0Yc%G0y`U%dJ z@*L;$d|eZdp5YYCaF{N6))KeOKm01}TCZ3*<~VOPrgu03}6RqFy1TBP7H9BGtYES8jF{Dyzq!Cd$>U%Pn)QapL-t0#)usU zFSHK=ea9Ua)+}y6SSxG(6-C}X;*Vi{fOV*~vV1D?JaA3qQl4OqJRd;T;`JbtJ_tSY zaEjGx4uI`Gg<}e45gbTs-v;uMrOQ|;ulQKXdA~pyaX8J@56Fct{tCCo8(@|fQ2l;T z^sT-PLygGuucE|=0J21omtl`P3DzkOACB?1-}O~`t=9KuU;w`!t^%qu$)RoX41?wk zI74T(V2AeK-$q9a$6ZGZ#^JX1?xbp_xcthpOF_WpHp#G7dhyq|sO!iZ*87>oM^OVI z*bE;wu}D7J1s>jW_HzEHFqw?EE#Y2qH(Gf($f8T$QrEd{=ndqE1bpCR5gQygQ;J*) z=>i>%L>AKL8{}L{i_(E(la*33kU=-$Hyw!tCL( zA?#-OiSq}J1->pG*sZ9cHZ+9mKvYvZT`qxqcxi?!NBsoV?db=oFcUArYjo5Fd}Q*R?LjJhG^55A&>Vcv8yhAmdS%(aIfaUDo3xkq3T-hPz!OR1ckl z3j}mPVK&ytlO6J4$1b=6iu%+B{YV5E4i7f_eQqPJR`;$?mVBkzILMGUKFr3uGWpWq zI_AyMIrZCq`%RFN%v*nwEK~Px(irZ^bG3mPT7vEu8?uSXa1p~7nGPp~NEMS?j#gHSR5lOv@#?^mKM5+OULl zuS1Mfe4UCL>)YNF6?ZxJzMFL&==lt9>bAMh=}Px#+Yj5~z2GclA2%@?=9A^g_cq;{ z9uB>tySmx%1F4ccM4Ni4a|Aq9S<&n$ZdR@bgL7U_^QbwxAO8M%h1As*_wG2gm+=`} z=5F`On|V3w&_HgvZKvgiYWg$Ee#b2v4|0+uQ+gvF^PDDS*STGy+0f3y~M38{iT5ycG)*wKjDIEG8{yF+s@;2TyRM+?>zR| ziQD#CofnwPUcnZl`N-W|ZdT^QwzM!qr*@dj+SG+|8?|@VWl|5OUWdaYw#im=D>39% zm-j4`?CY&RqBo+}y1w_~iCk))242biM1JSIo_ynwtt2_&QBSw^y*rYfN`yc4DDEI5 zHsl@Z6lrp`#q9$pvvQg>2D|LaXh)Xo#{Kr)ns<2Jt;f?6TpUeF>FI`puRZ3( zQ<58P&xTeM8H(=C&KgqS3c-+kbl(y_^s|z)xS7!ETH|8!QtQX-yoHe`4?qFqO_}g2 zK*WZexCGqNx;gO-Z*C>iLk}P!gu7ag1FmkSzaryBj0G6r9>%xGnek>f5i^&)iGidN zZ$O*N#+0ZxX;UqM=pkNxF>w(w_e);A*@QmMDa0mDTA~5v^S6)tA}1^|97#(jE`yB& z)SZ{6?loNS;1)Vmf4PA{h$fl9*ny@w`wph)NtG(`V=UwJ3gfw_{a4p~+%*{&N5)RZ zIl-wQsRHE&fipubmPxES2(M2#IG-(}+i+YV)wir=f~!F=UQ|RHWMVph5+<#YCnw-9 z4!pugC0-*nLr-D8XloZzc*jGKA8lW`5JL_oXK0UVTRT8d6@K+5$pWp!-+pu{u534% z;boYCaIlAus3zdT%U@DF%C&C|;sT9)4adc749m$O+KR!-T~WW9uL(}1ac}d z(HtxGX4sPgD7?tp$M?M^L?-R9K1Km+(R$!wQRLfHCTKEVvJY5$aU3tkBuvaAKiJLF z2Ts)qYhBQ(T8e=x4!ZD@Qt*oj$4~w;nea_c)gq^Ajgvjxg`bjwUqm>5@|Vek zU*l9g<5aD8va4PAX({+;2**$UGMVt}ovNpus!dMzNEf~~1^+bR_{m=;6MmCZwa}?* zb+T(*_!%kqg@ofLf0<19R;Ox#Q}wEoJ=TSvnSx(HIDYb%$%KEE%@VGKH4Q^I=UqI; zG!_z2LLrNsZ+lwwc_R++mBriaf>$t1+j%X~JvmvpwxRI6Zw|7RVop2WI2>+)_A|qS z(TznEhGIrT384@S$TepTM6a=j@8g89B>I-e{tup6tdH`*BBZJeh$cXiO5vZ?E=j0u z9SM%(*UN-9v!rA@YJuH3#uWv5K~?Yqf`TLE@ACq zK|9RJpgvtuzg8wbaAc@Feisj>86*}Dst@#<)&rOTfzDF5D*;bQkMc)i9aQ4)nkyv0 zTxM7GB!N9s_d+27;3Q#G&^_J3lJk<;!Ebg8d%n=$lsS;A+!FJlkI^txv0pSF-p=-z z;x9R}(_Z|WI($r=tB&=Dfx^O+r+&2G+_|utgXsKt zIY#c2h{~-8_c`AN+shFi%VjbWDn0lJ@B^>3Pcg$G)Dm2&;eoG7vKwwMVX7H=lx;R! zYcoFMtkoR&FTB>T8A3aQkCW{GtV2n7ZZpISA9%gzLB8HIT;p9RD9q64vmiheHZ=5O z@)ja;Tl?yILgkzhO4FcUB!U15t`sG}MG|h|XtI|I7TvD~*CRzA^WLBWk;(ljp#)xN z(RnmAkeL!=EsP)bZ&?{LG!K6Tsw_#bq|VZ*^d2Xvka%4iNu85{(#_DKWU9|iwSQ8F z1Y<3j4qrgOLo&@Q;d{`+_V37V;POI-Ne@W(bUntG98aYwJO%Le(YhpjnSS+AU^VTU zy6`^{?@v;2Snelgx@xE>VCgD}u0K}b-=Sn#z1jwNTB z;d*$4?zo8iC+=D&IbNfQE&%;#;rcZ+Ldmwvix{yo5_jT$D3<&PnzQoY{9!qR2@gVe z?ILf^{qGOa5?d#OFdqqQLwC+7}`YtKMlbi*Pr4--5P zGVmHix`d-wqTzfTKp=x!4a=*P0n`)=BDB0bo#BoxxvpApwJ$_VdHnW+-mXVQ ze}l6e^kAUKi2Uo0#MPMYq5Qz^a1%LXhIT<{IE&#c@7R5UIFLCJctC=IJki8dt?O+) zOH)VN$NdZy8O!%ewFaQlNe&3;EvSx{YGp1vjRB!cOk|7du8$Xe*c_}TPYD>E?8jJ0k|gxYqu`mR zeciA1l(FqxB*OV9-;&G$W6)j|ksB)_^&g>#0j=hs)pkjfUHkP68gV!scCzfeeHdN3 zY+nbwjW`z3^E3h82U{;zI7RV>etKCy-PW;E}-_CgX41D0!eUOU(fbsGfIDqR%srUnom(RdQxHFTA|A_JO z8R*0{qf~q+v!`)V6~~n&`HtAZzHoYjN_$qsLo0OTiXIqxWbcvJoIQhT^a2o*=5J(b#ejr4 ztN0w<6i{Fl+)f!GjN#|)gy=ohi6>mMbg zwh<%^v*BAY__$j&=A7&Cfq~2WA~x?*jz>J3=ELd%UnB4{GU*&xJ%Fm)lm?Ef-03B~ zFOH0XV6+S`Z6X*#kQX-*Y(R)tHY0PiWnvS)5j`6}yt;`X$88?#T z(gu9c=^ju0A^0?c0YDqutd*?@XCm$y{5ApBE(_vo5g{~^#Y{lH$n1~m5RABLT2d~+SWt6P-*IGwm z@n3qyRM;&su0w~(NRGij{71+0BgfN#=X;@`(CuvBRqEK0SL`8%(`4|~hym+)k97t1 zK^IDggcbrMJHa**aSXcc7ZSiQrn^NJ-UCHv7|zbnpPk_gP&ydBfW{&k(MDPo{g20T zq}og-r~TtnkDW>vRFIB(j1>@V20ux?#$tKd3oP_-FR@UDy~IK#_7W?KaeXgIW;h7F zcj}O29O;mu30`F=7~v1GxW#mEA=-|@5W0@Wy(w^gNJ~X6EzF|^Lk{2-md43TkSfA( zq3S%+3Q1Ux4Tzp{fOEqGwwj?Mm>Gbs$66oyU;LnnoyQ-ooK=4D!@ zfD5JlkH@k;Uq^jd^Luf1D$~9>3k!u)>B11Cqn@KM$WVs6QI6+X9s4X}MeEvk_S%#; z_r6SNKB)uTx%Fdq}e;69}*spbm3RgLYU9a!1R6{RBiyy{LE$7 zV7nc+xNe++X>i%fF9D?Z5BAcE_%tk~~Ae$k#V3?hElhb6Ep8}pbihcXf&{62jy=bn#axCk!74^{mvA~4tEG=niZQ6@S*wwuXUp0(V zy=WI-ud!yYvFG&~dx6!IKj1(wN!|3*X%lB`X<@Nl>a&i*#|Y0;LNF>L|BtlQLI@?aW!#1>Gn|8y$@!v@Z5|R)ii8z6XA<{Gon`9wi*3vL>2=H?p z#QLgM(RRDtw)WpzYg?MBG$sT8J zFDIAsu!Ww9N+SBvEpbTfr796x- zE8R}BA995Q%y*)C{m){`PaA^f!;9jdlV1y+90ld)Yg}$pH~$Nh-lmlwocJ3$2Ic3b zaa#HLf|foq=Cy6I9BVAc9cuXo5igHLvM2T{Kd)2yIg~i)spUM7m4Zc>=fAu11LoWAy9g&Ibo@1nBESF*OzKb>%$oNn0S7v)u;Arb7C{h ziQb>mI){pF{G3K%?DA6HsYCvQFlw|#pKXl9!B5z%yHOK6}^|3g5Uy_ zOlSc-l6ucW;2Qj+|6u3+Rni= z8RoCr9;P{gqkSdcPjZkl)q@{QJU|(6h5n?B=JX?Sls_ixnKmop<_!d5;e}qxjbuK~ z$+MI)E;RJ~`}aG!_l>(&16M*_`Tv2X+U&T+OLIJly6~xa%@L2ZEvizSvW<^tS`20_COQ zNU{!0F=2=^r@HZQnNu_DkaTk@J&`@;)JzGRP>|>>_K}h#uwc<($v|Xm02^|zt#)#Oqjd~xN!D@3l(R`q@x!Q>)u-fRh zX|85-0Qa_Z`AU}w}>VVIVKclI;S#wjLMOU5>NO;!gSA6D4#vZmT&Q#}`Yk-DQFv(tCrXO_VTge?ltEUY=vG zugD3YOO2kkx0}YW>$bL1aBy`j)LA8~LDo`lsrn6mjH3^y)uQv3SU5>x$0zVx+FOLV zZ=ImPTN)qzF^Rq=9;JCG3j%>{9}1!j{0sJ;qSDvsfCb2TBM2Ap@FI~X z{7WKD!V_Jjl+h}R>a9dId@E}ddH5oB)yP^h2JT;(2`?GHQQB$D+!`+37M^JurOz2N zcZN&%glF~`rTdJT2g0R?!ZVK=rEeNDPfXmscyp-JJv(-P{olZNb@gm%oDVi$t@GQ` z_I0&9AEfCYo%&qb&A&e+CXMXDN@S8fSh*oyvM8PS{r=?BUv{wK2CFj~ta$u;|6o-u zgB8Z@!Q<8I*!qXGLycE@Somv=S_h{#896VSt;WKHj&dPVA=Hy>YzV!gew1wdlHaQB0l*4} zyo}qB91dsVCF1@SOCSj%nRLAKfkv6Mjlv-zYl%y0k%d~I(2DS_1jXdxkmOIh-GThc z+;-%^fJ=~e#ZTTXS;R*V~ubVu$;VxB7OV!?hqB+M{gk1Tz}FQ#oFTuPRL zcuTz*eYv%;PoSn2M(x}E!PXAZtzqTw z;(_)6(}ng7Oc&ZSFkNWRK&7BP0~Lez3=El^(;2rI*lFCtG)*vWVZ#n>-1@a~3!6A< z+`Wt^eA@=OffBT<#1gepUxKS5t8fybVWbNjp$$Ng0`8c-HGHxNEZtF||3}FY40SFLNeQEIj`~fLcaCvL z+ptv_c&o(3ozu%}@6a)$_oqtI0`Hvogfw>N^v(fdYhswyinS{YFv*XigT1_nYt2x) zLtv1tJ99PUUa4B{!cA^2%F z;wvWKPu;PNHY457C37U>tC3}X<2)djZj?I^fkP0T`10WtMSNx9Bt?AX80Bt!`Hf;; zSzTz9XW*;MDE8nBXA*kxRc#de@KtA&(`y{Z4RT4b8K)!C#}OFdkVK%)F~TU%H3a9@ zPSy(zygu%{rL(brr7qh3t-2`4t5%)ia+gu;2p8i-$220n$P+I28O0gl;w)p4m&h&3 z374ZH+2P_sV^OYAUJzbX7A_CqG{!JaR$NqpBNoGp>Wt!f;qu0CakHGB*klwhO|Xy8 zcDy?V5yvTAZeV<`@$O2dIqi5?SOO}3=;IxZ*&bjbe>C2ym5JkB&1uKGV``Z3PLC*m z?NN_QBk@8nanz&6{ei|i7|EYO2{E-uPwM`U8Sl;;X1ME%AMP-y3^&}tR(=slKk#r@ zsAqIB9u7IkCCup7pt&)>s+Anb+F)-QP&l(8ZtoPB$9H2a8$80z;J|0kSL≥~UiN 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
    z
    #M78XX{CZW{^PCfhxarr#2jk@zbTdnF{#s9)Dby#4I=bBQVoQ{(T)TF*SBHl{ z@48Z8?>m|K2l^MLcTO*B)+Q$#3e}p*Tf@e5B+&&uRUk-pVr=&crx9|^9k8SNyV$X1 zu33jfl<)>is4*WQfAI|tiw*NHvUDagt_tisR*MCj#_{V{i(l{L#7yCw^jDjXaSwN< zS~O7^ORhtGDb=?6tf3_Ft3HwDlEgcG;+>f#GACot3|@Z?1UXp9K9suaGD*a*rtYfW zS^f}Dck;BY{E@Z0%j)><+!Lwt`;EH__>yt0w^0#`)(#Zf0lQ*|d>?8W*{*{RxOd}@ zN82wf&n^KEww50TCfqgz2!Di)v%GYR-F#ws01Bg3pWAefKEG%v{EE$OQ0P{In~PuX z0HUv)liu8fk53PGG``Y}-@8?S?JL;_Q+F-Vus7SVALQu{8}|JSnAp3i*a@T3$w+(? z9N(~!(7%nuFEkm6Hl6cxoI#vxzRi%8YS|X?&#gY;OP0VWQ6&7uCbMN|{sv1&IWV|> z8|!~aswA&pW=#KKZY3VRJc|#*rN3BQ;_wwVKGzDjb290R%h*(Jy3#-0?iT9J>l`=z!Kr-vU7;T^a5Z)x%M>hRHexa{tFaB~uu0yzc?ycQs zkodYAr-EeTI7mJl*1dhIy0?$3dn=&chAi8aC4_DIvpnroFk9lQ^YH?{;b?PdD8&#z zZM}#Q$o}+Hy?lCHFAq3IW=jJ8;H%X252%Qgbdcn^l{-Q{k$r6ARv5|@&V4@oa%Q(8M!$7xD5Z$|eU4+*lDZ#5xuC-kg(ly8I zL=4Y1)8$XC$ zW~5qP`aGCzKFO}0+qf}FR!^0Lv!}ZBi zWqVK<0e)Am2D4x%(38Ruxbw}=qM|` z#*pVtkz}>YCpfg&2zQub^&}6G zHU-HiKw3cZi6O=In;2lB2SE_TPH&k8Mhue%tqv6f!RV? zUm4A56GeqL$LMmMN$lv{Eo-8PL=i!b4~p8{sv!Z%0(#sAE;~cre7f#S0T;PWFwA38 zMy#Svo;R+OlE!-Sm(UnH1>&}!$s*&E5u|pEFEO` zLjyb%Ym(K*H#A9$nnI-Rbs{>B&eHF~5V=ux>b#n>6+bPLskmjevZMafF`_D1Pl2e^ zP3IzS3)dHu4twasTa9CF&gsX1k-6V*D?HKMbr6VSj;sRAoh;jil1QPqk9 z_gZ5{3RuueLcf?|sPsX12_kNVJO@dT=dr?;l%vQCr2#K_L8A8@pXDYW{fB~1Jz}EK zFSV=*NB`Jz9|t zD}sE5ia`;=RVl%W+!C%WL1jqIcMTeW<>$J$BMTfdc zTEs0sme~zY==e@~yu!q?H!1{Xy|u)3N&4^fkpH@`w zKCYDYPXLPmS4#Z&um~)~eK`ZZgg-(SYO^9!ve3sJeN3t>N`E5N`nggTYD=}=9H*Ha zS(N^G(+XEld{Ru6zcLH?$r$7BVHpN5W<}r^1KMNV15kWE1l>h6Vx9(gI=~Q|lyy6> zp+0lhaY3d>FUW1-OU^Ba%9>sr5djtm1YiCZnp>7x-C~gzG!e82h!l2XP-(ySv}IWP zW|pzGY*8s{v^7v;r*6_MTc}T1B{%7s;S~N)Hw&@Ydj2NeQ~IcOQwq1!Q~02Kvpm8i z^-sl&#q4x4l`Hj!I`YrhZbLZOTaA`fD*2|^M3%<~{Aa})-xH50{+bvFiN>AU-oA$3 z+;xE;WPcJ2#>H{kVc#kD-^L0@zA=`H>#pz5301ZusGZi%|;er%lF?r=mBtHDUA9qk(Tz4~;_f{0Ge z>FvX>DWX@`kfJbI0-QHQMA+7kkZhlHKL#4=g&8tjILE)(TDnw@?{jXw4OZIU4T>n9O*Bl0G46E4!w_uG>+bSF>68v5TYg|6@n0#mT4nVBqVEFdK^TX885 zrCQytPb^em-BL|6iA$hW8`Wqi{Y)e|mHwwM9jw_1Z5v!4ZodUkr-8zt`9EO|ku=XT zqO^Hd62AHT8?cc)uFC%3t?IsG%3~@TO=h#a#b~s_{TSursb><}6sI_0LdEH#km|2j zoO<+%Gd*My`V1_Mp{Wd%`k{!?W9wu{btYh$daleE$tPWEYM2u*H7ztNbem|TCi|xz z>G=%I#bEU#Rl;9jq!9-@EX2dx5f61z-c5#Dy8fMNsHRh<9%`KpRe$|Z_4t<>sutx& za6eQn%5@RSxl*eloAd1i-pYS(oJn*?#OG7Wuh#)Db5cM559j35h;Yqjo^kKD;#MA*Lf)?FOf;LwtIjzOmt1T4jVh#;2pJRw~;$y z&u+tZn1zFmKn=wUh!uS5iwKllBi3H6-6{GyTV&dwOSNp`$z_n)sT*Spw1In!&Oe=m z($8m9RGYZ^rn_z8@Wnk z{b{WGb5Q;BiBSD>Lv;Xt!|nO2tyd>gDpIX4uxS{8pO@n{;+f8QoxIuk6F&_z1E<*$ zl=zjZ`{LquQ~~j^ziW)63Y@Rq-}QStszAbwS#~+f#ZJx)bY{Ca{ANcQ`Z*TW_4|rh z_-XsQ#wx>dokJD$IE$kD*b3MBj^Bz|eMi%2{XSI+8toja%nVekFjppLs4&0QJ-=3| zsPK$gy(;5H9He1gEOC{(>5t6Bh`g0e|58j|b}s$k=ZzS0_QnaeZI2sfFQYh`brY>e z!yVB}uWje|YUHD~YX`(`00|Hk4v2=&dMKWiI@O>abf4)xcyIx`ruX`t*^!?z`tZ z1Ke`4gl{dv^Yncy@R$~kk5Ub0Ru7?ZKN(kW&^uW4DWAf0JAYvZwgxgo6@ukbU@ce!-gPEi@qOS*ao9iio- z^l-!7`N{y4Br3z0yA)9bN)nYJ2Iky}fZ?DN=GKtSQt-R_pv7h=hJ)A)MR4rU0WIMp z2+S}63R8BQw>Z6_?%Y=0h| zuO7CaM;Je*wLuk2G zaGLIBR^}hDK?c0b70}@x`?Rt!PYhA`sCZ$&k zO?X{&Ium2gz871KWJ~Qp>h9=7R%vpY+*Cn}&f>oBWv`Ja*h(Q21@+=3i^}plKmQa? z#X>VL;6Nq%qs)8MB)%_;~-qaCCNbO3^m+2kj%~_NlXqq2@y}#*2F>vU!@L7?QCKv(& zHBK)c&LqjPBE&ZRSS0kSoOH7*=bFmyzIhyyXTtklLnZgUG&e1dlkR)vYcLV=N5^)8 z-EcmLo#n{<+hE~Pm1_N!VON5sqAmSXCt@nw(vP^O8ExsGAd57VMfpGWvP=||)P(WE>l{gXd|LncA#B*`JB?KtTd1LlUO{>@%()Uwms?A8!CsB~`+ z`_a3%AGj*XPav5_J6i?^&(ETX^d;zsNpmG7drFQhH zDgO;FKv*m~Usjd-oM6e^SDt;#sWpVu}Y`Q@k`eb(!21InUh zY9;@7yta32ReRCcSiUDAzO9{4jnd9b!UBANOdfzT7d+ewEvHc2wndiI2y$_>&n9|y zW1A5L%j9-_)8U%!{*(hv(N4=Q*R|g@As_%yrO_teWIT7b0;`YO*M=^p=$_^}B!niI zU{M>dEi0?zG$muGthprq9>_Z%^7M-f)s8Q8{DVm$M`R%|SJya?k9mnJUR(lPM2hqN zGsaFccw-o+#3k)8lj5*ff%mAwk9*?^WwllTFIGGRdU~IK_00*7o?Y}|yYuzx;z(<0 zBcGFfIVq0ud$|4=J)ZPmHUT-sNPhx3|FbXC(Z*V5 zC9E~@K*BY&IRzluu>|BgD_P86laAo$>~A`T$PCm@(ZR=wr0>cx73}+Sli}pyZze4g zIJ$8@)!IA0Jhh}av?ZwoCME^8@g`?vB|SmCOv(Ofi5b zxIN(pN{b47n`*hI%qLwzJuFzJ{}qat{3+wZ-6p0LiB?jhzA8KW)I;c68AjK%bT$?R z$(3P2`p1%V`NX5EzZZ}VEtVb?N6#p}==(QhN6~TP5E{kNagS#D7Dvae%ygd-Z3M$R zwC@gL&5`jG`-nN2Rikfbk>Kvp=%|)Yh))BUgKf06^Lm?Doyo+y`3IUG`+zTxHKs z^Q@Hu-zJ|6ZuNkP_HT?r{mJ=6>zU5Vpvy0lDUh30AxQt$xmMrdooC_Qk7SP6mantE zlGV0DSSU;%`>04TLB=9_vKH13&j*yknX-_1py5U7>g(_$V>aXE9$kPWFk)4;w~lgl zDS&Df(?Xx4Zo1Ep?HVA1lvl<>K(Lk7l7fhb4qVbVWtdvuS>1q)-;qwo2 z%RTB2{~o(6quCDiVb6RlT&)()U|m_h=I^z-YhFmaEC7JV=zO|y+p{SJEd zPE89x)3BS??$+=kG*{0OO*qo4y>A@{G$>?D^)v@m=2)A->gKSA+oV9skhl%yvuC8dsm>D%*4uyf?#9z0K;?!+TrcfKT)%}T7?YV!`UMzC(C@Ay?=*eu-QWe2Pp#6FwFxSl~=}|#yU{D#MR9hAu>zP_8t*Dexvgy}^&yp@Q zA&zl$A^@NbIn{d5HU#F1`Iy2=l^yQ753v-|^3fY4dqyUeJ(*$C)pd>T42zlDUrm_j zL#S8~d5l{r?MyP>MuxzkVy}INMCP`p{xN{np8oHEQQz>tj_=42rp0#+Bo!Ch_8T*{ zNi4RJZ?kj^@btr|Zzcy%{q{7((@*Sakf%rNX@IAn+LH+`kpyRfqwh$z12pqIEC#7+ z>sV@U`~BNn?9C3%koQ)58;J5uBHBJVdHTE?4R}`@y>XzR@f6M?+gWAPlzW=xsxLRE zs(YSRV3p0{Na+>!U2gYW*2?7x!y89~0hO8CSyX>pYrv!tJP{1dR{Dr)3?3}s_M z7cLYQG;G@U^+XtT*HqHnGrx7sJ)8jWay8cl8rLE-7|eBo|;jxMRMucxCYvb|kn zC%KQV5iNIA^QFCY7{Q5bDExya7qF3(S5ktXUob^d+czi`f@v3S!xR2lS2i~kq8EQn za%36=#i&~KHNm4^Jfip0kfVIH?{^&4fAC(%rt$Z}nx3yUVdEm0BUe}DTwth^s%1U4 zwIP#)Y&oFZC#TfqNP_uqc1gZaqBd%vE@F^r?}!)u?c++-Mx~BVN_~J*e*FO-$LwgH zGUH8n%kgHwNuTJ9d9&ACSCV7J^!*;&ET&A1Zv*;0L)~yGH!1%oeGJSP&)-+lzR(gt zbsIJEcR(5Xt!z|?pn%@5_T>XeK1}(-4dM{dv%N^0cRw{w{60+*a8wlD^V zT909F+Kt7`E)#P$^UVY4CS&z=!dEB=?p|?ZSg8GOjOmH6@LmsQfQ3&}BmXq>#yI56 zh(r9oR)~^QeC0r>yi=7GWF(xLik~;CNwg>ZR8>KXHsq%SuIUW4y51#<+tN>gbnNCP zZmZN(UiWt*P=N41{HF#Jg7En#x#aLhYbyOzn;Zh^C)?8a2-3f9Gp#l3;_^bss`hjt zpyx}dspdriAdr518%Ypodj5Y&!*o+tVNrWM_rmQ2a2fuSn&9=E^i$WBN}YEAV*XoH zjL#H|Hhd>RMkF2^U!#lWq_=f!H0WhS^Wwh0SpRE#(P0saJ!vnScqyD4*HW;s_{BHj z+Vf4g7vF?yTuso{bQKpuiaF}uOTB8z3}fcS6M39od0^L+9CggE$IYwrzXMKQ2V+Cj z+EP99D9m3%=GiK*z-yXXwcxUy?{`2dpc0v`_BF_eD0eGKM!9~5=1WJj>os}Ju0B$| zjT2>@U>W-?!GoIDXr|YBhU5BP%t761$OXN2f&jlwYZT6`Efsh7H5{3^JN=$1ne&<_#xds| z)UeawFlTuwbJqFtfec!q^7{Z=%;~^CAo_Xc+zaoBohcA8=O0Ki=G2M!1T7B#?yOpb zD#O2wu_MO+ogZ_a`LhyQ|LEJ`|J8`V14tWl#Ym}?pt!xI6vda*lIhjAUvkmf;g?O9 z2prTfdeQ^>0rE+0&3kaGMEMiw+TX#`LQ0@zP6NpN@)>Hjh7Z%NC@~j%e2oi}VLeM9 z`9)SELYGj8fgdV_Td0_SK~bp)sj1e_+MxFTlZ~e4?DT&5;GMrkc6e2L>(jq4GV-4N zm29(`g_!B-8vkuWT`1@;CvL)9SKuq^UzFZ|?Q!iJRFO9e>%`|d_q(_XC(@xxrf#0i z6ZvdpQ6ZK2Jq+SrQ`=jntFq2m4_fN}g_IlOy#IdTZ0Q@`fG^pm#oxeiU=#{NTUf<+i<&)nBV3BFF4s;T~2WSgex+BnRH>ve|(W?V|PxR^l?@0jf19@^|Lo4+a zP4aE91s}4>tlo<{ECs>N=H*>4;E=VV`$yR_R z4tC`$viD~n%kIfO`1F_gDvrA^VD~$EX(skqhcuIu?{L(bi}B*A^=^YG#`sK3NskOF4=EYjVc!z-8(K-hnmCzGklUAH0j4`Tf(p&YXsB}QOr&t>0NF~Cn03g z%Y-@OUGhxwndW_b*xMfVvfaQe>1md8Qva0NJj8=npKL(rP04jtezTP>t8^|jmWL&( z8f;#S05wA%2Wq%}X!wwZJy>QZ;u61Nhu@iI);F?UGx$EL7v|9e`(yOZ(SP%(1aH2N z!m&DFpA@sPG*dZkcf-=6r!1Kz6koRkwys*1N+emWr13Mgg)DJ;Q^Vh2$`*NsHJG0Bt6%^%f-CK=?&F3PcHeJkk{YC=7?5_fV`+x=~Avgo< zzPHkgiPKBmftePSoUNy$U^QJ%QJ16U(P3KBw_N{A2J!Oi=ug>!-(=-ZvQG9So!oUN zoxDI07ZpVbr~5zina|+T=3B1)ZoM~wub33e=;t zF98++HCsUa!dfta)80B#4ATe3!=w@cOus3H>24YW(%%*rdb+rf0#H+Ew7Ag!78jCl zEAJF>WTEOh^j(ZDVvGsA-(x==NBCEu4tzXi>9sm_zJqIPH4Q2G!+BN6mYT9s0sS@K zRDiER$wwE|-Q#NvpaUA7NgXLvW^EM|(&_g?iF@-B-|U=s#&W-%W()5XZ5W(JCoT5( zl!G^QD8jP@ZJongeBPbGxa0MmG6jJGYv03z>IkRWEf>WeC;S|f&#Friicvl)(2j#g zoHb363|!R-@ZS8$IK1zWgk3vs!pXH=GU49fD+d$q230=4Xu@%+03*guMiov46b~4@ z=+3ApljW%UXgf7Qq&%FZo&ESHg-`?g@l!yYEM5I(DePjLO`2Ok;E{j=i^&u zwk0F}e3)XW41A*mAgE^5@@0dhn!97OSw#~{)E6)v;*!ta-C*kJRS8Sn@D+{UK&r~M zE#^UuQpc@gEC>Z7C%o+AqRPZ2>ewDp5w!HAMRaP2B2N^KU)Ga;LQ^CCgsSj6q}E9t zW+HC1QIz7m>C8QNE*xY!`D!N!-T5%;y5P06UD{@$eyVDZ)1Et#=-ShXL<{0RM20_- zXdUTDqGdecfNVD_w1oB7ye8SlbL=#!PI=EA#oVt`Ggf#4e(!jA9KZKaJ^wdQs#w8j z!>5GbFY=WGe*c6jKVnF(VLQ$a7lp!Vq-oY#;%d@Qnpx>a}W&W8&C0w#!y{ zQ=)X9)LE6pM*8@VCCyuv3N}3nTc2{TQZ%E>vg^|$yrbp0g<>~~zEL8oGBm;{D++T_ zAg=uqD!licSO8rRVU^?X<6Pc9{c;frN)h)WI#S<(d+VS6gR#CQ!n$sCuxgvv%;3l4 z{ii>2)dRdAr|K@`dCjcS?!M~F2dMoy0OosyTI2-rS21mV5uo!-UxSQDjxQt0WCbVu zHC29Lcy@(&68ZSTY6dL=g5~`d2}DWm)ALh0?*7nw^G1B z9RWNRj3(HMwZew;j*KX8+%zRoTKA13$}Vc;x0Dh^+&i8qZ}imzqO4Z+QI7ZJ z1EMTZ`PWi@VxoNUAqQYUlm|&NqHs9Nh| zS4Un20rH$!;jL%KtZ>y-^K;P`r(}g2emIU5zCn%rBdn24Dn|2DZqV_pu*g>rSfN4H zKR4A9`(Gg?{H|kir50S_K?hE-#6Css`6W9O12GjYs8{+50jJzSl5xuM0>Vz<`8D?N z1Z(W5fazRTan*{VXSzLL*W14U47OzFe5ZX%0hV|ZQ#4-nncvqEP|xtEoAj38FJJg; zCREX7a-06fCTwT?nayZjuQqgLJ%-CgHw6qkLqKjE*wc;)lHdaqCvagajDzdXX~vEf zGJ)!5wWS{eLY|IlOaIJZJ(|#F&8r_PYnsu#`ezkQr}A8G&(oUb@Lb`at9hQ*bRuOc zomb-A#Ne8>5u&^jX`nLKnFI8lNp9iu;`{yyD9$wdnS9ELO08g16~94d^}aIabqLt+ zOSF^M0xjC~e!o+zBk`U0eWrA?6|wgQ4q9=PjaOcrCwL;|Iu;e7pL`!%#Zruo3CL&B zRpAP)%LO6}^EK<)#{L;EkL8x^<0NZsZb?5sb6GrS!*sR|XPW<7zC1LBCPs-GZ+NxT zTG;Ws>DZqUnQ~=Oar=~lO(ZxfeDy$ZoUQ7oTJ@S~rJG(q z{4dvCFezuLycQR%8YcGT&Hrx+no&EdZZ5}wu0Qy94Nq&Z$d~a^y2!h80Jc3Bd;dpm#Lh2>-o|nf2Tb;lBXx)ryA`(`& z+nF~g>A@S->hhRXc29{TB78o$=GqtVYu+tBTJ9p>aRS5S)-6dlkKaZ&57IFH#d&RX z^jdApx?-PCihWnb?zCcvNDj~+7MSLLF<>N&0mfa(xI1a^BQ&VUY+-*0=6={gV+{po1jQ zV@08!$$!9|-Fe2H-T7a4c4w5cJLEmx##$}90_GN9T5q|1MKUF>^8eiQDjo-&aiEA7wjbA}ciN%1%%WehFwsGLs*T`Y2d6*QU&L zj84Bb{gMj`ZpyRA{VFM1cb z&f4IxhOr@M7#P3KMP>x&$kuEa}-1Cs9D0I_icbLw8=2lBI=p-hhx!6#n7fb;!<~$qJ&GI?HUt z4YL~#>xsh_(=|GM?oDG~aWqs}sOI+9}3saC0aju_FGRt8{Xk4$3VVuEyP9;~aZh&7-`A~id@ak?a)vK+P2u^X=tv~!9e2o=H~&nTXWc64C$O-xF=Dp)cJdlEe{ zpAk5L!?4Pq+`Q^v{VnmrYpupfg2_4* zWbu7GE4#JRRreTG^~XrkhGA^$hH~;W10~h6(&w~SigqomLlw1yKEgQN#-TgB zSaLxwniIIII%GGa#@;{(tMWBVtQE-@roo!OmHb?v6n;5{m9!;E`eD27d(WmqS>Z;2 z));s<&i_c^!_njW6(FmLNe5EYdNw_q6fUdqw?fhMNEdI+qk1jucyh7&Pvf?R7|bcx z@@(BG3lZ`8@9LHW4bD}AsaAP&$2GdfQnbs<;2N*tPs3uq@6dD#={;r?8}!9y%_l#} z(&hZPW{H6`U3iXW>G&!7g2lpyA%!m{TO*FIbYR)@M=;;E*wL7PQEfHrre=U0=a(N# zi13D6Vg;+YZODHeEb9YwN+H$VcpQIkSVOq(k$2trLjGR9#!SiQy*uXNgV3^Td9_Xq zaISN-^2S|$<+T!E+0T1B4QsiU?lj;}p(9$^FF=yQ>+Zs)^yq|>3>Rr=QH^0-K zxH`(js6pMn*^2J6>yfFJMe&=Y)h>|#;Lx|Rjmj2uWeI<;57IL{MU|VLUuG@g_`A88 zZY`#YJNDBA0XGZD$rzfn!QOZ#=qPVwUUpVA&Af+7#ER9S3U0GoO?qVSt1D}Poy&W3 zm92G`VgSDCFx7nd&RqR2;(+)2i9J>N%YIC-c;6j_S)6`)2Yz^RpM6@uy`J1Rt1EjyxotJN zNQut}ju8eK_C1jc)k6__=b#sYsbJA8nNJ#&g_E^FB!SQMRsh4Iw5oPRRaMC~AhdC>d_`AKJ^vXiH+gfkPNQmF!Na50<({;5i&`&i z=kuYd)XiUk!=ap;TCJb6w^9GrZg2bj+Zub@=HEUR)tiRqZPjKYJrmhOZ{M~z>e<^@ z?Tvc&_V4yqEo;v&{kJV7%B2ptZw2ADK;x`zWwsu3a9{g{mDwfxa>sGDYi-x&*ZbvpRMPh?P&Xj<=G`*N>QGdk09sK{g0V@ z5@gtUJp2;9v;}b5>fU0ob?Zp>(u!<7C-8dPFRaKe=}ql8PAA`%cUNRqcb7Hc>i0w) zwt;RT{Cj$DE^WVRuL!oiS@CS|5y2+ITR@lr?AMhR6!Mvu>-4boT2Z)uJf%GpDEOHN zq*SB;U9WM1>QPPgT=o5ofVX}n=I`c@O-W3KKJXNOtD>#-TCK*?LRVSgN{9nSDdR=a z(7kKcU`TX5^oMLeg4cb8c>4y`kvGkh+$>AY*EfKfBoagjD zB+tG@hLcqtfRYp(R!DYVa9Gz_3{RYIP2H@|_2r*mM1dsieP2LqAOhPGK%|s}8sAB1$MV zXP+n*CH9IE-HXz@L5y665Bi_ zvL?&jT+oGhgq5taEioa2M68>H4wo9Z@l1&Dsfhn}*<@2hh&W|qPx?0K4*qTxVtUf+ z57LI+&tmguLJSx7TK4XMWIbe!A+UvTcU!SGU<+pLLHt$zXBwPh7R^o9JBTzRL8$W`M=9v zW6HI~lq=0?3CZ^s!0t&m({>pm-Zf#0piS#0t{Q1rETErwX?a;s>nh%?=;=vOUxw1T zbc>39m!dBFK!16G@bmI9j z(`N^D%95z_R2n(ZF9UVVjvdMkHHL2I)kT>;h%2UHpI^zvU5uEvr>PpcZ5jro(LC70Zb%E|m_uKTSvLSq({v-J zc(z{hzi-Go8WrFQkL|zbHr%i;s&wA?N=~sb`1{B!CoYRtr(kGz*Apj|_dPf^VUt4* z+cVv@5y}C-DhV~u0BQ`R8rPQLTFU_IX-vpJ$ao`LieTQhNwoILgW|ezl^Oi-!t|In zkkSY3VGuRdHFi>V_p9oMT&N8&H|SFaUCMy@@dt_b(MQJVyR-F!3$%h9fR3x-fdS(W z@Chh`N<+`l2XCZ7PzNu@R|%-(==}dp{|H-pZa8f`!A5P9)@18QVPVu-Z^_tn^@7pG zn7|5h%{Tm4giyP9LWH*beTJG*$OLEB*aiq>GNkxKdW-N4%q0|HPteDh z;dhIG6Rnk^ztV_;Y%bxIzKA z?!#TCmwt_|#g$4#xC~1{c(7gvSk|^$SV)Ot5ETrq#Sc|co8;6tFYW^N0zocyS!LAt zThd60kp);7;Dy^r7IjM>@~UbN0txc!V`70QUM${Rgf`)T&-ZzqKL>GdmG^%(-AFwG;!n`;4U_e|cFKNTwQ>Clx$4TWj5KTc1xu_#h5WT73MwTM?l&07 z;u$Mkz%(KAda-WzY-c?9Pj)DM>lsm%h*+RC#zN*>Py$KM{6ll_!tj! z^dRNxi*xq!WVS43t_d0s>b~y5D@O~Q42y~{u4uxx30t4rb>(P9Zpr9G;n1+r9Hb~F zMq|5GG2o4C0K|h!tvFsi8AH{rY99QfqoVG%yB3mO^`LOhtxy_{dgo5n=h47lBmH7wtKDM=Hm1x*dcWT zcalKILh0_bpz2H6tn-swjp_rtB_)2ymSa$2T>jljzPdL!)KsRk*39Z5`(UyR=L0N; z(BCGvvmM&7i-A5|VJVXsAy_$4M^ZS7tYmt7Fj3O){Gi9k;WW|(Xg!1CR+?lwofW^B zjgQ*CjST%GBa8zv5Fqg;P#`rYvyx&G!sVOnbj*Zy$*!v%a2Nr-b$(8+%-AO+Iurmw zUt?fr6tl+NHLWNx$uXd7az|y`?655E_%?lDGPUDvx;pB-o4U-D>8(|R3PItQ@n<>L zZ-&y=G}!UIS>a0o0jG zpP`dA>9cH8Y%!6^a_KtTRXIPK-j+*WU>lxq!CNStcA^I#O>chGzGP*blYKk$ZIANy zTHe+mZ@Kc)o0QpanLC5brIxu-nZLBm&LHzumU){pe`}e&LFVz6d8;!2XqkOM=I<_{ z&mQGfy+^S22YHVw?>^qmY9KDAlRr21iAX#c$<@3aw~7Mv#Yp^ ze5w1wP%*RAVce|k78RnnAVwBh@_%izvmyP?R;KZjYc-_b z3Cg=KX*8r?x$;(>I^R+3R7bJeT>X0JH#fJW1NzO$tzJiw*^qe>G9HVwdTqC;7LhSC zjD>-KL$q-cszUL$C0|6;V!875QzRur0dnO_VgX|1B?6e6T7g%;+=w(15b4~Df#25N zVH-Cj4wLx-9Mki12GX6sdaXdI?)kN4;n#A*Qj3w0V3a; z;w}bZc`-5Ct2IS%zwRhombEyyek>NrU~~;~%Bc#|JyI36oMnDxhFKNIw3(j2%(SjF zk6g>rO9Ee3-HT<8s~pcS zN^Ku=Pjge-A*Iq@nA(o)*VCNTcEl=xR+{v!Ce%252e-|E+h!v)EWm#5vOylJ0xfg< z8;xz$mVyA##Gbkn$`y~vw;x3Sa5>WoGkuY;fR+gwF|C|nt5n9NQ+lcG7r39LbKF-s)7dDr(DaJUX*_ep%D>{41t8VG3WK zoMLZTr>8jXFt=n-nM_t1S6bq%{J-SA4SZcymG^&> zChcvB-iRp#h&F0)S}EEJDuv<%+RJ;f15}U~MUh%ZP%KGXwJ#|*S8}~xh$AX0DhxP- zBlCze2<1gc+K{Hu(SQ{aS};J6dwT-}sBL(W{J+1o_c`Y#O;Kl_|NnVDpMO7)d(J+4 zuf6tKYp=cb+H3DE9BM%kKFW*PzRkna!Tf#p?7KnxpuKsSZ-2(#8dSXVEdhPUVp$$x zxx+(k(L;b`?WaPea}(4rtoA+9GRfg*ST^uuCzvg#8u}cZ9J|f%hpizo27+qz5L7ci zs^(Z#Gu^5YoREW1MkQ1sS`Qx}&onGfjh^F$TS%LbzniL})_XY2bvmCa&(+b(O1btD z0Z19bkH+M3vf~uwg%PIThX2Jcj;~PN)}hM$x%0_#2~u{^Fr$?jt-|>6D zH%~I3s&rz@)(R&xi{l0+Pm8Krycp>v)z#qqEvX^JHj+Z?hxIc?acu2on^?p1E@jK~UNl?K4Za@%`=SBk zG7f;%3fK|@rnn_LN*qP%fq6n(rv79E?3M`Fy8x!4*i?D@>uQ%HR7uY|{fbbSoXZD# z>md-PjtJcFClRLK0L7?jx$$V5%xX2jWcFSz`|*2QN-8O=4=Zu5I4aQtm9S{;Yb?n> zN`BHe8z$n1gtP>crC?HI-?Rr4cAeS)jgNqaK1&E1_Y#6o$J%j!-u;V)!~E#5sR0H* z6RHh1SGlME`NxwT{agM}c)ZVT=zbw0$>UJi&hb*F4L*~N{nIWC`}zhl6~96gYAR_8 zz_4rVNYMRx%_aX>((or2nvvl%%APFAsL2omw#_RxkTGZbaXGb85URY*MXO7))nj=3 z_MIacU1!>|qycqmfc(!|2wFED^Eb{1bB;!>Q3W(0zBk6_pw30JF&RoR{RkQU3QSjE zTRKcjhfV^8%wTEn07ZL7V|UrJw_DnK{Flaf(6__ca;a@vS(tC#xW)#&8cFY3LHDMG zb?Wybd zj0&w$50Go2kpes=?(k1l%+GNzLBwj7JX$ zK_6vp#KgkfqNS`R!RuO?SUUFIG`&g7;)uZ)o1!&Y!Y*VvG_`Rictcus3^-7y{;~J0 zD0LJ(R#avImR#Vi77?BTD(5GG8%|WhuyD9a&Y|VTny{)mqnO9Eg^O{ zW2y)PV>Lf$6}!zT21JK!pl3c{uvklE+Yu)Z47toEpy%>QdilBtdK&0OmR!_aK&$Zp z$_v?_qVLHa_5r%UxIXaf$;NNp#pVxe9rDM$F3H=;tzJw6pVU4MYxU}Grq@~%s>OFw zc`!m7FMFak3^7xVR3`JMP!fV(-#ksmd#tbubuQWW>${-WLb8@zj$zQxy~K+?TPpr9 zzgr=zc-&###k%e=`JZc6p9`u)GjPfiw>Pa@r!eYN2RDw4kWcP+EfcRJ@i0niD0fTd z5VN|DDo_A)KV4E*I&u0tR!ajJI8>S&NwQINXVlU~NbLrt7hE)`2VBD9m8_1cLM>vq z1(R}9%))%`r!wgP#^nIP^`YK=>!eZ+AvPsB8+ zER-3L3BJosyqXE=#GlI7)|WOp_UUjaKKFdY|L3M;Cn(D76iI!W&9-j)^xk-3v9Prz zj7?QT3g6_)W{SUWKmG<+>FA$^-QaK?%!*&}i}T0C|iK-Iu&$!&h#393aa_Th+Fvdu3d z5S2vmO>_)-9jC>V+PB6v@^m`-ju0A&q=*LZQPEczA#T|qaP9mm&sKD#< zHh;>`1f`)u;wmkoI#fVDwXsZigC5F$f)Yvw>l(tkOD8SgW5R9q@tGZ)-5w(M7!F1d zYbS@l<3-eB-{!^|$7h~u{S$;8)0(&iXv~=y15`U0 z#IuX?r5J2_!?%ggoHFb&kl?UJOI4=&RZ{A_y2zO99vK(;s__7lcy;OAH10moaB^3Z z_~yU8#$HC{^cvck0f*RFJ>AA?w+h+huju8dg>M*KqV5{YIoafR^ot(nSFOY?qsK|4 z&i0SF9w*PAzrt+f#z^QM`v=Cnnb}1e-X%Y=%z9~r z%(vRDVmAkIf!u*}j_Kx@3FbGERw18gZJ|u*C>g6aqLirQ?~VT1MqTwoOgZ(kH@F|f z&2ieVqr8adAFv&7G1v@UGuLCP^0ICQMx+s1na7!rqf8QI>?B(6b&zOu?R<8$v_!91 zIJSe!#Q+ms;4Bz&9)uQw{oH3%KaCVkup~JS6^5 z9%oZ{;TmTMhQohlq0YOP+DEJ&gjUW2jmT!!EUKYjjNh62oiA%dHm^YQnBnQFsFinP zdlc?7&U%<7oZm_Gl3JiBGF4|hl*SI13B$p-MR;`%RM?KGYV*}ilXx~NO36&Z8>32Z zK7&eidZmfGG~li_{iU3wYul^TV9vy`&Yjo3YJfw{Y>MS3lJU=k=F8$!(KTAk z*wgnO{`9^Jaqur(h1~o{UjCx&-sZ)teVF!{3=Q!h+103!oltiBzqk+CJtD$wRAQuU zydlgIzP%srDqXUx>MW0Bw`HqWjgjmMuaJ%6WpbC@7N$9-3(%As1;u67+9KFQa(80| zKT_BH-%(OCy3v#)GEH%b2!bkK+~&qOU{ux*O+{9?O@wUHVw&~9OD7P@ca$>z)QA9Y zXdu8TRh>P_jRg}(-cRr!C`TZ)$d}W_YIGoYdNzSeRaL(3S;Y5+-0O4iws zXZu`NU2fD=DFR8?vdC0}2+_*JC1uMZ1n)atOyHvyM6};s1d!S2)n!$-&3MC7h3iAI zf9r6p%Kd{vFp|6nk5b!$>M&GI*svo7NU39~Kd@ z?nR9f=vVKy{sE`r*ntdG7W`d2UN%6AP*=ExpfBh8Wc;nOv!J@yFx`3n&uV7pHP z*i8U4A^4cj9B950at?mM_uHXZ(*n)njIY?MzQ$tTT?gVKYL$>0t3%eP1pGlgL30P^W@gDmhpwx3j>fl6mBWDu$NdXJqzt+s1{yHaop_4ah0I3q9B1xkmT>Wc&; zm3(YwF$c1@02K7iYMv9px{2kF;%U@Yxzave7JbU-lcRG7h3W52anw6+=iE+Cn&_e}0RGUNy76U{er3hUCCJ z;H-|Wq+aczm|V@^E5Vf(1Y6x4=5@Cb;7u#dtKJagowCwh4h39WDg(RKeC}@f2XOE) zXO3D-i%LqlR;{L~ZmC!0#@Auk2HOJ!6=9d{{!>6ZAF+1Hhozd{>uNZSM4dpX0&1_B z2ZC>Vc)5Xw?_;_Pf_ooHmOn7CbjBj4AZa+g&!I$dse`VtSnLA?@@+bum{>7uhi{Fm~g9r@Y#*{~n1JP`psot{^*DoXr}5)}pv)-7ADiwSFbUYTxMk`TD{ z2~t<-BoL)EtP2Fi4^O55U^j?qSj2)T?bcI}3Ri3Hz>>KUqX$ z8diW?5`e32W}6A%h5~RnVr6;8ii|5mAvoJ+MzAb#yF)lkIK*Jj!@_xpL(uXVKWqWt zvHUllO=2HtPn}<_dV<#b)M*Hq#TT>pQFDk`kuE1nv?X7*2kp>+9{j=Lv%@!Og>9*% zB_oVc%YQq*o+&F=2z^b& z39n!WqHXx}jN*$Bc_Ko@wUWOh6JatfxPK<7Fy3r?a#%Zo?M2T0dEFYR1J6cic4o;) zb_td1s0cp!>Yk=_cjJEX;za?N>gF?T@DiAE0|P%s%8Rp0!PvPI4p?b&0DY2&zSTjm zE>;$PLYKFEN;xaiEFq+4kFAZ^WO%qO&iVI3B-v>_n zNDfd92=Ob2YOTek1@%@Z(zhc{Vcm`%kalFU9Si&4uYMm`{cXuX8$7uaS6t%M6%3t& z(0#y~G>xy0-ji*QVRvJ^oR9lwk%wfJ)=s>lsqm5)C>om>a~(&b^=8Kkyc3Ek_AE)H zuZJ`N?DFQM?|WX-!ydTZL|!Ml1U-;*)|1=Yf*uHZ^uQg%Ab98_{&0{9@E#L9S);q?u;?bidojchwUJ0a6~4ytjeRcky-QOSPj{NB zE!l4m>h?}QafS=v`*jcvs*Ce(EQd`T^pc<9KYSg>c$g653le51E8Mm;%cP#%mVHR(uIw)-! z0yFV=18|{c?%wc}bxWOyryYkh;~8@VKvT^=4Pspc@y-v25Dlr8CW^|&7Fc@;knu`A zs2ATCh+k-3*1QDI4h9oB7g!E%P}Pz5LL2yuRy1_+ImKyw+1z-}-yQkLGV=$S&q5)c zs@_kg^!O7pSViZ96A`}@I-jO#?p!f5YQ@_K#@OQKTthQyceX{Y0F5|193iqT^38y3 z;h!x5`7&?gdvwiiqBY|ZOQxuYzxZc-9(Lwf6SHCE=MoPby!E(x4#qbzNk`&wNY+0H zJv+RTW6_$iBk+IAPicg{Btr3vuudQ4VBD28NBIOR4VN5;Uh|H{$lI#MaKc`XJgWAG zClE|(;CK=VhVuhquy!>t+e`$1@}aa6QNxc>)2 zBHCM=6u3yVAV?hqQK!)}@#N@pJrPYl?4JJS7;?YRO6AlhJU@S`tBdVSj3}#)5L}*F zXtG_~+D0cwfrV~q63>f*cY@*zxIxbsQSmceZojn@ubLG;G)C8?(Z;Z@sL_deYIIdr z7Y_rsDRQ_OYL@`JcqE^Mkf58~HO2#Q1mf${W#C$Z(Q{`QMusyMk!H@K8I)4!(fW_a$x@^~O?@eNX^HAry^hq`9hI8!0pXlktlor*<}4W(zTW?z6&eOE;F zSs!#%7gMck-fDQGYIL+_T#ULfD!s(jc7TYS+_8Sm4vq6`ae3N9;OHdyDO^?^(2_si z^6L!jfSrxAr`K6O&hlCPkcaQ~J-|c2%kIftd%dHfKlC}co?`5_hktkMGJ@2D?RXAr z+u%43&-p|o6pcX(hy9HIxOP_ML$)#+?wyBuzE&xQYo+sKSvSu4Q zM@ple21}4=3|o?I(-0<5em6Vv((*b$rE>Oe$-jR(Y)K25B69Rtksbro#j_#T!NUYV z>OK=_RUun@cag`4;+;^^3@izr>8DsvN z)Nu}j{F{81%gET>)}|(MVo^yjSf@yo{iKB&2{)KEt)$|XnHE+`Jy@*l5Qt&MtG>@0%))6QM-6 zfGQH5xcb8|2#}h(sfi^$U=cBssjkz4jaSilgJ1Ys7fnq!vo%jQPR#gxXbG3iHj^al zCt}eIwSx(S4Jz}a%s-o>uv|NW)4;mU>iRhPS)JJj9qB^*y}JD6pVZvZy7d1)`sFA5 z81{cxzij(I&@YQ;{a@cN&v!=dKF5H+)Gy-mW`RyuEP@v3bx>%Q7rirGQ2$!-=s zG&ASsu%|vE(_$AhrxNwCCYb(c3)sSjTH2v`VU7P~UL%}r|I36+GEzu>QhSuP3jxA~ zzccFj*#CVO{`oe|4=p4t(JJ*0Zkt;=c#sibFS3UiZ`_NF5AelSCY!7yM|NJe^1^YQ zE?ZCOmpm`}XJuq&g#e_BLI4B2gaBl)`7bO|vA9%kG$qPvRiM|UjLBtlX#E0SbFJfv zRp)WsH2(;{zz%m5(q4y86fQ+p%p$1hB0PrSr(6uncZ>sZz89U}JgqPSj(Z$dt;J(Y zArA@i&=|-sLpuj~2*}K_Wf3y(UHORLq()r9>breibI8FwivO7znyXoN+N&6HlXo9k zo=T*zv<6#Ve77vXyv~RaD>7SiX?AAK>lI3?EPN3drC5#>KZ=jp)>=kbZo=O<3wh-j zO#Y-g%5j9JHsV8`W)E72n)OiT0e5yKPU|u)zd)h<^1BK(4m(gbk1~5VgsfWNv0|dN z7gpjLSV8zCGANQ$k%#CycF|X95prq6y8-^3a{XMn{$(s+4vrrKxI6@Wq>3oy zp=gVaMmPM#xX?qWZ&Q{f%5r8&#bx6_mW3dn#5A>#sp5OaCL0 zYqWx3oA=E<&l$M!>_0UCjKyD6ldN-TC|s!doxcsZ>Vp$L>8h4fc7El`#lp~wfc!y$ za8bv2pz_G*Zce1>OEzs8f?@#$evN$ji{1o}spJ0c9#3g56}f$;rmjo&xGHoU+EE*u z_m5H(e0h|=x#aptgb#U_vvU0gMR|C949IDadwyf{A!>jvWYFQ%XpiEvujPA$*OWt_9h zyR4l)c7Z3g8xUIyOG=y!OEk1++E-D?kM4on-sEunVTa3!q|k^(J2g^`8?lV2&v5l2 zFgLeoGrs<*0*L+oLa-mzJK9+Skh4wPvJ*Fz>DG%a|M<|PIUlrSN7E9z%w(Ik)g?Le zb!FYriqT*=$z{s6%oJs!^rDZxYLPlAN&lTo-)wL^(9Kpjd{GJi;vx-8ieD2HSFD=; zl@7e_#vEBqiu`Mu>pO)X?0@-RiZY9Dwqic*L8h4g@$ZfcR|TBEzp|i#o)W=cS&8CX zm{T<>?$M@;Ho;22-Lff=H#IV4(Q~zq z*z(WyMW+7#xv?lwcX?Wh1Yh~(nsybE)^Qw@GrxrtOOV09x?%H_^%qyqFx!hiokYn?42(UT&?KlfAEmq66O2+?94L8fEO|S$#nnN$ zfvrAzU1-aV(mK+GUbBr%Sqrz=2P{;12($LMmoRImoneP6EGvHSuPYELPH77t$|_l< zy)3Q_m&n$|NPzFL%76@&tyPpt)?|3^{2z+)OJv9L$E{->8xeCsotH1u1mThyOGd1Y z*piX$6rb>ejOWr1S{1_7jl%0z1t4UAyPV;Q)agiRVr`vxyE;PW;ddyIv`R*Fv7Q`L z)*1J2jdI-Ta!3mW&}Fy#4i_l0Ln#|~3kic!*(S;cg?hq5PDO^zl~GsPs_=tM{Ruzh z!w-L?)TK8Sb2CdWNqjUfW8=>)|v=JEl8Yh{aRJ$pk3tqIP z*kz?G^QTi)7XH>IKi;AQOf#b^B?iKQl&v=u^sD)1@7+wB*!#>zm7vTR@m+aQj zg2c^1UbCpfwqE(DK;WhpekFvNZjORdYJX@b9D41f!k1TWTc*)_2EU>`{cdwb!{szQ zzkvCsv)`n&oo91c%<1md)Ov_%0jM?Edda-UkowUa2MC49w=+m#!i$BUpI)}+(6Ei14P*SZ7JWO{s3YQr3gwt9Wftf z#p;M-vFJd9bJQ|jq|4Dtc2&|=_D}JIzV5|4VvY+QIF@9Xt58@IbD}n7gH1hMSS%+M zhI2ZyFxk!rc`?nkisTB`^YS)wGIHt6CB-V0YiR6J?2$>;b%tY)(B8pu1XhsNb}2IQ z7aMamP|5C#=qR{Z=PoxpWCmF1HX06D9=5jHxn;?F{Y9vD>El*y7a} zTlWLp&kAJ1?KE&qvLkWD`)!0b;v*xvS_-m!|3!&2iM0>qbsZJ+lsu>8XO`rV#Pm+g zAd?HzWU!Vf_RA-u+1IU{Vi6w2FWQ>uMeEm8t!2iyQqlyb)fqOvB;$>pm&T_M!GJx? zj*a*%CeCp(fO+DM)>z9&IWhYVO)fGIt$%WKodh-Bxif)f-EzDR(|$Pdi-$UQ5-7@S zny3*N;uI%=Sf4d9+bV`S;nIOhJark1otPmcPRx2thLC+8CYHC3;2ZLlXlM(Ia=1rFF@z+_G$kNYEmbkwIu%Rs71;g(0bg5j|qDx<^+md$% z5~iD~C0@5D?`$h?S#xKsX$F6tY~8ig$yQ6tI%MmDyS~5YHIprn>dRg*kXwL3BYC(> zf_4%&kx9@*>P0((If{5c3+}c}N?qy&=6)|QxFQgkdlFZiYyx9sG=b?-p=B>fU`UJv zX2=8v4V6e&Ql!vf&F!((73QY_VQwpY*FHd)ZO{rWQT%i^xy__^n?q11k}kP56qZ|& zOuVO=CB39dGVZu$el_A7puP=XN?R1si zzm6ai<_huHH;})c6!F6EU>D?gb6Sk~8X~ZFp})T3lXOP-c+PMr#z7M&zQ4QVjCV3#4@$E0b ziu;T2wxxz`W7OY>wCZ?sB>vy&xb4of!vfDh;+x-mMO`b8fu@;R5u|*xDn_FAHQyaKVE2@Ko?txhO0DUMH60ja z+5v2QMdM&}1fw=Gqak}mw}?ev9dUu{OBmU_REr$$WfCS4QjAz5#Ux>HZor@1DZ(2YuNy;vinn7nvP({#Wx)z1OIRVQ$%J$O@gI_c-gz+Su?f)3kg6PM_Jt&p z$KU%^@v^jv-~X6tAgeH8CCzfwsd?ive)$(I4*pI~BdoeF*p>55q1hGJiFfUB%W%%UR<(IIRtb%(a6$iu+{hw#+~!Gak;Zu|)c2E8}`~qV)%RF{Yk_)=PxG{xCUf zZZlkN%Pg)lF3jLn;-?D#<4lG3_et8*BxgXP^$w#2Q=|&JqgjN)WxxlwwZJ@i&)~Iz3zyrJ3I(ikuv?BpAv~+#L5JFD_gJzCnDwg`a{F1bpEGC;PCJUxi<8lDQ(>Dn zeQVvP@}V`migmt}D1pB5cfWcV>{P_`BaEYC`JL<681yFA=z^Sf7;53L2%UQjoxJ^J z)A;~1bkNcA0Y82EDV~N^13LH;+LCv(P<}UE(_dYTS7FUStofb3pcDoevFB02ryfkP zB6aD2-$kkWySd@>p5?btZn6*y3KTSm75<4o5^3m!u7XbVIsW!;PHvT!+??#;FF#%S z5n|g6u|!+)KSAt2nSKU{IqL|-tf1VDAl56ydO^&<2(hiK0&Zh_XP4|{xoSXcYlY6N z2nrOnrdh4hM8h#BtJcg5F<3k;yzYPx3@H+g{fL)f-6F1|yX-v*nn2M-$)%AK@<1N% zH|ln^xN`CNlM<~zVi52b|N2y|<+_+E=gU$RYyj;AE9k)2S)loP=B)I!K?h1g2|wdvwzzIHGw_e6E2EktR{E%K}f{wSY*jmyWbNp2WoXA% z|D<+oRXgwp~Lg_fwe39f6qR^vl>@%VaXrNW=026}}w_!Uiw)t`ErWPxk4~jy{9gXI0!b_VrgK zg4t&^lFe!i#dE@B5V=i+@ws^YRf!aDSpE$!!Hp#ne6PdQ(`AvTOP}94UV`-N#rH6( zOws_OVLFmyce0EHmik-b`-!ZC*qvv>+cCqil!@~iStt4 zNAhdH^UT()R-zt_#uFsFQ*ET?I8&`>d6$-wOn&H8k^FRIlO3Al&@@{IHRG?tDq-Dm zz$zICn-&U>Z(2u*2z4#L$Fs@>xKtLNcH*10&6w3#<1Rk1aT!nS{AA=?hG7u}WA44B z-7>M2v&CW*ENqD*ws-?r;+hUr?-&3~jDNeW&JW)S|thWvZT)Z$gq3lP9M& zvk#y1E3DMIoX(3in-`W?bjsG7SCQEj6_h(*UlrVXN0d+dUT0E4uH7vem0%Q}>~8p9 zjpxT<1^(r4hW|mtZ-zN-*XzCz`DL(+ceV2s?JM6u-W5P}OLF_l*Z(UGF?LP?wCv2= z)dd#1&9RPnaH~3ZR;zdOM!-97!M91gwN+d2juo_E@Zh5g`j70^=w@cnoqTa|ck-pv zyOS@U*qz+T8n+A`QZw>k?D~$P`+Y(X-Op#WqjXcb)~o~An%5I~_fh#PnwaHtYX<$& zO8Dk_)Q|hM2r$8iFaPAv0W>3}#h$uGT;XWSiJ6eVkKk~Z*HNncEe zF7&IXUblw@y>HJl4UW~?aN^1Z!Z{v#^-ehe zwPz*s5XbsFmU?Om;VVcFHw7EKst6tsl-U`#3^$sQJC9&$&ES+3%&`aE4a);as?N+C zU=eFDykQw|3|Ozbj@QGw0|ojoDke9m99QMp6S{1RHkQEFL6!;6tUH=^QlU-Cn>O8YBbd`!%8~c zKHOGqN@4v_o1u@uw(uZ7+=G^&@t`ev9VlAh&X4RN-j@6^4{gbxbSJMrx;uG;6Lpoe z?Eh>;cCSSH+*tBT(VN28w&YLIq*brc!KG2BQC|MUMt*b2>!dqR9{w}i6|O7k(6uj_ z!gP2Zt81UNgBJyQ9i^sS`slI^aC)?GPPuVzvo(h=Vq>SzxW=%muF)l;8DocexYL*Q1pii8Uhxdx-u!MwE6Gr#y7&j?|@c!BtmIrdFoMD@?}- zQ#t5OoHM z+R2k^7gVIA?kM+L`yoSR5D}@7iOqVP=9qRk(l9^tE*opKH|Sp+AoC?U(|{oI;LOrh zmTVl>0Nw(4PP$`e77Zo`{+pUQ5ZDlO0nO#yc8d@27H+OkGLls~$o1o&e0V9YPaBx%(0N1c0J1m~*dUD|8JJ5g)OzHYU#Fx5%C+uowut(*kRPWWddjwq)J zS|VOl=d^~%H*v(i88<5ICEKDGfw1#@j zX>7m`nvrc6JZqTnu^RMHrfJv!ys=}m!%zvDt2|E9eN6B-=Bnu^V2~5N%B-tKv~#Cx zKV`#;Z}u!fhrFsu|3rCRp8|y(9f)KeUAKaTJg=^fL3BM`BxJT*-h=>$KNHs zGAl-2)O+HR)kyNY{v`Gf&GG^V9(m%8j5r+zgkm}a+{B*X2cQ;j7Kz+?=UI`uIC`hI z9M=!YKm;!nuw6jG_bC;{&yW7hZc9GfvgXWH<6gtZy5w2SZg=5|mnw`E=NSQU#rhoGv3mbmH40SI0R*EyOFN2ecH*?J zDgKpOsgJdiX*BEf#Mf6K%+^461p9QISC_i9TIL3YXh}T)9rDT+TtjxHrFu}d1lJnT zW`6O{+&e7@O`meQ%oh8ES}y%8!XthABQiPW*v%Z0T@9M_{*p{@kV!-8wE*`;BW8YV zNDx99;R+e{y>b;H=+<(eOJ)2^DEHVXU9YBkB}}eSVuMeF=iM!5lDVwC@JC^sar%)l!DdTuN74ZWj|yZf148zOkvEzaHSG2;h7JSTBHfXEeDQ z%3QUBQLY0lmpmY%oih*H<>%0fu^Ef)+Kub41&_D2Yf|B_1J|346LxJfZxlaxSE2qBR)F!|q23U>m|GW9!$(deMt zrc#nL4cRRGmq|iUkO`uhfbQy`Z$`zR_#=65u)NM465KHgzb#fZAVTu2(-!+Ge@h5? z>4L(r7LA?5{yBTl8MDv3r}DPs3(`57gyoXYm5d%=hZRz@Ovf}h>BxvXeFb+Km(*Dz zODu5GIIFbU{(t6PXS_h+{gaCuICx?Y@XJ8{EYX2BQSWS0N0vbEOpWRofVA3KE)1e$tUf--Mv+A8m=5@jxUt8=Oh6~e+QhO|iH%%pM*6WZkZtNJK z>HmqREpYWo#|efyrvI&2czQCB=_?6P3TocVM=IM4=E+$HXCG&ey`ah9aQ-`M;BkwN zV|CFgKN?`c+z8`sk~@_vA2H_qr-U_r15>@Q4?ueYN*#aV8H$rqRWBAjAlwpEXA*DI z&g#oTW%$w`1Pc?d#7A0P>Lb;$k0eAsQlH>`q;~c+kt->%SZToD7Xkl{1D@(Y;GM@! zAx)E35UPfYhQm0VS=$(uxafZaI`llc{*Z&+6v3VX>|FADB9v!|r_=2y3_7WW!C4c2 z5EXj(3Ctt>c)2CtlRK{$Bib!hYL)>UH(I9K{1%%p*=T3|Hs=z(054v!;Pbw^FOX+n z3h*MT%YLWb_7_lFz|@k`t%MwUqt-RXW^8bK8G;qo86+P2vI(Z7;k&`%4uO*j>zOMb z;{+K`hIyz#IgU)@G1;lY%3ziaEt#C>mRzgAT(Ak?rhq$!WVc2n`^n?9K~uFMU2Iw& zw1Lqu5X=tSTFgYpP94c5uPuRmgS8I>N5|>ew%(GDuJL{@Ru}wcgTkeT-?>YoHm%PdwI%_!6!(S;NIMH_z??OI$u+axKj&BRY zZ@SlUEYO+ZH(l}=ew(avRpGZW$XM4Men$04RmH(j<-G7*0qL*-FpfB2S8@!i!V`|! zk>w6J{-c{utCpWoAkZf2$u1!2hma0^Fv+g_VKkC`hy+NtnWg7vRv1!xIy(9C%J(}; zmoasFkAGA$PD3$3*NmdC?U7`6dslZP6F);H3Qq_8qK+3lj5dw1R;(@gB15;Vo+4^h zNxG#J4;GI)08N9Y&^&76UeHe!^mG8dk-)bX042p}EmoA02U!t;6h$MDHis-hcw`52 z$PdACn*#5`u($hr&Z-1)b^WSb@&$1RA+0#;wK2P3j$H?ybCJ3~|CZ@( z?KCyX>+_QLZJ!UdbK!xT9EFC8}ipE{m3BQ=_Fn2 zuK8YLXAKNSa_}L- zc<3%y^1~2=bOMmvhp6|z(~8>#P!fN$-G)E614=_PdTmxLkjr5G+e@zl?F_I?5k3r9HCczyH> zBd^Z=9!K712Si?d*qgi$hTrxk?=S3I33+EvKwfLeK-7>)YRC^jWdaJ9;QxJCXa2Ll zES1K<`sJZi-p~gFSqo8vBCT(N^yfcJD3T@hzKeQ8CK3%0aSxGXva`l&yD+Nl2-Sw8 zubS--fv!69M?)e%Db?|OyKL7f8|X_1zZcb6E^?UJLA1H#ixPehVizDZBc(L; zuVxFm_20wT7T~qus$B9W)$KZZP;McXDYG*3=$XZJRfP0~zn4Rb={#ec>{2F4tO?b? zl~|Ew1yglLVs2)VHCm%ucbMv~x!l0q6oEMiFa#u_XJmz#p#fJbn$AfETIOh)1>&I< zB0K{G4^hK3UpmMsD)2Y$=^OaE6}7hhJvptdfstJ^+WcP0j}UgH#x;HrtP6)D{#JqE zy&=N;)0~f)OWwFQ&8pd0GKOZ4MulcmNPNgGxseumD-}n9$cXpPXcoJ|hIpanfV<%! zeT_F=Z*%4d->Pyh(ThyeIcI&|>5g?%IO@6S zt%P|I>(6s})4|0#j(Fb28`o_&y>&%re}t2kyBO*$hNaP&obcb~GZ6=asmrb8bjH-)bLN{L692ym z{{vj+ZCqi}T^|uDrA%pM%A{?UH(DYtRhz$0r9+k&lb4@x!k2v2bA$RgQ9_<6Sz4~nOQJgG z_DWxT!y#^#pD#Ut5oJ=wQkSveyHTOne=B*_x_7;>d}a+gfk>6QSmHY!SXP?U=kX-j zj5pOW%^YZTEMJtcV9hQaHbexCtu+-tj_BlSWP_vh26J`grSAqjiFjBN`^*_@w)j}zh(~etknQ!7Mc9wZDa3ly=dj4bj;K}}&n)rdQ zixJ+^eatiBU`xcS{gipNp9Z`|Pvnx1m9#Wrz`RV=mwebw^+EfYDUEGGwGyg4K^p8x z|FKi(4U{fv;(gBB6|~?*3(+#Mdz_48x6Uo|D*f=)8U{7Ssfjb}jkR17=ufgiZO>!l z3bPAtiP(P#GNWL2Tu8S>BVb6dTcn==_{Xn_naqI7bIDue_8ArrJQd|4z27pZ8!{cb zMISwbg6YtgKz;8X(;H#(Ed+6FkNNc@C9Dg2%*~d#uO9P>lLCPl?ThLItR|-Ot5)LQ zwnq%=+3s=D{241*TvDngnFqMXiung>v#C-i&!6w8HWK0b%x|FDCHh|C9WVpwctg+X z2xiZkgu(}<;eKGfL{F8rW@7Mt=bvJoUnZ52F1hIBz&bf{OjBgYYQe_a;-$wPIwnt9 z%S;@lY>Q7zhB|jnB6JHrIxoFH5m9?x!$>mcmQLIrEJC%lyNm3H{Nk63os-xHGWiWc zRQ!5?oXA$69`K3r42BBfp<(txD_@MT%@r*d@0k&z7NmTjWzC*ga|JQ0$P-1E>}j(D zDVh1~u~;yLP6gXB>|jrM*;}BN?{Llq7GO5~LWr3TT@;k?gvntxqUg1rfs5^9!E0mb zYiq|>>=WL}vbA_8OIv+S1beoJedqv)P<~v_A3YahQBO`slhb%=r7{0b5s|?kn%gXs zDr@V5=5>+Q-DnFDJXwGl!Af$+aAs_<&4wPxQjC0JR#vS38_UXiDV`G6yf-{cv0M#* zO)l%(I00&u+0IPHU1Bg4N@);+2Rj09-p0!-3l}lz<`eP~(B}OvWwSw`&8390KyvcR z9pHeswd>ioMmjL#KSinYC$Fe1xFvarZGFQkRte|~*rS_tco?*g3b_x*xesDR?j&@S z@Eu>QFVo|A^Rn+2q8wQrU&og@X`kk3#rCQy5CbnyP36URt7bbjTAk-fW*L^C zj7sQr3BDQZe!4Q)dTpoZD$7ld^kmtGuHk6f|4)uswXF>5LxEzHP-w(CkFybqhZf(% zIAbd)8nN|F6JPfI>8t3kC{%+<%m5HmrgMZQZVmE8r{@*@|+5X?}Q6Ks# zkzVS=QQR$!}@?iU{4ioW7XwlQ_)Es)Pzfo*V0(272_ViJA?-;POa z=_3ZLWar-ay~TbHR(8n_wPT04JsaT{7vmc=0360D z9%eCifNj&aox9AatCrt4wt`*7j|C95e{B{t`Kut)4RJ@UC@*i8AG9?8xea^>4#~n>{j%tJ)jV`c8<)*Y&>GgRu>wAy5p!uOX+bbC};Bb zlwor5VeZDvlAc*Q3z(B0I@Y1u`0dde6Pl|>UAnJG;x+~9GUQTnZ|dxyU9@!;7s&*8 z?L&}4MiS)ecZpUft|&)!8#5b&BWspHAdDk7&3PK7Z3hqV8fYZ|B&1$`+IWb1VyqIY2k*#OHgkH>Pk!?GTzI7z?~ zQSEZAD=jyVa&C{XM-NlbDLYmEH>211=CoWf9!pQl#*miSs`u=ZmLD->H(-}~WHM_0bzmKWwqUt(k8_9#8l+GVUN$+*FsJG4cr7-G|3{EKICyE?TAopJ<17bG$p>9b%y3hBC)V1le? zgS3hVz~YWVe#fM;)T)DOG@+^dfgD@yqlfl&KDw-(-);W4*Z*$yzdio9%l~%x-+TP; z2LF4T|Gm|I8K!35Q1@eZlHS$Kkys*u1ht9QE2NYvY?755DwVgR$$g`0B*9iEW|814x=|qWG4iLnW@h@%+tf}b z!5E$1#K}}7p0_D?+k3^a+&zD%pVUwtS;L1CW%;y>`>xvaHqG5$EYED>DD7-bTDh2C3>UZLRs{InP|>a$nx?$Gsa^0l zS1JL<$BNg0Ui%We!gKZw^Fah*tX7-&wMEZkPyb`%-A#!-y*D=UHPtoSuKk3%TGbn! zUL%Td(cAeA)kmD)P%}FHbvT;2e{_0`51GxQ(`)tHZQM})*)BhMYx%!!ZgK7(=DxB1 z4XdO!Gt6la9}*U0Dr?_x>p}M|y!T@uQXCNeOES;s?!d~%Z$G+hYDKIgo2w?k4J{o{Lu38t5KdyhW1 z3*Q?qfieJ%9|F(-c<%g$28enYL``)xQdL#{q|c&wRG+_o+sf%9G}(GlES6tKhT>aF zptrZ1c+Saws1GKlcPFmur;6;cJ9wMBJ$H6Rdv@Bq&XsS?ezjuK$KvyP5?AQZqtvFd z)W)iLFE>90BFgfV`|{OruUOpKj|GR zArOro1gSd6Q&Ci-(-#^9nIh9um1Wjo6zX}56DjIVY z>38y)8W_%>04+8fY9z#FbwQCCq~EA!ZODK9(PfA04?elXRTj@TvR~q=CBV8t$>_jz zj$$_q`Ii=6vd0edcK0qNjV4+TC-dFPoLvw%&(~`tq&8Kpe@%&(pPYSr_SA|jL%_CW zxnJrprcmN`<*iP%PE+2I`b2Bm9x!0#9u=Wz|NLgPp8#s#tuEeWTFWZ)(2Lp2E3$7- zZHiC&u2t}Lt6<62{M8i0EOgm2mc0CTH;6-Xx3hfz*5WVQk*#Cip_Da0&CNg0c#=Ev z*EBFzHk_?aKiu?0Zqe3Icur%`N6n8Bn?&nQa_2B9=@X8r6&rYFM&T{kt))^@%sDz8 zf%K=3K{y}``|Ddb!Q#SUyeIBhZ}=}l!q@*+H;yh%-KmsV;-t;lHC>16c@~G+Wrj0r zw&s8Sx{6@_F6vmCv63O#6IY}KR3|PZZl6riOy~M7z#DD(D6l%m0s4#p-JaaqHo5rg zta97;!zKk49nbg7M~gRP-y*3gdog=lg|+fHRwBj-@10tccg%~6c|YSl)B$dMs)Mn4 zpo~r*Mk_Nu@~olf@cDFiyx;RN(>?kqLu*xfcT+sOpdxc*0|!f< z7f)|*-X210u%1|f9(F_9ir5Wn)XN9aZiXmsQe9xy$pKNM6K1*l!z%r9~ zX~-<7a5&!JQOp>wL7oNi(dnvlZU+e3_^pVA(c-SmZm(ZWp9%+t)q3zqkZW!ShKM&i zLez~A(|s+--GSNid40{(il=Ae^ZJ`+;-@=4PWczZ0%2Rnz{{Q#&zxeT(p|bTJ0P>q zTzn|gn>{0*v3iRA&{z1Wq3X1)9E1^D{tm{y=C^pdCDK14EgW$+wTJ0C*veig+5Ci& z2etIJ>^WBXu~eSkp6P3TVRNP0L}nC_=wMF)T0?Lj$`yYc(#ykdI?&}7f1=vKH*8Uz zV|DS-{Lkp+g-<|s*%SF6>g^)loXAaToWK64#mN}^RTv7Fwl7`3s&>CJcg)cy$rrM) zbp26_&h_7mzZq)}e*8>E{3_W*lg^l*xMMl-fydXRcjp$C*ESt8cS}1*KF@n><&;T_ zM4|#%kuE4jg z07q~!3hYIq+ug_gvyBaVI0a+|Z z_Ff0CVD!jd+X6Xh@?+j)5P9+oT$b+joAjD_ta-oUUC3kVc}P-|J%ur+c}n(pnLTys z-Rtt%uU1jVd7oUr*|Lv(%Hv1k+)-Dxb*O(>e604+<~T-w`SkS#J*TF|4%e@JSXrFa zNy0gw!0e>AwVPclWe+gM2 zm_ZPERi?jVF~w9WaR;w0TdS64D#qkLC*9HC(Uj=l@_21=zmVUL_xE@9Kl8&s3_RYq z^w3yx>9MiOrv08Mg!1-y-{XD#&qp>hmQuy0(L=k?HrAfh&}>jRN}bJXve<=Yt5lPG zB>ka^-#OMVe)%rxuGtYRHQ;Z-eX`+RJ`u`sLm7SN@eSLD>@1^>%lLm)*wW0V{tn;h z%*ORk#ZZUqUyU`ga?NpXt?xj|_UHewGx5XDM6#!KOCo(BDeIs1*?3O0euu`ce=TOu z8TYK>tt~h|09C2yLsjZEdrnVh4jxv&yQ`ep!#RvEh3)yaugZPMu9;xPwGBK<)mq<_FJV|Kl!w30+xgHnIxC0HGT%l}8I zviyv5Vllzp9D5fT;9bQsm!+1TN*(&BoYktB-+2D_+|aBNsjg+`Z4!-((_DQB$NK_!e0$&zJ0I^)d|kJumyo9Q8X8jE-*By>OgzB1|M|j74UV_Hmxg-s zOMFQig#|QsX8z;vqq%jkBY!?>qyKs9rJfse5a>(NJT zT)uuRJHCZ4&K&GkLFz|^j zdaIhr+xZPAk)r?S`1bU7cs3_m-v{ETpe>J|RYF4bE^LfX!`L>=`Kq+^%tY%; zkQST<3NQ1Z_6Lf{_?#EtD_hi_2e$8g{ISG0j)#VcwCo@1e6{dvab^OI@he=r<4Gos z!Q}_!FJVgSi-IuFcWjfG@I}3h!QcW~hoq%%=C`oeH8m2%*1tE+RQRxvH@A+Y@@7FP z$@BxgKTjJIJb-reDLo2AI^b?mN6m2h=;|}oZ0Uq?8tJTtKqK{w!sE5l-*awtKV&WZ zi{O=1bFHi9YO97p@dOQuC)~!ExUgX%2;1l z?9VgVjK#JW5}l`)1kCR#^$)o7Y%JxD#SGrhh4 z$wV9T*VyCzsn^PyX71iZK+KQyE#JQ-)Avx`{Ao9r_4PEB@7VHCzIm6)ZuwaDU8lOC zxi+8o4-^lu-u2co`nIn>pXxeEQz{z|traF+a-#QF-UOMUyp0C=>1R0McXY>II+9N| zA-q=HaHGL?Mskuh8i-%<{ATziakgrncxBJ_f({n8`Yh@3KFHJdq@mh$Y{Z!U=M$}; zCMTkCE%z806IX%0wlU$sB;!ncy6@@5J1 z6yXrGw)x|HU$5^`_05lHJSbA4IIToKRNkV}Taaw^$I9zHeG1!2Y47hSe3IYLo&f5< z0QH{Y^-liv9M*XakZ+X~MgPvsY(k>2ffgfr_57a2Zv(&Q@H>;=^S57u$8cf8><~{5 zRN38C;es^L(MK_^v1b-P>)b8H8oo52Z*Tg3xEYB6Zc?x#>Ri_zzrr^#z-Q zTIW7o{N~d35EW#LU>|pZ==#D(8`Y;^2>oeh_S}lyn;VJ2q zK6`Lm#eV!UOU&?Bix2oaGx#*mV&#GcX-Fft5aUtcJ>DKfJR0BZ0aJ@2Xal7vCIpp&1H#u zPaMrWmVW_BnzyI<`P3y1b!EldB>$PmHq=u|ejA^_gPUGJ;LP~CXH#9L*$kM(%p;)p zO?8~jI9T{+Ruh5#U>cOaW^DQ9XA29-xYX7^GTow3Rrd2$^M1ePOX=rUeL*e0f6b+{ z^48kKRf<=%7N=M9O1bZO>KsrzYQQVo17xy)9Y zl`k798*YB4c&hOK{k;2Ee>?r0$DUHn5AaN0=E+so%BX({X!FlK3M)eT+=fOUM;}+x zut=m=2$)f%`1A4dfwv*uvH7?vvWzx;H2e9A-0Ft6ASYGb{C{}rnfkfA6SvoWF!l5w zrWV`kJ|Y*w8&`~oM_EaJaNb3nx$x#&tw-=XD%i{At9&rw>aGZ zSG9JA43a4Z^lBu$Lj6~slqXL%sXH!rmoyKH?zwZZD{w%%* z$w68pX~kY&TmFnwsdC96eJjr7R((r{3nK2hq}Czw|8as<&z9gNPc6-yS(8~%UHAwT zPuy{4P4T6$y=Q0cr^o&#^QgG8n_+fN_SAUds{0}7yx%0QRz$(97c-~E@d3BZ;3d1D zigk}%jnX^QTlkW=>g~MXg}-VJIx1BtOYbJtx@>hKt&Pd)Eo&R)5W+3`vku-9tE{w@SAWIsE=FqIDs*!r=h5(+Ju{wucy@m{`Y2}g&(-9KmTo>Klh1Gimq#pOBdc zI^4YSu3Gn4fDP-F3#!V7GYhH$`48GVI06~E%bH&(cEduN5i5MdR2(f_JB?bO7Nh^I z-P$@_I1tVly)@jREE+kSf*xSQ7Y2lki|U+~VzHR{oy~8}_SN()rZ99)evVXE7z~O;a$f%k=OJz8ehVfwFdzg~;8L7Ba_vD`Ji502N1K}9)UrqZhO|4^VU0Pw;EE&%0#OcbyQ%~ZwO{tD|N@5O+NYklxHAQ~MIFmkKWNS8ICh zn%T^6?Z7;u&_emoeXI;JVI$a~Dmv!{1*yf9SZ2{c{*$QWRL7jQDf`HiPm&?1j@vk! z7SCI>qvq&chvBJbJe9*SN-(OG>em^m@N_G5dJ+oV=eXNa}=Gkz=b%(R#YiDF$bw;*e6KQibq z(vkO0&b*rcPs+}FqWOiA@@o&Fe|pf@j0YVIX2M9gzSrO%#?nfU>A^iaGYXQN#UbN` zPI{h~S8!>}JdtR%=<;qbsxN%Ll)lJGiOx^UrYOOPA&G>tzDPeq#qI^rcT@A9HlOH> zx3`qS+jGG{YRO=1&jo{pb?X0%b`(xS`-J>layE+e<7eLexur{&W_~Z{4Iw$R>AQ8A z9?Z^anvh-H&`3fJ?RjO!o?_;Aov)S8da$YXPAk*b`PvK=&7MN%tL3vE%lxkSx$KEE zwNJZw-f&{ku#o?F`MlnBXM6PM_;qy4J5^I=CnfVItEZnhGjn2<*tIb=P`~~Gu|L(5 z%$!{TYic>=scfZ`N_FNH4D1>oN>lg%%7f$DPmC9T7VtAWy_zXW>ebPvccve<`_-G@ zlKHwVWg5r5!Q4q!|^0R;&4esP)%qM|yuOe>A7+nRe{<+HrQI9c^lO zBqu-}NCUbSvQD$P(e#}i7GF#upMko&906sGHvfe%>qPooaRV*@;D4gk4eu*-U{;f9 z^*5x|6RpD%o;Uuy`fIYOy4N*nY)Paa6r<6@M;{kVf2tB~zbDa#fLEotUd$(V11y@J ztUW*AXD}Sph)Uy!gLMapEH)ej`E5M=sOo#5k&m+2wL+k=Ci5b)R7EGy*M(70h7bv( z%_|De&^c0Hs46Qy;MhK9eCgriERD8>M*5i3j{*H(=3K4fPutCOOI%g2ZraNjH zQiR@L9gIJB)`~2T(AQEUUt-MIus`pKg`J7-aPa?@ROh73qTcMHc=qHfhQ9|hi~4Mw zN}T*)S*OAc8!<8%p|;v7oTkJR>A5zTC^~>~Y9o42;}p9_ZJfG|J>_)%SzVb|@zW+! zPYm0_>pN#2HF;nvaW0XyX*zM z^EMHTDBRZc5xR2KPKcd(488a&ex|E-@K(05M4xq(bvL5VdKoW%$DPd0eV9hmy36O# z)oec7JF9OVw-H`-BM4{LY@4+ia->Hyt1#O&!DhdKHsM2{M5~mDY_Zm#>B9@<>Cv_O z8Nfta9iI}nFWQkF%`GqQKE7;D+qA^hnvKtU`SQlhn!(JT%oEuQ;;c8m!1yo)`|#VG zZaD9a!42e&WiJ@W{ez6=lRGny&e}Zh<-`^509@fH{un*?9<4U0 ziwHNS9;hTZmq;&H_9Ksm9vjQLkB2`mHUCL%Nwi8XGoAPGebhClFq_A4d{L&%#zgu9 zbRCf0eIhEM_1)@Z0E*2i9LS@PYU3BGLes*}cnr%MHC7!&^F@hc0WAVN0tpHuy>h&-7jH^JU#-?@x`!R#v9o zC|hx0?vzm~DtqV!Zcurdm(nJ5J{50osXa>>n-8EFG=?=!Krzxl7Un65tJ0!;{xEFn?3q=G z`+$~yI9F8-8nu9~PJFD>%$)U4nMLwy*+CEInyM#fM)njkBiKf4J9?#jRwrX0aPH&( z*alfem^IAAv58)pA+v}ZTbiFu+&4O}Nmaf=E}9shHM|Fgs+T3wr&2WV&2d)?IXwR1 z_{X_RB?Ba;Eg@MH-_8Fm?k;9G9{Kt5AZHF0v_mpIy6Rv=C$QfWH~l~Cy$M{D)%QPs zXBhWoP|;j4M?(cg14IQyMFE9EB*8Q@#{mWg1BRFxP%}jVbwpfB%lc$$tCf|NnOgz9OX;;1X1mxIFJBG0_9vZ5`QTmTwU}6 zUgf21D>Q{#djzy!uw#_19(SV$r*y?^uQYcQdO0!Q$ccW#otf3}MU;qv*D%kgGFts@ zgg35Dqw&|tOe*b8vihSD@(#Ub?o@D&RE{tl>TZ6a;HJO%C(Hl~kY(j*xqt#*050O^ z3e|?9LqrwhZK)K9F{XIAuJtfToQUU5TRtSFf-PgXs!!%OwEo8uvU0Zi2QULpL8z4{ z-y9G$o!cjHFQ;Is$5CCbT89FO&v){2p<|>k( zY#@vGgog%wXxm60ufii08s`=YJF({D9@L~p#)N_Pz6)0Kwfq-P2Wt4ak^BNF{W@QGSrxZN(NSxWPyYZhmBUxG|&)VQ(EOyWCI4(YvL4g zGJcZTdcJU{{kr81wT6)IPv)Hp_6xnX)+2B8ieYcZVXsjz z*~hz8TAOe;3MZvZ+ z!L*LEZdMmHh3|S~$u^t-y6vdh)qrfxQNhfo+3C>#taVl+!w^A(ln|UdlSYe2ELGq3264!D!Te}^#VHC< zrb?zUPk0L=?4>TOgL3n4^-vd%zzb0mYUZG(KcJzd^CmJqtiTF@Wb@-n7dom-bo3aG zso8^gd2aEy*BqaO17%I|ch?xd4puhyy{Jy=e7Vykl5zAFSU@otu-sQ$Pdi4x{Y@lv z%>Qondm4oJV0-eQ@UbWH@*sB<(aM}qMtw)i5$k#TE+}`oyu&%(8F*3z8OJLT>f~qO z?^0SI8ENN|Vpx`k!0$#m!ch*wv)sZ%9N}O>2#<3MZ%N_Q$KePJL?G&17$(&jUXQ!R zhw_}5Z`3KYFdqRBjWt-E74`#{y0Hn^hc%83L?Gdpf;noz+7#+pUBH#7G>NfV&!amu zL^Jkv*dieLxxgNff2*E)<~u-1!EF!q%td%1Bu+*wKCaLM8mLnX$D%BHr^9vXStOy9 zsPZZElE{cXkd-x74|{)#BbaS*%aUx>+CAW?m{B6jX*!925@~2M!C1HLs{mG4bB195 zh$Yr{+nrH_xBUuw)ujON2*-%_LIL=YtU##C zJeCLl{3*&{b>VyHhIPG=gz84^m2q+ydnjn*IBE&P#_=$q6$FXqYwYW2j|DFUl>xl5 z=dCU6AHWaU2CeIXcBDufpnIJ)o?Uy+HVBFsr<1@xy#(A%ZFLkUv z5)swk!_QfqFBJzZcRMSX+5-*Vg&D;KjjjX~j3Bv#FmkHUHv$Q0yap|0_NIv8G~U4* z)C?-FI#?5>`6K^+EpxzOoNaleq4hC4Otvl_ww)+DeDC<-%^wp>G{Z=fn^9xe8 z7H@gK4fbG%D;qlH6}YjiwsrI87F%_lcfj#l73U5b zM5|9$94>t)r)~LZ)Z)~!wl)NutjPZ@%3KQ-y9G1g!;lzrC#$KX{!p4&T4JB2yLX&+M)nARN=S@_${(h3AP%2 zx4@>_ciI}Q!Uyj_x+;4<>Ot!pSPvmu3RFJhisL;4OZ$%WRL?tzkvp6HDH&7+Y9_rpwpMX*r(!$yccFzU9srLp$Vb=^gks{xCCmt0;RU9#9T-ODWF)U4 zY~$%8J;6D-o1aJK^8<#pt+?@xw7ZDKIgAHVHB0pI2|Nn6N`J8e?;7jVvdtJDZ#+Hm zMD0`$+MZFN+)ATV~5=O`OEd9ln08kOS&D5!Q>fNF$OFQc&Fyw&B zdLWzPmN-C$ubio{M;}_2a}n9nCh|DcKfpS{lQ4oDX(M@@6+LtAabo9C0HGPQm@SD? z05_h%fERRB{wOR2DX9{{l03T&o2;xj?rz{wXf$@TI?@&OYeRcRTWJSXRDT~nP>XK> zhu%PoJx#l*Y!v8U;9W@75|wC*UbU$9Aq zp%8k=8hzJv31i384_lMU%0}o9*jnuY1%X3ClTjSDps33Hm-@TJB5W>rmQ~a$xZDmK zY_!CJiQ9bC5ydS;{#<>Qfo=#;7rleT#X~(wjr}>*1Tkk&#l!-8I|HGUVN8e3p<@ zAeq%=gV@Lp6~sy`!jscQtdB2_$5g3l;_{rfi+EW{thx$x>jg$DRItC4RkbVcIGM`1 z8MwpmX1AU|Nm1#sM)~l9B{}|{C*;-5wUtdkk*Jttus-8y zV2;}ZQaU6frsIqEV0!o4LAtZ;>RH#Y?xqZAtnI`*4xz%N6w$&cTERx2Wq3fWJdU|W za@A7LJwmRPJWPcnnIe{ly6~NPkT>T3N~=QQM?){1Dh;)`YYs)55eEe6?Jz_}WMEIW{T?g@qp>XwzHkk*Hfk7xuBWjAYZYn;I2o)OFgNgx zU%u&4aE5rX#@vVtpIz}v&iu(xVW6F8V{bA_;q_ZwB&ZFv8bB8Ppi( zbC%*das->bcv{DTiyVM5M|9 zzMgVVa|885J6zK&rZkWrj_t&>du$g32|=qh*CwLss6F>%E;i8N44gV5T+y))IzR9c zCxCf45SfK+kCNv+ zUxYDx1g$>7XDH(@(0|kziHZ4PB!JMt#Oz^+#oNDKs0u0Rw6gmcJJW96z<5xWtREd=%Ng0W+cbY#}FHtgz;`qPA@0&c-0uVnNdFH_b`}ZGeQiK}8}_wmp=V*?*6S zIHh%5iyp!ox}G{W9VMX$DhP|}nU_$@N-t!`P0#sLItqifYCugssI-P!1U!&Mrx%DZ z0Hb3TZI}Xyd<0>(?>ov%J+GMjAbuQI9Vb=-E4X>Ri8%-rD>tCWb{2fdKF*Ay%Nsc> z$17AY4!+iM6v}%7r*UzgHTsr%=?4w6FBt_zbs(IcRt)9QO?X~~N~i*?FkpBJZu>RD zwIpAK(-*j1RlCym8Cp=Bpeh-x@VgZHD{{|xC8&5c=R_rO_X5iQKT$)t zxgjdMv@CQRMO44Nsqj~IVLqB5aVPAH5($1e!ATP6sHFkZ;!gD8S;>-V@sw=#0twjH-qGp0gb zQB^I%JaR3<$QHO!QO34!P!r@l_awrR##K;-Eg2YWs7Ht0= z4r%`mhg4|{MKn(6!&q@u=|L$ekRzL>f z*u#QX!q#Sm?OiCnOX34&B~)P%Hir3sp#tQKkJVLKH|O6DEs3ZypT#nZPgc;^QAdEse2LD)JW{9-e8@NS zqS+Jjh%hfh_yU>~IIkf|)Z6|fWK=$9%c4DM=pg;WrRA3))r}QWojb=sdVHUqG&P>H zT9ogCSO>X@gt$pcvk~JUBNPfwbzx`JL`ZLFiGQV<0hZ?xS4<&HcHS8n5t-KG~5_p{*C26bqMRi zrtWE|^SO>hVq>Tpvmd8SBxYh?3wDG(?C8J60NWrtS!xN#!d4Ml$k(LmxdVZ55K1r^ zUl1Aag1SJPcf4FM4{XF?s-bofKLC5^3YwtC+4IQ0m&8aoM8`u!u`4jjC^j^Ob|0-snXY$`7ky_BavahjHS>KToIOd=63f6Z=+MyZSFmi54@%G$X0 z>ArPeSU^camH7&q7%g|(0>UHY>lM&&MbH!$tu8zS^gJj_5(@ZOQO^(EC9V}vuNed# zX;>)bS_wuFf?Q`QDSJL@U5v$7=#4Yy!ufc$o&<6< zh!$L#M)DtVXbrj(Oxo&XuE4cmttH?$V9O6O4Rz#2VAI!@LHwN9lY{M!$F3==;tTvD zhQ_*&2TF|g6>u}~E-R4>)!BNd;C3j;geoaBgl5FP&_Tdmu>B;>{=9e{CeW!qgVZ>3}2x9DXQALOubz;8P|ZP`w zjLza~>hH024#G+#(Y6_cs`5s(hy_<|vK&7j3Y83g!bjiXTWScWKf#7P>wZ zIZ+z>JBUQ%K*j^8%UW*!mF!~AP#iEsfr3qecDmulg|ui~*giu)Rwu6?Y1Mg?Qfj75 zM(bd}4uYM8=3)%;ysVqJNv3GYRZe$aY%TFIb<|CJH!3Cg!AZ9V*axIH%-E&;)3trG~hVD_9yoyGYs0s>BwJQmG&DxO5o#Iq&aj*~9 zo5Eb1i=%Z>S5-02jHs{-zqHR5dPqHE9a3X?<%7)Y;>sp$DnkF*+G;P@rh>+F-x>9q zhCcPmt%L6t54uY!@=kZf{Wl=UhE$!Bk$1|@DoYYyBNI!dIkjYv%CDT%s!`h|6@>Wo zVZjzpVa3Dc=g{rB70|^N~*-4ggGSM!O=P(sCK z?7rYaSi1P^VO7FLk@J2y+y_;PB%bJHjqN1S@11&6pDYerl26U6G8+r}QA3r*k6FFA zpCwApm)}fBx2yHw$7rmF_x(}g^$p$WiElcUo%XOoW3R`sL(gtEkCXDTYE{;}y5+AR$jdEQ$kUWcsB zDM973z|zVML?6_Av<25y`4zmZsyDSejQZ-(Oc9}yo8nbOjk9`-M>BI9juB};1<0|V z#KJ+^uXk^(hzi8Z=Nm=_?xYih#I3JpN%t|Lp!|UC~hno_isEV)qN+-O8 z!_(V3dAb*g8-qNpdkW+`cAfTA+&lofQT|=D$I)=0f3vv{W=G1AYUh|A$%7_H`dTy1 zk;`Bl%l#nSuSQC6i15l;KD}Ka& zAngTaU{6r%S#0ry0sNdHh>sg4PvA0Q)#H7K&@3ISURnyfK@XgYLJg95_V5mq%*kW1 z=N0Y+58sl8vtWLW`6YCZsSSz`an^4;krPy`s?be&S4xIZ^neo8Dm*kLQC=m%i}B_Y zdJ*%Lzq;TRiV8O=Y?wcHH-D}QrvE04?G9sXN~ojlBZSHXYS_hu-=5EhohFLJ#kc@ zP)Ig;1xOr>)p}R3`jF!1?qaJ@gXRR|s{$3UvbOHPX9HsA-vvjjh3!Mj6?9fGl7u08 zur=CK-graa7qHHyE<>;m_)-awG~0#@u?xBP@4t!?HUE0*NfYz3Iie!XMaXT@bH z;^;8P7iX5X86?S2F2kfTX!#OUL`>3pL)>sld}Jw#EmjrL<^b}96hlHBNogt@iC-Y( zt?D8=kd3_;sSI8lScEMS#Ins=$9!6lK;13!v<)nE_Q!Tr0TqYw9eUGpxx|}D zC?1m`$|&)l4o4#Nl_-m z{R4T&K!m;^eScg}TCfRIvpVWBTH`}y;Q*;MkLw2(pti)g!^CvIx)ZP1CKaRyn(Gf( zBkty6Megd(tEl`IB>JPXJqe)Yx}eU6P`wr>c>3+Zl(G|wi>*ovb||F#cxYCa2>u5uU&v2kp!Ik(AdzSjDiqry^bILTos=o&Q->1eM(!?}y-Sd0>? zv28CD0ATlBrE!2!LEdur%k8(?zE)VTVeztDaHDl@_j8XJxlV&*#FS`W^hHPcmt=GD z^`23jaJS^;yXx;Yk^a4`;AVa6P&Tz6Z5cA_0jVB-W&6%e`-!%tX{P{e_P(iB@ryV2 zohylMzVCFs1L*PNDjzPX;R@3E2+k;Z`KEPi!MO%NbHn17ZxvwSzgq1uU@5ag z2YY+pS?jOGUOrMO^>&G^Z*W}j`o1_vVX9M{a1~$MI*T-a);nYkb1lY6&jq#y)~)6? zR=bo@VAa0Uu31%<23AS#FusxCQdyc`1pUf$Ecz<|-5G2ffdvQA?_NU1m1+16aMjdl z_;eh$=`ULkm!0*(#mmf-l=xAHVbKu->vb_BL;C%3UnS1?yri*?^4dVG&8$VXAtei2 z{DifU^)WcY*7qcYT(&;u;H$E|XyA3^a04rd3*g?vdEZ%&`(4`iyY*7N3;Qaq6TEQw zmUUFiR!0jqD`8wQ%G0tO_7sbWibJNIr~4Gk&eXE@rc%hbVxP60T!xrWCwNtU2bM5H zlD9ZJ0LL$R23neWg*#`}HG4u6pNg~%kq=#7==zTb1 zM&p!0Q_2eh6OCZPBAyLNl!uT+vJ1%p@$gg8oW-;7x-;i*<71yZIW5axX_J)}u47#=VJ=vHIFD71u>%a|uCr^(~bJtpN!RdiHMs%rHr znmh2~D@*31On$YnoF9F-zRI41KekXPS+=t-$Z##3RrVL~2Thn&Tg0KWO{utlpRXrK z@r8y(`gBJXyGwl&S-yM}kWw6C`w(3sAuYP-`ue)`VGiPY-ahKc%hVt=BNE(I$fYe& zhXQfqJ?7W7D#R8-C3JXA)wK*S? zT0@05wBGciJ*m1jEu<3YDyFWtObESWGH;JUTB3wl-1o~bNX~`aKouZN^~Y^n{msLG z2M9%ImVadvl84la%_tiOfUN4=AQVi>Aum8(UI9#RqCv0rL z{Y$qqb2n~}hW%wQ?<&zdWZe;9qn$=6>&T*`>lyVBEm|V!d(+fC;iNynJ6R%kw?ba0 z`;Y|1ItC|R$QCdWCjAghia^ysoW(n}AC6OIVUWhpQgFIMrDS_cNVI&eJ-OMeIXY!ZUNL#{6qN+G4P!E-ueYyfs z&s)o}+Sy*&O5(?g?fH{cU6}bPuy^b`jmjnC6K_ntQcXO>7*N@oiJJUke+js8rN1zV z-jHp%xJG?QmHin+;$%|Q@hUotz7up&dj2InZPN2M=~*s4_e;+`(sQ@;+#x+nrRPTJ zxmJ3vmY%Dm=Su0hLVCV0J>Qm|i>2p6={a9|&XJyl(lcLrPL`e%q-VDDG)T`B={Zh% zCi3U@X9TVa`3lA&JR-W)%uW2n! zSukbB*wnliOc#Sdol(UUEGsUP=)IyXv%K*UI?!E{Z;MF?L|CX6G((F;cGc%<YjupJ$syZH%p0oIqY_;hh#{P0I!+VsWeG+iO^Ix|b z&4GV-u_v?w1-EPE)hTYcXwM`R8qRY+9`4Bt3a^WYCmk5U8jJ9-h427o>iQua($|rw zf%52A)$uo|4(VATJ(o%C9K)Zu&jS=`E4p!)me0$)a1*>A7FYPM59rYsmq$ENt$TZ zn>4A$98G-O5REB4ElX#%)f?Xn6pcAOQ?J3R zh1a*fC{=^Xny5aaBuzKXQOW68%^{&q>S^5dt`ed^{MKcL))#T{W zRau&3V~XB2OrMpaF{Wx_M{7)G)G?D~rkhNJHu$8ZCsSYPawamKMa(dbJ}1YR!;*9< z&Mq)%%tl@WOVMTO(omi=v-B*JB{elYIUTg2$<${Wk(C);3?k5{pc*DicD6CcQAepW zT|O#x}T%uJo=YE6m}6q{v4={j?=L1P*| zWDt8qxI`6t6Q~7stQOS>@&u}KbXjS7mSPdK%!%nXB#eB<0xXP;JImPOK8$7KbVesk zpM~&G&q_9CnP|WP3(1BYBeDig%;^|;GIhFn!ynY0h2g|8j#T>O7pYs^;>pRW8?%i_ zWMbJl#?OWH3=AEx z0b>rjlO;zFABqZEvRbUEk=xpnT9MgT`Ry3LfHqSvJ8Q`56RoudEbR8A%qACaI*&&aT3rf2C;K)N8C z$esa=(3Wh>0NXQV>yq`HoU-*fndxStTwowAM>o-wtOL@)7a1D@=c5x)jy$TP_AwC= z8oB3O%5sG3Gn4cwDJX7W5(cU+*{pF%0siPR+#~h5>B;)obaaDD98EIude?YyV4*1y zyj?ZL%h4wr)3VYhq0E|s9o&Ti33qx>c?#%?G1utSVg^s^?k$-B5QSYoJfQx%oSA)XP|BX@chm3l5tqOC?e?GvjY11{k?eBn_j)nyH%uAy z7s7iVe12!&*)Q1NoOh*>)g!1(0g785+5X<=<;H-p^NdaCk$U&VS*Lp!*mLf!z2rNc z((mp0wx;QX3mY^D|DnsX!L@&ieY5>Y|I8QW9Na_UNrw`b{p|P53wx0NgFgkkbEWXc z@DIATjOP2wZZVL--7AYdGKar&x#n;M6Ehoei5wu^EJm0M0)Ufl#?)?@s3-wSBZspXX+8#nb;gmxKo73IG_^>>oJ$>M z12WU)BpXoWWFdLD#@A0s*6UMD8jA^nK}I^pr?XI=twGPH@<-Q5j^wD4R42**QH4k? zOG3dZ`fO^uTbsqmHc!mfJA!~u86(cnC!JX&8#9x@kp!o8)=8F!cwb}?SAslbFs8WX zE5|_=**SVl>tI#xv4%pBOVx8Rj!-L@8%b<=826~Yj*EIEUPRbq*=i`7E z0Iy4K@^ghVQhZmx|Kxoj@-qMiCPc)T9~qQa<{ zqxe*@OHrw4tPE0)RKBA8K>4%sma?Nqg2!}^uRVVEXsH^iDpYM$T~`IwGS>R6*11|w z);85%Tl;?PA$1niIbNqr-AQ$K)ooiZr{0cwn)(y#AE+PHU_pb+4MsFv-%!(NR-?;} z#x~yFI86Pyy1nNco{gK#YU0r}zbR`rt(nTp>gCz|t>ztDeAQy$WBVRUZF#5VYpwiS z?`WOcrndJ--mz^jw|(pJ$aa_7Ez`ueS9Ms|A^V9gKEM0C*Dyn6>po5UHVCWJuXg`B1L}u+ z4s1E-iHLy60a4Ek)(@E+y(s3(r+#_*Vr;Xx&|$jxInS&cZck`4BL3N#Bg;nJf3Dy2 zQ^st1p`Ld5xOa5tlKQ7C(A!eO4R5F49{+sC_nAJ%lI)u=rJ4?zpUN%G3!S)nQqbhD zU+F#dyZph^e=X1!U7S%ktIh1y#qlK<=FXqr^VMUo%~%xl#_7ci-->x#@y>>&6PJg+ zclZ5G9~Q58_LGh)uYb1di{)Rw{PoChdVkw$UDf(OH}3tuwDikOA8dJh+oBz>?pm;W z;m>dGS-$tP{TmMMF0VLp<5-iE-A~1xdFl5z{w%fsRoUkJ(2LVAufKZjdXHP?J9L>& zKD%DKcO##sU0b~0>O1e*?Yuio_bKai()U!CUH(hEj|=b&`m)EMo;!LC3i&d$dEb}9 zw)AT}V0d`Rz)gcLMYN9UH+b}roah-bi=JBg^arsY4gDZ)>9E)1t__g`9)6J|PWvY4A#KD9*V9?v!B)t|6z zLh!^L6Q7@SZqk&O8&7^`a<^C3zcOUX{wdn2XQ!I;@8!>!)_D4&>D~p)3py8mTKHtq zS4BN%teFuqbM4H~S!-wYwti#nF?-eQZp9xL`^;H7r*+A~l16i9%)LK1ciy>qDf5rc ze`dk91$|%r;#Hs5-gvG4!dDhvSg2dHcTvRat6%qdbzjx<7 z?faYG@BBgW2j@R{=EKz=KK9YXkB)v6wqnVO`zy2`mwv4IB>$6>pA7i)oloz6`uxgu zDw`(<0(?JsU$x4q7e5j)=9abZWlowIiy+WEw;>|Gmo z)%$V8kIR2N_hZQJ!rgmzxA`gcr!RlH`_qu07yNwe=T5(5|FZrU)t$~rzee3oq_Q&jBu>bIW%>l!KFAiKk(C=X3!55<=#_#MqU`t{KpN5hWgAKQAY-tnQw7aTuuyw!;@ zCzhQ!bE5Of@h3k!dGTbAirk8I6?ZE7pUOYA`BbgbLrz;y|9HC5nPF$59$ zd;PaVzqS1Rx!>RV{pj!Be~kHK$sfo6X#3~bKi~QD#GjAb#@d$Hj@#PW$JpPtAGNnW z``p>ZXAhliQ8}V=VddV+CVvh4YwlmW|Ehm3`rM3jTh1xZho7Hve#7}&=X+f+U-e_49ez{ivders&>l?0LzaDra-PTJjqgO?nRaKxovU}c-A%o_?C#;aP47K@ukhZ+d)MxDzn^-4>HS0ZJ*%Rtrd6%0 z`eo-k(_Ts$J$z_%WO%>6A-#fw0-x;Ot!o!Q-_D&ob@cIhqC~_E{hG;C$XWr9OwXZ@SMn=vSa}=*g#7fOVDStVaa9|XUt`h z`s4@Xh{u-0&Ljcmv2_^xyqK{U9#gP+-Jz=<%vcX^#)g_`l_vju!o`~>*K=1@U6?A| z70`6kuR}QfW#ez+Sqe?~$${L>D$4NGXqPDmT{4`R_07%S`ZE^X>Dr48BY1d)5%C$T zsJg(P^!|5$_Kf|88GxyPp8(qc4FCawK|O+d_UauHI&e@#WYplArLZgwl@rUAq?+-W z*;+_%SW-h(q2ZcUu1c$>TXjUj;vM=J(pQnPO;Ug`S;s}Hygr(aCRShe%G2eL@|Am% zjxWQQm4?iqLUOMvb5tF5Ger!H6^lLbDppF2?bsRpN2m8y13s)jxT8h+mW2O`0WyB8 zuOs_l`9X>k-Y8ac7&MfmOlHG`Do)ZUO0JiK z7|AZ{PNBx6^)Q7+O@I#Tp((3}(yEo}vyU6o3y zR4^581XD2ZS#mPr{2%IcPQRe^6s;v24cBW)+4>|AHCLo*c@Wp0^wBugvQR(L0k)c= z@wDz4){s_Syz8LX%*-YoD^_|yHldPJ#ltag(!XTE5TgB`>WFvX-7UsL(9SNc-*4!( z0U!4UoCE}I#Am<(F{BUYdJczb3i@M928N$rLpvLwTo6j00V*vE-@qVDI8jA3JDeJm z4K*#=2Wm>uPtXW$4y|dkESXvK}x!@59%+r zwV(sH5IaMion=2XjjUn>8`H)N9XKRP`)t(kgqUG*EGOv^>51djSmfVG^N1p;Ka%tl zjo7@9_MteL$xRbT<23k)azw0}YWHw_IMY15cGYz1vU2-DUdWYp-7kvCBVpV5q%!@#s^ znqMVy09nbCn8tU|z(^38>%O3$*oqah4so%E=166_P@ACD8VbIBa=+o#Yx@n~+4dV& zU)pb2cgE>nczwTNIpA|Z8Q^CCHv9O#Jg*n$&!pWJZFJy9W}H;R8p_;pcfa9^1l{iK zH>3bEj2H;i2^auGo30yIBv%+sdPZ@cOw;jQJrZ-X^cl20;Tkoh8)?${pmA(ix`sRS z?39l9g>%N}qjBAzcFV$rA5jX(t~5Hiu#H+ka5jM zI_4JaWTu-8yt23+FOdn37b)64f;@7|^Ys?q&fwZ0f;9QaP^pHrt+so1h4jstS zBO>CNX;4g}w3i$KQH1)9CNd#Gq+-jTNL@_9QQU}tu?SsOXY6+A!SRgPEa9l9aiLAc zz5`fdUJmwogai*C$c|OPyspalMl?MB~4oYy5z?^9%v7Kr|W7_}%Kwgd=HEKt-^%!UBoTFoPBkjn! zj76?r=bZ~wXq^GB#s>`3N;X6Zp^KO17{?ZD^(}2dYnf!|fjxO+Rw|5c%rx{!MC8^Q zgmPyrj%$}<9XR6a98n^W&vAtcit5UEG$q3z2Rq>0#gpC%))=b0 zWq&%0UKv2_Oa?Bz9>jI07qr3<#J&(M~>ubHNvok4p>1 zaue($i#kM;jqM;TCZzISvcMjKR!PEyNaVsz!TJSI)1=?HaQ?#eD)dJB7FoZ-pQK;; zFa2ncffs{J2&0$)VMHYh)`Ilqb-8mFtHx+<%X!N8Z>;6r_{RelO`M!bl;x%`Oj>?S zlJ-jjy9ad-VUi2YfEfl1(NdVcrX?^9b6PHB(@ZLlLx)Kg-#&M&_?TpO1B~z)(rJKV z9v+tfLkl5Eaz@7tF$sxoUc|)RyyQX6SJNg&OCN6chjkC(N%#n}9jT(yy2feKMRJDg zx?k)Mb1~&b{lq+D4(x=WTo8sdsJSo~O4h-^N$4k_7-86xq}dw1ZGuz6tMgT`S`;K{ zL|j6s%A~boE`B*!o2El8fPO-IEU*HTYArXHTOkU5D2Wj=>VaFV5*;q5*q>%D?2#+J#8`Km@Qm|pRuL+Me z>VCiy<<+Yhq$lB2mfl=@Osf6^WX>z)8j;izK!K3|L_f;L5dy)`qQM5k#2mUGZkQoP zNrEnyIDWO{Fq>m&ZZZXso{C0-4$Jv0zT^jrdD6ZZ9WbVZW|PDWc~*K+ug}&>xoLSk zvUPGKlw|@@xZFA1rI8ve$YR@s?TpOAuLFLR2jx}DN-m z$mk#ap&#W%$1Mp|5|B+jfdcR-{otd*ko2KHZdW-7hRd4ggpDPCA0^(0a0y5X5DqD1 zI0#1ar&q~$BpFZ1{=(rBf3!mm<&wSAHc4LZ68ZaU_;ex>7728uV9zEK&>DFU#JIj>=1zY4(2G7C~?-6wn5iL1<@%ZoJ5wFH-@?m;(XQ8IQ z5r<6G5lyfGzFoqnf@(g3^H=kd`20}5u^|s+!gs0;(=irE20UcG&bcPAS-l*=iX>5? zdXO~1xQEF-ElsX+g(PnxQrU~veKk$?HQ~%<{t?MYbMTNpaE~jAA1L>MNr_}HlbLo` zXjXGdEY3L&eJC6*n-R1&qWvIAh!HZRGl{#_Hs%pW3An5!=$hCsawJnto+B+)F;$5J z6Hqj0xlN$6j!qFpEbVFaM}E!~I=O@-Q(fEw-sE|&`jiI=9(q4+_YZ46+7-dU2hRR! z@trOapzJ|2Le2R&D_L!VrYY5Bx_8HuoPV`Q&f*<)u3@frwwVH5+E-&-Qgd)K^9&f( zJ8@BCT*rjSQ*ix|Tu)bFMly*b_QoPyNX5k;0!J3<=b@gJHdXPOti!CXAxl#ep%V`1 zBmQlAEKDuQ7{Ez-Iw;c%?S0hGP2EDwSLj^Q6GxeuaqwW!4-Ne6=;ut59)_HPdJ?0C z3$=_n3X#n*L!;OvO7ekAjHJPrR3WrrB!=`+9tBy3(Nd=^wj(`eJ39e?5P+?}nG} z)R{SCd*_eR{(S6>k%xMJn|DJ!Z`dzSeqp@OZmIU4|n75DlXRQ1yZ1Tpt zih*QrvhL4@=~p+qOHwGEIQCp|H1D)E#F+L7h~Po>bW-$`=x(u51qK~ zR->UMKec^f$?jyife)vbP z+%?zhKQ((->(Or==`#M4vwbG5zuh=)?$3{pedk2?tk2K)pYr{EkBEZJ%@SVQ_eAo0 zXL^{vzEWq%%K8R{Q1jPmF}sysA$qYaNsk#m!>UP{$<&(r!Fa*b_g0YJSk`T ztM7ibY47RF9?hQU5s{E=DtPU^uQ%^Ib4BIl6C9bCVlG_x{^~9Jf4f?%dB>hnBlMP{ zMIU^#^}z4fYPaarYw)wFxien>aLu-Ze_XHgSm)kDMyBP>eB+~Uw;%fRM%|XaAzC*uc3B}ThUY&w3%NDvuU zj5`iqCPSZO%#`z%)H;lvk3DF(4X8czprI+?allcyWf+!)Vw z(2IPdQ=9;V84VP2KskG8n*RMXK|Oo@y);tGLuk5k9y4?l0uchJ60(`IL&S<2z0Z4s z>Vhh16Ne9sOBg(C_)u*^;_#Sw?ckW$*r?%sG=rkx8P#>*V9c?Qys(uaA7_-U0fcPA zbCoE=U1oACnCnYsz-nU+j@`U%Dqm?eMD`q{x0NXuIHqMQxTvIGuR7OC+@kTm0QX{ z+fA$!^MDJ@$!mHSV>fB~rQH*;ysWmGCsa9C@s56cAbnsjVRPWjh8v|hlG20}BFS1V zC5lZ5Y<#;K5;*(RxieW^7y(&3uR3^GUHDdyXi`med3ak~5QKumdS+H#Q)CMB`d<8NCLhrt=qxAt5*bZ zM!0VEkn&D&C?X14fD3|gk5^5v>C{#7p5RON2P-OMa6uPbQRpjaAoy^^##n~mqv}E` z07qTq5yNl3aL_)l2k8N%c-3uK-F4Itw{~@y!15^JuN^Xk&p%{{Uk$kw@_1giyk5a{ zn+GqPW>;Jk(x*Nfn1ZV?OeRgoY`$Fqv4+nK-Ap*pOFAlz=GpWdvqhKjj75*>RGO9v z%^jgG;rEZ=^fJU$DHrNLM;b64Iv6ac;zNoqywC(p=s1Dm$x?E*NpDFZ>sE&<3>?X9 z1eoy*lhUQwn9VErgrpn84z6ahT>)8O~B>F$>GUKVr4MSr#G+ z{7P*H4e@pX%cS><(sRE{7(<+V$vqCwaOqv+5=YMGKYd>OQ=P~CoINsDd^!-7T+89{DAGa8&n2@i+;1Yj9}4XA}btpId& z_<#L(QKCWle9Uv{->Yl$h~RKa*e4d*bGS5o}p`(a7N32(}|GEwk*?2-a`G zxZg&diU^?qGaQfhHt)Gs3^}x{Dzg*0ZM85pD(OUk-S9{+M>+#Ww15aF! z3GMgM)yRA54}zAwG3S@M>!0r!VO*KwTYCo$*P4G)`HyAQ`sSOpuMNI-Yk=KjSjfAlNW%+5=t> zNvqXnBx{K^W#bYAEoo!G4P3k&%WioAs73w;IDGx+bPlPSJDPkurul0+ruk_!zA(*! zMz$Xuz`{VuBpjEjWa%}b|B*!==B@$zy7thhtMFTKA#uVy1A}&%+h4UgtGfeVe z7l}O*oK?Xx3&KAX>dAVIZ({7Qganiwk848c1VPQQ;-y&Fip7<3YFs_%4~PX60#*Qq zL`3v~eQB?dUfiByLO0X+jPc!a^tl24nnC=&DJ=XjISm=vZ6qcqu>A3uE&MdW-9x(v zq3d1JLrc*k=s!u{?(swRSpOaV@lX1H@b|x&e*U}s>mU06hyMRJ z)Biv8`~NTf{+IYq&8xS6d-4{NE{ahZS(@Wmh{YZ#$qV-YsD1M~t=Ncen(dqDxg@HYdRv|+4WYsR8> zFg7Sw$pT>Dw|zcili=TC0b@O9Fg9;C(oV(d8K+kp=fhTN8e?xv$8{V9jJ*c`0VRx$ z224Tt{yB^t#d9Uf+}1Bq6ALRcU>Ru1eEy&M~ zGTs2}L3y#0@ev%n-$og2QI}G@H-_JAz|(jSL0vX>Vk{0C!@u?*{Ab2~!gue+kH>RUdi4C&Ih24qjMR%I*+kF!1**lMh7J;M0@uGdc2CyK77g8r)9upDf;=tKCG&*5bqS(_1UpGc6Tt4!+|3Tnhy=H&?Ki zIxE?3Ktm5DdrzfgnYam|9O3W7F9I+c(5;h_-HKDPro)u%Yd}}P2*BEA3U(6pea270 z+I3N|b$I^at7P*)Hy059Dq!nVO7?keB^wX8f)7mx0TK}RGTdR!lx!8^-$wpVbU}H5 zR!=C|ELgVnMti5%Q?irLzU{{IJ5MERfw-}NB9yZMc=#Ue8Hzf51{}QFQOR=saZ@N@ zKJxz-?&q5-Sr4_6HAC9KMoJddR>_vY?-bxuw0{!vTII#qNxV0~eKcp$Ru9y{)>_Gy zwNbK4l%s48H`=O*SF#0w)_@*>Bkkd*QL@L8rU&R^bFh+aga1juRpeQPzKF}j8RR@A z%g$A@?*U$bJN=dHEO4?jQpt)#l&ohjC9C_4lBtF$*$nudMxVWl@x2l76Tl9*3TOaJ z`8I%VfM~!tKptQbU?pHP;27X4pz)_3tSz7?U??CJkPVm!mU=m;+;61=sfSrJo zfb)PVK-14XSO>t9fG|J|U^E~LU{G2jQl z2|yK~-B-XdAQCVJU;z{X766t2Rsc2tegvEWTm>}v+Jm(R^aDHvcn**TFaxFm<^kRZ ztO0BT90J$?*8s}Z9?T2S84wN_3K$2N2$%=>7hnZo9bgaO48Y?X&Dbz+^dU*w065Orn# ztQ+*#PqF|O$bwi87R-9GUaU6@VWF%K>x&yY`?3DmstRWV*&r6dB3Tq0%!aUN7Q>!m zPqSDyl*O@OxX1GuHk>7}L^gsw%SN(M>^U}?Jk*-Ox+<1`_5v2t-E=mdrf=Gn_^GIltou&FGcO=Htp0V`xhYzCXj zW-%+9jeA4quo5KwwS%i-eUh^Z?h%r9o#Ouj4fyHviI2g z>;v{8`-rVzAG1%`r)(wrjD60&V5``d>?_<3oL z%Gf5hnQdWP**4r%x`XXxyV#FxH~WeGjIFyp>{qsz?PL4d0d|lbV&&{GJA(U6kFn$I z1Utzp*eQ0JongPR-`OARPiA9wc9vDLzt}l;o?XCEB5}PGECm94@ozGam6R@-Usxqw zLZua(>D+!QNuLFMxmIiiP*l2oHHDv@=0-q{duu3+%*Kq#JRRR>);^G0csp|wZt3nX zk&s^%YsLo^_oY1wBof~IK7dDhYlB?l^G)*_@^ST-Qjjf|^tlMCM+yvaa*PxCMN6(3$o}p%k^NnB z<~4C5mA*y6z37GCVc_D@r|PhQ!aZomh@b1FdXR&RfE*#*@?Q>dSdch^>0nqjhn6ni zmg7?>dBBJc=c227yLri%XE>75=?ah%PUT|bX@WB?_a`d^V{-KXGO*EdV}3^-&QlOl zpKJN)ikiaR5=!6Pa26{rXak+&MmLv%LHLp`Z_~n>(>;jyhBn)rRuIaB?D!7mZe>d5ZItj(dL(az{}zd*GhH=OgdCM`a)02Cw}swWiwu zH@{VDkjoth92*vABS0|Rp2U$k*#kQq{5li4y<~{v41vR~x)iQ;NlVAJ9BE+>>2!dP zi%;gr!Tdmu!vUKyM_e*NayTrY1Z`li>h2zaZf+;xNJp^blhASjbOKo-9amD}-hw)- zbs_h699XV~SRTY_w^|B*EXYx-30h-nDs7WfC+eLDa`Sh?rXw^nJvj#-PI)jpK^`vt z52Kd}T9=UO6f^N5b#wD~tD7U#y>5;Gx4KPqtwA+ft`_2~n>ezL!6Bb!=gkzn!u?t| zvW|X4uyoAxVxdSBopf{admVF%@ z1cre4=7OH)6duOsf80>#bZ}I-IO!?`!ZVMF7pJ3I9u5}6&Jb_+*Hdi3*rS*B!`y^@l#xfG{PN@ zyKo$NIc-$k6S@enVmR|0(!?Z6?+!^ub~q#%R}Z&rxq#!8WOz*aP7;~pfb2Lg!jo?B zklQ9?-RgpkNJj#Xn_$BO9wEiJhiBlhPlmH7my|TmJ}Q*H+)-mf$fcOV(3lZ=%FH>H%@EX1HxF?guXI3SGcwH#Rrr#!njBk%==Hc%U+4JNTZ#E}4O z2j@Uto$^#ni6t4!ptt0}3OGI4S+@s5-1;*$!(tM1J>}z&%VdXJY;g~j+(_elB-1I67l)0ib#0p(f4iDXB7 zi2>rWGlv(EiHp-AjZs$OWCxJTe_5;rX-*A@si=M*|zvUCPH1q|0wps;obfs%x%L@#pd06QNRCtnT|?kVNe=4W>iIe3Ngf}ZAjB*M58r`{d9l*AEu!aCHfH$BMAP5i!hy=s}5&>fY z20#vAGN2GJ7w|gZ9l(cx&jD)zn*h53M*zP8&I4`&l)!UCKnp+zfIlDvFbEI}7zLo; zKe+s#!zE+76bP$W9Wm^sKsv@-JtiIegq?%u4mB5FdqIbJM(*%rkRy*WZ?Ol7~V5BkNVu$?Zxi3SqL;K@9c zNFR&O{Y8mudYhAbs4>Nop^v7oLh1)H*3#W?B&2w-wLS!Fa zEu0%t$yH4>I_eKf(`xa(ZX@n@#jTNp;mS-RZ8z7qVJ}Tf2T({7kxqudj)iG;nWi+X z?~nkyP_$!&#Rwa#;7S-YDU&7P-IxTs2n7jKFEW!-E0yq-k}|~SUT~Bl+5_4r9^Ou+ zOQO&8c2eog##GqS&@-K}t}1DxiG`|ClW}4L1EQ}A-yWfhL|B+ARY)H!Qk81V*5ms> zs#M(jlVwh2(Rj0%lUb|^TO+uuV<H)|i+`eq%~VNBBvzt=uu5_mn@4Ya)V|97vSDNMo+<~ospTT4k5vc~ znXzwFkWTSwW!Uu4o79T$=p6@`VRb`qS(NE1Rj%9+c0-kyY~tZy1~hm6O`vaD2l9PC z#=MY*0A6Xy$y$?^pIH&1zVQD)4Npf6kBf@!5hPWIg`v#<+ac4Go19~oYfN1GpWolc zfaiW#MTsAs)nx?#{Qlp^K*b@0H()o;X}8>S=$}6Sf4|3_E%aot!GV2gK!<=~0Z9RA z0W$;U2OJ8x9Z)NF^ z1vL+TCO9eB5Ii}!D0oruj^I^2y?T%B{dVul-pxY%L$g9Bgr@g};Sp?#V0+o4SI^l! zSM~g<=b@gJy>It!7}6%BOGs!)bjZk%)DTNZVMtX-r_gbs)=)$ap!4jEtq#cuZQ5sG zpYwg%_ALrK6!uQPr}{tJe{ui!`|t1HY=A!*CBfbZcC7*bUvt;~pTm`h-@Kwy(v@n8 zYTBj|8mgSjoco!Xs3=Pab*;-bX+yO_gHY9!$Op|X>atR_*dXeb61Npr2^*T0ZX>IT zDyeI#TA?Vawcj`S?5F!DY<@ZOW@gTu^SwOZXJ($63Bx_`Sv-`?CHK*ev>!c1n>o)p zQOsqpv3%B)=Zf88uDmEcm9Mn!tv}M?rkUwrx|kQucr(wm@O$_({MG&`AB0SxIfC;7 z)Ead`ucOuIIBJFk9)M@#uRtOdOI{`aBriLS*kf!Q^u3R@;4kpkd417TB+J2Si)v_y z(WaOAllcMUQ_(ipuC(jzZd+-w+sz&7j&XOmmF{`>wwvVj^G15(ynWukz3;rMULZ9P zGFKo2EkT8-lD((v*}-ywd zt{V6+_#mhP?HI6XGzx7(E}2Z{(Vv}GY#Q6Z0tKL7hIRd+r+Xxuy~{u3Kk*zfR^F74 zs&(p0=$OTIK8yf6W}xY4CAx}-(*<-Z{ZX`$-|GhMN;lP;?t!qX*4K~YhU9CKLc`QX zv)$}B>usqG_aE`O|Cax$U+sgy3bbZ$E`}0NIrEV9>9@JLk~HxH}m~zNP)0h0Y#l z3Co9>Z0GI80Ffs)i?iYZ>B;BRT$Q4$b(Ent&#mu012H(+TkU<}gFt9TmjL&lS3P@7NfZxoQ4Xe@m_J z!)kpML}}#8$^OduMea{}{qs0l)U*^dYIY@o3?kTL} zy-wa(f0KVS)K_U(C?x|8(ZeVfT}26a5MGC$hD`s2G^JlU4Zs#NpqGH?E>?)AQ4cQ`kD%J(bTsGY=%3}z2i>sW_zWfaaPs& zxfdFYKEYE+5!piuXp%D%1eM8b82g0Z<-T}B+!MFVVEc_*o0m0VA*c();|uI3kX=5+ z<6x_N8KqjPVmR7GonSfwLJhWAc77-zKmi)EMLEi*i|965Nw3gIC&5W_o?wOzglL-2 zHnKyknuYT+-dfBQk7-{Q=^Oe36SPHkxVr_!oGIRM?)8v{!YOppBf5AV~ ztAP5F592v}KTi=uMTz)E+!8RROwh|i6EEtU6jNe5xxe{=oM5Pg1TLa_B$ecob>sj! zPY_L^lORSn(|S%DCyq0o#=EJrx`UZzcAFM9#pb&2`G6vjC-BSxG+od#96`Q;cpOKq zv&@NPdszf81tf@u%2ptE%ad}M%GNcym5FyZxP#y;vVnqNZ9Zwzhm0Ys$Zm3yjCH*I(g1gr#_2?+Bt$vVB6Vwc8xXT4)4hO^Pzksf1A(a%lSX}N&X|C{w>~E#E7<{ zgRr7ERR44_4-j{w*dz9fqv9lB=naVZHZoBTlIe1~Tqsw{J+fS0mXRu6Y1LD`rZUw8 zHAPKVC2F@itm^A%{fLg!Z8XvS^f>*do}vr&I(=Aw1sQR_dD65u()2MyA;U+Tsb;2G zY1W!icB-9Y^X(FQ+dk;Fa@)F{-QMnt?r?VkAB0FX91Y9qsG9?-V*&>^K|A-{h6zw)jw0DSd?t>Fuf;|2llTqT)5Efj zd=|LVD{{1)B-hF<@?&{G9+JNR`f1fiO;$71Y+xfhRK5+mk#4lx(tX37>dtZV-F+q0^hdR`4uFM+Sds!1wW z{YA}J@2eG1>o=>NYM=T{RjL!}jJl+*sXHpD8|nvjYi)qLC4&zK>5+Pdo~0M+0=-Ia z)_cL1-)d<*$i#tWI54nj;Kli7q1j~ina@n6IcJznvM<=T?F_rZuCtr%PWvx=E|hGs zaBT#d0BQ$ccW{sl0T_bk6QC(4he!oELXJT$Re`0e$z`$xj#;SJ016iCt-3_-(xtjg zm+M2iLLbq`^hsT%&p~y+4B2^I-_mzM^d4>^Or(i2(WbeHF|j7zB$##v83*FdnnaUi zx|(EQczt2?Lrkhkhe*sYnI_9jG}$HxW|Ie4G1n|Gi_8*JU<%C|Q)G(GR#RejnNm|` z%FQ9DBS*|JbJA47Y^%*>Q)8~1Tjs8Ti6p{(0BCZ6ZRN39z!4TOM@eN>qDoR-)&I^V z&ADn`HewFo#;0V`x{SP?Mtt*nIYVx_E% z1ybRDL&%Qmkg8Be)G>8ZRjDC5Rj2C_IzwmbEIm<2_>q1TaLeX?j34XA`w76rk?;7@ zw|=6ZObK3Z~MWO_PBJ$4As)$??Y|WWz#=l!FPqmr+5UfeBjrLa)`<8CR(ER`Zex3v6kuABkfr2m)_Qmu4KC{{k6xfed`+Tv@kG%5ahN+Ld z&Y$2RwM@Uy7g>{AR5`wypBF{x##b*HGa3x-t@8^CVs)YEOMMS*m>R1z7I&mNV*86W zTc@?}P&f4vDNh*jnLhfmLDje^vL#RDSy&m%nkl{HSQN+o|7(9u1_rV+_%6L6@rPOjT^N5q(WcpJ^`S2J;wq*V+LE z0TE{N{DLg*^Ua)s#y28cvLh{I(0)kPyi#;8DXMhNXl!gu(!W%AEG$2EHTWydn&4SW zh2v7xo+7h4k_Z%kG|R9$#Oi|IbJJK?{L##B%~K2P%A5SY+7<#$_go1oxhkrxZ6SP= z>xC_3oSDp9A$)gQLdK*e3l$%n?%XVi2aos3Xxiu3O@&`s@}m$5ygiQIoGtqr8@*X6 zmV(VvK%0PWU2fKzZ$-A`#p=wCfsyN{hK9I;6TIBs zEQ6j>kR?cI?K4XX>{fM5^pg|273HEzaZOQxJJQdC*EDM^x}&3q8j~2ng7>j z!A>&0?WjS{8#{iYDznVhh#St^2-u(h|@xv#EcPhGDZNjv6!CtSN6SxHG(( z&ejEoS`%`LD*H^xop+3NUHf>+_(-+ioRAZr`?4?A7;FdSIc8_`oPaqf%iN`8B`J@z z&X#)QqC(`qs50?UQDt?q9{XmE&FM2Xciw5%G!OOIocO6LV>^sHs$+G=9hF(tpXOmM9aW(U zX&tQ#9_C?atuW*zURn}e7koUk^f!seB5MMeb)`eG#?YB114G5dKZf!Wr%YNB*>yy) zPh?k@P^;Q9Umm?j)&`1y40f@u^;u=U$gaafA5!rfuOjpnxYG5J$|I>vyyD7>8aw7O zV9kK&PT_|0AUND`POwdMUFc*QkDpM@Rab`Hydq!F*7&_)SD7=i&3b#cXruy!t-v*_ z5GRq?r1ak!oEK;)kk6+*y>oGPve7)Zn8i7+9oK@vCk9_K9`tDra>&+R4 zH4iLZb8<(?iuo3vJ%bd zY|*H;mH1W6hB+(1eU>>Z%R05doK}d)_qT>-ThrV7r}ZrU&{+IALTQamQ<9tt7#w|_ z;##74kPHo&Z%dMdSYkF2li>(`DzAM^pz7{-O z=DW|ZS%+C|8w=vkRLlHW4nimP@bMH?);v!1ggQBf6Jj++qXsm1> zZn!R36z}&&(dLrYvyQY{7Hy6X_QwPFneCY9_=Wx6Fjk)1NPS7`nNCq69_XXxaHN0I zD!=b##@J|fGFFcC!%pqrtdTi=M&`~tvD_NmKAv}8WVPQMnG?^u2PfLGws|SUMk=%I znbNR-z^or%E%BXF9^JkiDK)E&Wz9+^29GVdF4#WaKieK8%q&NGCkDH`D4h}ry8WRX zbWxs7kXY$Ye7{5q`S~e*98Gn(DLCz=G>lcwJ~7fCu^pDvXISpMqpkAx@l%H|R&!WR zJm)$5K|8Zwpte~H;p!XM2C-Asq6jYk6#j|9EEVBkZ$Zz1%=Y#pNYKtVs_dhxGyEIo zz^sm!W)rm9VL-%j8;c(Uy)`G>>L2K~tGLFv^!18121vqQZj`&!?a$LwZh zQ6aPZ$r@Z2o^;+!KT%t-oB1tLR&Q_EEqpB0VX7iC+^Zl|1uH<4SdRP}%LZkYOvL7u z^uSzay%`FW01&>Z_1U2nR{x&MJJLag1NKN|r*7NL{yo7u8?1@P^)T>HOZop^kKeI6 z8BnMbjwIa67iyvTGg77iaf&od4xSikm>II;n9l9?Voax=xX>nrOQhTlEX>!i?ekp|yQZ4({kx(gGR zOI_q^KaO?l_tn8RN%^R@N(0rk;at%M28*n@6SRsuAET*}*f0Qwu8}@NXSK6B;OKp8 z*H6{@U5EG3SV4#Lk+!*khz@O3C zEQDUdCbeQ2GxO-@oB20`yFp@6tEDs^M`OBaXSOsaWF@Q>5|kxA(RJHq5YekBqIRH) zerpGc#QACmiq-KsmoP4GqV)Pl{F~-jp_x-)x6sI^Sc`?Z@xtbbBg~DclLSPnXi-kz z;>4o6#HkxY1S|B|vI=|qkqQ;s9%DN@38P*=rZ@fzkT4aGTW6QZjmH|)v zC9PjSs6OHn&&euI!@EE|5BFH~>cF7!fIUQy$s;RQ$3L^5g4E0E3`Z&x%& z6wPY6i9yZ-MZpoGLeLvoGu$O!%ZIx@sh+>(4|En=2bNqTI-0&LC9;qmdqv3hM|KS} z7PjuhTDBl|_bcnCTIU9ec0_ug5Gu0H!=ts2?DJ1QKC-W+v0(Sn@NHkKP_A`umerdG z%ZS{Nv-qozHi3kU}B8Iuvh=4s7DadFd zfl_*tZn{CY$UI+(5q<9%=|0PdKFWnPLKdmHSe3)TGHJ>DH8M`c0u&Ht~EruZm_SxNSpN)e}KcbA%Flvi8?RSe~f zU4#rL3s;5&^ypUhMC9y~fYFRfba&Op6k{y%rC7cwr|tZGrvbX?cHyuQt-${3d05sd z^p+KIl_Ku|;w37PE?&w;7OfMd$V=RhG(cDn#V}NW34&Xg5hJ>ppew~M#maj-Q#m*g zTW3UXl}ilgYB8LjS!DqPFds25fM@wdJK~cYS&J3uL7LAC_w6BYrT9l~D^xC05@kf=wDI(+Rj5vD)gq?n00TatKFNRqPyAW) zdF7v^=Mz)oI{?3*mHu6R--$&0Pxy_9%o7pW(!i9Dg7*yDo(lUb=4lz}umc%s2dgT6 z51d)Q@&*BaS-?lQLZjsSKg-Kp8hZ5G@b3Wh=N^E4zaTHUiTk1dd?BbXgP`jefO7#W zd8$vB>O(TB&ynihRJ+VS0+7V92VnVeX(T^**a1mC(2V~A$s*!s1(L=c$oPPQQj<8i z7HQ45qu1ghJ4b2*@tYg>?c2Ar?&vp;3-d4dwYl1wQjlNub^9m6VN`Cw>iC#u#()N2 zW#r@L-M%rRS2HL*9-P8a`wgaepU3;N0CahOJ}%*%q_!S3_aAim7Z%|?5dZE<6WNW2 z{;&9_Ob~`b4&C5!3)$zgp_WRAW{>L1+|AUr@`_qSiAc;sH^xOk?`d?_& z5PSgcQBT$HcdCgNuP_=1XFV@+F@N7)?3uA}Df6q%{ITYD_%ku_3Sd#7L#B!UmffZK z`*i4(Vd9lfKY*cXYUhjUJQI(UgtF2o+=xxpjB-WzCxk5-h^S$FO9V5=i(uy1_cv{E zXL<`@=jqU8o^u(apA@;ijn9aEjFH7i&%Zu!@q6p18quZj+vU*+!KZwl>&2oci5B&9 z{d-NIL%v3sKPfUV3kUDOjg>EoQ2(qvtxS`r55fOGvG1uk$1#QGv$7(+ijCM_xgMDn z>D}9ieJj_c=y70G0uq+Xj*HUhegQG5RzK120zv|-=l72p(Je{Ia_p!SaMX^Qek zW(R!a=0tv~(C?divY5;lH1&3eZvYW9GMsoq0;|J*RBZ|*5Z}QyEo2Ehj5f}f-0M|Y z8r^S71EKp2BUUD~ULUY#1y~p5S)IZ+_%Ab}VUj%bkr(+L7HBV}_>ZB^#>UauI@eax+9%O)44 z5j+2IX|IA>(s~Tw7L72{tH_8QDI}K$BD1snM(j|16Yka5h_&FlqMPQ-?yVTnAAVrO z#7nN;XNxC2o-k%V|1*Ez;c3ovB7;1DeEb)xAIU+xNgNFjzTj5}L!3;1sq(9;)>0v} zHALiKI3pb?vmPuM9NQ5(L~&DWdLNRsh(f8UnmBok%UU706`m;t1CqF_K$EY*%zaE_ z0sohpwYnD)hIC>?Tf=f$C9|8?MfT+u?qZI~8%!zas_X|8=c$c0Fa94%Rv_|qmqZ)v2)n|eD@SIX}N=~UYIbdSxCuf;gWm%K6&8xD_xs)P9 z{&!79c5SIF;d~Yg#?Zq=4r&#I0Pn;H+Gl^q=uiqh3a$prGNUVeVfAH1FJW~?VSd$@ z0SL~cb#6S^^9QS4FH8JA0_O^&33GvX^)aF^5&&)u4gsk-8=L*7gXA}MGAeEO- zW|uu?ye-S1wo+1RL?09Ll-4kdhLO)6r0r3x?VNjQi=MtA3zD<9LvJ$NT=Fe~H%C`j zsP#%l_3x$nLS6lYRJYHlK2NI8)YW%M^|zwoN#v(U^^v-IkyO`ZROd)_BYz<6YN>wS zvkweh%)|F|MqNbe{-m1fb=PLfof_Tn5~;i)1Mf>x{a0N*N~*_aRNpVvi*)skOshTj zYa!ZOlin!RS5b|SyY}H4DH<(BzYnnG5^L60xGk=5W%r*8cYCC1=n*tMfQBA?L=aai zx}Ubl64;0i0IjUuqQf|Q;4YalxmG8=a2De2XBfJvR@2U%jKYePK(z=>z_jEN4Ra-~ zR*8?R@%e~Xu)Wn2wQhsuYH398m!-C6)W?A}yh4_%tnI5rs}wg}58NLAmh`~*(-P13 zmIwmTnZuLq`x?<{w6EwZmZskR)`rHUN#Ke#x{&GA%M_+Xp!M4r*RIFi0L_RslAT?7 zI+L9!SaJY+*^3%4X8#`01I)&MYcErL!x_QO0yZtiXaiPMSF{7;)K!?QOrN+=jFs7* zXvykqu5~Tn>;M)o}0w8M>sU(pTFux8}r+LC!7@+3Sh%LJoKMR$6hbo$HrhAY#$Uro04f6_gsu@`t<`{gANRwgi3PhcXb zK3b|TQs&L8eo(4!(bb1Yb>EEYuvA~8tM`iSJSwC55~&`pt3Q)!Uq*F5sXmcvC7IX| zBQ_3gvt|=7ifkT6RZ=!j@b(Y()7O-IehR`Qul`T+d6r~Gd$lm4XOr8u*p)ceh;D?o zKBIg_w1$gFLxBf9{>*x7+_F;VAMu91wc;`kz;Q%)>Tz~7Vj z)p<(-Q1&-#{C$F?31c0ZE@wi<3|}lA4O2y~cU(DHq-ZeZdS(xhFPXpZT41#L1m!>xg<;jpGEJfF3 z6kRJmDc!%BU`X%5OLaS^sCHh|a9Y!L)lJ%6q$#_|*&~oi683%t33f)&*HZM36qO}6 zGh|n6zm(S>$NhZD>j3F4JuH%5za{S;yqbe+q{Y~-`8kIX9OO=(B)i`G@7={C?p(EL zmC4EE%G+VUGD#8w*V}WBlK5AOLIGo0yZE^eh8wyV3ogQt7FCAl_HE4P1WdPDBl?`c zsHwvD{Tll+p9Tkz$AgZ{kVkLY`+mt>brV9oB5OrHYHuG$MX|axVy&q!R=E<^-;~D( z?$f&g&NtjC@sx$scgV8yj3guHu^Fk-@T`%H*bGF$Su2pUv#n`aVm$sOcizx{DP_4B z!2ijRu_7lChAh66dp@gD_5cV2Xx76lQzMK?*4ZgQ7M;v(DQJ= zwx;G_N;ekuX=OxD0tHSXzi3^2Oje?E@_d!-FJ|@W zx66ng3Isc&#ovY!eV#9*xe?EkV2(!doSoJRaTi!)Q*{to9WeX-6lP zOaAwd$qpmQ76%qacAa5FJ4*M2z}f<@`j}SsOTW=1spgVa>Mbz?%~yTqA*D1XK2Fc5 zYdtP^=f%ic~QN+FNwBuN9G1w7SinY~ojvqxzG047Gn)6F5aCBw*$h zup~+DsnjYoGRqOYKkXEXYu7ufM|ts?x1VZ6>tLwbEnFuT?5loZ#8wKE_1@}i7NpKo za-Vc&JwK)B2r2q~fHi`DXYs!2#ZDUvQu}jhg9(QA-+e#r?}ThN?yxJg#Y*`+Nq&?8xAAV&6wG#y?r7+YJ)i4eW8h^+>pmt0@= zE}FJWmKK6rqK6k~<2)#RlF2%hW00}V+(dSfvso(^R^Z4#HnS}N$uJlTr&Hfp@XuG) zt)E)afVl(7Q6GS0ob1?J;pg#?H>Qi3D8Fz>YN89-Wg2(N9C;37ilglJuc}~jIhy&Nv_rz$RCes z^EXj&6Ule4V44*4pn&LRJj1akQXrfnnq#b&FnI68N11?@!n%qR^|()!f=(0|%X-Jp zSsdQ&pGlVYGIKXq#=pX~=Spmwfig&_9`)H_-{Ej{kqjQeo^pQ}<+)khIxvh33 zT1CETPw8>iNs(>-*w)Z?n2<00dGBp#IOiuVvi4@ik&r;eO}aZ3ptYt2Rt>|>E|;@w z5-*(X>VlrRzrx0f^Ryiv_8xq@Q>qWvz&wVB^CY88Xev`-zuxs3AYEJ}9I3avQt3!k zE5Q-0EkOW#kpt|d&m1M!2DU*X;YjSeeG1qGa6XpXWT0fI5P6y@5!)neN3O(EN;+votk>#Awz;8cR$-a`FM)Xf~SHd3T zQ3BaYv*B#9QYHn(-xv$7!QOKeICdGo?(X%%F><{^b~j|h-rN*AMCv{>60vf6@Q;U+8~FTK~5pmH*rRmxw%hhd1uVxg6;5hAVG|RHq${Jzh)O z@!kn!#MsKf_uS9mTe(xldkpaVrQ7E3+npS5@Ui4r-Te1|GuKNaU*TfLB6L=|@`RfV zrn??Ycc%xCsr9{T;_SgA>GSXUzK;@NIj^AQr{NdouUVQt)qy8DCU@!e-;61xPrCo+ zzo5^Dr1gK^|GNM1i|S}JVT&Tf6_js~sdPa}W{tFwU)c_l>_h9A5w!?U6ejt70C_kx zjsDyA{;&Dxx}B)_ko3gDYBVi<2+72P9D+{S>tF32ytUn`g9-S(Mu+3s+-IJwuq+n- zv*E3CPXBLu%0{pcx~IJVrl*hL<3V%pY;`y`KR?8nEOYw!o>8JBZPGncN+Wz{a%Sy>Sns>?HV7JJw z?!ht+-UKgE@%MIn{4T760H?d`Fqv= z{{y0?!EvtbxyTpVq@OtX70;Tujy&;%Y8)&Vt+-1ls0p;}QL{i0_ecaR=-~M+Rs-^A zMp>wBVxl_F#d^qHb6LR;-_W?!d&*XJ6OLE9krwHl29wjRk!Mgn z$1QwGciiK(GaGM_Iu05t+y5{GXIQv%o8a`e`mIK)8N_Z zV^3P@N?At!+VzVkS@#@FBUe0lC4u)ojDzlP-mmJfrg>^c-9)HfZ!j%9C1u3AfJRZ{ zbmJ<`KQ&?9>#{~ttaB<6vL){GRxB|@K7+DzZ$vkUU=GAq8nJ3F&FzXg%F-Me{&zbg zrk=-AkB~hmpo7`7H)40FOZM#}PM65;!)ASCzV+7UJF8n21$^dv!CEm8#xnKXOG&;F zEfj%Dn?oZyo-G&VQHhKer?lh4Moiq^L38(gp-C*0PL(yJ4lJ49dh#SmihBEbIdh*u zPfI#Xm#eN?r^x8Y^OvGj4fcq2B4TNZD#J=Dswt+@_Bamsgi&|tK)v)PlHaLG^`g%PDxsDO#1wncrsREwbc2z7izpyikvd6 zZPIpJdfUEws{6Wh{c1LO26LA9ywvlDzn05h^Po&kn%?n7jRQPA;IxunWWALRI_!X; zx&OsvC*r?)+@8%}pr2nYE(*4F2CjuV^}Mo5-{kX9k#$3sHC>J{UTaqSck0zqB5(im zncjJ?w6j5*GiW)eJj8&xc=X=fWqz0SM(D!G zo|YWkjENyrL0Uq`dZXjh+{aonHc%Tun-5vpmL zJxLy87y5oFCMc?u7)!7@lSLX7zcX0%ORYV58|4a;cV1rJS28^HegyY@C1wq;N0PUK zEIZfFW-B}kH;gl)^HHQIUQxOx27GX!m;`qMBj^d*>z>e#-RkZm`=oX$P)(3@UNK^b=KSzD#?Jj5eg%K@DSu#zs@#BkMSWuD}8nK6z z0DLUKrfvTN^k$Vjb2Xj<*LPK%1T>X5{Y$+tf-@C;skBCA$H!&~qrp3x;Gu-)C0+;e z#($KIHDYyKS!JijZ}8WaoeH?moR^KoZZG2$$bQn|d=8My?+hb)GcYBScm$bWy;*K7 zc#38vJn?jw{04bzgb{m{6A0lOnoTjH$I=j@D#j`y;2lOrw1<$zmHQCj(=?0hI@ySx z4yZg07&}A&%H-7!M(k*oh%8zv%7nJEY*1}Hf^_$x6sPPdr5E6b%qqvm@l9I7eYXL? zS2^|S9#XC|Vj;K|S>4i2-jZoX>^`WH zk=c-FH%?+lV~DV;%8P1j`|5upunfG)`3+d$2d%E4RlHwwxEj8p`T0idFtEuHB08(H z%5wUY<<47Rh1$onOXVbCSx!8Av54H2P-UJQsP)S>8aSQTzyr;>nnh-rtl&yKzA5_Q z_wqd+0e=RZf<+Zxfki>ljwr!#9u&j}HA|c9&v>$jJ%T_%1y6j5AT52tYj(bnuh&;} zn1ebhUT=pyV{rq}Xb_JXAuJ1lG?tb6OD+j!mCQ0?Pjas|TEI77I$$@G%N=K_@kqep z>dT$zVbMA`9IaunC0Fs3A7aL1WK)dTJ6uIpH&Z-U1ly;Bs%Tvrtv^05GHGTPh)J&K ztq1T4h1};0T(K@%uZwb|sFyCPP)&uq*U}Fp+v+o1QxkTzkGDV+TL$k-5(=?`;03q=IVz!gYaabu`*8;z8REo6V9HC~n za(-0xO;YeJ45#3JEUI+0+K7EYpU$!E4dbtLYHnptJt8+>ph5Vy=&!0+pp+& zu0e72WhkW@H;$`{g7=;U(J)>4AqyQX;+Q5hYwK=AyEhwknTkTto(^OG-#c1Xp*i zvHP4_u#W*BWU8rvLqd7ulhjr@EnLdb5*Qor=VCk;jKXeW52X%9G(mN^0kog#3EB9g zLa7{tpmdfCfTFEECOb)6D~%~Hg=rMk3e#{dpd_X-DIO|J#|pp=e*9SHox;R)?=@Ta zUggNk8UVqheIv4@$R=DMJXkG9WBWCS?`7H6sGL5da*g=o$hb9+x1p(bwvEb(m;6f| zKPGi`C{)YYo!VANvXA##qWg}#o5xr-lGOsy%LRy7xPhLw0-79F>4cQKs?u?cZU3E! z7vi2JF9RoN(vl|ekuu}q*+Sf(MW!k#B*%%OI{3g&O;X zO|U=82n2hb481I;XdSVU5kFS4L?ak{GCq1%;-hSeb#O$KTW!Jo#4SQA8m*d|cDbXWk=q=TJ z4-7c%xl`*1263992l1s0+?6|f)P+q4j?h;Ajj6`FL3DC`uAGn?-wlU!V{vQdwx~|M zgZWmNDo4m;zZDO;DKnma8xs@mjas*(QW4|Efcw&7z;?Ea09%?Cm=(GtZsO>jRMbsb%jX!Qc<6C3LWXl zdZ3uvvTQfBw(VPZZX^{~J8dKaVfPD=4h^Hwfcf4vsv^w<>|ATPl0Fg-C+F? zfvIvjfI_Ci6yt(VaHm5}1*pIJtAg74y~jqef9Z3wgZtE+(BhxE#R^&o-!jCd>wglL zm&B(I;Ao}025pDqHWpuq8i>}!?m%AL$?&58d*BLg?fim5dj-pNa!7^DURU)J3-=uv zvP7K-*eZ$tlVw4bk&*>~$=m(DAxR-@n61#+7Y_w%at-j1xMZF+hAO>uriu%3YEU{JnSs8-~P&N?|v-Z9*|MGk?0xF4W6f2DP}C)j--EQE`S;SN!e^+PDVaRE3L}xAPe3k zJPR?#;uwFG2OF#NK}M`Uc8|#_sO7|Gngim(jMC)%dua6q1cjN!?WG~syv zTUR*VC&4!!(dW6>zgK^n5B_~Pi_BsPI7M~_@+OB2@PXSutGh&ZxaY~X2Y^)UAQKWgoL*W8 zJC*D}nRNTbLlo4S-)fHWvToaclOj)?Ti1z5)1 zw*ZCH$lU0xl(UpJXcu~RHFg$?(h{4k!QtG7(rH-E*vGi3xC%xwB|0RRC!CTuvt4AN zPcjiz!dqt!(v(DWo%lMI`-9a3Cf;(tT>P9UVS#M;F}`fk`) z04u?BXRiB$YEI75f!&`KFf6!TE@VD#;llYXqx43Q&p>?6V3@%O^i4BvgdI&sun+NZ zz5#P`1fS_{t|+8JUI|7A-MlXIy)HXTmm|?2&Eh+GE-{lcj|twB07&AM)jBt6({QuE zJOg2LvE#R}g%m=Kdfb76GM*sH;6lLziVIU@oMns;n6p4&);e94L2jC2k@*GYeh`B- zuJ3M@ZqhOvPFx}x+a7d|!t{}dfs6bLF)}sIYmmMFgq};O8?KcIN;h0{hO2UW*V(G= zt@`c;9t_DC$_4jRK#DN|tHt@g0-R9QBxpTZz-pW_dFXQhPY3hVfa@~H!Za}wD&sj! zZj{>$_F*V<={rL+5`RWBPSk9kD1?d3j8+tKF@g(cfl?94<~n;dLnd{nco)|mJKiB? zgP5(dG_>u`Uh{Sy!WM#Onl|#gM<`e)ZL03l%{NiBKQ}L=)b&x@x+!idALWdpoWy^$ z2Mlyh5iXK11OPhzK~I^|Bs*x%a|uu4oRJulOb9s|?-c0qEs%bcytPE@GU2`!?UC1Y zcn-lHE1e443^Kr;=?j*n%pO(I`_yd7Q@z|BugScJ=!m=7pYxNh(qlAmt=6>*npXFc z>OetaDQ!RK+C*fJhce0wnl@^#8##|^GZJW8|M|TNsdJtluuS$VI0vW6wz93{h9<^xaW-BYXR2kVp>VmBIbyDfZh?fghwrvel z3`)<)?z)GeRymgdyo7$P3;kK9Qe`Mdka872dz>Jmq>9}~BYK~Z!NBzQE-HFJE|{MM zjchDH87~ajK_M+7m05}@%LWu2+l$4VeDKJ83k5Bao$QO)$w`SQsd8Kk;gTsdC-|1^m(Rrp%uw19PFPaI4ys)Z;|zE9Qi{pMYYu-=+5_q+-F z&ssvfmFBJR+x2z%EDt?j*K`Fj3a}r9Y)=dXGxa1FImi#t}u^--V8+)SaZiOKUG6 z8Li6gogYx0z8ctc2L*&6@|h?(qq9!iyo=bxafQTw9uTKFQkm%;U&kpse-IzSK9HoP z9kq#~b~fIC{!FQUK%igMNW|kv23cJCJ}Ga`4d;91^tqhvl@FB2_l@f9$zlO(B&*#M z8_&ZJoF?i$(TG06+z3%ZF3)kETlLG*Q0*O$5jrfUB?2+e~fANLpWIu52!VZO#_1@`>$@ z=p4+2>l6RXrSge|A(;nJJ5mu=}9(of=;UzcCm=4F{Kj`il*>c_{SD05BU{|R>AN9%U z)1N)1PJ(Ngx2M#fPq;nH8E-w}i20MRxUq+iqZ-6i zDp^^@T*{{WMUqJhjRAIUKVaqHi{2CYmLg{fcv5*J@KGSFhU3~v)!S_xqO z0@f6@ms1xXQ9@Gp5q|V}qI&zPcNOdsia768Zx<`u>&VxVct0Ne*)JbgF6XmyR2U!} zm@N|PCPhDjS;pd-ie-dTYd|6>(o$IOBP!n55$pB{oYL#g>H@*uhVUxAK9ih{r`M(` zM6{==i~Y_5^pnksdi#D7bqF`2R1HsE;a=a?74F*rQo{Y1RJy{ws*7sb;VgcXBXNcM z=38M4XR*|bXB^#WV05aq>Cv4WEW0hR0Zh`dmAkED|8RqO4LZaamxOlOW>ypArJ7Cg^0RnA!P7M@D4 zWo6YQ60WyS8}icgc=#y`mRQQ!@DsNBg6>oo@7M-EhggJ zH^L1ZarzK56yA-ASfehWbak*rcz5!M({q~A8*tvr5$9lPQe1t&^MFTs9`MaHuD;eu z(YlR=Et;hy!!;A*EhQQ9)ei9|63b;C4r;Fi%lL;s|3!>3z)xa=!t8Zo23$ z1T+;N;O011(?8o;r|AZl?99ml7YP>RfQuXx*M^D{{^dD}4|h_Q$puew?kS1u zB8>~%G-H)mZmfH8w8C_^wsRZUS$<$RjCo59zA2+DG zDjI;NR$JHS_1*Oz)`^%_!Y~wv#Z-v-v<7j&gKb(01M<4Uh~3Q37ZY>j+iy8`6;B3p zf{RNd+5%k{Xg4aEj+rnPzs>+v&SAGmfShv~Oh$m_f=_J{3Yr_z&|D#=QFgD70x&)Q zU~uonbtb7v1UrX;>?34UF+(c08-18MY$1Et-MJ*X<4iw0o=gQNUn*tqv);ao;}6&s zr7mi>koCgC)I_r46&t&K0l>;+04@a|OF@-02P8=qnk+U_ROn@dH95Uamb@)vK?=XB^+?smhJm zS*ja*X;*rya`iv@k`$`*>^WW>*godXuNwt6M%Db@N2Gzcz@jsou;@rJ>MG_^rpz_! z8yI$`G2sH!JWd7bn(wlk&+ypJl22YtkUF6@f;+vq zo-5IIfA4%$y?r%VX)U!qwbXXgqgpFFyY;q(y;C+so+vKj^>^Apy!|S*;w|QB4f%_h zMY+G0d-*^~ul?-+`=~GTjF{wuM?i!?x%$5sKWZ$NvnWdc|LW=g1K6>o^3(iAxA}DO zL%&1s=K;VcT$86(uI1j-`#;*6BnHuvKqnPkv7&p*)q`kMU7+))&{FGsH?C;&FzaxM zd)(7*_4c6=rSZxLxEjCjW6-jgKVvG2Lmr)FWjx;+YIi zev%+d7P-$K$3;@w*Ae$2?cS3C#EY85%5T(cDs7zw9%FHk(5^@ythzw7RlY?7-*}`# zCK1F}%NZe9AoHeFlzFS!Coa~A{uPj zPa$P=a1TqbwESbeoka)E?Eq5wdM!V-&H#~me2lE4f6fEu+N<^o8^nwm(Pu>i+!n4D z{9S3m`)Hxkg7Z8ru#t;QFPLiw(@+fnmGXkC08ICSPjl~SLqs<8;0iSF63)uGm6R8} z5fmIb6fbz5U=uHR0&}l5;x}B;ZV3xBn6J)hxn6MZO^n-hjIK_6t&3EI<7&mb6d~`M zV43JdE@aUtr-@cPtD$6zI_a542&p2jfn&KyF4Di3nMt04pgJUNWzM&Wz-qQCq5TRy zyzv&-y*woX>+;+c+Qmv}aWQ%JvnUR8lc%_p;bQXa7C*T&$M&2g_>w}bTuh$*?>$nl zT#R~uh<8G8y(%|iqqJ`HJqEgyO1BkzXDS!t%5%N_#*>7YU6b?h_ZNO*P-0n)SkgyzefrLFtOD$n13ozejJ&7L`LAmmE|GX4G zT=}|%q70jRy%f|sRp_@!*I1BxvCy}k#T}(#qjx)PwMf3EW#B&6UyLF>^v_}x-oRX;{P705Ne=|Rkb;_|$twYE z@(m-NP*!S~=P-E2vR2+{llB~{P$x}VapAe57qkSmgP06gG!GQczco95*74-n19zs_ zwm_DVDKqdR>^2sUMgGO<#BR>?>El$tDgwXlx3v422>i<(E`A(aPP$^a5qOQN-#-F> zN|kdOR1fbc*~dtl$5*5S8?YI_%e;$F;XvC-*!T7k|8;g^(9D4W_@p(4T2iy_ge9f z7Ci6Sf>Y_=?<-Sc%AAV@I$Ii$!^(k3oU}<9eDDSE-Nj5zkAKs{0I&6L$TBe2N(Cs5zoCB4}Xi*#aXoelc_QXz{ZKW!i@Ez`97eWsv@`J>Ub zG;$tb1&YnZ`aXpoBNb`DuM2QURxpaAY_?36)i$O&`YQg#>Gzr7QSv_j<^AM+LWo+% zvW~H25)l-<8)@vatb?qAiNB6lgOHhhSYOJ!p#H?A(+mygdIf6X+?}NOL4_in;=>hY zH4u>jC|=Et9^czcOy>Buyayd}COj1PI8ET6UxEtdXx!UoR6q=mvbusjC!r;a*gwqmblJMvF(_l zu$`!@?-t-HXG=;TOTI{T(@?LvIi}%2qP}FebfPKeUpyt%$q>zM+k zWUQ9DEnL(08W&!Zy$^G@{3;1Cb~q8%$ub$sr*R+JmN^>}pv`FqrsQn+^-Y>Y_7<44 zwD{gAy=i)8$fdZ0tA&~~G!qxohtpBPDsB9zLWyX)Hm;bi*wF!kg{)u>IhNCCk)&XY zn%Hy+d+}W;c!y$j0y(k4RrUG%BcCA1k^dDiTc0QN&VQ8fbyxWeNXclnVM?Z(oA@!m z&3e;_wSi|P!;C1&G29tjH$#nuUo#G4SzTknogeV%lQqXX0AegFQ;+2TjbxdeeYit@ z+5f2{)RMCgC$({Lu>DgeW$gZ(D8Fj+M?aE3ulW>?g3%D(-Pl3m2-zNF!dsmefwY{e!Hm(zk~%`@QhhgjDyG;aQ9Uz+sfD?WMwCXErdy zy?sH0m)@AexFj*O1}HgzSK_@Nhoe1gSk&8Z>2@{2PgTzY&H7+}@)vZ{l7-*vR0dDKIcr#+nKNHaXTCL{pwPpu=fnOjNoTVqFW=GU$%rcp z`9z?}*Bm;b28Cwd#8dGRa=>L+w!IP4?8X08>a%qacEdDi0I$X;S(Xx6%#`Q%DK9YM zJ>?n-0)J#nSGqUL^OF>?9|nS}Izs_9iE7!V8RcgqhI#eN*_Mg;U%nqx(%M*fFPHJM zW`rgEIh5%)mi3LFqrM=swc94B`_{e`I$&&VknJmYN$X>2g8BPI81KCgF*z1_n_6lt zD6^3A)Kond=QPOn&OfLbhCU~s!eskXGTLLHrTukYdpT&O+Q-Yp2#4qSeMYo^LK%Xj zJ<50q=|El!ztEu2SXS9s5X*Xf{nRB%{PNBTEsDi-3+~mbfL#K)Rgy+PES>JY&Lvt- zWF*_)4tQ#O*aQLH;DL@x(&x?XWf|~Dv%o*#!5_CD{3#jmWJlEaJ@_BtjvBv=RB3VR znMTRPAdg6#Rno;+_;>s+r*Z1-3z;?MOXgqB>&2SUkmA#pDMMArK)wCJ!#v#g2*`f( zd5Soc8o@*JyCj85ex|D8XieBV*HR#Jcp;7Trd~W6K0+9FYOJ!JugJ&c2>`3V_Y8Y^ zPCW3U2=jW1VQQ_9aKdL!3s|EAe$KZH%XY@V0XYxT4d){V3Ssg%0o^d*2$#HuUt(=#^i3LWq&V5*EAOiwTRRt}HIxH&2WTiy z03;i3*A3e^1u`%7_D*pivTy12KKZ~%jdgZvt_Eh85`zKk%3`n1;&(R8_nqkLT9gZ$gW6vY>NM zoXO^tRi1X@Eay2fv9--uRpZ{unrTyaSEaG+m1yN8b7)pDE8aibwy`Q!Pzmwst@h>6L55Ix#xu9PX?cX)am4&P-%gT=E0* zi%aH-LgkXj^Q#SlvEWO(5tqC{e$!pDyv|IXDT0OsnK?1*97hz{)-L%a>Xb`dlci1s~BG`FQ%Bm3HEoP8s|{0=BKN5O^!7u9~CA$(~}>G zx}SZPap9JWS*Z_|sgrd#dVWog326VW+~=A7dkS-%7Q$HEjs9n}4bPKPjAtr`(Hvs| zy43^?dLZ+a9N?osEN@qX9%mQ`Le zh@5WHkM`emOiMXd7cY}DT;X|g{;?6d_D^`$cW%ibK%dlmWT_Z9OjawVv`wN4#1y} zu2g-_1Q1lEH~|SAV)7;jn9lUeSKFwWB<`Ws`4p4HXhFT5_&Ht{Pz(&fz;h9=_=py` zEEqT}r_V6X#+*ahHC5To`?u$_k>)Ut%m_=`&{wSw3i%dOfblkf$=h$f68y&EPnrIr zt!j&<7nkaw0lqDj^e!y0JAR=V>_eu)^L+4sI1u7Yz31agxc8EbC%g{%n(==oEH~Gp z3EtV!3n4|N7*AFgEOML4oT}3WyMzz*cCTEBMNu4mhP2-P>m)Tt={t>gP^4{xyQdP7 zf?DS(yczqt__|Jznx5vp?KQ83n|wW2x0oybk3DvIt%4-5(++Ad@Vw9Uz)wJG1j^l- z8U(M6#eapXDogkZgs1J(A1_Ko{zC_nshvOYz5bcT*A0+lx}5SCRC!vuoU(^BY;2N7 zcc_>VVWrynyPe^QMCW@@YYBo`ift}0UVfnAAPDvd$;IiD#t1ZaE--h^H)io zyS*LyqcB9BYhmz@xJ^gWpO!crN`}NuOp~~Ou7f-+aouHwo-T2V=v+zM1a*PL9ha22 zBe-HPH65Es+-aBZCvnG6l#$XtR0^t`C+II}6`%Z;GFkOr-YR{vB&lpNNA8Q}>g{(f z6FA3*wMU7PPgcqUioMIQ2iJaFF=Tqe*^j*ilsk;xk^EM*>#kH~c31(Xxhgg&C?Y>MOcr5n_k<6Xi z-e&H;`dCl<3Wl97CFF4sG!gRqE``$c?d@BnpvpN0az)4` zjN5N#VUmW~w>^{HZ*#BM{Tde@yHC=DJkQcQgWbn~!+8Qg27MQmuDDrpxt6k`$Zu~p35-IcGN?bBGewp-I7R+lMc`2vP>eWDUW*(^%7@YecTP^z~2e_D<{RjUKnY?=YO6XC8 z|Es<~LDTddce)4J(aP-Mg|+lhi!vm8sL(fQnW`lM^OfMPx8IgDi8dJPI&v>NxL^O`Ms0*Qzavwzc#h7_)v058|%jGs`QTu*D(Qdh3X zGHXJsiz*ZEC+n?|#H|BU@24&&cNN)^W%AnU8~hi9TFOD6k=bUodfd*Iu*O^swvHF0 z@RF7(3my_#lf|2(t2Nmw*yAbMtnt+_`jiYg%- zDeK>hq5k=6I6k9SQb_su<0+78zkQ)hbxOXhkvV-v=FYpD^8lsZs(*~mGXx{Gz9QO~ zlLKCh)cI*Ie=E=L5n_7JD?AE(d?=ri?P4r&)b-2qq16TVV;0rpd7IS5DBg9*g+30- z8t)@O4-PEI7UV5bP+1S=# zC$lV|lb*F@zJY)me~?dRAa+Gtjb&{T9c2E%)*8nmix!yQCcL|!X$RYQl3eQ`K3ZUAcC|u*gDdSbn)T3Pw8EmF)RfTTfq680=u3Ay4YvPm{<#_R(Kv9N~uk`7}Q$CwJBPU+?bZo1BKRdaVJQ;c=Am)gG z+`_voxeH;<2RC!%4b*zR<>j`%#9tKoiTjrmyZ91!skBexR{ea3@MvSWfsgtIAW8Gd zmJv6lX2)Qt! z05}WZOy>eCn*hn(Z^d^hK4QJ~Q^?-zLkrb+tYg~t1;OfdtVBcQU zX#YfkAjjSt%MPEkB)T~`H@t`Wl!M0c{%?@_Ux3Bu@bqvIejbi~8 z-5gp7f0%grSG3vb!tC+9<955XD5@Sm+1-v5qmWTqJ6i+u`wV20LtYADjm|UkZWd)2 z$VZgz;DhkwJ-n@sLbu!HV}wc0CO~mv!C)_8fPE3e#{|RYJ?gm%d4o2^r%UV9cIkGz zqi%gS)nY)@y!@VEQq4Zzw(WXSj@#`C0+uIvZw4-3g!pi@i$5~3XLGlYa*)ItdCxAt z-UzzOH6ti-N8rq2n95!Qo(dW`t=pJD=&+nIoo?apI;e4OeKeINm*q*hUw@NG5Vine=(pBDHemY<%$@gybvDMKR0$L>`(2K_-c{R5xM5Ds zGRFiGi@hxm08SL3PKgY#A@5!zoRYQm^Zxr%||^JxyQ5PuM3& zItt%3;aJO72+ACr(iH z)uBsyKzoAuoz+afnI4VN+PL{O{zlxdsITIh;Fys21LvPyqtDjNfYs9duHyG(KSD=h z5<#F^%xbp;aPMyB_vYvtWoPlC?qTir`MLS9g zLPt0wpg9#U8p{G_@Nt>8B?ZA&INsuIbGPy}DtS!(x%233PIk8+{X3cZIoU?^Zy+K2 zfUFtOQD714*;g~5Bfvn3mxx9Hi*3CrCZKLcyh6fpaBe%76{37>BS{~Ht+5uV%sE*D zfm|byeFU=Jwk2^OOZtz+peeq0(ohcwlsx~C#HZ%x1nfo%BUwkmI9*^JYIuqe{@sr` z@LoY6djWCoRpYPGx>V!Ay76h!SXSc|Gj+kKV`ad6>4h@Y?D>pl?KRZCku(bdLjT7w ziWFXXHvxqo3c&dqVE#wx0HXH*yd(g!m(BIX0GKr*5i>Ca5_PJR@_IKtmJLucIzA0h zHXmDX!hz@1*$og}(*)O7&{;8A7fcnS%OKvQObucidY+<@M?s`nu{3+e1L@G>#nUfzR(#NEp|74J*@QIefbONw1jDb`lS zlafD~hF|ZbR(elMs3n&2Idw6^tS0=DI7~h{@gz;+{fO#joxl*~Nh6Vu@j%LotVV5# zU4ZJR%&>a4e4s+b4j~E0q88w~QQjsd-=6`?x^Dyvo;BJ*@Zd~Yg?&LsYKO27Won0T z2hd*5@fNWz_4e;DY8V+dKHO!-QzIy-ac&f2r|mI4O$*%{AE+LbzLCd+qlfFZ-(!*R zd~9$EUUyIJHn~n;naMjvc%KW!sYl`RrC0C#g0XC%di8u1GG$MzkV;-XgXr>ld33JMfFmzYzv0IQ@!Z*_`F@wPF#6uM35I z7SZlg2p!Z&RgfVzkb_0)+^2dKlny*M$?HAdqq%w&RI)6X_M!{@QY87j2(-&kgUbJJ}KSlqu;jz!k|RZnYdpoOtmzNh6r zCh#^KVe2mRaO!O@YN*k_1H)qhAv67vfa{r7Z@2FHXM{4ivAtfoTXKZ@ePoTaLAQosuoX{q96u)N18 zbt4IuDR@!CEE1Tc?3F{DqO#34mrA9aCqko;kj!(>(T#`ESmKLFjeNZTzB*E%-$yn# zO^hAy;e-CVT?fEWqqHpVxTmo`lY|z%o=!d^Ctavh;{CYrG&xu3;rT1fQpWDV7em03 z4ISa~K{GGzkxx-*@eEW)jf*yZ871^ZAf-W}p37 zd%gDBYp=cce@Y&Ey0F1#))3xN?I=Mhkjh;_vE|HXYP6-D(Jpz>}m$Q`LwKO4{?42VsjNNN{*5Stx z#|U!&^H%Mjo6Gtpw#L7xy*R~BxZcw(<(FWsOAzOG(Fu%IO0zQ|T`TsAwO~EUKa@*6 zrIC=+gp6O!p$T@n>+i$aP;yscyy{FfD8mp~%ojG|-*%otJIMCnU(&MvgRib{Au6{Cy>+hbyDejKDdh2BCay})0CH2651!3z3N_)GEgrqcQ_suw)wuU3%SQMF1EI;vighw%@i>d#4a(@sYfmCA<= z&ZF6Rye1E$YNc7#(^1vwq`l=lx}3*O=g}h%YY}3bta>XsliYhHMf+2y>02-82d&1; z9_tEh=a+=upjQxB^_uB>TfUcV>HkQud@dPQ3%!fi8AqKgT}Z({V+JOxRwQSxG(K)` z7$$x3AX0wDH6J)h&-`<8X0z+-Hoy0=nxnyZdF9u_bKD=;S6-jNf$&y|+1M1|=@$r#(l~{w_RzSL_06b^VlPLMUh5xK#*}%#gtr zMwJ@kZ#xcMNz`I4;U&8iQl4OW5s~xxb zGB6@BuaEL{0>NI)(H`@X%h+0eNql0)UowSx9ucwgze?wG%KB-)|E}0U`!4cl@NouKWd<4EUg{Y|J)dVUa`Qa?$x0jt)38?q zOzbbf6sS&YjGv#_p*1uCT}LiuiP6eTd{z4hYjAaM!MX>Si3*d+dbiAVnt7 zNjyCL)^~VI?1)Y8z-)m;I0^<76OuMc|I{0s)sYLah5#(|pc<=)g2~EowNaE>D^FJY zdQ*RMuwo3@1r*BKgM62B+N_V)N@MXCSbY0)M=m)eSnV+Nr_N{``cK~sk`rhMt!ytvd4S>x%H8waNK%Qb&4h-C0{6Adz)Lrz7t8#kII(DU^E3=otj( zI^lKrlAHUx+UTY8Jq&KfVy(r3t7weM3y8*3`~>2PTv!X0wxObD>GP0$F8jXnRZ4om zSH6B#pyu@la%eXk8`&{T{g7G*a$;wK^VpU8x_njsc3OG4sBp^z^~dFJ>_gT+aseeL z-Kn?voW%Hnp}D2MMX)kw%qX1t`K>zV1E$o!M;ptUrB{Rh`0it2Iy;`L--DkU1>WT` za7U$n0wPs>h*ZvHw{k%2%G@_t!KnZR0c*wI6`vNes;RWDDkmSo$;WG8g9pfP8vm*L zrAw1vFZk^n4=~kP)=kyPs|xv5w!^&D*O(j`X_-Gd`D0)1jsD06?I-`6@8}S{H4r%x z-$Tttn^nZzn+Y5to-*Q?1&<`ZE)}%ApX1$aT;uN`M1{t4n0n_<4G{ebf610;zsR}J zZn@-6R_6PtEpeBR1HDJGsC1~UVU9DqTa^#9frSjdTi$y5b6tueaH;}SU*EB2ce+esk%UR=@&@-u9Y2y+ zE#=qCPe>A0hM4&;OXlPhzs!FU$4SuJ0`30 zK|&xU??53QTJ_@RxD{Rm5%j+foLSMqQNbO_Rby`LspP}H*OUmMZGs|yRG%+W@w%Aj>Nv@EN?KY>s zCX`pqGYutGaT?ob4g1J#R&4;_fJ0Q@D&GCcsxIjR01V}llxmq|E9;os*?VaqLg0Vh5_BDBSq{mwFY*(Y5 zs11)&8$R;p^S_`hRrYS#$@-J3k$j`Kzti}-KygZAjjR5A?%K*VHv&kiN7Oj-&xqVH ztm64M9?0`~nv+#NbEdCjSS7!uS0ISL9%HO;`5O;BKR{ofpT?(TmH+wu{80Tgs(P18 zkBq91(_;e;RFr!G;-$wHIlt3m*8x2k@kuMHzajO-Zy6Y0S^7Ho6F>U~nn{msrd0C$ zX5Ixg7Z*|{d6lR`C|M-_l3c0lZ9W?9>31N#n05pth&`3=Oy2ItsM(RNZGeJgWjt1v z6y=w%qiTv}^r7&JKq*d9iU|s=d8^cT(H5JWM47vl8M*uj8&iA^jLTgR4Fzi^&lG=p zth9+yDXqd^s}P@b>f@~arN&Ev0kRhYhej@mR?65}F1FHae5v@*Aq1R5$oh@qqhJaoQzq0Vse#wm=XWi5)f#%%giq^lp4jPF+HL2S-U&QgshST0NKFuLN0I)+J~ z$jksEcu;Q{>c8U9EA{IvzTEm_=Qz2AK7*|TZ?^lrZqawF-=oEC*1eS*!uqBBlGQ1P z<#H>^>nGM!c|5UUm^#tMX#IlxQC@NUzSu1L10k|6T0e36ZSMEf8>iZXx7>_H7Z91v z{Z_fw^w4mvX>ushXIAFq$IdI;Nc>44vVH!D+!}vm>q7xT!1U&#$VYKYCVo=C@OxRG zSdEJ?JeeA_t(3vcKYvuT{wmSbv^)xabr%U6VMWx{HNX!xKU`kUFSAk7w5Ga{di-Fx zIXfpmaUecA)j@nwyH{^3iX4nx2v_^XxK@)5=KTLEBxsKBmdba#)suf+LDqLE`r&3` zFZTNfVSzvW%23YO_X-|yECJ8^V9Pn>cijU@`->X4y7?%jWQn@1ta-4mTy&_@AF)>` ze@OL*o(!iaj()wRtS?*OX3!jnoguJh<-;j|xl{fF2Omp^;KQ8Z&DWZ)9nN}k2W>a@ zP5x?OYy`^VY&``nFbs<#8{&3ZpQ@Gki*4#9%Ww2Q+kVU^J#bo-Q@|6=>Rn@;Cf%{G zPU#=~1oE5$PpJaTIvM3*QUP%gMK3xZ$0RGl{hck=IM9`?FLl_R5HLgYcy7I=ER9SK zQiNG;KEVOtS7wJUbQe1H*$N-YXX|K;E^l{DLPfGEPL}riHu-66kB>^Nh9C8Vpd^&M z4x1uAA~{*iT4I%It>lkY(Bz%<9V+|4U72`Ff-BQb(@LPy7d(yNH8!R%_^tbV)_u-% zpTBdTG51;LJ{#QUQuq0U`&{Hc7r4(x_xYUre8GLLP|sUHP8dEZrN4e=rW5GLs8x7? zP!nPJM$Lyt$|PTYMH_qdDL!wk82j?;LB*qYKhA z!V@~=v=7k^1*!ivls?kFM05p#fgwC!#<+oWEZ-Oo@g#;B-)YAXbCIv*GM1^N zv>J~G=a=cR1!{m42=WBr0?`+4{sMBNzdaslk9MRM7CIQ73^5I4m;??)j!|%|-~H94 ztJqr?T*sbq=c^*9+0tQ^pV1^X+-Y~PQ8mA#YlV)F0G%QOrA+et;_Kw;Q@S>J=Yr_;SPpUEgBCeykk30$O5>#S0C?n z=gy3-%y(ymeQJy?+t{o9Wu%g(q4QPRe@Rs}gEq7l;RM^e;H%OBw*wo`F0BagdZS<{sW}Y<+hH=3VUudEyT`v z7kuzp0y#JsN+77CMr|b+r}}G%K2-E{`ORT#QCK(CT;;(?7oYq?W9w~s*Yi9V%Ts-r zpDJ!4Vb-^CgJ2yrs?Lft$NhKuZ-(>w{hg2^xiY+09?yk)cwm%{$8ZlTAojaVKfuKI z3CY9FeX>zX86C#icpOk(_hjw-%)9_akC7n9?fL6|_N>U7;;#C3PhHDJ_3wP?hPzK9 z?lQbv2bsMKd*-P|F89D$knLkJNdWVyyHH9@{Uk<^Nz(Io6}E3lQU1$?@43d#xL(axZQrY zr*3a$-NzO2k&g4V`(WzI9ru0QCE2fwCd=yoq4EyXkFBZw(0e$Q+qkQ%zBQ*Ate+K4 zdN1(QrPF7e{HDhfHN2EFzt?m7og2lvME^~L+_S*ZjKr2G2rP*gM6XJF=HJg?RkJjs z%cf<;q%vF%9m^q;P(0s#21MHVt;j?zqEu%aoIX~`nVgm38lFKYBl{Ydf=pCejOhhK z;*4-Pvxi?>bs@yp*A)sIou)sW`CK^_)>uI)39L>{vY&ZIa-w*DJ_HK!!Z+|Fbr!ow znq$-PPnlUUxv71;fj?4|udZdJG1)1ixrr`!bs9?kTmEw}xH{3os zrC^D4QhqR)^?T$98?Q*6iQ`7cMWKujT z{4cUq3F@Z_POgN~&Ps*W@J)Fi?uaOj5EP#)!EnD2=of`&cpr(gYoo-YC7vZkpa8ZS zLkxnCmCBJJ{afU$W~YQ)SIFlIm?-2jQ-HNZ4`zxuV}nvu7)*4rs^WyIB43s`TBN~s z6IMxnL|L*jlb8WGV6Gx+S!d0Qgy8q+=6qkoVZL{s3Kba+=3NDx_D@ixa`epXaCNfOdKzN8RaYi6@M>dbY=0cHTiZ`QoymjWWA_d z8i$=r1eXH$Mb?M^3yVZf>KIh`Ss8U@)lvK`Gm@_ua9K+V@_Lc1DGgQlXHt6!!kMS7 zsSFpReOwRJCvK-`U+GE_T>V%&HckCnIwO3sLZLO=0p$`v`3wlIYH*vr*lF5T6Iv5! zl;(yak9Ru-hK8isqiA5rZ^QrsOr$w~5MQp4jNj!v1N3AD&x}&Dyqr*BwCa0C=xh-B zC&Hhb!7FE_)YTfB@l*4%!mm|r2CR~9kRT(RnjcI|y*tQHsMd1xr#~Y%ZxdVgoKyc^ znz21^Q);!MFZDIorv5Wazp^c<(IC7NJ`diT&dtI*eEwH~w+ncseF3(& zRwCU62A<;BbnUGboXJwp7wOI}HZEE{q{!_ofLxTp+R+q6SZ`w71rdlIUPT#`pUD&k6os3ICagH5me< zo<5b>p7Jo-zSKIj9DbgcgOFH@ct!9EK~PC*81~S5*7vJC#=+u~!o_XY%l|486#tM+ zG6ojPBHw5@P58KB2gh}p)!wD~u>$YGRETa9z(m*pLAKt8=B1O;F<<0xJSBPCW!t8w z{9>&kg2+%)Nm;sld=zzbxp|9MtJ+4l3&~hW=lrt5F4O+u?)urI&kGP*LSiHY2+1>y zcU0PKq}x1lJQRR$@6Y`qF>6k@FOZeqBQw~C|I2>(s4P; zPGs!1WJ4HdfEur@`yw9Ccs4iWVgXRS*hoe7>jb?@!NR{X_a20Jq(CfSyyc(`S2adx z*@3kJjMP2{hmyhqELrCaiPuOwH7e_+pszK%W>RQ{b` zsPwtv%OzF;l-cVT!QAg)v8)e>Zj&DJJf-`CJ&%QdAaN+ATH@EkL0Fc*75zw$^$9)5 zKTQ;zwx*NU3b)FM@-!ckq-r-QV-G7i5b*Vrd2mcvd+d733wrO23IXrn7Y0v}m*wXl z=(EG+L_}##ql|6(8{R0xX7x7j#=h2^SgyX&i^T^*M(L>>?-mw|yOJ|yTDS-YAQ)c6 z*ZYlE0dj6~rjN(G*m{#aE)1uswmJQUVJuQzXYcp@)_a!?*yGzIOTIfKea{|1$> zKz`$wFgg?gU_#DFq^%;MQEI*PSL&jgYK3G$uqX9f*}7Wb_%GBN`YEb1F1fF)86Zz#NX6DPEdz@ZOrA<6#hfidv{#A1xDx4z zrxZCwHaCBrtzOFjRl1hxR9W+Qh9|XEq*Pnh%-1NWxDy+E1n*#77-ufrcR$sIk>4uf z(onKtV|cR4Cr4{l`H4B;3Rw0tIpVhncjKsxy(;|Cq4){@==dyubjNo|ZLrkJ3l+-# z`~1j>7+TiyGPFMtO|%y`2i7K zIaxF`$m+4QcG)+O#DN-ZnZ&G@?Kqu4r_)7b?gzr@pQ|RXnE>cB!kl>*yUPOPN+gI~Vev#Tq5fu|~Zm1h`1N-&@(1i5=z-iIjFU7S-$)Ix{n%OEhd zO@Mv$atGKa*$0(geM5!f`cMtufiuWYPq7?wR?RPlCK!h`Aj&~vpLL9m3gENBt$0YF z4T}%=18!;m_WEPuS<;^T*kO((R8T6~m3-y)25O?#a%HqvFj}hmMt)7Huu`o0d6d$c zo(tEx85t$Q8O`wBOFf?Yl=vLLoOr-RMT9EI$y0&M(*YJJ1z7A|YdXN%&miajkDVNw z?IhijP5_yVU|~3ZiF9W9P8lO%ec-ED+sO|lQqo6<2=ni*$9hKOKhHxD}1fv2&u}pW%>)XVJprHTtDinPd?D0IBgzLzad z&U{CHUBxd~-#GrdSXd^=6X=};N`*j|a9zGU>7Wcx1?n9G@YPSC>5iDs+iT?Rm>Ul1 zY9S_TQV;t7q)tQ}N~2z5-!NyT4N+WjuPo9g)|%9gE5Nd5cs!9V?S`&)-xryU%EC_8 zUO%ObD*$d;>(7)st@%v+2EC~uh9jiXyfl?^LlJ= za(waI#-Wz)wLQ`xb+eesKE zYDHaaxZd+A0rWJ+2=J6+U+JHE9(gqN=WKuU>jQ;kP_s09F5LCG{x)%sO;ddkD;kFn zi}0~x2^gG=ZT&+GrhE{SkG2-bd_Zgc;n~4%sqgfFPu4F zvnDC|9dd{y{D`Nw_snBZJYPDW`Wk7FrhO2s!yds-h020aYePfi~k!0j&6) z6}fbs^CXw>VMQGos2)2%A7%?duAuQ|-aG8~;%ixYg*SFha-mPWDu)C#E0>}z1H(9H zMmlQgJ>$$k-STO8M_b;@P5K(^7WsW1ZRsA#JW#f!EL{v(=K>Z)QGv69qznh4>&Hq_ z!bJjNWV7}tyCu`cn@S$J#OR8V?1Vt; zc;AQ|iyyKlipt5_m*5Zj2a`zJFN!oA3qY#DBUWlV4V+c_Y)dH&onqEfVFO$BLkk=aj8Zmxm zU}9v$!)Fm+%8{YK-^$Fw`wlDdhx(?RQRqao=^bACWx&dyO`4)5bp4m#b~v76t>Iq)OaGMc`Jc+mcLRqcK078{EVrvF z>5f-jK;#qfF=R=8e+S8REPu z-{l)Y{8emRWWp{FZ}ENB@2MpjQt5`Xij6qB+nlae z1FZ*Cf(WadaHmQ*Bb$&_|M*i%7)A1hxX`^+uyQV7p@GKoJ71OG^@gZ!BKP->CA zp|1ak+SR0f4!siYs|;t{GHT(<`pXRhPsynsD#xEuF3j{?cm@v{EGqc5GF-zi>y<{K zyKMg4L-kSpO3$h~{~HgmJ|Y`0+f>@so>fn)v|e*j_(G8gS)9#`Sgg;b$G)YU=@MPB zB-s#_4UtM8v(AcQ3P_P>sez|2Jx+liVlcP93eznQsQ^Uhm?{y8F@;`{K7UCb7M08e zosls;HWpHA?-GWN{vQ^(tHA*$T^qY%&+#+ddfzEGjtw66T}g+StlaX&*oYXt=}{F>4C)7%$tW?ED zvYC~h90Quqv8Szh-~A#cN$_(xvS&o0{- zH3Do4&{43>k)#q1THpBW;+3K{+-h0wdROir^f=-$N%V;0nQ#{Vu-;SyR2? zgYyx7^UH3?xLVHa8O4y!(jlkY8liA^Nx1t&H$>10;8E+vr{+fixcM29K9gS>Q0s3& zR83)WNzl9{WEQMWjn-Rz9g|OhYfohBBj+ba>POSDlpF%vYmC&_1%WlYzH#Le|Kjt^ zshkQE?5JF$T(;y;i(YDdPfmZti35sTZv~mR1POLkYvX3%84*yElTfCC88K9f1RW4z zw-ud5-i5)`|H3{p-VqzE9A|S8Ic1~|h_6~y@h;CUuy}M1nfaRhhT4QtQheCk$=K{{ zd??YDZA2LKlV5j^++kWdi%re{M$__|6Z?wM$%4O@cpg?o)6QV_#IZ^Fl&bLW*(~3@hxhdeb`jJQm0|r+Qh-5R7sg>cD|^OiiHTCxl%V$aNs**SQA}!i785@jE;H;#$HL^`JFQZ8c&hD7PlyI;_ho?p|ZeXa%H%5@5Mhy`d zx&~C+dACyt4hiLzs#Pwh@7yjfySo zX}vZ8b*p*Hpz=p_Nujbqs7Cc!YQF1qR?$KM{l6tcE%(xDiB?|CA9FAVVAsC8s4r+Vd^iPrgeYJ1l+6?6*hF2&)1?fz|jO2*iu( z?9*v9Mp?=QV&^ z{6{D$9tNhj=ELlD9CqbAU+uSzZt$SLKQ4BuSrZaYs-}U*Bby!`<0voH!ls7~GxZz! zk^o!Wz4ZqtbSEIKCX~&7;FRobsW%On{==K;2XjY_XX+V85M6kj@p>l}S{orf3lGe) zFdVFf24xuX8D0nY+I_IYakKO8;dPxn`M2x2@CF`gJ+*?oz5KwkZwNQ@A|C6DwZ|62 z(;ShX4x3LfvbmYu>TqV`&;!|(ym;Jl$tS`e^9#36klf9@VoXSi3L3A(n5o8dbrC46 zfH7pb-A6tT%}8&LGEe8HKqx==eM|jZ$lXU0?g3AK3O=hl=L`R3saNf#Do z1jf^DH!8fsY?C2Ec_}T5-)f@d=F~m@0-T^oTeHEusS`D?AImdd3D-%|V~lGa$Soy` zcx66hKI~%K zYo-~!BZGAs#=4*t|{HTQ6k<#xSnMH{47*2ga{!Nxr%YB8Dv8fhrc(h_nmHt(~h=3tLn#A?ew0%q_K;#aSOrL*AqE~&V9XYMiLuFN_(Vtt1;so_I`no~ z6YxB8KnM7hK`ggyN8J@T;akt4*1`GVE2<;|&C`nGB;@2ObOrWq9pz<{(HBOjc7y?w zw*|{K>OBMG`b~>>W8Q`pEa-e6IADDFZp(Elf}%WY6uotBVQ@u&EFxS2iYpUN0=_X8 z1MvOd0NK>4z#s6((_zuVvKYXWNqcM^f~FrWjep6ljcU~R)8>P+O!CNk48u}n4wlM2R553~jH3g7?aA-ZnfhbnZa{{foXI;MYx=v&I&*p2 z{{Tz+(QCDaD*57|VTe9)N#V9@|0mi!3y;2`f^@;Pb#4MQDW|ntz-}OCaWCRk>DC5i zL=hgG> zTqs-FC0p-q=-u_S(w`t>$%Q)upR5X?AYnN2mPlTzDI$N-?iN?krgC<5Vd#}=pa|%A zt@yh3tpH&UrzQP?5?-#-%(+jvBKWy7kk zlT^Hcp3mLYpaAm1Hec6%-MlmKy5|f$(T*k1b zQRX4jn0vH0Y>eAp2E&YoUc-T`yU+{psi+fCD`?^QT&yJ*I&r|o*Mw6X@ix}Wp@EJJ ziNl#P0F>jMR=s20;6+y(gcilBxWr=`tgi|k7E8^lQ_mkS@q#MF2{M_?rf=kU85Y~AWvNt{;oOWKi?nM`-iaS5`@t6xC;BYSJa05$ zZ7XiqPtwhU^nff1kQfxF-7ld~yepjsoi9ns(T)H~-Z~z_R`-j3c3OvE5vhCGZIb3_ zNIoeRnH`?xN*VQfIwr%W@<4e5M!s_e9riVh;LuaZqrTa=W!_?CLGe$^F`s@+)0QoO zmv;>-9F2Ber^bhg{mJ68Z8$v+SNh6-fz~wry@q2Z!LC6KdHIoGG92ui#gY| z(Isc?8su${hMUpJ{MlM44i2OdjPxz$%F$BZtxao4qpJE^y|EF(B|ry8HXn;0aK+y4 z;WHhp5x%2^UI7*DdAfqnu_q97jC$raZSVyDX86<1ivBj%7r#yIqQm!@lin09`k3Vq zx|wRtxR-OWX)CkTRBg1HzO~@0e3G34WHu2ao8FHS8&U7Vi`ug3v;|bc1pT`+?Dsg+ zBs)ij2DF8Kbf2+7dt&=wm;1YRPEhgyql=n#@kqm{B*pgu*k+#azuh5rwo7;?cMVyr zI+l`MW^wehokDv!_L++$x7%ov?X0B;AJTv_L-?ZjUc6NVc8EKOw#0iSUMq=It2SWf zb>C93#PnwQyny5ikjLvHUgsLE{oB>X&aCsHIf z8jl*8eb#?~F+S5UR+`dBObM9+5*ym^MR>}}ql56`L?|PlIV_&Jazdvc=5^^StAmTr z(OYx1zfWuQX@8&blu!R?oPKy*Wb=|Rbea`;TCodPN>i2Ys8jK0C|-iT;@4Yo4G=Ib z{4G!5xJSmZ2FTB*gm1YB$aS%0Vd@Nj1yeSe3&ss8^_gUV<=7e*+twtw)pBvgE1KN!piRLB4i`$D^i-k32 z;|Q)4ZsA=fXmbp@?X9M6rb@g^yMXDl?h}+r8U!!`Ve57JNSPX%okLnt@opLYp1e@$ z!*c%eu?XEK((4X`kKaTQe%t5sxl#CaCRjkz^OxMEP(dKE?!FO08rB2tq5DsKP;*xo z0+x6jMuV>R2!Sxss=c*hOHCA>{UlFhFDr0pUnOvY&5Xd=j|)&093G=30uFqNTPolq z$RtCt3KSrkP)1qh08@K;{@aQ2fm)7}*_4mfb0*;qygVBOdgtfN$hqL}2>q;S4 zP0&>iq7kkSEsjZl~j^hmlQbqlMzc(Do( zfDNZ3_C1sl`#z(=?7w2bpys-Vi8j=abJEdHX2NI_Ax#6dG3h++<%qiO7V4ZMgUhaA zmPpS&?NJFq?S3WvGqOpXhdjGmRuV4N5PsSLWM20R>UGC+;YRuTg381!Tz=6zq_=v9 z=;eLgn~-i{slZMOs1WG41HS50^qHYR- zBm+FpIs6<{J7-BN4m~scUDjtUp$*+(1}{&=*Y-xTGGIASy8QaQ)LjvjDy`*l-ko`O zMwy87!TyUJTq*lJFxO1Ck5~&-q%@frZ%%&c9vPacOi?Dl^^FRkH1R0}@k zQzw9q!8>FE*pTL6IcI8Oysa(UhH~CDtcOXWvAL{|3SXl_-3}V9L#8BqhE7TLh4iD@ zDap#SKRYG)K%=8ljnR356l}3V=E~uckA&bsd%yw+s(J?@9^RRUlQ@WEwxdO(yW?nB}1cZ3z6P^4HjmJhOFA?QKJZY7$om&9}X(~hiOgb z4@*U4@OH^GL(X!}I5t)~r8b$@gj$Xg~454aDw$I z@$5!g=O2>seT=>-y>-v1AYz9HD6vw6#et9~sady`@V5$@cU0>p(S(z{6 zl1Q=gDcN5TJv%pCDGP5i7{cvu3GNn=K*LicVG;@6cE$}sSFFOj9z{QkiA@c2xl){# zMX5Zqe62Sfv0~={6Tx-jp5Kp8uXaBnNZ!8G2b3rR!WweRcGXhzUWQs(GB4Gh+zcql zZ!-^jKFsPWEkV4%PWD-!ofo@Zu=DzeFpzBaF@hG2E>!-hWU;V2>}~YX;gW_|$?K9= z&;dXb6MdX^iQT{!%xdk4T)OOnkenP^A?wL1%1}#ug?8Lp0~gcIrLZlLNIm12ct%>d zyGpIlNS+};+Y^9E;umJ#sx>vskv43TYaOlc4;wy$Pzf3(6s9l=Pkou#!BFa)j6H|d zbSOvPmlHKcL=MF`L1%IfTPI?c_9tIhYq~4P`KmSbwpc;$5v^%HIq&kdq=MdFZyT>U zyhe?2kwfuyYCEddG^3KBkI*EznuUY-Azk7@WpCoj3jx_ZKiD?R@h+h&O&W^{uR9x1)_XUqJs%s{ z^P$mO_I&imcd-N;e@j;v*9q{(wtgmdnlT})Ejs|%=BzPBKc3k~Jke3}f-eo1B&UB` z)7)xMH23<$oNE#PNWed!z`xg5yY(eRHC?w2vR5g?U21T@5a0JlCU@47L^#P;UcH&oKqzf z<>1j-q&faG&RY`aJtkIE|ItVgk)tgYvyEedj8d)Xrjh0(&cWYoo?lv5UbI z#}3$F-QF(JtiyhS8^9tAWfV2Om zJo%~QmYm{&;{Ue%%v;M2AkG^l4wSu)0C11&1S^%DMHh)Ym&l%vOW5{g{?G@TpffMj znx=qkl&7y%Vtm5^jM8%Cg7npqPjW;@Rh^8y9sfkOh&@9%n$|RJ#)U+z z-Hc{sAxBi!G$!bZ_Zt;It&+2KWcOgmo+RvrIjVn$7X=bD@G-7Q-_90185lNV9IBpy zk8IcCGSZ7qOi8)36*BBEIQ2ceUlpaQD7$+?Dh96wtIC$U{2a+J*Mb;Vf6AWa8Rl$u z!gFYa$&nIT6YxO-Nrys;{3S*g@iKh~Nz|BkGSV48Vou629~{j9a1m!lfkj3CYeeD4 zZ;g&x6utr~UZF%Zs6;F$ewgv$V9u4XuwSabB;HAb1QQL)2l~E>ribc#fa!2lKJp0i zXPAVkS>MIPruuw%NKHteXY@-wuHyXxS~hfZP8e5vZjQ1q7VU8~UCUh?^jLQ0HT;bi z)T6`>-ZC<(Pb5x`lisRx;$>0e26z&kn=KZ*+?<-DcZ{Utd^o8Fx9f5u10vbza##1A zUMjxHtRAj6kBRCLPkarWA8CmnStSRFaGrvQ&g7Ho?+NwynA1VjM9pxsnnG82;4W!YD% zc9oVLh#JE|15~{M4R$B*OQ6pEBkl9at>PCag7s=ffoTlqBcm69&a2Y3v8dKGb@11Z zklYX~bfJMW7QVB-EOv;<8y@Skd55y$kg|89Tv2*q?0ZqY{2J!8j|)xo@+rKs&f`;{$6H9(wGdz`xLQ+Ckb3*#Y@FlLPIZ;AFoj^+|pSe#IZt8FKq>(>tmHWpq zl;7#Y-!^3b;aSF;>_1fc`Azh5U(29^=FHq2@5V@q@!LYP{3(X<=fL=qE|K42c5!_2 zony+I@%M}YVGrE+{h{Hjdp*-d29r=BUJdFaZWY#vU0QweU&nj-OKY0@VuFX?B+dd$V ztT)_;#8z+(kgK-L9!ZK zUAmEp7XnQ|Y4e9;SZmGWvv8xch4=qr;@I)+_V=MY`zg51X(9SPqrd+L{AhoNl9~Kv z2QvKT7o3T$rVc~7R9HiBDy$(aqL%JCk?JZ>UF-`Cj29~1i|z0@Gh#beRVm{qU0`_5 z=NanrO<`(nVHTv`$h3!nBk{k9Et0w_%K0edlm#K|b4JOV{N^m|v3WVM%cJ#g2$mnj zyk2;c;h;>J)&Y2B=qTBBn*BRiApRy}of;q+>%J^wT`LyFO(O}p!zSMmLC|NNj30^C zUpq2giw&*DE%xqvog)#LA53D~93mApZh}3(&DixIW7njSsbylg4~Zw$_s>8+?$y>Z zlDrzNe_zaj<6;i{2E5U|xmwe`BaMSmIRz|QPhSY+f+ZNxN*T-;(ad3}i$ek&Y21Ct1zw z01!x7;d34$>Kq{U%F9GU&K>-0yPr+24|z!Oot6-{u0Yhw zj=1j+(a&py13;232TIaxG6y?l9?Ogz_&C+a8Op{~j!<-=61G4oLzoH<8&UdW5Lt5A zywJn`A+nOyHx56n1$WN<&Y7v7me>Tc*`RljJK9yISf#dhJ!id2`;nH_V(B@mv8vU) zb!60->R2gd8-=s0;cUTdw7wed&H||7H|D~u3SXI7=4>S6FvrvgTdV#myu}}tZqKFL z3dgic(6j6>m@9{I(s%VH{kM$pvBR+UhI~C4TaVwLVfE0d>0biyglVt=X{Gim?`X;s)>^7O^ z=kfGezZ0+KcWFP7R$byg8=AM}4l#oX+S~XPG1bDA#U1t^NfWSv*p<##QBL+9BsVtR z%$|__)qED+E!;eVXPDjfQ+Sba(MTZ~di)aC6=vz`xh`s89A~fS1B<3>s>+P#6 zP!RWkF-()9Ge#u7EQ!+V_49*XYSMd}`@0jV8(lgnhpfnXkFOc5h)wiC)p5s<=Z%&lGK2+)Jd)6#tTueN%=(f@euWw-%hDFW679WCq8WbVz$$)% zle9x~KI^NrMW(NrF=8(dv9DBHGc|2&x8!^Qyln@W@)megD@9(6?P@LFlI!+lpK1*S zjhp?oA2KOds)|Ho8{j=56YvfWc;}yeFMnWJAkCD2`qc9A5A90wMAdu~_XQXVB)=bs zyuJ8=#DN7rlpe2Nd|$DpdaEsKqMxeAiAB6QH9J_&)IY(gpAG7km(5jE{P7PG2h7Fk z*nP$)a;DOnD(T>8aw&VD*uq)V8~-46y}}bm@oOgw=&m@ zkq!LHgut4?*GzIIP4?-eI^EW+?Xzfd=3Zn=nf{_s)h-sFS+xh5wI(}EAJm#=?ui;V zhww?MP25`3&7sucY=3Vx*57io@dk$$L6yEFfyc?~{n|2FR%PP)WC_pWkBsa6#P=*6 z#}76$bFYpms~p8G#9B(`v-lzFaHZ%d+|G$UQkBT!1_Y!e3%!I_>*V$y(wY)UcvLOUU(??Cd8N@hqypK%7Qwsim%gmWGp$!+uo})q_*d97uk)st!*^9@4v(KIB6rvZ5buq0d z@WeKAlg0tgupJmz+-my1g&DFI6%#PJ)lFT4{h%#-jql)lnJ5=yLopVbH#OSfXObIkr$ZnQ2ayoQ{x!L? z@(TVg7XFdw412FzPX$j3Nam{~^Y&HaB~LFdF}qp5vEl1xzp@wjCachv1Sp@1|2~$$ z$*Vqtu)nGd>=&q=OaJ_F@!cnuQ&g!64zzZ5uJ^4Qt~FdnIa?wWIA7n@A2DgWk|c=M zx6ZF6)PedS>@5^a-#YLmgSLaOM5mO0S$;P%3Hvr;K=;0D>X13lJLjOmj>T9ok4wO;& z!rvvzqJjgakpMM(VL*s+A;&QmA(i<&Wp`|72kVQ_S)$f>OpuX@rwsez0V)^PTqU-J zH4B3Z8@q)2dya}($RV_?a{ucZ>gxGS>|$!~GP_eVuQj4~?px=z_y^K^< zuW8qAAVyPfIR}avRd2;cMfKVO4E7=fkSnPoEu27KwE>^wv^Kr@i=s52_?=Rkm0`I* zs;}y;I-_c5EI(OAecIAmiq(Jbty;k1&PTCHX>#UXD(N(~<#lNd_es4~JB`JiMvLTl z^8(@!xJ|Mv%m3z$UeF}-FHwx*J>VHoFi-EX-uMkvZZ2Iq;=jma{f!Kn=91HUVl|QJ zJ7eRyi3x{GI9b)nTnwG?1!Kebs-3@R+4n`Zne^l$pzN_9>&VZW_KyI62s}CMQ@tg| zoA%u#!+(oAlkwM#SJ@CTPI~fc@dht8&XO@^0SC|#KhWZBpOh|*bjLr5+_5trOwN3b zfhVs$w-mP%{GN<&py(YGE$)(nnCnY!?5}!D)GF!>8)PbniM=M+e2-r9#e?Y;FM%44 zINa)AGR`>W7&(WS>JRx)`=JEfR=p);iQURRzxLdVBk`TdJ9a*tUB46^xn{U=%=#;3 zBfFXJ4XOA%C>yu3}yn6z_*aY*2czpFn)20lk}TS$S~hAHY&!?A97$ zU=R6h&n;Bbxh#I+f+0FTAvVPjh!~Pc@OBOAXRz2l1^l+fKk1n27;k5gC0k$r9XHc)6hQI?=x>jk=}Ci%l{OOMvb>s7z0O6AiD*|2F%VNU0_02K|+ZB z939u6GPbrH&nbR2mj99})75gE+d;kkcFVDx;_b%P_<`iqB98os#Us7i^j-n}mYhgu z?X50&2z~)#`4Twu82cz`T`Q74waAzn5OTHZJ%#m~g#7x3D&tlkq{(M3-aB8EO3*lp zfz6I^=R5<6&tot1RDbIC8U2?WTfvk>PJaDjVvAZbil1TqJ29uYuUPeO&NZeMDb{83 z;u*zlT$kM-V}0ywZ4HZR+zcuqh(BvJR5htrn1p=nntQK&Riw^QkCj}5gP-*wR=7kv zV(W=!6o*2-%nt-x{}b(q^n0u;h+tFNvE9{lXhDV!=RG&_H5SA)8`k1SLcGc|36w?!Tl5B*6>@1RzE3P-8o-KKl$mRg<_@W{=!NU(m7*S`@&r#Og6jZ=Gn1^%Y*s7h~>Aht1nc z>yAer*`~LCW8}=9r8Rg|9sDKl=!~?nn^|C6+$9Ga>;u`x_TpCWF&252?c|rYb%;J| z_O@4`&pH_|w#Ls)#yN*3HnKgZ6j4+2+0NpwNYz`~vgZLfx%e%%8&vsmJrWPUOeWa+ z;+=At8wkQ*McrbHHT+&a9LixI&nQ))wzPmx+Kbb7Cer3ZIqj3ZrAtR@Ps(gOa^&F( zWAR>&*x#MJ!_RrXhZrA5U>`npi1Fd%Lx+-!_fqJt^pbOvalRXe)zHJ`OV)$r(2u8? z*tvHy3cSFw77j>vR4C;v;Kj~%0Oa<;_dJ+pn7|2%t}wRQOL!!wcgfsDBE10K*rp|J zCRIE(iLC%=GSjcx3lzp3J;w3mVt=N6nEMb>UtINv4ZANneeWuAdy;qbm^X>>eQk^J zPH{)%i1w57sm?i7OZ)?$9j)YwTLl|76)FkJX^Dp@V@|jNe6)JoCqtjZ@lT{LT7&SV z(Xy8BX{S4O39s4lMKT$!?Ds@;0Jd)`Dxu-aB4kwLDYehxRe)N`6Rd($`}e$N%PVXw zIG64VCa$7tLBKXpU=NV5@iagiZY75TEU}i)ZZQeLNpUYd#s@Ie{iC08#lDYjuH{48 z7EeJ&f5`a@VgQTVY#!HXaMrFmd(%C6lL^&s><@8!ml`MQ|KX_0t0khuQ3?5>5=D65EJc4KIpN`fZy%i)I19`n#!#R{<3W4WmqPV`! z#trE=US}i@a1T1ei;RwnYnIArC}#)RsmVz)C2tQTb}Shw0U9u)aYsOV;iRwSknGHQ zJ+?p}$TO!i6KjB4dh<6%Qg~^V+hn&;u$LXQIG6u+B`wYW0<{z{!5t$N8?QT6vxEx2 znBVuddoSTs!1=?t=lzj$*uX(U-pz+N3FZht^dsK96LS-PGfj;G?}(^ zKZpPlj8=6LcVqqaK2Yef{|*h5yfC>?`ud$b?z24xUSwhTcg!PR64W(nzaw1lO>Z++ zOJd892x?mdj@pfPK(4~%cn_G_N6t^(;QIBk% z@~jf82(yNnI5yGIabgy2GB(FQ)YhiiKt+>B$we3a#l8IyR3`YW2v9WRo70xLOOzq!VHy_&CgRbX>xYn{}Ip0sH&<$<{|K8@8ByPN{&nfZ8 z&aJGXGcL5sDdg`M?e>+3RtA3C{u#fr?YsU22kgWRh@V1&)SS4Lzw)8NIp;bvl|7fP zNN=~p`}&4iR-XC|1(%Fxw9koM;5zfvdPb(uUi&nB2`3_Wf%)N7HH(@BYFU_N!kDFZ`Ihh#?I$ozjl^**kxMHwg#f~-M%2lC+X^dncO6TS$BawrbC z%C(LINsV~?j^GWPcnJZ`qEW{Qx-mR{K@B2?b{;Q4tz0CpTd>9RPC_9xv|f>feCPsrMElQipR$dK zRdIH-k~o(V9R6l%APO+!B&`%kF{u$k%x>7oTOo%AP3kf4 zhlRS!Z_^&TS48~9=5#nQ5e#ZC-r&s?TP>1j9OU$bH)z=SB+*Rc@dPc#>emTE6tCcL znPHvvAtp9Z7@w->(G0w5^}^ZCOJJ6G+aA51=92lklgQOuTEjtUr66p5V-n9+#+Dhd z-DD`w`U-uwM}Q}{|HR`+#CVvct65q@r4Y`ksB9xZS5lE+w%UDSVv`}rnmC=GVfezU z7Lb6tt+39L`N(r>pD}AYgX_N>xjM|P64+x&tWFz%iGe6!aQy{#sJ!NA4WnpVUULnc zXZH;P!j1&O!T(G<_BVkWV2fzj`XPNoskdo~F{G}hO3%xefNoo+!-MS$_Un$$)fxtd zsh$*w&UVRQ$6)>pc^D?L>9a}C@P{gYuhwubEeILCL-MIb4B@S(6@2=J!WE*VL1Z<} z?6^pfezI&ZgV?-Q zE}Ei?0j5Rv&yiXee?#~c>?vu=@a^wGWm2vvn4w(J83xACsQ_^m)=xj6s%fHaJ{L!S zqxff0T*AcCK4-9f?jD&{2b8DwdpL6F_PdmRs}BD{^&RrbnO2or!*^WV40d}xDPjPO zV*t~&{}tsY@^yn(r%hjm$ATm~OnAB0FoJgLj$WoU%;ZJ53COZs_YXX@ zjYImnf*F9==DTu+@R48m=$u~KyHvGzTKu-1_RV+l*;eV zAti?@3WlorxHux6AuCw}JL_$7ZfK=a0Zy`g211i`E(UV4bPQ&3lIz$X38;G~;16#6(vdcwCk>KkZr1co4#8^$2j{7w z_I!H9HjvN4{<0L61KT9qFZ4F2l%UN?vbR&R?lnR79OOq?O7;p0i6pGLKvF)nF5itf zJV>Hg!4>Yf@(a~IHQ7I>iqC8Nn^J;cn+ia7#-a?p?E7FrWcxwIKgfOm?C@;6Md@BA zze`xVl8kbfSjAv-vOiqB+~W+Cn#27=h_#6kWe6IFGSCD*We9}iq@j(21Ug?xPd)Y+ za>%x_>_5B>?Q;Lx*n9uTHvD5bu^7uE7o*kUUrwGcH#m1Vr+1{cx>@#fzLGa)OV(?3 zb=;(KTs}5TDqzZ8lRUqd!nM?!il*CzA+?2vcQ?du<~d<(FvRT<#})AtBIKq-I> zrN=g_)0{cZ_vl!vE@OWV*1>h#=pQBH4lq*C+eUy+e)9ZR{x2Zu za#wJsKKFjYpeP{gT}B7}cwX(-lI6duknW{p59n7(M{|N2&A zVRUc(hZ*|Yd33L3UvA5uTqDH!B41ZlVn=L_TMwJ>jQRf9%N)SY-grPNKAP*@Tz|9>!JYpvX6PMbtQ1K7mZX+MuGDr2VP4{~o5ShrI)5?lXKz z_Sv;~BjRCtr*@|yEBY0A$GCWg0H-T!{EIK-rGi9mE&WLdAFwf5wgbEONDQ%Om3k(A zU!BqXMLI4YPHYRSP0j$v7y=riFt6arB6hDHUX<%j!POf{BcLkI2AP&eUrcwvzPw(dZ zXx|sFoazUH3EFR(nYZP#Dg^|0tLjNEcink%|6E0ggd#Jr6!#Y{JN8hYNAnX0;p-4~ z!sX^;@AMIKs$?%UeShXrXjX;H3D5Etj`T8fEz$JFl9k`Gjvh|ldx8V2?gY{z;!igk z+X;P^8xu;6x4CNd&D03T-}5TBy0^2D2gFI`L5ddiM^A_ap39QdS=<2OJ$5E%wBdXz zG~OhZ+qmh({0+u{@h%I}v{vLp*1~L2FPX1Xc!KyyWobQ%hF7)R=*nRHFRqd_`qNoG@*A2>`Vy~j z1|)T&!-Yv@0P|VTP&PL0dmI)>J>xVzN}6_i82hr@ zyp|YCH7*EQ0BnzwsJQ!m%F$v+?7WVO(1R##m&KnKWVucJrDK@<5-164y_eD|K95)j zs8j zg_fK@biZ1MPnYJ9Zvw3kn+3u`H5{2t8)nH*_%VZ>*0fR(i>rl-@w^JN8y#FfvnX81 zUgIO2Aqi(+VLt5BTYXzUl%Iup1I9Hcl9NwtwIXlN-w6{I!TKd!@l60S_G;B(dLv;c zH7wv8^MeKg`ct44#qFFHp0Ph$34%U>SrU2Mm~!HgjkGZ2_xzqz6D<1bAb-hrTtD0y zNKOiJa#?XFLu$BXPmbOaGJR*7GtLU7IQ;zKe0?9A6n)7rMDk<3=QisbyfTELX4ppc zIs2W;;q@9iFhh7#Hita}ZNv!w8nk^`5U4Hv7O%-FrE2=I2cfliHgJMpBbsSeAXydE z*N4nIL*|Vkwj0WIyrM)Z6T*?<C*+>nemjK>+6X-Igxz$1UH{-DegV@ z7&Hi;C(Gz9Dx6uG$89_51Z(dfdQk*&5p{6BoJo{?EJ~8 z+^LuP0BoyM)B9d7whkJ*=kKBp8F|8BwWNQWm!0nfw(9H<Uvp$rF4n4lplc`iG zj*nH5JT>&QCeCDi+8r{d7(Z(Y%zIgEvm#&haQz1u>p4OAb^RV)4z}C1bX~_0VyT1u zn0cExKbkT<*%a>(X@*{!szRd$ZUgM#(4%L(DTabRycGNmg~ye>U+)u@tIm2o?<*i2 z)c4hYF46u}-|0KE_tk%_@9X+`eMFy?N{|-4G_CJ;&hoL5xYSp+m@tEn2^SB3;Ir?t z6sY|$NxxKTA?#pwz24uc!%?lYu!c6OIU#RttiO=I zXk9CizeL0P96Jc2@7iEX*O)>xcXsHyuI?j@#B}{lb>Hl(<5WPLZqgU9+8&9x=Qa0Z zfc1Y_whIhO;A$>bzVx8`9sl9E7iJ%JN1XAY_EvXT{sk$&vusyXr&InF+ENmldU@B^ zx>8%@d5%qpcRGf@G`vWvWU(q|2FEgr)sgdGF=G(l=-XC*_m4f}>{cIkme}6VYJFmq|pe41v$nw}aEA z)^?dH`Y)Ya3@#)WX<6h+Yn`W^enJ~lDVJvSiS*K5O$beSEi^47_)TAJ~ zuih*UZ1kh|^ggN&Ekpeb*Z8~|72v|*R~bK$BMq1$1XDvdwiw^{NyME%l_zu)_o4jU zzis-(dTrc%#XSPG9)G=lSM$uq?8Bikk=i|&{Hh2HJi`vQ2kkjPG;_aItLhkAzp~G( zq4|lT&qV)ql7B-eKREl0x%sro7s~$?5q!!9JN?gohhfIZ=FpAJ$kOhS-pp%8Hx#@S zfBn4&ByvOkuOi#+7D^Zf;|zU6J;olrR()HWqVitCE4wO_G4gUAImoZ(bt_1DeVjrMMoC>^3sA48wekDh}Y+)Xl(c`A`8 zF2De^*cbSFP^}wd=Rv z!(TtMar{aNOXXfOp7VdG7*TzWkp-j@;~Jlzh^k#6Mv1x^qlCj`EV)pJUce|!7s%G# zOyepaGblqqCexD8U8$jKQbmA-My1LT0Jf}!JP+{5r~+s@7X`zB%c zVc-1$D@;wjyGdWcLBnRw1-aa8VygYj7fQWY$LV+dkq17JZ?&KMSUG0Qd|u(m@)u4V zB(qznm$Uz2Ok5Um%r>1AX??46w|6Fx+-wkeU3v#tJVg;p;gMFgM(Qx~PXsf2*RVEFAI>@g`T_r&U)AxCJsf?5n`8>`DSpWKXVMS0=}d$GaMnpD=}$Uv<+Sr$j%S)Ywd$p+GPs1jbxl&; zOH`*Cm|Om;YL~vR?DN4}wTc&oK*&L@+RMiJiq{!6bYogJ0!EHVsq4bZ50z*Y2HI}< zp=oRx6MYyhl~S-aQ+XGy@?zFKdIQ>K6F&c7Q}Wzy8=F9kU-P~~YcgN`6b%A44%VcW zbIS=oS-F%#%vijV8h82ZB)6;VD-zTF?`gr2Bn#&xPR&eb8BH4zXBRl~G1!!$Rn&os zR=t(O*)<-m`f+Jk@I$Ts!>-%(1OE4>pFux!jY!L7qg`ch4?^3OulMe;^hVH6MfhhB zhhUJf)ETnQz0HRbLQF~VP3K~Lcw`0Sc}>yu;Zlp0o>!6>Lz+(>)G>R$03^#hCD^;Qcrbfm&mC}ci&E}f_%J~CXE zmr$=I@!(IVZ+WUQ1*=-OStNpmy3OJU#9-w}24$dT&5@y1>p~Ou>gxx}52tZI3jIX) zW=KrMU0U^cHydKCjDMAk`T<@t38fNolYQnWgnAaraE_Wapw+=zP-;@jVJJn{iVrBR z?H{^!bfZ@NX9Xc*m7TGfav79U8>*->{owYzt%<_^E8Q}M!wiwTWqocf9z?#SVobpx zMNf_wW=YN4q&C2)tq)b^kO7!!^H4-A`L8#XABHPsTWI-VxN-+S^py^Ec&d@$5F_s^ zRyB$2P(wV)#hWE;-b^Sf7mhE+BET0>0>)Nu;&_Etxq(*7cH@etp{)wnYp5S|Ssp}| zoJOvGKrYfeEW54r_k!=SgwvZgHU&I?3TO=X9K`DswKq59<@EWZg3s4k{IinY_FwX<<3Bqx4}&nkHKa z^1+O;8@>|CNNd3lF2Id4N-o{V2p^((BHvVdWOKK)r}CH5Xbk_dRCtKr_9DbQ15_cs zW2R&6Ch!yt{=1V&AUQqoKHWYaakVb|q95aeVpp))=yqxkw!Aevh;oQ%TPPm)*h zwN?#ZgvB|pHxmAOB{hqMO_kfhmPx?`iIGiH`I#A>OB)^d`bxreNmNps-cC=4TlfY+ zcvl<{zJkR|_5r;hlO-@wU(D%hg%lVbx<-N~Wh!BM2Pcp9HT55$4ONb*v0S25s5Ijw7 zMup6m;)+o)27v+zlNd#l#5sC73@p_evwS*4Sn^1;&w_^;KK}`3Fn-36`+c+17%hRJ zT#dK9`EME2mAzlxkT>^yDNkp4$m1$#~Rx;Q)Bl~RtNf57$+D}w$ zitNMsR{a2^_Ob1k{i3q#FD!1=)%E|>4|UyNZ?Xo_6ZI8<_Rf?Gn`Dwphch#PUaHMM zpUQOeWvK&wPg()CvIAhOj3V&Szf|)bC5d&YRmd!)M-+Nuv71r4T#D*@z{#7v23aOo z`le!|)9b7iT9cerb76ZB{^jgF=&kVRyA*nj`tWAG0UQ(jEI~mJAW|olr2@TF3*G~I zAYAIuf29X2oA^g|=_Sq6VQ#s<4+L1>PTx<)ETfR6X<3$BJ|N}FdWU77s3V^_WKr#XE1hK^Q#`np@YEx~ZQX-VI}g<~G-jRP}*k z3Yr0?Pie1y1j^x%DE~TRW{MhdC2oGt_@ex4E`9kgN=kb0gZIk6F2#Srd-<%y0iluv zZN!T3d;$F8dD05$6W!Dv3h>FU2yNsuj}ie^V5qONahH54cSg_VWS?}4epsuhq%hie z#REJUIwcaiB%&vW#{kIu4RcO7i4hWy#5LA?B4}z4UCs+d!k6(xjOK_KeU_pxX8>;y zAAp&)Tr`7v^V}<&^(&jh(ule)&{D{!$f#xpZkbIdzJNP)8`~nwQX=PYy29?6({hT=M>zgzhy-ewmKARi+)mq?9l35`x=>z%wZ!-fjxGo@mF z;C@+IPJ8@Y^ij>z_dyL`Hb?Uk5Wq9o8l!JO!AFN?C$CZP3#QY(*b6H;Tq9;CF%fP+ zlw|3Icqo*W;VUYvy|T_vg;`*R--`l1T3vGTtYAXUE^L3I$xC>xV@*rCb(;!u#4E4p zL8ECYfIa3dNS5HL*^1WKGn`U#q$;kIC<2ta$|)uC$SKuX85zfvDRjy-a-)}1#-V3O zcE#9XB^ucgs!ViaQC`JNC)QqU2816K!!BPeOL6F0O)fi46*HPx5%jlfTlzN)oGkS; z<*mtXy5JH>QdzU3#}q#8Oq#~uUA5bhQagIgQorYl%^}_TQm(#m|M0EavZBmews4!gJ)_b*jA|4JG|`?s!LAWud^O+(TX(!pZp7R)He^IFd97bfx|Jd`79fb3ocD>1){3N}grGbt3x z>?6*Utw~P-CdvV*a&kAHs((lRn@zZ1UrY(zq5|kl*fCkU*5(eMa0gb9OdqVok}h{w zc z1S%nrm5=;3Ss~JHTZm zaFOsCeJow6&A*G9=m9Qpk}I3`fn_9B?iYxhCVzR_mxIt&*}ovJ`wVFjbdZQ9V%*PV zbS#hqgU$$Ii8!Q`%T)~dhO2p}XQ!(N+Yks7aj6K03e_;;Tglys1NkEHAp%t0&?APN zb&16!zUmEBD!s}v8JW82Tj{0OGWZfI<)B6$uWB{3Z9B>`27&}8P96K>I^M&gs9X9K zf9Tv|0ZxQ@N=ahD%=JY z{GnD|EI3trVnxM9t)iSJ*wP7K)VJ?v>*8f0Gbo?3w| ze2;X>U`w33LU9Xwkl;a$AvuI>G9JT#5B=k zJ|O(Mn#^(`VLp>x<*hQxz!PMq(wVZ4S+1nW4}Z*yZEwW)FJoxc7RBKCdTsZIGZ&Fe z$V!=uHxWYPVWr}J<%VIG!UQ;cfRVs3%46bJHlG3?mT0fHO`x$_#lw>0L2~Hn(USUVvU*h6 zDU!01YNtxIKATU?jj$cYBe5CeWCrVUX?KB4M&>LboLnO(P8c;{tL4iIWg9ZC=0vbRASEMI zI<841a*c>sO~1XFGVST1*g~c<(~zoUuZ)Q4$`_=EVP1}4pY9A5VCHC#$R#(DB5$-= zR8YkO!VfS}4${{b$&mTKEs4!6s!-I^<=PWPt(9)`mvm65BzM7>7C#pY&t44x2||%e z@hoW?m1W4xaVz6WSq4M$V-A;bEW8>qr&W&;`8YUo8sV=h+^{ceNxG^0Ykz1&OJENM zV>MZ^UtKx^8I$*pHBq@OIh5sZ4EWGTWFKdir1vD9-^d!#MAO3;Vf|5awximEVU+c^ z)->!#tGm_G>e@;S%Htu;6|HW;84c@D>(HA-iMu}`a1Y%)73)F{9u6?Ev^QFk6VXH; zkwm7qZX}_g;TvLU$~W}714pZ6OiRNXyY^7cy6t;*Zo7YZS+%W7c;sm}3)8MNtkmL} zXhTQw&iKkX&FRyqvaUEbe9adeNCO|aU_`{2{0#3DAhs|GOPJ`@q8S50trK{5Dge&} zoTIfAvaoggE7Y1)TR2SYaYzq2d@O9BDmou4BrQu)0y>(rr`yEvcTpnR{ zh_%3rP7-iZH|cii^IaIc+^F*lMhJynBEWUOda+^A4754vjA!`bRq;1{S71i@gSE=UmYYScJ&Tp)F@AVZMl)0A9BdzNTB zzhJysV{wlBQo^~Sil6MtrKe<4h}qv3fgbp711|O7j_Yx^~1rh{jiB3=?H{gBEIM#XqO*; zPiB8ry|S#E4c!CqM?9xWx14WG(Cd6*CT|=Q+Fx0o0T|uY33%YLNCKfPU7J zD-!6-Fu^p$U@3FAS`6mZ3}Opm*nm|P#UZv^U$@$wyF5=u)Et=A7-`KHZ!=$yN?}LD z$hiIGp^+&NSJuNGGu_hkEO!8BnKo|*C_^VafuU%RF6y-;Y3ot86=n;|2H=JoS&V!{ z-4^G`g6_{K1;SLqQr4;tz6#G3wTr3EulPVTf(EUkfr4rRj-#i;JaB%vf`LoS3QK>; zVhf{;WI9W&sbA&jD2z2$RNG#d+Z%ewA{MFI<1wDC7v{8MlxR`3PlS1FfgYZLMJqTb zmC366xk?!GMtw*)`&g$D>5I83iS@&d$*PnHv- z?A!jF)1%QnCu6vGiUTx=kl>+Sb9*WqD>hJKrZc%=v{|PDA{Q?MYsf~lz%1hmJ``{s`1@{NeFyhpa($go`B-a(Q`pW4 zUuW=BCe2Lysb(kMv5s2uM2@kU#%TxdZ02jad`+ZOFN^}*R>*z~b(eVBAhrsei3NbC zk0;p41>qSEAiY7qu9*O0C|X&d;G6#6w4}iBp^aY-P1(#2DezaEXUuD6w`+fWpYS*# z`q4-5o|ko#Wg~8{+It%Tn@izI;Gc_&UMK=YSs_l+>6tl*Ylh*1r$AJKH-w7C(d2^y zsm4^LB#N>qNaS1V1u(@KV_etF8IeudYx-^*1b%9B_v@Z0`t^EobC3<$2Whcy`g*CG z3UflK%Z!xQK_cn7E-B~KmS}tcyj*Wl5bL>O$ESo8E!9B`Pp{r%P zELU1RE0GT#tVTG=ekHQ~8`-!Y;Oc(y>CeT|hjo;`#7>WHxosKP$RW9^s+NHz_H&i} zoMu0tu%D0F&#Y7{{|5X075ll|em2=pkDV{oeh#*u8TPZm&gZh<)9mLL_V-NtJ;#0) z+0O~~bE^Hk)_#t%pQc?t-+rHLKgZhNpRu14>}R^2KE-}tVm~YF=Vtp^V&~gozmK)w zQ|xDr{oU)pv!5T?-wW;c7wz|4`@PwIpXKDUpH=p=)Xw*m{a&Enxv4?@UtGh{H^UV@ z|0n0U7!UNlSaMJbxStj&D&H>TMaGD{OIRAbeceTwWb2CvmmmkdK&un>@6A^p8PYQ|z z6U_b9>-UsxUS7x}zCdevyI4TA?2gLsmVvYFcJH;H58Kbl_VZEuxyF7jwV#vhXOaC} z;C#2~>9e1u_V@Mbxp)=G#@(03IQPs?QXiGQ1M;MyQe;4)=6DiGvrpF)aawu{asF2I z=912wP}sPZ^aPfk`~(xH)nSu9Xnc1PvK zVo7dAzeTED4!?vS=fG85{j^WI&>K#a?=#rw7q=OoUbyK-eTxK`S?l7g9_l~ywBQGYfv$gJZsd$a*LU?xammT?)hw;LG`0M2OW=q4*5Lce z<%bdi*Uh-J{7_=xdz>mgxUKwD#g9gV7p%RN{+6l%e3sata|A|6?opRpHMF; z949)sEn@l4&G9HC?oGV^L(zkPlP^Y@$HIU07;YG<5AMw{*rtHwPd5@;O1u@UmuP&t zijkdebm2I)j2z`&q;@uBVjXEI@e!DvtX-Ip(&acshBPX!f^j$LbwuE);S!m>ImFS! z7Zvd8oM5~7D)bv#5-M}+oEabIB3gk~A$v8o>OK0`x@itz&~XzXHDR+_!3ViBR$r}E zcM07ni-YunmIWhI19Lcbv^Ltm3|OuD7WCTS?s@gQh5mIF+h>KPCGIWytd!7j(odJt zQf$GEz0u;JKLLz_AIz)&KniS81;~N#Vy-Xf967br9;UK%&NYT-(2KUdl1|J_&~`EgC;r?gnGCqEuatjIr1qCI6w1V8S9FbhB zu0#h!aykB3*{aBa)u_D{@Ouk<0n@w~&6&?q<}tgBv`^lv92itOCRAF(5dX^ME<2+! zILKYrJ-Bj`aO0CdPDVs>(%LB5K$uhAlNq{YkvVi~vMaL1K~~CBSlI?pIWuQ|r!ja} z4d*Y7VVgrYV@)C+*w&T}A`Jvo`1?_q!*&4Bd=8F?gC##L{?gxqy9!ER$rP>PRgvRO z#G5PNGQ(#SLrH9;rkXeJ!T;SebhBI@c827bR^Zc$*_NR5icsg`Dg4N!PSX^NbsM{#u@DEjYlX(zaowtlx#3cH_Vhg87kuWzakt&XM|IAh9tkwNqogR z@g%qMi!yE5<*fY5Anla9>$bRZ-XrBGm8LL zK%R7|bT8LFkSBwlcC~Qrr1>~YA0SH&;_wyKR5m0Dvn1n33Y@8R=QUNQZ229@qN``9 zS^bBUlNaE)%=7MoIoXjYkW%F<M?5TieAq>muSqXbe{wuLNeMqqO6&GX{)_DTx8NvI13~C9 zMe_G{>UZd|K;^gL|1mzlq=b97g}+Af%bs1qXJ&kUNl{^cTjAp!Oa4DBwdi+ce11s@ zSCY~yf0pEb+lJpKKEI?WOMuGnj5j8pG}tdX=9-GFF<0?>#+)v)<^e}joL)x4Z> z!ixWFW29HVn8Vf_>Zn0pbLjd7b zFs|nY3$%`#Q}kO>_{+KeM6P5QGRhOUV2C$xmYk?S!yjfT`ok<=(=atnk6)>$Mc#Ad zHz8QKoGte6C4Dmi7WpmGBP2s+~hB+bo*f?V0z&Vb3G zO^SR`^nV#-j`#FOiYL)oY34;Uk7t z&&VF9kahmA#2Ou?YIKx3qr*SU6X@@E2fB}6;c?mei{4kgMD;=L`HSpufbs0CKTW$o zfAVDe{>&O`_vdY>vPSP{e{Kq-L8>T0hQUG7pCP(}2BsR^nG-mND>LYPpCK_aRjhH4 zPBN3k4vg`PlcT#--ccShXQIz_m|e~mIN29V{Qzs%Wdl_GWoI~Dc3*+rW#%Uj&{d~D z*lAbYL{4)PLb!AKJZ018zNgyL$4ha=@3PgP6~Fh3r_TTw0+tH2;q^Y~nW@GNUfZ89 z;Wkpp_LU-w;^*E@4$Cmek3C^~vh;r?WA#J&KM>(WOh8~@8?X{FJ>n29I7Jium zK_|5x|1a9~Nc^w%^k}-wrpHBAw@niUFwfzIJp(=w1w;x(phGihfzM(of2}sMmI2LX zPR{$mL-Dlx7!nI_JuJnf2#4MLE7&_NpdF5oEljf8MNN8?HlMRgT}3H-d{A&2*;369 z*%4{=1cbcYDJf!FO1`5?mfd8bM(PBnCx_cbWDr-*!e}=y4#y?a@ZhQ`6B&-qd?bKd zAsZG~gCHqYnRDi;_GFSpS>7obc;NL>nelrt?Ggo~bXt;fEHzpE%kCMM-BYN)uk7 zC*h-sfRv+U)69JsyKPcw6|B}}%2(tP{aQ-wRwcBG3v3LP-o1S;vKOpWqu;V$pr_0H zh5bVA7PEpEfya714v9d2^YCD`{GDKa_d8aOxa7$D=7jN4R#Q?+v&KDl@~)oR}PExjbX^m7_vy2`GSvW6SG z`6RTLVv)&HWbrf!rgXO-YcD7;W&NGb??&x1LmW;lh6sfW&L85Byxi+O(RTz94ws_khzKZTK&FM#s}}MCecS!4Q2Tbi9Y$BO`=xg zBUSfCYU9RBDlVePQ&GCzGP_f{{Q-CmJDCaOGke_Jnw>hS)^tiBkZ&7sl*w$6H=hPvv}UKWc7dS1D@^G`rk>MQ zVBD%el?{y1(-9rdd^ajxL!*32$=!NA6S_IYxIQIf zS`zf=>lq*GnPDk`ZfXsq_Rs1!r^rimJ*eO8YrCH5P(Mwx`|ru6?fb7Z*Y3YZ?rO7?wD3{Zz9{b)=vEDk>E_(oZi@C6A_`_OfB`W>h*%aVHD%6Vp$3 z29(nFKcSzV4s*5APZxvfQT5Y8Ricf4Is^=bN0okhq5Yy1u6@(36s1*t#EVFzcKYe~ z3vK=Mm+bbC91g?lo=o)9S4vtlyxjJqziU37MCNN!jFEEP)`%4Sx|G0aYW~pk)D>K1 z2T7&ly6SzS@1jUZZl8Xgk6T16e?u()7)B2H`x!TIRb1IYVkyapDIYrN`Zw=!1(KJi zy!_@pE32@lVs(~pW*!1w*1^vE`!^|zbjASE#$m@(CE6PN9eGD9qq_Cpi>$f4+h3z| zK~$&CVKGoXbc(_uy0Y%iM^xSA>7X=G?B$YfF2*PZKHHq-n7Gv?hY(bCNDZWRGUr>! zmJ6~=`V%4eNoX(8>jV_zG0l7dLCrU%P)ZllALg^{?sqgX>)BCzKDxka&$bTQGXV(Y zLua*a&-eK#?a6oABkATw5NO*T$q{W&BV+($m3cCq!SC{ODA;gzTze!{wdVswXWRDd z8q`61rjUICLv|7s71}mzNFc8M3=ReP|6I16fX|eIVb+nF2!S)jyvcWIbvz~Hj8q9>t)6@8w_RMg@Q4~MNYKJ`)dDKmbUs3ucM(i0`H@Rv z=5j%K5U9r$kW53RG+|IpZ*ZvCfyB(29{5;SW~dy>xXk~c&Pct3=hPb%)x}B`#bpXL zI$Y%V2d0QU{=JMO%l|Pl-k%`$_}58MMQne@?J7qH{tP?4xU+OCa3l^=cAthUQ?=i)DK8P;A%zwXL zMo!teyk}GsJiP8q#URQd_+geBYfij0!L1RVCaYl1t0gO51g-r)%$!M)3az#s(IdF zdP!_sY0kL3MaR(p9z+o>;{kdTm0HdvPO?|-#b6UETGM2VcIjTdm>b_6dN>0)0fwMc zvKV)&BW|H)WziN@76Z{FV;Hw0Y-loi>OS2aX)xcP+NolA9%ZGgWOSQ4`OHVJvgS#L zSG(6GWjq6y{*Fn@nzQ7m`KEMhG$kk=&({C&|Gz0Q?g^52 zNN|_f0!w7)vJcX4EAK;BxiLjDFk8 zuSUdRT~Z^zTr3vrlD^2-#cAh6^!+I*qRwts4K_sc8JtcTc|YFVY!d=IK_Ar~T1*F;=HfDj%vy z$!IIV<2e?VDK)qnLXEt!nUiHd{*kKZQ0yE3Vjz zbjKd;&}Z_siatWGlV*;pcTS!@kJ4W%W>s|LSU)WL6eF{IXofHn<3y{t6V9?(MyvP_ zxNOK-LW!AO?UBKLamLKPD`d=kA^UI`G`9Y`SXftER#55)j?>tDR}<;$*aOu_GXGh| zA|}65SlQ?;OdU#jEmZJxLv!ylddkUDWkc$RvaRe$a^P<{c@_6cmF^8zrNlS02jdr4 z3%#|98(@J`LG$#@Cr|SXcpzMR1ks@DC%T5JtT=geU8_zY+<~+z?F~mT`S~!zekumZA+U}n@R(jj~ZQtQ{Yd$FR8WU64 z>j2|hG%gN#&K#m7_l$lrJKazaHzh>r>C6o~WgmeMJ~lV}l*MY4A19Ae^#1dypm){A zlc%@L=iz=3IG(ut{-2s3CSR%Ae@f0{q)EGrTL*q76vteQ!+nH0B?CCORPjeSMpyCX+ zn;$R(A9H^AfR&RYyE>j9Ztr-0xcS}==7$$YD1JO8^TY1-Cr_J?=&!i>A?YrAelW*B zY45zV1lh6XgJY$)ogdo1v+DA&nDREdeQMR=tOxO*$?7y}b9>QV6ZWc8_8iOJX7Ary z-d9;fCNtjUehDH-1~ML)ojJK2j-A=f=uxwjfxC8YCUs5HS<^RM!kDpFbrqDgz0j6F zi+at2*NWa0w{PbzipAD%Fa`_5p8;;Ny_%%bU`=wZnaGXwsw#t`{#ANPy84n5An`YmpT*SlpQ@ z>(o-cVm)AN)mE!~j+bDPfOAKlulkCHXo~w_vHA9s4X;6}Vwr z%r7P&K=F6i6)y#fD~vL!&O2eDV#3U=8Y!3$JF!W*mv+y7(~KNZ~FL@l%m zVktgYGn!`aWoMpXS$P+bos?JqfK~8yuTlJpF-}sA;^i-F08l7tHq8jsT zur!L7$|r9l+wL?SFog(c1;+E!c#w(Xye<-saT9-Q-L8+mX!5N&xN z(UTAZpn?V?*K96U^sNaDC4)_Q5f19>rnxuKW=A-9A$&|Y?C&Kom2hDEIPzid>z&F6 zf#{C>wp00#eI-QfL_Yk3eir#~gkCU;Pf$KwLu0LGDEY9_f>j~Pg}J%3wS4H$M{9g0 zDSX5KY%d?I1PP2x!;c~#mR!}DeE9w29m$76kq?kQH~I zZpn%#6@^;MinsGy@sh9=+$!>-o01pHPUlL~)&ip~zqK9j$4YOTzwLXRylACA>>i|y z<%Pd|tG&FK)f0|WgImTL^S3J?=V_v&unCT2!td$m3?<}OmSFR<8#^6r7n8|+_Tsh# z3f5+Ym+VQ54ncX(ip1X4_$v*KV?M5_E8bzv$Gg9KvCPM2?b{$f?xWDSRr>9Fbqw6E z`oLT=u7SN;%-i~T=)#&h*Qjyapiq+~frMo@F-O?Fic!}nX*2p2^W(jV#8iES^QY$h z?-B^NhHb#btH@(c2jtonDUQ8~dBzwmccbZ7=W;r7c#(O3B9-uUc;V{dSGiUXzuHwd zJQe2Pp*HB$4NsFdeYi)qXb(@Z;ht&3Rnymc3u%?F_!YBHy5Rkag`#T7mzuqjR{d%1 z?{6jl&l8H^@2lScN!sl1UqWG#+EJN!WnbWnyp1Ca^MUA?iaPcLkPA_u2u0J($?qtt z^m6)q0x;Etz-DwS!r^2fPI0Ib<&_BuR3#aXmpqZ*0Y`$0Ds&Y^U_#S#rb4-uhi3O_ zEiKBP;5EzAJg&M#)y=ECa&L|EuVennvG~WmsSW?k1!5fk^atwk@z2w+u+2Z0ZEnRs z7X$LB{BxO`N=}@Aw)e2$cEmqhq<>rS&r9T1Bu!G5*P{Z_PjHz&sxQNq14zDd3+~(v>ihGX`{q_M((1|6FoLXZ$1QS2`GPX*RvS z=zv~>flFONp79*^tCc#{jQF`UCQi=@jmk3rES$r)(5Q6s--Z|Yu5-JnFM{IGte6fK z?rw`&vdi&D@z7;3x11@{S%P)!QL2(LBap9e2U)Wqw<5yhKy?NS&(8S6Ww*Csb9??6 z1qf+EyY{xUSZx!mMA8aYe}^d~bF97hozo?{{7gE*HvYIBv_U`veycVv>lSTeXYCto zw{Q77?b|nn;vKfHe+TW`ZnkaTZwJKMHxN*2ss!Hg^kJwSv}=IYwtZW=M%yRzXX%Hr z`BUB-;@&%!hc`&;i_M-}+Q`G7060z_w&cRUGM_Fu)_nTwkD-D!pPv7AD|vV>Ade~! z_lWR1ae4R#sfB=F{CD z#pGe?Tdn0`3NVjH9Pz!IVul()1taW)y>B4Pbc%K&!$(=_V)BLJsFRioo{h@dJ_8ITDZQoU3RP>871n@cjyOokr+>jMI##))#+lC zGj)CThmEqF3XMn;*8A?gU0g$0ey*N5D0?MA*1YmPx)wDL{}sE!?M-?k+kWEWvAik@ zcjTW@jGgc}lMD{cc5@pO_e_gDWkD~Z$*3SBT?pke*?(9I{x_Hv4AfVY zabf9oT&_1g(69W^{eheFYRV4{)E=#Iua3mxg*alkQA=eXfUqHhkiG*l}r754AP^PcYDyM`N+g_fwAQOPWj9Ex z%_p(95GY!6uOzw&yR-_zSCL)pB@(PrHZ__hBU~=@m78u16`Sm-nynYF3Kc(9SNw`) z1*mx@N3@nTV?KbzZeK4YUUgC99Iph(X1zhg(-cB~%2rgv+4gWI2DH5x$m)uhh(>Cz zr>n)_mB6_sqlZa~an^eNhCH(K0iR%^G1udt<2BCE=Kq=x{&8OI!H4;wkAA`!jZ1z} z_Qu*niHQ>zaow_+L_k5Km;P?{YGt{u-`$l<)fGP>KjQ3ZwBZtIwrWOLY;~4##9VPEp?az|Ua*G5 z@}WzvXS0r05fWP3Cj5ZVGMAkp&{8dL%H0+%KjF=o_-HWVDIdC2%IOn7(kdbpU0gtR zW9VT1>Z`Ml)E-F)9=Sq$NX#%?yJQUZ57C09l$ItAr~bJ7#>9_8)0*{(kLs5Q5LK9F zRDL!0V(QWxH#UV*=0p2>qo=>$^fSXh1SaYFij7}~QvTh@^PjCfIEHWf225AsQ1M3u zoqAaz0yokEwf}z?R!XsWDB~Aa?E$eCCP6my2>d17a!7!y^CiY5!YxMeBBQtTL8z#U z*S~@L&z<|2*)m#6%w(@Vs!=cf!oQ*HGh^Zt!98AGWhX3^>BfCcNo`>YK(qJPew{d^ zw{(a$Um`!TUr{S6eoQZZ%qV{BN%Lmwt^ zne*Tpr@(>ls7xLe#I#ZPGS=YkvtVd5rz zw4G)~?Xm1KZOq;fy3Z4u))Kx45cE*^PM*{weQ&-oP&s2(-9?KZ-sC>GU)hX&fWXZU|k|Y>h3w#}3kEgf;jT{X#_# zc%IzNH!Uc8qQXx!gB&{q_N3wI?Z=nw{dGxF#zH}=fcc5c1U!F|>Ve<_DfmMQ!XRoe z_JBV8R?Oh$x4C{8bYW`_R|9+fYXTWVrg;qC%>Dj%@BIuxw;Bp^tBGFrL|E=47k;cY zeA!#|xAf6Y!u%o5{_(T&E$FM=!B zIo+h+(rj_OF>a}fq}b0nPe1XQx}qRD6Rck29#Xut>{Fbg8waY|kOE(PeWb;h*u2(> zuM{e7)KfEGmO&@eh~o$xhq0c48(D<<9-LDH0WED^d0UAW@e*Ln+_RE9m{0W4kHw~x zTx&|XAsn4j?iK`;Jiz=cGY4X!?Ibe4`G^t=uQ19M3riV2gz=0^gk_Nz6>H%!TV8NV zN2~ZR-i^yG*`cp|Qi|xRh+eiRZ|$p4w}orC*VV5cuwVBr7S=RU>+~(z@9Bq)Ig7Z_ zm)mGVo;oh|b#Ju?Lfi}!^aM#=C!^Q0;ur4#Y0C|4$+_>@2ww`q_Kad2qMgNy>`5gW zAC9OB6~ATd6H!(K-%v0!h6?o;i@1voAPaqeoqjm*BPxdDjf-XGYqUpaZEZM7Uw3d* zDD^i(67+G81_~MP_2Y1E$Ys)@` zM!}WdArlvsJz=pj7k4Lx(*GgjSf8^fRK(?l6Q5A*OwTS+lJBLPqwG9qQ5-uzrr7zW zC_6uaJHhBJY^)dWR!z+2ipNChvtNn?9K9Rq#8B5qHR+|z`idvj#5;PCx>3EiF?x|P z@v%65_OIc-IyFP+8!Vo-2qKqBqoYg_kiCUTl!P-bqfZSEr=l=~ZgJ$=Sy8zbVxTCA zMwD(JR0wZmCa}2U>`;kYVv+Y2UXdH%6Nzq7aRcoNN*G0%^h2rjMmOUIPxiXdux8qX zN{0wIxGi*Tl_z`?kgW4(^j)J-_Jp5+;lHPN-dY&3TlV4Q!jtti0}}LYQugbXz%7Yq zTh-~?=;|9hp`%+Dy2V{GoBX>1j(I5P;I@@8U5^9$1noJRaoL^bzCNyzQ|% zjlo30{u6o3BSR>rrau`xYU*RsLzs;a8|(Mv&miu&4V6W!uc(F&RZmG6YWfQj29_3!MQ>yC9mOV$+J%@QuL@KmYv+Eyh3`<2US?3#V z>GUbL0y+9FYs3!p-2%!ej4$TLaqGJm!9s0R+|%fWPF39B(W@e^dI$~Mskjpu&v7bi zOvRlsII7;>PaZhd{Gsod>TM+Hjw;kCRNUMSRNS=i7U`RK{T55>(e>LSY9~$S`t8|v z^F9R0Q?B324k;xeEd5M-P%a(oK)>C^XHhGaJc{a;U>4OWXRey$(sZN1M(qlSyB3HVH zpR!sUxbBpwwd-g@cq!`RacHt4%fl6Mn(T;6W18%x{Eky%&+1f(eH8%hHP|J5HCKKQ zc(xjQY2S|3*o*clHFim_n22k;zoEUnYo(t}wM5>415uIp25Xn#953tqpURj#hNiZ2 zzcqgGF?6h{$q3(`uyiRv10_|8j-9zN* zP@Nkkn%ofilPiCE#nic+@1lbp-?#_M#8w{@)3tz~{`tzi(^l2r_br5 zAC0X)AGYLMVpCMUMIt96-@f_Ol5gym`M)mTUa(P}+>w0yW=|{m#va=^`Suti+g^{h zk#E*2G^XYIxjUW}>Frosj6RVM0j@BMayxkx&# zGoXK~R`Kt^=zL9j{|U>u$Luv}m0FW7ve%@eV)ffQ1ugmZlcW=qZ+}1z*gRynqBcx) zuFfRfBSrBN?z_h!;T||~33v4cNVwko=}5wbK8crbuf5Z;g!`mxTM73LUzCJ1Fv_8t z|L^UOZzo@4!nIWG+FlcEjtbX>>^eTSzbNf_wM1onxXdR^OTb$GqEu3hvzl1K{_pyW zYz);R`W73*R{o;Du=;S;&%~GP(G1Gp-d`lmZs#xhrQ7lseF5m>^B0xCY_ga>HU6U0 zsXuP<{V(wsJ$t!5V3otAy}#%!_)A(C?=KQ=K`a=(r4LTPUnJRWe~}ORxAGTBhjipG zlJ6b+i}F*B!(a4$xW-x2t?Ut7%U=4f<1czM3j!S7UzEymrkK8XOn=ei-A`m~e*su^ z;4cyaE%xx|X#OHE>9)T}=%oBbDg0>TFZ$b&E-`3rS?hsi{3))wlgc@FIxS+T4-P4iRzt>N%5%uqBTnUY$$9I0jc~& zKL*fZ8PUh`7mXbr)oE;hkt)@Rzew>i{vsDd?A%|Zgw%2Ri&Slx)mH6BqPO=K$)Jn( z7ybGQHE=ui7gYkrbR{0sU$n#0*B?w=?QB69A_zEE2$9RSzbJkZx#lwD%VYYo1zvQ5PHGIDgUj_u@75qx*{l?ZwiY#E}6v z89)~L|8jqkVw2F>DxMQ=!v4*W&EcEoGm z#T@@_C)n{9{g}z9wQXTMUmW4iv%UQ^rvElu!s@5VQDL=kJA*jhUlcE;p5JLnDa&6Z z6I|!2?!V4o6tC*uV`JFfU-XY{F@0D3MQYf!+8=cy{vv6+rSDq)A{m%b75AwAq94<% zr^a7&@mF1rrQV);f6-eP+ry$0{q{5XN17M!FOs2kO7z<}f05FzI`9|C_wcd(MOU&k zIDUW8)`ZsnqL;rw0aX5?_s(*Ld#C=Q<~V=R2A8E{AJtzJ*&5TaZ=+`PZM7$>9`8?EQe>;EC z@#<^uTyoO-n(WwZ?=LzjeQlwD?EUTawN02I7t5eGj-js!;~mvsbSscf%wMEc%m%2~ zQw4#O)Y-qE?k1)0wca;WW|{`GO=}JBKE6aXy!QHCEC118OWyt9^r*c1^Ts%N z*XxAj-O_qX-hKIhU*6qrqk4Hv-u;chG7vIm^;G;X@-EJQ)JEP}tJ0X(e=`0f@sOXG z|L7RPF6uurb5B~>{o~XNJ9Xi}NeH`l81nd!jw0@&{-c%05_fXZ+_&)`%|2my*RlVo zb9t8&IYD^`3%B(k#reqFO1yvM#7n%~x7YTb@a*T6N!nq?^wp*IAXcy6-@80NRRwwgG~nBCE_rEdTi3D91IH zvq9Xt?|_q>S#}Pro2dl;NHhO-0A;%4yN#cF1FPowpGAoajfK8esJ4)&vVfVsje;FF z-%PbbpN)RX4va>yF%B6#s-~QV$9v0^qm0IbsfIu+9FNkT^DeFs^`TBLer9n7zp|VB zwGzhbA-Ru^gGxs4a=y;&6aK4=Y2t%TTslNT%s!(97xRTZxR7Wd4`U8T5A2X~M!FRP zuD@}Xf^NOm?(qayBnLle3VE)k3SG8Rsbg5?vQOZ!vZYpC+|l}^lnSNfy7%jn>z9RKgRh z69mQHP>J_}ugl3jb5^iMvtq#6;r8szoOfCqXfWLFbyi#S-qKb*u~j4-L;7?%6PC;D zjyynTqWPu^PLT+8#Y@5*f@m=tKb3)M6IQ86x2}allLR0|af%4B)Gr&@t)k3~^G3>J z`U@8T2lp0mZn1A4_p1hL-FiRw0r!6Yp|S&^ao=dqy_?8A>~+#M z?szUx(WB#H{;EjSRzTj=Xwc(jDsQ?R!(?=+c*dT6YOwC${iNe-=iaZjvYu4@)cpNj zh>7Zwb5mMniKxKVerXlXl!KVz5oZt`nDLE~lQHgX)M^tXERHcOBQ82lmD~rzC*khX z!HR;dQk{6cc9#BR(MMzk<+=#FM~Su11>>n?pi498PLK2j-6_|>XVRto^qQwpki(v* zYt>`BwCH1ikUIWW0$~wPdqk#ilJmjFryU%C08ioh!YqZS9Yzaw5(Ip8oIQl9!_-M4 zBCY4tS(iNLtrffk7m<~f1pm)l8*FiFzpfQdxi(XUgFHUEZqXIf}$VSi);O z?@14kKXg?(BBO5DM-n}!ZkQ>Qs~fi0dNf*(FRVwC^=Oudxp-TWi=Ob+C9WZyiH({* zA|pt|i|8zP67Ywe2>dh~fAj9`)*Uh!ro1KPSjL!?50)8(@>a|u~KC~te@bX&gMp?hxQJh*=sC%1~FZ_R!JMEdZf%I#$t zsvq;V-=P;X$kP>@O0@pyc~xy$(QQZCrrK?jhjYF?R=Zz+llo7y>$mFeD|ItCv}K;# z1c(1BvvJrRUn#{JPqlp5prg&?jOeiOJSFl$I-DzF zuFuex)i^R@K)@2rQ5jJ)y}gWx$p;1EoYo-TrNrMvkl&#u2_+@8W!GokAqUR>DWWG; zq^ZaJO9vSh7qyZf^T>t#h{LgrFReyZ{P>n=AtxX|{_R~yet2&r%-0Bu_pR|1l^`bp z-+dzRMSiGgCxf)h=ZVt8;y?DFRYaCuStpH*E;tk$v@A|e`S1rNeSQXIljE4gab&jWkqgs3qtWzab9fu}>m-FhX1xh3?V+;JV;-Dvh+afHAp zp_in@^Zkf@a%Pa=Chr}1S{6;qy4=Cqr+Q?}c zdh#}v4?Z8DDjo|@vEoX6mI*W<8XQ=AbcK5ZJH(4J(^!m5&{IUXq?q2nAS_uPzXe>NM8JqnZT6H^tgP~Z_Y&!mXQK$>kBf)+A_zLQI}m?H3G-I| zI3R`#i2vlxxtueV-x;j7CyF8a3axt-I(voVp?f>P_bh-pHJVLRZa8ScR-FvdmGm z`7H?+?w(A!?8>5mhkM3AD+jc~a%qqG1L}5=GkeSDA<_ZreoSTa|0$!W&LzW7FxowU zt8(Ch(i~(xZAqjz7{PJ*hpGHB+$4X-IadD3cK-T*s{AZ|vse@4vU1HghNnU9G_Bgh zg;!bJz$g0f@Jz$&-#TL`0d%T|`wHBFPw&ksNSyhVadjqfDEk|31d5C>!A01jrNkTD znNtk4(>73x4cN3f3gtp^rMEE&JO4 z&Ar+k{`%>A+}l|_s{7-Nky*976Q%eKg4&H)`p8Un{N9-iyXBw&7jBZ@h zmoVO51xrrrpVR&vV_3RDTgGMOVBDOG!LCG^`0>ckqDzy7~BK z(7u+%>rEcrRr`K|Ug9zOAigEWdXavm#I6Z`>Lx%FME`kUfF9O&>MIWJbk5_rw_%pi zQ_nB^N_!4tjJv_!HHRfKv5%2pcoVzm-GZxfl--46Ji;GZ#Y@n`>YzXKD~7WjS;z{A z1ZiQCX?dT*>gi-t_X`-eX1XI5`}9-voh7lQAb+oV_@_nxnMZF@{PVh!1>bCoqcu#zs0VMI@Fh{Gri z{&w&QQm8#XKW(tX)|IB8FohF??(~ImYTt^jLsHA$ymlrTCPRP8LJUN)3 z$BKsW`b$c(rj^eUt{1_e*BOOg<2K>@vyGdw5E-eV8(Q-|O-|EG6#r9CuFOBua$Q=E z0Xc6|-dg?2bZyyfUSpoeS%1ZihyDH|Guw>^U>b#44!n@3oRC-o^d%4P0HA;TB7y;PA&6#STAP@uD1=4V>pPw?Cw2F01tbH22JBUQw6B zQrT22Mv70Ks~A`>irwM%Tys)y-mjiJ1xreQZOM(G?T$8FJBG*~cpT7;of# zyFYb|t_^R4o9ee5N#>qL>&?eajaDQC#K=@&oI^{bQ8Epi`(ZiR`}K1{LY4N3ysUAP z!y2yXmE?1Ycq~%Jur#(MsZ+$T ziU=C*>Y5i!e!E=m{=K+rOod}o5FWv-Zn~n;rDpvZIVNL zuJ8aTp*Ki%8@L~rr{bAljgnNKz5px{#=>92a`eRTEo6t>`EPYYa47Nt_j zgdrHuP{qL~y)0jfi;t!a;y(oO@YOAfq?rbQ%l??RDY8k*MAl0S1(rE7rmMW#W?mD@?k&?+PxkA8@{3Ki06G6mxQ zRhFAv3Aq}81dxbZZ;e}1(a?>Y1;%wg?YW3<8uz4x0wIr#Ed3y1ck|tEyWcb}<(~8G zeGeSrLI#)i$fbbwuhAZqJqUxwX69tCxqJI$?YVkls0C%80)r{t7~|!UJH+!J+CzqX zL*NV0yiJLxN&N?Bq#AuuaAZ=>WHQz&&J(P+@zXfH><~SaLr>+XVlHlp2i?SxO6$nR z_vo|qEb;7bb1J-++=*C6dQ#0``YluUvXpWAj1fMIU5HXsDe<|0m0`Gs(5Hb(;F#Yi z0RR=wwoYUux*G+M1)!0m?vXyW{zqAH^-!J+XXv@A)9A3-{~ev0SYx8tIrlF~vlZ@g zw{YaQ2X}F;U!(g{$Y+Jwlv6o6TQ8i>dV`)1-@-?0KUREFi6n6?kT9Q+Eho&W4KaI- zk}pL9f<%Ev1jhqQV8@>zKOIiAp0TxKbiHf*Bt@3IM8(Y8RR3Y(*#{4VQgw&ERFlRE zFH}&aRS1(wMaK72LODuTr6WQ`ET7g8q%$@9;5Keyv`6NZ5)-I$1YK$*TU)%Zk>9dL zPF)~;=kv4V)gD|AOupFb5lg>FuH0n5U+L2-#W9(9kx>l6SsRaYR+d6#)+2gOrs;hh z`7O)w&?qmHYBR3f^AhCa-%>;yo$B^WDK>mpidbFuG2Uu1Clz%4dT~DdfHv$K-CLIB`VvpbvI15Uo>+AHb z2e-N#l*Q3&87b1-GMq`YJ4MwN<|K>Y#W+nj`v`9QU~L|C1lw#U{6^VSlG8*6$#K7g zNY5y}vbTjsdZ?{()7&-@r^wk^=p{@~BPce8vb`&?F|F^iAb z${5aIVh&rO3|y^EJlNxgd1BeC$m}t$$4cWN>~K%)4?ceCB~5%I*zi6=X6n~_;u_)j zcXN!1atjs&E0p7Z2~0fs`nJ%B=HN;qMCubgG>e(1hXK!d^inTPDmy@BMNCcZ7@t%P zn&?_C>m-@4h)WtO*eR^X3a_Y1FTj3B8;o%>PSX7wwF+@35EQpwI?vvpnMj4f)gFCh zGt1q5Ay&DhWpAwwCxlW$0y&iKb+1E26_L?6O~0mj$T&|R&6!_~Zc?5Aw(5IXBb9-+ zPgj1zbn}}U>K8tMznf^4UhIt_udj^!(WbX;q*z#Mkvz6RD0r7Ap4?(j#qH@auqm>b zm9xu2y1quDo)8@7VVj7xvmq)knGrl7W6H*Ib}88DF&SnJRrak2+3f8faovl*-%98# zJ&s>`($?Ur^rQ2O;@%X+F%qcybfU*j6C0mi+Ne)c@u>+;JszI9)nXcJzQ>vfmwD-h zLYThDKI0k~uCEMDX`*!Y0l2dEaAM{5K&nW#ah~9(Y$5aM<5G!KTeg=0iahJ0-w1&m zQ=rxVgWUQXL@VWZ`3IPUm&F zm?zR5dI-E*n)G{{3E>){-690jgR8xq$2Ai}v+KOrth^$uAAePGm`^N^iHRVM(InPL zK|ud3qDMPC%5TbMd^YWqE^Eba-uV8P-Eyg|87@&V+;op|W)w;KE2y?qd0Y;|jc^!F zc3Q>YAB&%kl^(}$i~sTeIeuG6lm3tM+n`rYg5RE{@c+B`&5}P;QA;N=#fVxNUDCPa zI5XSoYDTnM(jhU@%;!177(JzX5IO3EolVDZr|vCqRzY=(tku|K7&h%I3$%&{MZfDI zG3pmf$a>?M%yN-G>-0J`=QF{dPf+KkQ2u=5>>-0@^bN}@qDo&W6Z{{HGyLak4_?F< zy+Q69V7sbV>QYgYD;@?6>UP?YCoG6e_xJvc8#F4^Yu={2YbGB&5NtYk<{eR776>jB zmubEhq3ula3Oyv$XO@;44109-i7BvMBZu3KywtK_XZ%0xy$^g-)%ic3v=ItKZ`JCG zR;?NpM%7l?)=i>r_BRYyn%) zsRf+!M-ZKx$$}1~0s_+C`+d&6$-PNh3bK8Euh;kEOPYJnJ%68n=Q+=L&U2_IpvveS zhH9K#MA3_MV-eXs0K6B?zp}JcqX0%GsnA(UUk7#06$4?8VF%d+ke5e{UI4S^~U-4?zaa}%@Ked`Ht6$qM02`3pTA7`a(VFW&~g-@mGFx}M) zCS)QQ)F$oH@Xtl%d<~Cs!47i*`Vj7hKe72t-2Ve6M825+#!lUTquUTL=6Ip1$IeIO zpnEZ<{5L92!IZ*lB76y`geH=nXkKRouUD|5^wlG-*tn7ObLyQ4U#3)@p-Uqad5`$0~o&_;3nG0fsOHNyO#HaW(6@M^f z!;ynTlnWy2O42z8djdK+*Fn1_WPmFHVvcg*BZ3#R;b3P<#(LY258*>^B(Aqno}0?B zP`T4^chIUMeV4oQSyY}?>|2)JmWC6Wyhf-i=`VeX;um^M{J!0EwB}MbsqiF6vu$Nr zLW`zSi@ipe}5NW4}c_7 zO&2Fm{BY~A>f`b8=M|w*@1@AyOWnn;4>WZh(tzDpu|Ml*F6PZJn76YE8Zhh};xL~D zGGhf^N0Ka1mJ$6Z#+-P-hYUA51YE&QJ5*9_Uzuq(p@{Q6!eas}!VI3;smcUm5X~n1 z(ycluadp(R;FcQCm$?529f1q`u!FEn6(3|LG$WU?r2I>7*w;Hi z`1-5+{huFNWY@YVCHuAF>;aiqz_InGa76Gor(r!?m8n&2SF4=bD5qMUfn8MnfKA(W zvdwL+YKxd9KoYc%$lSYB91^N>Mn4SSwah}I<=Pca^&dEMqQRz-nWl}@>s;HmU4TWP z#iU@%@%wjR^qFeu7l>+r!#voYopQeB`NF>{O&jJ!7x4}KyEaAt&>Yxn*-znpH|rLI z^j2eRn!T;eiQfBn+V$=quKf(nC!k;Y1r{R?B4IlAH&4fu0}{h!URgR^K)-Q$f?jIa zyd)G=pA%34fMf7Oi^ll+6Sd_S;zpvmDogX_s-90YPd12H#T^Qs4>b=~$zO!uxLF^C zR=(X^pyBF}E$U_J5XZFJ3L5MO+_=eUz91uY2uDYXyr}{-X{^VJs=n}Esd+ZaPWf^* z-xn%ctNMfpL;JoQ&G#XIsruk1kQ3`^Y(DfKIOO|7^AJJt(Z^xWK*vfqvWK9xv&?<_ zJ^H2&$%w%HJU$&^yzdC-MuAbM=EHIn!_9PW!`Qs%Xu~C_w5l&uUzS?oRB^Lcac-;| zh_~OL;0V7u&IEOZv?%8)!E4cD&QvRzJ_6a0z1u(st}pX{oq@ecC6FV>6uYn+ zlG26Dl%je3MFYKfIms&Z?R8QAKkP7ye{QcC?K&CE21^|r3;qIOH<||4lYmTI#&ITo zbo-EOk@9_vu$sGIX+Wu7=)HO+%jc)&fAnvPZi!S6l@QGn& z3FQuhkx&}si2RN7yTCW^&v|GikD#e7IJK*A?LJ7PN6&7hVc)>vXs-V7Tg+8>J64zx)Fb88oj%wzR zdog|Hi?=51*4Xgpa{d`$hb;zKY|0fYF|2%)2;j}XhBR3ST=dljJE5hAysMm;4SPXg zxuPD@7j`fLxU-mJ8-bIapa5KRgLidj0J_{yNhw}e9-LQ#KgP5FfI|s%L#O={p>^Vq zD}!nPXlkRZ!=>HLNqGeOg5NUzceMUHhQHXjnCKd-Efig35SxrWE1}3@86s9%*peaB zpxOL%2`3zBQQSL~ha3Bia1BrbcK{^*&(nM-`j@+^QQsjYP|2jfe-9YCLS7u=y5b-> zjTR!f{A#brEi4IUVQ%q4e}6^nSs_D)4qoKX1OnPd;&f7u+JqyGV@TyauFFuv{_O|+ z`_ffQLd4dYQ4p zi_Z_iJ?d`tU&{TYW^{NS{jvRr(r28sw~77r-i<-`1rw)vZ{zSuK#A>RCoNsltXopB z66j3|+lZ;QR*Z}To_7XnZtjXYZOuc)bb>LG$nB9im{N`TO5KT4l!PCuy8x32LejPo zO!u!s!M${_vUyK1`Xu44h6Q|OxtUj;y%qUqJQQmRAQIrPiO(#Qb8UUN1ElP=fh?zsYMN?;Sxf?vhyMVa?5y1`CBI#gpM_LVx2 z*&ikFA@Zx+BDEZhjL*%iqg`dt61rlS#(Ngl9jBu_acEa}diz4`^p9k*HzL2fGx`;s zl`j{7I0vEz4+Crz4$oqqtmU`<6jhNoBs}C^up!OP__-md16jzf6Dg{=%%%>_h}@@l z9yE5hvu3R8vN+Ht;uGL+@VF>~$qlJGc|?Zexz_lu1pa{0L#U9t(F{c@BwZdBn)Jq9 zD7hV{93W=IH_X3Ct!B0yEDLgRCKWp!s{ot4$jNN`mGki}*1i%b0Sxtu^*V6%m*ghE z+KET*PvVj40PQCRBdQcCqW-tlm66i{S}O*-k($!bB$BDMzzD!i?r#9ENIJf$-}t}5 zN+o?}cmF@TsNY5gAnR+STG(!EHrNNS_@7N!@ISG?iUYPekY9a^a7`<&gF^<0e+b>a zLSI?sjNTH{-?TILtV;8aP_d_!LCL~pUHRJ80l!j_ZTL_ z@oyC(@wMZC%-zo+C;@60sW&l|Yi6dNV5Ht@&b!}8oxxNdv0&aTG%0GRVJfMJsoRaz z`^$h|T-mc2mf9^(5)lsWzSZo>udF>ehdtTL{prDu=+l@l z*plz}%t-_gG&*4v6N>N2oN|#Q_(Sw8Sjou|Wv;W9+0HVL=w$|Rm;zEJ?E9_)>vL@9 zv72QMm_9JT>V7}Q*%DKgL>B$Albqh{^kRG`^0!PMaaEUW}}i-$Dt3A0x7BU#_UcnS{JOsE1mMfBQ4pnQ!4a8lsLzy{ zwS;dIDAWrK6D>JW2Ce)Ig&eLsP$tY>0VJxsSei6MhV3C%!>roj%4M$ZdM+l6Wx{u$ zEEF@3D{k*Vrk&_K#_T*K`ii$2UmyygNHuCM&Xzug`v< zd`Kp&lq9dO0APKf=<-=c%US#;T(_>m@>dDqUS`^PFG8)zwhx80Yq4x_z*a5c>0x`@ zksgC537YVH<2zaxBs{NSuGeKQZAi96-)JNzqVG8Ya~*xEED*VuGEtS%ja-ze0!| z#CtZwljZ=&A6-6{H)a|HdX>lcUL4#a8exPR-BBV5{<{*Bf9_u#l>_)SMGz)h#{ zYcut4#9{k)3H$fwCllcZ1$fpDS~W1awcv;Bt1L-3^eZe3h2KyA^JL&Gb*uK1?KmhL zHT)0Xwku0KHf06f&DuVKF7%ZA{$S&hH$anl2 zx>5zF^e5}!h>q2YZqmt6qnr(I#oj8W@SLWSzWHLVydD!6n*>Am&y{?ObDijN|6K1L zu4AtO6V6)AAqji2!=@}5Z09)Yki>B`;5StELG}I&<-T8l9hDVffEkuI&_y^S@9ct>a2ccoWS!1E4oTsYP=v_f#IQS(6|V-6 zWh0-9%#O&F=#N}W@~_-Kac23)gxiF#}4llh3lUtDuwoo{; zR`;{{x~OwFQTkWAZn#lyf?4#-=2@IZ@V~8TmY98^&rRS8jQ!`ZCYyB$Oy?`abe@U* zOS}xkK}DGMp*ePkLuP1J+o3~;_O3g7&3V=M&-*VGSHNdJUtJ9nENKi4Pg6?P*&6(t z(|d2W|BlT5EBpzMwawug2@N5C;8Ttl?t;4t z+QKh_H3`mLp&K($M5BW7CsBZGg)ar`Wrf(#@SPmJoc5q*yMI-#dj&I0xd_W+Ud?Ww z8V;=I1djO{8NyRrQSYi;R3J0Hj?A{H>%&T3TU*l{&aLcWt?XexG>DwhMylNc@zj4a zrkX(qxw0w-I=pm2nQICf{A=63c|l#Xw*|eh&mmAEyL4{a2aSycr7!OM9NJEJ2S`|m zSzZu{up@NGZiIWF1JSuw35$tozmumxz5PaE*>-(~`{xd?gQ2c88n1d_ALbhkJ=K1m z;U42q=C5+UgGJrh8<`_!-zjLYm@jHIyQy;YU|Grc@7--m!u}&qWBA<@EP)6>Bi84Lm^TosnJc2s^!Qu&;O@@UEIZccl)l*!qrrw?1%n-Y0@70_<>%Hnk?+;V>Uh!uLM*c=jZI z!J?iMi^Di*VAP+kSCO)QlZUWgzmdJ&`df6i{ZH3FN;^?-8%2tH!=xVCpw^IMkb9N# zaDxb{7x#b3<(zRGlmN0f&<+uf6udaXh_eo&M4UqzB{ELka(xI>agOH3$}lVVl{U21 zOADA&5SCE5oVXm;j&)eJG6a9HJGL}us5c9NE53oeuPi#vyUD*Y4W~qWyMqnb!}Pwb zwnR4>ZJ=57B@_FFWvwc>1dcyI5F_h4!qwzVcFP&}=^3SU6D=!CDMPPm#Tk32aQV^g zd!a#X=!%nFaYj$5tVM&BMPsi?^KMpK7&PzS?fM4^`26GiBZiOY4&BBbP)KqCCE>b` zI0mI!H|>sA)#-9aCl56AYt7*zgq&l%=TsJ*;JsAcr+yPv;_KPUqVC=^39m5V#o&9< zNq-eB_*Xj&Xs>qYasFT??+AY5Qos-MgR<0vvjQ1wBbhLfs%xzC3wIt)T!u;TtUiNU zq1WaXfl?-Q@xy6eY@qi7lEN3jyGuu40)0Ju-qFHO>rDcqPN$US@rM1N64$1_4Cr2Vl@1e~%P?M?`-P z__wrFx^o8lJ`tqv+a-EoCcy;w-R3%C_({_12`=KnLLQRJ)$VEqYrDgfuMylh*n2*p z1$sNvn@?z2>8+>tbO|)jTa3nH`Um1mxZj@AP0MnDtp`PyB8wb@4$32iAI`&^C>Y)g zJI3%<_nOJ4vEoYiZg2N!R%I=qH3+UUXm!n`-Fi!L?w9dWSwXHW+zrBxvZ$m7QFS;iaZ584f%XfRS_{*tmo#(a=aUid$DLkD_6 zOu4k5x4Jh@y{h*r_XcI?X6(701y{C^W1zPeyTWdUvQDQ=Q^7Ur*$`)|v%$Och}7kk zvebr(aw~D1$@s(#PZSrHvuPL#Ms(1Q5uL~pCF*|(^mE=hM@2uG5LIv!!El0md^v9T zb_&o_iuUra&NNsN>sR+S@nveH_ikpJ`WXfZ(xArED^z9=4dL{{k-I|9YY@o^1CL^P zVh4%2w@tmd(tXDvaJ2f7FY0!>(56G(>wOFkB9Hj{yKL%5-VZCWA=$lP4}j*xyyJ>G z{Y`1ukyHWho~k@38m_`({E7J!=;hn9j+kC_ z_;9}K2Jql?UMr5`=1%Dj(V!DbAG{Y~39Pn|ww0j}O>j1wzbe#spt=J zTikoqZ=exG16zD=L0CPsD%gft(S`5&HbbMy#mc>}E82teA>?}0?tN5QT2Se}#QT-j z*M%BHO}^LAvgnoGycoFtrz8B+iyz;Auzun0K)--nY}nZ$J`?b*;}ha7lr>zy@<5J~~<6?6; zL6%4_iSjdko|R7A#o9E^G~pM{02v*^?JdBxGDI8--Q&H&y}|1N-XCg&v&wt;QNx96 zpxhj=_iXTQr-tL#4=0+|yXr1wX?mqQ&4 zzqEtKs4*T;E`l-U z-OyW%C{xGBTV`rCkLUQr@c{pHN8pT{i=ntEjasJO(tBmdIncdX8M*<9y|hcU8LjU9 z>H%d4C+U3mE^l6Ntq>W$6Xg6Rrex5Ax=~qrCWJUB1`-ET5A^V_kVS3jy^mz$)O)y= z6BK%x1o6AlED$&7$&G##qmv9;KSH~%6$-`fTt{&vvg--%*CNAetMbtM^*>A@4}a%a!o*`x}1LkKy`upm4Ld zr~gnAm1W6zekh2p#LjaoOE0T*7h$wO3`UDn=NK&latKk1*!z;c-T>~M#%`V&A651) zbklNz?2{mIGrq;`7G>y4v$jZirWNlq$zQRwF}$C;|ImOH}dq9-sve~L=tt4pbGleMhtb0WqOzQ>q9O=sX^>!T%| zSf4v9Yy0KcsR?`{SLeITOCy2j1bCHW$2CSAowHxW^c60TgfBJJ%>oF(yIb8`r_hy} za5#(f1(M5Gp{f4}t-!`{D%amzr*0KB04}9?ursW<2evyY%BOpj#M z4Twbo7+UBFYC5X4&}c{Si`g$s@H-;<66^269J_C;Tz-Een>I^`1o(Z6uz^QNU*yL; zt*6ixs54Ms7z`x@)#Oa-5xod|YDHf7Mx3W}+@%J`y@a+Tgz{9XBs`)}3*p;o_@tsQ zsSn{~1p1Sy-P`KkHyHtsbJEmZP(HdwPb|zylgsOUlUj|2%uZG5 z5wPd_x`f(~L_X!U`)}e4*4O`HHnF}gHUa|wOjt{EEutddkGF*N%DvsYuSkl*J_rh2>SP?sq12$I65=4XCg8 zI%P!zE(gQWINgd9o{!4ZmA${gQr5FMo-?LT{4cGS|E3%<{slzkq)i*ToV0Ihb#I%J zO1}2q&10&{P)^rQ+B?O34fz_v6osh@V%DL8;QOK@5FXpXow4a!%=iCI`HJ})(zV0+ z`)Jp{(3=E`3AoOzcl$=@M&8bP_aD$74VHg*kA>wE`8`n{N&TJMAJnyOYK8C)w;bQr z=H7_Y1{;+jO#&fe&O=n5@MHJ{k}X*Uya=w2M}mk{7L(BizBqksJHU=|&y(I@Q9sEqQ;h0wU=Ba&qZ%}u+4=6)F zbz>>~uDwN$1j3~k#)d&T!ZYJd(xwRCG-2!1trF%I&of%Iw1-n~vMo1j?Y#jF4c&&> z;#aM#-o0Dhs|-0H8isOmWsD@+OS-uq$b!XgcS+#6Jcf2ILsmHprL_c7f&RLERfW9IaLnE;=9Z_tTDiu|m0 zA$}gZ!^IDE2CnJNu;~`p{^IsSgJ0tFcL(b!&V7OgR_u-;Ha7pEpGUHuqN>{AdJ3CJ zrXA^J)2#cuV!lUwuQY8;re>dYpy7F(Rmar88}BI3NIL7ui*XoJ=wt#1788c-kqo^Smg+po{ZX`qo=v-a1isH(TvvZe`_&Ng9XCSwfXW0sEUfpoN`~ zUT!$4+ceS}GV96{Fc=FHl^GkLr&vd+t&|A6s| zaRQ#%v-aoyPZB(ZyVaj9-o~3El#Q+Y!9kj6woQz$Y&b9|NWa z0NbfgfT%V_eeL8ILmrnRzijWMSO={5$(*%6pQLN0M?pL%Csd~Ee}|(-!mrnW77dkl zz%Se5-w($xEpwClCxAT}Cy~s+?qvVkfu9(1ZbFp;e}Z3Zq1bp*@=GSa9~*wjWmQ&u z2x9Pm`UA#m;+L}I`UUZvdvx_neyKK%zw`W3zs)+NAIdM|QqJMa@j z-ua2O$~eE|vlEj4^DW|2%s&|eiuqme%hF;iy#W4NabZkcN%`3~{%##F=9jYM@%G|) zR}HXsu9Nt%){pt6I=TK_)_?2K)i3#_-ZcI!3xL{zw?N^}{?;MI_{B8;l70zOe&c`b z)F(hxm!iIQ@{1wglOn%tFDs!vL*8J1sl7jm9tH8dyxBUKPU1)MOa22f`bxlegx>Cx3M`DMFl{GI2Q2Df!c0^SMw>XGovJt^vI2j61I#VPV1mR}lv zn?#R-c>Et*2h&OXgp&MOaZ20Utzuz$n37Sd7e2Gx?18TV)H2z|ShWl>a*;AlEz7p{h{>Wq z*?N6BsoQ&iaUNur2Y6mkZ}owN;#oBOK%ICNZ9njgcoxk+ut+?M9z3vEJi`ekLwkVE z>1tVycz#7Z=ZfcL;u%}R$itI9xPwbPH;Csv%K(h?Z!jn@ZeJ|MV)Z5RjNXpl!G#_n zGkE+%WvoR^HOsC*)Ibax)fq1I;lCch86m7)OI(@ZIy{Fa*pWpZ;lqyGLY>)$6B?M*b=yT@qHYqU4bXm2{&6R58y zM0HXLh-XPEBD6@EBo#*8F-V0+zSS}-sR*955D!vf@c2J|{EzZut!{;ApXiMS}ovwci|9)1e{Wg#f#wjGE( z6Y{K9A?fUh2=v;rzu;ikb$Q_Kl`4+^crxJWQ0(NzIG$y^#YgoZzLH*GBLYEbo`$vH z`PhCqr0fL9hGx$ioN=^;-y8=-mS!Nn9Nuu7ZOhHrc_?Oh7sQ<7*?U`4aV8$KWD3tW z;Vno0=CeL5-rg_#twQ$0t$=jcQeysGsXb6es@$B_0)a4wg z3`gH=Z7upkxce{hQRaIB`J!Lq13MbN1_UQRAcY+Wzct8mHi`l=1wQtb2z*@ecmh6t zh0?DrCq9~g+$nqvLxB|dScJ}@M*<%g-qgibu(n{mju6}{dp^-)+kV7&sZ`5cP1VnE zm$)(+4zd7=URa0c?l(egUyc7ZPgExiWD(UJlm zC6Yh7)+ONMvtr=mm6w2zpY`q(K9-?C3Vf89@bOp$hZN_J3Ad)=kEY@iLH{Rp$S2L< z6INW@Oa6d`$vpY^SAc();NPYA*BAeOf`327zn|gX;3Vw5^XOr)_x$Nr?48g#>`kIf zZ;z>7z0*KacsTOKv3HO-w_xwi%j4Kf$xrzbf6Y%O;O}e{d~F%=H}!%};cwq%hsEF4 z8?5-7_P>w6*PlBK{vth(3V(lr=x7&z-%c>l6#gINi{r09l?V&|{y5+;`1?Z2L+$AV z{N0R#uPrD3mY&xs{1u`=3jP~SHqqtb8P_Mu!z>{WYf|D7GVi43;uMoqO6F?@^9deI zeg^&${dswQpXc_)Vh(?nO|zcI*703#Jx_l~o~Lj6 z15jT6VW?c3r-vT@f*Tktt=Fz`YFA|7jy61Ex3aFX>24+X0C*$h*_~i0z>+<7*1ql! zFdUM+CBV?VGk$^-^CBwYad`9Zb117KaT1=MCkKXxzJ-RjvO~3t z(`?tE!+1ssWJCO+pBaRs6NoktMibiSGE>{{3-m6`H?VuI*k6N`o6~U-E{aKh5U_qkwu63 zUSs->6)<8Nx`#Ww$H5U$#N*8nH(lsXsfNE4k9K%nxwy=G)_&n5awA=M;`k{5h z-r869$7oX5i5$LdMVI0eo9-u^qBte*x+F}Z*jkSw8lYT;$tmw-CB|_X0 z4RM=hOlaQqRGLkzs8`dub{~_)i27WfYGqFMhN(9rF;x1ER-9>wfShL$r`7|3M2?ri zO2k5O^h>Bl+>#4m;y4c6-^ZEd-OakZ`w+JYK}2X32WbWXz2f?e(r@(I)y?7M&m`5) z<#f2UKCympogpa)Qc^wvIpmKxIp{Fw0YtQ!3;$0Hz~4Xz1KC$DI>U=l7rsaCh)FU8 zEy1!Mg6T{y?7Q+$8dvwNaoPJaDjmt5XUMUmt?&~_O9*dr@Di)Q>kwZ<1`2!?zYxRM zpHaMHeBEF>B7BWVPlBhwmp3yJo~iNWLWerS*N(KL`USqSlIm|CUkkc)jITAyQQ+%V zRGNsdtC5y~uMq`Sd@bv1oqv|)W70QCkPh*gFY%dKAH(O?{KMfh`nVaNxpDr>HuGPO z!G8;%OoF$-=Z8=YI>UdX(IG27b1eMVKe>K^Pj6EF?c;L-c-X>!JQQT&zh0>8i23hQ zRGNs-vyhg6&*>Li@tLR}bcnxyO8m9F6vN*csIFsveD|Q;BtH*}zvXTAl=AZnM8NJ0 z{^noQG5*FT*DvrFNUFbm{AEC9bcDY`)OE!8+WzE;UzVBwvJL*r0lTK0|NhuH{C$|0h`($L|1EzkseU>CJ)c;A`}hmj zCEzd5%72Sc*Ae6IWmKAozbBBEfWL!%67gsCH|~)C=1Bf4do_l?$536z_`C8uGyfeH zfBnI(sqixk%!{654hr?g=VKe__$N4YQ%zs%1|1JD|5`W0~4-{qvZQgSk6H^I1&XflK zZZzcyXKxHZukFO-JT@u}k`~mQ)I<3b5%g+HJ(k(%~1~sJF0egmt|$N`pZaM|rMqwQupBY2UEy?ZQx@gmJty|x_TUm;D z_pmMtmjoE+`hT)^)7n>@l_-$6sbSMZSKg=7UAg$Z2!PH-YBp{MZut~3Vj8!f)Vsyr zxGl16ZDKYwZC``Nf%c8Z?L;e^wnyhmup8%zdFxz8*E^JE#PNYy%ie&h9pN*73uBTv ze{LYj$Zw0~H{wP*!aHjdbI0RXq^^HOQi+c0uT9D=>IXb?jo#qbLDvsVnBkj|9izy= zcb7T+3cVT;|LaKbwG(rP8DFnpY5$+cS3O#Z<4eS^X2czapu+i2_kl@gioni#d?Inb zH4dTI491ynhx-78dKYEI$?7hxn4V4p#=X^aw|6tn=f$)5w)zoYM?}}juwB64( zd2;NeA|?qpP=wXGdL6Ii_B!w_ZPscw$TP*OLd%6CDRO1tUyh2vU%c?%0jMIHDpI0< zG1vw7d#LYSi}2I4cJxPa^fy1LzYm>(FB(pVuSN9#q$cqhLtr1o5CA8mMc?JTgD$_n-Mi700b^uLa*U5r%Pf)BV`I$}WA)># z=EZ~@vfCsqPzZ?yC@5f($p$WtK1QHGf5eeu6*sKqDNC-&(LA_~j28jJEvy=sh-4xT z`Na&YrX#Sgx|5LY&B$hOqxyn;-H6!zxT-7`vm+eFeoVZK_pcgm6h@6z8EPr-R#rE0 z$oeTxw9n>o?{WAgy;$~u2GYtYq1*Pc&I-=txQKZe320r7XQ=L7uYGwzz!pBBmWTbr*Opj zGfNR!zYLwg)9$zc&;9je>^#~-H>UO8xGo%;J|r!gj-t4To`ZcDopm3mRJ*9#d=XX^ zCge@M74n)QQ~3W+5MyI>6SgG(GtSp{s=c$0ti7G@5tfPVQQ`Zc@bk6{KYc!f-j%5Y zc7mX$4#2ZR2|Uf`oAHd$n$38|6Ye*C5l`4;ng1EQ78)_#)XM(G>9G=mP6@0@LZb)i`=K-OJ5D)id>_+{)L zM0P{ajuJ3m&g3DW(j0^@HTJ6!Y?(@c12OPOq2IqNC31dd{o(8u(`@_DT(w_oRtxtY(A{<GDN%q7kDMP!U_^}10YE3KsqnL090~75Q~VEe>E9M z;j5`5kAwggz=X&tulMiIR)X6hB=rsQm$PW#0^r34d9CKD18l;N8I_4wQ)LHh1&pJO z(BPbK`xfguYH|qa2=c*$5TB+J!|!8>%;-EiwpU=^d%4y_xbYa5cC4)tRzp@oL;e~W3SFb6#v*84_U zzRto|9chP7;$=*{oyB2eL(wk{eGRlN`yCvHnX$4KU+vMgad{p0VTk@o*yqX@8%cu> zMy8^S&?L#+;u@9kZ&nMS%=grb={bbKNw0@*<`A#at07)Lh7|Jr8xWzt!UuX5Tw)=Q zH7p0>>8T0e3ipSe37!uu7=8_<%KTM}31A6Y6mP=~c$pY=SnF#EDXMYiqwbu!j21wI zC^Ac9_y>|UP5bGGdym(LrySIrWz>v2+VNi}zB~JH?SYd*GQ6p^NAdEh`}^cDUdUEx zhmjC>#jmOr?^=8WiRVj=_(vr!Mlv*_1D9zw_ovivlm{9n--B?5qbJ{qtG9BZdH#Ke zym#>!VZr)(d!>3RCedQ_6>C|9lSMSBha1!rr(EVni7AEZMx1+ONF%PN^vFmfP8SoX zZ|O49y9Q+erN^j6>Lo^8yd2D_4bgw-`kjDx^y3&(WPkf>$8($jMj5IYjdjR42)Gil zEE$f**fA4MNQJU`NF^y!#BTF?;vT?}}5Ap8pUP>UtTjd;+Ed1Z5N zB^)N59lbKxAZ*`g5DL;tjI$UK`R#Apo7_>g`;M7tWH7<@&^hd=B(LEX$s6IMi0K9%y=KW#hgx{i}1jwZxZjIG;NW zZQTP^gXeQg#2GKB&Wqhpg@FE98z90R_05mYPWLw0+(u{dW%10ve zqZNYfLz$n0F%Zk-3!TQquM@qbHzF|uc`bD3UID(r@*GiEM0-N>5G9~D^A&2phO<>dX@;gMQx^%Sl`p1#qg6a3w8D%qZfR%KPq$~$ z)Imrk(Lf)D0=e#d^iinB=ryhyvW452f^neNh;gW)CWnY5jUy=GTV*w90-C}z);?a~ zXCJv5KzjI^<%inRJ&TJx3zZnQX;Z*7kxA4yt{uu$Qh&Ny9!HeKL3kVM6Hmbc7)r!tI(5ivYx4W@+jwgI?pDs9V zvy4~|zYpaC&m@5GITvy8^JSgLNcK1rb%8UY3-z*>p{zcf2hYQihNZMuj)ISJIaFPz zR-8GY#MaYlg;QnWgKMSbP_v^( zgpku;vEKz{2e%XA&KXphS({K_Qao;9Iu-uM6|Ok(w?ZfYBei@PEF#TpoZ z7V)tye75QJqmb`~gQR?~*pw{a3o`)x_T~G}KepRo4(7Dr(yW4AU8f8Fa9?B+Vr3<= z(R!Mt4P;cwOx)&!lpJhJ;i@4#ZRB-D(-4NbWRK1N zl<%C{P#E$(4FiIFPvbx%=VA~t{x77t@JU|4#!W)`#Vz)jG?%S=XB(1S6qv+a@Q$~(2v1d_!>MHZ7+DL4W0vjLbfJAx&{s-%{_ACjm*UBf>g|zsjXht5?_9 z8)kjSp(sOF$x#S_e*#B=&$_@z-BL_Y;N$Q%=M6L(6Zo-CFWJgY8v?&~NIThx5c)LgvS{4{86i$p23g zA7d|*A8`X|Eln#t@=Kw~qgeILvlS<%8)Y9a6%HHf@>?1rriPL@ya581# zsd)8vfr_De7Iu6@u(AH~=5MTO;amHQv# z%Zio$a6Wk1U0SR7A?*kR)MTf}R+O*8F-!5^1@Q$PP=|+#a9;X{+4#W7{G~9SIa%r} zl!BjERaRS*XORupwBx(!MaK-*;T}3*}>3ocqFOA4l4IwjRf5Y z_FdceLRyqd<7JNUH^XHe^R1@3?i$rfoQ!k`d0GC9Hb@GwK|(uyx8^t-HZ;3wo}6YI zJEeK%V~sPvp`YhT3}#9XsP#0iUj}NauEMy3eZ>=S5_k(HCow9LQfyQa+^N}S*y9rM z7A?w5W{kti1UP9yY_2&M^DRXGQP?o@|jN7gU_CIdwJ3uM$=@0*m zD4h*Qb2M46HYzWcFW9@zy-sR3Hc;-W?uO|RcVYX7Zr73}*<1vOm95_Yv zhc*M*r(h&>e)D9(_Y61bPIzo+G@&S|Z+5Ia@>3qj{M=s(-ifN4J(MUm zvBqVUmMp%9^v@v5w#Yh|YUBE~J|^BI)1Oa6L^o5)Qp&VjGG*^XTV8M&RL>j=hR9hduj9xmz{|zSmUN*X`YOX=%Ov9rff$<$;9$T8K*tehdIMdpLL5 zWQ}|GqwPc@RDw42%}j`of^MLXqvI3X5?7Y|1}T)AjVXM*tWvABjX zi@b^v;l5-{h`s*S)+PyJs#^o;#&Jwsjxp#AJQ!p;yq=AFPl4d!3Fip^wei z^|9yI3#tONr9O6_670rlJFbuYh_AXnc2}}Kwx+dxeQdhXq!M@uwfsF5fFy&lOO$>Zxg8F`+gAMyzDU&1w9*BX=lG-L4`dLFq^K&_1tW)RgSo!4n>{e85%+ItOB~5u&{p_7%sGlJqmPJ4F%;h3= z-?LIb%f;9B^)p~f$5OI_Hr`;$tpIgOrfkIr3sYW-k;jl}^Y#}C+TB#pdg4o5A2OKV zw@}y5u1wO;RvWEb^s^TZtDj{`Yqg=D6`uKC};+KClQwt+?c4J?L4;n86p(K@t3Th z?Z;LT^|NO&BB`I%yxU3rjQW^aKRW~O3Hn)gbC&b4E<~;$B|M$8-Ny)^s@#3 z?u338fB=Z=XMai1&z}EI>SqH`RVw}L+dm!){p{*BX8p{tmvsXcK~*vR?1=4Uy`t^w zXP-3dO&%M2S?O4-e)fO%GS2PC#$L8|M}k_W+iMc+Wt-ttYEsP-?PZVpI;Walh6&>T z>}6EP{?A^PU@x1n@c&JFS+!S8Uxq&RfA%t~UH3m^FT3*|sWimxW&0XCsgM2t&0cnQ zgFe|FTYFg;)gG0-?BCZ*(EjJ_Wq(EsN%~mEKaW@+doDpAbEh|p{mVc9Begzu+mpva zAA4&>Dt+wNZ&~%RkZv!lfMIr&*uNC^GA@i#?_VzXtbKiKgwbRQeQe&5?_a(-GFcy6 z*4AdTJ+ilIL8a=cgX$jJzpUl{<^A#f%h#a0!2a|!P9T-mE5UUzvcQ}ocQ9+^4(5AE zgO&h8*~{W94P~|P_vMQ)lqpNg>nq*mb&CHpq?t@*2;~$rmGKx%%2hc}Tv=A-4kW}^ zTu+Df&1qDoegT!+%po-ZqguM)B)r|F+$zJv{ipf{gekRVUY?S+%u$QeOcCn!;5Ip-V z)WQUG2Zz?A)l6Bs+5N8agk@(FWG6Nu4#Cc(+f3-25<@F2X9$#FSgQQ{B@M*4HszM6 z*xLLPx~N;u&Znw&JE}A+X54|q{;b&Fye{I!o3M8X>uk(k_D)CkvYP-!!(KMUD4%RE zxe=cXdr2OPBxbSN%T}ebm)(Ftw!5FXidg6eD~sIEgq-1iCWT9qy{wk@vNaEw?PayG z%}j$AC*3QsBk$dGO0fv46>F5?f6qU$K8VIJSQ|uM_*15FHH(`i4~%TJedppVT< zxqm6z*Y_{yiT%rYN&A;$mQo*^*O~pxS3n7I``As_NYFmc)Wg`vLJ9kq=tgY+@<7}^ z#*o`$|5AqBJ_9Wz>0{GAG3jITlJ+mJyEfzrkD9e(F=$owtPa7s@V37;dzQ=Vej1iR zHEZ^)*>Hl?$WBLP!b0}B;Ze2-bl4W&@Gvzp=o_g$%H|%Puyj1_SBdh%xXfOzb70@pdXXbX3iB< z(7wR2P3d5^16{0slfAb!2Pfc%|1}3E%7>ZWESbtCWhx%3;mP)h>Zw-C1FRaJEly38 z)gEFwObJMGgumPTeVZB_j}#sfeaMT4&@}0~_U1i!f%X@y!Y|?zU^c3Lb0(h2TB0q_ zLjE*)=F*i7pAC7YcN|_foTX~TEY*u@NmU(YsoH)+0qO;u+|gx-zhJC zq`bIB-MIo&hRwci?`?p_LVM{#Ekq#laL7jOF+$^!-imDAdHtxn;iFnrRy*x$aSpc7j;P+H$eKpz;{dR$C;g)wu=(NvJd$?sI85n-m z3lU32ge`z)UhI5B!Jfz_^ZcN!5M2x*1PlE>7hyoQ@O8IR<^6(Q5_EB{sI%@4XWyKt z@;*j3f@280_QWt5`NdNM-@Re2bS!h?YjqVM7fcgRAi@B5gLOs$IFtZ4w9P=Nj{Fn- ztZko+11|Ix=WAww zs1?p+I?-$+Kgj)E4~j=bJb$A-1H*w&;J+YTw9Jq^{uZgyh+IT)ygkhvwHp-{66`NPInu%YIBV5?1W#eD=sLi!%;8ds!b!34b*%Z_sUBk(3ydFNH(l3@ClR>Vz{O zUDXPQV261ylp3itoBad9m7FXK)~g%T^7(L$fls#D2>G>llYfJ)V9nkwYLn(!Sg?^A zcC+TGweLJ}znZR&azs9W+MKHYOGN)o{((=Uhe?A_fI(yLy1$_= zLn3Wd@aUHd-Q|mzf1rR+_+G39x&OQeyPb0XIpfdNuiDv+ zP>|EFc*pcR0q=!Fp=I+VYW15l04~VSk<5h{B+NCK8_|Q|DEI<$P=$e`VAb3p)T<&u zKdHgg>h?cbwjFmtsYBiKCqv!-xvoD&{<;TA`i``m;AY>B{^@*xFYp^YfQmKGT+D(Z zppw+I?2#(uLwp2L${z8fBGNN;!HsA~A1C=ea67)~z>6R}7lvK4429d^ML75%s-2ex zbijQCni?iCo)i4YBXJM`N}FldZo^EAzcVAhMT)^7OovY)8BtE+LT!s|{}%k$5*dw_ zjNW~NBxJEiPD643+u1m4qxmq!;mE|_LstpULO+@W*>cVl6DjKsZ)<^O9+UlgZH9m0 zbTlC2t4aNw8d?hde1+7{vrd!x`EO8VD*gP@xm1(texQCHdR|9yjjo@&bp5;p8|2W$ zfseu=as7NC6>=B{^>ZIr^R=Q*tPKxz!?WGRZE}4 zjwUJHU}R#A+P=VE%?DJtsdR$+bcI_#EAo&<;SQb(jj?@ACHNzuP$td7xH3bZh4%>g zFQ(waidrS~Prk44)%w5A$7ChdXimdtqJ)@+*(t@3dos+^Fx6~h8vX*$DW~BB_+Xlb zu^d7|Y+iz3>5q4z+?L^?J>|BBJZ-2xhSsOd;oSSfl-qH{OjV6GR99}VgK~Q_(zt4c zavOXvS-DNA!p5G$1( z>91DpGBzP#MX0M z>Qt+{wW#P8j}Rh4hS-jD3x@#K=t{*HUYq!X0;h)j2r;;+Up zPGqVFu!Pbo79vPP>4FnC#MK(qLB0ABPN&lLw-t{u+JR29nxAx?<|#wD#gP`FQP+!d z!tP7cw60NK1d$TifvH%|rv+`1Ujv#k{YP@ab&+qG1M`EdJ!b!1X~=SpCsAL%4i)LW zncWSIi}H!ej1t_1sttXI0w76Mu`6@DDF7%;5Ib>$vFb!>g|X_SdS`&;4Lql0 z%=P$SVoa-kO#N2?@h-Hk>&N$jehmG1IKE32gJuY<=9@@4{h)URsBM{7^Z!FMl*`pT z&(Mfv0eR~hOh}xh??48%sn4s%dVa`${~?^E*{O@6im5%ciUn@57@vf5vF*|uN$s|3 zQk(ke-jCG-_ICu;xi=`Y5kag?xeswm+CX=+alE??cz+o`(!MO$Z|~q;r!yZ^u;ley zlo@nt3rOgRT?TQq%UDktLMl*2dZfwOygvKI=*0CIt*1t%U5!eektdLB&`*2ov#U+? zMkhrhzp<`Hyjh-~It`x;ddoqP!XZ$ZmryV9U?#=+87`+{{LJYT+VivcF16=_z-OHP zI;}tJ%CqLnh5p<{z19(#*pB`@T=0WQe-^%@$$ayV_&6|4v_)ouZc^#b6GT4UJ}uVZ zkpgmKJNk1!%sbSd$6~}%e_n&lU`gEKd`*HrC9Tvn5>ht-!Ed8xOr-?xJZ1Af^=F>4 zvFOjsn9C?d{dq_#{h0xH6BW32%++54FCA+)`E|N-<&Ejjm!KDi)1QfOU4Pz%M?)vA z0_nu{=ZHyvUVwJY`ty5<`g3_qf99o=%Dg8?d}jUmcl{&|=J12QoJ4cfmItyjYZA>n zW(C@VEKs0F0q;g1$pk9ivYCdmQrs z4$q5IsrOweWRR!6hNp*eWt19IbVnniB9F#vrMbo-wQoldn7J5^D4{Gt;K_=5blYCz z%oOz)(G12QSPg@t|vk`l7+B0JMD#@$CcR&1w@_^c18qRv?yuyBNCM~4~~2~aRyHAiKyj^vDhQB zx)f5|Gr|~*TSYW4Vh98g1A1jne7_t)CkR}zL}@`kWA9_RguX=yjsP*^P~tO%P7&`1gOuv(gJlv0lJN)aSA0dHjo7OPIf>CcN5HqDfNOs3jzR!BC#g|_ zTM4`eVk`ux11{>#vev({R^4vK?={#CHb#w^=6_gZ@Nkl^5_}MXc-e(Wv69cVr5Fgz zSq!82gfOPU$$5xQI zI6!?)oWzC00YejDeVc(*J(M94!o&fgOCB0INveMzAWI(@G8pF|rO3JGU~o@7plnR! z%pPVTeqH4FJ$3fOik)U+Naq8d3{S}i3Goo(`Y}b$)2KnvS_qn=iPl1o2wIaeH;hkd1Aet>u6QPJv5k4JT5=n=yi-yNp<8fm?;IgO)7^8oLaEj<66jsk; zpmUv7gBAF046=(9p;B8dX^(!(L|0l73kTs>dIDW_3Fp7D_XtW(Ch>>m2h1e)$RpzE;)u44tINSW2)8!;UAss0Fd)BSG@J$k#8{JHNzQa5yS5 z=uMY@bC5)_AK~K9;4v1r&amDV9ow_}urr`fgT7^6F~1_Fv@sP%>uO4Ikg7fsY-N+F z^Ph&Y7Jk?X1~U35NMSP=#K4za%INcXRvZMC6-aM zeqeo25sztoy^e8xdB?auS7LpeoH)PE^Q2evzyM03tB61jEFK`3+<8xni zEbzsvFQiKkUbFC8jNi;~+ACybK+}bbBH*&2%M;uLkyMKpwRq#Tcu|WNwRjO4aD%A| zVmPUP&RGX)kE(y)EdQ_cFMHO3?MK(YxBn~s%bax}zwl`A`}zC-mHy?-I#7L7{agR> zf2Du9vktTzUH?A+PxQ}-hdve&&?maaLQs~0QAcZ&o$6lym#_Li$WVXdM2z!1@~8;M z4%VFx{+sR^FQn{rFyC}UU`I^x@ZGCK7uCs5#Pys2&dyVN#zT_}fh*e^fp+fMQ|!db zxfU}BqODStQ(R8~Cwnoo^ydVK2C~tciMj|M2M%XYRNh%OUKb(Z8(x!bmS6z9s1Toc zN6{RFDYhYD8p3mrYqHt#=#}x+5N>n=3WuN4SWtLG-XrsR;c^xkk7sy(qF8@nu4mSd ze}TTdtrh1YzgC*vRN}f2*R&wE9CWt%t8jbIMw)Y0D)-Ti2SXo6U5-af{D2bt5hvo2 z5MlBX)Q<`-qP8~OH4$GC2h-LMDN5i3nNJjFQh{XqS$ zaFa57Hp&LJ@I#jPfSxH!#=0&n#3lm|tYEVYJzJ&B{!p*l-vmX|dzztS(zv28Q_z-x z`93j2V>p~lMZLrKd899o4*~){fj3LjV_kg;eVQ9U#x_!C68-shi z*NZYBi)l?=VcDZ{(YXDr#(igDQ9}HxT_WG3KB2$p%iimdhuT?*Ya+JG2#w%3(0kPV zLNmeGpO*F!QL_^G8;ZNpk>FqP0B^&kqwTInD!sV{jL|q?{~e(_a>-u9BPkYkPex|pgkfS=y)NlrNCmNfKX8*C1^0d zU%@`sbg4d{1UZg$jJqy%Cq=2x;d`K=sS6@@AO}bmYj9h1y=nc^R@N(WHR}}n2kJgx zsyi^{J1)4#H=q`UrZox5(aAmfJ29k-<3qYw2|k4K=;Z_sO8{8JW6{gJ@p_z2IDNX<$9h5dQfjv7Ko*e2CdtkL(yEz$FZ^Tx*2m%soGYYRdp;sU+$EVcB* zQ0Xh`ZJ)r9sg^&ZI$hzXU-%x{cq@8^)hvuO`du!F`;9dR2{Zgs4vd_*?ZmUwx`GR5 z{7ifRb0QRNHh2U-S+H{pk%9)O0HP5J4iQ3?fy5b-ytFR-W>`uO(YNrYui`2_+_Qo; z&j@4|6(N#$E^2_4Xr~HMFxGV()l-^B7$A|?gm_0_fes7BkD5GnVh#2Tk_tU_KHZB| z2461SiP*~}=Ge;~JzUXCf2O&%9=%!%y@%FPc^hz{SgkCMA`Ijrt<32z%b0vEu48ys zK*I>R{05I^Nh9!QXNzTQRNNYrxUBZQsz>w05{JvXn@Pl2zeKLY102qvz#EG@q4WD5 zl627*pLIpO9H57yjth;1!_Na~?ivYD14I8_Y^dom5;+Wg{9e+>7kv*)AAZ!`F@5~@ zw07tt-1n&IEo@J4@)0^J@=T?$8T})1<5~Yz`j~{~66oUt_)5koqf_$Z zen}q=XvBw+AGf0Jj_Ko9+3nEB8thU*upEv2sQSW8A5Xk=So-LH?CIlI&mSB5c=C+@ zDt(MZa|!hE;-Vz_kT=a7&0;_N(z60L{?&Q0)jsd@%)>l(RQ2t8;n>zU5Q1E+R*zBt zW;Gt$`Wg`?=~(vf#E(+c*G|0e5gu#2@2!L64tCXZr1j+Zl5gLNS7AMT72<5x=j1UZ(r2U{@u0I=3Io z>y)LX$TJ)U&SHKS?w_X^v*WM+lx`DqH)?VwwSB44wi5Ue8gBADhl6Zf9O3a<=o#~2 zXpRN`o`2ZD-+`0$o%jEby|;mns<`^c6IeCa=#3g}tWjdSDkxQ=R1*m`Ko(Gmrb+}W zu~adoEh?3b(n>VAyPE5=nzpgUme$l#r7gA*kx)ep0TXDo<;9n%h*W92*Pz9hB49PY z@Au5i-MgDjf{6Z~=l^+V&EA)}GiT16bLPyMGw0}YS+@c}H}E$;pAX<;6?3fRb&Jr1 z?3`h{%ZjYQ@}#cz0c`9vtF|A60zZhZLoIT09c8oIjEL7B}QktXfdzu0s4^F6Ln+tvmQ0V zu1d7=xHnf(&!L*a)@lX=w2+xExqW%GY<$8JJ=`LBLboG24fw z?(~;8pqmT={u^`z2ZaoFKV2SUw!v7l3x&!+v#sH%#4w48dIa=xv2g!fn4M5K(0iXn8iQa*QhoO!WvHi39zKfPGtR9(Th3^48Al2e^H9JXQ&M(EJ9z;GJwC@~-J8iF2_@3;12m?3Qw@Fs> z$tb5cwZ)Mi<6|g)vGV}FQ2XofuM_24_6ke^34#AJV8~&7L3cffooaB}#@+5Ad0{#( z4aspLfe>W^w+46LMlX9|y7|K9n(2-bY8?0(v(<(QOPA%JGhv?7V7L zzeiV{G-8>Q85}X5#4+|>9a6pzQezBcxBr^v4hA6D#b%H>17+mvC}(>8OEjg)E;tcw zg5;cY@gDnO4P48mJ&#{;nkYnC3_E`Wlnr|Ly6({M>hWdUj)MYbxE4DU{ga9+X#yqcqY zV(Myt1JTf)R45oc6a{XyB5^>&3B?VkeK@e=nQU+ZK8F+|)7NnZh4;FI^BCX;S0X1( z>I8b-_w@v7g_#tNlbAD_K)6%m$w=3*+qiNbhk6V@(6Kj7F!ZbTqQ=@r6_WcmNIQT} zD0c7+M{AgNLWktO50{uJGo1iRBmaJ+3i*MY7%N=g9*6=1<%^vK*wsr@>I$?YXlulK zN^qwc@OdPtNWg`77D^k#^7}_{2QMYY__GUnM&IZ&P;Ep-a~1&hq!pp74<^SOFHO-0 z4=Y#t;I*hWoj&;J;vXhA~ zh3?7DKlvzCUo6E}W>%6IS6+RQx>tYt;!l7jXEh4C<8vVO#qVpSP8MnVq%Y0^CaE`z3_HX~B?#dN{hFGx`she07q zD2$w&w8F^n3ZmvD`Jc*@U!p~7TGs=-guYmhr$*=EE~4Sgg9&i5_I7@6`eGT%ChLnE z@g$)y9-pN&!pHfvhrT!%J7BO+Ib#V)a*Is8l=A32NDubnx7U4Aeen*ZFUrCEq-I5{ zboIrc(HHLpe5v|k1kcjzi|6B*L=Sy&5fXYO=y@OX#W1KivF~_EioSUKWTh{TLbd7i z#R$%>eRBKZ^*EN?(|$M<-UG?{A|jyghyAedr+w**?|#>1r2}Cv!W(Bcd_QM>+ zy})$v+3JJ;tL=xUU*k?<{}b(p-vD?CeekoeA0GCRN{F7`erRdy;>WWe-U~m!|H<~l z;tx#*ayVR>&C|yEPoxiyOVJ09yh`bVUq-d*^uZcfk^9gG7p05#*>gYn8&|pd;KK-E zFi7nuAB(-}WPNac5BuR{+7I1D5X}2m(#(`>KRhwkmp=G9JiJ5~wZiv_{qW($esXi- zJn+ZfSU&AP$%^4efOG{Saxo%%BgpD5sEn~G?#6P}0v_~6i21EpQP(K2gSx@ww6D_m&$_p9_e_LkEo znf@`y*1NadhzHt)*cjKR7GCD%eswzw5~m@ za_OH)P7Lu48={HsorMGZX3LqBLx0{Q@R{EKyBe2Cc0_L&lLEb6ENb4%7$a0*@=Tv9 zb;zFc-|+_KIM1H*byz_gdfJd~&zTlVRF>^9<|L`xiX6(pMC6;m0+K=HQj&ViHzj$? zxe8m(Q?QHo76~@N=1E)5KLR-3EoVq7*!#qOxEqUo7hl}ppX|i>DAj)GjfAHq_QV`ez%=eG8rJWykqduLbc4BE#$E;n{Is zg!&{D`wsw&ZX*-rlgEqO+3ktxl7bIf77Myn}5LJSG&!DMLci%JO;tjn0L1sp>jzC8i}xW^+q^wr;*VW zmSz$SmvENCKPY&Gy9LxKgtN5f{Pw`Zna<$^(d9ST78k%OrEH5I0x!m*r&5$xA_$ly z=0;TerI~+bRQusDF2bZ{l#+|DAlEl5A`3r^x->4G$2fN6M|bbK*}CmjJWQA(zl1Iz zY$Mm*=;o{u)5qayX)eeIb*UBXUTgBT~YL|(?HJ?xY>!J@~v+k0#}!7)1Z|-H4^WciN+bS8nL_=F7PGpg&RRSQsZH~g!1iVDq)~eBtMw?o&8`u2BM@db&9PtJPkj3+P<=ZB>jKv) zjdvvK6pi;aoN^KcTLm`_olA`uZh`6J+c%}tcoF{7^`KO>Tszrlypdah82Fm#_?iAG zz*xInD$rJ@^{Pj?sYn{S1xiqNf)At?3@2%5L~-srv3#wsE_?!Rpy zP+H@4K~WHNUFPb&d1%`WbRWc580P&BbbrcWAk>ahg<#+fqH842cI2Oms^2C>4akuaMu^<4y|&l}8rIpFLdwIS{i#wVlB z$sk<7=V=nX4Y9>NT2!%w8U$xpp;{Df$FUr(;(UZ#BjtU)&xZME&Yb}M=$#E4#9Nke z{M;FlC*~x+sRUDlOOAn^}QWT(@AsI5vd#C}QTM)dIKOT z&)>)h0;shGAI88%0u7juH74}t(X5ltlq|8rzs03TcWkgCuW@41RRwfa9Fi6YEYUKq z#6Y6TY-a^Zy81Bk32=wey?0q5{3TYB8gKDKqz$7lJv+nX$ncMIe=qr^As0gXXo&dQYRgvmJArULW)lmA45il|od8?lCrgwJl_+g5&c% zs_r)YcRq(w)y4AKy8R=}dsyuO6bZ}A2$>Aa%YY*i6BCvtgyofh*IbpWpe9rKR%7-R zT=%jT*pyJ2t?*Cyjadtjh&^k8A$TXTK)J!G8Knl#lE-s6KryXO#L%g=fM+}}MSJWp z#}wT}aq=fS?yhHF*O&;!wLi>Od7xwKtMzOb6b7rM9cx(*5Mx4qa*jFlrWp*de>K>k zA7)v^_SBMu!|AGs4Nws!7QV)NeL`Oj4pWTbtiZPo5?>#EcF6r`PxXH?`*JMbCn;Tw zYNBbi%U1kkh_AtU5~Ja+CwrmJuK~->=TM8wFIGz}rkz``6k)u0tqCO9L&Z*6`k6NcdduCO2>F}hLWk2d8n+Z9i7*CfoBqT|GuH&NwA<}Jjz zliMXaOB=Q0v6TpJ^w}xKGDBSt}tIQIxun?1dfxU)#0oEPyl6{Ch+2_!E z!NqS%aLt{-y_UEtIK7Gi*u;tLDRj)ltIPs8vVJiS80el#`c(8xW0w-i3O_;(St)Q% zWr9AOW{3*Vlh%?oJvb+50R~0fJeol+uB}@^WMZ{3ULtaG#ez7_iHP>Tf2jq>N5ELm zoC61cpx%C$z^K)QseT8Se94dKfXu!$lymr)m_YPT2d1`^X!#d#z_h$2d{{Ref<7kK z$10pf=x*VrcF}4vO;k2Gw;>);nu5OvJO-&@6ITCsfV-#4#+ahc-FT$~hE{FI9Lb3L z7s>(LBM>DW1cB+qqsGtt9+nI#gp7s50_fEl&Y9?-Svcrl&-!5@ilm9Zf2CSKob>~> ze)s^6b?Md*V^0Uwed6`QmvI~!9in=BE6{C4exlb8+wmgZ`e6xFA3c6tKip;34-gb1 zZ-QL-72nJH!DZlsQKe$wRUFc^tBBuR;4<)&(5VmDD&kE{fZkQaPQu%7ApY*_6M^{6 zf?$@rAb4~Rdf_ezBHzQj*2k>>giNzNW_?Tn)*ZB;V^+hg4_6b|-1V$~r+k7?>na$( zne};m!xM}j3s_>>%=!ou=+62NqJmy#{ViVAbsEYg&H7dt!73A~E4I6o>UuUVRK(p| z(RY~RKZ^y)RV1aFx}>~QSL2ypki2p2J}yZ1?9S|KLGsuxALhH7L2e}d=zc6n9^%O- zX4wLI(ud~P`k|}q&{tYb{#w^rDi4x$oq6(T7h~?f15rYKsgL;Qy~f*L2SLMl`>puZ z(c_y^;_Y)L&eZYtmve$pI!+dZZ<3Dl7T;+d=N7M--v>~Yo+GLvGFhnkOzVpWsook} zKlFe4rW47}&O1kqa;)rtRb0=`5*Lz*JBw8=tq@O;QXFWUp9q{A40qtV z7l|-bE9ZpB6!vT47MYK`wk%2ZG5xGxHbS})9MxJ)&VyH^D?g0D9QD&3GQ#* zb{C|XF+ z%vof=KG&mM96KlCBX_^b==iak1V6LbwIF3uA7v&|>dBy1a(r4)V-%P9Tzo`a$E>ML$ zVEyR(uCmX~3CRO?9yCgqe)`k*Wyicq^!+vHn9)Rg==)z3Jv%Et6Fp1P_Xn|0Y4m*t zwog`fog1(;PI;7z@#(3)kB8y`^f~WPeNSBq{DMR3T?*`ZNtF)sMY3k!K}nGOXbS}) zl>J|iPFD80oywxvE|WDIRQorz#_oAE2$Y*#p~%XA0_Dlt{!8h#{d)kA!SNQO?Uw^p zJ*NiI_9Y)e+WcByLa%#h`?p-vhqgb0bA)@IE)2R%_(u;(@rQZt4yD~6j|$WI!(8)4 zYWK+*0_L4ZBq(h?a39t@%~m)A%5q1b32j00s~iD+X9(D`NxPHi3<302fit*{O8~8w zNdmqDN>zcsms1%xNdj6VNdOeqLDn6A=KN{$16+_fa>8!Ae9=vZL`{BxMOY(wf;K;g zRXmCVc#|KXStkalTqN7rFx)clM21~~`~W!+j5=t7WBBFG)gvcB zk+~UjEC;Zq5)UdMsW~#d1Mx=78%3M>7rG48@ie^@<+t@b@EJtdF8ygk6Yi}D_qcH^ z_`agbMb_<%Ri22{-CJ1jd*4)Zn$Ld?s_+bY9bRA{(Qnuj-R0nXkW|VzdbYL1Iurj% ziIMM-F7%J`pzas%Q^Sm8F32Rl%OXH#ZjOI$wy(j@TiUpWybG67hq zgB3vUX1WWZ2!34deYuMl< zF+soS8XjVAH1*%AhA>_1j&FLYKStoa)bCN?YEXv+t>8A%s1J_j&>*buEQB?ZI#&?)eO@#%H9nVLtTcJ{R? z#Aq;n1MuJql}9NnlF)jj?oO~;Q2Gea;-R$PV0V|4Mnr-bodCKb_B}lX3Ykm1iN~RZ zpeXmyYr+~^)u;>|SJC`s>!s#r1}sKWaltwrU}_u3l~e}rb4aQD(sHK5Ys6=P{?#y;Im@}0^S#26 zNH#>;7s+-ZBwJ9ZRCD*`kZePN#Jat`#M(c~RF2T=pC{WdI~ik)hQJ*##ofx{)S^L`Ro+4Ei*iJybop%R8z|{2YiE>=OAl{!OtZ^g5M{Wib&VBeJ>rD?oOa__sB=$q&2Fsbwqg2^+ zE&m|=x`W>X0NKvrXxhXpH+^b$cB6K8eVV@0VVakn8_|fX4=1gE?@XIy15yZl7364lCME|m zi_ls{4krMuHWjW%B-O(>vlNd3(ftkVrEWlQZNh7p%&9JJ6Ll-XW2#Ieu!~hC(g@tb zTa9KK(0Y+5)1*2b?`5o1q2s+Q5;dg`k6bln9BzsjA&SZv8Br#*!PMB5!fnuYaAF}~ z9xdfUfQbZj%7HM~K|o`=%mOd}gRE~d3s@*9wKywDI^@g>CKrJJLg~qH3da0!33|a7 zEv0_-fO+(K%`GsO)%VZ==zyh=^tcg!ULAnX;y=P>Go%Hr%wK>ePaWXmugEAf8HY0} ziJr9Jd=?K~?puUuhJImYWHNwAm-{%aEAAtb!#_tkk`czX6h1~?$?{)~!GAqchgJ3rP(+tA-M`y@ z<>en$+-blwq%a^~IIq8pvYK}EYi>^^i#11*A171T#Gbr*cMqbICVowZ-={PM&jL9n zO~Fm?nKT76!0rYf4dTn_K`0UTL^2ns{g`=A6Tc~$3$`HUlXuJI6XqNEzx)NCEdRqk z(ceD}_$D*KM=4SbOhaV#NeHMuHF|S4qTX+NG_)?u z9-ED5|0R;TAc%}GhyY%VX#FZ_%yj%RSL0JlW48@xcJr?2b=+fQRP)KOf_;c1sl-gYB$F$E_ya;p z4c3TD=!;Kz^u>9o($yDR00Kz@*%Ab`k>8*s)-(1SqN)K(3GqG>U5iWs=!B^PzXC7V zWKR14fc;I~Pbs480dAg*u3Ndjb5V%)+{VY_GXg9$DWlF6C;hsd6FdOFp7F83uxHvr!n2bDf;Cp zQcFsC?$ISQKG@&q?N|UrAU}d#z7WX~qLn!vfwgsCK!D@&r(@+y;F~`}tnqN5%| zC5-~AiQG$Uj@Dk`UxQcp&+s4?SVCEL%|sfr7h=WCTneNYEN>*8f)#og#X!Pc_eLuh zm}m62)?^*bLn}XV0ka}FrrYh@j6bLYv6oR2>)r(vjp1+bsev1&Mcj7XBlIVdO($ot z?yklQhV4)Z8cGoh86wsp9~%1x_J{QvNX81gP;{^H&>PM@s@0Eq{{m=R79h)_%*cQ} z8IzGA1N9@K`eGmg(RWZycf9Jthy_}ze7qVp z^CTJs7dbU4e~jXV?=A0z9@oJMc0c9gFJ9}D9`Cxie|lW~S<+)*{QqEjEWiZzY0~31 zXnZO3I10fZ6O%QrK0$tn!uy044qUzo_$3_3{0keG9@zSRxbnc(SJ-i2>pO9Cn)uPmkoW%g)>Gqo`t@D{6O)I}e2pkwW5j;8`8w;kRQy?Ece= zrO#X+@5Z9dZl{?XS+YuJMoY6}zGfK7qfnIWz!EDwo9mmvl4wm%sP$yKgTCuH%(ezf z*^1!+AbvQ6;Lx@9i&*uZ68ifEcKQ6!ww<9pS=K#mp*^K`yLC_NiEZ%jsE5|KG17`F z>%O-4JBv12<8ZlrBeVEnwVVws)iPd0HCH|5c~}k9)1UNxsCe8Aj_~}K^eJm3GHnHx+%m~t6KXvHz{RhCL>jtQ z0N%FK?qEVGtjp~xrs&F+m3!?Xf`yz4jRXmO$6%Qg*oPfX>A8gIy#N@)F64w??kJT# zw)(0iH6xG-81WvX2itF>E+3WK(&75!?hV%R+9jbKS=dI9MUxfSZSSrJo|gxpmD77M z1G#qfD1B~>c9Uq1UGtt~Y|9n>GO#3sH1?r4n4bHT`T@?-P`jeF&9Soc3fR555HPBH z#3@Gu2`|>zyE8Yio6(vj>NH|@6sHk|+{T^6UfNa7cD_IU*JbD)E<1+4N(9?4*|p79 zgkcVdS`dR3=DH8#Nd216L$&iutuS393tL&H6o{{Cz_4yYdkmuYmf z^i%*m9bb9$O>cir#_IrHV=|qA8i6-#fo8-I9>u_1P-YEBAwKC3kOmMuA`LoY6B5$k6(CeegYzg2D9I9B->$j-8Ue&`JCCyDQ?lKH+9vLY?lAN|#yT#tGm=cZWUrdZk81@FJRdYdnP52S-;^NB8-ci1~K z*9n^=Gt3wsI?l$r6F=zI7{%tb&FEJAU(M(bE>{oTBWzyYZ11rms}r2P9GCA08WqR? z7B`B`nb(7C-Y9HdvxR_^GFmG^uiR<3P|zk~xR z5ZVx9WaW!yQVu7x@|?V6Rz4S8YgpN#Ts^fu(|KecS-ESP;ZP$fE-!Ie`EW=s!^&5E z%M^^iU)3us8~)|;Us7D=C#Lu;m7MNJ4{8?H1{^sBg;^el?ek!~N#f-vMjBo|$`4*v z4CK!BFs&?h=lY*2Ugkv4BWgL(3E3-30fk-O7(bcPsdiDcrYSLX!YZ>awC#e>?kqbH z=7hhyRHl1-b3M#9dspurY;S=6vh&!z_D0+~gNy!h<6#&G%$@IdhBjrq|B|)5e6gg? ztZ5_*Mr#`|XOUigV0`4xTo`H{Lf+5%J$PTKDGP`0j8zQ5U@1-DC~&;QkP3fWc%RWt z>bY4>8Wl}oi{LRyCUj_-@HNP}M0Z@7P^&b7xs(Y_S|-#JsANrG;K52Jz>uZ%r`q{F zWCCn0&;>F{fuBGV$OL`TnX%H<1o9H`)C}Fa`T);#Q%>0LQXRM!@}!44&~A5Xb)a@h zbi9%iA9a7RK+n7DA*lhZ5w1nM48ew}Rpm z`oLMa9DigT(fR=QHVS+)yM`TL~@Hu z%aepK$ydUp_V-EpK%=Y|!2XaVi*O<=Ri0dXj*%y82B*~x7P|7}%v9Z=UauYIi&%+o zf@n(84Z_q`Q`Qcm8!Q9^ad|*}Ae*|uA_@lR1|U5$D9*)DO#J-;S4CJb6e>bOO#BPP zSXa9c+Uxl}RRpsz7$fi)6#++|-Gu>F1VR8R4~mM=AmSiNMR+e$iGzfS(AYy992gbh zov)BG;6LpV2OfR8ruj*avhY5Yg&7baJ(PtuS6Qf9q8z)kqhqxY7^{Q;$UfH}e{8W5 z0;`8^Bo1vT3mdIS3pqcq=yQQ4EBt$0zmEt;7;r1h5N@Gbihvij2$(P0LS?;K6o|Gk zAX!_Ofv?1#ox@5b?@M2J`xEI4H4Eau`!-m;99g18UpRlJVs%oK;l&9#9NUF1 ztDl@sUwB|2S^e=ThJ#J@Lve6ItNvRd*^It$<~K~icn2P9!+omiul9q7!NM>RJ7i^1 z<{F*ruZT{<=5)|MCGv8xN^(n2^q0aP6=ci};2irEsDUKnq0ixMR{VLePV^XiHQxJ% z?m^e>zYTq3=)XA~$8Y!tz&ki|w|y`yO*(bBhu%(LwWy4>l2K4;=4Q47kV^5J75_de zADZ;JXU(GYoyT!z0j9XQvT3#Gl|X*1{BO}3$e?AgV!Tqd0t+q?OfYKX#OBPT4*SSk zAK`>ZD;IMR(xpDk{O5NfR?MoMctk#p)pW8WSjfdYaQsgRohryLVTIEmY;gEIKJ{D( zjli?fz}i;=D*!G(&4y7o>&t+MorwjWeT7(qfN8=SB(!^&9oS&qjdN@n1Y;piK}4%I z*d4L4C)is#MCiaEBamnlqw@L`(BWHMF%~Z$;EHYAvxP zk_C{UxjopbWYt@vwepIlW;%AW*`pD1g-h^dwPOGsVY^ab1F^;C`cFeobEU^y(P%bSK8r*D+6l3$VaOp2$A35w>*EbD0|2X9 zpkbB^x7urJ21m=WB}Dy(z7Dzm?uy|wZnSILMrSmz45o|1P4zDss^R`_pjA}2@HFTt zp$`V!at2Tjl{>Sf*t&b7*fMZ?@c{d8_2s{gP2Nzq7l&=&h}d0nhIJPY_i+_;oOI@g z5QIb5;&XNexyu24D1O@F4-rNbSSegzxGNUe0J_YMR<@#tc~PvX*JbVjmC9toHBl7e z8e^>%OFk}^(C6P`CLdU{0j5xN+pgK*JSxIT?Z3w+Wa11`>tKk%KT*!U|28G;!2$~A z4ntN46?w>tM`AQ(ad-_yf$`Yf1yHg;QV#Ob!{6B66EDtzXiZQ@_%(`~$`x2vf*qrk zYr$T*epKj#J7g8W%(k~WFQSavj}EK|b#W&QbW*iJ!X^PV^@ligbp+c2T`6StqrZRH z?I3ZKvP-Ao$Hj&jSBOawlz_zs_|b6UP@I{u11tB56GyEDCsqKs_-35t6gD|SbK<76 zeHkxb3yp)!Xz)c&Jez${cmuv(h7U{p7_10FyT2lwxL0%HkxnWn&Pr~g72?EjVnlNy zazZC@qM!F(6t!}QuHV)>Cr0s(ocIW!jFztit)+6JS%M^S;Eo;yt4WCobv9 zi9g<>IT0c;!HLa=6IVnlm-WGkE4-XoKtrPOF9@tu{P^`W{5UR|A0IUQh|n9tj|@$g z;KxkeCGz7Lee>f=#gDB$`EhYiemoYg|Arrzksl>7ruK(P@MEioA8#y7A+DMc9^!() zH1uWYO7Wu57WEzS<6^^)zs*kO$1TE-t$p$%U8OZYw(dJW3b75?3V!^t;YZhhw-i(Q z2!NZz9fA^w0v~R;ZBQf_EAtNrrFLHmhtu59+96l8v1^dk$SVCYZP&s1iw-$W&joe5%X~T*xiuy z#!(eZ*FY)Bu|i2+IO946AFs>`xPV*pgW&E?}MC`==^Zea&(VOZA#W>#Vh{F zhJnojI`F}K&-rgIv?7!@WdRHx6>-`n1`>re2)(oquhNQs+u!LNu=X>pRougxBzst; zfVeDLN=-5geWA%VcT@ww0as<$6ht+x=q|>GzDY1Jwt|Md44`Z{kUzrC7wxPYQ&{4q z?r*yG@{-!y)@yr%-u@WvDf*g<{%~(@pmaz1X_jjKDj|Q7>4xLNht82|;=cDFj?d~z zuL3`*Vgf2G6W`F29(}UA`>-s`EbtG-_Z2b$LuZ=zPliiDt-_8Ib$g|({wr}AI`nuL zy~2j!-4OVMhSm`dIs)6a!Rl|9FToxe zCO^BfwIdMU^%z(DJD|Y8Im|BK9xGoQC^n#DQ*jba6*?Vm;J>xFBd`uV>W*Lbx&lA2qQ3G;eEVd5pf!eR6+Jsk z+QD?yx}GvhZ8Y2ntCig*o0hI|vVr*!un}p6zmFNdjv=2Te?Uj075UN90%dfAgBYy+ zJeCvVtJ44^YQYYoD2TI8)3d;rM8#N$^$jRix&SLZAdau7tXGQB7!ffffEW zF6wHZM586>k*K=ZdqD+0MCgD5Ci{BQTM{r}XbO&L4?LOa&>zn;zhd9A6v(IkoPc)z zB`Cz&6OAKJF*Gz+rIvOUr)#I#x+n0Y^B~nZ$P)#kq`o%Vcwe7JF5kz_NF!s=h`S(P zCwp;o$6!I;*4Ki3<9;s4*MUJY5Ro%}?AP^zoGE>yWtm+>uFB0hDw|L9DP2CUo(yi?{!q0wVjb({|!elcnX{r;BMtz*)q)t{t5wdiT$Wvxju+uk_)|J)Y}}pXqG9%LdiZC| zEEE5X!0IG>YdZgoL0^Q8btU~XzHw+;8*9Qp<1SgQDF2Kh$^IFoB<1U1s!Fo4eq8?y z`ex7~Kv3r;N6;`lg4%6D($4f^{DHl!2`gM ze~IndN_$PLEJH;1qbF(6eF{al*BCn~*%;fRy)=@Hu@All3DSp`#+mfefJuX18ZaXp zDJ#CT^wQYZ-P&&zP=I(%vAJwlIcN;P3DHxl?Ey|6M6P>27@N5<-=kkd*J+RWD#RNVC>ri;bs z9E_MUU6hv`L`%#jdrh@H;bc8+*e`ZuZ0q5~(ciRDZCCi)>lUGMQcVvJjx|*nbNDIA zo-eQrP0p9R?K^KTsUqRQvBtY&!_ku7en+Mg7>oLG;dmDlp|aWWo+>iV?y*K&MsLZ9OLlpHZ zKYI1wkUbjhzY)Bvr?kjUNQ-}9RFxCQcuI?8snB7h!hI(icA->&V;ObQTpK&Kv^;ZN z2R{<3crDtCqbdiB3^P7Id_zeEwMEmH?-sN}ao^fs->r-Dd&&iEuK>duXAa*J6a&hi z<0(iIEeMQ1hY!-w_k9rrJ-oJB#wkHiC0<*L8-UyL=Ar96V&G2+&i{i*1ntc6E8Hk& zj=!Vv#13t3!kI&hf$`P$=!6)^beKB5x*>(XuPxI2-Qnf$JqMb<;nwl`*FOQmJzc0AM^ycq* zTpp<_*~>%h^{MK_QBWrm>r0O^F%MFwhcW>fqLhh#WXSaS7=y~@p&KYe;OaqD;)haDe~sSvmkF? zE`-;zy9A{sVZW{SrnEz7|GLB!f3-d5c`D*4WqIoQgZA+MSgC|fDh9CGn|t^tRWWuP zMdI)-J@S-&IlX>y4W!F{>lYL1J^BSaKqwnlQXB*piT_74u3i6+U*kske{2K7sbKW* z|Il(_Op1c>ZG4%kUmP}E^oy5m1R$E=H|vLu`=?(_>6PCr7sNwf!_dJEq_$aGok(9$ zBNO_?XjxSz+&~7W)h~X%kNp0~*@le`zn^%d%kR%a%o+XS)KR8j{7F3S#Sg?-eA4-Y z%+&rMb5s05S`z*sTkThW>{dc6{m@ z0DDMg+&%o9pI971+SU^t1xaN_yah2Q=M-PdV`r87uu zE@nIUgLGh&NJuq8&^&z#&4CTO@pw6<7_#OPIJKE zx|{hfniGHe5%AR*7A@aK-+}Ul9B}|4z9lGT!|`+ZYPG4&d{Czann-h%4fHFC<&Lph zMq}`!`ExvsVB`MU61vbutqFyKulQ zX96tau)-vcK$*4t$^rJ)`d`dJnb>8@XXQ1#qR+}p_$}N71jKxi6M#;R(+lAA1a|1S zjVh37Se#e>j6#L$b#%5EIxns($hSfa4g~6`w_=ePtyy5HbzoLfhOwydOq>}*QSZP2 zMj1{O7@%#=MSvwXD^nJr@L?(3^!~fHWOJYo%a~-Kn&P96Hq;s`j~jv|OOsILGYlrS zfV?DIYjg8_oAWhDLB0Qt5SaDo4TwcfzS}q>u<%cyX7m?(OWT}diL{>fqs3xBI_y-) z|4l$gshqN<4G5GdYfUjB*{eUE;-?ipPzeZ)K-dzmJRZ3acoLcIH;7pn6=^2)<; zrEwIJF!{3cfKzbJ7Va%GI@c2JRs|OK+($c)yvq> z6T!F)yrW&`vewgKXDuF}vqrp;6=^f0AKeBDwaS%*Z9WE0IqZB9QgrCr_-RLpCq=Y! zWo#-uS9q%MS$rpAjGj87*LRBSr>N21Iy3G_c};|4u0e=N zIK*UTZq*(!KA3Lk22;C|%QFfr`ed;ks| zoP0Xr_3jAQn(TgKpbCG7Lgk|Yw;=S#Sn+`4_MEl+!T}*?c-pHN;>R74@T?J%h?XxQ zJ&+F23aNvn;Bm0I9MeA?Z2m(TVYM6*dMgtxiK`ms6*-dUoQM7jl`H?1sBvErxDSN? z3wCiz0AK2UTKA><;Q!KM{9o#}?u-A+P@wcc`@ax`c^_;@YM)z=>HJ?_JfQwBs`K!F zDR{L%|CgQH+3|!+%K`C!QSHP3Wm>=OH^&cH`RK1iWA15OWx~hz>D0>u{HklX5Rk zFwDlO>$8 z^uc^6!g5%zhd;~|k3S5y3{(7Ju*g|#Y@y%C(t4+Ih-oTp#rc3dM4X1(Dvqr;K@F?6 zv&V*7GmG15{^OnHJdQCx1Fn_V$q@9C4lBqEAZOed)G3W)%;I3NIL2Vfh4{u(JpM2) zv}yfeprxql^%1&g<&t#OD}NZ8ClmfKckSz^k*jnc(0}FJgB|Vsp3Xgs#UJJzRO=cf zl|RhP!FmJa)7s!vZZSBb{#q%tPo7hONjc#bqf|;oa80kEgf>VzZrs>@++t2UnF?ns z=6*xB_hym__#}SOm#CSp6V3GgVWwdG96V0!bI5CBccecI=hlzq4xGo@rO^fA!?)`BqYrJ(&N}eqToQNN|Pr`}BudCqbyv`>!PY zd-lD)xcG&pudi~l{mf;T{)s7dpPV%Kuh)lml)#a(BJ|PctlR4-WwFT^%fDmfSvMZp zH4XB@ZrivwmjBb@vu?P|-VkZM_21FK&_g5;17^dVS7-WjI?FR&$@j;P#9s1?a}kvh zC_8ysHska8U!3XpzdF~Shu@Q-<6+g}3#~1&JH?;`EwRmBH*`bnW?yVVcVzvop|1NI ztmVI){#_XSQTNNhpRRj3HikcD-FgiL{jvxxPZ(I{FB>`9XWbS>Ctu9u*c5IuJwbs| z`!DPZhl=ky-{#$m>tA+mxb~G7@jrC%n;MADgI0X_%=OYu9LXwOmL1C-WWSiUzr`D@ zF>PeD2qX*G+HMmwMQCl&6>ZsK&&4H_`Axi)_4F&9Ti3I(_po8?_PB6UZ}=Pwe4+yR zTzb4>M(Z=zuhE^yPjs};bBBA*@fnC&X7FSG1rd;8QsS^CMY_V$A%53)kxge{XzdUT zSz8vrxm3!dmf`Gsls3Q|T$P}cTz%lOh-(4-j=-kCy!@if#XZ_RCl&9$>YgEHO(Ag}+CWYb8zb1wLO0!2bdETFt{9b=!=tb3WlFM@* ze#wbmk~42_EAcuMtNOv5mJ*#`6G`s8_9p?{ByT}67|7*Y(_V7@x%2k!>{-7c>*@nh zf8M;k1w=(M{DRzppQQfu^w1nmMhW}e7d`BRm(f1bkAU2oro5turhgfFfSDP+s!X=?K)ZHB{ELu}@2)_ws4WJ?uH#=jleH)9@k%8>l6RhPqT~9%Og6Y0^T-Iz% zVO?v)K5{VFewh6>BK{&uH8kE~HQPle=vpN6f8m>G?-vMMn32&H<@bRM`M^nh5X5e& zQ;l`azT@MVKYH+y^KtNzec1m-d`yk5^w$A}z;6)bF$-iuHFpk3W^QaeLjV-nm=K=C zfp3VOi6~YiO3Ym76R0~6zdfERf;bNMF?u9Y?k=&o=cXD_Av@MJtp)uHf!Wqp}(T8rOEWytm#kF zUd;|gclSnip#w#%EXa`0NG8QiS>w+*5GtI|YVZZS!s zXXBnH0LWUUxF_4?un+jn!Y}o&?n`sUaEgg7Un`{KdGEhZSU*D0W8LYgpYr2zBy7hx zQHV_8;s=6b5}+D_`>FW#<9C)8B)`DnZAP6Rfae9lBY5c(v{gSIA7}+S3*Q9p@`*c* zFUCbD5+N5&8*m9$E`oEK_xS+yRXIgW_ALg=~nEUxL)zC>gwwEyHk*RUPDsGl!=vsSHk z{45Kfe@1NQ&I{??TD6|?6Qkri6;;~VegIb>N4o6QAkkr6535foj;+X2l)=*>g}Wpy zH`{!SUL)P5%d#M^sAS+b5bqrv{xqpoPCVik5)j`dlQEWjZI0|@A|l;IqVs=%1$ ze73;L#_bL(ay}dEMyWsHv+lxOk_E~Pu@z$0ap$C@G7r2<57WYx&uf7wqtGeH(! z@u>HQX(bBywajuJ#1O&}w!q_&5P0Xm^hm%Kad{T@b&s+!`@P-%Q8#w+u(&`vo12iw=y|;=4QSR|)mzUw)`~(#8kv_U5SXJ^&H*-Nu*8@v^wx8ov{@ zj;z{#!)r**W`AJ6AFbJrWEjU9nRGVABm~!J#Mi~)e~7NYHf$wtE8cB|D8JlXZSiNG z0*+LYHadJ1Zt6M$JqlikJcm=Lv9=wEBSG>JRcD~eDmOQV=eb(NfJ)r3K{kY ze;^y|UDIJ&xA6=T5%nNBVa=nVw#?$^Z+Z+pw(d9ru-H49ktM?Tic(K7JAPAq0L-)k zsX|80wrI&6aIOI6xY_>XFVO9s_L>`yX-I&6qyarRsd%du`4a037U*Ss4q8HQYLJf?S&f57 ztB%e-J{iUBnZ@r~cTj;4DwdkMUQ_aFCDF9fzl}eQ{%83U_HV(DmRB42WSPGcKPmF6 zWRa0q@8F7byP}cbF-Fpg1^ldTp}MEI5+POB#0OeV$$=x>h^VTgGY4)&TGffX)B>xH zq7-jLX4R3yaU)`@PDF;5Ty^XS-iV~CYgIRMMQlyC!~QxvkeeB};q)grGjT&bP;O@7 zhEhdtg1F%%D>rj+!>-BAT--?S(BZl|JjFfx$(MDk8TU=*UX;wRng;k@q*hp@Kg-Wo zcvs?fB0d7n*eW$)Eov!ev-yZ}R?Q?3s}nt)`7Ep~9A`YNsMz-J=jKn50U$s^pVl9tb%NtJ@?GNo-gqrL2o@7N}`5=q2Tgn$RlKQYJ+2(M+Q_E{fJ~Mj`^a%v0 ziQ7x08-QJs#$Y8g0**c-$3r`}P!lEa_$-V8`-&dW;4s1&j0=~4yp0!NVH9qyxlmAG zNc98f-_ltX9}CPo!l=1cO;ieL3(L9{y@K1F^0u?I$6$r`)STZnMLs6&U z-uW{My86HUYS%mrbcr&IB3>326+j?`EC5=pkZxXx7Ljz_sDD014YHkFLS zn=HI(Qmw|%{V%s-3T*wEe$nO(5_n_trC@x~s*f<?b#u)jZ82|Y17k3ZJnFz7MQJ`1n z_#EeDJSF{`t_Pp^s5^QYsJnHSZ%ly|{x{Te$gn1SfmZopWPNN-b}%RYyH}IC4fw>+ zLU;jp9`MCq1wW5`dU}ZNbbZx)V9+qw`$2MH-Eyck8@1#pe%13{5-sukdo~I;p(;a8 zpihud{ONy_T80?JxYY78oUVlb4Xx%WpIC5U2{V4Sp)fyA{z2 z(&i+tEHzqWRXLS_mvU7p2q~S4E5SzTG+fOvJ&~1PKRwBF3L))0{G|DN?PDH#Md-#M zq~{*ImIrIFP~*0T;Z5XeDhUw^e|-v_%6AlQ6#c{$5o+Es2m=bQgwWK>jfM2@##F>i zcn!P;x*$9vVG^G1L^q1p-I9;h9-=TD#94FP1)Ru&Cz}$lcuHKQN=%TcE>gmJdUV(o zE}vIa(~EGyOA;7`O9cjy>up0PxO52vJ(@4haYJG>AuMs_H|Wr9X(a1{Q4I2h^oUov zQaz2UiV5+y02Nedp=9vIBd05sK!XEs{EMokw1k>=-sC>oE=q$|qq5_X;Ix+Y2G21kmq%5lvP%q<+syg5T@uz#Y#7yrEW_PI8>r zfT^C}lMec8UwwbS`Cj_Vj-tP3Ci*+T)8CU}0#EceWqzZ6fF{M{4#-@P6FlbuXdmXc zL2rl%hvb=%OdJuYDqjI4U@bGd#V(j0yNw3=$RrgjtW{Qjss~aWC>(z}C<@42z66FoJ zafSoW33=wiGfcrVT){(2mx717l7goMR|=j|Tq$_UoZpi{n1phKR@;~3(u&*yA1f#) zoQn8QOqfm>5+31zfqtdKy$uFcI$S%^lR~;?Vy3kn4Z7p#B|Vv#oo{gvj){J!z;2uO zp;Dzo_=rkZ!!9IvR~oak4A)7;YR0q3wVonVah)E*2hkzOQ&C=rMD;w51%a~_FM53P z9QTpix|(`<;m|e?@|GaNZ^s|RX-SA}rw+Kp)6>}Dx8pz5Pv;ZEN@9clWTvNg%%7DU zjsd3-P$Rf{8wF6Dd3cama;ozm+^lfzdxH=c#tv)|1K(5TyukFWV&H>yugrgxoP>uZ z2*VTq+#_a63Hu?$qE%UiyE+2f0U}IFTlizY$OODMLqaG^l@Torg0zZrJzwyvWS^co60n<*Br z8zjh1g8nKgTJw01jkNNg_39vQq4rD=34?~K-N zDSkeh|A>8TG`q#lx@kpm&9ks-1;3}PPp*;gaa5dafeLKTbZB8i`;v!K_*oX6v#-b6 z4n2lJj`QsyC?sKhuzu8w(%+*tuKxnLSdeyFk-b%Z`99lu9-o>eRLz~**rw3^kXRucTbCGuE;(NXFff(Egjqa1cu?^yU(G#8L(_Iz zWkGSEz#7*Ut<19#$0ONbYwEWm7m!i|IcQ!pagnEaEAm}=oyFJffz91c3Esl2hhg6p zZ+h5Rd^1~NY_!5}q7(2@d+e?#YO2bz!hb}qumT-nzZk!3^8iw)wsm@r!$h#&DBOhORrDM8f|ak~P8fZ2KMyb!3jL-CnajTGc70V30os4Rr4e#9GVX){2~q zzB^6$BbYdo?+8mWuQ-2$rr6`*V|XY``w90eabhcZzw#5-2j9B`T3>!@eac^>)LPf8 zzXttH)n+R5yDk?!CLsL!tx1D|RV z1Gjm-IjZfq>`t4>*m*S6(34nGW=~mW24ne%`*}uQBGqAH6a^2L9H;$Aca( z|9{5cOicMytS}K%i;6B(_IKqb0-`Cwd(pMpaZ{#=vKt4qA#0}Uk3fpzKm`3q{6bLD zkJnRhuas5nEaO_~>LgJb!b@!A8ABatlv+?${3T8pJBC!-o9(B-2vhNpYvGC2_%kN5 ztL9qJ&6L>p;4TvT6E#u$ZR~u|hG3olH`p*Q$_-vlvW7j1{Xhetz}Dc2_^M2k_oM`Q z(@ffkaxkG+gY(9O*3N{{&<)rRdS0g9AC7~eH4mbalEOE|CX2~`O`=Xjmr;fdm=_mkC~*Bv z3gB-74{zgdGL4u2R{kbM)%HyP5V}Hy)|Omh@1#&1LVNloGzjO2;BwW7&`Ql+pp<;0 z>J+0Iibr-)72>iu!wLXaBEYEvO}O@F?Mw0=OW-5Y(9Z=~s$UT~gk-u98bxxlBD)^z zhL=Qe5D^iqwOXD-`+gko!Le_wP3Y)>WEF68ffg?bCJ-mDJC^$-wE5Uv_`B?O{axO~ zY;XKs{*LQ({w_x;pOo2WGu7s}tS3+xeO(GNomu!ozxh0$KZ4^ zKhTk3zQ2`E8pWalS+@*#Kz$L)ti)yP+cP0-O6UjJj>l#3%W#65cOCI;#)5(MZN>zQ z|CHzq@%or4QcA5Ixs9sUj-+N;%ZhzY7P4ZWlT~c#Fuau|Z0T@Z$@;aFtJ1k*+bhCK zs1A_GO$lzo`bI+z=rEF#@KAg|wCtu;(71o7DC=gmzg58AI<^bWg}nVQCOT#mBN` z$x*4cyWk*V1TOeznP1+!^0uf@=?gvNZ4kpH%rSdpPkDQsD{qBY1STso14PtyhY_)_ zYI-UHJ(alhRN`EOQm%Y8>r0RS$RLD%WXt3p=A>R- z45y1#TupDjX-(*ZOuK5kb;svW(0++%h=_O+myE;XWq%ux0jUHNpIw;^Uln-NRBhoX z`|bc50Wcbge`_xK-)Xnsc!CRGqC>AC@{`!6gIB?kBXX2c| z1?aOKhC^5H^>WuKKJ}eX$0tf-h z#~palLq48;n~{$@a7CfDm;(S2IW4-Fx|!bFnJM1n%D~se0>;3%NZlv{-(q#6417z} zjWX~xs~eG#YJVpoCY7T}LQ*PUlZ0ec?k3uMgp!gTC!*`}h8`ybSp+UUP6TScp~s2L zAH1Q*Ns}o?j}rne-_YZPfb*uV4i~s5>~bGg_XJ<=>(%`-b3b3*bAICc`F=sa67o~= z(0H6s!B#FOOf4p&JzIS$(-st`glL}zkOgEBK&1`_Mrb3UZWmk8oNpmjLjR^Y8e6OHEY`Ti+*0%Soh7PeNykAqSX>L?vj zsvGEivqFdC0qvV&I$RLj-t0hx(O~|LPlySa@5{Q4RdQ7N5EbJ;edV!~-+F>P^^=aGSpHWK7J1aaA zH>{J8D&Lj2Ask(K3XBpb;>Q9Mi66^!6jgpKL^h-nVV<{^L#X{&JnN@ML0@!W?7B>Y zKC5NoxnhGe*t;0L_%FMFe^z)E{+7UThw?cTA6){kodKvCTlL-k$iz3WPm|~~I|_4n zgzBclEYYTq2k{Fn)BjdojBvmTZCGDu8mU8R=r?M_)M(XsDhM5c)@AP0B3pfLuX8R& zDHlJ0g-GYW75sI6Pcxk9G$M;@l8If1h`*E0P2{C>PL%PBsrKVOUJ4AH8<)|hiVZ>H99w$J<*?nM1S(}l+Ej2vj3shJlv)4C~-&p#J_{B zBq-+qc{|46YEi#{WE*brlhpI0fE`#SOqZv-U7q1~nUkH{S59_rUpd*iedT25_LY+z zJ0_D^ooYAV-0R7%z})M}&TsDZWH-dz%N(pogq+O9! zppu77Id<5GcHsdfg(2E0x2eCSJ1c#V1tG#9D)8Uq} zBI`MzN{ch18m`wpM0HuZsnXtqa^A^Ow4^=}^T5BQHZ)XKcz$L(USAmuufoC};F8X61DHY}EQ_ zh2aH{jy4IEx;h$FfgFBBO?4`6Tpewirzhy^r>2j-Br=Km=nkNd@{+%RB(8pv7(Im4 zZwY-=IRWclD?eb}adjvu(doJ-Rhj9xatKazU7buy^j;lK@+hgz>U&p7U8e2}H0q4; z$W>BTs`svv+KPKa$)AmqdYeS4B3`$kZQ_-`z-y=aNy6)C@KNt$y~WUp9;*H%^7C=g zOF2D0t-<0iz*?6EtVVc;r-%WCJXd3*6I@@@qn5RlnhA|98?4w1|1Er7NrFb%Mj+PK zD!5wHfcGEt#YnSvafU=Kh<*M7mQ4}x?~ziJbkwjYhy5etgAmPG+q>t>dNX~G*%R_1 z9r*k0v2yHZuSJY2;pf#%mq~0jYNn)A_ES^r3Ra&oy&lGXs`Dx7VN23a%hCyDN=q{q zsN=tErB9K3lnY>^29UpijLW?g0Kr%ky_|%83W~uk>o?1mw?c1Z+LLpf@tFM@%y5;( z%y4OghwZUn46-7ntVf}NyT81(S3e08NVok~d~(YG7zdQ?OBZq+sH#w##4N7I*|~vu zOP<9(Ci!aL&V44|SGF1QrGVnFYC)ytR}#~o4UoRI2~uqbd7S?b`qG zw5U-J!aoEV6vB6l0>(H$Vp9RGX_>7sSOuQ8!eSWHn=IH>c-{(ge;m$v@atJ0Jcs5n zafW;sHP9JSB0Q95nVpsAQRqmsNu$1}eG-nw;l22RPLW)K!-;OYU9+w0@al$8V1xKW zR&Kv>BD@%lLu5^UEc*~TL>?Q>|7EnMbL8;Z&qZsVh9UI%>f(~KtT4GgbnW&`d_&Jb zY@p@0U>D3dMJ|KuWO40=XwA0Z4Qk)S-NZTt03{jXuy+CsgaS_wpwjda?Oo#gS*&|2 zK8aT3FwmB<2A+gET#M(Q01Eo59V6eu_n~e$Ms~BE?g5C@fcNR0BSDY!#q1Vin&My6 z!ZY~D*c&et{Bx6s0M0>ar(Qnc{*ku9KB&uc%vu7^i*0uVKXGnF(ZqVe>^~ig-f;gZ z$u;s+6g34V;94;Yd@wih2BT5iSzHtxR6NJ0Pb?n1Pkxw=Wd3Dr2xl0P$SV?u+7`pn z`pIzkjMf%pc7rag@a3@P*)^ST!G!-}zTM9K(QQ$WpQXD$%5(K{(4DT9p8Zj{TDtqA z@Oz9PhXH66VL$bW^26g_dBm0J<=HXc6UL4B_@(f(d>MY0Akgh=b#NECOm*#n9Z{m2Uc zRX(_4fVFD=@$x}u7;fCWvR1X(@3K~GQ4O>A-Z=?C9gOXHH~=O5F=xSi=EJneK=X|H zI2^wW`ADZs2HW!6*ur_cdxO0PZld)YQC$&Am)L*9l^<61v$;u&z6H;>mY?MXIyi-= zlEZ_+9d&d4XQNX`)ocbN{^+>ek>m2L(76DyJ_nzN#^p*CHBYGZw7vUI;15eVv=CZ5 z@d|sda^G~PW>TAfvj$djKKv?sB|S{RdXhA=Vw#=wox;blKX0Ea>aFe{qg;1&VTL#5=0HVgy#X zJoMZMtU1@Bad+oXT`2x!dTIuA5{o`4E#@9dvsI1#l{0 z3{vfZk!YI`m2hW!ng5IoFw>W<<){f4r=zxQtZk+ow)fTH8fT`5`9(YBDX(E@Gb?Ui zNev+Nj$JTZeD0vbNY|1FW)lGFs8s{Lt2c zL*GJfh_)I(+RCFT!485uh9UP3H<^mtSAb>#DcHpdY$#kmZ>?yso%I{9u>Y)mjBmty zd<@V}7tkH%gRq_WF__;F`Rz|9p$4RvAJy6hk_#UyFJZ9YV}>yD*{hxZB#)t2-oP6{ z%Nw|3Afyy}>$l^8_DpoZ$eZJUS|x8z0K9g))zX1-Bf3sh^aXZ26BF@3EBtx94y_qL z{#8djq6ZtAv){H_j>68o*}Sb;AG>)#@mv;M&mOo1t(FUAqY@#SWFzikyDgZ7y-A5j z5F6{GXahx`1qg;&VKQUVw>~9bn|<-Y^h1II0z(MUSwZJ13%dm(W{0*M0`w zoCO~ZAB#YAsm&(_0Z?>11HTMK=C>8k<=YN>=Mh}bpaccinO5X*B0mmcbEfRjD`E47 z8b?TWe{^#0$jN!L;jT9z)HVQn5z2c2bp9-qg(vutx;NG&lkkIz$ctQ?#b(R|O~>E+26z#y1ImvN z!8K5t4@6`dY83NX_~mL8z{Kd%87iD>}2vO(t6@aq_cs;9AP1aeS< zs}AMu4{h;GAY%?e(X4o#VoW@aKQsBmZbXaTjpzhl!o0*O=xzLE4jDyC5LS7`D!Q_T z#9i^iP2@_oiC*8P9as@$PD8Yb5Dg=CC9%?Ng9b6;!jmsoJXm0d-bK&S)%EP_EBXF#D zRQ=ds``DVy(AwN9u3Uq|W$%R`Ar6jKtdQ~n_hRO^4lF=lM8oRAkyD@Ea^9&yv$nW}#y`k$5@%x7o z73hCbe>onUKOo*$^F`|TL`NU!@xGDc-D1XDhC45M{#>ja^M#!_fZEb*bI@*$8MiL7bn6{<>ApIs6OI!*q9-RgB|~cRN_**BII0hdmNEe2J%RdI;Jps5C4o`UKII$^c&RGyhnJEa*bxmhF{4!Q z*jV`v%}yu*vdoC@gtZj4#{zGpuSN=8fofvqIFz^JmRBvQFhRK z@Zu?pKlA_Cdl&eqs%!CohD;&K=md!xHEOC6iJ%2VC4ia$0|>?jA&QTv*D5}06=eoc z2?Qt691o*WvC@{_Ql%A@wy{#7N;Nzrps0XVdH6u3dd6VI8W9ki-*@eO&Y5RIsMve| z|64vEGBfAw$J%>6_S$Q$z4py|y1Kpq9 zgIG7Tebzn>daZP$%m{r*_TzT(DdqYH=Lc$hOqN~uY6X$xNDI{bgzt5{SBH$VZR-;0 z=;jEHJ={7caMw|&S8%3zXaiXp$V1ktF4$lOx0~fH(UIPPBX$~P^Cx#PN9?IxJ?$7p zA=@?OC^YoK{y|}(`Eq8qtRWJd=dJT|@5X!{HykczYt=eR^n~-K>N7^CHD4knV|&x#4PH%=SLY}tr$HpO9;LM_7N@EHfj#$F3Q-Q zyov7@f^$iH$*61Z$re=bOQ^Z_FZ_Zo42B*XEh?a+PXzOJlpNG4P&p>6Jm_T*(Kn!JaTYTY`<{l^jR%G) zDCx1DoaEZqek=0>?a`=*-4R=U1;E3N#|0ZiPro0StE=vjQ3PsM$#6;vxw()gn*c+m zof~k3qq7t6HH!AliW=}$T+tACU|IjQfjb|Tx|KD>m0VQ&zR))KoYLZ*Gz!K`V9h=> z>416lKmjwGsK6eI&_1CFVN>LREeo8Iw_^vUqyQS4B&aFhgW`et6}kiu$n+mh@p}eU>zBFzM`5t zN#`Mqs;f-S(8z5PPA?uvIU3x?)QBA8ejjs)Uj}3jkqNYxvLQrY>TCw{i7r&tYx{$u zXi)gUEGux@nSvD)BuG2K`LUmZZXtj`&333!D6R|{DfU^}if}2S5b6+y6RGmUv77m( z>Hi3q{;4a6fCdPom&yBz*@C><&!8BgxY*;8d_?=h$*1lNh%JreV3iAqnu1I>IwbN= ziK?5Z;EF0Jwu0X}bT$xq9DoDQbn3ev*@YQ0P*W-|Rowfvj?}9YD1zKBvYs*Q@Rb+9 z0#eH6?BDQO!;^GkJobWw6WL`XhFx*6U&B4`hpoj68DmQA10^6!grV7jC%2Y-8FVk1-_X(wax-@OtmQv)s1~5=N zhp%dxL(+4`nO}~)ut!(ubmfmt`!N_ZUnbCs4^*eW_|y4$RlM;yi=9QC41kal#PKkQWQ7Du za;pdBA@#&UF7*7eP30*-?PLm*fD+nf8Zz|pB=8`R91)WsmwFNb6SE|A1*gNZn^{;Z z5s8iF7@P6VVdOT!E~J#RKJ3JCX6rjjde4y-oP$nIp+|3WXz|A~GSO1PN6EMH0+!F3 za^^!Sqt$w2Ph@J~DyM-!O%}u^RmT<7ZVuEODpM)Hda_k~F4kGMl8q9%nDefd!Y6Lfj@~w z4ohbdpA<@><>oEYR=zX1!v4VWu@Hwnz@GL1IacQm@cjBDOsUD1q%xw$l(dk#FP2R| zC@q27O6kznGXgd5@+)>9ej_k<(k7h)%OyB=e8{9Dy`+xt}=l{n3Z^-`G{~aM{_|N`NZPoV2{_nc)c>hQH z`(yuia)I864s|05+r+WwDc3Hv|eKl{J`Tl+ukDIMJZMUr+E zvCR9wD;-+=SNDHT1N*%Hqhbg5e<=g`uJ(Tlp#8M}a|YM3{okEQnEGz_f4fAar0)M} zGwlB;=coN<%rnXsL@Rbi%NEA{n0LxPw&JgNFz>Hq2g?TdnzspB zu@0?aUMljVgKsqAPRx?CNiSFS1)J>@$AE;>S%;8D73UvL%j&B6;;GCdBaci9#y~YC zm?J83`IgOWVUrf`Ese|6u^Y#Nf?0k6_IbWocX52eENj7=OK_GXfGNehU<7$BLveaH zg9~WDEECg{)VJQ_)W77N#i8uM$-!`HS5L{IfOP^FGx5d*LaYKbJP%Uf^4$DE-cY{y zdL*wakEmCkKVx^j#4pv(Q_mI%$k<}}5Q`=~TA%eJl(ekHJk($Q%FVUw!voCHJ<)P} zea7fL(*}xDm_nQG6w;DWt`?-*_BiXw_pw|QV0+N|n=(Ue4=gR+!)4_!MuT5OVlpdM z?pK-!|7eyqIKykW3c-;KW6fn^&jc!gv5Y}20DIn50;@Zz4HBQ{2j18y3TuOjS-~7M z&|P$7i*)zm4v(jtw)svyinUtD0l%_;M7D7~P+qiRp;6WlE!!C4NL$OT%ljxe%p zLSz~sG$BF|SSXXiwnc{9V^@|(W6vzx4g!l45jem`;1LWXjz9;0&F_)p#B}`$N%$j% zzs1Ji*e^Byo_6LN3k&m&$5+jF1+P=)`;XQ3d}oR`@CTFQ4G#N>wm1ERN}1vfz8oO- zrdd#i9dEF3Ftk%%7#%kV(FXai4Bn5ozDCCzhy&!I;Qj5#8=OkQ6cukUudR54YMh3& z-hRA6GcNUv_NKwqhRtZ8DL50(!}InaX56{*)r~h0_9x!pY_dSC3_idJX6tx^`&GO_ zJ^riUOgr9SGLBX!-k?wOD>sWZH&QhdYw0X8*NTA?|GgA)lT;lm4#ct?i7t?rYkBFO zpdg0KgZ)~90c!8yyN)+FS6O~%VjorU1`_sb1ZS#v1F`BdoW={p?%ANznh+oBcGf+y zv(OLRj(*Pwl_zo?Uu-aYP&Qt(r_`+A_OgcY_2Y{f;p=n2#sQXGLdt`GjA>6rAGSbSV_X&zv!wW;@b$IJD#3L21{VT!bCR}=Z~xAW1c z_=vM?NSP(vf8u3ys$Pu4!aZeiDD64vM zeP4cn4B!C)o%GfGz($_xeHVPE_}`l^QhJ?PR##l+_}`nPc4eJ%LoUUgCdP}s_}{l4 zm27_*L~MtUtq4{fi-XWn0R_8TgwyfAKak{q|BODxq+*wv_lfGZ4g1SoyzRLCWeU=> zef!H?<$nkHN&fe04BLtJmwCzl_tNhr+h2rst^=iM{`Z}%^l|&kBxWJOzXhR{6e3S* zpRmcUM5IgYd5{Bs&U%UeSgIU8%5NCHRggaUM%WhX{WW5}zYr$1?R<|=kV?dPghp0Z z-R}wc24#gxbbQA{ypwKI{W{GRwq75oxdjNIH)263EA<04Re&M9ARz+tg#olHBo4pu zeP6hkb5jy6@QzT6NQ4H-tE3W0sq<7lD5Bzr1_)~p7b#FNr&wZDMziPL#c+&{KMmay$OTs<^gN;otGY8xr%z^A9NMsDMRw{glH3{^j2?W$rW|F2I)M$V}U7N9_tX zCZKj4Z(aN&R0)G1M#$Fxl6|C7$)2xWi5+Yd0!!{-O}v8-`0D7FN@&O4$Xd~ITL z4{Mt8$DW~FuZo&qOJLf%-Grv))CK2=c5n%-yL}o%jZYhdB6Kqbwn~jZia95lOH`uvkv_v`*az5>`T0?arx+w=kmQ<`>M%!i5mklvqMua^SgSJF^2%nyq@IQdaQ`pE8OWGSU2b};3U$|#k( zjyy`5HziAmD-&ePx~5jLJMCZPg%T&w6FL%ck2dO!{X^meaDty%E*73yL?xTub&$6m zTibd88(Jk~uNG3*l=UNOIch@L?VSX*x=lrb=khiM-n&J5q{92f`7XRCf*Ymq6-qe5 zT~Lzx)mwg*({^m4JYw>a1658yn5*SdE~SxSOkfH?t2w4%{J>6u+FdepYVDL29;LR9 z^TZ6pf&Kp5Qepo9SH6x{xJM#6O6WkxE8GSEPQ1bz3dOGD0Yg&ZI&9GA6_4u^s6CAG zv1x+nlAaQ;;I-k}z);Ofu~)%)V*<6`=ee3oLctY{O(Xz2CF?B<@;ZAaZv!DFGvY-6Lxk|2n+x_IM zgQS^wJa^ms$tOM%s^8mwa_rk87uxdYpTXOX?eB=WmsEa$t2-``G`o{p2r(yX)$I_LKj|_LIK~+PL4Vzq*!HD0M%1i>yrUe)8oT z{`Kb6^}k?0xllQb{?g;Ry6eb3?VDi$7OUnuyq~<}h6EIS=ljXG$ybuL zpFH#G^!?=16wI)n++Xnu|AX-mV`gltQ8t`xql|-!IJ8&jQ{AhMV^>VZv(jne(EckX z2aZ4)Wox2k3zW^7!-R7sIAZ5jOcz(cs+%A=YAE&^D{?f!5fubS%yz;PY(EhJ4%yb1 zYh|;mgCpj4z~L?Dhp|2@Lp|0d0k>?PzCz6^A~=HEf{fr6T;Ci61}Y4bTXFD@@4Nnh zWyDGt6`ULc+A12mk`%nWi92PR)NRLlMsjjOd4jz z#WHzL{KG2=@eglm@_Sa9N*0=x#4F5~c!g2Qe|{*h@t@0}90c4-KPq0qiFZjuZ@w5k z6goljy6GTUV^~m)(aAyY5j50R_=3juiLVJZb@;-!z-BdQwJs%uAsL(V1e^90D~uWy z^R1!R?KP-j^oHc1hJK0IINip^&?^NS^B@~R#rS&5d=F&YA;?hY=aTU8ay*`)=C2wb zi*0y<;76qrzDY0u4G~=u>+hB>%4^1};*V+*K0kRL7 zS0w4R96byNEb(7Ow&mLJS&wy1{24dC>GMM~w#`=JCdVk7qq0RfNhDSbRPi&5BSML@ z6#>p7*Myx{f-sf)xJ1AV=CYHQgc3Zs7qBHEOeJ&h?3dVAyjtzTQ>?lLqVT8A_|ssgiU;G zziSqGq=bybbIn6e9V)zOd)3c>S-nmV=X#MrrG!ceiSkT`N(JXCVFpNywIJ{f#%IFT zW{YGdRakHqpF|GjYJid>)x_Oomdy!OSPi)NIkl?AALJlXq^w1O)TMGb7gc1 z;a?h39sU(NN?1Hu-UjZwULFQNvtyR#vPeN%u`xVVY`#QBq|VhH!CAaer$AS5q0Y*E zCL^e)e7TJ3BFIwujt7tZ?NVWWP5)z}mE=!ZC{sc>Tv@JB`PXP=LJZ;p%?3X;Z8l)Z zt*a}mS0QC{C7DtkjS&Vgw=VcAjc_s?G{|3+@@i}O(I0|th#lGGt25gFXOXenNevYCN<^)*)@E^zKrbEKcZC5e7G z5J$bp2k^y2%~XvkB|vgKI69345ZFPNpOA0btXz;)Ia89-L5p}H$N7!QYI7V}{Ynlo zemNEJjM^#uRqkBUQ%vbffQnV$Bt2{s6=p2*r*eS^S+k;=Uw%{9x(vDTkkn*6B7UtU zYaq3XZ8F7!37MR72n{)qlt_CO%)tDjwdMsa#=4@V#cKn1p9RK=Q1wYk1|s81n4Qfs zI}�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

    7RoACpa*lv-<8)jV3oz2g-0F-0g* zQ>~JY((;w~G7qO;#3rMu4yD+u9!Y9PM71bQJMwZBPA%B&VBGYk9XK;n4T)AB*!gk5<1DqZ<@{C8iF(EZ81m)ckyp8pjU1{WM?@;YJI5EQKjZ-;60P{+<5`RDVnCts zn4*3+)Pz(2Ueo4eG5+9mo-CCoqX-8Sa{Fr9XNzhjl!eb`Hal_4IR?=TN-N zVX0A(F2yR$U;VPM(KZKSm}1x;aC@o+8$JF;v15CP3pPCREZDmEVN@*iP|X*Ixzwq; zzRT71hhTq{A2h+tS8cA_QC{LLb@mCg7PRUN2{!NN};4& z%j07(6k-=3SG5kBDJi5vuUUZ!UnFLz+%7k_?A1`sN_|Tof0-m`C@SJ4P$IrsN|^n; zgwKyNK3u^D4-Quk8pQib{t+ymhra*CHbI}ezr@6tYc2xjry$^7B$UCc2#99FG@%ezF3uTpK2Q;Bj{6c(LA>m;Gj~<(HvUkySd8i~WKE`>faLs4tJ0@cHV@Rto!*$x_n>N*%Wkqlc;m1T ziwJ0^tWchHN8)pQ4?w#8oN=MNcv)hVA$WLU;==+wboUy7`yV?e4@tPVIoFJG`{Z-EhpQtItbpMCI6SFjoqSgcQIvvQ2a{+R!3nblY z6kh`_9|iPEU>u48;lt#KLID0wPw8P!>AjOn16{65ZP+eUqn*mNQ-W0pL7Ul|+VvO* z=;Kn1Y?Kw1zpB+s9n(p$ie}h&)QnA2puylgjuvcYAA#&HWoJRPUFYKU9^R_oW7R`Z zHGaCQ5Drzk;h)DspTCDfQ0+F0aU9WI=vo$PMWGrsW`Tts)x^h5XeCN&UN@t>3|5|^X!uOrsPVenwh;}H^;_}FLPtMp?7$WZde+d304VkYcvY1y(kfifN=e}ML|_ZS z4c2Dm-+phvRRf%~EE6CUEwGSWLk!Qw)UZNLs3Dns8!CBw;TGAW4%g_pH&nu@xS^7_ zC%&rR>4`X0!g;x&lDBuh#&+0c|>v??FS^sA!}$hVXJxR(&X z`3>*MlA`NX+Gbr;_N}F@Zjf|Zo!&>^ikq{|4V6XS-TF;FZr)w4Z-%&UhPrREaAN~t zR>g&X(slB1^LeYjVcM|EU)DE;?i;2Jv)_!u&7#e^*cjZ*dqw9E(^68Pse29qp%AR; zBpxJ)&|IXHo5;fw5gIbr5t^a8m(Rs73w{2G?qz(t&;^F`hHho+bzji0zy@^taI`YV z+*$!#1Oz2BPV3tqtU}qZ(GhFoM9QHR*UAtWD1Qn=? zAkJEK4qG54ANu__JaTp=I*FlfI~4HWvirzcx}(s$kDS@*h1TIDNbgRM?>=(Yhhw7y z%61<)>!oCw!MOX#8KUy&>uj}lA31{^3Imq5L2S%}unGQ6j+_ZX!-&wo$B{F^XW!q+ zxuCurIg@&?t_B^wIC3V1A7tU}966JM)hxK3BWF^uAK2K7BTKzIawZV>1|$B9j+~tY z%Ub#e%b@@EBWKcoXZ`lytN%_^jNic{XA+2=8J{c5jW2QZY&`*Zj-IXW)zPzquwsMf z9w*b4`xB97^|SWjITPgJEQ9C&U!EfZhZpz4xmX-1zo$QpkYw>#XC5aJzQc&`V_B&`V_B(EStm(B=NIZ|MH9Z|E`_&?T-c+pFVp$IO@} z?ii5JgFB{G4tO9$u0<}877q?k9QnYBv?gBkB0t`DwfME&XZ$k9BSDKm87=$q0H^#i zxY)j5rcr9b2~%$^h2uBTK~s?f|f=*E1m_8KwnX|b}$)l<1A*y69C_o;D}zO zK86Q4AsKHiJV@@uZ*2n0cJ}2X?b>~{EO_ys;C*yU$N1G{gt)))J%RY^@ zLweKZT636QhS8mVl4y29c9POXn_O#(=`zdomFWk&lkxVJ>3ztxwzK$c=UVH5-(?s; zJ0}^hbYBy?Z+m8Quaof##Fv3!db7Dj=US`pDH(6Q=aBQ);IS0vV-#r->@2yihr2Wx z?^6(5>knf5?4)G8!lj2-{Cjap8K*lp8E?JXHCG?{z{hRXP8iOUc1T<`EYbBN=!su1 z`Y!%$DZ)5QY)qkuKO||@q{uocBGx8CEZS8tN>&gF?PVfRCI@B?l{5htPLf{+w&6ii zs^A3dki2%M<(cKagRuuMM!*vh*m=-tCnap%?2UXY;M)Y-e)#o2UG{^0L;Ha@v{o?t ziq++^1uia4v;~Z*^B}UX^bx+<$#uccaKks>a)C*U%{cTr&c~86YZ8#eGn$m+aVanG z+-Du5USMBnn9o-zTks#DhSW!-K0x@Z|85@S@B<*#n{aE}1`PH#kZT^u5CBm;iZ~nE z6I6A!?Yoqwo4<-Fq9ZDtiAHL`De>ARs>F}v5mM|RzF`&MVds`%BN70RhkI6Y0lqJ! z%*GR>T4#^dT&-QLtMyX|kPF+ky)L1Kj0-Vbc*<;PDrVx~x|_az9PA4<_WX{Fi@yDx z5?@@b=(`goXmR&Mp9^r^B9RpwWbK(YS4+36DzYElE4r9Nfm^u4a(onoGDHc9z|1>> zZJY2s&n_cH88w2@A}Iheeeu&Y6d$??P>>-|_J!NuGfd=zN?Oo7B+SnhIlxUE6gXmCU20{WFeCN)bHLIa0>!wkK_{q8KN9C6_6y@GfcG>iXqP)UO zXU=FS%D;ZrWj8bw72I&u%ivWB9-8T@sf}TR8#3+fB$eS|&2a?9M4U%m?^V~!hH~u2VVi@&K<>o=MtsZb%A7!_G8Cu787~d7_v;9^46l1VEd;Xyu%~j3lGhEEy z6XSAGe-w?M%!bBUILeC`Imlh2F6QqY?B2s)wGWC|ICA7WaZ)A2+b#sO6N}}NquQ!x z#|pd7V~zwylaSgIcvE(eh8w#9vS+E&}$t+ z$K!aTV)I-yZOtOK6`h&$M}cpq+7l>FjnU*(%eAWoSZyr+MC25Pgpx3H7II3Rb@LE> zQSq@rhY&EDR}4_m_m^olg^bKHR#;)T+~D~PAi@I_u2Jdfv{-?fSvtJeGCelqlOzTPW_AR`gfzg zRpSN1IQ*z{#;ZrqoV-GWdttII*z%)H)+R4E{*5O5;;DDge8UJ?t2qTCIg6Bf( zdAs-?HEv&wQi{hx_vtH2(a(P+UXzBROva?1qzPl) z4`fV!Btmo$x{6m>W%>FlvusbfI3AQBW4B$kU2%8Po4mO3=*L07Qdq?7#h=-a8-T|I!hU|(2-ZCvJ zF_0Fc`;qpTc{9Wz`dPdI?9_<(ZLy zQ%t;t(4Gksuk_v{&!YGChW`vjNvQNard=pznRbWCw7XdDGUxBbY4;qM7}g(wy_$K) z<5p(gE7gUbdH3f$bvPdBnRg&&VmDGTb*@iSpTT|09Y45@;PuRjz;hLl}= zh0i(?@sEl;iZB=Q47A4SUGX}0B7+9RxC+TawatgXLj7>2^AO`*Km397kg5Pd;t_bYjq~@)%YaGN%*zXbSI%WKX2ST(y{YhWAe%P}W}h2pT6RNbUVoF%x*6<2 zi;-N|ol(^azk0;wG_jok9L(!B)wKKdFxTr=g^&C79(avG7K2o0lwXVYdNgH}LCSbj zfH(c;oTG2VGsoz){!Rt!7KTE%Xk0I{%}J_c8BiNy6U%T%@@JBLO>ri2TM zi2vzS868THYphJlVntWxe4fyu+)%Q;CX=+e`DwH{hHW+jXe6-72$!;!1a$GfqHQ*j z5oIHR%_d-DV0x`3fmuzMQ6S*(tlu1bw_G#Fu4<-hWh6<}Gf=h0TFFsC=_ci3A`J)n zN#=|)k)+-rHaP>;NG7Ne?i4uOc_?6WM-&p+RFLDd+ECJN16BoFgAp|vP_|=4Nvq2@ zpw*8Ro+2h?v?XIM?szRHsdNP@Da&i`^!RR@VB;$@x578BnONv*!C24Ah>;euiPl9x zi+bI$P8y1g6{3T88$7tLd5_`>v*gV*Bt5VsA-^%*!x0nKrf zXgg=U2(^%N@pWAODn7O7kLj zvmJ_F55vPKyWcJ}yJOg`1YTo2)elWoz0FnqTDv+^6QFe*r=)YHhq(FgFX$+P0&b}8 z!l_`=7FpVjE1~3ZJ_x=1;cp}I79v2SiiCWIGryQ1tFT7#*)L(Ah?uYpibkrJ@t`qE z7veKvm@cM;0|l3dsvpJEaP?~bT`GTz^G0k8J@0?0G&hpFlqdjed>aJHf+7mJBX=BV zzmUWAUCx7pyWoHvt1=fJ$ZX7O;AfnpcW$Wlmw02_Vq5pq^Z~ z(D?|me5{r#1dlOPI5>cg3?PM-VZ}P2BVCR*F`o<(C7;X3*^oP&-m5eG=rk}e^f0Uszw1S>8S?)49#+}GTztT&kp3)ia(%GifqdaAj zTE$zRwU?(%QmcZQg@UTp*Ky_0n$)V4e!^2Gi67GH&pl-lTJ0}9i_exO<1^E?r$_i% zPJx8R`U_*3o<9xebxXObC6!h{MC9BB9V-=zOh8%>0J5Q5+YpEne|+YXa{tg3FtqTy z?_Kx}tml`pcal3y8`B2v_X$_)W3-0H>)FgF z%Q7+fFEejWk)D&r4k@NRzQnv4@4V@cH^83NkB5D&HX+o80~VI~!5BXHg`~R6Ao>~2 zALDB)?eRg_*;K7A8yU!xXF~s!aPcxp>G<*cv^UpEt+i^Mum%}x!-2Jo&|Iza3tBG` zi{d3xcQRRl`~l% zLx1I>cUi^Sia%boi#6KshhEavZ@UU_+BZbIp z7~8F2Bk5m8_QZs3F~znvVViu1r6pXt0tiNOGr8`2NYy~dYb3v#I6)_6Y=CMj#D@Vu z#1NcW#t*u1C4OMBbJ>AKT?c-k#<&&{tqSDO_1FmC)=Z4BbHl&R7af)fXWLaQgk*Ak z2VxBkE&CL!c2t1B6#`RKzdk z*j*m1Snex3BUrJ*hd?M!2{_e5Z3Y6C-}Q0D^3aClcgJriFGzmM8mNrAfV(VMu}pM= zv~|j2r4v>;I$@gD3D!MWx2PEcs{g*cp@3v5(nM~;Usvebj){bc*kgX z9^JBp;O_S@1{@CuY9!WLE+y=`Md;j99<(5Hh@o$Br20y9CdCZ{E=#E-q4oBO zP)XI(T`!eZl9xZiOC_4I`;mhn6j&4vEK(weLw{KtkZefSk0HCaJ}m08bpnANCaBqIe5rktr20E5{|G1mrkoPZC0uASt;Kd zs{%8s=c1(150j~?Bcx5>i0VPoyzsqzj8!a?$u6>S3t5OdwTBAW|id zVo7Vz)eV95lp}>LbhEVz)`X|c)atIC9fDrO4+f2}{DdP@sJli&w=M+GU`2h#ywW7l z$|Z#vL;lNvPjn*m*w9`vt)n@HvNp^?%1+|fH{GCw2}72{I2 zFi4*m$N`P_Vi)kk(*suvYcs8|Z>779s9+KhrdIzj)g*xUpHTJn((mh`deuB|1eCj) z2Sj=~zM74+H7jWY36N&ihAyQh+AF+NzyucCLoOUqfLkJC_A%G3ks$v3m{cJBl=}=Mnba3i=yI7_ zRv-_I)Zl!AXxz2z#`vW$2a@NLHA(Zy8ZvNo924&v%mCHb%HUefDP;|(l-1#-e8gF0 z4Q7?q5VbX91FL5>2VuXU3C=1@sS2SLe{cu2V&j5(&L}^;KrJ6I!7RZo#|kuZi;Nir z`+*~nmpsgH4G82wfr!k_@C7~qE~>S)jNTSP{zZnYtyj`bJBD*Qo*j0pQs*u9^pI2K znigi>WTu6q#Z;6!^G?CEfVwreb9!hDRy6u-crR5a!TXg9-oZA!Hyyl=AUx0X&`9v} z03P)5@&lyG5tF!HDeSKqh22S2T}yj07T?=WG93daz=~A{=zd_0ruS|iX8|Fj@KmB- z3kV42zX7VN31h{cW!CF;oLWW|uM$p+*2Pz4!qZlHRW2lt>7duSm2DSon00b27bYeA z>VcKw3hXc=x*3voh<>boFlXqu+Ex_{$fyK1T&x>@A0?Tt90uTq(9<5|pgVKO08kG( z6H=GqR7q$9h9Cx3Be}w9U%#7ra0*S@P5>4S3J+*^^JrPbZ{idbv8~ZM4g^@{YtWF` zm7NL0M;ny1B%uUo92d~!77f6aa2{+u{K(RpNGMDx1yC7O0a^rLCazUx;#&E<1OB1| zm%3)Ua#WE9l4VU&Pq8%7h50j_OHV;M#?W^dYtZ5(W?8G8h*+BlFAg|wQZxDBJY z6&%E8JX&cRMlp)1M`#<0@Gc2cc-t4$bJ)7f#MQVZO92>)3_Xic46UU`@mjfny|@P2 zjl-D?g81)+lP5qVSg~5{#Wl(H;%eB7t7$JLzEk#M;#06;wJqtZf)%U8zLT~F-J%BY zdRrmn)}^o)&nq{IVL!3&RuRwnNE0qgsFg5zgB2@9EeO>03lgE`&}uZ+XO0c65q2;q zI*&S7N#HX99NZ5FRCoHw(@A9 z@@NIa5$n{#A5=|a;5Dg!SwR#q!3Ux=@S4QHi-^5tP*+Mvs2{fVbI7Ay{`O?DXo)DD zwNyH5-AboMTbtGhvG&A{qil%Yfn0{~<)Z}EvsgY0gXtRbr&qIWR6UEu#C6pU1*$~A zY-kY&8uZB`>XRj+PmBr)2dY30n-1QS{K90)%vo*XXRW>{5*1Iz7U6)wj5 zBuYb&7wxnHd9i{fU@P3Mc|F^H+K<3RLIETWKlvC6_@QpaPfE4Fj%r^IUa0*=O6@Na z&jS8JgF_8N?Y|%<913a^PF5N;;Tn_Gem$D?x&-Q}OKNGt)zgII+6&VwHGe%de{Fav zA5r<&L;2%tL4kUF_mU=DBb0w5l|M{4QB^;$rt)uIP)}`dOgPDt4EZmTJjrIpL_*;> zoQVY?m>$?V&y_H3_|}K}A06a>^hMiwy*1_{zq>dpqgsBI~*tsZK!+a;Ed*t-Jw9C^=pw3w7)f85)KTHl;9)= z8t1VI+gs8N%>%84`PIg+D{=<%j&&)FQawc`uNjK3jTKsd zwHa!0uG~HyUmoXwB?R;p(wBGl_b)tD_m#iurC!jf>Zsw=%`c<1z`#*oM*CNy-!~CS zKe`5cg+UwmN_Qcgt+#rs+tFKFcTjJoYWgy*GEa7qo2W8%)8XRb!MY6pqXYbpK3Dff z!Gh<|tG+{?rzTCr=zr6Xj`G`Gs>a3$+7xOP%;@4t(BZ-zQRTb%QgOE*44LxnEC&_Ir2f1(F;?sTD}Fc8hRd!TM#AtepeuK%Wi>Joj*#Cj9KQ@BLM8%SxBewupVWl_pUBYe^>1ZUM>) zl{yQ&|IC4uUU@!?$S9X-l2W_;+0ic7?wEE_>ZYGjHw6R4oZGYW zqqT0cwHCZ;@D5UIeN!Y+wAPp%*INIHd~q#R{+qjhCzF|81s>w4z(TAKZ54>M9Sy9l z^r6&>LxD?0i(BPbI|gf^&ggX$V-u^&N#WA&x;M?&aRYZ-kdO;*F^THq-BhcOX4nD@?kN|Cy-rX;iz3E<5&Dsb zyaaxgU@efs0Sd&S7@>w7D537sLfy#+Qrc6rSzkT_L1krSsPW@>B3XOZb@#`nP-9*9!MY-j z!v;Q*wHVX_HxN`^35DMfs_U`t2XTWmL zyL+3{-fkh^J+^nNwB4HAo`n9LCopFzc|x~wfW3lK;A$z^Ea$;xDLL6*O75QVcH1|* z&AQzaePd|15x;xw@*lWlOYiU+iGaas6FDOzRIGfxuY^lS z$?YiHtwyKXXn8i;Jo9+cY{%AaIRA(E9DLVL{<1Y276^SZ;uo!rlJ1t8j6zW(Z?WEZb5%;|D=^$M+59mf13nK33f9y|A2 z^(H5`OkGE6uxW|2G>R%&6}egBeF@6kOz^&R)*8rUBV>1li#zl-Cfe59m@dN4?la-} zs3EJm^VH@ywtmquqa^HLG|n?yzX1mt0+R41exqx7p?2(XKqwOjggl$}SZw5kXJI?P zQ(j`FCVTxKmq#)Z@4@y$isqD?BYH{6o}>s(S6JUQFsuLcPhTha;V?;br=_EexRBTO5)IN6VJ8Upw=Y-3e&8(Gpbb{or88!J>BE7P~}Oapnf zLiff>_QrB=Z*(z|3cZo-ZJ|cButc@6EPV@?N()`m8%s2&mXV5@WGeRXwo#?pSftum zoW6~1&yotXf!PqN@pkR_#%P!?fEp7c!~$|fbVk?JMM+k=jh96R2=>ePLOlYTH8jWk3!DJmKz zGZ<-<99-$!d{7i&Cp&E^>nNT|YA{ktfXS5Z>1}ng-Rcx|g;uAkt26`mIMZrQc&XG8 z<}PI=wn~7>tq%0II#IO%{!UU?XthLLrD=5oCkuRZq!wMuI+|8iVygt0+-k13)p4o? zv|6OD(CP$rm8R86Y_*!Db+58GdzGNPz1pFBbuVw5qZNF#IYwQf&EwQnnl@XXCZ!$H zt5Qetmz78<0VY$rx3|@yss*$n1l^?O?_P%WU< zA?gaP7OJZ>t#)kCw4zs~j-r*7*eU^fS`7wrVMuo2|4#hhf&YgO3eL#O2v+3z{MGMu zGx#@Vk_@N|m_F*F(_FyTa4JY4w>}(u$b_V!}F_R#sxG1en~acS4WE zR12WBLtUZOPIZ;0)$d8GxzeiCQM9rWTP47RR(tI6gdy6d+6F#Rbp?Fd)m0jNo_b36 zIEEb_aEfL3YqqZiO>tGY_l>gm$z|7Y%N;G?XL^>;%80V5kR zR#a@GqJ}~(^im4~x*%Iq3vE!MRK-%O6kBPn?t)$kEN-G%muPDB7F*lW7Okze+7^K- z)dbTd+Smq7F_A>0M%;B%yJE!HqWqs{&N=VLeuR%+fB(x*v+sL8X6DS9Gc#w-$BP~Z zR;i=7z)HkQfSFj`E<#Iqoe)Kdjrby4}ROtqKFM zZc|Ud+Mu3tU|lR&(c{1>byQnfiC76R4eO9So@NRjQn*3SBkBqCY*J4-=y~=}y2oMQ zSx0k$l}HZ(rqP2QPjf3aC=9^5Q9S|c1L`RU){6zJax0{c;sPrXD*%HnJ2i8}%=^jU0Sx2{(m57x9GqGBSN@QYCSF11p>pJxWto7re6QB(Rif1|Gg>{(;aH_`gPyQ@0zK90DF;2f9tRg{SXw(AEKY}m zpt3t0X|C(F3O;ZK)e~^upq_Hz{D$CUX^oS`iIbq*IF0M-p2*Z)so(?WGW7(U*Qlo) zINy1U?PO_;EKh zR^o2-V&hAw2lx`|0ltKK=r@tYk_^{mc`-g)3im`@li$CGNM6;r{FQmhX>>e{FH&S4 za=R&2h?qoRJU(-S*&)Ie5{r-kLteH3g9$0Dm-{jiZtybPa2wtd zDkfFfgP542)y|10xwZFysja6=1km zb7})yu|BgEZtr0}LkhsbSO#z~mXQO;Pd1ZND!@>$IdvCttjomV_DSb6m;fA%WdH|b z898vAWpE(egSdtCcr9^+T{vuQP&Ue*pgg>f6O@!uD(XREvoamQMP%c=zFWg6l~|2! zQHk%Ey-~%9GvyJYYK=t|>{HerV-dkVH68hv%tA07`9N$GrX$_5rVGR6mFv7B4erL9 z$Og3O4c0VZl{F3M1vApagHs>XoQ6X#b(Gm;CGg_zVAg4XdjOc&2C!aZVZC-ptWRvR zMuOZ^tX%|FBGzS@SRHM43zdm+0Q(XP`;|jt_X~EBE(xtD0h7QBv0s*nJwvgW7zeN} zw6HE366-U6&~1iG$~wButVFC8lH>?^GjweAbDC2&S78G7a`gnOIZr)7+OzfZJi#ub zRzfVg&8$T11n3g`EDGC1JAiejh1EYK)}7e8B^nP-8SCgavl6jRlcdZx2L-!Z1)8V_ zuuoPv(dMb@DMyL~}pH-1NiEUgi; zI1v(*TMHZ41YZJB{s;UA^?>hIs3p!KOZ6xRWR!A18n}(AYFr*1kkjCR8HbArC?4mQ(a#HoGjLua4ozl%B$_$J&e$m-L zTj=GWE%b80uWXKB;O(fPhX;4g})`!Fnya_fmB4$`IXp#Z6`XF*O+OSd7&HNdz+K z?XTNs?P*xs-yj3f?btgnN5xTWF4n^F50qxCJ{EBzFp%gG4?tFNx0nvIMsP-_FOG9r zHf0Qvf;Q`a6F=0v5BpC$lVI+eY+LzQ5@Q!Fl|8_-3QqU zwPl}~7m-`?2bUM%cpbmd)&#Py2A zd$W;vfsl9riMGI}&!9rJ3d1^up*|ai)UU~eb(+ofWOHo>o52Fiq6avW#&A&%Gi;uE z$nczxlMRjVp=*?si@=Y}5O@{Hx46_9Til7@dODXLT}7)cyBNZ%8P(aEF+rLU*3GC! zGvrQYcT2cfZjhvl{iF0>1<#{F^;A;#s5sSG_DnqfD@*>x%hnDVi$kBuCsAA~ExQQ) z!xEu8GDN6DEUd*Gd_$r=HlK+u)%fU@7SVLOg+GsqAD@Nj;Uro*_Jn=M&y6yjVyS8oc<`ik$?Wu>dVRw zZI!ZkBdQC_aGAGR=NbvNi7jEwrn<&-q0)3{wNmI76EdSTS)G||#(AEQcmRd2#%LL0 zTCR;X@G`YIn+I{Tw&*QEF;|evVawRhxs8~;qf10IcXN$uc1digL&jLBQ)D&Njh~Di zNsI4ij~pl{Wx%Ho$sP(sT6s2gC6cE2p2%GPbK8f@z>dQg> z7eRg7=Ry7I@fP*v0*kr)6snW@UQPYun))LQ^$E4vT!^$9a5gZK$XEX7gZ)1nWEHC6 zfiBFQ>F0HMUV6VP(ErlYUCsPZ7jd(5$M~Btq&f2sizN9 z2YiFw6B>b!Op&7?v$1znfd{cjLj4?|Y9W{@xMqTliZEt>2j^xb+sV~((1|AHv%nvZ zG#}@AMV1^u?MwwcfOVA=5PA}iS~;?XJdYoL>5sw{?ko1)dY5GO!E6*P16*~BeM)Yd z!n%s=(5(%;h6*y^`+b`$U-NCA|C+k<2`{d(La%agI2J-k^I=sk_)jY5|0k7){U??4 z4!`n_!Nae6m^BkW6@Q+6b=VyRUJpC$%3#;wRzA#{3H3EDG&%n;sgCse4yR`FOxc`$ zsDq&%+q1lDt5Up4#drJJ2xg?~W36i*qf&`BK99pU^0j4ZJ!awa;Kfur0s-R^o)+~* z%f~H!qcxXH-|Rmoi@tftp>Mtb$5{+S;;+D~aFy~agVXd!^pdAija2~nfchxh#J~V9 zu4{*fGoc*{F;(luWE6)v@cp*b>gSVFOubT9J(#r|RXQCFTzQ_MfB}0joOJwV}=P8G!v-W#dj>iEY>o9|)j3G~Wbb@CVn6hHTRtB7t$iSHjeB&oo)39cR=9cg zv!v56W&AGb{Myl3q_fi@oevH-()o3{msv$n2Hn2;&6<2)^z&P#_R`&_3 zaJi{(Gj2CU;yCcX*ZZP6)q@BvvT$Xh$>}yZxWzHMJ^kph(C~irSZJX?dMq^MA3YY@ z{Er%oI0qj!l8?F_i3SOsW3&wasG9=w4hP|*$3h3@qsH=4qex6pUSLB!|D$h;?;}N# z{2DCiM~cDik8OKj`(u%&sp{6~NdH)6|4K3ciwq9;-THI-NBK1+y<@K4PlKnOvcgb7 z;#OuU|KwA9o&L#+R*5AI0){ubVobZYSNI(RP^7iF=8|8`iyQ(yNIg+aRV zV;WAypcCKldZ*(fvwQ*n6M)ATi$^^6>d~XGP8K}&;fbTKCV+~`_}k*23i>s4)!ahg zt!Hx{nO`&6*<4{oVGyRYICx=VoSB9e!L)|xtO3#^X9B@z@f`CbIWP2aqCo>sfq?}D zSfppEKg<|?bwUMc`Fg=;Q0d0xN>j}nVmVfOMOC{@Ra-p^lT=H;5uDZ3Z9Kh2Hy8nNloknGm+(~Ph24SOzPr0+wd=gpFv&2>yUWB{%LSsbiD`9 zK|P-Wzwt|G3PUxCA{z>Jj}i*WCKTaYUhquI51E#D8DkZGNbqCuL4pMdell3WYdjsW zPf^b^%kX@xdOl$So{vz^*L-sH)%A&cRUIpzt_V<9N(2@=WUnCZWiu6{Z{ctf{$v3Z6AJCr`$+rskM4NX;lkjbWOvrpb~i zLdUZBAM8=`$A0q1SG_?cF|@^~QBhsxUK86H18%Zu8>>Iq&x=LD!^U3B_3#XLyI~|| zM@K~l{|f;R!pN^#?`UM(5>Usf1RA{LyLg_Vp8s|uo^{KiSSTj1(fZsgdt@j`yIhqQq z8lfgnB8opiZ%KtUdaqR(GEA+}`_e)n&N6zhLSay*NAKE8U88qW1uA77y@-XenjXEE zE=IX5qxS;^+_3q5^d~Cm(YyR|R5GLYc~w%6!vDSuSs13N;KIlGIp+sP;kE_@gqOX7cxL|i8vMi`1#cl^c=dR^o_ND(YoayJR2KE< zj5Gd#^#P|{M{no9|Dl@uYt1_k6XK;Ufjy9*uizKctK`|S#RGNcdXd5V;CaO!J~CZb zz9#o=^tHoKiqQ$&g`Zj~5swv*v7$=agQPu}DgRVPLZoTDF}Gr@{1v9nPq^EBAKTn` zva8K)M_O%GQiaMn+x)U_^H&Bp?t)zkwl&il*SfciqYK#8ou5L7o|yQXLNKttBm)RH*evvbhb zn)Sb``e1)uO|>KQTsw0eGGleD>F#!DygF6^!?Fp(Tiy)HmN+Oo%c5+NP{yW{@0y~c zFPGk(SSMYJj7&jT#~SE?8R!mh;<>$~~OvM!oJ)DKRSz)u5S?<8;gP@qEwv}RBL zb-x9B);4iqU5as5Utbx0eQkeS7*i-6!v#lwQQh5>fP@1EmkLEo#`8P!1F`T{NTnIl zx`2pa`)kUyJ&#{D>AF21qH9Gzo_+)a!vh87sLEEOXQb7IC**mY$TeDSa(1JI4soK@ z1+t=D^Mcnbv2yxY&;(>M7)BXWRgC18Fw;x#6Ys7i+=iDQ>lc3!JB3vZxqK&xP58I14OCoi!|-h(4cryoMrvLG*mCajf6e+EyNC^#n}a63RUu<-7H_miCPigLg!R`8Cu z;R#`%J!C*FWx|_uK>67LNhgmjzf=P`ja2?V>A}V=9j=;;jmRP%~ouF5q|Q;Ah@T|(nfyxYoAirvdT9YtDi@U z5!e^4ua$?vShxZYbi0wZ4v&s$xY!?UW#C)DRLAOB8V}L>CHet;{Bl2oamZA_2Mq9( z4IF6%E~4&O`;$dTCx!cBhOlV;Wr6`TE1W1s5EDS^ph7Qzz??c=2hj$0K})zE<-Y!) zwkLPtw$5> zw5clP332Wo^R)O&xE8CQ$6jfkVQ3vDT_a7w{ekPH8#d4)O(!ZM!Zbir3#25Xu3l$F zrFsr7oA%gzL}OW9cL;f>8i5&$1Zh-@(8KlnCEVH~*c2`lWnJ3h3y>=lH$#>MCM1z2 zDM&>u2yEwphI^OxRNm2^N^8PQNLe*&&qmRI$ZH9+XCF5&?AdSqX7trL8ZSOe#vr&C zl^{;BFr`@!f(>{~9|WrVZnC<}pHF9l_QKJ3En$M&oy0C9Orpbtga2GI&!LP_6{#xn zto|ZwtB4H?!jCth@S6dZq40rNy&|tj%Yu4CGAlsKb0k1S_$Ksgd3gjc!AFV}Z+UI?qK9=IqToN_I)U@wP(w%&;2c60m685JPBOqg z@&eLx9=XWwB$;hMshK|wiLtOBiI`~U$%8dDmHF{CR5}#^mx70kK#Z6B>G+Hr^Vpeq z9LGmJXJ(hdK|?Fz#9NK66IiszHZkm8lUZyM^VK+RU#+|C5f-cLi!Q9?=?ca=7J=6@ z0>!J=Ns<0&{QwAa${I%x!fclyf;L=2#L9_P@WT++30Z^Ezb@InTEV!_%AzInjj3}6!2J}s|vcE3SN-&>6 zHQ-V-2f-kY@MUSZz6o5QiRGt*Lg{T@Dml3>@Qy<)#zVOP)+p(jgb#1N&4G7j?hoZ9 z^O7CzvV%ZnmwgRys%&sKh*%zB7oSl;Tu8pHk<2_Qn7&K4PYZyzUkTgQPkWW@Jha=rw_*#u_)s z<4#k$Y{gVV91lw%b<$|fj!Qs{LJvBYM(as}c^|+#k%*#69;vj{@cP6KY?zBQneEqB zh`g8=bespKvVO(*n7>q1gchBzstn&|e_3^dSZ25$wP6U96dxD!kL4AsC&YfFhptS% zDOQ{=;ab)GJ5aFMUxvsC98w8S%pZ6h??q5TFA*W0aRW(O3_l0o8)m#CHYRo_NdhMeEq9j+eqj1`GcIm6 zRESxr5ad`ytDqkotB|&7TD`4Dy%?Kc7@a*fx?r3|BVygsk_oNHsoc`&g7MN$T-XC3 zMYRG6k(dfLKdLbJi?OdwUW=uRB8~ulUEn>(kgSx2RAXq)sSE6NWKMHso{S;-9(0x* zn!xj3JdbQ=dyBBM&9*t{cF>QsKp$2k`h?ix>DyOM;8R5rMo}L<2SaN`F;nO?Af-5= zZv93-7Rw@H-vs@&UJ%xp-lr?Sf__Dxu3Ui1E&gJw%gI-K{%5aL$j(?RJDsx-B#$g* z*#KMor3BsLAJ3mi(>T{^i1q~-nus)%LG{WgLP53&dN6z%>ToZ*h*_Ik%=S^t?m$pQ z#0;a@UyMN@C7*SdEPMkcuQDaUpvjTmd?@%zq7g$eKx|X6V}S&aQu<*?T9x9ahP>cJ zl(cQ_>43+AXXBTpcE4mIy0=MH7>x?7uXCtxld*`kr7)jlnS3~xa8RUvy~2Z1Pe>`I z{m@ElKw1(3AS_sgnNO9%XQq2S^={Jt{;u}8IIjtRrP$#!(-2oEq3V!UDF2JXB|PsH zcS+dxzME~r;4=y}gZngt)ih!sHIFsPF?j;T0|t^iS{n%S<0A|d@@px$Y8$g36*x^s z9}5)xlWg}IO>iSh#IPAtd(VYtBH0%cmz?7WX-m-b7Njjj{_ms!HdOXDVumMAInSm7i!iBKGgJB zSd9|3WK|5O+L*rzJseKd=I_!*%Blvu(gwU@{viThmj-w>&bcY)@f(m-p$`h(@LSgS z`EnMRf+nKdF$qf>x}9ktCt4s&G)Qf&31|`kWkA@Q1|jjHA?i6LfV%r}81Lg8Bw$3i ziJi}BjoqyP9Kz;qD--6;(Wk(=+?l|RvP7rTu2#-!4)|J0Wph$W;!0_mUYcUjeLU!H z!QmGW$!%#EXF_iv{;h^Z*i7v&_vyuyvxZ#b1Uu zc2kRg5*Xo0V&2A7JnB^SWQ!SsKc+J{iwG5~caAc?2XTf0;WJvUeoydo$ZYn{X0x09 z<$#E3aS2L(rBTns$KmC6^Dr|x0uQd{qha|K$ z;Zu7JR6#-W5uoTf1hMl4k%fL3q(b&d9nO(S<5Sf0;}R}A6GZ{RLX)Ar!g@Yi)O!OM zaJnTEaP`)5L=u2y%@3Js8gI-K%CYG#^MvTe4MO0O>D#Zv20J0+M38}Iy7o@h+W{-G z90twN`n&WfJ1LI$Ho3OTYS|w3Det^?uaxjk`o$jEEFCf z(E&_bnTuxxNmjcZpsB!16TejBe;r?dREn8%W2s0PiVTiejon26QvxP3ZWCz2Yh8V- zlxjjx$WkxT*c;Eiv48)JK$Efh2&)s65=Zn5b(H#%RcC=qMFkm5oT)pBQsJC(5zR!y@*|;?k+g0HfRK_7Uyha7ewoPUP zt+LP@r~i$MS2B4LOykLp4#Sg~Kp&}U@P;s`+oFMPZp7<_cttCFWg^naiAbxLsJi7) zO*aNfH@Ejm>CfmO4m|714jfdMLrPYC5BKeKK)rO#2sEtf$pnO^;fpKr2pWh+&IoMt ztxI8Y!sT!k1cO*W9rye0cpS+VTSWZZqxEDF#Ym5XcH8ezGZB-nL`BAj78{HYK(otF zP$SZJ2Ttt@9*zVc*CRnh;OO1CM}jDT%A&~jlGxmO^z%NR<_V6%GDmYb%zoCwf1q;S z^m5}e;T?r8lV%fNX^#AZgafv7(KRO=Lr{$b!*$6fjOq9!Qxfwt_p}ZP;_1WH>l9`(0p4djTS1fS;^-v2+r9^M{{XxU zj4n^&Vbv4b6-jKcV0{MX6oW@Xp8@V?#MgiuCP?H3wums;^GUG9l**&CW=aj?re}jG ziCL*BRp2a@Z%R=rlDY;SJ;{$HOQimIEnk*rB>lAiC8sDxAz&!19WFS}+!ehJ`=Ve8 z@_n~&13d2At@$S&gph-n0@ooLjUm8Jq1%Mcr@+p>hv(r#-%`z?pYA%{*#EP6oQpua z;EY@x`yHEh1)91RLwok`7&LECw;j;N(5O`SeD14*A<9HncH0O0lNTouEwGyg$l4y8 zSx}$W{}c5rXvbfT{=ZJ>&N+`~hfG3$76zwV&B+8m_DyAS4fyLU@J9=Hfnr3joYYwp zU0*d90RS8JAJaD9mOC3z1qb>XUmX_R;oL)qnID^|vK#73{)~ELxek5maHl_wlsBF= zEv-dY3!ZTb591bD@c613T~fGIk({`erQy2C!Zl9gs+cJlOQvtXewjSY{NHF}eHz|j z7T%4DbfXCI!KUCfXo|JWinA2@1u|Pm-A&p36W~#BzY4Dgg8M}+$HQEQednoei?qr; zF(%4~XjQ8m0Y}2*q=a7>!1}lHE9HQT!#Hf~)dzjVIwAHmH#7DF-$toTES1G|aBYWM z^NEi93|0&DLNj(6 zRl1I-*ooOgGtAc`h=3$CW2XU-3C-AvSpcQhRt<1d?#hweVUC9tZWp{o3+N23ZmxL7 z48r3?3v<;o%J2;yQqhW1YjSLO0HdW2#4|w|t+*I1lEq*p-2h*WI{6j13>S|rumo8p zMyOc5v&DS3X1|nrP=a9|r{EWNIW0wqA_UU>3*l))A!$VsWsJm5)oKcn`NZuCQp{hb zWL;ox>lBzFHT5_NFo_f;4bmT}0(!N?Vrv zeeca^YvbT2l*a6b7lgamAWqlpf_~IHn%vrD7TmFBjONm@ ze#dQnz0h*eK!={OC%=nP9#vnL#PnI_)$qG;kpgb`6MZQ2>~6WbO&x;6R2b{UNWc=e zS}BuRawigFmEDo;$QpyY2O_Wf^zE@o!(CxxMm|%E%f}dHjL!)4uDUge3nUQ==s;t1 z{HH@H5Q&%l^zSPEqvshHa>}s!7>l>=5Rm4oOmT551}?uCz~by3*v-#)z2^QAY&cju zSz*}0@+9f34Zrdttlb1B4e`lw)90=@iECD28QPm50Mkag$=IOOnP5yX*)ah5OIfOt)l66CFVTT9|q zg5h$hy7-n5D|?3s^>jKyJ=o8uA~Q|c_rl0bN+L5UI+2^lFf!97U+#@dkH;l4^LgBG z%hI?BrkhPj9&cB}m7T`8IRaImJ3D#AS57t*g)| zL~r^cflfezH-YGle6BRm%dihr7}z@xlJ2`>yU3vqYPq8~I+5Wx1eNfH1w<8&+k{sW zj@!hk4;2#9D8kLpF&wuEVM%G@g-EuQDaF`?er&07g@h2%DncDQcLFA3FeJV^{*3^T z*2Y1jji)&V2K-Z4Mn;}6z-~_fy|qhBbUwcC977`Xn1~2?ga_Fd#)+J+3OVV6a!W2? zO67nS2SkqG53SvfT_@)>zRGYP-2iMASlcL(!MU~Afs1c+=XqPPl|t?>7oLzI5AO70 z1tW!yz~y7Z;MuL&sJ4>zqaQ#R`eDF#2abm++iNkIs?IRE+h($O1z+1iCU+YqD+gQD z0}$3CQwN#K9PClov&mZP37B6v>{1!jb$r#ET329S;UIX3nkEL1lzk>eMe32_5q}Y7 zHcA#IFAWe6xD3!`GRfZqLBOLm!vT@{ghNsh^vG=v%K=S z4ylO?@D5Eax7-yoYOS^=YiIWfcP>Ui-EG{>td?&j0v9bBA3y$bUcHEoIasIR=3lnS zHQ}tM{e&l=nepMzKfo4CHIAz*fg{0SyiEp16E?6ia47>k@i`Y6DwqAH!M$ZPL1MHN zgj|V$R&s9@MyecrF>_6*TwM*Hl>yc9L{}EvjB+a6I>^uxE=3Z+1L=_P6KeOykY$or zL)kzm$1ZJ*7f86p@dm?L7-=kwT?QqhN-+l3`w8|1Z#>%_O^tji+Qm}avF(YA5EM24Z*0HgI&7C0vq9@rf3b1MYP8HqxPJ-RbOSq$8^3PG=7x{UqrQ(NI~tTQA`c ztpM-K!hxG!7Y>k3!LJC5^?sjH!6=Q>QNGDgm=tgf^AFyk9z*9-A42;n9V5yyD|y-I zV$W(-20)ztW{5DATFhTEBT%&BT2X0XZux;EiItszE978VidLvlpw5F!EW4lK-pEoE zw4yVoG1_i|cvNTrhlV)Hz_pXLH=r&$Fx7=Zb+++`>a>=Gyk2N-RWxJWY#5?%AUQ3c zbUR2^m83B_N!DdRvgPsd8g(osY0QdS8JN@Z(=e+_Lu1xuoS2KF#o76V&TYV$hLlur z<3IO<>-}ep){D{n(_b)EKb5&bJC~Q^NbXOWtJixmZg94M@c2(^!1PG5<6C4pd!q0; z2_+z@tDDm%xw<+bhypQ01J($&t}$$+%TJg`KVjjkGE6u#V$6hYgdayXAj2FEC$EeC~BM| zb(G<2-OL8JsR{W{UZ_v37wW<Ws$aczglQ$P^c^%rw% zv#(~YVG#}k+9#8?KBI&SRERsnJU(D7;y{Fcp~SGJQ)1dskwXY}GzhX-WLuj2 zef&`^&Q8+YH_cD$adR1XAk%s9V~IQ?_%%=r(23;`L38({`q~ICQT9|f+;}~_8krsQ9b1?q z@zt_)=1gp-fXL;ph^_66Ebq(X{i-Q7sg7=!%O>OAXAqkLMc!84D|$p==Tcs0i9HPn zs`R2KZ$J$+cU5!p+i56)k5^!1#kj+Xhxb>;y)V{{6Fi;3GqM#}KoFvteV!nqJT^XX zTJYVkeyi~LtUkOUUNRXx1%>&XSPNqV)a7c(S^akfb zQVy-_uhL!r*GG&#fv<~JqEmZao!TdzDmFXPw9x82qi-BK<{UQzMaO&}F-BpaH8tpt zR2h9U+g(9A?+Q~Po4#>%o=e}9yFp3k9czO!`i9ZmOodbV=OGnNDS9)pk_hx=x9>{# zYK61XJ<<=La1cWjeS-x8hrYQR0O5v<&as3C!JQ+p;_p&AtEIm?S2gnLET@8LpwgM` zPP5dUTj^NHpm;1~ojBJ=0UT2GY*5&Z>cPcTnBg9#>IrK3`_gX@LG|49zoL2~{nM1@ z>BFd^!MXS**lV@(%WU!qiK(j^kQlOPnze2T8=ysd6gQ0|ef6>#MaA4FV8bQ8tE_h% z(;ea=84M_V5KlhIkT%(ZzxkAW2l1{3Cmj z5vvc&d!ZAtAu5$T*;058Y%c28C%90oh*dGcHLJPzeT}5T93zs^yZR71t_urBcE^nY zcMr1T>}E<6yu1R_N=wz9?~Tq+iRY=WIe+p+cbmP^Ryd#iK#!qEz3W?dGTcAupqUP6 zSZ8$d4?R2-;JhRlB7;|YI3=Lled{J5fN6VuJ_%>Svm08x-F`x(zkFyPj}t+M`zAVK z$#Ysq7$1+DtR00!N6b)#=(3a-imt}S{N4;74?4o~++5BcC!G$Mq9fkep?#IyZjhs| z`}v$rM}UF7P}hlHLd0+pN1j#-4(Cm)g;b_mxapTp=`x2UogQZnjM^7K_r%6DzFExC z<4!7cC)J&wADxe~l*QCAs1<9mxQ3r#X4{-Td=`rBD9%A!1kS`AOqbriu072nOm`QO z-kz@tWw!{%DICHg%yz?+-hTgYy0>9F{zHpUik?pN5r=jV+wgp-79o6}v+D`LA#8_k z5xxnXXU#-l6&Ra@QIP8zve<-A88bkeP-V7ydhN}Fox017V1qONw;+Ryu)Ywyy;_uTv z1%v!e^o$!HPlA{pe&Ma~R8LqUkt2En@vh$FF#MQvT<95`S%Lk6Q$5fVNc9wW-X3#x z*V8X2dOELzs|uWn2jKDa6ci#I1?((1rHMLbu~xBF%XiCzVg-vmq1ns=B~uW2? z*x$7nQ>wlw+yX3$!s9H)2b7+*KFW{{Ac7!ia25a#1&)Z|@u#}pqP!_l(z|v1OtI78 zcI;11LK=Cz3n3X>Dt1FEc8gT>buI7PwYaxy`EGbwwN46scicc<*nBzyRE|$?_5`^{ z8((q-9}v#Zhvlg&haZ&c;st7j#5;g1PL{e`{!GMNuK}2IQL_t_`9-ks65%HldkV_s z{iQ}pkrEX;rDrh)l%y<5tFt7d&N8bGM=If7n^xzBj5=YfPA_?E#-z>TR2Ck~NL<7mhs`@a#gs&LiyJ4DsmALb?pW zZBHEp>9xZmP1a7@v5~4mPl&4WlwE;BTUFKy`+5rM`75fjq1n1VHd7(4M=@LLVNECT zq-c!|NVl1<_qS{`y5nqQQMx|c>Qr415GC|dDSw~NsX3Bg)wSPi$z7W&Vb$IxhzvAetxeV3{v-kLwXl3%qo`Ofn zf_r;5pg^>3q~Q`g!PXzlvbEohlAol1p-pkFH~+_B@EL_P zSK-)B(C1U5++c}1qMlRiik~1fDqWEnM^mX06vWX2g=1ww0{5X~iW0|P4;QH7bw$G- z`$SE00XJVa{;R;+fBmh7D`OEObp-{U;DJBhXicqkjh?3Kyu6E1EgU&m0VLcO5O9zM2=nvX%nMGTYH3 zQf~=|NPMPze1AK~pj$o;O)_GtTh}&mw5jD3?$q;h;2GZwhF8`{OW+2nF=83d701#- zQd*TtnS&lmT#p7ss>XUkXE0L@ss!9X5#z3^9Og6muta4H;eeJsg~tqD*g0hz0LQL21m%cJY^9v0CG>|H+DM zCD?*%{(6`#XoeE%5hXM|wWh?)>KAYjE_nnCaG0+5rXo##z59(l2n$o}xdBI^iZ`4C z9_Y~SZ_pYY7C`Kn$`EVim2e3#!g0>?DGMB~h>q@@&|I^3bwPA-Dml7l?~QmENXi?x zxlUw!)w^apTq0qa&*D}!?x-jOc=qg}eWV^ND3nL&?gC{z@v-W+ zVfv(4vE+5n?}Y$J;jwlC^nPb|sJ$Dm-r`NM%1tzG#rOm7jlw8tI-#&D-hEYP_f_rA z^42D+MQDq-e1w38&}Qtwom_HA7ap6*hE-RjIy}NModPq&HPGOZbb8vgH&J35kMT>R zgjOXd02-Y@-H=ebn!#z8Q@59?y^5M*_)tnUh!6d9j3)THTtL3@6vW-QaRSf;Iu(f6 zK{nt5D_a|Va%WW`T7^e9M%omP#I^E{j05uQ1xE^D4LGd1`D zZkCUiDGO$5GG+1S6AG}61KQDKF*VEv8 zvGEblhZcl+=DFmd$JI%ype-3(;%acgNSD2eo{O<{d0%KaY6p zkd^N1(xFh@g;-RM1|De%Y(k3X<>ilvPK6>h?Jt+kQF`TI%R=2kNg1u&n@cN038R?S zQu8~-`9@)*m5~6q8d|nhwDPuCE9&rzyp@z(g=h>Ao5n|1{@ z*^b#(r(>1_5Yz{cYC{B8U-+R#r2L7P>Iw7rj+)8WyEW90HZb<(Ck ztPVqj3qmn)a2x5!_9Fr*JuJ%7G+OfG_TX|FrmaxB>6-EH>8jfpr8YD@-6$0sQ)I>v zZnW#p%z>E z8wpoG_d{5@#y3Z-ebobrAIUuhO8Gl7eK?n!MFp?;n&{!jc+$w`gcP2T8_Bo8%?AD$>wB+IV<|PQe~&lLyZc^cUj5uNXh*L^FvLRc; zb^$m1YqPmpmaKpHJH5P&%W7~h(yV!5wGq49T{iz8*hcnkQ#QpNPWwZ+6F?48bc0{y zNs2~L^1Q)gu*W7i4iX4gG1cOiV-d-7)iZeENq$Z}LxMd?_fdvPz(q16+U(DaeIVv96&=hwP_)DUq(xChF?Zjf%uHQ|8;r%}{gI;#$@Ui$DQP3p zD&%7KH0m-(o$;^z5yW2F$@{I5UWE3Es<*bmFG-{QSVOyW8@&3mik2tqY>q>OszF5X zqFMY|b7Ew0Ztz0aJACCv*d6GxrK?JT44-~n2CB?k)l?#r*HY|8_@?_i$mluTPl`_c_ zlE*P2WF?GBI_e*+AbzeOQxK1O*e!_jwIEJ&m#w8BzW!TBS>6wve!1x;-3{N@B2-^( zMCf8Po_*&M;ANI5*aCbCgBZgh0;7{Nd2RJ4$dA*K(E1c-%q=|J*~e$x)8jFsjZtHX zws6-i+Wl#C4dN0vQ3CcH=0Kv&&kt%L%qiLpjxr*sBHE;lqRsg>+J%S+MVniVk@(R1 zgO+W>)ES0&r)-NZ)7lF&Eo(b9RgyW+htn+UAdI|Q8#GYwK<1!%cy_k|M9!Me#~KPV zYLUA8F^9xhD@dHGx({_GFP#;-HH0(xfX4l+cf8KCF__g-8jfXWeH@LIm2D-H z3w-j`WZ(p%7t z<_iGF!>5DsL^ihWoX1> zx1tAdT67(LK!f{+xAnSr43q*uadr+gjv5$n^Y=Mm3Z8<;s6>#lG+KenhxaYT#mdF< z-r_$a&)m|fOprR6;y69;)fb5Avs8ZtA@K*XEfnnsGh*^JF#9$Gxt`oyIt+UW+ZM!L zT0V(>z{YL7@$qN!h`u96{?i>X?D(vg5+JrwG;1u6PZ!TR4nMwXx~+)~B2I|KU*t<7EYEV%3Q43Ud97W99K^UN)W7-1 z2u6{apH0U#gaH(V8%Ag>!cUp^#|qhj>=WIK_?jGHbb@)taX5FiQQCv3My8;E_zpG# zKM-KBn4AmkoYN%7>BIOm|Nitfs^BcwD3Ixweo^UXY|oyHhAJ_aFm2L$qwt?fZ?tIn{uX>5k<8>N3j8>MF^&=c%o_w8KBsk>-t;uD z!!$jM>Fz*mjQ%o55+ET_V}}O0wyG#}E7Z#AcnI=Ayw@w-;@k@AvuECrzWkH2TJn^G?Fzz1l;&tmkrL`1W5 zY8v2i7GMT6EC`5kkX&LR8Tb(qLKm+9POzuNLvKv;z{m3z?UXV0Emh(7d_J~M9d&)O zM8D9dd)mB=1EHhdqzXi_@p$=_d7*o|;A6T@DPC@UR~O?+)zkOtmq~be>sVcEDqg0H zl^64IHBd8FfNwzFZ;sb__u@q;MJEF>U!Oufk)@}fs>kPZOG7q@C4nNF#X8KaEWyh6u`}**cMxvs;$5*H6v|=I}HW`uD?62g$+fTwF)2lg(^_Mo9QWxTyZhN zNOtri0I$0Zy(SKXd`Krdi;m#9Nn_Eu*lVioj4%M_R?!iZQgZ`|A_2V7n^3-PdTSo! zM$X9kYQ86QqaxF+BZ=zXQ(3rk)<0*zH;E~@JbviK19I;vB}gXuN0RX^{&|Yscq+G^7FkaV@i|B( zYfFIk9^c08!w^Hjtx3_@OQH+l!?26%>Wk4ec#c*CB_+tF#o-V+yD5O3jJkZqpcKBA zuUhUF^0VQe;I$E$vI5Wz&K~9PHJ47MnFY@~P@wjQk}Fq!sDl02cvCI?!JGazIz(Zc zESkZ=$7TRT8@A~qQ!BEF#iXBUvDl`@g(&uw?t)W+KR(P9#PN}0bBq0dk04J_brA+# z^&3JA-ma0$iQC~jA&>-J$pY#aR0D$3xLay9*s?8Fu?Rzeyx11yV>_?;X^$+&C3vb3 zcJAQXxZV64{4B;Bn8r)%`yd2JB7iC4%jKVX$%}` zn1DGJnD2rjk=LyTNG!0G(>Z`8Ex18V_7DNwv!JxauLTEvbQ#1&c3W&iOZ}KJ$w3k{ zwpYjJCj z7gNRG!?yCpgWFm0T_I_(e^mho7MPJfo^a}bnr~0k3kBSZD?aekp@u5B20h#%7oB}V zv@v+-BI5Aax8^JVN7)CCRpUzR{T3_vi6F&FUZztRtKFu>14F^ch<232kP+i3AAh~E zYYhN^aUdt?5NNF2E$4YKtjJrwYqmBe_CU%rlG|0vj6mB;U}T*F+FHI(6LB^4NF2`0 ziyui7*VuK2oGC(1TdcB)bB;Fp`vi*5h?F>91qad&0Y#aG;;+(C|Sur!hTMDasi+C!qm(eGT zg~!kf`iP}$MO0%xo2){QHL(NtdwjQ4N#BXO#OgYi!*f}Jjx+|I|6RjCPMAous9dU8 z-|cl;9plVu#WhB`i896f#!+(3Ym#^wS zgB8ntvX>@9pNl4b#1I<`JYqC4Z2(x0qn`sS|0cMONyD`nYv#!dU{P?bqdLw@mx6_~ zr+5OCWPB#pc*G6bBo|+9f;kWeB7Gpxiumrh8UZ8rhJAKXPULQbr1*thozaSNdFYPv z(q1sIBU-Ug9-5*R*UCeixD3c@g~=z})w4n6L0q;`27*l^dD+Hg-_gCT!+UF+X#TB> z6@u!-1Ecn_gp$R5@K1?{?5HvzK_yN&5 zqWp)p;b+{O(}w4=-iN`x#s&XpxhMRpZifZ8S(yiur&+oBP;B@`-!eM?5~mHvwL4A| zj#tZq-)>oOI~5|rjyp^PZUpw3ZyH*Rb^Tv6;0DDvEEM1R-!WyZJLZ4oY| zsXXfY+9DXMEf&+fWSd8&YhF&@dXrp~R_4``QDt49`9EP@r9WU@Km3Nzm6Q zCe;znKN{oD;a`Xu?MBED{sm%B<;QtF@i$hP*pvAhP)x3ugqx>;njp!w+SVVZO~JKk z)Yw~)hKT!|mW7}%DuU1l7UrX*IgC6yLO)ixL`79l9uIT#;1_2PpoHmr6rWCM!fki7 zR{SR~lrjF3mwNS#7g#|?jRZMwNQuM?R3N1OE>)NwJ|J`NcRZqh<#Ukrb58M^04!ZfVj#51XVN5!J5mL$Nd4v>l!X9CZI8Q$p^Y`}H zxtP4S`L>)pSL`M3ayxg9JT>7-P4*k4DJlxEEf!%b=-5WWctAvE_tFUbdv)a>clfWy z;y?p$kdX`IcwZo}@B;KUjAj`i@DbZ0Zx+Tv?KqzPVRR1_dK)fJYa6i|+tr3DBXD5L zv7;VWq7#HM$2%ux@5?Y{c}|(2>3^=j9Vag3COy5j71roWFI#Dfn_t3Sp3%y&+DEpx8VU zLwLJ!_}XS>rURN0*x-P4zlL<c0g+V$#Kv-_MQX+{e zTW-@g{3YRZk_>|@x7E!7zX7Z*5*G$Hg2Aa;+*@Tac*rt}!2o+N+l&tp3Zrr9-g%fZ zZitRpTh;oZk4_P9TE(~L<6V@!h#439o)mqje@mcMt=$@OqwODsIJ5*BRM@16VUt9; zn3-05gmU$q2;>fttsBkgP)#KEMkk*ckpAm-EE*e10VGZ(}_*C3gT$Jne{h*aFjvo$8H zni1IQTgOFaa_|S}=>Jn3OrjNAqe7^h{lDWOti+=gQPCx6a8z^&f@4w9B{F(M8^Gd5 z&&5QsEqX3yiIAFe=i)01_?ZK_!jGRqjxEb_hoWe_NYgc!Uj9{CnX$GuioTQKpmffF z=%|$FtA3-$;+A^qQz{8F=Ib$z2Bc#4adbA;IjwA-7!aaoQT@u7nt7uOCmxc_VbzaQ z-d+i$8pECvy@g%sMsKB{w^E|FEaRW0jKGPv2wg#9<4RDl#Hx#T!n+`-#ewjQ*AT?E7*kDL z7?vz^mSn=QDj{Ph!j13mGY1rK+O4QSEg&y&)A%%L{86oOpf-TD@%wQ?k!~dvzffan zfQg?}FBBOM$}BsUX%Fg*%Z-1n)RiVa_p+m2mXyW;warp^NwEuXv2O+Nsa4+YaeCE? z>u0;oiwEqw^W!?F1TShO3UwHXvR=5jWxdb~^Gw!tituuqc`3$A_)ML{O*yqw^h>Gp zh0DZN&Q!eoV44(TZ+vN&(|?jFE3DlyL_Vs%xE2S4XLzn$Np!ocej zF+mrthWzy6BQL(2Z$OjO^L4}Olc(_5eJC$^5!k9!t*d(z)1)-IsaU!Uhobs%^i|o_ zH?g^pO~%!I_N~IW295G3YM48NAcNb$b5RcN4PJ}VByapBTJka{QD$>C_geEarFp?K zDJ8P8yj^fmy_ofjRT}X9TBQH-759`;;Gq>iqw4qNdM;ZTQcA!sjWVmd$+XieWhG;lDao( zUdZs{zMyl~;pOxT9NeGyB?tGd7joZvp(6gBsY7C3HZN4fU${^Mpdv0YFQv{GDq<^# zig=|eCQ|IjJH^SmxxWGqAR4p*>3{SKZ2Q`NE-4`IUgRyGqw_Wj0Bjn7|A;)kdOol6 z{6$BCh1yD16p1Y5*bDY4l*4x1F}_=`0rPOX!8Y{k{$6`;7&U4PI~@GiM!nGm`3bcL z#OxeXxvOGWvzFWdfl#T2Zw5Kl4WT1I96Rh52!jn28U zHXbvo-m3B`M$VdRx69nUII%5TCCho{Y;!L#qO!=wns>~Akk1{ci=P71c#?zQcdg8Z6QgI2ENogeh^+H494gq9Hq}aJyZjm?vsB@B75}n(HkFj;}NW7u(ZwWQK&ZIF18yBY0 z_(_Y#Pq}EMlxL?AK0t07$7W$8mt1Z7loW*lK8bZNcRECa!-1bh!ZC;P>|-IJB+&U) zu4SL&SGn*tXI$&5FQ>W!4hW32{hcbuTPvh6V!l%)=?L2$`gf}A<7Sb5FvT8_oItAZ z;xdRPg;v|p6yjSmF}S0oSNT(()7cjEtlM;=3A^#XjKq3 z>!>hbSNOD}LNRw<-7Nh{rpeyu(Rd|c;5Kdh@$ZAM=P~zd4!no6Fuu)|?}4Pq_AzxO z?YM2@f_!mPHC+=>Sku*tD!$Eu_uwYi23Q4(o`d78zJ0UgestFU`vj$MVzh^ESxa3S6p zk=9j~*j0Q|1%qrJN+Z_6r|iQ``~>ZNitEXkf_12+a1~&Zoa3}wzI>{48>$XWr7uXp zWKmKmlMa{QdTfzV86b`s#{m)VXSpp3r8i;l71kAOUqd<-nfa5@hu?`(g8Yxv-!3qj3MP&imRkT zsF#X`*WneBvlTdJ#KvIJfMtz;6FWf~(;OxY-7E#pS2GVuLaOM(isb^nvJcviC{)`( z%0_nh!!VinHX)HIJQewZrvh(SEx}7HT+YAqLE`V0;K{e;uiQ`Lnb3ONi-^-duX!bm zDws?-I0@-5jJ`Bw=aklwyx^<)K4NmSl!b_Rra*LYJ62IFS$;b!9XMT$wInP0Jt2|) z1PM1-oaIY!piRmzlJb|~FTgKt39~Ws+!DT09{C~y@vEbyW3{TkQV#W@3$TtwvH6%T zRe{|Ta|CRV zPYrTo)!|^-^#vyutURV)Po-#tQ9H_=O*mHhXXp`% z1sJq)i?bn^0x-k|{e>~^C+EpdPLZ_yj)z-Bm91@+mfJId7OkDQ6~7){-;|}yZvoAg zZO5EJF3Y#jL8Tys-5$G*OnZ#*-g`Ssc|Ees9A=HIp?-FlGThq9 z`5dan-@8sbIf&t*b;S~rYBz%;^aXA(NS8=tD~W8+CXwwjc+ZmtYD@4ZDl;tL)sICx z_)x1xkOMTn@Xd_yAZYYG+$fvFrOLRpDzUH!DY{5pij)pj1l@-%;=Ov+E67F>$49!sqDg2jqja}UmAISk zEK!T?MmK>x&0?o+!gsNm%71J@m|{gG#QpgCRqgGUdkuVd>_PC(IU>}+R6_w(Ae*U! zmCZ^mn_vIDkK5SxPltwO00ltl5~Wr6`UK7c@7*V+1ml>CuT?Qn+m+8siwCp*c!XC|^TOF>Z3V za3)9Jjo&d-3=SF(tR?DcS478s++N&edZ>R>v$G_i*=a|K=)-|zC=sJUO{JT3rI+Vs zRHCBGUgDOtMveWfHy7a2F(oV?{cKfO)LN}4K5K4&gpn0vX&)pHERE50z- zZ*n=MwD9tUxhJb!Xst9i`O0F|AK{XGM>W2%S`s%uNC(g^SU~y0+-FU$as+he@rAh$ zt6V;Alt;uwsbcs~o7CYwddbmRKez3%_=+cY%Gbd`_RXjT?_TU(k9)*zJD z)DvSoo&@!lWROT^0CqJVYXk477gneZ?2$5SRT*jC9L%d!2?9d%N~8$urek6?U6$Er z1>OnqP#rK4_*sEHzUr-32?fnpbHA0Mni|4KI7}7a=2rDWa4KGCo!;irWeEus|6BQJ zh8f<|z~u{ln?rkin-@D8mm64c{8)ULvINep1@xgbpbz1G3Pp9pyS8hfi*7H} zHmklzyVXJnB>)Q(*i0AQ;jsVu(|^VQ-;hSmUd6E+&!zjyYka6m#zeny)M3}(( zgnA?EWufDF-9hlEqtBp>j@6=>RI%?N#D|%OcFgZn&1nvofevY`#1T*{T0cpXR?qN( zq)1ExNL|qktgvQ8GkD;3?KISnes89MBH@BCLkGxBtK)4w3TF&a$1io}syfYKO1gI| z{@|0brFyT7Y#oIt)6MBXqs-JyeKl6OT3>RHip?AqqnFC4z(&rFycJ>|zU(gb7)!;k z(qjicw=e}^3MpLSF8l-wKduTRAOk}B+%Ycqt{6Sz>R_!JQ!CJcg?Ch}tyrEcW)yt0 zf4P;S-$l67K|h~0QvyNwUM~YdISLR9Hs7Qda0Yo8af;3Fa|ea`bWq3z)>%u1hER+B z8~vUN4fQ!fLw$B=NG>X`3%sVL<#HYF2W3v7goS1h_O+S&Ll?Wt{oPfLVxr0gkEoZ2 z7el8d^OAq5*K~@zPWEcqzhbPQIVxF@ScRz*?Vv|*fE4DtnceI!#E8%tuz`KCu&}nW zFVZ-&@s$GaGtoIkX$6F}&H|=ieVbE+;2Jqt(D>sL@XNR5Z&noacxeug;wZ&a!Cj;pisrcr8Z{KV7YVojfa}|M zVeTvHrLLYYNR7&b4iDU2P(NOrq<)FwC=ux=xGy2BV(YE;0*#iWp_c%;8_pj8$xAO@ z=B(E^`|xs}d5Pnt)4cTK<(PYPG2VJ}v3jYi@5GCcHrYWAqfx-;aggP4ku_bB1(q4l z>X$Osz(oJIXL^0NtXHqi;jaKJ>28*dSVYwZBFr>s@=tJn;Da4Gw9ciH0oD4TDWrP(3AYP1Rg4BPCu6P;!UX5W$Ndw9FG z42q6aAra;)!zeLK)`-^gK0G|A2oEOZ)-Hk<9S#M`c~p~IB&1rXI@H8kP@7=H2Dqnho>|;JSdy@w!Bq5BjFLIp?dW zDzZ8Il1A`>0ZAFy#wAH_#9yYGMzDlcPoe_Y^o47X5GLx6-AQ1P?Q%u4Bl$K##(Yv6 z!L1vw=0QI~`(-QiLunFAOOsx-%j0?$^tdN^y1Sxqk>yo%urfv1xQmt}NQneaTCMy` zj@rUq)~0Cr9!{%G5{9ZR{czygq$F)LX|LHHEuAjs8C}Fk9x6Jca*$V@Y7HXT9vemj zBA>i-mdj0mFjYYiAJsAJ9H`Ym%s@R&Rcsbj<4rE$(hLZ(C*F9O3rXNV_X%0FUycXA-8k3w@l zPDOOVLMa}M`LAVhU-eIgH>p_pwXsD(3lz=@Pr{uQ`O_P(gDu4!me-PpE&d>XB;f{? zu!=uPoDT#I+#x`qoH#fEGTqyF6g)mnD4UONjWyZ6Pjs z@q>Bl1zXr2P^q}~OvC|Y7wPPlFue>_&|c%K3;a_VKUqzA?GsL$yoQ>2bKsvd_v3a# zZjA&w>eVw!5jb_#8||uho?VZj^MAq)eX0S7BZFuAZske~c1hL3Ztd??vEF{5JZ0u+Vk4XwSO`?OJf+-#*mV1~e_NF0|tb5-8p zyy7Hyj957LBtA{T)Rc-_6m3Foz+2)dJC}snxtB2a9nhug7Qth%b7wO5@5t4BP?%-j z_Pr6#f=8pEvyHgK2N*qxf0MMk1iZ}vllhVmg>?UN6Cpbn=p7@eobJKv2mz{XFVcJ1 zkZ2Q#J9=f;33~|&$OKXJtozC|)~-Cmu$Frd>7xI0=8L|XEwUvzlfJVJePLdDMfV3G zHN&X8u@T0m<7id1Ib4K?2HE5>4&dLzf&@Z5@71o$8;cC4I5xcaui-Y1PQ|xs;WGS_ zeA$ksl`Rg$!1`kI+zF@-u-@cx8f3Ue3gi1x=~W-&_1D?%N3Em5z{(kAFn z>C8(JOhsd~BE%Y-q}I3=%l}Kzr?u)NK+8%&r=BHeSD|%*JxY{hFYo?wPV84e(Dz`} zF4uwb*R(pX-gzR% z%UX>Nxriy?(3N2JuXH<1>9~G4(Fiwh+=T0a)p2$_2hBFbF>ts-w#~bt7`Mw%ywHNe z_&h8kB$#d!K1!dj&TvE;3Yt9-Fr*A`mLidc5zQXN9FbB89?B-8*@9f!bUQY*K)8-U z0n$#GeU!&S*)EB?#X@9FLQ{U<*}kU~He7*NTJ5JXL)Vr$|AqQizfa4M1WBPJw4sJ23DdMBB(_LxO-5v}IOrC{ zbP6We6s$57ByS2|mGoti;`GY>r(5KoV^u!eqJ3rt?UF*;i=DL3)U-R*8ba(vwXR(v zbSt5Iq&vp>x6dP zj=|`=ZNbxAtaL2jv9P=ZpOS=P1UW$i<6ACx+|UC-y#~G@f>m#&@i5=3Op|Ga&w{@i z@aqCeH5_DY{v4}}w%>3$@k8=w77p0}e;R_{o@&^1A^GP6;|CHT6-%lD9_2=d9S27h0p_3c92kPcyx;0oc6d@dj}Mm%RKC^f%vF z2cgDl5yd7nv zaiNP$anLzX>*s*D1gz z^UU)#&&)hCbI4fR;MA%1ysT7BP2s?Y8Bx>%4tNcXzmi{7nMydaX^Q^cswC=(_og=? zM6JaHQS|RK_5^u>1DUI;9K>ZQnBFR0^o;w|Ifx)oWHAPysAWe}8MgV>{T=nLzCOs| zk+=AdRB=7hI!n+iT(+7d@(ma-#egw%&DXG2L}tO%87u!eP}gO*KPrX&e@dN%6K_T# znOyQxd97yUTFuJ&6AYDSz$l@-UU3tuaMvOl>D%d{=AfPc+VO@Rf!N2~9I3L7)WVJu zArDs=J^MqfXmT7x4YI!$$emxHY~5>v74%8vI$u*(9%h=dSdo-kw3>F4|JUtEyi{~z z$MPoJFR4aMGPL;4ade@vb2t<5fj1*2L#e|Z@cRKgwu{px3**;}nDC%ROn6WuCOoJS zQ>LjFW1r{_US^MjR^tWfnpzZ0-J++-Wrd3Zk3g3o4l>#Oq*yD?@kq?(XlJ63K63=T z)?37PbB{T;IYnYx^bCn*B$Sbn5D;5=8b`QManeR{@BqcZ*b@&U zA#;h%`|H6cKH$_`e&FyE(aBni1mlTBv8fiJGwGtu4)&{ImOYqnb2X<18wb)&pF7x5 z9uOyp=r5kFK*h;Go3SKgROezX2Tf;S=$JOD!;if84`(#=!WX0Y_UR9nD%OnQcQ*%c za%Kd%lA-kHI9Gq{yS(%Dr&aW)1%HRopQ=%6!t5Id8+r%Pb3kfs{Yl&UT|VG zA8pbhf)##~&Tr0MHp`@+W|T+U8&6rSI|T~*RHt97j%muh6{ab(hftlSeARKPdJi;* zQ+)44a}L5j+MzYaH2=PXO!H5EhngdEZ|DM_2(J#m$I7GUQrAFO9sR-dg-3r<800^A z{aETq^2sqZ=#Cs!g6URWk)7vhLXy6T zo|OELgN#9x;03e4fpb2Wf)!BxH6QIL8g$m2`)kIpB>w-G^4lS6ATCinsoKpeE7uo+73qt_PTVq?fWGkUL`XGe7mRJg* zR0yZa5b@M%k}`GUeE!9&EOon#Us@@3GY|i@#hH))vU40P;<_2rSza$Td)VhLIeVC# zRr3!vC4?CPb^jO0rCsdc*^o4D-=Q}X9cL_U571zhpaU`BV<9?tIA;qW=^*=(+ho@* zTjjPdcLCw~h+|2wT5)&jb%Iuu5AP)r9IPc0k>{R)z&Sl4D9yfwLvs_Y&XQdPvSar$ z^^4~Z)9R5XPpX>^b*UxZOcLak_NwmJsk#$pnpNDCY|7<{Pnf619}toXYf#e4t1FiH zQ=a@mEZh-pqIVGFrhAYh%2o>mxqlQu?&^~YBR52a0&AcEtdIF%4WnIVnW-tdLrrD~ zov*|y6v(dWe7frYus|&5iy_)L?9G0m|Y`kD`2>8A}kuMLLIYd&;d13LY{ zqdyR8{G*?aYR2w(FCEvASHC&I@JbK^f^XlquuS++9imX%by}RPJVPMAE7KijqILQp zkyYU~w3gNto9P(Ni}R#ZZ2Ww0bMIhtw_;gCCMey^p=)kqzlOu7kU+Vsb5IuF`_A)Eu6` zn$KJ>NJr;~W#M%Lb3Ifrmxb45%=I4yb0Njxbvko#QjA*drG$mo5zO_8g1IcbE@3Xt zcjm*wM^ht*gV~+(?ynIkCRY`6G3+QGmW9_FfSbL~$>rnnnS}B0gQY%&)Z7&cyszMY zK?-tM1R#FCq-!xtZdqiW6j&hFW#|-gu)hV8o<&kKQc?gDYCO=4LA3o>eW98k+lBjI zx5O`j3ShnzPmA%?g_3OnMWg4P2s`E1l zW}or*TzFAFT)c^i+g`nu}vB2%6F}9ULveC3G58;@$2#t9Ea2q zz%V&J$>Mb%21{yjr6bwFQ0+v^nAz@d?isI94dMXD%(9PYqv|ghoQ>g~9^d`hTW}T& zp6nEKxxWps^M$<5Yr1XC4>PtTi2W+jze|T!AWB^74-tq57aa1`nuqcs1yo2kzSn+#%2#eZaMV*?Dk5Fa_|5 zDgc-#l7d$cyI`3rSVb>Fd@FiL=nw_W*M<$|u@i+Jg~3cM48}HeR1r;L@|H9_XmU{i zN7SwC%?MpN%M&SUx?vj3EN6l+r>gc{z>A8MshJ`tRn8lD4AzZ&X~!=C{`+4wBi=ob z5AT+Pih%$tI0~qV$k-QbBZ(Y`E-6>94{O>KiMA-)g-8TOfCZhvJ+TZ|yegJqsuVL* zU>&~ZoGf)q{$F640ZYv=U&-cfc;lF8muGHJbcf4&%Z!VVft>R}?s-cN%3zalo~Sv; zU)Z(h!as2fABe)P_zO|wRg)*kjxjnw$&2pNsx}Fyb%BcTuNi+FdZZ;Wur!8q&6mZF zN(_7{HZeC-ALk`HRD?XUrqqwdH+tZ?kLOO|qZkdApS7%h^varky63qgb4Q>IXf3i4 z$NC$E9O8i!Ey;+?%WuB9yBQQ0Oc<>Z*%E!JXiGH5AfJ~IHCdzv`Ad+QVs#xrpzPiF z$vlHi2(ZZf+&5Z52Jw!esA4I$p>H>?(mM#7>WKjo+Kw*@ls*Kk__A)C8yJi&Z4Qd- z2;Tu1X4W%-V)l=!M+j~}d8QM2EF3cZL4d+zQ!~@}4Q@v-^aiS;=T7TTGejfavx_}i zZ<0=4FM0{uFj5^Gy4tCL_}7LjYSfc_Zj~H5&qnu!=S((Jk`fK&ffz1(s0hTyB^oLN zU|U0#T%}wcsILO1!LIxkePb6|^d`I#)RC$yPd0PyM4l^>&CAVmWwJSLo~x40jpn&J z+02btiH1o5#<>B)BpeinFT899P2uB0?AA>*Of?y%CYzVI8TfdC+RjV*J^H;}LW2ln zX=N#r?Z+RLl1T4Lv=^Bwvd?)Fik*bbgC+bF3380>fqAXT zGFnP5pOg$()sp7+>@ZMsm*p0FlD0Z{=FZ7|+LP3?!YOrP?gRx2TZ16qO4!PBhv&B& z8G>$xK(js%8MNc>o(E~#NGos(9WF-q*vu(HQrFw`ox4d=?z=Rm43gwV*CYmlp~h+y z6il!Iq5eoIZZeMyLRDSe`1|XS#f2EyDa4PA0~Xjb>fxFiNL1;=ry~>zNtmFNYK2fo z5_teVjR|e>p8=m^n5iv(4<7l?3yca`%3Kt;sgEmwZE+gupiF)kC{v^=1tzGU?-h^& z{eBI-Ext}adF!dN>uGJ5dP<2B>s_bbfiLR~3yN`3FpHG*oE`f@?d7}falr!7O>EF! z|6Rfet$zY+Xu8?M4{yK*B>?WK%FT#EFE0-B^5RPa;6(>)n<_=P7tF4ysTYH0>k87@ zr1X|uoaQdg-m1#9MdK)@fLn6V_Q5tB83*!^MUVLWeTykhfkFp$ zjKNaBPcc~X-N9156vpxrFP6`}1}x8Tur$@wPh%5(SQ+73uCUU=6%1t0LFGact+gvR zlZZ`c;JS|?6xSynK2<%Hi2c%NwnLsO)Z<9`e`2wN?^G3v$V7)+L>1%;8uIYnA&+_~ zOrBf4m0$ z4_LhfQTUIk`uaue0AHv`)fTUHliT9w*e?s5monXL4SXroh{X$x4wr^j%~c4I>)PZU z%qqmp$=M7D0ZD$mB6(J24#N}FO}mtellV>wzq33{38z{a+%7QKO^f+BUp**u-c*zJ zSP)S5Y=n<7AWeFcW*)~b<@w;mFGvO_*h#r;n}7vfCGE1k1%hXez?@EQ|D5UH-44%S ziEay3Vj`h8cRv15gl;`v*7D&Eu}Aqd9i9EOXjsu}sA|frKgO z-nNL?Qk{O;@?FYFPPCf1GB|;$fOe9@@&X5$zjbP2Sv*v}M@sBmkrFo>r;C+O&3v+q zZfBJbZf^14>;jRXog2qXJN46HbODo_u$|!M4K0{%l0s4;9Ypg6)u4N6Ue&4G?pv>& z<`@+pKvonfP!R~9F7j9J*y);@(Dh!tXoK9U*@?Mt>;c_3I+^Yp-Awn50_(ofi8Ocl zsCXqVN%muG0MZ09og;WNEzesK4tFyqX@m(0r?(5iSmAb z{1JXs6dAQdx10 zRxAzQ4kuN}eNz900titp!X;o0=@HoRiFX8)LQm8QtUW|fT?bl&@h#d#WG8P*w(BKa zY9zjsWDEO*z+*O0L$g_xpbDUMxr0!xV2vQtUO7G&v1;QO_|RkSxmwZfRDrE-IqttU zl>?&|3aDD#(QyIGo;&hwSToYseH`^*K-+ z$m8PhOdLN~!Sravw**!?&p416SI0&(@vO`Qm@JqQc!*q>{A3cBczJX4^prj{%=s$4 zqeB$HL(MEKYmp8vVEC|c!NwE1?uO1o;PN5x7&0M~;l0F^Z?jg&m9nT1Om(0DF&O{} zMrRL~EZ@Vbo&{tGREA5I+-HeFJ^K1SZWsr;yX#NVh&L>oW*StC2e(1Ws3D$IaCr-V zG26X+b#ab&=aS9YzvG@bbtl@La@XjvWDZJV-6X1Ydxp|&Q5uQ(K^HHfxNQH5f zdBaGVf??D|4`)W8n)rc*x0mLh+R4eNZ;TREqUQ7$MVWJQG%P1G-)mbGPp!(9aJti6 zCD^Agn6ga9BQP1giN$@e4!tX`8ntq9FFIZbe{Ud^ybdJ6QyhN%6nvD5rl4D;*aH9F z25biIoq|~;I0UGJ<2p=q$OKPdjG8@JiC-Fo>z||;VZI4Pdx1I{;F>MskRcA7$}W@d zWl$broY(_ikNDT@Pec^4H@;|QG<+3y7P4-<4Ws%4RP}P7E-?@oeN<@cI}kRaSpO~Ny%jb{lfHMi?Ei5|jxuy5Cc#L!%dNyeZWa>g#( zLC28sJReGrGBFTXV}6?n;* zmnyup{!C|^q+f*p=xH%4EC)PRgIVB2XwBI$OKs84-B`&-gV1#xuG$h>4-dR0wWu@s z!o&fnT~qlgun?`RzlF zj$4TFpD){B=rxoDLf4(gE|CNVtx7_xmUw7Y-#HQXVJJ!=c_>ODIge5xi zO2JeXAfynqEIAGIE6M&&5i|&b;)3)txVCu&t?5kuapHgnaAATDi=5s}B&OSfA{>H` z+nu8wzD#>)hfw|mQvNQHz%Yz4EsoQcBXH8EEuL_F%9F*ABm7@p!fCb@e}n;>94*Uz zNf|PAYid|lG=p@3!m@%IENTy}hYcr1sbRO&ma zMc*bFecLrM5crL&ZI?opoJyccTbjy$jYcXx+ZNbX+O^;Q7eD{_wiaZvHLk6x{I>=2 zNiIwAJan1~VC&n@cSw)jPA(dOK!?OhM= z-iHX4Bj6H$n`(=7+3XeL2QA5R8(2<=h(aZ*(6(sTw#Q${ZtuF{FmG9Ww+>g^^yfuqD|y(W5g~BRw=LYD*3bmeZzM5f8oX#L>5dW#0B~&~Do%O@;S^f}%ga zMNgJpfl-yRT=Qi3p@sYXlslodv1qWrTW!s?n763oolEHZNoCQDkw(Zn1`+a(L4~{| zdzTV&n(Cm}RR50%xy`7e=+;zpE0{I7Qv5%~F43r3Y81jrU>fs!q(SM_qNVz!?c4Uo z?&`j*So*RXR7azIYSfJ}0R7zIbY~_{hjGpZQNMSLC&nPxeFc5C+bM>w`xM?2t&=<* zBOCO72SU0+Rm^`_w+8>K~L;jF}Vi zJ6S!bIvzi@&d#c+`bkoCt%y@WJvAjX!X8z7N{Mgo3;5kDJ#)C`Vw49TKI6TvdaSrL z(OOYhH8_WeSq|50e85tUt|Vd&wQmL*V^KD-8Tx<&S6)rNs$4e6pL~W2;PV^FH}F}6 z{>z1h{?X*K@CVZq;TOA3pNEB8lCMY(b1i!Slr@Je+yL+b8nPpPV#^e z9EdsEjVx`KO~B8Xq-UoDK*pdaj*2TY`Ky8!EJ5P2S^TVQ-_ck(wb}@`;wcJ zbzQn8SR(bvxFibSAeb|ZF>Ar}4+@EF<2yVX%xo2{#(V;Pi<7VGrxB~wTo;e?vcw*I z_9MYLszqJNMO_pBNh2>r^`Sy8HFPH%x+m^PzM-?Y2$9u`(#b_>3&2oli5GGaxmyG) zpuCXJE4^@qmiygnz(^&unldig+L8@jOr!yj*T zqU4iHmfl{PktwY0mDQOi-U5h4UE8Bw-8Gr*rF|*^Lw$j^ z=+0F1&L7SF^!^v~y=$9#pNIGDr31*?UEh&k6}^#52{K5+r^Y&+vq zBd@J|gn~#o@i(d z#3~aFErHm9iH41V7}jw%1i0$D4o41RO&LmqeAqqHPBf;YtQ5hAR(?1_KAAz4}gge8~CB`zX@ZVd|1a1FW>{jv@O0C)$yOa+^L?`%iZ=1k1OXt$;Qrw z|Kx=xod0B1B0FDJ0f!v3li}rWdbZlRAx2(Ehsk+Y@FK#UA*dD!`Oscz+ zmqqlWtLew3;LCrHm0&EB<*>k{mmb|RO_jw0GDB(DxGNCouF-r>qWkYJTG`M~%Y0QU zsL|9Ms3M{paRbE!FsxW(CC4ao4a!XU0+Vf!%s_}UrQ1t`{M{rtBM$&at$Glp?dA0Dm({;KErh2P5v_KUvEV>O+3)Q&|?vH9U1A9W(G74TF zxno#xu3~}u`~2gisi)oe0NM9`!+f!tV}%dFX>vt|b}Zb~;j9stS6i3g;j8W6a#94f zZ7;20OJBDh_pLWkcQEIGiV1#_$%E9q5$> z1P_6X1@B!mqrt0?3BP44{1Eh_B-SMLSw)GKNwUC>h202H<~k3&Ms=9Oo%p~&wCa6i z@4(0Lleu{Z@Gk=Xu!d`p9{+3@Jj9xOZ3Kk~u+*Y6F? zN|uPniMxuo$0|ABgvSXt#0qYooH`-sDkjT)#fr&K7hv+Q|7DnL!m4oRWkkxKhwLN` zKFk$v&gC2Ezy!oePjZODw%)CgKSL8_hJ!pwooI=W03&)x02TWt;UExA48t)GBDW!m zgk~({dwA`f=2_{oqo}`S`lyCYnPP^GoQY8hPWQ&s$7R&hmqYkNW-zXGXe1YEB>&?H zP2ucls66kO6Hx`bGpR@z*Mnin&OPy@gnc;JX)8%R`f^c{o)o37Cs{imypo;~&$Yxq zQVZ26dg{au-&wVWVg{L!4l>J85lVt+tPVp2(T(RR-_hbXy|^k{#@2E zZvm<13ze`gZ5{A6{N~5GlZrKvE$0I=MioNyD7>4S|;CwZXO%#l^yrT=`qJi!kVdLTP)at&G34`{HD>QW~9ptUPan$w# zedFzPoMH6aqFo%inOU~h5RE?r${sG|*C5vRUzWfRZNquuz4}~Qg^`9N&5;jXHQn19 zwqSU)MP?RSw=HgcZc)p&#h7|-ahFpVdX|iCcrLoZPUlJut17MbjKqLgZtk{H&MjO1`8@5L`xTD8G>qlgfT2@pGlj5zGH!UazNJg{y+QtkiAqI7C?wue}!}M}*enKajc)UQp8lIJ#(Q9ygtq3h^C=s+Qv0 zyU@}>*y?Mk#eTG*yjJ)-s=09UmI@YhtXU8@6zv^ z|7-Y-ZUO!!hh6nZtSe;e;H+ZkRf^fHQ)H$FbMErCg7XLEDlj68 z1FMh=k!(GQ#XVRU`apN+i(ecru}p`qf?Lbo{T$_bKSw!6YuxNALpPHP3q#oTF%E@` zojWkimm?}Eh>asXAn#L{a#7?{p3z42&S}@h=?^*$C;w&dXy`UQji!%>G$mT~ zM3Zb|sg%GOGsfS=K1as*Zm8-7nDxeR(H*CwC(=QLX2_ft$#x?ZaRn=iJSDuS5MIC& zm&^l_(+yr6JSWDd-7;!pXrwi2qXPg?d01ig0I`P*)KfzsY$I_-KoX0B5de@XTo70_ z%_~kmn;dWpBVaK3f>@)HA&Zqrt=-;&i!fzQRh|QaXYb;;Qv!e=5Opnx|NBQ(Hr9%@ zG?es&FNfBX=dyntt_TLAwkrZlRImvjG!_W+xHH8x(TydBun5mb3iG;r%Qs6C}g5E|@ zkXafV7Ybs9Iufmwo`7Yqb$G(D4l}eI%P9wgS_Y-;$}He?x^bZg3z-B+nX(_sDq#Eg z;2D)g__?+S!ru{yO2bhLE)tYN!`s31d9WfuzXhQYU?3ZeN9mvyjTyuOL}i+3gc7DR zDNH;$Ls^3F|4&iS(tbm_Av7PojcC450QVyfLTb>hFsb)MG|O09q#ikFMP-FaE$EFJ zwA6lsXgT*~Md=pMR3AVFVYr4h1I!GDi#q6fX=h7+!H)GJ%*0E?Yc|fTo{d62>by7l zuEK8DC?pi-SLEq?VNA5H^KbzK?pnH@=v@G@82*CztbN~&1@V8^D-&1$+^n+l3??kh z6<840E1|NQ%OzN6(NQndm&DFV43x(9#R72SDljIyQMiLOzP0K>!PKjoy?N`RWn7Zp z^*34L)9a#YO9mj^IeZ9rVJVC2d|VgJ)yoM6f_678CITh_k>F`CMLCj<0#Q+nR_0Q(Gsla8k?eYVWp*7(g>+ zfv|J4SyL;xihm45hwF(3+$sYu_c_4>OZfG(q0Xshu4>^y9nHW8aOk@~m2W0&L`6PW zOJh#>!(2uJd=Yvf(JJ~BkV%BA2$3q$Z3v?cGHZ-TJRVE43@bDF z>uogx&RLbidYp12{77$y2r#QYLI|NP^Svbzvyq#gLxfKMP;n1ywYr>rw^@Y@A(pBr zv}%^GnXo(Pt`K*%3sG7Zv_+=!$V5IITV$QR>{5caxTs*A7eD~gK?j?h172li2{UyE@Ul0L-W0!E?FJB1ZRcNMspjtVpd|_&* zNu}C2seEDTgC>;`uudvpn0lj0z0pqP3sb*oQg5|W`NGtNCN+)^a*CD;HHz?{Oc2xr z6K(k&sKHa4bQH_;cxP)E_r+6J`9yeS3LYPe#+)e2UMIL0o)CmpTDGr(dCf?;7M*yaH(bkG0TX#E!07*VRMIwQr4Q={PIEb^Czt~rV}sbtkc z=`tW(L83t+(9_)J&t`oFONd;*mBV z0}pX(L+QiNa`X<+uRfPLonL37e4UGCpqC^GbsPvWSISv_d6Mn?-Qv4aWM`BYqn3yLDef8%9`SV zfI67)+)_msZGGBleZKPtu|A}zVN)F6wF)gr$Z>*GNI8iWW4;X1@munk7TqI$WJGs8 zh=WZ4_W;$*ndrkb<*1hefe%pkslo{dUOC{{@SeWIz`IZ}!s$|2JApGderOoT!4IJ- zJhnwH(I4ByY0>;_iw^+Iu}|pZeRknxhIt79p{lJqg=Y#qZC)zvmumZkkvdDC)Mey= zp{Mmr7%5M@tY3J*&|h=O3goJlEl1Yz~^0C?nXO#ozPQv*J+Y-(z)$S|xDN`!fo! z4LAu?H%@?bfAUmDcvzO@08QryRwxyKLlVp(E?n&G)r;Ma#6>zlbN}KH&XmQ92rivg zb_N{`@Ajk;%!UK%hDOVIsG4h`Rij0ZH0fIs17U2%8K{aKic@LpkD$0jCau{Sx>$}| z!}G6p<9Q$T{juWk#Y$bN9<$FL8NN7%;9fXed`F&SEn>CwiCj#TG-{8eRY@9Oj~}Je zs7#VpEopo;Y3_NPjR-l%^!G!oQT+(-$#!_Ksy+avpB|F{c7f?a#La~vuB%XxSK zS0wk=bHliTiJ7s$io3I%BnN6G2sHGf)+2=-)Y3LAtQN?t%xSS5Jb4vcpZZI3aE%>I z0YXkp9t2Z>Oc%x!(7SaCHdUhyx*~PzoU}n|lQvwNMK~U$sADpZh3qI<1}oTsX@$}X za3U4pg$Esp3>esnlSk`101qo%HS)_X@7#e)jEmaUZnDJUPR!YK239;hjLh#}7Tvrs z=FSd6U!FI}77@*0IHN?=+Mfk^$;fdjklWW?vE{Lrme@|E*d`yO(9dq<|o z{&Tn`{s;3(yZgX`x6r}9a~9zG@;nxd-0WciM`>uVpWx^Ge}c2;pjmchzNvNuCZgtT z-Za3CLn3vnU>QI^ujJQy$$k+f|GE|r*^kSU{F5&%$cW{6jDS-K$=4Md>33e+Q$grN z3i2=FU*d@W<9k)?gOk}&iN6j*C5FqPFBjm@-w|~tU8=H8>K?y5#c2Nj{E$tbq3bMu z%KNg(Vod9829gouA6}FnPkKGlQe{9hyZbp${xV< zn4+rLoqmSCij7wX_haL5ntok|Jti9;O;3R-nFnCqq5Im|mBLl&(&zN>bbI8T8BH&J zl$+qC_U`5P>bhQstFJpKaG$G9nQoVU6-|G|rj41s1FoG}F28oG81`|IddRGetoih&U3=}9RyHW5SP4q{~2r#o_y zKHeP!;9wFI#F#+G_Q@Uuj)f4@2YZDSSvu#iq*cA9>RO$6eP(Pm707})Gqy;^(o|iG z6D`P$NXc;gC1WN~Ds11pttv`dU-z9Ah%kn(-o^KUPzEy?+kX1F{+NuX!ld)9-z-h_l*B)>&qL4#5 z+|FT!T&R5*+28L>T58GueL(=%=s5N?14}Fl0s$yE0P86*0DIG`G%^4SKByHPPEJqg zTHHel@j~YUx$bi!BtUel`#i@Xy6HZrp@=*7QdP^?OOJJ(U{2899e+KsH>Exxc|jN& z+0b<_xz4BS?1+4H%jnM@TvN*_{nrmHr!;gQ z4&{52{cm80<&+-dWurKyKf=C4uu(gu*9aF2xN9Z1K?3wiPH@z?@(`e-2Cu9aS96G0 z)}f4>a@Ujx2Oq81>!`^k8iP4%wP=KL3gI(OL1a0jo}lh@!Lu)*N{_NH_eoQRQ(7=O zg?wdWU+FF5CM2BN#VM^lW`6&&c)Vr?gt?Y=2#0l^m!sm&J$b)YOt^Cu#+^Ieo3RpGEu0`IAkFZ@oF&Sl8_rT56pbTZB9uYBmT~{?%7SOs-hF0(- zy%0Bdm05^;9-`?VE=2M?y!3@9P5E1aiFu}DX3&Bf?W)Cot|+=#x5o9leFNs za;QjJ^KO#m2wO+(toC9j>^g(k@jN96#x%o)q&MUFY{o>Bv26Bim>ClbfDzVkcNh4PM!fnJ<(}*8< zGk%MWSZFfpMvS)_!RUo?2%B!UQJgw_6m{d%I1VV(_=JcWN75pb`{I>IgK!Km_%3ld z593RcK^CSz%w^$E@c=6<9y!HIy~WnD*kle%Pq#8vcr)F_OeM@zZDl&xo9TDV^a6Sw zVLbQ-G$>}A03e>*kj~Q3jlUq5aBDh7xr%SohffrD(9Sb>EWY&+gFhfp8^VXrPGnC+ zYL*q@TfS5vc%v8T1aq*~?h95L?S^~;Q7qmu%m5fCYp3E>MIC&mTrccVdL(U{r1AB; z`|GqjP1&bEE5O*&sKxu9j`UDRm09R4vg?HtSZTYKdvGnV4!snwxn~ zl*Ia!VFJa-!7s|4P?~L+z0j^jwiyvh5D!>NO6)P%PlcB8#AdnEP|MIdx9ks4HhZE~ zXw+bZ*1Lr+VxbbN&`56~i~@B{8{I<3vCto-)e5~4^|&riorYM>-B_Tu$5`r1R;dzQoA#7ZBlJqw_B$8LCYGCQl^Z=oxkue{bu9Oah@xuU zzC)C2bITpda-7gHOe>Ayj28uB438aEkNf07!y%gsl|}f23+;~>@X5TWDHpDXw1HNS zDH&(0aXP#-oJNI0+~F2)X7Q;OGGq5#{290SSuFl{Q6`1;xIGu|c8iZ=ab+q@qmL2f zU6vJW^s_j9m_aT>q%zh1j z5)Bmy`oI9gkyT8*T`R8~?+BT2$COQ`{m_8SIAEWOVxE=?POEgJ^7N#DuOB^x1^$BY zebQAG=`arrz<0XADr6)W@akD)SDr!kaWn&F1_=KSPeiyrYIrB zQ(UNxfGQR^8*_ku)c`%k04=4211Js~!Y|G*cpO?8Hkx^g3+{La+>s8r@p!UGQR$^! z9ZB&F2A5{kI5AbnPF@-FM_N=*UqT9WAeSR(6-)oDfKm=c$bN}r)s&y23LIvQ*)?PO zVlIl`b+TQpvY9+<-8`3?JiNQD!enT7Gt@X4A|QWJJ=kdU67%qtt}gbuWe#@AlnL|f z>3E!|7K6?t7!%)xht#}qY5|osRa=fD7v)60h1KQ6#2B>7104_PcfVwN;pa|Dq^s!s zJtHl1ytt5;7U%3-;|uBnIlnOG=)J|Hb7NaB_Jwoh03^Kjx%LYVc4m#+Mu@2K@QhO=U4bLMs=oz zz&6x4N_3}dTcj41Zi~$KDqf`vY@<{1$UqjBoX_zM^e>NqSXU&vd{UCg(h`PvBB z<(dzj2bu3W=KG;HU%3}vJM&$Ld>-x|4{V!%Zl$kVlRWPw3hRt2o zi^*WF90kB#+NvYtsFj3H;a9O{8d(ENe@b{4j&SU>ntPxZ!*La;eC<8#{5lbvkJ}Sn zH+M49SQ2pVLXO;r9oSmSm@QGfX0p^Ct~-CVCV4XFfSt0h{!=wiY@;rqN~R& zgTpT`XbnUmUNZJ#BX1UNV^Ao2z0>rMBJ=F|aduO=-e4r`^&u5eoETU!K=+7 zAFmfO)3=yOa|m^460o*GIJ6W6G>6dqWR0>wXj|+8l7mw(s(CTO&_j!_yEOkO%A;fX zHojcY7JU_sRJ{?5^p%)QdbQ{&GYW!}6r04L_*3BZea7k>u5qFDV7!@y?}j>^e(44` z`7tEtF0|5qEds1&wCZ>GgaaI2 z#d;;816~CnAF;F}RYpG2D!jnU~?2hG45zbsR63eW35MS<5s6m`#13+gvyPG= z3R4a9qnk-X4tM}4^Lx)Bm<6pyWzznPwEu!c!>a++r#2H6shn68bubq4nhP9~IHr6b zLxM?120$W;)N@kO(XcRHtzP75lHk{<9l$|?>5w|gOyR!FXBB%`_8Tbcv37@eD|n5W z&S557mwa}3?7_(NVP=}<;6XXk7!9IJN1;Hou_vG=TMG{vO>tW5WB5eY(UNVHUg=1wF0sWtz!M7c-M?1>oyeu%aOKextm2fP4b=v8^!0xIzZ%9ZId#C zG%O~yDBQp&*K6XA9oh?OW~hP zVH7GXJ5u@CG4vSZgSDecE(LO0aRlzSai(!j zcF}mA`4iDsi)ech8MOQfMK;H({u&un$08$@;o{kDQQwE>sl@YSKc4f3#`9xdJlpf| z+}Gd<>mLY%{(1JW!YeYLAsXxNFrt4h*ffX<*xy@l2@76@f*yP5b0Zs>>9foq(M zwT`f+L3E@R1)7aj55y@&TK)gcDSn=>_${c3#D*mtE3MHo8<54Ce~DB%BID~5en~7J zxScczYxd$r+Y3hoekB`$aX zDsp~mQE$<6xE)QoNAofJ;J8S=MiqbOHtQtRpTH_UmJMe{TbJLE!$gSFqA_0P{E034 z%UUC|jwjIMG)qRNzBQvXOZ^}N0nNv9>&0rgeeN-W|1DCLSplzR7tbHytI6pTW}=` zS}jL8nzIYw(=J=@!~K)U>hd_WW&!-WJ@WbW+eib*J9>V&e54~gSK-q2c;JVWd~n3Y z=f)jR!u|?iG~==I3)--(V~+CX`#<3}a4kyu8z@`PrHv2x+W1w4E;Tjxl{a_8A$1(PYd5T3sPS3IUv`Fuq>ApYpWzg}H^1l& zy6CE6lmZd%rCo}y%QlN7oBDUhFo9`a-i%E|Cm%c;1=!ht3WUTI>m}sDZP%iH&aui4 zIJd~|7``f> z>CMFGsbQ${kxB&esD~c|FL6S|@9`tb8%Hs_dwoh01o2les%VRLBSU~E?m*L5;}NmA z;vXT>kM{xKYoq;DmiyR8Ev)9`F0YjV1-q#b6yohJ`0oOIBHE393NYe;F*Dk|?8ZcE z%-ot*p$+Pjh-hJXZ69>&K`OJ9H7Sc#O)$7j$77dN-`<+Qv|k5kiMek5nY)ek6<;A# zox2L->xxQHgR30ah?=ZJJU4J<_8FV&i*x(wH4eNtw$wk1T=GQ8HId)CRYw4fMr$LG z6-%se!Etk@=|{VnzK=`^+?|HlWQ4Yb13V6f)xsdHI^GQ>69VWeKIE4EEK2Jo7hUNe z5R%A8(3=*6q#>~>_OKYoqiAN=jU<<>?aN`Fn6p)@9IYD0tk)Q0LHhwgq~y3OfU_Yy zs8FJEk;r3=PTU;2mP>PqhH`x%(5br88K@1Fp2bRcU^pcqMF^B=1vY4!2s)j106`5O zl@ru-=oaOW_%9>~;D6vmWp~zm(L{DUFhVeqTh~OMP$^Io_5a*>8|Nf)5;+P0YF|K_ zsJw0QbKIAdq^xSWY7*Ps%xpq{`FN1qZBy}ucr?>DJvm%s*F!*z3cHFcwrT_tr`}4C z*m+1K@|q57NQZwwaYzSl2tqA{=+-h{mXc&)?G%h^5a4fAs?1h2(1>{7RJ3XA(^8nY z-c-~+_F1e{;ofn6TOHSsZ;asqSa7xy5W9FaIdB4jgUQP3-A^W;Jg%nuxMExDV+os(xV`z%983mg%dDFpG zQ}~9c;b%|$^U|3o{&`u+iCeBXE+2x}7Z`a>j>+ngw2%|Ecs^tvOO_X4$---lXr|&< zvJtq=@H^x>qVk$5$MW^NBm*xGCx;fwSxCF##A7zR6Y;RIa}i9N+?0HD(@r$B^QKgN zF!hK~5DyP(3Ra+8B`D8TvGU|{CEi^&HK!xyaG{}Qr*I3LIEOW}jciy^2MNoDCRGB% zVAI@Ug%8ZYochEtd@<6+(+pbS*Kk59nJAl9M$P*??R$d`WJknTLtA+&xD4>u{U$JFo~I?kQTPT>k)4s3yq_T<8zZ}@`# zl2(_u(@Bg+Dn1ubHl<5SS7Tf(+5xW87NX~mEs|U8s=co45=@W56<@{K*bS^K+bDY3 zLwzQ2Uf@nec1e9SP6K3-yPYCuAtQl@R?$0W%Z-2-nG%80)@^eV)5Ph9OPEirjHAF> z1aB(ZGWO4@gwo|6WtOOk(9;v3uh7-Y;oJ#^sICBpt6sOy^-xo6&4W zrfNuq+d5N0sut4lzy^C5(2scqh_*h2=2HSy*AWBrP{%at3zb_`wWf^Qg(yw*4$7

    P7*Jalt1@{Ed%eN`|k7jZ)uLF_0sluk0b(1~0KxP{{cZD%tC2qy5*JRTP~)Y}qM%YmTF#f`Ax4`h4m}LBI+wfOZk) z6y2Tw_A^jgAUH@?v%TbU;_FtAFUqsHwG3U3I#z=O7-gdWmB0}#QL6OUD{F0 z`W~2-=UJSk(%6*Rueyak>@r}?6pjQ(alTo+xaTmcrn$FOFk6N8z5*4dOt(lyM2*`w}OaO~J!e}BAU%MmA!Hdj!;FfaBB)7IVJW_)Iv=fo`c_CEy z)S_VO7IGL6#kC+2*+S)1Y)Ya#FH|o1{70VoNc-qMDEG;%!s}@$+b)446c;)hsk#bM zj6<^P>WsA9s}XeiYu!PYvx836(3XjcOU?&4)~#}1s0uH^^H zZ~1aNTW5oqC@C}rJ|OxdC8cl=df58U+O6*?-1?v%_3en3O@dD?#!?-T2=b-lDP zb-k;eT5;N{r>-nb38G7QQ?$jT3b0b&+VMh3wY?Wu<;ODNUh(%1(+Z78}NnZ@4q z-$dWM_qb?Ad~+F=IOhv~#x4)aUG9{hWf`k}ZLIoHWtdgb<^c=U0ihqVP1tQa_0FYp z5&9NE6QmF5*Q_}@Gw7i3bs36T_9nEdQ$FEP$34;PbVD;%xCfeDq}zNJnG2e&I14nR z^kkP=7$_Uo$YUD`lD==h?fdS}uap90;5_HGmSBKmFihyrp@19#;6+J^3<5#suU;Tf z+a#4$BWs(Cc=QV($9vvXF1j2drZoAcnRUHOBlxqd6szz{vAPM`G_ri1e>_CRziCP| zGrq3(#HT}7V{j5U@o9{KHeIno@M5}SO8ihLm1Zn;zY;(#d9&HQ7s8>bT=^t2j3TsiP@ew`3^Q1XlwoBh zt`F6$Ez8~_+<*ema(NZNtFJ}@L>R!CrJpjwz*t$K6lW*kTQ^+cX%Ca^SqJi3DCN2- z9X3q>`#=Zwega#ZIG^eI8`e|A+hZ%Ue`8a1MQ9%62k_VBDc$h^$e8 z*;KVtjNJ2SZyHzZav-4{-ixF!UhO= z91pq|!ok&i6Dm=5pj)<^JD}y~i@FzjX1?i#Za^v8XG{#h?~Io7RA@MreOIBo=DU}^ zkCq7GzQB4`SEC-9jRoi+w8#5T&fAMQmtNOH$=y$a7jiJq)GGSkI+!x8u{xvc z@_Cwz%4i71AnLisiU}TXbK;qXX`LFvUU-{OzdUb~h$I_Y3(gMte6Ln;)$zUN5-(91 zaX^!27`$cyV0OA7SJ0*WAUU9rD3>7G0Ue4URp3rFs36^z(h4Ythc1m?x_td~O_x3U zq_2K~ssx|(63-xBiF~im8XRhjGObG%r{SY$ug4nn4$m4~uB}1)Jj1}hXdAL8pVXAR z)+vd|Ermt_|Edqm7vcjVMyDK(NB^>N{8n{+wE$UUlhv;Zb%#gvjm$ zSp$#qL!SU^K-xfdtc8L0D2>s|>pcA)r9ISuNrW99!lSHMNKV2vpsU1x@3T?0Wb6VQN(l_TS@CE}fvg$%CY#UdS^ATeW&Tsx=-OQ9zdW#LK%~v}iB9JYf*} zp*2y%pd|tVt@C<$rai=b4_@9boB4n}&4FDmunT#4YS3Wz!}Th5Nkz7o=OR%E#zvHK zJ;l2<49Cl3QwR0(K0n~`@-7t~4%^E^V4F4csXvUbj!!5Ez(){YZ`MI%zU}MvKpYaS zbFCHGy#D`t(3!mcf3e;F<7y;Xm*=K`RxWiyKTa};p%T2R$qXt4eUH}`Xr(BqA-v3p zp%UWSI71Wo^3E)`XGE685(ZipzNvIKuuVJ_2;I{$X46Y!Hl@etbrmD`B3R&)ci3@6 zm9iMk+L-S=)d=KD!$<-k-iHBi4U?FwCdRiGdj^M0K_#a$)$5^v6*54Z;j1x;8j;%_ zb&Bfh;Mvkl?KX zs6RE&^-y1-S&GaG-PZx2YKmG_b>!~d|L}-{+Xq%6N1Lp*qB3IE7Uz-<|K+d@2s&wU znguQxzWi=bt%yX3f`>xha|zNxq1{g=TC0_GqqEAR-=seeO260kf__i9dGqN< zvq2ndF+u{>DtC09xcPES47*>7I^-BdG@~-vuI9l13C@!==+t?Hluum0q=n~BEw1w; zMqDFOnVCB8lNzhMd_ukOxqwNPg^B*+Vp8??Fxh;H!Q??;?+j_`6(*Gi6XU%@JU+k@ zljxNZvpV`;$oCqaIp~ zQn}KH*5StslC#_f+&3L?YJpWOfF6$nDHRi>#%D*M9?L#I54f2xUZm}F*ga_*4iRlX ztj1c5gasfQSQCEu+`78DWc!YnlI@!YCa8O>5Vg8F**+PoWvY@X-b#8|$r~4{N(w@7 zYx_65He!xrkQLD5yg=U|&>w4{JaNW7FWH4w=Z7}RK%41>7KCnOK4U>cMmc?X1pHb< ziJv0=A3-xR%`p#T#WY6`m?Ab7BHNdmH_MUXS7iFO50j2+4H`kQeBm;5&oZof$V+HF zb~$nRUWky!rNOrl0D zMu}NQi`_3;i~CXwX1QAIY=wq}fLTEmZd1@1YV2EpVA(S?D>46;T5NQ=v7Fy?C9b$`vmpY z0iiX8fN@?S*;$s1ZfJ|rYlWHa6|gvHG+EaQ^vj7p<1XtM94o6EIBk^Yl%i=cQJCfu zk$B}nibOg|f$tBkpNF}?O#;cla7(A@{CZ12z|xx%e;JkheX=8w4j?9>Z*&*b`4evk z+E)M#Uf+mKFO9(NIkX>?$)zlkA`?O_21jcka&7?WMTA0?EUaK9)>X zf9w#2%l-^b@si_Clufjr=S;g!qP0dA4XsJy3G~X8(nIe=I`Uh6(?_)+X0^IZp7G{x z#6v1}o9n(ffE8QUE0Z7j?v|cX=-(%brQQ0utiihg)`z3C43p8m;9Onp0IS8&`&TEh z+CGj&Q9FNVwCW53zBXQnbnJVS)wkY6pLmiP{EkLH#8_tmkc$j!Da{aIpCgpDog|p} z2tb;-#$HD$z^Ixi1wJZTTbvkSra#nuX=L?%7UIKL<}r@Kr@KO3Ot%=AkDM=Kz&+#hxeLe^fby4#u=zm-UG4(G8KzhUekY{ zXa-ad;|y?Bp2OlmuAD~#UIC~XGE;AN5r)9vmzjae`G&3(EZt+`BCcD-7W0Gd1zrbe zl|xK^XqDv{1|q6k_>(u!AlhKu_&L4V~9DErxG7NmuUqs`22FZ2cOBn2bLURd(kaU2k;WLPdWg6cRGMx zj2Ms&pPUW=&(Eq3z#Sj-AkRz5O*jRPr0j8Ql^{^q(wy{5nr#(R3TAlCwv=;>egPY| z>weg&mQiYuO>>J)&q;P&HCv4NCy^;%JeV7Y8kSVkt<60AIU}9T*&e}`lECeJ4*Dd+ za9VIBaKJ&^NuI~NhZeNsJZ37d)oq=W-vUmZ@){#zH1+LZ^tb!+sG_E0wI0eOjWcps z$3K3UJ`L>n9K#7^J<70s@z^ zz;z|kqhynPHys89nBvByn$Bc9dkAhaVR5e)(BS!)!`vEC@<^Qk-GYcB!fZJf?7urmdsGmVf;xVOs5gp$Sb5f^fuU9>vfbT&Ysba8>w zqa-5^Xtzs`l#e*xT}l&yx}C&ePN^i|fcUeE0d@}H>x2?Xz;XCzk6?Yk##7(9XQyg{ zxdW2F4?TE!k!ew~5AE4hjJ^hk94G701Fm@9ahbxH+R7cBtlNbgv zU^Su_@LRKUbuh7c1VPN(ova~aao}P%Mb+rX^op9Zqb5XXYaD zghoQaI7?uRYMP^Hq+yI~n&Xm(FaWo-X^u-7{jH>Fjv>mN5vs1BUDqADE|=$Thn??6 zYh4W9FOk50FiQF5L(}$^)y(6it@`GrExsk9K@V})8fj_>1`u`;htgrN6|dg^Vwrx) zJ}XuX;CTRM=)q=Yfc4~k3_%sMi{Xb!jWd;3#UY7*;fEATf-E8lVy0l)r66QTk}D%v zot;!FNpkUmKM5TOO376V{-jZoB$q2#Nu)wzaaj;!_+aR|O1O5pgOSl-}y)0DUQIjNd8JsC_7z{ z=-xC?f_XCdXgCGFICd6$osv~?(2bMxJs8@jLo!n(6=9JuEx2ji(Q`StVqZni=qFZ( zbLhEqdVLDV>xl9EPolA<^&HMW%DL}pV{+71~`&#VtKF1a%dz2r8y&hdC)T#MQ4SyRgJvxhf1!YQX}B-p`*P@?T-}JN9e2TNHD7~R|Ma=36HLlJJDXNf!{#j z@PZdQz~^(82TPVSIOM>54?TUh9huf+n2rIgj-1082>{4iCi8M3{fwzrxnk%yuHiwN zI`p~n5;-ioO)lE~#1j3&89cs70d4!x3sxhP2UB@nC@u2|84QWB){~45$U~J(BH&9k zha4rE>{WLancMr;Nkamz=j zks&N{+el-zCIP&w5mO1+Fo9+d*xM`yoJm9&E@Usqki*K3>1FS(3@1A*9I{uW z>iVqgsH4w@-sfcRMs__4D6YpCtA|&K;s5UBW{h3C)YdEYHTftaS!4jXqrNY6-=n;# z!rcAF`zw0*!K`i#aEn%NZia@)-JDk0_C1!wXfI)AvcW>=Az27oC>C<28#H8WU_?F2 zDxJLu#Mymo<5~;FQ!lkYRITMd` zwPFxZ41yEQ3>@uZb%X(hJ@67gt(G#-!C?AUFJ*uZ@`6z?w&Wxq#lW64vDUt1@=`;u zwxB|PcGBc8v6Hw2p~Hw<1}*BnUYulBmuSLEg}mz0~0kf zMIEy#F)Ap@8~3~=FY%Rp#9NX(6{XI~lgdpKeL~sIzWVPmviY+wy%tS=Lo`{Hc?i1CM z5G?AQgn;*DeKboZJ^Mt{z}-7FbdL}BB~>;bI5otjltgQ-8K?A4(wrZ+chd^L*A;~) zDTa?iMZUQq@A@7jTm&Zu&A<}`A%?(1JXNC+AqiJdvJ#XiI~oza`uAJu-1$Mz``+Vx z(DS~x$cLcBTt(Ep?`nM7(~91we)68L=yhu{RcSJ%53~7^9b!cf=YjiI^zi9_Xho0c zr}n&}H{lj)+8`@>LIOuY3ase;%Q}M~V;^)T?R&jh5)mSzoAaIW}y52=A_--jI^{;@BTh@ki57;q;&6lwG zf;<=x!MYqJ`4a>GSjLewzP5xmWlCfeixX~CS5n5ShycSW!Dm&1PX$VZlVR<*Z-}Es z&iqCA_CP7l4~}B;F!&=rVzN*ZE_{0}jz7{#d~}m0HDNpz?U%AZdAvNZ>yT|39uf!; z7KX@ZI1Cteg#FK8z#}9^iW{ufeff~ka zTyjo1IyOj~dw|46`Tz+;?x+JK+F`84%@v1;jy(vcA~k(Ayij3kcp1_z#mxB;mm^w8 z4_98};G_@dN7&!!>n7sB13~-CJme*Ex*M{;RsACx+~JT+&QxWd3sjkjJiKIfd}sX5C5)l28k z`KYk%AVURNvORM-JRAk+6@WHzesTr_8Th;5nXD0uH!E|p#ZZX z^mr=*>&P!1@XU5XN@G_F6#aI^v8g?f#n%`r&NM|Eb9_a(;PDld@7(3A3%1scFJ5EH za+;%n-V1US(!}AMLV=Nj=M)OK+wQhNHRs`slzmoXbH3FGLbqK~b}1Lp*>DrO<_;mQ zaT;Z?V~tLhXz?Rps`=**FyePDAkk2nD#=cA2AM|6VUk8YzM`wt(XT3Qu9^<4`Qk>u zx^Z*K%}!T?YsMhudui!TK)j;c?7xsh0>W?U*bg|N){(*W&k*3V<%R%F0&{rr*?ZQ) zQydIET39F;o0=ACyhbaw}dXh61W#V?R!!a7oCE z-a*1aRCq{ZA%u_j{KHjUZ{)a&#e>voGw^C*Gf=587*^5`m&$u$9wjEMEfSNAGdX0qG$Kk3eesd^a0uk>i4j5+7;C6R6@RDbG+`(yO@sE zU>y%@taF@|+vBc_a&QVW{|qMd@$KiLHZiOcn%%(74rk=B4%yU=0V$_B;6x9;d%OE3 zJ(Di|&b;9i`5VH+_Gb6CS2SMIqG8eY@sT!dKLh&!D#}zl<`G>P;b9_s*v5Ug?n+n* z#UvCmVp61_3NFKTWzY4<>?6|2u#YHc;LTo;d`tL#8PlJPvgsI7=)Nsu>hzoM#y*lZ zA5*@$uVKn1(jl2S|30!elE0$`^2;eH6AS+i_SX0@=_@msyeL-0i%EeUEqm@`ZxTS_ zNO(M5NX^i_)5~Hxbno+0vk4pfBuIO=>adn! zIEX%$Z}OS@hCoiN9B|ApgG*zK2$;s`>M_RpT=GIum3cvHG322lPL#V8}m(we*i)5;mDo~$?l$dc&I%3Azc7f4nT3PwL*c7jSb zuRaxNk8_f{%xtFWaQPfB7_}UNr(g>8fgZ$TNe~hNuz~DLj@i&mb@!IdP2P12&kaNojzKK+WpL1W0_N<+DD8=IDm*M>wFkakYZyqtte{~a|%4lg+Dor zaexjJ=_l!8CwDr25v0s#8xl)=5=c~fx@tuCE=;cu>G`D3r+6p3IS`&bZ)Hv`+@gE^St=c2;ex(QjC)Ij6*^rU@0`WS}veIIFH%S;;cC1Mw1Qnn@J+_>6N6 zu~bcBus&k&4Z*-F;#gXuRItct3TbnKN*Rw3bUFjYqF}zXb3S^SVG>T-HCs%SI`#OD zR^y>)GTFyK#Z)ur@lrCcC$99We~6Nz5Rrto$zhql^745usFykJLz>UXD=jl;x0wn; zjX8keqJLb7m7o55lkO?6PU0FM(of+ubYU9E0BM$A)Ogu4*f;he)+sGM~U zC&FSt6;4I+LCtDwr{go)i#by3=Dx*7YEA$~xzGBV+EfYe8XyE+o?WZ=KbIl1Xbpa3 z3XZ?(e9jTcvl)*7T||#qWzFapLK;!t$(5XtP5!$uk%aaT(ms^Ym*$_@O|2%N)Qt*I zxjsH!MGh#l7vN=7^;o6ogT^}R-5vqr;W~$!!*!P792hxoXX)|$&hvJznBtI>PGQVP z&PM`AvMwj54e3%fc?X*EFwY?vcD=8Lg-#99U)5mbFX0MLL9}rqAI%d;$Ka z9AQ5E`K%>a#Uw7PSq&ddPhj=ks&nI@n?bq|;Z{l+7i-}YSyNnbPpBYfgNE#6>^=pQ zM+oBpyF)A-k`V)`x?Q$7V|zLGmrEhNfu9{wDjoseSli?3j51CafGD)P5vV0Pp#}KK zd~cG|2}PERZx#b_`x7k@TINgSJeU5q2oJyq5%`@FIYUGGvR3eNqyl?9J{4Ji+YZ-TZE0~((&Bt&3Pm6$vkXw zLUtF55D(fqxI(q_(a%eJYo)!lTyOFkBGbz0x|PT8(rnBA8;zn756*^4$G$Hb3?m5t zqX_pV(Ujux&H4)keqk~Bj&vx-l5ygY>O`5@ph+y1LuNMYeUEvh1}`$W}Ze> zx%uMvoHj&d($N^1e9i}d0pP1~k=g(Yv8)C6RvjR|w|a}s6X>K?3Q8^tx|P+IoPY}^F`I^_iI(xqOVn*34^M7jaGtbp5|y(A3x5g>M|id zgr=85XJ`>^+x*7izUGLgkM!oO`Vcg|!_7%eju=hWmTPcL{+w>a*KiY*6880=E95~L zddEfonuKHwpXU)^#pVcn$jm+lKJS52x>GO5U7JCdl5((v*0Tb~l?{tgbE%M@ghJY# zgs1lt(VmMoS&d?=Sk3pad@G}>zC;URdWx2vuW<8npQCPdT%5=VtbjVfhPayLEkgS; zPSV{I(z$4E*nOn2N9Sv`X~*?S!lGP=1~s&5%24fgd;R%ddHFQuWo?y~EFt&idSdR3 zLeZ?X5PbR4D1^h8TlE*?Bw!}SnBGs|j2paZ3z8F4#%w-AGk|42HyfTvw6n0H1){Zy zB|}|&;r9occiKT^PG^t)fA#@biwvz=BbgCDP?AKqr8=%F0hP`JFL;fqUdFX$L4v1G zMjMupHOJx0vtheU?vfB4(yDODi-HFeAiU3@7&30 zFK?&cp;dW>HWiV6V=As=1trxSN@Xq@t!yYng?=X$L3j#qQ=8?@xJo;H@cRB~;GF_^ zPCpTt^&!F==~)bu&-28 z07i&`MO%CT=*+rFZ_C+*m($Ek07WO^%5s#I$mboE@h}Le_Z02K|I$N*^utYQ|w2R}jZff@wzpw`=GBzQ$$qPHAO)^m*~ z$qq$uu3JD)j%E(VO$WSRrJMIz@Rz5J<7zz2KJCK;Ktih)i$j&x^O5spzyk>HCFbY9 z7npN!B2C0ltw%-Cn@#xTJP>LekM%eZv>LBx1#*YzsKMM=Jb)LWirYo0r8u# z)uN?@^oKKPh(Aj=0hMLA7Xv%H4!%7oA7T7>ehS&=o}Yr9D%OlI*_Xarv5yNjntkd* zADs`8r|1}2uc@;{*BMm3CQOxNm0rm`%Uulk!(b|MnFE7+!EWz?!P-;j{hp9Dc<=Hn zGKY7W38s}IRq)F$8&*KXE~D|r9vy6S%><0>eHHog%Cj8H698$7c26_RCxIorS3W!B zz(nF!7A3asC^_NO0~A3@j?5uYPB{0 z&v$0_Ztu7pkLBMZ<~Es~otf{vzR!8>-i0aVkp|=e=>Lc|(n3dhb9vlB9tSR_@8NB) zmNljrJT9q>Pv=nk@cWUgkRi*q2X6!~2=WgRLEW&PQO$Tm$dra3k^BQcY&rDjKfX7M zKJxc8JQ4GYN54-ozt{nf5LJQiU{_}===+505e0voOZcOoxQBSPy;=_I)ByPmb|00S{atMi~#1Uv>hF=5?SB zM-kqf55v{n|PLTp9VnuO^ulBMw07@f`gR5VD+0uVic=w{Fl{vov%clq95U?S@70d_poMME z4VxxTc&s7l^!z|YetNQ%ri@OUVGwjlP{@RQF((VQkniXXnd-A?b(^yYjQ zT88|)r2j4H-zxo^rQa_7>!p94^joCgB>k(T-za@u`abEqrC%?7m-Ig;{Y$04M*4fC z|AO?Nlm0I0cS!#U=|3j@ho%33^zY|>ZF~3+ERwsu;v%uWd?O4PhJ0YKahWYw1F4V$ zn&5Uni5>M2lm;jQ*}ha}TO%SSY=f31W`<9vGE>@0v-3$=+>6{`E{a8H9-!~08WAyp zBBmljR&+NN**ypF&AW12JJ;@P2N0FfJLYW-1aaQpus;+U=1E{Z%+V-Lgf@d zY4U~e=3Nu87XD!;NZYiO)Q> zjowO7TVDzu?Ag6-qtU+Y)p+lUhQj~1vz^L+HkBf5XnD`gXkPm&{>7NQ?G7{qR>>G? za_dyM{I8D3^~?|V++B*)=3ROG2SR||ERKu4)W*|sX>+0+(+p4p3B`+!%nsIyf*bw}JEj3oaZKH2~8}uUjHy4gZ>jt%zW@qce zpH1Zff~KWknsUtt<$3iK?cdqD?rZTLcZ3TI5o?>rn%Zm0HcZvkddXc~^S@M#GZz70QF1Eek> zqlj%cn40c(I%-4p$v5|TKDo5~{;3f2p8%jI-BfyeJ7>@QwsXcoFt>h?c|#Y9ZY!LC zP{H19t5e$BhR@xxDWmPml))>~=02BsHO;)5ciNhtw$J^);2W*@hT_idr9)}iy7k%2 zmQHHegpFUvSo8ja-OGWCXL-{Q!KUs4 zMovfk-PEneUMLx*O`}`$M?*7jpv}DIk49wPunJ{ur)XOJ*oN5cdt{&qfwscmBlLJD zMfGO3Oat)a1l(4V2A0m;`UxVMciOjnLXm;;woz>tq_n{V*tKmB(!CX5^n8S1voc$T z6YNJyX3JLoke1o93=f1T^gk`1`j3-tQmoYXxz^&9$>AX+p@O4 zq`$Up*$W}&!7s0pnvYLM8-JQy#-JhI5_N2QAc>9-u!?*m7PSMpimjD#8nG%Q|XXdCm~pGq2uCg^r*?9~pwItvj~trc-%MMJQ`WR6*;hphwDH zxNb<#FWU&3r=LC8sHm9U(=O`S-j+^WWBW(jBEHzuwg?9yBAEB*G)oY~`#mx54-gLN z0AZgdfUvnJrFYEx(8_HS6+DyanO4z^U?GVMEM+dtUK<^M?fnB1TYuI2Czw|I)(^06 zUqZhY*1M-|ZQ9no!M&l(8I#CZDiZCQ8X=+NO>Xs26Cp*92?odXRQ09v0R_* z)Qj67?6R=d!3boxmZXR_ZkJ7Lh{H{mS(zwE<>T zK|3;`y$d=p5Rt=iU0cPF-UwR;IP`dV0EmUuqw9l!UhB%fN{zg6PGuQZa#CRmF;3mm zIBtYZoNm}j`~_a9-7;s{B{IF|w~^yPd>)cc{$oruc;$l3NBu)GA1xle^@DAtgU0FO z3wF2TCs^mcvT5kx%CxyJ`|Zs;Y&cpu_aDJ-(D-sHpZLAt0~%Fag@NaS?Cu`yOE-U% zwrND|mO_$b)I0+G+Io<4Y&%vd?OOL@v>({~+x7(rZEL5v%txC>bMJ~F+b$h6ZtFY2 zjGkv}+nax7Yu=eV_g$SY70}=sUnEPx?^JhR$v41*uTkNz$>IUOYeK;XYg-RqzV0$H zJ}ubW{B~NnE#S{IK2Vlu5bb#cdIarx6WGcE1*kn-JCK-ncOj8-?WBAK9pSPDV~i^D zlRZQJ_jrHMlOZTTj9)J*_#l*_3TU?L>D1Pce2Dz#iu`X0d|YS3$F^$QxXee(hiu)g zKa0BCKPWy^(T75LjKvoa@zQ(q)46k>3mz!=fR|d^-ug%W5aPG0g1w>o^%UxXsBstA zXln<5&V(LEys$qJ{R2M%c_PEtcm_QODB>R!k3i8QB5@=>67%7n9o?q`U7_-N{wXcn zQzROzFDmGTOol1are}}ShY@~10*A=fO%dfC;P_~}wF#A>%df~G1EHt8M1cHi%T5Zm zz7ibK^9%4}^SeOF=(h7=bAm(LifPz0Ve1E9?ryu%jyl#}z6IxB0RGWB**-)T^opvv zK=tNyLT20BFRU!YAvU(HBHQjCv*iFiHxFae$ma>0dZz9`#F~pS{0z?yYsG#c4W{MA z$GxWTK5!Jee|s0W_!snA>Bo?G7>DsEj@sskgEebDA`x!ragIY0xHXW1l_N|t4|NFE0{ zA??-mF5t2Nk_$hr`#(Ss!S|#Is_*NHtgkC|fh@k~+ti+Yon7w&qHDjT2ZeiH2)7U6 z)KcW=c}yS_BfFHHy*bZ8J94~}{@L>OfY>PutKa<(= z1{z!2JfA(b6vbthc4B-Ykk(wp9=nvs9o%+RHrF#W-QapasGHs~cCL+yo4(Z6lD!5c zw}NlMkD(v>{2WRk^w42?sEyIBdD-3HN9EhIxPi`WX%+ahk5p`g$F%p6p%tW-^ntxy+8HL9w@qmKI?vqeE z3Wu3w-P-_)XRI8s?gDBRO@UB5U%Kr^7CEi?9^kq=aWm|PWIG_KrO@(A@q-W8 z*O<_41K74wyamk^gqYCnz8MXG-&)Ft`7s0(op zIn_V#9>Rv;N&mno>P+|oZ`$Efx^{O#d$&WsRUlXyAzzs-8$o|a8f0l3aZMo!*h<9h zOU*ABrFHGzdthHz=C%8gwl8%KVqQOxdF^DRcm2I{cO}G|q&xFbRMYeVPD-Xox!w_y z?KNFH_D;*kq`B+q&fTxQ(Y34d&DVCnhByUroiDt$qw8Q-_iH=$b#?uBUl;x^&7Ol+ z&cSEKcZMW&Raa^rswOFg%kN%~&Ogg0Q=6~`#KG{8yJP=Y;+b54;%A=#IgWM{(Ig?a zB(qDAlR$a#6rJ1iBZL0D=%D}*wTTLh0{2yClNund>O!uND#%B!wC;ak4B91&4e_s# z_ll7HLl|GMGlfa%d;>YDL1Cps&6l+S&4$vUTG}M+f!DzlG3n{R2Pj*CvW-+Y5Qh8jfmBsFwOEbtx*RHu5l``a_(T>EhAh7CNF@cxiTC6h8h;xk|J1 zs3{>d=RD?cO)8 zXArnn5ZwAT)Z@yxzXqF}iFu;ulr!w1(G%GSCQ#)pu-ue0^(EpIRkPsvE( zI|(>-+cJ>^rTg{2XWqUev+TK+-I-fYM$DEsB^aJFTfPp;Z25#X8HD1*Gi7gSfl6OGbqsJ4svac9YR(#r_W^-Efn*fkH#)nu6M@|BzkyY{-tF4``T=wYdK4_=T+YPl&2Nks6j{cto^`1RhNeS0xhxRdJM*J+f8wC7*{JG9+3|DoJr)U@0T zWc7^XZM7qhVei2m2R5NnIldO?hr&ohTrWt#3Ghd(;Ov_Ka&%vcVO-a{e3T@qk)L_n z)0t&^LL3A-5H9u6p_tko-NSIOZO+sFEs^B73EW|h(Z@&TIcTG7dor)(BcyO&w%&q_ zEiYxZJVNvg$G1Fya8C;7`BWEBdf*Olj=_IdN7cr8ZtIgFo{R4EpTV`F({)&C=z5nn zfSJL9nYVRhmhK7HO`MV0@+m-I6{qlcAVOEd5Sd$vwmn&bTf_(t!i(|J=cuLs2gHI+ zVzGZW7A&IKKl3Xup*5LXU%(x8ui2OCLn*Hx@SoO|+K4A1ESb&e)al(lryBf$`gZr& z;UxWeeYss7Aaj1#pGm8Jg}My_zP6h}6%Z(-Ekz7DX{S27IwYAhTh2nmp@Mcp-RFl; zNYVv^e<$VUe3Kp7hx{was^@05{1d1}oAw{Tc{bjELlJRt?ndvrQtPQdd~BTgm15v9 zb1Th9QRl}8eo2&xp)r1jPXb1xj5Nk*(j;b$(ee)}VSi`gr9=b|1tMB-8F~j!+j=kj z1C^qyCWc$cHPeA}sqw^&oGb68QcOU%QTSc-F%u7Hb~tHkFG_>}en8lvZjhGA?_L5D z2%Qk6k%avwJ|z1M3`T0D8I%ubJ#Y_|XR78_QO%9K8Vq*un|Y<#iyy{Vr!>11^Ow@S zFwO866VagB*Z~(n$t1yE5Zx;=6<)(j?CPesgxKB#nYTmiUnJaM{);htW=lJKW6qP= z@>PUdUuk~BCWd1lQ6e9rok9|~W9#0oKWAR|JH%qj@rg~({a`1SY44!4?ylXfoiBFt z{f&EVozLlmUfum-ckq4AyMrRh_bn8#6`J5?_+9&Z#&YS(h|sru#Ilr@xWxR0@WQzZ z1ACzPdJrC1=hmS6H&B|ym;&#ZFU&>~U!ZFO7{*S7`@N++nydlgKdt*wnX7phs(J0- zAMQPH78sP*$D{Uj0zKFLnKxB03=^j7-OLszAi)}!z>9334t0yEc?-T?h)uVXp)gX> zE#TnY1Jelj;VCFjXg|_4W4G>Y9Eo+h3_zr|6EhE`Ht@=j9=r(YTPQtTeejQD4|H(0PkFRNTz4HeQDouxy$FQcISPs|0g*QI^ zuiQ&-d}(3VJG_RDS993!vNXu@pI@DrhNsu}H~pndPlfdT8}_>EA2gSsbpWh{fs8^; z!%n5a-~=6A?+W%VeHv%S@Zr+vzmo)DV}rjJbD|#SpMnVL(4SuM~fz6KNjQnyQ#nf z>p@E5uLVE96%vGHI7eGn^WSaFAE#~_+GhXy!!uE-gO|R~k;N-=q`}Lg4ITNa_r1sn z4Q)4XWWEgP!}31WM^|r-FQPwu|9V{aImP&pc}n(Oqp|Y#^VjK9vy#7{6MD0-k57C? z&w}5Q_x_53YsY@G=sRU&7yhB~0G98M{`x5EB)&=ems`@c|Kb@V2)1l)re-?{&rOUK z{3uf!j_0X(ehWXaF&59CVje!DC{r7cXKa15n_th+6g*>+z+FU#j zM&6&{xs09>f7_esS{0r#IAqVipRPIatX|95GiTVfEAadf;OE?(rTOuk1{iw&GM={~ ze(n32+I4u=0nf%~YB%CJD4%b|a{~q=R1Q*)>iQ<2oBo`|aX}g9z&Sn?azf$0u1}F* z!yom9F2Vs_bl~p#aVH5mLzrNw@8*kOZj~^2_jSxi;!D zm-nQE8O&kA?J;16qOKPt481RBZnFVH^yri@L;HXkhMfPDF!aKVxtwtSk#LH@&#*W! z!zB#u$(zeD+Jhw^Hb%mv1BUueyhj&;{91&k(%mfJ&&Chgz zY?p+g1uE)SEV_3}nA7^GD+TTOvxGT44or`PQDj}wIHb<~OTtWw17kZ?@I0+Po9WJx z!*4d0C1K8xG zsD|)tlru{L<)NH)5~e`H#G-{y!psEBX#B;3*(_n^$0_G(39}#$Osj+`0u1%t;6vhd zx=1J7B4Owax*_}1J5~t>5wqRfFZgYbTZ_WaPeCS zQxXTJQ^J(;_JCJ-Z^AdyEpJMgvOZu42k%Lk^Epg!??_q16zLZ*o9$D;IA9a$U05@( z8f{+$*wpcYpXr2@Sq5>^j$hMJj$Ojgmt$j>V`F0^OeJ7q@ha6dS;Ek=uemM+`9(B6 zTf)%pkC|8L2#D_y=nwbw@mF47I*LOMH66R6~W3-ug zj2zM8UlQgrz(n_*a78eKCkh_BJWe?$NtktU%9$u(7GgP;`fl{upg;9JTf(H?71=K& z@rz*cB+STP^-a^o5@u8!m;>FykeR zA)jWLKS-DfabW%`VJ1o#qdy9-N!0bBggFf`)MleSVR=XVX@bWt1q|WGfHCt%ri3{? zPC1H%QR2YNlrWP3Lv)YT_hJb%IS$MU33Emqm`f#0b{rV5gvp5mbG3w-5(nmM66Q<^ zW8lzC)9*@{+&C}~NtmgC>5E<+66P$x5WNf>n(6gh33IlDG1_B>d0oQf#esQ8!c3De z29FI1^BC)uFw^6dlX<$}u^E8rOWx0rF!_KXdttQM%&X^0n1VQUEtD`bwT_rZ_N-66ULMVA>=MyQ^0x|S0v1c@ANGfJrc$a7@}7!T6`#BGUAkz zb%x->%s4PpButisiG`m95@s}DV$XwYY?Xu=6Q?d!!kiqZu7HGLcMJR&eILZcMLKhf zgt5hexn9By0!&{xG}a<)-|d?>ZZXP<1M@uzGdK>+LlP!M!o<>JPf3{6IOXh-Fhk!UC4-^e!C$Tj*eZFWoJC(KkyrIa> zvf21QXhj(;pZOlBE6QX=Z0^r$@WZRi*wmjoi$=1`*}+%W7L8#(_R|+HE*i_WvW3sC zE;^ar&gQ>$VbQ7VA=bWkMbUWn0()afMbSj|H}W2p-F0tX z(RB7j>Hl!h?4~n|3Ru@5dth?WY&Lwb@QbAHAN=Dj6N}Dc_eg)=;5Y6cS2T}}P7(g{ zltFnTi;CEF(*Kq8Q&PWwOM1~FRxJHy>F-Lt=AxlRWh`}w@XsIe?fJH%a(1KiJEcEq zXysQvC|t&_kp836Pe~K;7p8rC&EE=FvOA@JQ2NEgp2~Q&@FI4z^#3k>$8ZsU%kb?@ zzbRbH-j@E75hDDZ5$+eCE?md{EB#CDBK)}YPffQ!|8Sv;ZI=E%=`YF<@!!k1?qBy5 zYHV1h@cq)qsXiWGn)UO_Zx(vkkEB2TBoS_v{)Z=R-`iFgVCqQWcS`?)Q6l{0sP>sx z7j9w&qlJI3^iLln!ncfRy!?v7t62J2;kQaZ^<)v=a`HWYs4U#V{ww`2jT7Ns={KDs z!nRXKK6zf@HSB8Xr;Qik8>Bya!n4z+6n=%>CjIP*BK%|N&pB;&=jg&4*wfOlJY9re zlfGM-@!i3NUu7Rl|N2QHeA;B;KQMXxKmM}d7FK+Q@H?gN$-bcR=>@m3lpNvTDg8N9 zMEIpCul(xU3+`m@Glf4qSNQklE;^}g!FINIs__3N{p-#W;i+f;Zq$ke-($~9->DSF3d2-YI2ie$jg#YY0Ke^--gd5L&rhUTv``Fa;CjX~x-gnu{=Uw@O&UtsR zO>;8-HGkeMZ1mh$u77#njqJX;yKmSw_c}Iro^!{4=Wby;=6&U>?eo6Cis#?{{CDOB z*e~bb_sH$@8d&~<>zZ5U)v-Gk%y<>BETypZcX!Oan5l(3R-HC~C3~{)@r+gTD_B-h z=P#<~m$6HW<~?}r{35o!s7&2C|2+13k^W-Vf*EY=LdR=oFUVzO3)y*X3r=SZ3%Bms zv0x0leqo;qGb-V8qef{Ba96^$z}*A)7~Iov&%y11+Y9$sxTvf=_z%SY8!lt?DD4cm z`EXTm^>AN=`#M~#d`8?WKg!ZR{&AM(z?n9(DRde3fMAr5-+g+W?|W~*6Vapl9_y9i z<@oZ;gZKoDQC@%Z-P-!Pnk%Li%$n|UyV<()H?CW$)@cD<^_RGvfq)u_>QK2ySL;;2 z;@znFYu(;Wisn&r0JPYtxmA~SA|TCX1vN^XwZrKoPTLG|bX z#apXTc>QKw4JfL!rhY2wS?*N=K4*=}vrMk`J3WC~)xS9CsnIpBXR@L@>)37Iq|4@@ zX6^5NkNbF%)cA4yH)@jJ%o_I>b}8vreI>gDxEbOiZwmJ zs_TOum+G&oaeCNtbxk!pzp`uzTj6$13+S8Os=|XMCFRxC%F2o|7J8boT0SrFdxJh@ zRzzqvE3aCioL^kNgq5nbZlHxNa(UOQMxat_bowj2b*yShdDxpd8%B#FjwPk z@cGq1060(rL7&g-*A*?Gc)U82JhfU~(672g@96$qF@D{tWZFaNiynB%Svr2kza76W zOb0HS7U5M-q%OX@Yk1sJ!WS-%KL=ozAb_|}i%~EBRZorArFrU%`m_e0pdhcX z#N4o&dXQGh2_7z60QhxlKz=~?Yd)rfZKwsJK9_n-^~KM|%%4wVuWwLXUR5B` zz$y66Rt0hmWCC z!ur7tB}HnaCK%8`HI5EYjp`|Oy3i5yS^3;2T^@&`t%w2htkuv+S(bot#fJq z=`}cMt@)-E@l5MBfj_{9L62ToNaR>|(V~^*i;64CX3G9954zoGCjdePE4i|&JSCi+ zW7Y>PDqwS5Q<-cn^?$wQaY8+M*IxkwvQn?U(&?#FnZ9vak$^8OR0`NC&jycolPAE(GLGUW0FGb?p4N&3gt6)>Mj!=5h5`!ymcG|V|pR;S^ z-vxg^+~s)Q0-xeL;69ac6u%jcUJ3Z_n#4;-a5}XY_~z;(ND6g>skyMpe%0xk=JmK?e@UdnRY4j;non(n z5V72#=F!icJ=LQ&>ge*UnT3V&QKF1EIufD01A>wv{X%qI}KFUxSkqY4WT8wYYvt-IP28aq^=l$tl%1nk>Rd{&32MqGV6I( zS?`5fP+?hkG6qcJ+ku_UUTN_X@lvv@{kVjM}+D5H}tq0&r?%0N=oEdKvY`^eDOxFsq_Xw zK6L!z(9>eSsv2#jXHyH7_???kv=632T?KJq=7^G@f1}F6HFE%76DKhU;P(0>az_v1 zSe3U{-{kazBQX}L)_~PTex0~*sW+gLp$>vrY;`?UaHSV~$twL?1N3A`z2Dn_uGOF~ z;2&PoGN+F%b-HVHjOCUB7HkFf5!9q7Nlkh*dP~oy-U>6tU{t}zbgo`z`c`8 z8JDF})rZCqX2cVZTnrm$k~az(=!BZUh*Ng9T7*{nojwwT0ONy=6}1;>>ZTGeMjLf# zI@Rpg8drP$ZdbLpss=3QiHs|OeEFTMWbvYvs!w(5zz>k@Db*S%PKH2r-)6s7SFf{` zT1`Fakn+mv5+Un>dasX_ttnrOafhHbD=#TgD*axr0GCu&g%cJ#8&|3|8!MfDX9HRc zDGRP&UM>5vp1--3XGPWe(g#w*wxPU&~%)< z73xOSEzm`H3dflqOI5e-TpAs5kq|Im0L@FBLAQ>14;75T+l4{2P2VgcWNL}u>w{LS z)6hWyPcc>Kf+31T-~w}CChQXtwFITD_w&XhJvwS8c-9r<6Fk8r1hA?X4?z z0y#C%7lA71_T_32^5>Qz&gp9|X2s5c3dvB*8hzdXm^2iz+^Yq`p{jbP--mH(0O^}m z{}STIDu|SUYeR)qkOh`)u2TJ)(=9XugD3>bJ+)pY)KalK=wIn{X~6*6s%wkfnlk{^ zE^HJkb9pyOY%X5{{jm|Mk3Rs40Z1a<@C!fDxicC#1!Q2I8EX zs1(6n<)vhGKp&?Y@i1UQ`$xs`S{DJ^8`VV^A)o<)4XTSC(Q=Mg$c!N}BBIi-$_POp z1|xu;=_WuKa|mSEGM8g!-H6%E61R7~)6L~hg?tAfK~V5qLb*PIz!|ld@QLR#Rj>ED z0!)h1#SjE;a3vi|X}%~8Gtpj%PW7CbE4YCs(S=!t$(8n1j2(#P(BFbZgrLjvj7T)1 z4!VI=(c}tjRt0*)@N9%w(1ae*s%s@!+EWK(@6)|l*8rSW0~?HK6zPG*P8xcm7OmD$ z13*5vcm_>ECa@HA(@7gZd>UYRN!dqQb7Kapy5xvQj3uh-gQO;TbHs>Y5wsI&XAvsq z%90pegpKYMgFizfjL0m|gft&1g-Pbp1_FTbJ$0nFSOw|cDsRvaFoQ4LJ4?d=nOPoGp4K8R)oSFwLru)5aFdcj+hG11rq>C1Z zHDsx}QL9lgJR)v44}N7Q4NeiWS1w>7jl>t*WLBEMh)KBy#c9l?_#6TdK_4GCkog5Z zBG(alu7Kk7V`$3fRl`~J%2j0y2C}M*=0O}_ZO%;BWlGLD?qHsRN8=WHI0p+OIs6u& z^C7#gv}=a@HJ)FB>*^!UNF#s0bOdX-@n5iOy$F*Vg6DMUV#QI~Xqis=$WhpEe2f7l zuBbGb%~OJ6{?BLA`HeY^eCEV)wHm8fKrs3eFAvscX`B?w!RG`-7c39`>&ten^GkN^ zA8^C*dL{rHoyhpDE`ZEt#A}a?rU&&z)?PO--mk;j^gGw+qJ*Je;4jw zaQ}fDjJV-4{v`P0;3$sV>2OovC?C0LaI@hkj+SpC7@JGNGAJjN(<;CYfgn1D0r>C( zAE*2Z+H@`O27k?UcI}^V^gLYp_rRauD&ioVvPyz$6o_|;8R)y{MX(Y?!N`Nf=_XuhyMoLZxHt`+*rg>yx~S6?sB-83y`!} zgGI<(y&-^Mz&d@Z3*$O^EXv1d*y+L=Nf~tX=0#iuvMX-0YkHLHD~{r$ossvOx7)QZ ze#@>E-x+pxgnOdm%;^{3Vb^{O_ci3X1J3ZHpDAp_5lpl*(jWV_UHjHukjw9c-Ps5a z-yRN|)9ASoY45;2gy$#V4Bz}59Y^74NATpnaF1OZ^Ae>GxX4j6iA&7ec?vEzl z{A{EdaTJbrlt%8$KZb1FFZ}1EPjPPfJo!f=jpAatTaZ2iX?x&aG5O|aBh84TaI~W| za?2jFYxxfd{{iV!oKHRve^8`RTrB58dKcWck^TcX!#6)i$5A-i5j?pI9|67}7XFXn zU-vWdyj;d*A^axXeSmuy&hX98(Qy=xb_7pu89qH5E>@fYOKIlx%b&ArUw<0<6n^neyLQ?xyY|sD&|5O@LBxFqTj zdc@b;$;XZq2M8Csk(P2p8!|LrmHQ<1*os5J*ev0TcDmfdQZR*6_!6HvSM=TlwcV&p zWHg4xTyZ@1phrvZ8a76u)xQPZldOSsz zaKt!^%*NtkFbZ}~C&v4K!u}bY3U?FSFX8?Qmx;7HyTE7gzYX_mxDVmZKwJe}5H395 zAxfF{aGXR%+D=e%%Fmr0Ip2DN3IvUK-0Rm*wH5?_tCNy=G_HJ?HVgpuGXmdv{BIua@1;p6^z6T%4 z16Qhkuj1jG4V0fIH-I-5_apXTOcN&$ZQkH2C(fo89Z9u>|yd|5u9do$rSepw(I4#>~~cLO$WqPM@$W}4)fq#)c`XxPsO zv0>^`CP!tPEZCS1Ah>ISSoEQ0)MC3x(TK6!Vi^`?7klf#^L=LLijVR_FCVt7)qXD^ zk55@Kc-%N813slCc5$*o8VoK3Bqx0)258k&q#EZ&BJs+V7%i!&d;>XvBSlu5D4@WMr2k2-u2sX4hRJ%o~Ckq5MrU3Ss(Bi6x1UrFXo za%~*%0QeE{4IMb)`Z8R;L@5rc!NMaTx85VLW$ag%(76Ci#pLc1bpY$v3LQjYETs5M zg9xFU#W@$Q#PiI@b%IkP5n`nb&>JhPF6IMa#QB6ORox&*DB?g9F?K|^#9A8gERP^T zB}b-aE$14AN96caq>ZH*L9b5vcgh6BcIMpH5q21F9 z^7C=NBu<-%FOFM#g&@Id8XW?qg*=E;cC;YhcXf=;hq=^R4V$+x%ED^!ah@>5oFy02 zVU*>h?cB6hhf_vmPnWN%r~qF1nIl;Eb(~Swk-SV2CyuJhs+W{iuUk>Qv~1-Oz?Cnr z7KMp|LPw4Y3u(B=7FCs$mm7mba4ofub0t}1ECi#|bfSq4W5WIj!1)qB#MdCF?#EF~ zT2qf6^tv#>1yMt%1Nj;<1OvNg{1KMC&o+b)qd@DT_E1yIJtE!1d9ARpppSSQ&I+|P zrVJXwhvv`3sT!~*mOxF%zCv{rp^hUji%!qQDJ<#;nYls}nfmG!31r0aGv+%pUE7eB zu6<*8y0#L}D@O=_h+X)PNZ*&9t|=Mm+8#K9`%0$pJF`$*yQvH1Lv8lSGcG9g`iWMaDZ)zi|o#?#ZaY9(Ep zHz{2kJ2_qZ4_xON>DrUo>Dp~M>DtCA>3j`Tm@1+6qjnUS?wVGlyVm*m@fJDc#G$y# zibcy8tt?rwd~x}bb?~ZjxR#MNuE7xiU(5l5DF09xIdYsVHx~%qE5T||@|X_dBQwZ4<-*jD_bVTalb(m9dV!mVvkp;TzR81(51 z^%G4O?ZwutJ}q?kc)beB(L~ue&&Q8g8nCtQU_hMrqj^RjurZfic`;ab^%^HXNdrrP z<@yTk38jV9L$pMPAWZU{AI@hgvuf#zmDS-CQ;7xPSQC83isegUCahXsTDG`+c^Te1 z2-R*XjZkUQ8X*u<0}Jp9TEsM$xCZBxw1!{iPU35XZ zwhwM7o)=+ry8)~L)51w5O_H0=VZn;ga4o+P0>dw|9sHFAttQ-o>CEROgPYIJ!ovbQ zgy2_IFwTz)@*C&miz^f{J33;f5rGrK&`CHpjI;c8fhio*INZ;fm(P}p3iGGuGhk_L z!)4RyIORHU{-i?O4n-Tu1dWs#-NZD-)EYDpmyibo(U5lGVu}y zW?Q5giKz0;0da~00vJAhP5P0K;rJOR8q`c@CK_P%0jm*WP#bYNmJjpX#DF-?Ovh#e z8~FKDIxBoU$DveSoB$AgTM5yD^+8&7o6auc zt8?PyE#|p1F^yL6B0wEqT*K)roJZu-4C;`%e!-9&*I{bN22kuul|z&oI*aS<)pW8v z6osP@V%`!NUG1zB^Kg&@W<>7!5HG~KsIEiv*JDD5X}>5ZR<=-F%={IY+mf4en95N~ z%>3oGF8s^fF(E=r05MamK>>R8r&hlD6T21&gH~&L@g>wJ^Fz$?xe*s9c)ZwakJrn1 z`K!cX38R3Rprs_=l!8-yrnAlzgF_?6DR^q}e!O}19^TPuT7dvLe#J0c!3JLgPUFCE zd6XikHq1kG@V+-#S1;DuNRC4b2sv~hLgjCXKmj=UG71j)@rep1?+viDe1%cIj3oxM zkzh1;mC39WwbL;adGad83l%sJDo*5}fux>76CMgoE271?P!wZn>>TuS2pfv`@l$Z8 zFSVrM>k29O!XSN*#*VK!rLYV@q_9k+r?OE@0loXb3wS?_v*SXX4v^LjgAm_cW9-l%34R;69j*#XSX~p)8k;!~JY_3htxu z=Jrr}Ya91*_mbJ)4KuVLrmelfm1p2jX=b8%nG=HY%mn~(biYys{w@pG1G$X|r}Y_15V{o}P!#7^I;@2kz&wCfr@D19vQ<4oYM7%z=9yYZ^2R@1b|#{u_J> zbQpVyIdFfOHR1ky)`9yU@HvfP?2pWW`=3}7?wzay_bz<)br^evIdI?0nsC3Bb>RL@ zFv2i)8*>a90&F+o`F7SZWCU8uhK>N$9Jr^mrlEGUwgdN3U>`fM?ZABuYr=gj>%jeF zd}7lMYB_M9$eM6JjdkFDI%C7_;IrOd`oj39_(l=kNANp+*YML`A#+D_A5Pc;KMX=C z^o3;lt_At@NBm1)NKHWueI0l(a7%s~?kV73;<(|sr-H^q@n=U$3VN7^=M1Ee1OE<3 zZ?bS72mT$7l#zg~L(fNm4x@2*qvs>ghOxNk0(J!4INZm9f9>pf@Ti^r8Z@?pRugdl z4KQLy-qUc`fDt>p0{m-d8^FJI&~P&DFN1&WpkX%de*kaULBlDy{|WqSM~%6-H-LZb zpy64#?*;$b!IgQquLA$t*+t-AJ6jF@wS#x^aaX~=c5v}b+^fKU^eu$hxSt39wS!~N z#r;f#>?nN>?rXrmcJT5%+|LI8+EF@wJQ#dkhC6xQO=kh{Z#u)W zUP?L(f`8N5M(}Ss+XVhiM=w}vI(p&2y&C+Rj$U`*ehK(D9kn}fcY%M?(d+*${~l^B zYMqUp|bLm|pNi~xU?L}|bYP)uf(0&b|~tHm>Bhu+AYVZ8GSy5M}Xf-|zJ8>_F;uV?4_y_;kj zVU30c;li+EI?QFWcpXh! zKZ~#y(Pujhc?Lz1bFe{YqWO>^L(>Ms?$TGg=pO5$u^o*s=}tCTe4$BLY>FR*7#elb zbr>B%6FLlSr7q2v>V=0bE{6g2hhl;044N7T@Bvd+o+mh zP-|q%(|Jq8ZT^MgyGhZ#n`MG2kuZx<41Jd@MWzjbPp%koD0A{U( zS=vWArGTk7%ApS(%raiFppyE&=m+m&wW}OiX0H_eh?y= zrJz7C0~hN(3R9$_o2|%_=fS{$Mv*2g1UAbIHgg)jRRK``is;$M2b-n%oGu=wPgw*N zT1(1tH%=Xn5lVypb z$R1O1oQ3A$BN;)ez{EXDEC_~m9zS0Gp*7Zq2CTt|uTxM#WZY|}1@Iz^h8GEGB?QMl z#OaQ5>|Aj`z|D%Z0C@WYn?dXGB@etAZIm4@bXL4#X>J=?G-&;+cha>R-okH0!DaTq z_Q7SnovytDM`_XSOvD{p@9d+gcQ#4rEHP0nC^ZFUmNM4VvH##l|M|3+K&t5dgDUDV z2Pz}Nt2q5-#tz_S%Q-JSN|hHw)crNd)Gfj|1D@i3$}$uNEQobqMJFnxQK;PKCWKITDy zSda2!y@bc}`Vpqz-U-!@#g{WFjPkPJ4@2020?hSe9fr3LNo*)?v?4<7amaXj->T30 z0gunagzHB>LW#M4S|JSeAMhPekfHh!J_G5Y{v%A|BWf?rMW{VA7wNNpz|okC(y9N$ zfaDIe!Ce2@lnyxhEi|4^xPwC!k0*Ui?L$?ZJ{{yAMgJ#Kep&xf(;t;ilJzxFISAwU z0&f?mKf?6Gj#NJWxgSA)q|cD?oc;*Umtk~)mq(NT5d8^101WjX@TXI{>_62{Gq@w} zKlp7d&X!)N5_#>u2=tp~N zebOK4=TbWG!s(ANi=uzFtgngSkUpDyNq-8{Mdcp}{YkzZ$Qz0#2NDMKwFL% z{i%KQ{p>#be>nOh|77Gh>pvWY;_Wr$pFV`wXaA9(4vB^8M|gn@bN)y8ELmQN{y=1? z|43IT9l&_x_@4*=i0KdhIV$-_B~4NEpCapPqWV!@wEQ=n!19kK^DBgZ;PFJ0|1;6T zkp2h$9cKK;kpKQ}|H-fuJq-Sjw*Qn6;(x$e(f=g>{muT9A`SH)?f+lfe;TNn>(2py zhV)+y`FEVa@=x~Pfi_cr`iuQG%hr{5p~4|4g)SAld&8Dc|roKS$gD4m1A`K>Oce*8d5x{~hM>C+g1u zo%*f)$K>9DKAgz%pKF%?%``_=^ z|C957q2G-0&s3@BjP<|d{9oYbcPC$*#Aq;|4salLI3}H{r|Hz|L^E$>;De(`p;)@{oesuCw**;f1}s`lk@*b z`Bz}UlJoy#JO3rDzrg2-y8k!O?0<6pAF2P6^MByO82`cE(SZ-L565NxkNy9qerErZ z^Z(;V|K$8XdH#>a0Ll4(ALpMizf7M02Y+BPf@R`E-~Rx9CQ&@nn~0APPM-e<9$=j5 z{f`s={6E(JJ3zA&S^jg0uYgZu|0g;B7xX$FL{9oul zWBs2N29MYLkK{jj{$JoT=K2@r#?kNpG4uK}@RtJ#3XOjNAN~H%34Q*b?0<6qzwhx6 z==;BZ|E~jvo#Y#0&d1Zy>;Fy1S^oRm`M;*5{XcH{Kl%QD^8Nq*X8${)>~C`aA9eyZ z0jBDxzyFYY|3CTue}A+8$@#w+A0ChOA3ph~aVEx8G3P(11XF~**MBkJNq+ywH2;GV zw)*`a+SoOZ|D)gkOV0mI{11HpukHV5YW|;m|Nn&h{!eoLAF2PMzyFh*|C{t5Y=xEg zKa=)9IsZ@2|Ajoo9RJ2x|NpF=|8K$=>O>y@=hFNGdM>&Dk9h|6Y8(T6{XaSXPuhRd zS5OK3dyCQE|4e@WPpn5c2tUvjhx`6@D2YnRM4?q?kli&XX?{okU$?yMSos9Sa zd~vw>?}_&NKeVu6mjC4bKkxyZ80){u`M=-~poHVa%Kjgn|4Y9AFYp<2|0e5BHUy=5c-I$M~Jr z=gsLyRX?qT9VUO=`mvsnewh5EXU*-4?mvo%NRMuR-1>n$`c9m={OJ5~>$lo}AfJA3 z{+R1O4)n(o^s(1}9Qsf5YAgM>M1L?Znc!ot-(vrb_y3Q%{^LOZgvvjd?_?|ZNB=F+ zANAAw)5nZ|i}X)J{q()6W3K-=&_AK_58`E5?7t=YCs_W`b$%t1{t1jwX z6DV-Z__r$msGrtLkGcN-F8}C1egDKt|NFE2ll^x<2U+QVzaIaC{&N#af8c+NmHLl^ z{L}jliKKth{#(GmMf!vE{7NMK2eSQ7OZ5C7`foNkAd&P>sQjb<`4;=%ukAnj??49< zN&ke(Kl-1SNcyAxY%BF!)c<_`fd$7z(m$c{58hAC{}W69gvvkYpUC-t8svXM0_C6T zUtp#F&%pdY*JA&{LUHvcRCGjo#Qsr&*Z=7KKL^I3iPZlIm48%D@0D2Tza{!p=dILl z)&8S?hn4#KyZnQAN&9b&|NHg&ALyS@`=99fKjc5T|8I@|E$ROg!2Wj(@b&+h7VV!U z`eXbx*-HIZ?LU-X6KuGZ@sCygpPc_&z`sTMgZ228Ncz(d_?YXr*#ERd+kePE{k~kH z`ahiHA2>Yb`uqF%ANW_S;GcBoVe$jL5%@i!=KoN>^!|S$>7P*f2mK49=yO!(Z>`cF z^`B*>evA5#J=#@zNCsh8y`^okH#L_>Z z@}Fq?59X)u7agFQM`e{L}9TTIqkkp8o^+1O5H~d5NSy z@Sn){|4IJodx}>0KWYEt;}7aJ0>3BH`5!cmUx}oDLf8KiZ2uGe{y&%hfxQ0*`(FSF zu)_cS+Ww>eP3VA?{#(`m36+2Je_A5xkNR`0)NghCkNP{3@Bdrk|Nboh-1uAJzvD3f zOQ`%O+WtfSCR)M2Rr#m$zqE#pF+gA6Z$@%Ndc^qkIM6@Q^Z%(){rjJu|4#J!KlrZ+ z20W4UPpJH(^5p)1V(Fhy`G@{bp8rcM{SzwxiMIdHy~*$YTi`#7fwqe}Lqvv_G!>Jr4H&Oe^(UwErak^!w(CqIM80hc+lK~#E@{hhJ_x}@1|D^r5fPahjKl%QD^8Nqh`~Mc? z&+7ay(er;&zG%aMwg2dU^8NqB(m!ecE#Tjx{g>1Kfh+$Bp8xaT-vkkkS^rw3Kdt}G zu~PqMVEz9zi~aA{>;F)`1O5H~xrwAd@Sn){|4IJOwb*~F`#(whpE&&w((~(>?ay)0 z{{wpcKhfv^A^)?%0g0r4LggR*&$rnBer^BJe+N2{NctyK{?Y%uMA9GiXIrV?;`pD> zKP;YqOxpkW@&gh@$XD|GzrY7xIcI5!KL3;8`9F=nCq(fF#F6t0#}AkVL#)2}$D;gG z{R^VXKdSnV!}u@J_CMER|NFiDhXNn4_CLA*&m0!{KWYEt%TLn&N8%@X{FBh}f1>Sw zqUZlWescdml0T1j{L|mQW&;M!s?-i>kw zKl(pCk@QFXQ>@f~JnTO<8WTzXlUtjDiJ(m$c{58X$fz_-$WOZp$opM3w{ z0{$)XfAal**#G4If8ykyl%Ey-W0C)dqke~#`mz3z-2acSzd)i0{)*oJ#t<+f{iyaI zEz&>v{(pk)e}d=#^!@wf{=WtJv%3D9eE&bO-~Yq-JNf>Vjk?lW*9{jR0 z|Fug0fjs}G_is8tfn&zM#ql3s|3?|eTz`Kb{{#Q0TfzTl!2S>P_y6Z5lKvQfB=Y@# ze*SMD@Bd-(HhKOpvHE`?+yAr#&;Pmn59Iwn*#Ck=>iSoa z!GC|B|C9a47&MXePpJH(^5pmb6HEW(`9BNzx2XT2`uH_qA0ir&ej=U!;lKYkz~}$7qUdw9<6lek$N1|EEA?B{|Fr+;NY4Kw-@;}hu|0nxL3tm?ApC$UE{Uu}(Dpyk^MB}{^S}X#q<^CA|3ZuXx1|3QEdPA|4<1Y;{Szwx;Qtwkq(ACE(@Omo z?LUqG&#_W}f8YOu@Fvgy4Pf~P{S&(W59617|K9@tS=E2Q|5%Iquix8$7~lbG|Izp4 z{(oZWpV0CD0Jr~@^IXWE~oC46$A=%TzLv=MrnBDPsN%Zm?26<6f5z% zy?&(z&GV@4K%eEWTv9CBZYr6Tdp1<5dY^d$s?X_n>gWsawK->rw*fRle+7wTpDMg{ z6{7hK!2qFbqbeG1>NmjzH^zig&=K^g((Uv({Xj@95Q6$6>xiOy>q>Lb4(UjYQ6pjr_OSSrP$t48QPeU8Cn~h z4bPvC5k@@$pR-1#oQkeNR@Mh=YgIq1)2k7xlFS6A)73iFuXs1A{#v(plcIURBnygAX?XIoNndflJzBiB@kTCsRPNPu7s-yKwJ32byQI>R0-O=Ixj<81a~&v7`WcE zGqeM6FT?#3j^$@)f1i<|{T}W~xO?Hg3U?J;E!+*~W@r^~!{MGgCqugit`u$%T*vGT z?WXw%!+kg}L%R>|GPo?bopUp^jc`{l2fmhNXg616Xm?zYq1|(ShW3;44DGR{8QP8| z8QT5T8JY`j0^IMbGPLXAO5y&qGDCY9F8`7Y?Ujo&v=+GOaGh&VCR`reA6IjFhmpZ? zHLZxG9D)NBl4L3YC{dN@7lF8v@-n63EazG4&x)M^A0k}r1jSs6?geo)T?1XNRFxyh z7g0~~l+{Xu)8`|dsDshalC&E#wC1m5XxjA|8a-dSP5AUo?xm=(5pVdE9#MxcY&gsv zm(@k~yVB`abzO~W)1p8i*g#F3!kVXypC~$8OEgym0hP?(*A&dj@gu zeltV+_;&CQ{I?NL&pY8hfO{3;J#h5AOZxOo?(0!uBi`^^k^Tta?t}aHF}gdE@2kg{ z_gL#R=eq`VUn%SNz@I*S2L9dJdR?onoq^jrXe_Rhr`Is8p>A5yDrdEKk+ZOH`KpQv zwj!u2-dd$WZSeXxi*%@Km+I5&3(l?f&XHh@l{h_T>Pj%6D%ItS7q3*EE=a;6t`c&m z3cE!b$)(id4*p&Vwc~RJ0)oe5<>3ZwJ(QW|hb4oGazdJ*VW#&{7pXX-Dh}ui*T(Cc z0nX~9PMO!JQukswQLBTW{T|YjwWym~Kb?^QaTaK2imk`bk8;!l%})J^QTx#sH`QXjt znrA_d8qBH!;hZk5K?V1EJ%M<|MYe-_;`M-uAxJ@w9@R=NQJB=!Xku0qnb#PDf~RYA zuRnnHf=7oh@?naE5+SL9dT-F}QeZQ960FQ2c%Z2uDGpf%tM#KW^Z|q20OmDFQ~6xe z4+F+RFQ$|-URMlT-Vk)_8q7IqNlZ$^aGNw2RuK9C zqwxu^mrrqG199BSW)iE>RYmYZYILtx5u_mQ;Bc|H&830O{8+9q4f&%?A8&M-hfB85 z75PlzB`RXbFi*+NaR-(4n{_oXbvXF8UTsj7!a}8F#j?tkWmQ$>E0%L6V{Dn~uOq(W zc%Tw%rUjr1v|6o(7E1z##UOSo$6$xIJ7U1kbMkqOvK|(CgL$qJ)$kC8#Ox!$db=q1 zVy!Xgt43uegUI_BE1^oQ;c1nARVp_sf-5_T5(*<#h6Ejs`hKXcb_X{?RR;)-`DPVO zOs->M4O^@f6)GOSti(rc%b`T2*l|_n)UgtkYLO1!LV$08+?NUUJsjQ|Z2kBG} zuY>6>l3v8a_Nfd70b%1SC*Hot5~t5Ld+$F>fs26QsFapP!;2EC?Zt4OA^DN35dzot}W(tUuThwqeypoY_S&hMpre1m$E}s`Gd~7_CJtt5H5; zr=x3sa3eEhP{q0*I!V1+brG#siT;&)pbcU1{2C1z%_!6&mNQ9(kUUBhnA$#{)<7=K zQ!3b+i!XtPI&mEeXS5x9%IksEq0(|-1L66dn>h9*yW}JPD$fQF3_}D_WD}_2Scfw; z!33|8xRapv4J?{g3TiKI&}Bo9SqR3-F+E=U<(GMGFzY=re>f!$%pwUBTlY{?S1g%1 zTe<2g*x6XxNkD}4QwZ;UYAAd!AuvygP)!n}X5~at1?Ni5A<{))=4@sT&YH=C1?Q5| ztKzFRA~`y29%cy$vn~=b7a?jfAD9_xRCGt;ma+W{-<$jKr^VB2rN7vb)p74Dzkcn# z66x>!*>zv}-QVATZ~muOpRFz#^C8y9>8f;akNF%;%)u1K7D~9sxAt84*lAl+9WPGa z`|mGZ@%~e9?V*QPo;tH2?fwau9DJ(lw;xu$`MutSzbLm4I{Vst7E-Kh{!bQeJ}?Ck zFFf@-O1}M{vOU)<4E%8Z!iT=2IBqFvbN}rNGaO?oa$ZdR{S4WTT-gpZ0}k8qv5;2DkO(IZ>;PH71ACDNrCT#0qosDlN@ZFQL73I8a zLW(I*iJ0(0zfp7fKWhF@qaTI%9c3s2oVp%cSv z;Gq(uD)ZLVkfB96s5gd(gOL`GrL5Xz~WyY&# zJqDx7f5c2lA7I6C{*C$Lnki*!vbRx#OE;4_#$f+MwnZ!iG*h|k>l+`8Zs|e*Hp{K(POyL z#5cxuK4!LjeR(z?;>Vw1!o9GX%~v|D}OGnF$ETx1C@R+#()4{i4`KJU+48; zF~q2weA^(gzD0ZZbkSK1x{6`5I{qc>*PuRNN&xdm2{RNhw2o$!!zYm_rxeBiQ^L?0 ziC8dYfcaFy4C@1CFnNng>8P9d<4dq1$-&2<^yDD$dm2a%5_Q7iDVG@x0XJf{42h?sYhGe5~h5 zfH83eq_K{~5^7K``9WLJssX_m+|nly@I!D0BgKO|qbyUq9c_LTZa$u?O>RL6+78!T z8X0efF`i#W{(x_iSUE@in4_Tuhe*XdJ`D&C?<-x%M--HllzB{KmU#^Tj4c zOgKF1CTZ>t$wH-LexTKE#wMf31ziNQu*r`NE*Oe{w^rYTwVbF;hZtIpFBWk1R#Q_% zlQXDwZT%HM_PT)B5?@ElIvdqVg){~iENj?So;jrO=JP#^I8DYfr%sDOxTqe}!iQwa zbuO%E6;ef}=`3eAnhBX_C8T@xdMqB97D8wzdj{gg0tYQQRPtjA(PbG+PAb-aH>3bBamQfr-94Kdc9*UrqFc^Ou#jqSI%MWTM$-^hL*Y2D_+ zNv_3Gy&_wBEUk!a2bFnLI64B{D7hX`#_8Ftc=?=Dw%J&v!sv{w@zkSlJU_mGQD9#* z46XQLN)5iN>I;r0`ceHbmw70jPmCU!`xD6r3dEl?Y!r^U=#jwJ!>RtT$Qg%w47o9e zx*_@I({nC#X4NI^BFS_)YzvLE_^M{;;DZ^9q_f1C71JuZ97P65`z)9xG=n#=4mxdZ z{$zX3}q`eq-kl+!GOD{7wqhxM5nxpGbT+vGEakB9rR zEa(5V_bzZ&P5uA)nwis8X{ZQYj#MTp`+nd1R5R1fRMX6KBc^F)nmIMM=FHS|p^yD@9+D6nO^VC*`K}E+H0@N zXMJvKokJ+M)GK>P)H7ZzXc7Fc;6JS+eP*~dQ!@I4W3o1iX`9IXAz7!t-|zJIGY9vn zH-F4>2|bDN@?c3Gwef?ISC&M)HYJtCW6*+PFx zXd!!FrW1#1XCDL)Pd;PoK6@J4CS2x8@~W30`hHk)iz=W5%%#M#ne>v~duX3NsTsId zWLZ?;+pmOOQ<1tN0c91zl598DE1SkwWLK0Hl)AnM<`h7uLT(N*?po}|NV2x5%|$cd zabRnnJQaH@%#je+md&hdmR%Yu4W*W{xPmb^w+L1P_X9hDpMW;=TLc{-510pR0Nw{q z03C0EE&z-LZU9yQF9Dwb(QoV6!sXiKj1#&coY@$x+01(GexrQuGLZ}gMy16y1wIDKL zwB3LaB1(8BLK`w+b*G-okek=l)v1GzC3P?Bq+tbmCWUZ;(U;NR(@R4Y(brMSHyy$7 zBfAfx-pPJ!eeMtcwM!cg**?E6F*YG}@Ob@l(hZoe@^gw)%7gVi0U5pf6Y8x&?ft^j z-_I-^d)o3dOTCsoseZ1-!kzngiPQYCMm|M;Pm4QE?o+jo`+SdgoHqZzy4kUFsH5TU zos-AZI#Q2Gp)9`yCeM-{IlN-q^r&oRe~$?e^C!`vOznG>xpeGzMZMur$LMEf%p&SV zr$Mi|`FXg@{OC050d8e5v;1-v*+tbAbb20>t>Mh2@*YX0^CY4uvWIwg22mZ$O^Xx* zQ~EQ5YB&EF`X)IA@M?N%B?O%$uBvkt>J*iSa!WUHIAZhUKox2qTi`cfOaBV3S<2YMU~y)S#=-DZlgA|4s`xT_hpQ~ zAlBI)4vHXDcY{NQ`rj778tyW1J@Cr8% zZ6ZQCz6rSoXcL9z_`Yg)i{Qt=c;GVNn_Vq}4*=m7ICUR+El3yk92zj>wo{0>OED;v zC$bh1548wVbd5rLd=JNp4Ed==kYYaYD)1Me{@jAeZs9@R95(RizgqtEvaIJqg>izRh6@wCEcaCI;_U?v>(ehE477>w1nBww>$Yrz)6i$Ln zo~RS1)VYijhQcXoWi`swsJ}RT$8FG5awL#?;@C^gj*KjG{g87P_Y4kib#v1f8uawq zoPE~(b=bSEanse5vg_)kS=Q&fuikBn?h{@2;vS>o~!TCwQoF*S#-a&%3P%$<500GX4OALNP5`!-S zcK{OrmRE|+`(%7#a5gX!=mz|Se96AV;Ca9|35mfiz(RoK9a9#H%}vO&4NyK%1q=ri zAj&mN6&Q?hSj%ZNP&m@FmRdFzET$ehi)ITaM^+|dIB+p0!K2C1&>>3k+G+V&cqT9i z=nD7%t~ow|z0DGX>w#+E)3XzUj{()d5TGM)Br!4gCh!n22gn0x^)Q5}&-A3~x%9d( z<5FWPjqwmGAA0d&bbL|vhIlo9MSgL34^a=={jo0=8NKxm`Y56e_C@2{qkU=ApVk{V z|6G@U(RZ2{%CB$(Mq^rhB6dO4A^ZK2hZ}x^P^Nr8K@eBHvy5OHRrIv+1~ep6(iy>D zOzuQn9t#)XBEGjs`B(%_$pk4+i6o@Vg{qeBjAjh1_A-@qR~97NsCEf|h2y__Fw}ig zA@nigU5ue35^;AdVb2XI^S0-(9XS3ZdSh&PX)$W&?#Ss%Si~4>r`*X9uS4TWWQQVQ z+aicc-&XBPYPTwp{>jOHcefMipEWf6m7@u{u7nOF4w7CO4T&hi*P_DE$;9#qaZG6i zHmZgbpNd{v2)>0A;~`$j$aY$y`w%a2R0$s44><&5qH`soJquZfKwtp!=yeeYV+oD) z1Bu4_Q6fI8h*cRSLAcTdHNkp*g!FPKK@Q1+BLm(%Yz+0IfAN&$fg`VM8a<5s{uJ=j z4C-db@?Y8Ab?*(QJ?l@WniQx7-8&ah2jhr=X;iRq%?qPYF^>19l-%8PQd`{9eN%`jxgeB41HzI6UQh_Fm@So1IJ@JuN{g^B6S6HcDdM=F&LJiOb}ysm$Gpi z@g1~(@gO{@KQmemr$$Ru6>_CZhx3`HA^OFvGghR82`?PSMy3y0T!U$YX)6Xk8kf)0DXS5S8Vqt$>!@CsNoQ4_iX0&sp&cqnB+P`M(L2F4>z z685$PF>v$I1(-Cn#sk3sz2P>DZr}>%8<AX z$pdkH5}B9?c4=NM>w1i$-Q6xxWuYLwB}%>AYv)jb-o` z%I^C2N%0S6PQDP04w2cyQ;(^DE-#R<@i#UIL5OV}%BGe!<{Y3Q=#>vssDa+E1zq4Zu+q*cGVvqtNO@yI@}VPkF9C5gcwIwl5R z0nWqsmH0IAIT~nE(RfVr@}?zcO(df_=K`EqN{hyT>_|E`tw))luY~u+%%ibl^nK~V z7B(T#T^XTb$f4A@M5iWpgkm~UPa50mK^O9*h#78d5q2qbVeR5NU4ZE zr?OepmV|w$)RbATZNqdoUD4)nSJ~)oRIC$G7sHR)XY))0fD0M^Q4%nMpgI)4!1 z=`N$ENaCeouXd^=^}p|+!5OK&QZjlCcNL6Nzel&)miyPQ1fN)K0Fh@ah(s`WDq?t- z6*`Cp)MEyCdB7W~@Z!o=26!zLOc)2<=4Q$S8_H1?f_p#qr~?q{&*X+xMQ4raI|vPt zUOj`i{8wWxQkL64Y{9R;dt%2K6_(NKuI$RbR8VPxjfR-|LPn~a_Fq>!wvX%P@8%vU zfoJ{ek}x*u2(IlTR?X-ximvzR=Vv5kxa&M)Ff%j47U-`%gMp5Y@IC=+au#Qt5Zy_9EQK>)8v_70n&6gRo619_Xz>7H^|daRo^98`-PR8(hjH;ji9 zL$CFB@$+5XjXw0MvtNw5>Qd)Q_3ly5Lzn$bI)T%{sBjPj6NhP6x%yrnyB8tC?N>{P zWR2YR@?@a}A~a-)T+;w^4)1y}ZG!3_(GPUA`}p{NL`B(_hr>&a8Q?wAWPt`|M%Tne2n;jwg5@$}i0M^(~o zo#8%(;0pH+?8Z|th$0Wpfp4=AM<&6?6h29XwW*iAwi|}AubC)Akywgag4+pRpGBnz zcOxaSG?60QD~O2HFdUU5?BI>$$jCw9VtF*#d-};Y=u21k+~!|Bx+ZZ^`fhGR*^$O` z`|U_tS9q|^@)3KrO;yKzGgG#AT9dcG)sn0|(#DFT&E}`=?6$t>P}>!w_E}q|ors^& z`=yTej``x;+cMq}o+$sR>AV52U-rf1vf!q3_90RsPcamVs|}f28>Pc6VR%iM{o@KN4LTv<$l?6 zapt??lcAr_y7|gCE`NCZcNg7t^~dIOQ~%j$PTyBAeW2j$^Op_(Kz(M?u@(yl@4Di# z(!(8AWq%fUVftSPAW!f$XxON6lcr}iYkqc%#B!lB}qjZkU$s1bX)Bot%=|r*FUh1FlRPIB0PCkc`Z%p~Hq_ zFWJ?juDLdQbk3Mu#9tN^2FHyrDlRE4n}Aa-Dkn~=nmlFdwCk>)UVX!i8)wd%J!kGs z^KPDh%YucAZoO^slBKsVTYkr#cdfX4<*L>9+1t8?)9K<5zJ+GR=blKnsZ*)Zcv3POQ5=Vdq5DnM7Pd)3x3Ei(Tx7u zP^4&o9m#^oR$K|qwzGFKR~^>wssGfT=h^{iz3Yh@K51`+S0~2YJl}vvs_zPd7%lh| ze_$#Gl#HU&%4#U$wD+0Lf2tJ!F2AKrI>bcs@D`jf1EY7mXsZYbjGB^BL&iW{snYEd zmotY`;{7B1v4R#v<%Cdu{4v55PswcQ*ue1vT^Ub{dc4P|q9`oIFiMDGd6DZ#epdHW z^w8BP@5g+h_b8nK8+=3U%~PDukR;$&R**=%`F* z4SDkY>2v@l_^_4F?M_#G2|urZcAu*SkHLhbOD4|NJN5Hu7f^Zg6r=RCQkEC!ACa-> zH5>pa5uRfl_~JgkR>TU|(M=a#jJ>opTUfk8n+~MM-GyN1bX$(u*E-@T2uODr>)s9n zraeTbb&Uftwt@OH(WepCIm!d39f!iELbi_}#Vt3HIA&{G&- zE(sP_7W?VIXJIq$Ja!{6Vg4G<`lnvymCZPIKP+I>QcjXfS-P-9b5c4wqH2lJ!YIpE zR{+I%ABd>SD$S%XSv#3dHh4_IQBg5lG~Fl$tRghmnZ_|tpONcvMz36znbj*RHM{?y z{#n^6smVC3<9{xG;Z*fV9mMM4HhOeaK-k;lwo&WI>h4}QcR%od90_)F{bNb>JMSUZ zq~W!@Qj5?jlJrU$+&dLb;wGd;htHWv$%hREv-~t3uE?;an%GtS(=n)N4)<^gTt~0Z zxP<%5Tb^-I`;Db?TYh=w#15h>?bg`9cj&;78PxO|?eSIWzVe_Yhv= z`8RPsN?G_E#<3XQC9nubJ2*VP0DllW9KfNH&G4M^5~_lF3lSxyMxsMmj1--w^viHs zvFf2MgVh-=gWSf%Anc(9le$k*BtL>xaF`p;OvABHh_Hj{tyf+iEMYh-r;Kf-E5Uh! z)Nj!}L{HGd?h?O$Sg^dJGN))rWj=f>?s-w}nFg+d77PyW6)A;2JCX-(o(hx`&cz}M zXh%~wNfk{O-f>VC%CF3WIVYbT=|x>IhytuAr4GMv++F9q9@H3kx;zjPT@K}?4NY+E zdxUI*yt-{VT4lOLDoF_$50sKg_}@X90iYKN;a@%}Clw@!dw6p)mgL}j5vY0OV$u}< z(s93(6yX0HQcRft2&IH@r;nGimevg=q=8z3{C?6I&!r`#k}3i(BWUz_?vrZsK!)?m zLzT!tmb)(*j{F&{-n4GTth|%!OLGtczK{Q_r@Q9|%;7J1|2f+b1V-tRb|_=g zDs2i}H!ICCxWI+=FZtpy?1NhVwVdle)rS zO}A#^|0LHX)z$A$!l}Wqui2doVDcut$_toB4X(A~9HewtlBATu1AFx!)V20D6>KVT zR8FvBvOg)ae_z}qgE21H*`&`-MdzN>I z2uVW+rG#_Amsm7-Td?*KnMntsn?_L@b1GgX)zVX zVHS1uOFi@+0@^q#|D<4vDEvG5#lQ3a-F~&>@9**R_x$;rfBYN#_iz6B_xkhq`Wum7 z{$4-+Z?7N!Rr&Mp{Qoui{qOes-)+DDD*yVs|NeLT@9*~i-);Z@X#T(i@gM!Qn{;R> z&G<#I5vjQXj3*Z#izl!C8c$Mu2}DRpARjeJAnO|^ zkVlrsk@H}~DeQ#b%qjN~wMQJ;?9n?M4D{p zYk}v0*MYl$RN(M5LO#If4S4?j!1Jj-a!$IBTp(e;)Kr}H_GcWahG+fKa z`N*?)kGT62$Oil<>*gH%7D@*~+Tr>yolYr3tW!xyHUpjpx^mr9C`g{ z92xpY9C-@Ze|sER@>x6?s3(vsoCHz^@Q);rtB)oSa!~>~Q061reLnI$@>T(fXuEaz zycAdj>_Xf0zY)KW3e#ix)jpzE_{hT#`pDsje5B|3KGNbmAKBg>ZH>e8mNtkd35oG! zKitwu-VsOkp)KBp!nOtV8i9TZ0nIZB zxf%4wfu^YYJk)(6`gkAO<`{6!9X@jJEk2TnKHZIa%|Khf6-3<%eWVjUOYyl1I2ZIq zxPB4u@E5QGSUSl^HdUgXruxV|KnnWiYm{%`nO~ug9=!nLC=25S?|RNCA90Z8N8~y8 zIv*(m%5U|Nw1qzM65gX3#S9{YjIsR~V;ym7aU0+Sf)zHjBBTlO#KWjq zJrZ@sXEVUZqaX1}jg4LKJsqF@@VR0#Ay3YYBinJ^4Q0$ip0|Mj=F2U>G|Z#cbS^b$ zKw70YA_E@rktug1kjwD78CVWX0tP8QGFbJIYw-PJm5>HH+FwK2z&t<$asVGdP*!?I zBhq#Q(#I!|yAWM+1oQs{&~RKM^aJhz-2ej^0E_^Nfg6BZfmOgWz(0U@fX{*NfD=Ho z@r_6qzyLCU0$>_&Gq3_!4?GL(0`>#Pf%u|Eqy=y>AOb1CFrW|!0keR`!2Q5x;1ysm z@D1<>(6qP_X$@QgaDW4(0mFbiAOy?;mIDs~&jIfOHNdYxlM>_yIs-D03XBAbff>N9 zz`ejm;1%El;2Yp~piyZf(h~3kJ%9j^4rBu%U^=i6xCeL!co}#b_#F5dXjs;Wv2dInAiw&63+!pU?6ZcPzX!~<^fBAb--re4WI`20q{*~L@od>2P|L+Fb=p5m=D|y zJOXS5-U4cX!vLv5eSvlW2P6YSfdXJEa0~DV@I3G~upc-EG@Xq82Y4VE7y*m{N`a}s z9AGi93U~~73D^aE4*UW%p3;b11at>%ARWjCLcl!W9^hes`kk>-5Fcqk8WQ9qP2fE{ zi!{TpFrQ6Y;I~-MA?M;3kz0}0_+8%fNgHwjxsY5$+LCspJ?TLF@Yr=Emyk~IsCB_F zrzerF>9>Oss7oNj> z_z??8Av|~E;CC#7|Bm_|%g6+H0YmUMR+5SE`Bjn0WD1!|rjhH&^<+BM`y0p%awC~Z zW|7%s4w*}CBJ;@2WInltEFcTXB62IajVvZh$Wn4USw@zVJII~jjw{IBWF=WeR+D?k zz2rW!hO8y`lLyE;@*sJLJWSS;N64e(F|vU?PM#o7l8xjk@-%sdY$BV$SW#x4_oJGsPsthdqt`DO^Ko^VQS?>L85fTQ?m5*x}vo9N)%%6 zih_HWI?a2rUv0t0N^E~DEX_ku9Ek2Oc4d`fmn+*<8%?9dvg^Y9-0_k4lw^9vw#7&G zBD$$?0%{3<=aJ>8J<_E1l7$_)m!%;$*5#xaVUJMzFa)4iGlskFGx`^$)K)9A;2yA0jOeRK& zN|P6fr(mb_(|4i!McoqVx&3qtU+q;ocKs!@lZWXWuq-q*z77fFt2WDUgoei!LMgFH zXmnL{8AbU~IS@2b>J{gO|3|JOeb5JI1JdB1Wbal+74Ke_ z=jX@vTHpMN-oc8D{E4;g1(JJI4?EY3wgIDHEF%CUmz6^a-VVEbw@z-4fnHmu@P#)9 z5Mkz(g*|lGco0+CKy-TeHf`+aC()p`m}^9zMqi_u(}E#Xh#nU0J;I}((3_aS= z68y|$-3NQ|pW!qt1}#!J z$4!Rsg?i(FhRjJg!r1Go{vkHpYJ1wtH!!oeke1ooyQ1UM?b`mKp=E9)v3s3{EeWxs zjfRQkvk?**TjBj8;enZ!~>NNA^60tR<1Vepmi^-0?>PC<_B&Tu#IM7U!(aFPVSDWbL{(d(EXQ%Z=+UVy2dUtY@x!MYH_oew7F4vCEXNtDyZwn4bSNGnGZyjDg; zVI8&?q2z_xDW%lzXmmHJvo^tvI#0~6V5?g{gzX|~Je(++7GC&}x0Y$Li>Rf+yY^NG zTt%1&zGFM^NlyjmL&1odt$nB$Ygnf$vDB!_Fdi5sK;S`@Wl_^Gc7=~zg`06w&X`^_ zMtbnr6n3t>`|7n+cH~f9Vj6xrq&}KfmzYU^SgS5E3$ejrmH-Aerp|+7pBVEfdQtm~ z+QR983vZ5~TqWw-drwM<45#pgcW-D(23Sb!I2}rNaE*`cE*voy-S@-7D<*rt$W`q6 z85_h}XKPvQrB{>KJrj{D?`}8t0jEh82lXUt1s>^e3{bc#uChvbcD1 zHa+}|1I!vdZoj|vMEFcf40OkYhfGxlt z;1JMw7VPYR1oQ(&169C$U=6SZ*aOhNgZMlO_-5m|Kqo)~dIIUdXrK(Bf7RaSe0<&s ztOK40b^`l>6F}k|_%#3v7yw)almRn=+kp+hHeerc6o{YOh@1_y2Q(lB7zR`T(||?5 zO5j;wC-5oo1K_*Kty3aC+XDj76Bqzw0M`OzffAq!mG&y+93c z5I73_2{fJuKM&9r=mKzn0i*zFKo&3x7z>mEQ-GPk0$@3CFYqWp|2E-sJMfNo{dZsf z|EDk85%v>L$xO5gFUsii_R(~@^t(sQz)Qf==Zv8m0{*(Y*RUqy7p~yz%y6&ic~qf7 z{KATt4OV}a&!gwn7Kk!#aqpoDdD-3(Q0^7cq zJ~SD>GFVZHQa$^X70agx8I{`bmuziNWPvFw% zF&$B_1n)r_!?Lllc+kK9rdDXqv=sE zdVe(CE2IfQ_34g4Jf~UsJ2j@@@9gk3HOgcYc!9jM*pQP`9D+Z{yUxG~h3HY0;4m?- zEGzuoE30St+AAwLeC_4!8@|p&AK=-Oumh?xFE}wTD5C$9u|X)`l@s8TaR(eV6!wCD zruGVE%QA=`y$C!twbbG8nWW?w<-@p(hQi*WBK!~m6Cn=6lS@q%b;x9U9Axig*T7Cq zjc9Z7^2xORdE~VyDm`2-Cl5sOBc;;nG2J2|9#_=T#!L%@w4&EA5>yt!(B>Kvu!FF5 zE!BNbyhSRd(F%B*1__x;DVdX@xE5z&UtzBhErEU`%jlh~VD5O=%1XYArwxtcX<((Q z`+{8(((-dAoH-5-evo-l>I1|c8$ z;5*4rF3c&ep%CZkxWT1~JA!L|uY~%?e@SXA!M9lbb;4sxL$ZQ|pxd8Pcb9|nDLT>SS+6h@ezZK(P z39^uWL(MVw*j?x=WTkIHh_d?CzVe(P9BudDlX8}OeV8e%f{*&#$BZRU`LGD&7GjJ% z&A#D*WE1;FOWI1m!3Bd|lJr{%RgFIPO$@&r`PnxqH$-(LlFH^Djt&KXOp70gsf*pU zy-TZlk<6$oOgJjb{xY{qsX)BALP zd(D%Hk?T|D`TNHI{T5i=GT0VqHmqf^%_8?qivRmB_4gZ`Q41vEcSew~9oLZ?%#Gm+ zxH;S+?gQ?3t^wbY_wx!riobzh!oS4tX=;}Gm3EG<>Dl@)=SAlg=M87K^SRS5fFLsV%tCG#mnKXW z9~IvgzY`mvlsVEu=}u{*^p^C#^p*63lqk2CHMzH3C|Ak1$t&b6b*g$;y--`AZPo_b zSKGPv9riu;cKaRsBfFti{7 z)>HJcdWk;4m~3=0dzj_sWV6OPXeHP~Y|c@gq4dCvbXHArK5y|U{Pp~O{KIJRMnVfA zTNo?cEG!nj77h!g&O~Rqv)aLLnvBMIr^u#q4mXOsPM#|dRZG=rYHO{%b{v6sZ|U#r zD~vTpJF~O-koko9y!DFpjQxT=-&x`ubdET02Hp!GU=Fc%h!ZIv#{QYA^{)IQo|wEBzMbo~ka7=rrFH7+uy8(WNH##82fRySL+XV~-X z-Sj=G5yy;=BJN}EX5JJ&6RN~@;vw;~eOh%F@KRsId> z8SQ!PJuS~zY~JELLHleqVyf}6UT7}8qIA_>F}hf<)ABdC^vk$A1R||bT4;lfVP<9k z!F7mVL`*t2mtTljY6R0Ez7YEYc#3nb+WoveOvuqy+ljVuGGeBbF?S5&$P32 zRUfV2q(7uTuHR|gYmB!-)-d~8HmWXhE^{E{BmR((Yq_!9jhu|$8G_N%OlT?Oij%|< zQjxS$eo}r;zE62ZX{5E##%SZTMcQ)h7wr$NuRd76z*u5DWo$JvtgEcfc6WPlV0d7C zU}NCRz;^)z?6LOG;ewnY^cMaU8j4fI8R8q_JL1dIo6hXS9`c0-KkeEgq{*}R-z&Hs~65UPY~VUMs+ zxK?dl-P&cnZ~cal&YSE-_LKIrw(j(Fa-DI`HyBkd0~ZGFLrvZc?4fl@ zjH6vl+H#$^z1(M9Jl}*5@)P*;gmywtp|21xHW9mtqWFXOi`Yi$Abl)-AvKVj$)Cyx zPWCSQefu|roId4jaXxdta&8SQ4?Gum3A`r`v7@j%aMyG9aO=2C{wn@DekQM@ zHo3w$p|#jn42XTie~R%^XQ`X?f%GY6ePi_Rv+^hMetDsCyRuo?rd+G$tMk=nnqMo_ z-Zefp0%jlccI!FoOU7&BD7ztZ!ATvy58qzsB3vTAEWRmTEOkYnz9&5`KQCVg-tdL; zt%8I-f9E%1AHQmvKw**r*J#D zcddFtUseauV)!o z8#9cXj8rqt>}mJ2@3$YdKd?WwJ3HMSQXPj_U#ttlZGwUf%Lj(Vk_Gxxs8;HM1_jb2F?5tVgZ)EY0p| z&!*2_9mn|KmE1qM=lG_=C}D>9wX{#!uRNd^8Ewsd=H=FP)_wLTPU`^K;PzjDE9dVK zc8aZ)`>}|Ypbp#B@6~|zm%hxr%V`T9=eAQ0_XXFTm-yTGJNdQ3$HGd?=}oK$zL$_>jJLO&lyI_~Q(&lDm_80V{4x-sWfX_hZfdh5v)^EnF*15uO&l5`IRo zcysYW@lsI|dx?WE0}91T@V|xPbK=M1mtr2cYdTi8CzJzfD?MP$wJxw9v_H4c#+o_W zdBPz_urCacD(9{fXNiZU7V`PBDEGt)eU)4wSI9T8(cMzrtIpN>>B}%)T9_fb+P=kp z*RHX@x9Q2MR4$l~(M;FBZ-rmMgS(3|R{jOz>)^t4B^)7*mX=GarM*&(B%$Gw8L6!@b@%~<`ozf zH9BWlMn5CVxY1Z>JOPgXy79j8g;8i$nAPa(<>nfU@hzrgnbsrLyVe(0Q#)W^1loDWDb@!M*pJ!Goz~8HC*&xB`^{emTHak7ED(AQU6W9#>h9`Gd?jon{S!# znXRmgtcmvZ_6f`v_dT0%=W$nX7T2FU#Qn@^{2qQEKLWC2b7`h}vwFVXp3S*g)_jbN z^?@e?Z(z;;naz=SDkc$w>&>m_-r&CFQuz!%n=j%gW1cL=s{IK6EdMIX`y3l8Itb4S zF9}V=M6m}(=47lAbewOI{~>=aAC$W(BKX(2YB3~*m5^}0QIDwe^xO0+jSS;k<40qf zd82ucxz7B>JYlX5JP>#}uoH4eJQbtJ1)QH-0M7U%p4Lb>TiAiQUZ|8RUn_^f!8J7< zJm^;S4)q@O9rYvi3-!3#K)YPa)UMWYA>pjn)7q16#GLymQewbZ)XdIKZqW9vujPiwH92l?SvNbnD075Lu%)&3K+`U2+) z%1W9>1C2 z&VS5*#h>7t2tA;qtQ6iAz7T%EtUgO@DP9EbvJR{3R&fVr_I}75A?Pe?rAMXbr9DzJ z`8;{I{Gt4V+(D^;9K9av*X!yB>N(m48V~6xPb<+rf%I{KZtJOfrhctns87*v)|)^M zF^v?=pmD}B$a(J?HHK)8G)v8C=1}VzjP;wXd-2|R&fU(F&Ne3@&@IqAFgQRG6R?rmV)5RL`pm;ZG_`PI;qm6|GFhgD?Ka5qo2J37? zrK=(U^KvuU%r(bj zK5sWKu{g`N23W(bJZpk=J!-ie9Bj8G+NOOc^s2AyAMCBpb|*P-WngrmI4~u!6eAcF z_9w8ldM39A68;~Yk6$U=FMJ{%5MPo8%0uN1@+Nr!_9*YfN6Il=;AyRcLE zO^Cz%Rm4$Zp7IQWa*7#pkzm^2q`&MnA_NDfn{($Y`nZ;)v^ zSgBT;HPxD7O%2Qq91ej0jCT8g@}En%-O$)ia0z@rAzf%Lwie%(_sY+y4Yjkii}a3q zjvmx|n2Pz1`H|^ZeXN<_MqTV4_CM_e@W!c5_kbLDEbvU=P~a%!Jh$$%xLZ)(Sxi=c zjencJOb~>v!pnjo_7*3K*E4Nyjl5p|K>kc#tlX)*sJy0hQG2M>>RffcwnQ5at^aAr zd>zb7&BKt*>8hCR6gZa!gaD~dU^;SFj^}O@?f`Fl5p(n#p^MmETqaYA|9Z6U>(JEh z0EhWQ^XaKZnjx8{Im#r9u=g5$brWRkm$=us$AwLhBEA=vORJyTYV`+ao+lZ8ice{#!U2?${f?-zHNyUo7V zU~3xMsfB&MZQBFv;owyh!1r&qmqTJ88xojaITZc7hJTFzj`s^U2~P?&!gs=@;uy&J zzld$6KCoxpBJF_uS|Trpt>72*xTQ=|HY)9)|Gup5Qpq;Atq(x+;gNorG)kJT%u!Y= z2bAxX1f=*#9iR;bhwZD6HHtAB7Mja2bH6mdGp~fSx!PK1HL_FffvDGQOxAFmKF%%9 zQfOhvoza29z&%)}5~vzY1n|ez`~z&J?h*bH8i@sBiMU1FE*=wg)bn0xgY>fGm#4@J z<<;_2SZDK;$r$UaAR7-+$6{r<39HHgEn6$oW@+D}Mx*p%eTM!AIR99q0#f~c!!a|_ z!jrL5CV{UEvU06W*17hjwuTx$Z2x7qg1)LcD^a)Rf%XA0a97}$0I6}?vMIPa$1Uf6 z;u`U7aFF*~d`CeQQek5{7aHqS@g{Ml*v1-WU2ENLue5zmGbhuz+L;x&1+wd3v@ee& zV9y>Qzr#Xxr7#iF!cyreX)Dtn#z9t_Dc=f<&BNeKFU#*>%pQVH(NJlr2+9!Xmo3#y z^=iD~t?E4Oc8s3KwO!hGkOMmFyzc0O!0E^9bM@Qxjrwl=klxssjnTByc*NLcd}lN= z+kvb0H}lOK%x&hY<`8?5bG`GNLph6&>GpA4H*Nx7#XrTjgru7)?vQp#$EE9`|2?2Q zs_a%iP)4f-c={ssOZ8i(iECOw`-k?r_L6bj{L57F&UZtfy(W-{HN%HJhm=QN0o&XN zNDMddbJ@zxp}j^5qlG2H3gHms>Na8r@oB7dpNU_IQ>7Ww8tGw4#aLX7HrOkRilJmE z<;oOg9r#&|asq2do;qHwQQK-mwAmPQN40Kx9wfwX^{z%CR`t(}R_3)>HD*~)Tc267 zJ=1>Cz7!H*5o}SvJ5r!0w15(<*DC^>0-r3gzkrRi)-mw;=uq8C!YUw`dG3l7pR_-g$k?)Y-laI=Y$|%Sq4=SHweH#V| zq`j65oqMsiTWg~C&`0Vk^^dS3n9y4vG!7Vz%~ocrS!q6Eehitsla*yX4tZmweIum( z3mnG@LbBNJOb{sLi)7!>!3hf$-y#C7sx@(%e@Wg%AB zKa`H@Xy{{2v_vgU%VJiDPxJ%&8slN(a#LjT;W%q6HU9N<%e@Gkna;TZ!Y*NtI8B;~ zHRO4T+7I*PV(^5KN{;fV`m{P0a>YyN?U8!C+0=})8e`t1+l5YIpiN*vAOq6c9%?Cq z-0x#L_`}?ju$yKH>x2zLK#Y?bOP@#wq`~rVdA_2FM}h z(nFFDn$=M7hppfcBbD=^C(lri8GjmWu)Yj2i_AIZz2;VPulc7r032$DeZWq29>IM7 zmP);4ILiQ!>A+nIEq^BWBlzxF{3YN+o5k}X-wcC|w+8a;g-S=|8t4fdVIL_}%dif7 zs8W083wnYv1S|dfc-jrnyni?2tv%M4&}RR%n%EueBsGt?#UXb{1y$cKbtUwJJvFI%k8^Fwi`}1ysmf zm6%P;PP^KjPygf+!5>HS1^is$Zegu3QXDN-iOXT5J}4d$he{RTd-q}vZINDs4gE{$ zi1dfl6uLqunU|lCi_5L5+sseQ17<4hp;N7Qtgo$e?EUt4wgbI;Gpvr^VeFh0xHj+(w0_n`8*p|<93f|M zbOb4|O84Ogal<%jH!a~N!s0d?68r7kO74E{QSNE(dF~bNE$)5pQ|>D!#sA4Q|i z^H;*>ungo7Zr+zwj%FnJl{|HtH3%EgKT$@xl*vr33=pk;~7|VzcJ#>v&}Z(AGX=g z9AxG|Hop;LdmuEXQmYbD$cNCD8rV(k&NdIdyAQ_Y1bezY%bt%F;Y<6l-N0$(B*B6< z9)6F7So_yN$N0jDr(<>-&OgCN0(?7TxFy^J+?U)j?tET{ra2Cp?;8GT=o<(5qr6`f z#PQ;E_&N597r{okOll=xF6*$L+zc)(sl(M*)eH6QdQ+nn*7^S6t>2iv?Vx?0lLZO; z!ayg;?-&8QeN67X5YM}e6JY)6%?;o(xU2B=aa=h!g`2_6gQjyQcQ5x4_XPJWB)HeP zcesyW%lZ~8|L?F4H|5XeFXTJ&m+=C8AWKol&HN|O=i-I-f<$flH9nGrG1imo$E9&u z+z4(om&X-BTc~0@h1y(~a4Wdgu4~jbHTB8!;0EQwZKhgs_WF9keFI&8nmy`m}_gG!5q>Obx9wgPt#YU zH4o~|pvPnxRmKWq8``z8+09Ic)nz$kyc*L7E|F%HSxc}Q?1Qbn6D+1_b`k6@8|}UJ z3ES_aIEAqPZ*cZNqH2rvHxIhO`oL}~#X}zQ;miQ|Nno284PLtrZE%EZ#cO!qYP9MO z{t%yt79Al>125bz92A;iEzSZjSs`wN6xQLW7~vc2J@#?CExZeP(Bsy_e|Xes zgSTtI8)=2B5ZPIo~-8-e-;LCfZeW*Q=eX!u8F%lavd2Bz{ zm_x9mA4T7tz}xtg#!53KQE8>Lfo0u~w@XsGDb>nM^yz%OmDH2XMw=mvP&;w~ox{{@gfP6F><7!^b;99fk3prxvP3SgR}4ZP595VC?T!_rU794-(~m^&rN^5%nmnM<;M3 zh)-**HG>q@N^7IF1t;wUy|dI~^>jbx@ge;PxcqVb1pJ~tqp{J^1gbChdp3atIR3QRBFA0)7df+1PAmCPEHwW41N@W+%+FZYF0+ zre<1ZPcsGUOd9x1mN^3Y^k`^og^=6Iz;~)(uc|g@nsZ_GU4)sr93H>bu>P(y*TVw5 z5i@lQG@R|`4s$1Tao87$<%9g%%u2LcS#7Mg@QQQ-AL|B7 zlVoX@W%aaDFw@iEL(H;9Sfi}buss!G=9gI&RuxveYG~baVV_t8zPH?30UdV@wA}U9 z25^Q=))s4-j>tH#<7FZv^62=+Yi2( zWOuVU_@_17f@da$@zHchT_fyK_GoDKh2W}Xc79PPoU}>+ExCpv@d~4ngBTid6tSjsri!M^CJt{jj>F zLxvv#o{u1=-z@y57lu$A~<6jQvlKjlw`t zpe#@ks0vJjhhrw>fcb$%fhF*HuL!ITtO=}xouwhMAUCz*+Hh@Q^Y6qZ!79OV5~o2z z=*gupdFsr1X$7RKHB7$Rz$C0KOvc*5q^vzm&Z=RO)*&Wq9cR*(kI7q!kht3LZ4p=0 ziBICY@f4!n(Q!YyKf< zj1qK#Gg;}TozZ%Aa(}H4Y(Rv_roa|Fe|umDYyi7q1=t(d2dnk|z(H6qjzG>kPA$Rs z!=5elE#Z9djx^&EVaNW@dU*?EzwK!Ao#JkB4|IWj@IUN_W_bv@)okVh-ls)&G%P;r=#r> zu^$f~we42loS4SN@+&$MYDa&4qd1!9RwK@2Em z?LA3~cWJPq2pXEikDIsYT?(+V#3d_(hieq7-3%=LJR0%R%T z?@`h`?YFCYUJ2ZiB3JdVh~Drp{9=KJ*ZeDX%1Hq!&p&nPDe%PR@i0WLb5!!*_$l

    B+s+|ZS<_^ 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 z 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

      Cj$j#k*otrhTnR7mPi#y5P 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%0Dxdgf;n@uF?~J4 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

      IfHUHcl~xm8_5IOOjDytMqH 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 1: + os.chdir(os.path.dirname(sys.argv[0])) + return True diff --git a/venv/Lib/site-packages/pygame/mask.cp37-win32.pyd b/venv/Lib/site-packages/pygame/mask.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..1ebecc3b8bffa7170e2829033c6ddf2e995a91d1 GIT binary patch literal 38400 zcmeIbeSDME*#~~7Ng+VsjvBOTl`z7rreNB%v?XcN(v}v45^ZTgfl_Hoily!Hf<+5M z(<1REjO}sHqnq1s)W=I_GZY-?>##3xc4*6O9VOE`;>SW#3=_rBw;Sgh?+?5MCJb z`s7`zd9P0{bJu!}jh=>;o~qTx6;<{14L;-DE~Cd^Z>+617Az<=u5PGyO&>pgtV!;A z+;7TmThKi-L3w6B`}2f3Nc%#zYv&{U#ugs>LRr_Auzbh01uV>A;ae~B^0JbjCd@Hff-s6DheDwT8H7}P;)Gma3XQ1UU??YB1)&VNWeB%X zaho6vP&o2)NDvay-;M_mjx38wA3}L{VD!sxfGf5jG=9t{R}f~!B>x=+ z25jRsTLt}Tf86Qz)4ipT1Pi5;QlTyo5q#D_MCCKm*A?^?Z*9x%vqZiGg8SklZy*qN zw)IVl`t?!2HbRWFxKAHgrx(QUx1q!txdvpnc)FzVvgHvi3$9!wLR7~P3f znn0yRtdtK#6qb4duyhulzYvW^BL&E4IU%;rqr_r#EcFL+1mBJ2k?DLYzN?~s-Ksd? zL7E{Qi2M?;MUO_~joSo0kQVtE>Gp@0eh~HlJ+hHnw6D^+w-H9RpyUav*4p-MjkT?B zLGe?Rii`n-n+o3@LPi`z#@}gXFQY6lm0?H$@Ol8aN}y#Zpzar2_qMc&-w#XSh?jZD$FAiuPnVw=&B z$Cjg2Yt$DXh^qa?yw`@IUVZ62YbI(*{e32B{z*x7d(`5-0y3Bpp^mz%#p(rKO=y=~ z5$jn%DWgd0h`6zE?V#>*DLofU4pY;#251nq1zMGhY%TcPk)m7wC$+xT4}z{Hdp5vE6viXXX$KR9$jE}lI^JfLu=cz zrR~!0zRx2qSUE7RI<>96`Uw&=<$oxKK#-i8K8@{=4?HIA>lc4L0d@LQ+m^NOP%UeZ zEMSd%qa)9N)cO)4Hl&@AZ{Zt4z(;*WRw1!N)eez#5S_NPEr#T3k2E0{(uvimFO7rPugThkRoDA-KuRxBnK|sdJ@N!(0||8BO@Stp&^%e@^c||cNmAiSNwDsH zAQRoTiH|@Kl01+rq_#ztVsPTh$StUV9>fjnfZ{RMwwH*m9^%;BkWB~|e4{q3(+Pg8 ztTwU~)hS$vaPeXp%M3*l&_U=4ybXn@?d}Q;ME#>9lToj49LF@1y};}BZRZY6Db%tB zqP|{+QsLRhi{(`_1YDm2IRgUgy1e3#CGY3{?hhC`YU}ikZ|(4nId|wO;=G^g(p$TM3v_EhYHVI=byCBKX2`_9rTZWX#x7~)3+Y* z>!k4bD~bdm+@l}Y6=eK8w3=YCCh~!jibJY>*XE~D1p{$;Sy~Q>NtA*$ zikIeVU%%OUHpJwZdq0S&+!;*YfIcJZh?rj01zSm(1VfwX`}-~Q{i6-^{o7{x{(Td^ zYc_xXX%>VYWx$G_A1I0C6q6Ks71kq||;A=1epAQ>vha}~{}upbir@{@CbaH&sraOH=C0uA;JupQ0&TEDClwx-=D!Qz9ynE7@0ueO_N3SQTy^8R zq{6?fQl%HU>iy%o7OfH%U)0i{kG50$9Z@m6ZInvzP03z9Do*evW;aqWG21yxE%+uN z6TxU?ss;ZQQuZdm5jdy{vPj=3Ib+?xXsHlTL@+*9J6L$KId#?OMb^E1)X>u7L3Plp z3Erj+mICCz{G4_fP6vgTS$T4S7O~O zst%DDUWoPiRGL2!=ow|*8yFbnx3=!}-}(fhEzqUq&A~as*}{I~QCzN_&K1#4|8LhI>Owe+5ZtAn>ZDH7d6J7vOXkJTB-f zqDKR-YGIj=26;&fG!@dEgy>mV+=qq@zslY7KN!AXX!s;| z|H$Dd@_8FEsJvX3%Z)F#PJy^^>wgrB_eysn(iPFKN5L@MC!@ioaDVbri_dZY3!=+i zH1NbWhH4GSVACU%`x$u7y@3_IiXxCK$ndQ1evI%Zq**I>G0LF|9%pU!FeiL-SAl|% z>)wRvcE-~;?|*k&Jd^2;P?<^BSzyv&N`jIwH2y%)Qz8K+i5n>4 z)`8!gwlzBH|So9d-9leYCpQ%!kfu?e~Tuu*S%LW@bbpC-Py zL?=GN8fvjGK$`^X{zxuNiNLFg?SW=M;Tw&e_m+i&Snp@Gfpy=ZV53%PGG1=-#8wo$ zn}_$zx@|+pAAHO^h77`tHK6fmqXt{emPctl_p_dL98Kkt&!mm6fgR*THt>F&m1>vC zSiBt_XrVf#W?-*TTLC=iVe&)~CQyj2BIYO^CqZ?>R~{-b8JzgiJKe?KV^rG1`hz_n zw)}vjONTBEK-qZPgmq(D+nVBSvo+0$&L`eQ&D-5hG$U;7;O(G&7q?608fijAH3cg4 zgft*6G3k7hq;~1Ga3mfEtGIo(=4J4S(EW~@dM?|j^<_nUCWCZLI#3#!ixN<1VBms( z3b=-*$=Ag#kHptSSGf!%w76X+`hGS%pkw8Otylw) zWrFm&vm)|$Y|(yCSON&iBsq_Tma1&+o;zqYLia)Qm`{t71WB~LhD~i5u&2pUX&#nF zBd(V;4+ck5MM>mEn{1k2uma?XMZNifPK|Ae$+V^o&()}33#C0Q9g<44 zfp;c}&mN}Xf+boSAeV;g@a)aUm`2Ylu_yqY8h{35C6YqbS=$s$FcCpGj8)J38GRE~ zGdX}zM^H&kS`e|u=}sgXVXMLESO=7=D;Kvf1gD%Qocl~V5*N}zsXwv_i=CE4B0PV-Wy)URW-jB6_Znrc3KJFqn;?LqqFF zVoMejFc~Q+2&GPO`<_zihCy=fMvtH+aJDa9>U_++8=ScZ!QtrPfg%w0K=^~WifA{R z8sm=>jIbeqWN_}PT*gRsDJ=>(^J2o*D}-Ijj3dqlSWjxesPBNYG%^;Zo;2_hp$ueg z`@A`cQFN(BsxukP?b2~6)pp7|TGCvlD)_CC7uc<_9bDfB`b@-TtXyULLfm{Su`98` zZ5nes=46y2lFGK58U=!?J_E`uS(=+Y@w0;|eWN;QC}CD0tg#(ie+;9TAOeiU{vRMe zr1>q8l9SIzVQUlEdI}aJc1B2Y8Vwa)0515fK+u0+tN&K>HR7aP0n-HkM&fS-<7!@< zZ9B96BS53KLJoqD64uWF1AVkUlksJuWO%ssh;It`&mXPHy$#}=8a1gpm0~ev(1Q3HNL<|hj%gqHcRGtdSQ&u&W+&I6LGc`h3gh~O=!KX-? zl^9AI06P)$!Kvwt{0jLMQvVP~UAW-Co^w?Hcfozo6OVB6Cq4&T4l-1Pc;zF1{8Gv; z#cJyVU#gmOAUzTS9SPAjn&^z^n)A^$15oH>3J+8)R9Gp2o8YnbMu$Gor}FO|&P{vn zVx140-u}SJ1k#qDgP{!4BnkUCAQ<$aC$*4G`~*5lCw_uh#Flc}AV0mq`N>F{k~yh6 zh^P9ccH*fEhX-bZr~1S1$Cbkb=d%-Az6bokA547^hY&xSz>n)OU!!!;xlrnk^nseJ zQRxtPBeXzeJKUTo6@&y^*gIA#XoWHe;WVTu*c=k_Z2Q)~i}g(iW`bC!a&iFUEo8Ki z96gG%Owhv8U?w3O+9jbqRHO>`Xh1VeHjyTT*)tw!Q8ZRUduz1m+R$uWku2{!X{m)! zu0HUI%6}SwwUg4zg1`~Ce1;MbTq0=RAWmvwHLWLF_ljHgAzmX+DnPkbnimp~*YYIt z)O!QX2XsQnaKPu5X4?KH9Texi795L8Wg$U*M4ES0lQqwz7w6$Ch(xGV#XAVUtx=zX zYEd7A!qD6Hi3<*!uMU<&E27*N62k9m)R>LATr(@HTqiCl*9FUUL_B@dgV*sc)O&-? z2Q*5&v)}+7C(H1u_ad!hY0M`-(5A7yDQ?b%7N@xZ-53*cXA))5QZfB~30xER1DioO zs2IMn1W7RRLtZNa3HnA@FJ_Lb>2qO z$9kVdnspv@Hx7y7U|dwQvClLcIy#t2lpjpHmGV1bfB-+NbW|reKoIf|hiRN8CWGf^ zs8WFG=|KPq3<5xCgov|<8ym3UK#?Kjjsoc{!&jaL=Bcr@`2nriLLMUmP1*<0Wx%f- z26*pJsY)I!P_e~E(K+Xd>i-kqh3u^i$_Pfwl8Q?hTg4S3GkdVRA(_7JP^ zCMu*+h0ncung3v@*tgg|N4>CE6vl{YS(=nJx{&V2(zQWVmgdLze#+)E&y_|*{|CVJEtm3$IK^S;?VHO-Fn+E&>ZS6Er z*oiFh1UXPb^RVN)9pA}HJ|z;7NJFLQ?N0X&($qfFBFX|GL(%szoefRphpXArjsdk5 zFu4)ZhHEtTt6&@2Mi^mmW}v}J#LnfGp$nBydplEjeYXOlH0SNniB050A%B?I z0?)R90WX_iJ>qzAzjON&SW*`-CabGC>(7mY4t^&{|O zV%93HxaDC|FJ-1?X*bS_L_lL;K?0yH|i@GEDUeeuT zJ|yjaOzIMM7MQNG?lbR`-mrC{Bp2rJ2%yTr#NV5q=!rS-J= zw5=bFTi@*cJI(4vbD%x0Hv`s~xYNuLb)2RY_*^BnnviWfEVd>h1oj?513_$^fYeaG zY(7`gd~97}=y}xW-HI;&ut++JSpgX|@#)72ai90~63cP=+^ zWzvHa6?e`vU1L5)!Ie_SW7gf~-PR*e^N;Ut{WH|H$#)~r@VeqND`M72$nX#@E{M-| z1!uu#HZ>JOXC+9SHi!yspu)}f(J>;3IhQEf28!N1136qp_(m9@fs-b%1l!bo8yFz| zfFC%WG=+NuR|IxN0g(R+3cy4PKvya)(gyC=3gYHwP-NhK9bz8D7LF8~5{{T~&;(03 z@(C{SNfB)GMv=1%{p4$`M^K{0?n@^XCxVd^#hu0D5gHMWL1>c3g?n}94hP;=A(fC- z3jRC}K+7w*Jt@BE)mx+D_S0&wA?tpy;Ik-%@QEj0h-JW0FDVQ-8!SBh=bP^-))6 z7xi6DHN}0VM433g^i0E0-~g)s1)-{!jr5l2{|~g!F`F%404<${P1Wr`oOC+ zsS(~4hzA{5?^f=P=>lNGP>5~oP$%U>ok${WV=4hD7OVA$*iwdQX<&C;ARHID5!V={ zL$jl>Vv?Nh1R~vu&wwDM z$U+c;QSlZTE{0UPMC3Wyv{jn-Tqf5@2P6osN#PH%g(%f@_o&OBYg8X=E%*S0(72o*N;3|T4jS?DD&+2390}vR=p{6KFLp+JnX^?{jlQzH$WQQ;{ zgl0vZp}eTmZ5+bEK*ewzutVz@j~QfG0h%_>p=rfu81{*}K ze**FnY{&egvS94{W)(ZJ+D>=U(CqrlhtF=LYaJ*|gTKN;!?C_%`bNKFsb8_Bj<$gP z0EMub*c*rC-oKwNA-&rcIGKjKV7Na~4o9vN#{sC7h{uSBOlC5*4N@H7PC_iL0y28b z1tMb)9XF*}kF=g$zk=b!8ttaW7AXvZ!+{gPN)DxM1ca7Ahqh*G>nPtO6&6DZtDtyP zWl)IQ!zzd#X}7q2HzI7en>-5_Z`7aLoEmD_ybrykA(okE>uUZUc`hHI!2#D}=e~qX z62MYq01@M3(!q0IirYcz(3)q>VRf7NLXBA8hB6Z>oe|$}GgHMRBuy$GqJhQ~o%krzAapWE_lgEZ zFe+d$o%Kj5jx}<%))N)hC?V5&HcP+0QF4>}2HrII%yXoD5Rr+H9zr)lcIpJp8`6bH znW?d@W&W-@ob269Z0d_wpH?3)$|b-5p5_lQieZ*b-~2pItrH+p(w_rBkDZH>Gc*FH zEnb1}zq zIL?`AMaC94vbc(Uf%>Mcq^x4GW%S1{qX9suT3i%{Lk^Etx&xP(aZ{2ha}-B;jMW@O zCL#pS*NykwKQZ3&EB^6#>^u&aW$0=E%z@~{ev*a#n5K@Vnc#G9;3I+rxDf#>(wB|N z>2dmQ1h{YkG$lB3qwKpzh#PidriLP?y8(;aW!r|jfEDtHOhY)1TP&j(EUl5|Xd{Mr z8CDrF$_mKqBi#<&O8kxX2idd?`S}VZ|Ui5(ypbtUb}mm%fQ3CQU&MSy!W(iK1=Ck|zL12Ig(h zSJ3KzV=AFXhXX}*a6Lm$EFCH|@Q>EN@t;`#4cEocw2qS+?;j2xM$ZW}sbTcIocE8# z;;XIDGi*kFPQ=K74Fd4pJ-u4zU>dnY9%l#l^O(*Db{P_w6`SwH;hH7hCvuCNUY^ zsSaZkV1Qe7qm-xhC5X=+3g&4UFtFDLIkH`R{?hsUqQo8UVuAyR*}`~T+CQE(TRI0J0TIBiZs%KS@>;@ zJKRYlVHjj2nSiLva`#povC+Z+4rNfVsXuO6J3EPUCr~$oYoqWQbuolC=04YibPoV& z95qz$GUW`VR8D>^X*ci=>@yQk+SmQQxSj2OG2e%@Q##Hauf(P1YVSH#vJZ7A9~>J6FXPmRc<~koeqDjR-b<0{mySCc9OX_O5HCV zK%_Sz9MP!{V3B(q%kTn#vh2g)|Cixo^Er(}wVKwmO?U4iRRsk!5nOx)tQancIzpOO zD!{8M>`+~~U7*3yYv33`i~CN# zS}6`xv!b*-)EEuC77c$Kj~n*l_ERrG=n56)F5D;y&C+)Fh3qfdI=y4g>FErt({m0! zz|dT6pe-(>`?VT?K4|OmUMHz=r@TF=f@(!M3gr^d`w(BTqZ5C^Cmg1et>g+RLHYuw z75N`=Ls$$AjD?X>tN|sb!C@2XMRK9kppo{RJ8nCKZ9Ww{q)w#zaioY8S*W`ygoX1m zg}C$Z8wzpf;TII16*t`mMF8)Kfm!qziR>rv$PMb<=6yIDV=EBo)Y^K*lGj6q@4#eB z>zjgtkmeT34vQsSA^EZIKeGRF@W+I|u! z2unW}n?q5r8e)hsqMpq|)aQYo6gHou4}^`je$N5CfPw2s1t6w4wiKZ`n#p;%-Qb*HGm>Zke_C4kg;oVFOaADf6wY@Hu z^o9)2GGRJxs2Zw-G*>_#+4hJfk&x!uONdnx)gJ?j_a;F#B!C%>5TJj>p&+biaDsl9 z5kvsaG?@3Gb&@m&#XZuf;?NwzH6(1V8K)r-LCGjKk!-znxNHq5vh_7tI{jIeO$Z94lY^s;}oG9i(3fQ+w_5US*XUAC_=S^gz9(DzodpJm0l0s1+>qCPGb`F zLxsvoqSBkZ3b&Ff9!W0zyy4&UGH67^P}09lFH93(L@&y+FfC2HV6FK;)>yHGtesc^ zOWPb}$?BMZ?UT9#d(=3F`6vz-B)}yf*qO=K&zO8A(*m{;lds1W`6|y+Y`r~3yuv;qc-h;`7bT5)rhHQdaY@wdHVa(j3kkN<4mX#3Ue<1Na*W3?3I2~JF1Cf`Tu#DWo&(go?KSU>K#*y;EnGMTlDf~+j}lzU#KHew(vH$+ z3?6O`ABQ!JJc1q8FozzC3itu;{RD2=rNPZ+;MT;#OY-buc$M5s!VArjJY@R<+(N)h zmOEL!N$fT-$!2c#CW@`U;#RMIgw+dpA((w@NGRWaX^VFzlgk8ejJ+$Pa)hlb=PDxk zb=y%dQ-WNd3>ms(iq6l1nfnotY6p4^06Reva0f3FFK&SPw$OinU$Jqb_wcm$nYRM$S0)J;+%Ht33b@ISKe@g z;`?P&f45k422;+VDVwFEfp_5WCi@95e+9zm>_k|+0*PE0TNKU3{@7^S=jpK>@Q$6F z8Oqh<*$#Nl;%xv}=q6^Nr-RKeqT;RCHyyKn1Y&4nw2K8x4CS526+~ulaI-J$wQ;kL z?I#B9jnn@F`i;Q!>*MI<@DJJJgVZoYxkSfAy-8eNslS$b*Ac+wc%6GVuzS3-WMDU7 zd4Qq`z!%$pDwI0H5|^numVT3DeoOjV`W@00!|1nnKQ1?z%W(hkYO&;M9Dc=Wh#hnl zf*5k7?F|wq+q;q`HT%*mc`KinUd3$hv78x)+ug*Tip_l#Hn)B&v$w~npcKg1K1E_; zP#NfljBTb2Fb%PF8OWq}41w8fvY$JC?r)HWnNS4wrf<+hI_auwGJF{3c_zEM({@TM zIS{gQ%e(KJRHL2lR!|LO6YGRDH^K@o>Efcgom>~VBZ9puByOhqxYU6K*ORPX!jG`H ztbPINfywImkkuc>o3Sb2sLX}fHj%)FX-vz*m6qJqhBqMpfOQJ)WKrsOh18g7UKWHEcuGvT&ot2COK%rKtE?BaIfQAY1%7uV8q%tKQM2iu$A zO^Qh%o;2z8z}s+V$@-6653=|}j1e~1ge3lonI=5tISP77w0-6^NMoT5#}uCjSK@L8 ztR>_#t*zL^5Q8+aKraK9)4SMOO6qcGZeO0G(|7JaUI-_8Gq%JZT2Fv^nLE{%C59@= zqWu=Rk268DAtxmZHQaZc&l32*GPt<0Wd;&t8c#f-PLQrp@)mZ*%)BrBb{s%YR3FALNzy^|O#jV=Tqx)&L2TI$ zE0{Sy%we=o0?JHMCcYCFgg=QlH^bk7JA#s+SkTG1IjgckadAU^O5MvQ5>c^<0A~M>&|QM`RVTWq!Oa(N*%n7?pTyZd z6N?6Ls*z?sN|hCR1vl(;sZ+WlsThpI*zgfkrPY+=3U46-F0f<;8* z08Cj2V(&dbjENzp12H4T0&QyP0uHeVK`6w+;Oafj%!xFyP(Zv9d5PS9)@4o+BclMg z`Z#$wkWX9}VXH%gMJq(g7=AXaPy(X{P6q0Jb%dA@>qsOBtR;)BbQNuALWr?9nT&&n zI`|(?Qn(b`Rh;_@x~C*ZXCq<@$wjic>n3&lW*R2TcTOu^?T7#9*p z8;cjHceBesI^3ZKfUQT?FD$p7ZQZ+m7H()<;?mb1y7c9n$c`p48BEMn5qYVf&cC$M zxY-MAr6cz(Uz3m=N^DmcG(wzY*xH+q_KidR(dv#OBtED9 z)UXuuFf@&4JJ9?+La=(iCQ70NMaVYcMwU_B>>^5r^defsi+2{f#+r!f8Ep$S;%2&; zjb*^AZ-n12xA z;Q((v(PYGJa%?0MNt&BseKQ%JRj3h53N>&U^-aT$hDvd#mo}piMz(M#Vpt}D9T!Sm zqysY$K*6myM`vK1`yUrYjvYGs#Bhu(Lt=NizD9ZKuVJO@J3v zf(gPCl(@zV2lZFB>O@r}b*Fl{tMoH1uM9zlSiXC%B}q2!J>7?*19HxDi=K z>6-2jslg8b04|LUZ(yQz!~a_fk+o;AVK~os!8=K;`SnbGF2uiSp!QG5?f1}ty+eWl z>zpecHFt-+`Cs*C|wcQ*rzZU*H4x?oTwfOIZG&6b~LFp@x!2>wLAH+lW z@Y|Z4QjP5#?_?}o2O6gHEROuEfkvRgzi1GJA72{h*I_sr=l;rzDi7fsxK0)Wza@hX z@bx{)5CF)nM}}a>jY|TZ02fpr_N8H$<`lzbluD1zI%@=IP z#F8&U3!;C-x(cyMYBKfQEqw+8x)S#Pgx0aR-Md?ZxnOrd)?7l7LSzsJL_4r3lRf)K zki@>&RTwoT&Uyp{p^c@7kWTD9$v3{a(qTZDDZS1tz~dFAP6^jMoRI@xk~GGB7qR7G z)KpoimTEMk8)eDJN*wwGPTEVQH=$lW1eY5n8`*GpTiGdwvPG~WUhOECyc)6>lPNu) z`%@uXZlENWEm`#5)D|5wh!8XsLady}%L}B@KBW+1?H1SWL)GKSR_x7R^V;%zN; zm`NCFLS9%i-c!LEgf!2Su%tej96p69lV{Bdc|}?sl4zc(jAT(AbJW7bsy~dk+Ts0$ z__7$W@HgYtDG&h)@Lm_F02e`+10@$A+0l6>jF>H_AjB~9Ei*`%VL7(h|{4B=nsNR`VumQ+{`U)NCyVA;)6j%0Ez)_H#*})_2N(>y&jf~^-ff`+q&)@ zg;$4@y_M)*4Qk#0B4$F@-uO!dA1O!@` zfZPPEu0eVOb!6YZx?g=9I8J~k;S8Z2ZbVEg8Mg+cFF98FQJh2sbdb<+0cfCCjQA0k zEkd3Uc+z&@6ru@Z=n)OHokzY-&ZkK)W1DzF7pf%7`>`>BHtfQ1y@32{m_1$fpp6*Z zY|Ir!Hw+jKlybW9K^3@10-bqYCQunRl5HK{RLnCOZ+3y!%wJ&LizUq!*t|)v=R=MZ zTyq|73e3CM_Lk>;h7n)_-U>VIPU%#S-J@VPn4Ls)w4Z}x3x!EUc4F&?oWg>OumsqYX@8qU(>%bZDLzR5 z%R)YJR;YOssQJF3=?zlzCN{n0YXngpX>%7zwePL zwoF2qbQJ$1<1^_sbev%BlRbnzuS*>#l4oQh;W(qz2$Cq^{?ZuoNtMqm z<8UM=>Tw%_1mJ{0-k(L+xp*cc8T^ZZZrfMht0fgkValxYz(G-P_IdcHv4{T<H?@HuGrN5aMu8}{M<2_ph7Pe?$54;l9MmxL4tsI3ouqL%H9mkC0Ci5^c&t|MT=t6 zac5*5XXiT3FigkcUuKbx!;Tx9IOb1IlfEJW(GJ*{hI<$hS-XW2$xTitSft79fG`sn zN&qtur)M%&xDzou@DgD%A=5h-=|r?j3sjrZ*mWQBi4#u@NdVdJrZ9tCz$E~<-m@3e zNn=7Cn$w#MY|$o%>;Vf7CD?U1NCYhXph$=iT&S0f(Tz;GkrPD^+n^ZJ!GD|O7yOV; zqBIi`1|}d9a1lj1Ll+gXDHe;M9WZzziHH5D2q`E&_#Nt@lgl~GbNtZlvrg}tLAeo= z-45+fR~TtU0FW$SN!!c%jy&tb_1y@aFPC3hJ|xN7Kg>{*h^dpXEP$|te4zVkQ;LW= zWS{&XYQP1#Bpk>HxU8m21aH81(!(_!&K-tnIv|K?x&iDzNz>gOtLZk%n(l!2Hm2zU zz!mAeY^Lexe3jpPiJ=9ucI0a>BZz_BFoc!PbX}0PyR`UfzWA%z;@_p2h5rZ(Ef?u^ zqXH4}a;gZPyd=rX^q%>T=sg!b5WVMu-t95;&NUm+d+s2;+yB?-ottzDy%V4PYxJHA zV*RJ+o$TZPJ$fhP{qNCxF0=3cb$T!UXXw568}L?`597je$+6h8*8;JH{=d>zMp#k& zTeqX+)qD+m2J9@E(C7rCTZsOi2JRt5J?n=FP$DGS1|$rUO|f^8LS!)nR?Gxy4oc`B zI4A;C#kAwtLG36D&pf&x8LJ&}tl&A!B!dP2mFEWZOTrSuKoz4Xzx2?*pQC-2V(;?H zJq9&h?kQmCB1J@|??r~N*!nr_1{|1`;aLP}YeZj8_$9zBWs;TdH9SegSEzy05Q-4@ z8gRP-+s2`L4Yv*6YrxS1R2bcBIK=KX1nA8;y4SD=+e?12Az(c*@=`+~9TFz9OAU}G zbe};?lGO*a4E_VLlHzAM`#gWftp;ow$i9ua+rXTt_Ce1m-*ZbU{M&4Jr`K@DYQsYO z(m^g@S?+9Z3Vsbp!+rc+mg)&z4}C5m zUkfYxErj$*L)=bQH9m_r^H7KI0`lI+vk%X&@NCB8!LuCC9e8Hrq0edb+kDmN!tW{6CP@tFs-2M%gJMMDK2a%Z-Y_JK9q#~WgiMh zK2$&zm5{f(_?ya=-zXc8IN8T(58|n(5UHdPkHk1 zodF*lewH?Qo8;d&Bb*cNc|Fs8_uW^0H>M{vwkY*|D@=3p*f{vH2DuN)yOWL66q{GZ z>opI{4N#p-7uzE`R-LENs=}JL=91o47)IT26{*9~g zn-h2xI23+L1%7~@!6ymnWIPr;+Y%w85DLQTD(^khS2S8PrrldxZ%v)vxVBnwuANg~ z>#L+9)JWP$_4vmG{HATdul2;_{TT9REAnVPl+PiOpBqp&rrtLo6LXPQ5R-Q`7TSrt zMKO6ZkXMa7XG~r-@}U1N`T4iZzgXt`gwld}mGi3_?RZ1DIhc`(1B+F$3wZ)Q5z7J59D3s$V~dpxdcXfeuJQ&m@4TD8Vi=JvR%s)ZNP zdR{~Q%F5ZEhSd}i4yc`LD`)v@>#EDE>ijO@YSbufT2VRQwYtGWJvMlRgYlK9RMJrI zD)o8%D|~|RB>FC>UE!-Nb@}G_T&s~^i_U~%w4PnpP~~F-6g2qn257<&88%dwE2hh% zurc`{U}!#r*$tl6RT$$7)Zvq>1QKX8L8y##u3d2VDi=nc?Qyw;*=Unr)#wEVsFJgx z7Qd|G0aXvR&8x2FEd=3N$%t<=)r2zX0t?*ne; z#LR$((;=PbSy}0<@_1dWVqSgqZLYQVHhAz;mE&n8WCT#{Y3Q9+i(uhsEQ#rlas{YT zUT02ywW~?S^|*^h5rk97WAt)|%j;|KC?q2^uJySa>a7`!{DdFGFRXW0)mPWKsxh#u z(O270KfAV$Vg0Untng)vuZ#m~@`*U>eNIoq3KsvVZ)h)U{LxbhqPY{{>>xc52L!Zk6uoCT06yiK{KYrP=c zvf9gv40A~ng^+NwINTPcx8F>#a+&=$Dv z_OD#&@+eT=R(MBA;XH_CVpw6SP+95qRag3mUTW)W8Y-)SU{Ax^$~trco)K2NR(oBD zr3;lVhSN%pVNY7+iiXvz8|sDf{5uwwl+Br6n387Uy(S1X!~nvz&;@nuS4T4i^j_=3 zN~{*LhT@ejAy26Ey4;mDY?&$vsA~oETwhbW61c6buL76fTUq5*vqf}4i&X>M0lV$dVeAS2INjDp(DB8mN&-Y7^{3nR+lIq3WD{8koDED#^tH2Y7`*U>o`ngpN)kA_8LJ9MzjY+4My4o z@iu(iWGt88#YP`$K+rZecp>&1*pH+u&>L5R@av6tuQfIqq4SMvrwc3UTveX08_)ti z;IJh%pdV;y?>)&tNe!T2!(#S>ljZ{h4TLjhyLqt+42mHfg57zCKs%_B+Hkmdr^abU zP##T&a0j$iH@Lh;`qg*28N-_#hn90y(VDP%AOxMdJXjkZ#!PH>U2P*@Q-(_XbbOU@ zKHpo#_H~&_*85jC);787yu+r7+`C;KnycJJBN6*eyyi{A;N+Z%wIg8!IIBHX_g-c! zwvGiT$I5fAZK%h}R{;gUKiVqrQlFRUgJw1es?rNzf>=;Fr09~-9fb@&A}ym#({fM5 zHwrvdkKm`!<*D-0d{}rHVAzBTsiM+@u?G8%&6c5nB4HhV|3nsl`xGBVaFCI4JPQ zx&U*jU(-;xhESvEkt7#LbFDGkn8NtxE+z|-Wsxv_`t+q^Nt;lIjkND!S`qq(NU93s zux%3c%LN;ml3Z90jx~gSHUL{W1&*OIFt6X&=x4ejo0dl5=IkU(vV{w>81iBK$$RlD z6ZX35YB=-CL^)hGDqqRhg;RRd}07K9!qIZa5tBixKp+#2880Xj~1{*9L z!Uyvw*=Y(%Q>&Y%R^Ob1dW~yWR;_kTUya=9R7C4?skTYjy#Oo=Um~jMT{^h-RZQR0 z3Q<2;pqh)IW0^zXaa*QwaQwT8TS#vV#}OyAI|yBu7)+_l)hLb1F~Pbx=Q&sRyNb!K3BT#bCMNNkW=Kzfkjp4Ly%;FP{B5JQA_*((1VaFVdA z^!hzDRV$c0h)pMz^894*nPOQ%LZoI4!8XJc1SJ=pLrPQbmlmJ(JJ`+0^w3Dmwi`Ym zu|ED%)6;K;I3PVE_ban#vau0*3!71}84N@3pcEsJ#&SQ(pm2wMF$e`Mn>N=MfFAkO#7{opG5rRsR(}xhRenikOm(x2C*L`2mAIg>MBmM%O9Y|{clpXbbsM9E? zpF_GCX{VfSK|GP#J9zt75PuiXaye~6{3M?K9A5q@;+FqJeWa=XOvLN(=;d@1;;-P@ zVdv$qB7Ppv)=b`B|6j<*)0n~2jfgM7vmEP1>#N7Q*5S!D@$@r@pGWzQn|Oc5ORUu< z{N}3BDCpH_zZG%)4>4XkZ*N4r3D5Fdd3qD#s5b25rvsaRfBw&4fDZhM@XWAevn>(d*Pyd`sd2UC|lkp2;W6G@?&>2t*$d-Gv&p0Ap542 z>6V+|f5Nd3jE(G@7M9JPmU)xW3qNsnRUNh$**C3qd2e#$j2~;S@_JpX@2-RYV|87< zH~S{|d1iW7xLr`I(^l86@HBWEYJAhMvzl4uT|IqG%1y9>>uYP^-!G3Hjk>y3=?jUG z0RCT3Lj$xx*~D2^TK?1WQ_Jry2P}WHyleT&5|<*TEJ<0L5=i-O%2O%3QqHDmQ+KC+ zmYQ#!XRWXi8S`g&XKb4Bof+Ss@v|Afo*`x=X5?qw zmQkJYB zFJ}EU>z%C8Gq0FAedhf$H_ZHxnNQ4oWoGBh1-3=D<+h*McG`Y#J7YU<8)G-vZ?IeJ zcKa-QvAx7zX1~+E++Jg^vwQ4K_VxA_`@{C9?a$hux9_p{*-zU)w~x)9m~G59XJ=;T zW>;h{&92LC&VDlc=h-{5!`W|VpUNJ{zCPz0IXCCna|&{n=QQTroAZO5Cvu+2c`4`B zoOg3R&G|CtM#oe~vLoBE)Um?R8Ur zSr%B9SnjrXEI+n9WqH=pZF$o&fR%{H$%{2*Zp!T`52pMe<%yKnQVyrQnUaz^Bh{9g zpL$2?qSPl-Po$ns9c>+(R+(0tc7NLU)1FNGS=#or-Dz*9eUKKHJ~jPY=`Wl{xxe(QM0aneByzYF{^ z##`m^-s(s!o6m;Q13H#005=^3_+vW&$U zRT;jFXEJ`7@gmmnlZ?+Y)S0=Ng&60*GJlr2JM(bndzqhPp3NMUH8<;9S%IugSzELE zvih?IvfMN4v5IfZoM5Z7d2HXd&9yu2OYLuEzn}ei_QN^ba$d-JIp=RV;~aX&b&fp8 zZI1gL8ypWie(m_33mj zWc{i2dC>QMt1*2-#)7OfGgsN4$Pt`eZl9Wbd8Bz*Tic@r{`qYHf zN7Htt{VDBu+NWs)X>`ZtX_P;b{b=^K>{qi7Wxt!P&q>bNkkgX0IcICmBRP*_wom6g zm$L(NekG?3G_^nHP|lxn{*u!J>N=Uz4+=YDY1;@Iri>UhNQxMQ2+X~%Pp9gY_quQ(1l{^a(!k?zii{?(6No?zfXg*LMr?f*@#cg+hX`8&CQ<*!@dxae^@Ak|(AJk4$*+ z(%o?-FJ4;aZtxgdTASCj)~qws)-*LWdkw2yhE`vbp`po8v}CzqU2~l)ee&dqMj7<4 zPTpJg?zR^amFxZC%Eb2&9z62=__y)A?KS=!Jkmd&#~&ImvGl|2+4}bLjcoikl(`TM<*r zW2c{wryf@~3+vhYI6)ZClfzFz526q;@f#;N5I`X+7k~=s`S>n z8gC6~BqFLC7v=51rTRHgbvn-`>`q6*4qP*E-HuE3a|l9D`kMNNI*%YEQTzZd&`{{X zrTRGl&$+Cqu&fa6rugHyDBm7js-J`EZS}O)B975+7%!A>FD}*3!ScBpn~{-dDF`6U zL_GGtmkXiaC1ZF5fdJPZp(Vn48LOy-Sr+cZs(mmkAT0y!p0r4F@zC=sU$>S&{T?|;;ir@WR+_n|(`CXq0{`|T_ zkU4MS+C*s>TDw1i!hj}7rO4XR<8?_NX$8Uk=L-S#5vZf|9m=LLx>68vH$~jRBRbGT z_g37b=1Hivsa{GDS47g3c@((pFaGR{P$(o7A)@1`*jYk> zDgX`)`wIl`H_N4T-W2coA)jvTIM5-G9XKTY2DpWegc2Mt2zn4r`Vis1@2z+*2YU$S~67rppCMcDcQsv1=3vAYPhJ0d9K2>`&apYCN zV)cgNyc7MQao&W$3jI(9Zp$mEh9{6781C|&==?1{g-^0!qe)fw_8_(So&1srN~1gbZSN97_{V0g$FSad27 zw=`sSPlH`%LZ~Bf4d9-CZ%SXlC0RZJmNJO~`=mxNt`E{(9?04OmID_i(dVIT;1Kvn zr9T3JLq}GU&?2XQvo6k;Ah{uPkqVxHNci{a;aDbVOu9AcignN$* zfyn~Q2!-AEkUqT)Dh2+;njR?DmIoH(#rKPk6($9jro<26W&Dl9ruYx-N4ysX7U}HQ z=vpTR=4j*R=^d4@B4R`%_RTiGWqXNA0p(gP5+p%iI0!ljZAcNhUL!IGK~*cI0Y zlXMtBJ9?^Mx%#Ab#KJnU94-7kQCfqSp%0K*T7fsI5;p|ESZN3%gNjp_urOg-l*B~* zS0pyqC53#cAzzC039?mHt>}}UWcj^1cO#l0eNNGR(j>s^>=8Tufgs^CLeVEb#GQ$u zR`4b6OXwgYC>;Y>X%H#EQIpvNh%fNKM3n2HaziI~#WBkJPwC17K5geG(5WxteC^U~ zB%|?HLG~}__1{DV5Cup>748j$(n>^~9;~{k=Zl`9qMg(`1brV@_>W)mEMdIXP?gs2 z?+?AwZ%LrEuHuioibuMNKfCwdd!ME9JOV`!w<`{@&XptxYZIjD5TAoG?NJUnjMO#yP!d?k-hg4wUn*#@rbeFYGu$0;qXw{)qr6Sjd2 zy7vnI2BXk^sjTU{;)X5>6rTzRmIJrg0JcZG9fpwXft(?;N2)>PjCo|g0YTil86=)y z>3N*w>Q+v@t@%W7!8?BIW}V;zXSGrdveUB)&#Ee!%8Wz-kb}tMe;Xa5_LYABNXVBc zO-H_=Nu1J?sSN0PanI?2%Zjy(K?LgwbSgZ0aDmLVB){up5NAYSpvx*a_2tpgwq3e3p)h;P<^oYW0;v#n3+KFh=q9ZStvOL!3=sy;xEDCQ^=&JOpAtt z#h+Ogow6+Y%+hZ^>`Q!n31AQDI}iDEf!@he=L*}P= zq${|M?ss(1{byV0{`+>iKfM9>`t5hz!ydsq+2dzk_ULS3k9!;0<2P&z<0VKhJMglfVL&!C;P`B9X;)`AOTDkWR2l(RC;(jc7vGl*7j%E|1LU`K6+aS6 zHi0bV!OGC-qru|)pftQC7aax9zUbrKNU(SWoT7dNCS|htXy56z< zJ7Jn08P-meZbKHblItj|Ygn-K_$O1+ILm?Zimqu?Cb)TUx%i8~M>ljOcC~4`mT0>w zbb;c*z@igC?v}qbG`SWAijQYCd0mZ@`UAyptc}Z>?`rZ*>aScYRE;X>n~Sp3hi8Yx z{GRb~g7>ogRpZAA-qidSdL-wUj*l0-QxJ(qA|m4j-_$_!>wc4)bK>3aPX;jlyJPh)BC-@JKZ1%>`$OpBd36PLF>Ja9(wO$%K<1GjLBjbIR&I7)y zcM{qB{aRie+9P~YJZ!j|V!h}2`wcuE7E54pmL4X2(DFV@PfkJ-vQbyrcQ7-Sc+K;-A z`1fi$dp68<5B5buS?&dUBB3kXdR5wm?!TkK?&H14kZc1Sc=LPFN&4V`uj~sYFsKO( zS^|TTK&6)lrY%tFbURSCJoF0G9OBsd5Xi)8cQ1&F{|}0%vhLET_**ERAiLeFc;C8; zQuhW#xE}yV_b1SuP}!fb3vUdaWHVtqLe+-6msYrMR~7e~{E5)1zyLf09E|s zDPo?cT#0brKrM9M5ZJe}&p(rZ$NA3Nc?wTPN+p|rCe=nsZxHenh$K;aC@G1OC=f}a zCQ(ueHH`w{q*z249udy&{1|NCpRi*uBpbhwz#<|dph}14k4`TSc#T>v4eK?b`wqeeYG7glrP@HN zuJe;Esexr$vEsmoqJCVxnBM#IPxcmV(iQsmXzhpE$!+c1O=zN^{G;;a6@d-fz!IJG zpqs`o@X0O+EY|hD9ltcxrVXvvO8c8x9~Ri>j1*Lt5431eKx(1l1D!8>EtUg0i*;LO z0E@|n9}4=4z$UGD$yQV>1mIsU+f`&V2a2IGE3|0#W?fgc zF{!KFm|{;LMtiT^`2Zen6EVOXN7As>T?4iRXa?bQRq-W3K(p_O}A4{Fa*; zET1hfUuy{kDp6d#je3&$ZYuxJG0Q)dI^X_9`&%cAss1DAWglA0oRKukQ7WE}Xw(m- zTMn(W1{}K304g=2ZmRdalarBQ=Uu?Kf@vh&m@H%tOuija_Fk`PY3WXqR!Ss!O(CFv z00%>fUF{vI4*S0Lzn?sS@Xk9?AS48)(etE_uwkuG=wJ>E*4NjImvj*O89gHHNhXSQ z6+J~*QET1~fE{Se3(|=O)|g8zA&}A)n5(H+9%;o>RyqHBL)Wk-ESH-gb~KUCHaFZ1 zv10`yqMIUiE<_x_P62&F@mV6Mz;w43(Mi$9U$a|Lomlci_K*(lL?4bFGicm5UnW?SVaUX$=P+9EwF(Q`2uL>Im zv6BdeQX?n@?My*Q2-LCE!BIvOd=$5Tn;H!K7@=(4fs&_YbRNL0SR5JHLd{ae&>AFgcDP3M;sxJ|2rjn5V ze(6L#lYawfWeS!VE6b&K)-ZCBllcX_pWR!5-cT(h!~~HohX{qm%)5YMxh4l38YuIu zC=v6SLSCbZOW3h8W8Sf9qY-wd$Otvm?54?Rj{J~*w*!?ND>53;K;*Jbf;R50s`)~pk~0|GlDl0f#snb#J5eP2HFwlS&uhcutIC! zLvY(B<246lrhw;q&Aoy{{GJ#qN&X2AeLOo;oDFqr5on< z`FgQ(56pExNbaig~ zUTF1$64z=fL*(D`E+hT#!lXBiP5KlfbqwiKKvpaq{$lVB%qS}Ujhf$b zeX*=CVq$?@2!$2mZDllZOPWAE2DnKge{SrU0`f6-i2f~9b}Vh+ELk1RlI7>X67-M6 z577jbsO}f1>bOdT!zGGVq_n?IjUlb*!h}OKR~o`v!Tb@eXaXCmWtAW`Gxah7u2wVx z+@?%QBv%L$0aYZ|2Sm!e_?1%s1k{g`v6T=HB$Ybs_!H*=9Lgm+@wQhm|IFl%RSJFm zP^>CCSjm(QC>Gk6=-N-Hiq}LJza7Q7{8G~oR>Jk3ybGQHx!>QO8G*U7Hwxm*Du|*C z(Y@+fLBI1jI$V_lI%>E?9;vL@M@~ewWCEcQ@wa&0y8bAP(tsse_n~+ed~TM(y1l^X z9x-FnO44aa zJ$fnIu~ef}TnjBIF&f|@g4V}U`wIyw@$V58wRgVDiRQkGY7avFEC<51@B0S{1NT?Q zY~MmoKZZnX{m)T%_@(tYp54|Gaam-)L6XZ$kS`to`Ry|IT;h_U~owht8Tg#D6N~mW^yQQeNSk z64B5lC^0I#< zK`hz>-y}(f>>D3gs0BofVgg4nhDiY|z87LTR?cXoay6!ZZ-I3SiETMS&EEk?z(~c7 zt`S@UBur9z4Zt=qP%g#YAP;bS-vCo}%dmFD^Rdp3{3X;(INbU>V1&^`bv9OaUdBLv zZlH|@mAbUQLDSf*5Rgg2%v(w~l|iIN3zs7f8rZ{T#H?ajFHF#Uz2~Yq{$8#92=iZ* zDp@^yH9)kQBf!^~sBzSQp;uX@ht!oO(^QmFsd$M4lLK=9!Ryz>q5cV|{{X9h3Q(G_ z7t7#RUESOEOBsh(PPTzk)OI-NGy_DTn=x=q`$xFHrMB2mO7KiB^!L!L-Ula(kxxPH zq%8`>RZ$?|Ux&-Ly%;W^5LM(f*d^Bre+~HsRHw0deiqLE8tbkI!~K*O_y+c%MA|>p z`Ndls09Gz@^5jlAr_5D%k`D8n4j4#fo>Ld*axtcx#11I5#lbq+d(~iM4$rFfj%n*cP2e5{|Qm!z`8wQ(YYcl zI@9E7)i>CbYOJ(adPc>t3N7IZffJxJ$%*(=h?$7`UO0oO+%MNTc!oNODK9}r152n$ z=v8rt*rV6=lMCk{Vc*yO{#i=@A9ZOq|H#YVnszSbw^Z<&F(~2w8|sb|{eK1b<+}fJ z#=5s$tSXCAw?6)5rQAzNib_>d#HMO#Y{h0Johvb4Pt%eVQ{O$#BIt{8nKK3by|^~u z{XSgzS%UuCxYk+){ZU*`;{7x(GOBF;9y8HnPMwv9l6L_*Oj&qd{HxCQ{|uYE+~(*O zV7{L%?x^Sc_dB#?duZBU7p@HW!R%pe2-r;yEY)G^eSBb!F0GITkQyw2!F+{#2L2+q zM~4!HfpV>Vsc!S7fkMTf9th5f>!KNYnyhA%vv8xaAQL;8xPKl9kGW8+C!87n=sCzS z=*8#Lcz*>vM7={x?mS5^Y!9Jvlg9nP!(=BuW280^FC&%m^#cE?89{U=<)w6|o1xUb zoeE(kH+e5BmxR79fo=By=xSC0>^X*c3H_iFc5mQy8ogrFl5m`&S`f8z8odG$fMj=! zLHqCm0Mg-dGN)A#b(UfRT;!4-X3@|+L{#-7iHtp3B>jA>{Ca6yZ2rZlmlbfU3(V8A zr6!VSnsHXBpv*_wEIney30l&i-q`Q2I#6`+zLl< zn}BPn*58Y!RUO6Eg9}SXRWHLQe;3zrTyNug$Nzqu?>YOv&B-pENM6ABLcoiRrFcj69iyv{$P&GU=^2^dwer=d z&APzhK)Fu32J_00B@60Y{5Q+?dIsjCN#z&9}eHEQY1B#&c%!%G0LsF=8U7*p3J#$_oHYNtH(@A+i71X$h zQ^OdG5p9zz)?$I0);B7Ybx>HRR9d2@b)}`@bx=9N0q-;)eT}$YV+jq3y~pFxk;)!p zU}SB4;B~Cayv8Yp@<~`KiTH^(P=#B_*OlJ67Tuu4s_gv0mmb1Ot6amyu~kltz;NEM z(t?d^AVCVV3HpVQpQX{qnKE)|-k41408YMfGbR!Xxf7pW`(N`;_X$Ae&s8? z-BU}o%m&4nA|@h=Jx;;~TG-yP5Jm-IjIpa%vB_j2+o4+wXQDSnxDbK0VBQW|W7b`R z2wG#_huNLLHAHH<97O37vg$w^g&89zu*o*+NA$!Kp2Blg_5O-_&gd!An|Lv`P@yf)P4q>6Oih3bI+;HU zzgBuXn2n3j`zmURBJU9PQbM~jBHLkU2Trjp(-qhviS%Z%O*3>u>e&INun!4>;b66x<2zyJqzM(XvJ1~IB$>K=KB z?HK2d6s?d?M@LAWr<4zMgb}`in}6*n^N&mm&=+PN;{6eoL6>A+8!w#?^9&;fV1sb4 z;j)>*9>_nE_2`x`Y$30KtW+V^;EtfPM>;tP=*CN>=@>=%X^WHhC)^z>F_vJ?M^+DM z&x^divHNpsAKJy7C2C>nQnxpzg<{9A;VlKQK@SVsQpG}bm;VOxj@{*7D_2W}&<+Ed zIRgaZ&8(&!Hj9b@m3G)HMr-El$x~&`PC=6~3Bl>eBKU*{LNtJpgG5~t z8aZe}klU+b7$Iag(`@jughAB9!ZztWFbugUy^_|vF>QM_@`&HP0rLv1xQ$#*USdWM zCdtHGFQX|3W9O;`@XImZBkB{ysRAT-K1r@a&qlo5*98FV_rcwZ8FJHGcxg16MALp? z_@-$36CV3T(`$IV$Ia6bypr?qBCt7zcXBH#`{8iou@CWoMjSaG6bIT@15oAbe9o)t z1GET?I)p5j$l0nWz+j-KXC{Glj5PmIbp@_w0)^hb5-7m_MI+9M%MkBJUeq`!&#s{j zXh}Zf7HhCmmwU8kNGw^3 z_fdk)$gzrFLONrxglN_k&{%bm`!EVEi{#&RR{FpfO}UznCT#9dW|#Km3$AIX-Gw{ zloqlYX<`)dG&7wd-OlVe4S1rw3iM&vQA~FkiF2=i>+`7JIClNML>z-5sIh3!o_GIV zZKOi~sia8Hk8P2V8yeynsDlXntuw@Tv`24Zdyu+D^(HntY8NvL8$gt@iESS0(;Q2| zD9nIebe-8W1Io663SbUg75;wmLd4T9J2rp$qVz*_fiw}khiZF4^2cPq9QmN#ntF7Gk3UBz;*$EvUpXv&zmPzBuf)Vx;4nJp@6TbK zGaY0&J&2+Ulw#jeip|%Yc3`}WouLJM9G?UMNb24Nu4Cwa7=hFs2;gbBk3WsO@RSk? zIGsnn@LojcZHjqsx0?z^W(!ay_@q=iS*dg$`e71pP9=pxQ!z?`&QLGEg0|_sxtBLh zExnizEW&=?wL)oND{WQ`4aghFy*W^vgx#<|Yf~_JN4x4#!92{W$s=pb`aw3&XIrwj z?qEg1G@9U}9odmOfPx02AvRSfDD!jLU!hs@{9KAEGm7op-HkMXJt#%-N0Ojf8a7{- zRO%l7CGte3>S$RiJXHq;gf>Se=~R<*u!mY{?p$gLtN;xC)bY$bXeFyUavmS8#?GAa zHZgp#KiI~+LHIuwqI@0pbn#iVRb$PfMXwM1tMh5R9?Ys;hB}n>A~Yaoc1=bHtHRg? zDoBNpS-2%+&oRZuCUB}I^R5Dx5z#Bz`~XVnj8Y~ExV-t;EfJMvE+uhyMCBjD-PZ*U zvH8Oao#cZ2f(z5QU;iqVjEJqWQnPj(oLnnrW9H9hdIZ%vp)3t!QcwC3)Q#rq*gT%J z4I#!J%-U&r3#u8ye6o*vJet@5;>tV}(`RL(Qx?Gpzkn}cYyZM`5dd^Fi(kIrPO_2w4h`B z;*;lWFj56EA?o@hV}Q9Zm3ny$q?K-kJ_4QB#+Y?c^hpc&(4>O34kbQUtv zN|Djv6gZ>va2L=qwgj@~gsokS3s?iG1YAB~B*S+Ni_kBI!!(GJ-;kTh{i-UsYSr+X zro!LSV;slFM9k$PN1M6+OJp*1FDVuDjkvmTJ&B9LiV#Emxj&={_w9Ng{hC7Y3)^`t1;kXTB*C)F?TG{2{ z)lT8n!jLExpzn(KJ38`rQX;O-r^v2$b-c?}ZjN_el#An=73wRr~s;D}%!JxEUM za$rFc1kjXmXfJo46}7PSWHu0x7Nt^F*lB$WwBuuqPsRJdawqH$skw z{?2>B0NEQ!xeo#IN_OEX-JC^0wf>PW_v2WE8DXFCMLexD{cT-M>g|N}Xh&2rKrj4*pHcSEq)XI{)Z%f8mLLY;xeGhPcm0JN(K17VUNL zJVdC@9*m(WU6J&_sDV z@t??zBHy1FI#n)7=$C_rGl=9R#ug0JxDE{O=13_1kCjU#M2AE$Fh~UdCz|vFuncG5 zA%}w4(SZPXx~&~gI2br=NgD(5Wbp$>H8jAZV;HECM34j!8EDuw0kPs^TK}gTyyyEr z-RPa-|8x@$`+nLccBUf9|Icwa{`1dxuMRps48ox3P$I@@H=4PZA$IHs2iWdHD{#2& zHew>qqXE45SkeOjKS)OBa2aL1+5;J-@5eCEg#rgW8Ha@b{(DqU*Cp^^4YJWl8?jzZWJ(Nn$4?9deT5e*qa^8*Q zD8WvQ0!$y1!3S3uiqtu%d|J-WTTXq9CMqVU!#Io(9Z|#}$y8q9{`ek@+v-X~$#o0_ z+{TTGZU-WVCi+L}+Gn`C@xJpZa6x54If~mEEJ)ack8%MD%+*;!3xZ4HI(xP>)pz6M zV(_Lo?&NAl0{a+gX?C3-llj7NV^3YMNMkE?k1!-|d7Gy#^dI=5@W$RcOrICU_l8l! z=^zNtHYbsHq)rU3#tUkkzra4yetV!d7O?dU(wh29~L&TWk*IfkTPo#c6P zwQ7<#o;$%$dKQ>obPpog9Y_FPvUI7uCDg@v}$L$EP$ z$=Qt4CO@P~`FZFHs1EC2hpB)4K`d8I4`p_%zykq-T1MDb< z15j_wUCqbv6}VIa7mkq~7%_Xu%F>95_2x9o)1eg`tkIrhUzom2pXkD>CDVfhq;ZIO7lme z=@jk1Dhe+Cob8{i-fJQv?lt3HvKJEv`m((ae-EvN$8NeB0%IgxCvm-R?``kJ?9lnF zunC?6gU#9$=zptto~3hQ(|<0ZjbKbbi)p!nY2DYyRyWw@T9(q2zH9h^@avvoARRZUwDa6Sv=s}>A1P-Y;BkYfZCe;e0v z#A?PNMo}Mc0F{G99~*+@p=CMhj6Mg-^j=r)bxW4 zpp1sx@YH%N#^J)AXB_&|Yc3F{UNbD}b>E1JpE}XM$6$Y<{TU)`J5KB}nux(9v`yx= zxSb|xh$X-dl^WAN3NDQYGg5*{uQT@iGwma&Q7WSJ==u?5LlzAoO=Bz_-%k#HF(&Ef zkZK&Dy=NdUwrtSxO1%zdj1~l^5(}|6UY#_aS}P}mpZYn-5-B(ym@8$qNF9d;Mba_d z4xWSGMsYjamLG28W-H_RNZMc+zo6zY05Gms9tdh)0Na&%rXm(H`Z~0+g!O6MB{BSl zYo%guqQ6f;`x7)|cC;0=K|#ON{nXvjTQJ0qCqY{nGQibCdD|K?mrokOuffiv-X_b-Ipw-71%Yd|7^;G*`e|e?(msV3 zjcsBeH>3-(8d?ElgSD!pfjJ=H0Ej=8HkOy`+FxNG5dco~sf@e_cpJHiIt6r8T|Dxz z9SgLSalV{UvFEVAm686XEV3VkQNy&8>|KRHc>#+39tSmGB=pkCEM@C_wdzYEg_BYgFq zHZoNVw-3b?d!%yI!ZM?F;sQ0Hg3i946$Hbt6agN-k zUYdxlN~U2u&q$)M>sx3%dQPmlL5WceQiJ<6A{4p?yw+nk1~v>{{f>BR7P9a?2MMh1 zGMJ33kBhfXV@0czX)a&Rygr{x!0pizfMJr@SxM$X^u(br;)n_v}II|RV34EWW+-5~Njn>N2hY(iM!vi%Gcq*QauZe*B9l zm5%J?#7w^hHhE<~eFo?Pc^D4Hux&Ur|AA(lWPV=ks+{7_McKneq%}Hx;0+USp*EfL zI&2mk)B z)zfJ0{)a7gtSy$GmO`wg9h#|P)||`jUc}0HE_|Y;4|<5iP9V`>q{yJ(0?Sg zKM7yqYV7Vpw~->dPho#X@fWCyqJt^qFASi&koXuQNuK3^2=N`+WG(;nOWq>p2J`-d zQHGrWz;vVkQ%(DFtiJ`9vd#bd!khoe@dCOlsU`E!0JbntuJ!LTpz>H(^j%;AEnrTO zy#K!!`~TTdDa{@SO7u_;IH`Yu?6RFFfJlehrptzP@A~u9tH0dA-uWt=dv-2|UQ`1o z)*5Afn0h`-PX+usY?Swhs6FM{;F8aJPok677X~$?lNds=_FPZxA%@V&Dg81|`Y&nE zNjlH4AMIg>Ez~Qn`}ui>5r~*FE==!dCmG}&Ydc2E8Z`sQ$wFIj-jHo(pzjAT4>d~G zS+muLH_&Eqt{u)Pmgh33!4hI?pf4WZ!V2(lk^KFw`9Nl^P%gbiL+`ywY``Lai%ZcL z_4yAj0;OY#KsPA#wez3LDpr7$@vuCWB9{Jlz>m(Sn8=RBj@wmu%HkKckLHN~F$2=b z=Kk4P0x}YzHjV0wO}=D)o**g`2eD2w&a#as-?)TUdwiK#NuWvjj%Ogf{*idGBN^SF z`~fZb#2Qq629#X5n=3i@7?R*IyaO1_=y@+EFcQG9O-1DsmBvlt3gb|ca%r^65kMr~%7kx@&km)f-=Ukm- zq_2&sCU;ad-DiUTU>N?r96s$E0az<3jfHO`k%o4vEFb3>EH!Ohxsdk*MbQ+%G=3jD z@aEs58+UVx+or)`yE@9Fd|VGXR`y{ECbCL}?L)jLJUzJb;vPD4jQuWJ%$$Q(4p2os zrG!PrbFM$`oa>i+;<4%n68~!b!nxL;qHaE0Zwt3y7*+kjiomCxFDu7?Mw8#k=&!T4 z>Dn(m1NohOI1|k1kIfcvMN)@V2so8>+gSaK@eeRrt}myP!88d}YR37HTK^MFqP^Ge zd<3EtGA|7!?;x3?g)Dz4(e+N7EEz)9an0(^dZIzNQl(>!GFq148I;?mxQU+@%BCKIGVZzpTF8dD>r&9-Co62 zLE0JRn}t`jsEv2akofVi7o=M+mQ9P;aSv<&P)fpSe{{Rcg3ixnclT9zC|J6R$6~e; zV;B`<8Wm&q@4?VUE@*$H{UQ77n`MWv=+zVqAC;un+fVWp3(f{XMlsZ)cOzz7%$84byvDpOncbKw4y(InFuH-5TD}OLN|)xLdGXa)M?;DB!!#J- zwPKA7pE`vpMXm{$wB~Hu%;%n2JHGz*1(}tKf9j2S0P32uaz4VKv77b(x;X>m}lzB!Uv)q!^`(At$+p$q9EZ4xID0nk% zt;M%kyEOkX7vBzj8P+FHhCtn`uA=jk4GYQJAq8R@L??Wi# zi!*&c7x>fGC(YUmr3|L^Xa2tC)U&2vApH$O4-=u*PWU?t{6y)cv!*9Y51log4i=pa z{`p_>eb4wW`M&4WukZVw;AwslSKoT#8U9ZPpF=8Xex#GVGLn}-q0MkfxZ`vZ}DIU5nxhG9%jT#0PAx13U~l+E$M;c zu97_fcj zirT!zz60t_*zG{`CZPpDKjl6>cCw)5ftN6Ck{XH|vgOmpKJS(J_tN8A*lOE|Eq8$d zN`_mQ9L6?7#@6!kkcQ}ya5L7a^U2u|Z=H%m3HU^4^{r^Au`>@3wrj*l%TVv&I}>cB zWC&S^^CZHDt(%G4-$sq-kDicgb^x);VBt74j_{CCLo@JJ2_(_r-C7i3ueRO8 zpmrLq0GZQ{AkBp8Qqho<`tD%Ti^vAYUS9;yRACvs6En64=hiyx&TkWU-1wuOd%d>f0sTR4xpqC1OJDs0}~wsiO#P8go(~D zk&cND>7a>;j&YRe7}cWlG!;=q#~2YE5_2v(#)#;cL_bYOokesUGJi0I94k6Th>i{H zFv;`5pxZdq=fGr^y!=K%8_5v_hZgCs(KGpB-{U-!{1}Leznq|wpAT4z!t!Gc-ZYLQ z6||lvsvyAS#ukwqvn)4Q4ysIh9l254$=Qzr2f0IrPs+qg+B#gf+HIxE?W_!^yNae zG*Kl~5;ZJhl>SYjV&9t#ixRg-Bp&mIBZ3pLN!9a4BGD0f(iEV?_%D+u4TG!ws`6Ae z9_>ZAwO0a-s3cl1v>I0kgmda+OeqWI>d0pa0S}O;9 z^T88yTwTgVJ2+=WzSUV#t0vz?DBJR)bI@%du9Y67%1am}_2?yWW&|>RwHw z%_L%N0oq_;LZ2;ZdZlp=!XYpc)ZK#q&Z>M*74kfXd~_JLs@`~<$X2W*qA7|jUmV`_ zWbcqK#gE3L2jz=r)G6c3CuA`3uXHF~)yo!e0L1^-IN#61EkTXck{wtWSM5(Bi8vgo zhP2(a>T4zHyk*!uS1wDi9+i;F}p3y-+#qWhLM513N+sNmYyw z@)soV;pu|}u#8DRlz85uu4db zOB|ON`B7N?6B6U2($#5S*SjV$A#uD4*r>2-E|6Z?{0Mf2@{fE)A5W(LKf>7j)4+bL zhIuciKLWmp?=?QII-UY+M8>C&4b6uV_&3Pdrxle0IE%n5b~d_e3pU;0)X**PBiZ-I zdWNP3HJ?KY)nBb;C#5eObw&U@nLYr9IHL|s<2?WJ>y`%oD4)5IXwLNm--KZC7qq=r z*H>PF!|Zf~BV-ATVC0V>I@`fc^U+uf7N5nEZ;0ktdG@t&6<7#H5eJ*`O~NED`va@R z_$RG}DWR7Ld}!muNP)nl;L^D7#TDWoIX_K%9`hB{iwW_cVvg7-h_@X@Ac%iR-K zUqaat1aLS>>=;IlwQ=a$Q!CW<4vuO+9W?1j=H=9)gCGQv7k^15cF?x~Fa_CuH_Q;TS1uwQ(IT>&=&VrrNjVVcV+GVASzfU$@M#o@u+KO+?~9dvj7YS0lSBu2 z&deX;O=M1u=5YTJ_ybBP3;Pu~4~>|&5;6a$1}Y!XT5(NH$Rw4qh0~JumIz=s%s>? zv2Cn~3U75`-&tduU&yzl_0Xzu*d{6OcA*aDSvZ$^`4=iP{>*e@PPqn z!2g#x-w+6m?(2rCzJtrJ3%rl5)z6Uz=czQfG@3ocMy|mjk9zIhJAH-RXs*}MiCQHQ zXOs*~VX!^Y`#Xe4<3L0EbH01au|2=@gDn+Y{wt8E+K=zO0VKbR3oeT0!2pH-A?xa> z`7)nj6hr3QKW~2!O_ebmm5wB8mRh{R>mS(d6v$$ej(^~vO$_`4EeH3K=wAgf*C=*= z0&em7MzmUqqb)DA4Q!;%$9+i)r+i9YV;F#gGdje0_b) zAq3@*v|>F*3=^3VeT=Ia&zVY6#8SW8R;A7Sf}w zkkZi4L%|i{m#6i^G{t$}^1$C>5!Rjo;mMFzwhMD57TEaF2Q7OI!vioJ+02NNip$he z@r`JyNMx;AiBry8>HYcaPcg+{E$Dud&L@XKvlr|k6-~*)aoTZtTr^GAv$yxfvOkE| z;ZHpFoW$3dE9vi8o)^opd-U&!dOHq#t_+l~>^USH6tDZ6SiY|>_)`GK-qYL(J#l@( zdyEtcghJEvAkCra3)sDc-AmcMjNL2Qy_(%u;ZCLgZ~h7(nbo*jaCP9?f$Ire1GxT- zOZb@}q~glN^(_kH=f(RLTzBCNYZ;#O`z78V#`P4gBe;ffO~e*@BQE;2AiNsaHMr7o zorh}}Wsl(6i|bKbzs5zs4}T&E8c@@KD-+iOT=lrt$|vGaUBAj9$XLL zx*gYdaJg|+;#z>qitBP*Nx1d`))%;{QEnctY+R|hCgS=KXDQ#owGH?U(78(d7NmYP zKGR>a(_gjo()=F$;P*RD@7qSQvr+ zgg6QSMdF9QBNpb*Ei0kaZeW-0b#3q(*EO-kZj?j5^oF_`Z;dgF;s8g$+=7s9HrLj# z5rhp&ca(RJR(<6NEdI{N7sQ!a`OL zeTtgHpt$QS?Vtnltb!tU?@AQi)@DQoQ;{o+yO}Ln!NSG5z5infaJouwLXt`VN)Ff9w8Z0GpD(^(K)ZRd0k0!(;C68ah7f@ zZf$kWsi|Ao1gPqhT0j8(UoHiPg2vcX=0jUF$H6jW6AJT~kACa~unV-L;m6owa#U}CU3(!7l1Xl3c?#rS%E;u9fo7d`c2_K`rMa^|SG_0_$ zj&ns2ey-x%yoM%l;}^(R(%|v3<_n)hO3iI`)p%X7q`3+X%Um^eu*eI6_1u~k4}m6{ zxgs^ooC7@==dM7?V&A&eu2yGha~p&~_@%mjP*}n1F?E~fx?RN2*9jNbI*19HBcu}+ zj8A~hgz!43pm7Fabz3%2F z%dGS|()FJtT-W5TX{u{<)d6K!ix<*5uc49DR=6PnbUtJ9dE=m+b4j6_yrr$pFftxt zV?vp$bzMUfq(+Gnz8$~NBL|vW=Ru%+tw?lvP)sP$EcLlsHq-7$)#f%s#ZmeB zqoFUX6E0B2mboFFb%+$+rdUp-GFXQ~4;tX2H{qhVq6SY5)ShQ9X;|G_(+bILZ1f0~ z@zjep)HK5SEGO|_0C0jA*cQ1~`_`;+wJKO%TfA&>aS1wKMzQIF)9LZnIY|?p4NdjU z&N`RJ+uFR**$5!$FNJlkbsiVqvIM7#(bUN)+-h~!Hm_UP+$5CGU3T5#vW1I^GpuF~ z)g}N|gBML-C*(xloi3qJaC%&BXFX$zlTf%&0Gy`!hBct1v#AEgu+3T1x@JAAk)ZHK zDM_xT^$o4fO(gjky>Qra4j91=@FcuMB0(q+oUN`kXatm1PO0}b)sjdEMrwMKs+0yE&ZSc4RmpVnAfMY$XGM9@&d9GIGdbo`yz9oo5}@ zu%7yIgU{otGc+`zC@N`f@H97hz6>Ad;^K;QY+MpBN^sU*&3$RYsZQ>f4XZaAHld$B zQ=G@Q+Ed%w(Bd^T`*778T5FotxYC6)#W%oC8|qw*F47qyZBw(?;PJJzG`BMPaxxj3 znS*4gYj$~>t_Wu^M3olSGm@gk%z-nkgEMDX?Lye=f^G85V6dmBXPV6(p-8C`D9YuC zOil1*bAv1hb8DKY6|7a@5rkrcp+@n7#-MGP8|`jxakWAc#vlTboTG@* z9$=&WO=SDY3>y^s)XO4gASViS$T$Ef^%EeR*U-`m&!*OEXlwAgffec`gA9q2^Likh zE<=q%4wj8rEkhQBC3U%;MptVK@g9A54bU7pYQs$4GOBBNN%68$o|0iRgRX1f+%P8j;0@F_G`Z>+Ea1lrrE@Hc zWi3^R1Pz7Jm(fLMAJ83Bv1aZSxS*Gy2N)#LEEe2wYNt(d@As928GzWRDsD``Ae zaj?~()bSNzPWMb-Gs7SV^t=)?W;cKq>Nqr82z%{@8jq)84eJZZ2GzsvKtY&rc-k5^ zZEA!?0u91WkAWL4Fq7q#(&VmRd z;ZATQGePK@MneIM>Wz&X zgSpg9kYhcwPMOZuW-t1Fr`y#C<)rqLfv9t>cQuj;fQUj<$EHYKE-wo-1m)e?&>}#G zNHn3owZ2BcHq^E@dpriXkfiVE8x%dLQLsoCOm%hm7JfI?~&>vac8P3Qbo8pX}Y=fr_%$Xn&(3ZxUTIwzYr4vA>!rx6Yax=JSMB^)q3G}W7YSjQK1u(cnBxkI@lU0B> zL6I1xpP}cufrlY-)wG@qY(^%hm-#SZnsfezsT{_dBgAb9(aHlWZK!L2W6hAq#D*gC z8AO{fJW|Yhu{t(=02fltZOBTv{jv=rI>hiI)+(^%D4A3dg0nAOfa^@IUmJ}qWm-p( zRc=|hhX|W0IWtBjKvf|x7iZF)8Vp!j=M&)}WF!hSH(gwQRJM6EJhj16b!!otc$=dD zk12PNK0zTR_16mGTrPk(W;bf;T~2spPG3_?L+y>^6FHrTM_1>=#IkctUVM4|O5bsg zc#t2Y;*Hv(6-QVGw_wA@iDfWln99HqEj;dMYrx16{;fP_0GCw2h(F}(C_Li8O|3Hw zE$)UZRjl^XbR$>I)|xuZn!s3cHAMGRXQW3q zD{^dtN|}|U8bjvHBFw)v(cCwP!{cLcSNvY(IokiVga=z;|JQO>|2H;ul>cjiBB}k~ zO~460u;K)>bxe{wl8v#_mXU8mquRm^=)q{r*=(q7Y{vKpFY;KmZb`(k{WAaA@^ARh zHH3mPD^O#w6h+7^gmIAj?X%_mSN!d8ufj&u>zVB*a;QhJ@VJ>%9`(%Sc`Z(+5n&$+ z~T^|N7}{T%e2v&P1Bgw)Tu3JNK!>zBP%z;;(bPwTyOzEn$Z{ z+#8<7-A-5e?PGxCy&xMkMD^8YfvD~e>pgXhmi&T;Er2-`Q&%t9_f) zb$`Y7Z92#HQ5`DK=fJ14Lyl^PGF}W1TtGh-Cwo9+t4nwU7Pff+`mc-|zXbfbj~i*c z8*YQzgMe~}v0cwiyFAJIKXSZiQMp5w*sO33)8t%cV@YZ~Vq2&x{ z9cG}hi-Lw4=RVG~#NfonnyShpvcpt}RE|O4q>MVl?TZ?DT4sjFp0W_CX={aT+nHh6g-LWZhc+51lL5M9EZ4{JLjDf})bvosVI;R^QE+#KVkI!k7S`C)3(T~Th z6MtFwT-TBRyXR|ZZUav(t(ehJmK13XCcJWOp!K=+%okvLbemjjAe`$l>B1JGuvo*^ zY%tx@T7!8sc-1tqRNq>|rj;=RfC^|w(P-Mos^(}OxSD8piZi@CN4m%3Jo2I(U$cX8 z7?n|ui^@n7GX#U|#?j5CeKF5@O3Feq6LN<)=k{j>ehii^!3>ozBv#`Gt#$ zopYUqr3(QwHvH6YalW)!(3^2lo%Bn6P|)iU-qjR|<0;X1+RqXDOX?N$skms*hkO6% z^1HDQUxPwQWjzST!l3XB{4<~#7rm?NNqQEzQ6zpnv&JsVQ%B#&>(%)Qi!px4vkGum z;UAgDNd32>)a~f*5%jb_pMKrhW7pMvPB=uj!;vvIEMC*sb62#bYcI_4PNqcZsWek~O)i31v z9oI%+d|7L$9gpB|s8VG)+x@VhAGndrXAjDw`unF&} zxO(z=_)ffU$EBCU!+0-y4DjlBeQvz>;2K`d!~J-#rtn(cKErO{h6|h4m_BaB`v5L; z0}mgk_s4;+o!4i>dn)C3^YAu=+i`8phNtVF6!f1V z&b*R`-3Wh-^c^dBxCdbku2t1MY<>#uL0B(`w;}up!UNyr_zfdm0@*X?@Nf&>t0`>b z?H$Iu4tWM34~m8u5gwiu3CGIEstu4yT*uqcPStOCJ!pxGqPEIURq~jx4!{v`^~Au6 z&AbZfJ8(I0ZH>v>qN>Y)cY_bQgiG*7!6mvVhIJpg?}Skc$x2=7H$(O2_t1brRCioR|`_#ox4=J1YF7-bZFt^6(8 zhd4!Fdk}6%xTS>ap8>pm72)I8%Jf0liact4EkSq((iQ!U<(me+fO*!L(;wLdnuC`H znV(yYz!#ST*YV3h8~jQQ(49+w7cK$sW_o^|Kh$NwH5N$HZ$~TATX?$f&ara+e>W~0 zsL#iB4KDI^XfN#l{{E*?z&w|?Sa}LtWeUj8;n_T_Jmu8?efocw};CN6&J@$c>t7{`rS1Yg(7=_{g@CfvJTQSHQXV#jhm_6oS zm>)JDF#pj!WF9t8$e5CGafUmiGvoUiKg)P9V{gW|%%sdinQ@jSmP$*lWv%6VmTt?B zEO%LcVY$!ppyg4^)0VxK7c4JZ{$P3Aa?){Cvvty$J$>vh(Z);{ZZ zvmVPDpM7EWjBH!>g6yj7o3n4v{%Q8k?B8WSoqh2v)2t=4DrU9J`t_{mX1z4)_^gw& zKAAP$Hq$o8w%B&PZI!Lw)@s{e`>E}qtu5zAIXiM5%6TTIFXv>=UvkdRy)?HVH;~(% zdw1?bxd(G!&vn|}_7?kN_I>sj?eTfKybJS;c{B4Ic_n$v@+$LI=GEn`&1=b9pVyxE zoxE*%x8>cQ_mjN7y#Bl+c_;Ed%uC3hl>g0qWByh7=KNXtdHIF;W%*V4jrlj_cjR~F z|0MtC`S<4EpZ{R~@A4nd@6R7!Fs0!9f=dgoEJ!cND<~>hSWr>mET}8^LBWp;eo^pH z!D9t`3XT-KRWMZWaY4fDNwY7QJ#F?&v*FJO?GVA4=IhOy%(s}oYrf6=fca_j+vXAT zr5Vi`-^mDO{4V3kjK5}NW-iRE%-o#$aAr^DtC>>fNajRK5Y+#vxQhxtk<*N%z8d|oITMl+N#@aK5?B zTxqU0uQJz}-R4Gfi`i@5U~V^WHFub|nYWvlWZa+er;N#&GcxC9Zq2+cb9d&umJci+ zS@hN`th21wTI;R1Sf8>UvVLeaXEkO0HtYQ?L$)P5CwpP`vh3>YRoQjf?(D|wmTYhK zhV1t2t=S#f+p>3M@5?@%eKh+-_TRJrnVmRm@~lO(wu9Trwu^1o*p}Nowk@{r+J0b5 z%`xU2&-rtXHa9spD>pyand{2^UhaS8?#kVrn`*zpKErOcueJN^TkVhAp8=l-?QhyY zvR{ywmA5pnK5t{*2YCYH;mrK({QJPG!}+h}znL%P|7XEH1-~hHwBX{|-TjrL` z|IEBQ^S?4{EkCdfS%xhmmMPX`YnpYv^*+$!sjOq!?_|H99Y1T*tb$pqY;`ubt*rQ6%a%18Qha;XBUuNaNpEDG$eN%1akgz%{;c9z&9mBP-8btuXv3*lAJ3X-%dlnJ z3T)@){6E#4(QBJk7{()p(m^H}WH=>ChH;b;Avxc9&pGeO$vF{2Hz5}hbJ1aiQo>fD zN+*Fi=|y32$_SW?3cbj1jHsgo%teqYu?CG>z<^PLY+9im6`d69MPy?J@$IUAgx~GQ z2k-a1&+~iE)mg(1?e7QN!r$?-zN%OCO}(Yplc&ukbJ?t#Ps|rI>0f4#BAL|dM2$x3 zR_cH~V$oVVX=m-6J!dc45ACOR-Cno1?Qiz39dpMVI_oCgtebP^+*|Ggx8^=~U%M^$ ztGnxb3;TsU7C%l2emVXsx%C^`X(sV};)O(rJ;si*Gi-rfU`_TF>#{z(&HiRjdBQvG zz31KZe)fJL1)k=|Ipb4Mh8}zex8M%k1HU*R4v7=uMKMMBeMDYTE9!mKR)_FWoWZlW zg!l0wy>}YulD1b9Unbu5YSaKtujT#WeGDD=mXv!^J|m4x%ZxlJvoa_1a!Nj~o>h}X z@|V;s<>5SWd|myh{!|a+1eS>AH}EGMVL`v5&+3nKSKrr1iQMBRXr3^~j5g1iQ|62* z5vgmYVGgDa6Pr&EmCvW%PL)&3sVb%Xdg}Ys9ZJMOd)S^LT`$;G``H6k$6U~<2Wr0N zitbIf`hQsirzL6!OzEefCqV)M|hOSx#1a}c$@CCJ~N~)onYK=VCp{DPvf!a`; zM9m$wtA=W%eCWpj1~G(Tj8I3!FpeAzrZIzA%wZm<$*BdL#|0wnB008%Wvt*bR>@^G ztYZV4*upj?w}*Wk;0E=~Htygq4#|N&?biVv)FB<#5gpYr9oJl^bwlIzqHGNIjsgau6pBzs{lF{TulI--qc>V$NJ7!Y= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/midi.py b/venv/Lib/site-packages/pygame/midi.py new file mode 100644 index 0000000..1d0ab2e --- /dev/null +++ b/venv/Lib/site-packages/pygame/midi.py @@ -0,0 +1,728 @@ +"""pygame.midi +pygame module for interacting with midi input and output. + +The midi module can send output to midi devices, and get input +from midi devices. It can also list midi devices on the system. + +Including real midi devices, and virtual ones. + +It uses the portmidi library. Is portable to which ever platforms +portmidi supports (currently windows, OSX, and linux). + +This uses pyportmidi for now, but may use its own bindings at some +point in the future. The pyportmidi bindings are included with pygame. + +New in pygame 1.9.0. +""" + + +#TODO: +# - finish writing tests. +# - likely as interactive tests... so you'd need to plug in a midi device. +# - create a background thread version for input threads. +# - that can automatically inject input into the event queue +# once the input object is running. Like joysticks. + + + +import atexit +import math + +import pygame +import pygame.locals + + + +# +MIDIIN = pygame.locals.USEREVENT + 10 +MIDIOUT = pygame.locals.USEREVENT + 11 + +_init = False +_pypm = None + + +__all__ = [ + "Input", + "MIDIIN", + "MIDIOUT", + "MidiException", + "Output", + "get_count", + "get_default_input_id", + "get_default_output_id", + "get_device_info", + "init", + "midis2events", + "quit", + "get_init", + "time", + "frequency_to_midi", + "midi_to_frequency", + "midi_to_ansi_note", +] + +__theclasses__ = ["Input", "Output"] + + +def init(): + """initialize the midi module + pygame.midi.init(): return None + + Call the initialisation function before using the midi module. + + It is safe to call this more than once. + """ + global _init, _pypm + if not _init: + import pygame.pypm + _pypm = pygame.pypm + + _pypm.Initialize() + _init = True + atexit.register(quit) + + +def quit(): + """uninitialize the midi module + pygame.midi.quit(): return None + + + Called automatically atexit if you don't call it. + + It is safe to call this function more than once. + """ + global _init, _pypm + if _init: + # TODO: find all Input and Output classes and close them first? + _pypm.Terminate() + _init = False + del _pypm + #del pygame._pypm + + +def get_init(): + """returns True if the midi module is currently initialized + pygame.midi.get_init(): return bool + + Returns True if the pygame.midi module is currently initialized. + + New in pygame 1.9.5. + """ + return _init + + +def _check_init(): + if not _init: + raise RuntimeError("pygame.midi not initialised.") + +def get_count(): + """gets the number of devices. + pygame.midi.get_count(): return num_devices + + + Device ids range from 0 to get_count() -1 + """ + _check_init() + return _pypm.CountDevices() + + + + +def get_default_input_id(): + """gets default input device number + pygame.midi.get_default_input_id(): return default_id + + + Return the default device ID or -1 if there are no devices. + The result can be passed to the Input()/Ouput() class. + + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. + + set PM_RECOMMENDED_INPUT_DEVICE=1 + + The user should first determine the available device ID by using + the supplied application "testin" or "testout". + + In general, the registry is a better place for this kind of info, + and with USB devices that can come and go, using integers is not + very reliable for device identification. Under Windows, if + PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is + *NOT* found in the environment, then the default device is obtained + by looking for a string in the registry under: + HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device + and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device + for a string. The number of the first device with a substring that + matches the string exactly is returned. For example, if the string + in the registry is "USB", and device 1 is named + "In USB MidiSport 1x1", then that will be the default + input because it contains the string "USB". + + In addition to the name, get_device_info() returns "interf", which + is the interface name. (The "interface" is the underlying software + system or API used by PortMidi to access devices. Examples are + MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) + At present, the only Win32 interface is "MMSystem", the only Linux + interface is "ALSA", and the only Max OS X interface is "CoreMIDI". + To specify both the interface and the device name in the registry, + separate the two with a comma and a space, e.g.: + MMSystem, In USB MidiSport 1x1 + In this case, the string before the comma must be a substring of + the "interf" string, and the string after the space must be a + substring of the "name" name string in order to match the device. + + Note: in the current release, the default is simply the first device + (the input or output device with the lowest PmDeviceID). + """ + return _pypm.GetDefaultInputDeviceID() + + + + +def get_default_output_id(): + """gets default output device number + pygame.midi.get_default_output_id(): return default_id + + + Return the default device ID or -1 if there are no devices. + The result can be passed to the Input()/Ouput() class. + + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. + + set PM_RECOMMENDED_OUTPUT_DEVICE=1 + + The user should first determine the available device ID by using + the supplied application "testin" or "testout". + + In general, the registry is a better place for this kind of info, + and with USB devices that can come and go, using integers is not + very reliable for device identification. Under Windows, if + PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is + *NOT* found in the environment, then the default device is obtained + by looking for a string in the registry under: + HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device + and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device + for a string. The number of the first device with a substring that + matches the string exactly is returned. For example, if the string + in the registry is "USB", and device 1 is named + "In USB MidiSport 1x1", then that will be the default + input because it contains the string "USB". + + In addition to the name, get_device_info() returns "interf", which + is the interface name. (The "interface" is the underlying software + system or API used by PortMidi to access devices. Examples are + MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) + At present, the only Win32 interface is "MMSystem", the only Linux + interface is "ALSA", and the only Max OS X interface is "CoreMIDI". + To specify both the interface and the device name in the registry, + separate the two with a comma and a space, e.g.: + MMSystem, In USB MidiSport 1x1 + In this case, the string before the comma must be a substring of + the "interf" string, and the string after the space must be a + substring of the "name" name string in order to match the device. + + Note: in the current release, the default is simply the first device + (the input or output device with the lowest PmDeviceID). + """ + _check_init() + return _pypm.GetDefaultOutputDeviceID() + + +def get_device_info(an_id): + """ returns information about a midi device + pygame.midi.get_device_info(an_id): return (interf, name, input, output, opened) + + interf - a text string describing the device interface, eg 'ALSA'. + name - a text string for the name of the device, eg 'Midi Through Port-0' + input - 0, or 1 if the device is an input device. + output - 0, or 1 if the device is an output device. + opened - 0, or 1 if the device is opened. + + If the id is out of range, the function returns None. + """ + _check_init() + return _pypm.GetDeviceInfo(an_id) + + +class Input(object): + """Input is used to get midi input from midi devices. + Input(device_id) + Input(device_id, buffer_size) + + buffer_size - the number of input events to be buffered waiting to + be read using Input.read() + """ + + def __init__(self, device_id, buffer_size=4096): + """ + The buffer_size specifies the number of input events to be buffered + waiting to be read using Input.read(). + """ + _check_init() + + if device_id == -1: + raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.") + + try: + r = get_device_info(device_id) + except TypeError: + raise TypeError("an integer is required") + except OverflowError: + raise OverflowError("long int too large to convert to int") + + # and now some nasty looking error checking, to provide nice error + # messages to the kind, lovely, midi using people of whereever. + if r: + interf, name, input, output, opened = r + if input: + try: + self._input = _pypm.Input(device_id, buffer_size) + except TypeError: + raise TypeError("an integer is required") + self.device_id = device_id + + elif output: + raise MidiException("Device id given is not a valid input id, it is an output id.") + else: + raise MidiException("Device id given is not a valid input id.") + else: + raise MidiException("Device id invalid, out of range.") + + + + + def _check_open(self): + if self._input is None: + raise MidiException("midi not open.") + + + + def close(self): + """ closes a midi stream, flushing any pending buffers. + Input.close(): return None + + PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows. + """ + _check_init() + if not (self._input is None): + self._input.Close() + self._input = None + + + + def read(self, num_events): + """reads num_events midi events from the buffer. + Input.read(num_events): return midi_event_list + + Reads from the Input buffer and gives back midi events. + [[[status,data1,data2,data3],timestamp], + [[status,data1,data2,data3],timestamp],...] + """ + _check_init() + self._check_open() + return self._input.Read(num_events) + + + def poll(self): + """returns true if there's data, or false if not. + Input.poll(): return Bool + + raises a MidiException on error. + """ + _check_init() + self._check_open() + + r = self._input.Poll() + if r == _pypm.TRUE: + return True + elif r == _pypm.FALSE: + return False + else: + err_text = GetErrorText(r) + raise MidiException( (r, err_text) ) + + + + +class Output(object): + """Output is used to send midi to an output device + Output(device_id) + Output(device_id, latency = 0) + Output(device_id, buffer_size = 4096) + Output(device_id, latency, buffer_size) + + The buffer_size specifies the number of output events to be + buffered waiting for output. (In some cases -- see below -- + PortMidi does not buffer output at all and merely passes data + to a lower-level API, in which case buffersize is ignored.) + + latency is the delay in milliseconds applied to timestamps to determine + when the output should actually occur. (If latency is < 0, 0 is + assumed.) + + If latency is zero, timestamps are ignored and all output is delivered + immediately. If latency is greater than zero, output is delayed until + the message timestamp plus the latency. (NOTE: time is measured + relative to the time source indicated by time_proc. Timestamps are + absolute, not relative delays or offsets.) In some cases, PortMidi + can obtain better timing than your application by passing timestamps + along to the device driver or hardware. Latency may also help you + to synchronize midi data to audio data by matching midi latency to + the audio buffer latency. + + """ + + def __init__(self, device_id, latency = 0, buffer_size = 4096): + """Output(device_id) + Output(device_id, latency = 0) + Output(device_id, buffer_size = 4096) + Output(device_id, latency, buffer_size) + + The buffer_size specifies the number of output events to be + buffered waiting for output. (In some cases -- see below -- + PortMidi does not buffer output at all and merely passes data + to a lower-level API, in which case buffersize is ignored.) + + latency is the delay in milliseconds applied to timestamps to determine + when the output should actually occur. (If latency is < 0, 0 is + assumed.) + + If latency is zero, timestamps are ignored and all output is delivered + immediately. If latency is greater than zero, output is delayed until + the message timestamp plus the latency. (NOTE: time is measured + relative to the time source indicated by time_proc. Timestamps are + absolute, not relative delays or offsets.) In some cases, PortMidi + can obtain better timing than your application by passing timestamps + along to the device driver or hardware. Latency may also help you + to synchronize midi data to audio data by matching midi latency to + the audio buffer latency. + """ + + _check_init() + self._aborted = 0 + + if device_id == -1: + raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.") + + try: + r = get_device_info(device_id) + except TypeError: + raise TypeError("an integer is required") + except OverflowError: + raise OverflowError("long int too large to convert to int") + + # and now some nasty looking error checking, to provide nice error + # messages to the kind, lovely, midi using people of whereever. + if r: + interf, name, input, output, opened = r + if output: + try: + self._output = _pypm.Output(device_id, latency) + except TypeError: + raise TypeError("an integer is required") + self.device_id = device_id + + elif input: + raise MidiException("Device id given is not a valid output id, it is an input id.") + else: + raise MidiException("Device id given is not a valid output id.") + else: + raise MidiException("Device id invalid, out of range.") + + def _check_open(self): + if self._output is None: + raise MidiException("midi not open.") + + if self._aborted: + raise MidiException("midi aborted.") + + + def close(self): + """ closes a midi stream, flushing any pending buffers. + Output.close(): return None + + PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows. + """ + _check_init() + if not (self._output is None): + self._output.Close() + self._output = None + + def abort(self): + """terminates outgoing messages immediately + Output.abort(): return None + + The caller should immediately close the output port; + this call may result in transmission of a partial midi message. + There is no abort for Midi input because the user can simply + ignore messages in the buffer and close an input device at + any time. + """ + + _check_init() + if self._output: + self._output.Abort() + self._aborted = 1 + + + + + + def write(self, data): + """writes a list of midi data to the Output + Output.write(data) + + writes series of MIDI information in the form of a list: + write([[[status <,data1><,data2><,data3>],timestamp], + [[status <,data1><,data2><,data3>],timestamp],...]) + fields are optional + example: choose program change 1 at time 20000 and + send note 65 with velocity 100 500 ms later. + write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) + notes: + 1. timestamps will be ignored if latency = 0. + 2. To get a note to play immediately, send MIDI info with + timestamp read from function Time. + 3. understanding optional data fields: + write([[[0xc0,0,0],20000]]) is equivalent to + write([[[0xc0],20000]]) + + Can send up to 1024 elements in your data list, otherwise an + IndexError exception is raised. + """ + _check_init() + self._check_open() + + self._output.Write(data) + + def write_short(self, status, data1=0, data2=0): + """write_short(status <, data1><, data2>) + Output.write_short(status) + Output.write_short(status, data1 = 0, data2 = 0) + + output MIDI information of 3 bytes or less. + data fields are optional + status byte could be: + 0xc0 = program change + 0x90 = note on + etc. + data bytes are optional and assumed 0 if omitted + example: note 65 on with velocity 100 + write_short(0x90,65,100) + """ + _check_init() + self._check_open() + self._output.WriteShort(status, data1, data2) + + def write_sys_ex(self, when, msg): + """writes a timestamped system-exclusive midi message. + Output.write_sys_ex(when, msg) + + msg - can be a *list* or a *string* + when - a timestamp in miliseconds + example: + (assuming o is an onput MIDI stream) + o.write_sys_ex(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7') + is equivalent to + o.write_sys_ex(pygame.midi.time(), + [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7]) + """ + _check_init() + self._check_open() + self._output.WriteSysEx(when, msg) + + def note_on(self, note, velocity, channel=0): + """turns a midi note on. Note must be off. + Output.note_on(note, velocity, channel=0) + + note is an integer from 0 to 127 + velocity is an integer from 0 to 127 + channel is an integer from 0 to 15 + + Turn a note on in the output stream. The note must already + be off for this to work correctly. + """ + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + self.write_short(0x90 + channel, note, velocity) + + def note_off(self, note, velocity=0, channel=0): + """turns a midi note off. Note must be on. + Output.note_off(note, velocity=0, channel=0) + + note is an integer from 0 to 127 + velocity is an integer from 0 to 127 (release velocity) + channel is an integer from 0 to 15 + + Turn a note off in the output stream. The note must already + be on for this to work correctly. + """ + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + self.write_short(0x80 + channel, note, velocity) + + + def set_instrument(self, instrument_id, channel=0): + """select an instrument for a channel, with a value between 0 and 127 + Output.set_instrument(instrument_id, channel=0) + + Also called "patch change" or "program change". + """ + if not (0 <= instrument_id <= 127): + raise ValueError("Undefined instrument id: %d" % instrument_id) + + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + self.write_short(0xc0 + channel, instrument_id) + + def pitch_bend(self, value=0, channel=0): + """modify the pitch of a channel. + Output.pitch_bend(value=0, channel=0) + + Adjust the pitch of a channel. The value is a signed integer + from -8192 to +8191. For example, 0 means "no change", +4096 is + typically a semitone higher, and -8192 is 1 whole tone lower (though + the musical range corresponding to the pitch bend range can also be + changed in some synthesizers). + + If no value is given, the pitch bend is returned to "no change". + """ + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + if not (-8192 <= value <= 8191): + raise ValueError("Pitch bend value must be between " + "-8192 and +8191, not %d." % value) + + # "The 14 bit value of the pitch bend is defined so that a value of + # 0x2000 is the center corresponding to the normal pitch of the note + # (no pitch change)." so value=0 should send 0x2000 + value = value + 0x2000 + LSB = value & 0x7f # keep least 7 bits + MSB = value >> 7 + self.write_short(0xe0 + channel, LSB, MSB) + + + +""" +MIDI commands + + 0x80 Note Off (note_off) + 0x90 Note On (note_on) + 0xA0 Aftertouch + 0xB0 Continuous controller + 0xC0 Patch change (set_instrument?) + 0xD0 Channel Pressure + 0xE0 Pitch bend + 0xF0 (non-musical commands) +""" + + + +def time(): + """returns the current time in ms of the PortMidi timer + pygame.midi.time(): return time + + The time is reset to 0, when the module is inited. + """ + return _pypm.Time() + + + +def midis2events(midis, device_id): + """converts midi events to pygame events + pygame.midi.midis2events(midis, device_id): return [Event, ...] + + Takes a sequence of midi events and returns list of pygame events. + """ + evs = [] + for midi in midis: + + ((status,data1,data2,data3),timestamp) = midi + + e = pygame.event.Event(MIDIIN, + status=status, + data1=data1, + data2=data2, + data3=data3, + timestamp=timestamp, + vice_id = device_id) + evs.append( e ) + + + return evs + + + + + +class MidiException(Exception): + """exception that pygame.midi functions and classes can raise + MidiException(errno) + """ + def __init__(self, value): + self.parameter = value + def __str__(self): + return repr(self.parameter) + + + +def frequency_to_midi(freqency): + """ converts a frequency into a MIDI note. + + Rounds to the closest midi note. + + ::Examples:: + + >>> frequency_to_midi(27.5) + 21 + >>> frequency_to_midi(36.7) + 26 + >>> frequency_to_midi(4186.0) + 108 + """ + return int( + round( + 69 + ( + 12 * math.log(freqency / 440.0) + ) / math.log(2) + ) + ) + +def midi_to_frequency(midi_note): + """ Converts a midi note to a frequency. + + ::Examples:: + + >>> midi_to_frequency(21) + 27.5 + >>> midi_to_frequency(26) + 36.7 + >>> midi_to_frequency(108) + 4186.0 + """ + return round(440.0 * 2 ** ((midi_note - 69) * (1./12.)), 1) + +def midi_to_ansi_note(midi_note): + """ returns the Ansi Note name for a midi number. + + ::Examples:: + + >>> midi_to_ansi_note(21) + 'A0' + >>> midi_to_ansi_note(102) + 'F#7' + >>> midi_to_ansi_note(108) + 'C8' + """ + notes = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'] + num_notes = 12 + note_name = notes[int(((midi_note - 21) % num_notes))] + note_number = int(round(((midi_note - 21) / 11.0))) + return '%s%s' % (note_name, note_number) diff --git a/venv/Lib/site-packages/pygame/mixer.cp37-win32.pyd b/venv/Lib/site-packages/pygame/mixer.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..19d79996fda5ac7c12b124d1ca65adbedbf3717c GIT binary patch literal 29696 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 L3L(V*W}p8D6!7^8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/mixer_music.cp37-win32.pyd b/venv/Lib/site-packages/pygame/mixer_music.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..b48593fc769bce14a06c0ea70f7e3fb60d82090e GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/mouse.cp37-win32.pyd b/venv/Lib/site-packages/pygame/mouse.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..febe0e0525f875e1ab1935a246cb72a14cc9d0b2 GIT binary patch literal 12800 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 CXr2K8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/newbuffer.cp37-win32.pyd b/venv/Lib/site-packages/pygame/newbuffer.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..07c320ae2f398ad8beaf2e296106ebda58dd7b06 GIT binary patch literal 17408 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

      CSq^Xyu!WW@EeFjO(sBV!sSTW^)Q)IM?Z!{W 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/pygame.ico b/venv/Lib/site-packages/pygame/pygame.ico new file mode 100644 index 0000000000000000000000000000000000000000..06f699e096bffbd4c09e4fc9c7af498c97d56a49 GIT binary patch literal 145516 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 ToQMc9iAO07f{vlS_CNgxsX4?^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/pygame_icon.icns b/venv/Lib/site-packages/pygame/pygame_icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..2610a8d7dcdd48e07954c4eb6c165fa15c1af2d9 GIT binary patch literal 53627 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/pygame_icon.svg b/venv/Lib/site-packages/pygame/pygame_icon.svg new file mode 100644 index 0000000..bbee79d --- /dev/null +++ b/venv/Lib/site-packages/pygame/pygame_icon.svg @@ -0,0 +1,259 @@ + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/venv/Lib/site-packages/pygame/pygame_icon.tiff b/venv/Lib/site-packages/pygame/pygame_icon.tiff new file mode 100644 index 0000000000000000000000000000000000000000..e7791433dc8ad319af932b29cc01abffd37d60ba GIT binary patch literal 61604 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/pypm.cp37-win32.pyd b/venv/Lib/site-packages/pygame/pypm.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..2218b34386a2bf4e2e643157f96a1fa94b702985 GIT binary patch literal 70144 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/rect.cp37-win32.pyd b/venv/Lib/site-packages/pygame/rect.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..cc3c6f53c5d4c5373d0a84ae7fd868768eef8c04 GIT binary patch literal 27648 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/rwobject.cp37-win32.pyd b/venv/Lib/site-packages/pygame/rwobject.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..f6c848e287df30da95e703789a7d3d086dff537e GIT binary patch literal 14848 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 Rk2pJkI0M07pZ`+}{5NE~K2QJv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/scrap.cp37-win32.pyd b/venv/Lib/site-packages/pygame/scrap.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..2f62adb58dda4641b352ec59227af2379e30c258 GIT binary patch literal 15872 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" % (self.__class__.__name__, len(self.__g)) + + +class DirtySprite(Sprite): + """a more featureful subclass of Sprite with more attributes + + pygame.sprite.DirtySprite(*groups): return DirtySprite + + Extra DirtySprite attributes with their default values: + + dirty = 1 + If set to 1, it is repainted and then set to 0 again. + If set to 2, it is always dirty (repainted each frame; + flag is not reset). + If set to 0, it is not dirty and therefore not repainted again. + + blendmode = 0 + It's the special_flags argument of Surface.blit; see the blendmodes in + the Surface.blit documentation + + source_rect = None + This is the source rect to use. Remember that it is relative to the top + left corner (0, 0) of self.image. + + visible = 1 + Normally this is 1. If set to 0, it will not be repainted. (If you + change visible to 1, you must set dirty to 1 for it to be erased from + the screen.) + + _layer = 0 + 0 is the default value but this is able to be set differently + when subclassing. + + """ + + def __init__(self, *groups): + + self.dirty = 1 + self.blendmode = 0 # pygame 1.8, referred to as special_flags in + # the documentation of Surface.blit + self._visible = 1 + self._layer = getattr(self, '_layer', 0) # Default 0 unless + # initialized differently. + self.source_rect = None + Sprite.__init__(self, *groups) + + def _set_visible(self, val): + """set the visible value (0 or 1) and makes the sprite dirty""" + self._visible = val + if self.dirty < 2: + self.dirty = 1 + + def _get_visible(self): + """return the visible value of that sprite""" + return self._visible + + visible = property(lambda self: self._get_visible(), + lambda self, value: self._set_visible(value), + doc="you can make this sprite disappear without " + "removing it from the group,\n" + "assign 0 for invisible and 1 for visible") + + def __repr__(self): + return "<%s DirtySprite(in %d groups)>" % \ + (self.__class__.__name__, len(self.groups())) + + +class AbstractGroup(object): + """base class for containers of sprites + + AbstractGroup does everything needed to behave as a normal group. You can + easily subclass a new group class from this or the other groups below if + you want to add more features. + + Any AbstractGroup-derived sprite groups act like sequences and support + iteration, len, and so on. + + """ + + # dummy val to identify sprite groups, and avoid infinite recursion + _spritegroup = True + + def __init__(self): + self.spritedict = {} + self.lostsprites = [] + + def sprites(self): + """get a list of sprites in the group + + Group.sprite(): return list + + Returns an object that can be looped over with a 'for' loop. (For now, + it is always a list, but this could change in a future version of + pygame.) Alternatively, you can get the same information by iterating + directly over the sprite group, e.g. 'for sprite in group'. + + """ + return list(self.spritedict) + + def add_internal(self, sprite): + self.spritedict[sprite] = 0 + + def remove_internal(self, sprite): + r = self.spritedict[sprite] + if r: + self.lostsprites.append(r) + del self.spritedict[sprite] + + def has_internal(self, sprite): + return sprite in self.spritedict + + def copy(self): + """copy a group with all the same sprites + + Group.copy(): return Group + + Returns a copy of the group that is an instance of the same class + and has the same sprites in it. + + """ + return self.__class__(self.sprites()) + + def __iter__(self): + return iter(self.sprites()) + + def __contains__(self, sprite): + return self.has(sprite) + + def add(self, *sprites): + """add sprite(s) to group + + Group.add(sprite, list, group, ...): return None + + Adds a sprite or sequence of sprites to a group. + + """ + for sprite in sprites: + # It's possible that some sprite is also an iterator. + # If this is the case, we should add the sprite itself, + # and not the iterator object. + if isinstance(sprite, Sprite): + if not self.has_internal(sprite): + self.add_internal(sprite) + sprite.add_internal(self) + else: + try: + # See if sprite is an iterator, like a list or sprite + # group. + self.add(*sprite) + except (TypeError, AttributeError): + # Not iterable. This is probably a sprite that is not an + # instance of the Sprite class or is not an instance of a + # subclass of the Sprite class. Alternately, it could be an + # old-style sprite group. + if hasattr(sprite, '_spritegroup'): + for spr in sprite.sprites(): + if not self.has_internal(spr): + self.add_internal(spr) + spr.add_internal(self) + elif not self.has_internal(sprite): + self.add_internal(sprite) + sprite.add_internal(self) + + def remove(self, *sprites): + """remove sprite(s) from group + + Group.remove(sprite, list, or group, ...): return None + + Removes a sprite or sequence of sprites from a group. + + """ + # This function behaves essentially the same as Group.add. It first + # tries to handle each argument as an instance of the Sprite class. If + # that failes, then it tries to handle the argument as an iterable + # object. If that failes, then it tries to handle the argument as an + # old-style sprite group. Lastly, if that fails, it assumes that the + # normal Sprite methods should be used. + for sprite in sprites: + if isinstance(sprite, Sprite): + if self.has_internal(sprite): + self.remove_internal(sprite) + sprite.remove_internal(self) + else: + try: + self.remove(*sprite) + except (TypeError, AttributeError): + if hasattr(sprite, '_spritegroup'): + for spr in sprite.sprites(): + if self.has_internal(spr): + self.remove_internal(spr) + spr.remove_internal(self) + elif self.has_internal(sprite): + self.remove_internal(sprite) + sprite.remove_internal(self) + + def has(self, *sprites): + """ask if group has a sprite or sprites + + Group.has(sprite or group, ...): return bool + + Returns True if the given sprite or sprites are contained in the + group. Alternatively, you can get the same information using the + 'in' operator, e.g. 'sprite in group', 'subgroup in group'. + + """ + return_value = False + + for sprite in sprites: + if isinstance(sprite, Sprite): + # Check for Sprite instance's membership in this group + if self.has_internal(sprite): + return_value = True + else: + return False + else: + try: + if self.has(*sprite): + return_value = True + else: + return False + except (TypeError, AttributeError): + if hasattr(sprite, '_spritegroup'): + for spr in sprite.sprites(): + if self.has_internal(spr): + return_value = True + else: + return False + else: + if self.has_internal(sprite): + return_value = True + else: + return False + + return return_value + + def update(self, *args): + """call the update method of every member sprite + + Group.update(*args): return None + + Calls the update method of every member sprite. All arguments that + were passed to this method are passed to the Sprite update function. + + """ + for s in self.sprites(): + s.update(*args) + + def draw(self, surface): + """draw all sprites onto the surface + + Group.draw(surface): return None + + Draws all of the member sprites onto the given surface. + + """ + sprites = self.sprites() + surface_blit = surface.blit + for spr in sprites: + self.spritedict[spr] = surface_blit(spr.image, spr.rect) + self.lostsprites = [] + + def clear(self, surface, bgd): + """erase the previous position of all sprites + + Group.clear(surface, bgd): return None + + Clears the area under every drawn sprite in the group. The bgd + argument should be Surface which is the same dimensions as the + screen surface. The bgd could also be a function which accepts + the given surface and the area to be cleared as arguments. + + """ + if callable(bgd): + for r in self.lostsprites: + bgd(surface, r) + for r in self.spritedict.values(): + if r: + bgd(surface, r) + else: + surface_blit = surface.blit + for r in self.lostsprites: + surface_blit(bgd, r, r) + for r in self.spritedict.values(): + if r: + surface_blit(bgd, r, r) + + def empty(self): + """remove all sprites + + Group.empty(): return None + + Removes all the sprites from the group. + + """ + for s in self.sprites(): + self.remove_internal(s) + s.remove_internal(self) + + def __nonzero__(self): + return truth(self.sprites()) + + def __len__(self): + """return number of sprites in group + + Group.len(group): return int + + Returns the number of sprites contained in the group. + + """ + return len(self.sprites()) + + def __repr__(self): + return "<%s(%d sprites)>" % (self.__class__.__name__, len(self)) + +class Group(AbstractGroup): + """container class for many Sprites + + pygame.sprite.Group(*sprites): return Group + + A simple container for Sprite objects. This class can be subclassed to + create containers with more specific behaviors. The constructor takes any + number of Sprite arguments to add to the Group. The group supports the + following standard Python operations: + + in test if a Sprite is contained + len the number of Sprites contained + bool test if any Sprites are contained + iter iterate through all the Sprites + + The Sprites in the Group are not ordered, so the Sprites are drawn and + iterated over in no particular order. + + """ + def __init__(self, *sprites): + AbstractGroup.__init__(self) + self.add(*sprites) + +RenderPlain = Group +RenderClear = Group + +class RenderUpdates(Group): + """Group class that tracks dirty updates + + pygame.sprite.RenderUpdates(*sprites): return RenderUpdates + + This class is derived from pygame.sprite.Group(). It has an enhanced draw + method that tracks the changed areas of the screen. + + """ + def draw(self, surface): + spritedict = self.spritedict + surface_blit = surface.blit + dirty = self.lostsprites + self.lostsprites = [] + dirty_append = dirty.append + for s in self.sprites(): + r = spritedict[s] + newrect = surface_blit(s.image, s.rect) + if r: + if newrect.colliderect(r): + dirty_append(newrect.union(r)) + else: + dirty_append(newrect) + dirty_append(r) + else: + dirty_append(newrect) + spritedict[s] = newrect + return dirty + +class OrderedUpdates(RenderUpdates): + """RenderUpdates class that draws Sprites in order of addition + + pygame.sprite.OrderedUpdates(*spites): return OrderedUpdates + + This class derives from pygame.sprite.RenderUpdates(). It maintains + the order in which the Sprites were added to the Group for rendering. + This makes adding and removing Sprites from the Group a little + slower than regular Groups. + + """ + def __init__(self, *sprites): + self._spritelist = [] + RenderUpdates.__init__(self, *sprites) + + def sprites(self): + return list(self._spritelist) + + def add_internal(self, sprite): + RenderUpdates.add_internal(self, sprite) + self._spritelist.append(sprite) + + def remove_internal(self, sprite): + RenderUpdates.remove_internal(self, sprite) + self._spritelist.remove(sprite) + + +class LayeredUpdates(AbstractGroup): + """LayeredUpdates Group handles layers, which are drawn like OrderedUpdates + + pygame.sprite.LayeredUpdates(*spites, **kwargs): return LayeredUpdates + + This group is fully compatible with pygame.sprite.Sprite. + New in pygame 1.8.0 + + """ + + _init_rect = Rect(0, 0, 0, 0) + + def __init__(self, *sprites, **kwargs): + """initialize an instance of LayeredUpdates with the given attributes + + You can set the default layer through kwargs using 'default_layer' + and an integer for the layer. The default layer is 0. + + If the sprite you add has an attribute _layer, then that layer will be + used. If **kwarg contains 'layer', then the passed sprites will be + added to that layer (overriding the sprite._layer attribute). If + neither the sprite nor **kwarg has a 'layer', then the default layer is + used to add the sprites. + + """ + self._spritelayers = {} + self._spritelist = [] + AbstractGroup.__init__(self) + self._default_layer = kwargs.get('default_layer', 0) + + self.add(*sprites, **kwargs) + + def add_internal(self, sprite, layer=None): + """Do not use this method directly. + + It is used by the group to add a sprite internally. + + """ + self.spritedict[sprite] = self._init_rect + + if layer is None: + try: + layer = sprite._layer + except AttributeError: + layer = sprite._layer = self._default_layer + elif hasattr(sprite, '_layer'): + sprite._layer = layer + + sprites = self._spritelist # speedup + sprites_layers = self._spritelayers + sprites_layers[sprite] = layer + + # add the sprite at the right position + # bisect algorithmus + leng = len(sprites) + low = mid = 0 + high = leng - 1 + while low <= high: + mid = low + (high - low) // 2 + if sprites_layers[sprites[mid]] <= layer: + low = mid + 1 + else: + high = mid - 1 + # linear search to find final position + while mid < leng and sprites_layers[sprites[mid]] <= layer: + mid += 1 + sprites.insert(mid, sprite) + + def add(self, *sprites, **kwargs): + """add a sprite or sequence of sprites to a group + + LayeredUpdates.add(*sprites, **kwargs): return None + + If the sprite you add has an attribute _layer, then that layer will be + used. If **kwarg contains 'layer', then the passed sprites will be + added to that layer (overriding the sprite._layer attribute). If + neither the sprite nor **kwarg has a 'layer', then the default layer is + used to add the sprites. + + """ + + if not sprites: + return + if 'layer' in kwargs: + layer = kwargs['layer'] + else: + layer = None + for sprite in sprites: + # It's possible that some sprite is also an iterator. + # If this is the case, we should add the sprite itself, + # and not the iterator object. + if isinstance(sprite, Sprite): + if not self.has_internal(sprite): + self.add_internal(sprite, layer) + sprite.add_internal(self) + else: + try: + # See if sprite is an iterator, like a list or sprite + # group. + self.add(*sprite, **kwargs) + except (TypeError, AttributeError): + # Not iterable. This is probably a sprite that is not an + # instance of the Sprite class or is not an instance of a + # subclass of the Sprite class. Alternately, it could be an + # old-style sprite group. + if hasattr(sprite, '_spritegroup'): + for spr in sprite.sprites(): + if not self.has_internal(spr): + self.add_internal(spr, layer) + spr.add_internal(self) + elif not self.has_internal(sprite): + self.add_internal(sprite, layer) + sprite.add_internal(self) + + def remove_internal(self, sprite): + """Do not use this method directly. + + The group uses it to add a sprite. + + """ + self._spritelist.remove(sprite) + # these dirty rects are suboptimal for one frame + r = self.spritedict[sprite] + if r is not self._init_rect: + self.lostsprites.append(r) # dirty rect + if hasattr(sprite, 'rect'): + self.lostsprites.append(sprite.rect) # dirty rect + + del self.spritedict[sprite] + del self._spritelayers[sprite] + + def sprites(self): + """return a ordered list of sprites (first back, last top). + + LayeredUpdates.sprites(): return sprites + + """ + return list(self._spritelist) + + def draw(self, surface): + """draw all sprites in the right order onto the passed surface + + LayeredUpdates.draw(surface): return Rect_list + + """ + spritedict = self.spritedict + surface_blit = surface.blit + dirty = self.lostsprites + self.lostsprites = [] + dirty_append = dirty.append + init_rect = self._init_rect + for spr in self.sprites(): + rec = spritedict[spr] + newrect = surface_blit(spr.image, spr.rect) + if rec is init_rect: + dirty_append(newrect) + else: + if newrect.colliderect(rec): + dirty_append(newrect.union(rec)) + else: + dirty_append(newrect) + dirty_append(rec) + spritedict[spr] = newrect + return dirty + + def get_sprites_at(self, pos): + """return a list with all sprites at that position + + LayeredUpdates.get_sprites_at(pos): return colliding_sprites + + Bottom sprites are listed first; the top ones are listed last. + + """ + _sprites = self._spritelist + rect = Rect(pos, (0, 0)) + colliding_idx = rect.collidelistall(_sprites) + colliding = [_sprites[i] for i in colliding_idx] + return colliding + + def get_sprite(self, idx): + """return the sprite at the index idx from the groups sprites + + LayeredUpdates.get_sprite(idx): return sprite + + Raises IndexOutOfBounds if the idx is not within range. + + """ + return self._spritelist[idx] + + def remove_sprites_of_layer(self, layer_nr): + """remove all sprites from a layer and return them as a list + + LayeredUpdates.remove_sprites_of_layer(layer_nr): return sprites + + """ + sprites = self.get_sprites_from_layer(layer_nr) + self.remove(*sprites) + return sprites + + #---# layer methods + def layers(self): + """return a list of unique defined layers defined. + + LayeredUpdates.layers(): return layers + + """ + return sorted(set(self._spritelayers.values())) + + def change_layer(self, sprite, new_layer): + """change the layer of the sprite + + LayeredUpdates.change_layer(sprite, new_layer): return None + + The sprite must have been added to the renderer already. This is not + checked. + + """ + sprites = self._spritelist # speedup + sprites_layers = self._spritelayers # speedup + + sprites.remove(sprite) + sprites_layers.pop(sprite) + + # add the sprite at the right position + # bisect algorithmus + leng = len(sprites) + low = mid = 0 + high = leng - 1 + while low <= high: + mid = low + (high - low) // 2 + if sprites_layers[sprites[mid]] <= new_layer: + low = mid + 1 + else: + high = mid - 1 + # linear search to find final position + while mid < leng and sprites_layers[sprites[mid]] <= new_layer: + mid += 1 + sprites.insert(mid, sprite) + if hasattr(sprite, 'layer'): + sprite.layer = new_layer + + # add layer info + sprites_layers[sprite] = new_layer + + def get_layer_of_sprite(self, sprite): + """return the layer that sprite is currently in + + If the sprite is not found, then it will return the default layer. + + """ + return self._spritelayers.get(sprite, self._default_layer) + + def get_top_layer(self): + """return the top layer + + LayeredUpdates.get_top_layer(): return layer + + """ + return self._spritelayers[self._spritelist[-1]] + + def get_bottom_layer(self): + """return the bottom layer + + LayeredUpdates.get_bottom_layer(): return layer + + """ + return self._spritelayers[self._spritelist[0]] + + def move_to_front(self, sprite): + """bring the sprite to front layer + + LayeredUpdates.move_to_front(sprite): return None + + Brings the sprite to front by changing the sprite layer to the top-most + layer. The sprite is added at the end of the list of sprites in that + top-most layer. + + """ + self.change_layer(sprite, self.get_top_layer()) + + def move_to_back(self, sprite): + """move the sprite to the bottom layer + + LayeredUpdates.move_to_back(sprite): return None + + Moves the sprite to the bottom layer by moving it to a new layer below + the current bottom layer. + + """ + self.change_layer(sprite, self.get_bottom_layer() - 1) + + def get_top_sprite(self): + """return the topmost sprite + + LayeredUpdates.get_top_sprite(): return Sprite + + """ + return self._spritelist[-1] + + def get_sprites_from_layer(self, layer): + """return all sprites from a layer ordered as they where added + + LayeredUpdates.get_sprites_from_layer(layer): return sprites + + Returns all sprites from a layer. The sprites are ordered in the + sequence that they where added. (The sprites are not removed from the + layer. + + """ + sprites = [] + sprites_append = sprites.append + sprite_layers = self._spritelayers + for spr in self._spritelist: + if sprite_layers[spr] == layer: + sprites_append(spr) + elif sprite_layers[spr] > layer:# break after because no other will + # follow with same layer + break + return sprites + + def switch_layer(self, layer1_nr, layer2_nr): + """switch the sprites from layer1_nr to layer2_nr + + LayeredUpdates.switch_layer(layer1_nr, layer2_nr): return None + + The layers number must exist. This method does not check for the + existence of the given layers. + + """ + sprites1 = self.remove_sprites_of_layer(layer1_nr) + for spr in self.get_sprites_from_layer(layer2_nr): + self.change_layer(spr, layer1_nr) + self.add(layer=layer2_nr, *sprites1) + + +class LayeredDirty(LayeredUpdates): + """LayeredDirty Group is for DirtySprites; subclasses LayeredUpdates + + pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty + + This group requires pygame.sprite.DirtySprite or any sprite that + has the following attributes: + image, rect, dirty, visible, blendmode (see doc of DirtySprite). + + It uses the dirty flag technique and is therefore faster than + pygame.sprite.RenderUpdates if you have many static sprites. It + also switches automatically between dirty rect updating and full + screen drawing, so you do no have to worry which would be faster. + + As with the pygame.sprite.Group, you can specify some additional attributes + through kwargs: + _use_update: True/False (default is False) + _default_layer: default layer where the sprites without a layer are + added + _time_threshold: treshold time for switching between dirty rect mode + and fullscreen mode; defaults to updating at 80 frames per second, + which is equal to 1000.0 / 80.0 + + New in pygame 1.8.0 + + """ + + def __init__(self, *sprites, **kwargs): + """initialize group. + + pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty + + You can specify some additional attributes through kwargs: + _use_update: True/False (default is False) + _default_layer: default layer where the sprites without a layer are + added + _time_threshold: treshold time for switching between dirty rect + mode and fullscreen mode; defaults to updating at 80 frames per + second, which is equal to 1000.0 / 80.0 + + """ + LayeredUpdates.__init__(self, *sprites, **kwargs) + self._clip = None + + self._use_update = False + + self._time_threshold = 1000.0 / 80.0 # 1000.0 / fps + + self._bgd = None + for key, val in kwargs.items(): + if key in ['_use_update', '_time_threshold', '_default_layer']: + if hasattr(self, key): + setattr(self, key, val) + + def add_internal(self, sprite, layer=None): + """Do not use this method directly. + + It is used by the group to add a sprite internally. + + """ + # check if all needed attributes are set + if not hasattr(sprite, 'dirty'): + raise AttributeError() + if not hasattr(sprite, 'visible'): + raise AttributeError() + if not hasattr(sprite, 'blendmode'): + raise AttributeError() + + if not isinstance(sprite, DirtySprite): + raise TypeError() + + if sprite.dirty == 0: # set it dirty if it is not + sprite.dirty = 1 + + LayeredUpdates.add_internal(self, sprite, layer) + + def draw(self, surface, bgd=None): + """draw all sprites in the right order onto the given surface + + LayeredDirty.draw(surface, bgd=None): return Rect_list + + You can pass the background too. If a self.bgd is already set to some + value that is not None, then the bgd argument has no effect. + + """ + # speedups + _orig_clip = surface.get_clip() + _clip = self._clip + if _clip is None: + _clip = _orig_clip + + _surf = surface + _sprites = self._spritelist + _old_rect = self.spritedict + _update = self.lostsprites + _update_append = _update.append + _ret = None + _surf_blit = _surf.blit + _rect = Rect + if bgd is not None: + self._bgd = bgd + _bgd = self._bgd + init_rect = self._init_rect + + _surf.set_clip(_clip) + # ------- + # 0. decide whether to render with update or flip + start_time = get_ticks() + if self._use_update: # dirty rects mode + # 1. find dirty area on screen and put the rects into _update + # still not happy with that part + for spr in _sprites: + if 0 < spr.dirty: + # chose the right rect + if spr.source_rect: + _union_rect = _rect(spr.rect.topleft, + spr.source_rect.size) + else: + _union_rect = _rect(spr.rect) + + _union_rect_collidelist = _union_rect.collidelist + _union_rect_union_ip = _union_rect.union_ip + i = _union_rect_collidelist(_update) + while -1 < i: + _union_rect_union_ip(_update[i]) + del _update[i] + i = _union_rect_collidelist(_update) + _update_append(_union_rect.clip(_clip)) + + if _old_rect[spr] is not init_rect: + _union_rect = _rect(_old_rect[spr]) + _union_rect_collidelist = _union_rect.collidelist + _union_rect_union_ip = _union_rect.union_ip + i = _union_rect_collidelist(_update) + while -1 < i: + _union_rect_union_ip(_update[i]) + del _update[i] + i = _union_rect_collidelist(_update) + _update_append(_union_rect.clip(_clip)) + # can it be done better? because that is an O(n**2) algorithm in + # worst case + + # clear using background + if _bgd is not None: + for rec in _update: + _surf_blit(_bgd, rec, rec) + + # 2. draw + for spr in _sprites: + if 1 > spr.dirty: + if spr._visible: + # sprite not dirty; blit only the intersecting part + if spr.source_rect is not None: + # For possible future speed up, source_rect's data + # can be prefetched outside of this loop. + _spr_rect = _rect(spr.rect.topleft, + spr.source_rect.size) + rect_offset_x = spr.source_rect[0] - _spr_rect[0] + rect_offset_y = spr.source_rect[1] - _spr_rect[1] + else: + _spr_rect = spr.rect + rect_offset_x = -_spr_rect[0] + rect_offset_y = -_spr_rect[1] + + _spr_rect_clip = _spr_rect.clip + + for idx in _spr_rect.collidelistall(_update): + # clip + clip = _spr_rect_clip(_update[idx]) + _surf_blit(spr.image, + clip, + (clip[0] + rect_offset_x, + clip[1] + rect_offset_y, + clip[2], + clip[3]), + spr.blendmode) + else: # dirty sprite + if spr._visible: + _old_rect[spr] = _surf_blit(spr.image, + spr.rect, + spr.source_rect, + spr.blendmode) + if spr.dirty == 1: + spr.dirty = 0 + _ret = list(_update) + else: # flip, full screen mode + if _bgd is not None: + _surf_blit(_bgd, (0, 0)) + for spr in _sprites: + if spr._visible: + _old_rect[spr] = _surf_blit(spr.image, + spr.rect, + spr.source_rect, + spr.blendmode) + _ret = [_rect(_clip)] # return only the part of the screen changed + + + # timing for switching modes + # How may a good threshold be found? It depends on the hardware. + end_time = get_ticks() + if end_time-start_time > self._time_threshold: + self._use_update = False + else: + self._use_update = True + +## # debug +## print " check: using dirty rects:", self._use_update + + # emtpy dirty rects list + _update[:] = [] + + # ------- + # restore original clip + _surf.set_clip(_orig_clip) + return _ret + + def clear(self, surface, bgd): + """use to set background + + Group.clear(surface, bgd): return None + + """ + self._bgd = bgd + + def repaint_rect(self, screen_rect): + """repaint the given area + + LayeredDirty.repaint_rect(screen_rect): return None + + screen_rect is in screen coordinates. + + """ + if self._clip: + self.lostsprites.append(screen_rect.clip(self._clip)) + else: + self.lostsprites.append(Rect(screen_rect)) + + def set_clip(self, screen_rect=None): + """clip the area where to draw; pass None (default) to reset the clip + + LayeredDirty.set_clip(screen_rect=None): return None + + """ + if screen_rect is None: + self._clip = pygame.display.get_surface().get_rect() + else: + self._clip = screen_rect + self._use_update = False + + def get_clip(self): + """get the area where drawing will occur + + LayeredDirty.get_clip(): return Rect + + """ + return self._clip + + def change_layer(self, sprite, new_layer): + """change the layer of the sprite + + LayeredUpdates.change_layer(sprite, new_layer): return None + + The sprite must have been added to the renderer already. This is not + checked. + + """ + LayeredUpdates.change_layer(self, sprite, new_layer) + if sprite.dirty == 0: + sprite.dirty = 1 + + def set_timing_treshold(self, time_ms): + """set the treshold in milliseconds + + set_timing_treshold(time_ms): return None + + Defaults to 1000.0 / 80.0. This means that the screen will be painted + using the flip method rather than the update method if the update + method is taking so long to update the screen that the frame rate falls + below 80 frames per second. + + """ + self._time_threshold = time_ms + + +class GroupSingle(AbstractGroup): + """A group container that holds a single most recent item. + + This class works just like a regular group, but it only keeps a single + sprite in the group. Whatever sprite has been added to the group last will + be the only sprite in the group. + + You can access its one sprite as the .sprite attribute. Assigning to this + attribute will properly remove the old sprite and then add the new one. + + """ + + def __init__(self, sprite=None): + AbstractGroup.__init__(self) + self.__sprite = None + if sprite is not None: + self.add(sprite) + + def copy(self): + return GroupSingle(self.__sprite) + + def sprites(self): + if self.__sprite is not None: + return [self.__sprite] + else: + return [] + + def add_internal(self, sprite): + if self.__sprite is not None: + self.__sprite.remove_internal(self) + self.remove_internal(self.__sprite) + self.__sprite = sprite + + def __nonzero__(self): + return self.__sprite is not None + + def _get_sprite(self): + return self.__sprite + + def _set_sprite(self, sprite): + self.add_internal(sprite) + sprite.add_internal(self) + return sprite + + sprite = property(_get_sprite, + _set_sprite, + None, + "The sprite contained in this group") + + def remove_internal(self, sprite): + if sprite is self.__sprite: + self.__sprite = None + if sprite in self.spritedict: + AbstractGroup.remove_internal(self, sprite) + + def has_internal(self, sprite): + return self.__sprite is sprite + + # Optimizations... + def __contains__(self, sprite): + return self.__sprite is sprite + + +# Some different collision detection functions that could be used. +def collide_rect(left, right): + """collision detection between two sprites, using rects. + + pygame.sprite.collide_rect(left, right): return bool + + Tests for collision between two sprites. Uses the pygame.Rect colliderect + function to calculate the collision. It is intended to be passed as a + collided callback function to the *collide functions. Sprites must have + "rect" attributes. + + New in pygame 1.8.0 + + """ + return left.rect.colliderect(right.rect) + +class collide_rect_ratio: + """A callable class that checks for collisions using scaled rects + + The class checks for collisions between two sprites using a scaled version + of the sprites' rects. Is created with a ratio; the instance is then + intended to be passed as a collided callback function to the *collide + functions. + + New in pygame 1.8.1 + + """ + + def __init__(self, ratio): + """create a new collide_rect_ratio callable + + Ratio is expected to be a floating point value used to scale + the underlying sprite rect before checking for collisions. + + """ + self.ratio = ratio + + def __call__(self, left, right): + """detect collision between two sprites using scaled rects + + pygame.sprite.collide_rect_ratio(ratio)(left, right): return bool + + Tests for collision between two sprites. Uses the pygame.Rect + colliderect function to calculate the collision after scaling the rects + by the stored ratio. Sprites must have "rect" attributes. + + """ + + ratio = self.ratio + + leftrect = left.rect + width = leftrect.width + height = leftrect.height + leftrect = leftrect.inflate(width * ratio - width, + height * ratio - height) + + rightrect = right.rect + width = rightrect.width + height = rightrect.height + rightrect = rightrect.inflate(width * ratio - width, + height * ratio - height) + + return leftrect.colliderect(rightrect) + +def collide_circle(left, right): + """detect collision between two sprites using circles + + pygame.sprite.collide_circle(left, right): return bool + + Tests for collision between two sprites by testing whether two circles + centered on the sprites overlap. If the sprites have a "radius" attribute, + then that radius is used to create the circle; otherwise, a circle is + created that is big enough to completely enclose the sprite's rect as + given by the "rect" attribute. This function is intended to be passed as + a collided callback function to the *collide functions. Sprites must have a + "rect" and an optional "radius" attribute. + + New in pygame 1.8.0 + + """ + + xdistance = left.rect.centerx - right.rect.centerx + ydistance = left.rect.centery - right.rect.centery + distancesquared = xdistance ** 2 + ydistance ** 2 + + if hasattr(left, 'radius'): + leftradius = left.radius + else: + leftrect = left.rect + # approximating the radius of a square by using half of the diagonal, + # might give false positives (especially if its a long small rect) + leftradius = 0.5 * ((leftrect.width ** 2 + leftrect.height ** 2) ** 0.5) + # store the radius on the sprite for next time + setattr(left, 'radius', leftradius) + + if hasattr(right, 'radius'): + rightradius = right.radius + else: + rightrect = right.rect + # approximating the radius of a square by using half of the diagonal + # might give false positives (especially if its a long small rect) + rightradius = 0.5 * ((rightrect.width ** 2 + rightrect.height ** 2) ** 0.5) + # store the radius on the sprite for next time + setattr(right, 'radius', rightradius) + return distancesquared <= (leftradius + rightradius) ** 2 + +class collide_circle_ratio(object): + """detect collision between two sprites using scaled circles + + This callable class checks for collisions between two sprites using a + scaled version of a sprite's radius. It is created with a ratio as the + argument to the constructor. The instance is then intended to be passed as + a collided callback function to the *collide functions. + + New in pygame 1.8.1 + + """ + + def __init__(self, ratio): + """creates a new collide_circle_ratio callable instance + + The given ratio is expected to be a floating point value used to scale + the underlying sprite radius before checking for collisions. + + When the ratio is ratio=1.0, then it behaves exactly like the + collide_circle method. + + """ + self.ratio = ratio + + + def __call__(self, left, right): + """detect collision between two sprites using scaled circles + + pygame.sprite.collide_circle_radio(ratio)(left, right): return bool + + Tests for collision between two sprites by testing whether two circles + centered on the sprites overlap after scaling the circle's radius by + the stored ratio. If the sprites have a "radius" attribute, that is + used to create the circle; otherwise, a circle is created that is big + enough to completely enclose the sprite's rect as given by the "rect" + attribute. Intended to be passed as a collided callback function to the + *collide functions. Sprites must have a "rect" and an optional "radius" + attribute. + + """ + + ratio = self.ratio + xdistance = left.rect.centerx - right.rect.centerx + ydistance = left.rect.centery - right.rect.centery + distancesquared = xdistance ** 2 + ydistance ** 2 + + if hasattr(left, "radius"): + leftradius = left.radius * ratio + else: + leftrect = left.rect + leftradius = ratio * 0.5 * ((leftrect.width ** 2 + leftrect.height ** 2) ** 0.5) + # store the radius on the sprite for next time + setattr(left, 'radius', leftradius) + + if hasattr(right, "radius"): + rightradius = right.radius * ratio + else: + rightrect = right.rect + rightradius = ratio * 0.5 * ((rightrect.width ** 2 + rightrect.height ** 2) ** 0.5) + # store the radius on the sprite for next time + setattr(right, 'radius', rightradius) + + return distancesquared <= (leftradius + rightradius) ** 2 + +def collide_mask(left, right): + """collision detection between two sprites, using masks. + + pygame.sprite.collide_mask(SpriteLeft, SpriteRight): bool + + Tests for collision between two sprites by testing if their bitmasks + overlap. If the sprites have a "mask" attribute, that is used as the mask; + otherwise, a mask is created from the sprite image. Intended to be passed + as a collided callback function to the *collide functions. Sprites must + have a "rect" and an optional "mask" attribute. + + New in pygame 1.8.0 + + """ + xoffset = right.rect[0] - left.rect[0] + yoffset = right.rect[1] - left.rect[1] + try: + leftmask = left.mask + except AttributeError: + leftmask = from_surface(left.image) + try: + rightmask = right.mask + except AttributeError: + rightmask = from_surface(right.image) + return leftmask.overlap(rightmask, (xoffset, yoffset)) + +def spritecollide(sprite, group, dokill, collided=None): + """find Sprites in a Group that intersect another Sprite + + pygame.sprite.spritecollide(sprite, group, dokill, collided=None): + return Sprite_list + + Return a list containing all Sprites in a Group that intersect with another + Sprite. Intersection is determined by comparing the Sprite.rect attribute + of each Sprite. + + The dokill argument is a bool. If set to True, all Sprites that collide + will be removed from the Group. + + The collided argument is a callback function used to calculate if two + sprites are colliding. it should take two sprites as values, and return a + bool value indicating if they are colliding. If collided is not passed, all + sprites must have a "rect" value, which is a rectangle of the sprite area, + which will be used to calculate the collision. + + """ + if dokill: + + crashed = [] + append = crashed.append + + if collided: + for s in group.sprites(): + if collided(sprite, s): + s.kill() + append(s) + else: + spritecollide = sprite.rect.colliderect + for s in group.sprites(): + if spritecollide(s.rect): + s.kill() + append(s) + + return crashed + + elif collided: + return [s for s in group if collided(sprite, s)] + else: + spritecollide = sprite.rect.colliderect + return [s for s in group if spritecollide(s.rect)] + + +def groupcollide(groupa, groupb, dokilla, dokillb, collided=None): + """detect collision between a group and another group + + pygame.sprite.groupcollide(groupa, groupb, dokilla, dokillb): + return dict + + Given two groups, this will find the intersections between all sprites in + each group. It returns a dictionary of all sprites in the first group that + collide. The value for each item in the dictionary is a list of the sprites + in the second group it collides with. The two dokill arguments control if + the sprites from either group will be automatically removed from all + groups. Collided is a callback function used to calculate if two sprites + are colliding. it should take two sprites as values, and return a bool + value indicating if they are colliding. If collided is not passed, all + sprites must have a "rect" value, which is a rectangle of the sprite area + that will be used to calculate the collision. + + """ + crashed = {} + SC = spritecollide + if dokilla: + for s in groupa.sprites(): + c = SC(s, groupb, dokillb, collided) + if c: + crashed[s] = c + s.kill() + else: + for s in groupa: + c = SC(s, groupb, dokillb, collided) + if c: + crashed[s] = c + return crashed + +def spritecollideany(sprite, group, collided=None): + """finds any sprites in a group that collide with the given sprite + + pygame.sprite.spritecollideany(sprite, group): return sprite + + Given a sprite and a group of sprites, this will return return any single + sprite that collides with with the given sprite. If there are no + collisions, then this returns None. + + If you don't need all the features of the spritecollide function, this + function will be a bit quicker. + + Collided is a callback function used to calculate if two sprites are + colliding. It should take two sprites as values and return a bool value + indicating if they are colliding. If collided is not passed, then all + sprites must have a "rect" value, which is a rectangle of the sprite area, + which will be used to calculate the collision. + + + """ + if collided: + for s in group: + if collided(sprite, s): + return s + else: + # Special case old behaviour for speed. + spritecollide = sprite.rect.colliderect + for s in group: + if spritecollide(s.rect): + return s + return None diff --git a/venv/Lib/site-packages/pygame/surface.cp37-win32.pyd b/venv/Lib/site-packages/pygame/surface.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..8933738271933e73491833377d65ef554b93965c GIT binary patch literal 233472 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 +Mm3kT<^_1xlotwS+)YH!sP8B6T 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/sysfont.py b/venv/Lib/site-packages/pygame/sysfont.py new file mode 100644 index 0000000..b3c7443 --- /dev/null +++ b/venv/Lib/site-packages/pygame/sysfont.py @@ -0,0 +1,411 @@ +# coding: ascii +# pygame - Python Game Library +# Copyright (C) 2000-2003 Pete Shinners +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Pete Shinners +# pete@shinners.org +"""sysfont, used in the font module to find system fonts""" + +import os +import sys +from pygame.compat import xrange_, PY_MAJOR_VERSION +from os.path import basename, dirname, exists, join, splitext +import xml.etree.ElementTree as ET + + +OpenType_extensions = frozenset(('.ttf', '.ttc', '.otf')) +Sysfonts = {} +Sysalias = {} + +# Python 3 compatibility +if PY_MAJOR_VERSION >= 3: + def toascii(raw): + """convert bytes to ASCII-only string""" + return raw.decode('ascii', 'ignore') + if os.name == 'nt': + import winreg as _winreg + else: + import subprocess +else: + def toascii(raw): + """return ASCII characters of a given unicode or 8-bit string""" + return raw.decode('ascii', 'ignore') + if os.name == 'nt': + import _winreg + else: + import subprocess + + +def _simplename(name): + """create simple version of the font name""" + # return alphanumeric characters of a string (converted to lowercase) + return ''.join(c.lower() for c in name if c.isalnum()) + + +def _addfont(name, bold, italic, font, fontdict): + """insert a font and style into the font dictionary""" + if name not in fontdict: + fontdict[name] = {} + fontdict[name][bold, italic] = font + + +def initsysfonts_win32(): + """initialize fonts dictionary on Windows""" + + fontdir = join(os.environ.get('WINDIR', 'C:\\Windows'), 'Fonts') + + TrueType_suffix = '(TrueType)' + mods = ('demibold', 'narrow', 'light', 'unicode', 'bt', 'mt') + + fonts = {} + + # add fonts entered in the registry + + # find valid registry keys containing font information. + # http://docs.python.org/lib/module-sys.html + # 0 (VER_PLATFORM_WIN32s) Win32s on Windows 3.1 + # 1 (VER_PLATFORM_WIN32_WINDOWS) Windows 95/98/ME + # 2 (VER_PLATFORM_WIN32_NT) Windows NT/2000/XP + # 3 (VER_PLATFORM_WIN32_CE) Windows CE + if sys.getwindowsversion()[0] == 1: + key_name = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts" + else: + key_name = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts" + key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key_name) + + for i in xrange_(_winreg.QueryInfoKey(key)[1]): + try: + # name is the font's name e.g. Times New Roman (TrueType) + # font is the font's filename e.g. times.ttf + name, font = _winreg.EnumValue(key, i)[0:2] + except EnvironmentError: + break + + # try to handle windows unicode strings for file names with + # international characters + if PY_MAJOR_VERSION < 3: + # here are two documents with some information about it: + # http://www.python.org/peps/pep-0277.html + # https://www.microsoft.com/technet/archive/interopmigration/linux/mvc/lintowin.mspx#ECAA + try: + font = str(font) + except UnicodeEncodeError: + # MBCS is the windows encoding for unicode file names. + try: + font = font.encode('MBCS') + except: + # no success with str or MBCS encoding... skip this font. + continue + + if splitext(font)[1].lower() not in OpenType_extensions: + continue + if not dirname(font): + font = join(fontdir, font) + + if name.endswith(TrueType_suffix): + name = name.rstrip(TrueType_suffix).rstrip() + name = name.lower().split() + + bold = italic = 0 + for m in mods: + if m in name: + name.remove(m) + if 'bold' in name: + name.remove('bold') + bold = 1 + if 'italic' in name: + name.remove('italic') + italic = 1 + name = ''.join(name) + + name = _simplename(name) + + _addfont(name, bold, italic, font, fonts) + + return fonts + + +def _add_font_paths(sub_elements, fonts): + """ Gets each element, checks its tag content, + if wanted fetches the next value in the iterable + """ + font_name = font_path = None + for tag in sub_elements: + if tag.text == "_name": + font_name = next(sub_elements).text + if splitext(font_name)[1] not in OpenType_extensions: + break + bold = "bold" in font_name + italic = "italic" in font_name + if tag.text == "path" and font_name is not None: + font_path = next(sub_elements).text + _addfont(_simplename(font_name),bold,italic,font_path,fonts) + break + + +def _system_profiler_darwin(): + fonts = {} + flout, flerr = subprocess.Popen( + ' '.join(['system_profiler', '-xml','SPFontsDataType']), + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True + ).communicate() + + for font_node in ET.fromstring(flout).iterfind('./array/dict/array/dict'): + _add_font_paths(font_node.iter("*"), fonts) + + return fonts + + + +def initsysfonts_darwin(): + """ Read the fonts on MacOS, and OS X. + """ + # if the X11 binary exists... try and use that. + # Not likely to be there on pre 10.4.x ... or MacOS 10.10+ + if exists('/usr/X11/bin/fc-list'): + fonts = initsysfonts_unix('/usr/X11/bin/fc-list') + # This fc-list path will work with the X11 from the OS X 10.3 installation + # disc + elif exists('/usr/X11R6/bin/fc-list'): + fonts = initsysfonts_unix('/usr/X11R6/bin/fc-list') + elif exists('/usr/sbin/system_profiler'): + try: + fonts = _system_profiler_darwin() + except: + fonts = {} + else: + fonts = {} + + return fonts + + +# read the fonts on unix +def initsysfonts_unix(path="fc-list"): + """use the fc-list from fontconfig to get a list of fonts""" + fonts = {} + + try: + # note, we capture stderr so if fc-list isn't there to stop stderr + # printing. + flout, flerr = subprocess.Popen('%s : file family style' % path, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + close_fds=True).communicate() + except Exception: + return fonts + + entries = toascii(flout) + try: + for line in entries.split('\n'): + + try: + filename, family, style = line.split(':', 2) + if splitext(filename)[1].lower() in OpenType_extensions: + bold = 'Bold' in style + italic = 'Italic' in style + oblique = 'Oblique' in style + for name in family.strip().split(','): + if name: + break + else: + name = splitext(basename(filename))[0] + + _addfont( + _simplename(name), bold, italic or oblique, filename, fonts) + + except Exception: + # try the next one. + pass + + except Exception: + pass + + return fonts + + +def create_aliases(): + """map common fonts that are absent from the system to similar fonts that are installed in the system""" + alias_groups = ( + ('monospace', 'misc-fixed', 'courier', 'couriernew', 'console', + 'fixed', 'mono', 'freemono', 'bitstreamverasansmono', + 'verasansmono', 'monotype', 'lucidaconsole'), + ('sans', 'arial', 'helvetica', 'swiss', 'freesans', + 'bitstreamverasans', 'verasans', 'verdana', 'tahoma'), + ('serif', 'times', 'freeserif', 'bitstreamveraserif', 'roman', + 'timesroman', 'timesnewroman', 'dutch', 'veraserif', + 'georgia'), + ('wingdings', 'wingbats'), + ) + for alias_set in alias_groups: + for name in alias_set: + if name in Sysfonts: + found = Sysfonts[name] + break + else: + continue + for name in alias_set: + if name not in Sysfonts: + Sysalias[name] = found + + +# initialize it all, called once +def initsysfonts(): + if sys.platform == 'win32': + fonts = initsysfonts_win32() + elif sys.platform == 'darwin': + fonts = initsysfonts_darwin() + else: + fonts = initsysfonts_unix() + Sysfonts.update(fonts) + create_aliases() + if not Sysfonts: # dummy so we don't try to reinit + Sysfonts[None] = None + + +# pygame.font specific declarations +def font_constructor(fontpath, size, bold, italic): + import pygame.font + + font = pygame.font.Font(fontpath, size) + if bold: + font.set_bold(1) + if italic: + font.set_italic(1) + + return font + + +# the exported functions + +def SysFont(name, size, bold=False, italic=False, constructor=None): + """pygame.font.SysFont(name, size, bold=False, italic=False, constructor=None) -> Font + create a pygame Font from system font resources + + This will search the system fonts for the given font + name. You can also enable bold or italic styles, and + the appropriate system font will be selected if available. + + This will always return a valid Font object, and will + fallback on the builtin pygame font if the given font + is not found. + + Name can also be a comma separated list of names, in + which case set of names will be searched in order. Pygame + uses a small set of common font aliases, if the specific + font you ask for is not available, a reasonable alternative + may be used. + + if optional contructor is provided, it must be a function with + signature constructor(fontpath, size, bold, italic) which returns + a Font instance. If None, a pygame.font.Font object is created. + """ + if constructor is None: + constructor = font_constructor + + if not Sysfonts: + initsysfonts() + + gotbold = gotitalic = False + fontname = None + if name: + allnames = name + for name in allnames.split(','): + name = _simplename(name) + styles = Sysfonts.get(name) + if not styles: + styles = Sysalias.get(name) + if styles: + plainname = styles.get((False, False)) + fontname = styles.get((bold, italic)) + if not fontname and not plainname: + # Neither requested style, nor plain font exists, so + # return a font with the name requested, but an + # arbitrary style. + (style, fontname) = list(styles.items())[0] + # Attempt to style it as requested. This can't + # unbold or unitalicize anything, but it can + # fake bold and/or fake italicize. + if bold and style[0]: + gotbold = True + if italic and style[1]: + gotitalic = True + elif not fontname: + fontname = plainname + elif plainname != fontname: + gotbold = bold + gotitalic = italic + if fontname: + break + + set_bold = set_italic = False + if bold and not gotbold: + set_bold = True + if italic and not gotitalic: + set_italic = True + + return constructor(fontname, size, set_bold, set_italic) + + +def get_fonts(): + """pygame.font.get_fonts() -> list + get a list of system font names + + Returns the list of all found system fonts. Note that + the names of the fonts will be all lowercase with spaces + removed. This is how pygame internally stores the font + names for matching. + """ + if not Sysfonts: + initsysfonts() + return list(Sysfonts) + + +def match_font(name, bold=0, italic=0): + """pygame.font.match_font(name, bold=0, italic=0) -> name + find the filename for the named system font + + This performs the same font search as the SysFont() + function, only it returns the path to the TTF file + that would be loaded. The font name can be a comma + separated list of font names to try. + + If no match is found, None is returned. + """ + if not Sysfonts: + initsysfonts() + + fontname = None + allnames = name + for name in allnames.split(','): + name = _simplename(name) + styles = Sysfonts.get(name) + if not styles: + styles = Sysalias.get(name) + if styles: + while not fontname: + fontname = styles.get((bold, italic)) + if italic: + italic = 0 + elif bold: + bold = 0 + elif not fontname: + fontname = list(styles.values())[0] + if fontname: + break + return fontname diff --git a/venv/Lib/site-packages/pygame/tests/__init__.py b/venv/Lib/site-packages/pygame/tests/__init__.py new file mode 100644 index 0000000..48cfdce --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/__init__.py @@ -0,0 +1,40 @@ +"""Pygame unit test suite package + +Exports function run() + +A quick way to run the test suite package from the command line +is by importing the go submodule: + +python -m "import pygame.tests" [] + +Command line option --help displays a usage message. Available options +correspond to the pygame.tests.run arguments. + +The xxxx_test submodules of the tests package are unit test suites for +individual parts of Pygame. Each can also be run as a main program. This is +useful if the test, such as cdrom_test, is interactive. + +For Pygame development the test suite can be run from a Pygame distribution +root directory using run_tests.py. Alternately, test/__main__.py can be run +directly. + +""" + +if __name__ == 'pygame.tests': + from pygame.tests.test_utils.run_tests import run +elif __name__ == '__main__': + import os + import sys + pkg_dir = os.path.split(os.path.abspath(__file__))[0] + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) + + if is_pygame_pkg: + import pygame.tests.__main__ + else: + import test.__main__ +else: + from test.test_utils.run_tests import run diff --git a/venv/Lib/site-packages/pygame/tests/__main__.py b/venv/Lib/site-packages/pygame/tests/__main__.py new file mode 100644 index 0000000..51b2e13 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/__main__.py @@ -0,0 +1,133 @@ +"""Load and run the Pygame test suite + +python -c "import pygame.tests.go" [] + +or + +python test/go.py [] + +Command line option --help displays a command line usage message. + +run_tests.py in the main distribution directory is an alternative to test.go + +""" + +import sys + +if __name__ == '__main__': + import os + pkg_dir = os.path.split(os.path.abspath(__file__))[0] + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +if is_pygame_pkg: + from pygame.tests.test_utils.run_tests import run_and_exit + from pygame.tests.test_utils.test_runner import opt_parser +else: + from test.test_utils.run_tests import run_and_exit + from test.test_utils.test_runner import opt_parser + +if is_pygame_pkg: + test_pkg_name = "pygame.tests" +else: + test_pkg_name = "test" +program_name = sys.argv[0] +if program_name == '-c': + program_name = 'python -c "import %s.go"' % test_pkg_name + +########################################################################### +# Set additional command line options +# +# Defined in test_runner.py as it shares options, added to here + +opt_parser.set_usage(""" + +Runs all or some of the %(pkg)s.xxxx_test tests. + +$ %(exec)s sprite threads -sd + +Runs the sprite and threads module tests isolated in subprocesses, dumping +all failing tests info in the form of a dict. + +""" % {'pkg': test_pkg_name, 'exec': program_name}) + +opt_parser.add_option ( + "-d", "--dump", action = 'store_true', + help = "dump results as dict ready to eval" ) + +opt_parser.add_option ( + "-F", "--file", + help = "dump results to a file" ) + +opt_parser.add_option ( + "-m", "--multi_thread", metavar = 'THREADS', type = 'int', + help = "run subprocessed tests in x THREADS" ) + +opt_parser.add_option ( + "-t", "--time_out", metavar = 'SECONDS', type = 'int', + help = "kill stalled subprocessed tests after SECONDS" ) + +opt_parser.add_option ( + "-f", "--fake", metavar = "DIR", + help = "run fake tests in run_tests__tests/$DIR" ) + +opt_parser.add_option ( + "-p", "--python", metavar = "PYTHON", + help = "path to python excutable to run subproccesed tests\n" + "default (sys.executable): %s" % sys.executable) + +opt_parser.add_option ( + "-I", "--interactive", action = 'store_true', + help = "include tests requiring user input") + +opt_parser.add_option( + "-S", "--seed", type = 'int', + help = "Randomisation seed" +) + +########################################################################### +# Set run() keyword arguements according to command line arguemnts. +# args will be the test module list, passed as positional argumemts. + +options, args = opt_parser.parse_args() + +kwds = {} +if options.incomplete: + kwds['incomplete'] = True +if options.usesubprocess: + kwds['usesubprocess'] = True +else: + kwds['usesubprocess'] = False +if options.dump: + kwds['dump'] = True +if options.file: + kwds['file'] = options.file +if options.exclude: + kwds['exclude'] = options.exclude +if options.unbuffered: + kwds['unbuffered'] = True +if options.randomize: + kwds['randomize'] = True +if options.seed is not None: + kwds['seed'] = options.seed +if options.multi_thread is not None: + kwds['multi_thread'] = options.multi_thread +if options.time_out is not None: + kwds['time_out'] = options.time_out +if options.fake: + kwds['fake'] = options.fake +if options.python: + kwds['python'] = options.python +if options.interactive: + kwds['interactive'] = True + +########################################################################### +# Run the test suite. +run_and_exit(*args, **kwds) + + diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4967de21c9b310bb0666e8d3dfcb73b5481877a GIT binary patch literal 1351 zcmZuxO^@3)5S3*4Bi!{SZ4#i{Lov;%3+y`AAP9nP(&SVG1-eB6)eS+5w9S|j8IsyY z`2{`q&~x@!pogHh{uNzw%1>xd9a8po`ys<5HJq9E<_)Pw(tx%d3{=YQl$@-DpW zo*^zi$G>}v15b)Xq&(eZ_G6y$fy$~uF-Vj8C$#2heS_Aa%8NYC!(u4%7o#`hI8Ma1 zi}WJp*|JDOBBu7| zh;Y5Q@$%QW`k?r*-pAEI-RwE>;n&I0HTGMUBww{FRtaco>A?%d%e{Ifa*vEI052Yr*Sa1-};mlLD4jS8=b@RmEx!O4fo%2a6VD z6|&2E6&+R@(HE8GjS}|>F|A)C;7J8{dOt9c>@4tfci_7Rk+3#_mwWgq9o-?V~LWymJBc--hIHQp(mKMso3Ooz7GP`OjQF}Kd zditi6_Yg>t5=p)GdNqLuF{dliDjce{!QQ*rNtZ=Q*vxb=qDm(oxXrMMjn?qNuuMzu)s_5RgvyvM7T9Hrd=6L*tc^s{al56Sx!ce_y^ zaCEC1Q_6KoY4EJ^+*4Y7dNo@-S`_Ik7uwu2wRlaEF4L|XxYl*KVSe2W@iY) z`b&>pLQD86?4|(X=9EhONW{)`lL!4ReRvyz+$T8X*(5zkC-L`DdIRTMX`UWrc}g;p F{RQ~zzI^}y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/__main__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77a5d63d7a70fa84674f5bf5dedb60ac64ba2e6c GIT binary patch literal 2733 zcmZ`)OLN@D5eBf}?h@MNOVo-KB^#ndiE9f~oTsBOiuJI|u5w8(k*OpIBh+wbb_p(C znE_}KmC7%OQa-125O2v(NDlc2x%i0kExGs)Hd1AalhMj z4E)}I`q!u5EEvW=Ntymyc=-T-^(V_PxZxYz-pRSdz-ubDzMEN>>9t$xA+Zy^Hrp6-skV|cahb4&zQk)aSwa$%0;KG4WJK>nb2y$5|! zTozaUh%Rw!&*8AVZUG0!&d6*{Z?r$6?m9HFW>Gmky$xh#3_aKd9+CK^t;nx1H z=N*YCb9tz;h@C2zxr14&La~u>W1;A|<2Xn?s8hiXVO>Vd@PYuj3=a!R3W^kiJe4p( z#KdJ$E@Z;;@C4PSx?q&zIA7C6epI!CfMNteHK${L4YCZsSyx_mzr{e`tU8ng>IlTM zFo*7-lpteL30Zb#jVqhNm6kUs*Z!B-Elp?n565{@BuF!g+*GSkrr2|=unDAq8HMA`e6 zKRlRAc;A#AbPlF*x!`#*qK83Ux8K_T_{oR&9`03*Fv-hnbOmM#20e7XsjO%2#IoP0 zTCvF436p5#X(pz@^V0FWJd8z<7P;Tr`|!czM-TT(ZybUvm4h)5`i9_ah*RiJ%`I=J z>tSQzHy(cSq`XNv4WYiyg$|ldET|v1ufwo!NqmQlX*OBe_PqLZ`OVLMwg2(sN9E&; z>0{z-OdHd56)I9v=F2y?g9soJ6L)gJvj?v?_hpOjtC19d`D zS5DBwFd0MzpJpq?Z;MdUDJgIdKx9_X$={V~ zOyevPxv07b@|wYqDq9~Ro0?p;Pz`NdIYn|<42MDrUd_uodMPTKLRX#H?pN(;yDFO) zu5h<$&Q<4TD(b&mwSs`B1I&R2NT9KhU_L^%QdQZ+X*Gv273Nio9V)HEhLQ>bzlCET zVDMB9MuA9j{oW>!g81D~1@&wQ=zcWA1T^JzE11mH=V5;2U!9#Ddf)~aXOY@@bqwSj z4W?`V&yE@yz&H_7Hpz0GkT*v1H~xER#@X*`Wtw|sGdVi(JD3h5$zokkHLpY-=;>TJ zjPsx#=auvN}6~) zW+NO{AoK~GKB#PUF#Q_fBUZI{>v?&%i#^l}2-|8~ZL@8znM;tXrfn`+j%Ax2bHVDE z9lSO1cd*uO+4D=Jn{7y2OQ3kKWsNsYtM<|>z*-c8c4(W9-bufaHbL9i%X#&$alK~$ E2lmH4`Tzg` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/base_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/base_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be3f6bc6a6b0e5af543d6c1c694bce23e67063d3 GIT binary patch literal 16961 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 Ai2wiq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/cdrom_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/cdrom_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4e605b58a49900b431ce1e8b6beca14874950d7 GIT binary patch literal 214 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 G^8Wx%*Ab@x literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/color_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/color_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ccb715892d3517194397581db49a4b3a542db3e GIT binary patch literal 31632 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 ARR910 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/constants_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/constants_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75575fb85b679303e3a18205f6fda577a09acff2 GIT binary patch literal 1833 zcmaJ>OHU(55bmCr#}5`SuxwB^5s|VHUL~BPRTRM*vaB%P2#i)5IXfD;dX3-S?j{1q zoXiig4>{x~gw)#bX9#_Zg{{8V!m$83nG5;K7 zc5tWzB*1`oS&+;;u--DTz`kZ+3)Z$LcHrQS11|2k>5eNr@H&><6KtB9F^(2aSSfRZ z)>yScbpF}M?BGyaNCXQwu)q>FaImh~ga;1T;9Rr71s6P=J;k5RfD4@ zeKZ$wlyRsE5;8*SqzW1EAqzRkLjjiH2`odgSsb&FX+E`P44!T8nvRkR8 zc8-ZnrH}S&yL0K7_Y+sAN2zdm_t%q@#XIcJcNb0)=ZV_F2icO8mm3R7s#SS=`YvUU ziA|J{D>)|H81$8n`dS%pc-f44B3Nz;9V+OCzYD2agTC>^g%*7%abq{S>MtgJwEb^T zeqBFRC{q70Xlv1_?+%B1k&fz>K_lwcYoa%-4=)>Mk?j32j2fM&+3GiOhkVQ@P4%qb zULmCQ_VCi=l+dTcayL@SLtp9@5@uWc|9;;paxaz`t=(c}dtvAnHk6qRjucXOW7umJ;6^Gv23x>_xg{8AplkC&N2&CKHk+iB(EK*g>R+;-aN6>kaV@ z9w@TRc!7_;T7>q9?Bg+hkGdD%r7^x(#HgJl$_dx*y$E@= z9V)QF#^&Id;-R=Kr*EfruPxof*8y6%c%!lD0LMIIgPL%#pRLToYS6 z+HHG)h+D^VaA}U~@7<(WAAMTly zdDM~xB9wu+z-j3WZ#*nqAue23XpK*t-k+jOGX8@5e1&lMApGsS^3{?fpOKGsBF~8s zjPLk}%R-o!8%Rnx6y?q5@tR8Ci(36KEct7lIu!>J_>}*0gs+ZF h#0FyT#vvPzIW_)I37&qYOe(^S&wYF4+m)=({{um@v(5kj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/cursors_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/cursors_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..589e1d7d4aec84e9306c5340f8ad623371140242 GIT binary patch literal 1268 zcmZ`(OK%e~5VrS~ZAf{kJcK|5xHJdC4IzY3X^^-;#iOXjim;a0X}8%IwpTP!!lj(y z&M7^@KR{gg9lmnnFK}XJx8*4;?aX*){LN>Ny{n6hO#iYf2?~5t;1)dJl&K#tMA;JP1h`6@)p03g-=BZe4|W!bdcFqE{-NEBzoBWg^$5 zHUkQ)aG*x09(=k5VoK(uB0^v(MGoFDiWAgYCc_Uz1(5Z9vv;%qR7<7%8~KirqyC+u zxEqDMQ#&Omy#`c8CMPAML zAWw@pkqzXAB+1g`%0FA_{*(W6bGQ(@R&DMJ7zWOFkIpD)2ef18jx%?sbn5IoGuL=i zh`w8%d0;{O-O|iI$nd5_x=hgeWw`Uz?oY zeUb8mL%a5BJ2sN*cmk)}g}~&}|DrsN^r%WXljWuj07_;i8Mk#=6uB}|OuBj$7X=`- zu@~(~x3x3}rItJGShsQI&-~6&g-x+R-Bs2&AjQHYj|2xI*2@c-*@lR9kwjzb#aV2a zpXQ~OtoaMv`ckP}Syvln!xEB^09-iWW4)JUY&s3)LoL>2ImJMnz3v11X zEWj8aS}LpSS_`}mb`hcZA;Syc(q}=CBOwjxQFn=6cAM0r$LUGhqHSk#vG@1e>HdMR z*70q~c?S2IbKB%RtsWWJEzVz-QBp@#2sP9a3Vc7m31p>Q5a`$VD*+~_D-QyvQJit! z3Dq%(uru{pR}^$jq%?7&t4=8RFA)~5!v=d1yiEjEr$AT_QGTmgQK*h1yjAnPjXwg7 Ok0peChwjPiA^icmCs-B$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/display_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/display_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c810d16e1ba7d6b9dd6a9a95de61b061ecee08c GIT binary patch literal 6505 zcmcIpOK%*<5uWGna36e$6h-Q_df3Y9L0ga5ifq`DDO#4HYyyc&oCV>*cx#qga`xe# zSrJ@NNB|khNl1WPa>#+aC5R8c`Y!}I z_vxNmH_N7~+*8OP^DBi+S6NLx*UM?wqSTru9=gib$hLyf>LaC?-od+-Qc(@9cB58l zl568WO*OyeIU5!3?EW;|+{Weq3&d6U(`Aj+vQ8T5UnylH`e50l6s6HlkwqimY06L* z+@c)i!AEG6#=tW)P7~l+nxrG(Ihvwr@H`!*8Sqg$Mzi2!G)Kq5$LR!}1fQT&bQ*k; z3Umhi2%V*K;8S#--T?Kwm+1=lEX~tf;B)jgT?Ic**XTO< z3A#bw2R}*g(7WKL=qCLD{50JHQ168kcOy`K*rc}SF1dct$+tFEoVr_BuQjN-UQq!I z|Clpc3%L9oNT6(~5^@D^QcFcm=y)0$wMH!f+=lOZ)jujCjfemFY~j}OW8W42@=u$q zfxEVRr`5Xa1kUny1&gx?i5#`{nMi zlSL&LIm%8jOcv3MNZ%r0%y(j3&O1gK3pJpQfRm51~_-iqtHca$3TaUlFd`C~M*>u4}li@1CkGyNVr& zP2ju!B#4sAsTplt&2_KY&dFi3mq;cP$WG2lOiti3ZlVd?Rxo|amcFU38kkH?RpOQz zwdAN2Pi{P!S}c*45_&AbEleM`h~vsA?EssXK=T*)l$h?4q9xe#BvNJLexuq9M;#v# z7L=O7;+Jj5E00v#Lb#2a|8yFf_aI8c9}Zb9^7sBt(}vCVxSZ`i z=@q=rXDyX%M(vy(Vj_oEpFmET*3`;mY?YU zh9BmhVyTAb*vJXZ(5ySFP0<5Ou;0driE}J@feA145s@q8lysyRX*;gNeuXizcu-UZ z%TjadQEh14uv6_4P9S@ADtV1CCV?mxzhTAVeDcaLjzkVgoyozh!qwAuqRdF={E&c4 zk{d@I3mlRv(}Sw`ZBcb9?$?Pn+0KPmX%owQHwvxSr9*z3C^YtJg<_dQQfRIZAx|bf zCkRCCi+14tIngTLxqKi@y9B=z)i~26s{Jid?Z_)t8xTAs)h2qVVK>&ORX6^bXf)nA zcMw?d_(M{puZZBV;XO?h^d}E4A_iiNvqZA2{S^%^?N(92gX^S{_Cn`M9;sRvpU6ec zL`$7jo~x+kqr%V#Qqi;Md64GkeT8Hs{ma*tW-a7jzYc$SowvkGgas@l0;w-`F?dOD}}fh-mqj@M0mbHGnkU~~f*p-Pn)$=&FxvB^7DY-C<& z*z)u?Gd;^uW3$o4RL|6&h2jHr3EngI+bVFDw5QCN={MD`wmmP}5q`*4bCt|{6}CB} zYHFu=u+4q)iTQX>uSjS3;Rs5AfS1L&ti5E=Xr(A~+iV{tpaT!LkduBrI&j!0zjylBq9m@|nn|i6;4j z^Ck~IBo&VI)(~Eza4=MNewOGl-g#rl%qDeGB5_E{92=sHEu4C5EzxMKbMb%DNQxbj zT79J?Tg+?cW}?va!KGwZU_g~5O&){WaM;V_hLGmd(ImMUoZQY}L`3jKoLfY}x+|~g zyPlq?E8Uqd4$kOUIl%`ap~3GRWA~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/draw_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/draw_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48b3a38c7be063e3156a2582cbe67094160d1601 GIT binary patch literal 41041 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 F{x1iTfg1n- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/fastevent_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/fastevent_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7afb85f1ea97e8b257bf2b611cea6f3447aee304 GIT binary patch literal 188 zcmZ?b<>g`k0*knvaeP4fF^B^Lj6jA15EpX*iFAf2h7^Wi22DmkO~xpW`1q2<^y2vV zl?+87Wnki0l(SV#XmM&$aZGrAR!M4hjAKE8OJYf4j8A@YVopp*YHmSHL1l7AVo|Pc zL1J=tVtQs?I#47%F*g-Pm82Gz6vw0`7MG-!rRJ4@t;vOer2|-{0mueZ?_~{F3DtE(=XkgKKJ&y4}YD@c?6!%U;Oi8?Fu3P z;$-reFn9!S@&X!8IE{&qJ&S3Z`Hbo{!#7~fh>f=Cn{CUt)VdklZO3;g`Ic~t+ph_? zBhqpQhM$Q%?(8w)M`XA(A|Oq-NZCDsGf1^e(;FhJM?t;Y;Z51>c7jeM^{@yU<9|qClN1*^Km`N1x{!K&{R^RxKzo}{%a`OcY9%dFKjeB4OqdmCY=QENo{KA0Oyt7L24zDeA-)rV-g!0LOtrz z!|QWYuPDj+2FSzCQv>j^!iI2QUAWMs=6=5^%T(Y=N-N#u@Hbb2(i`2EodV1fv?^hT zH|If^2+p8D^QmiCgMlPNsxD#NACV!0HDg3Z6v?cw!qhg;z=qTd6R@q^7X3((FTgul zfHZ?axRI^Wl!A=i`0n3|@uP7@D&{vf*vmGP&;C z3o%Wkr;v~!$W?XcRT#Wlmk@Y38?X)XeD#6{~<&T!m(;4BqkE5m*@+=x`msftPiT5CWsgGk7Q5y}yvV z$j5o)6*pn~;jK_K`fcE9>3*r*Ph{zrsB|a!qy$w0^yN$979Orb9cEa?aq%9GR9-3J z2xEv?!v+;hGuz;Mn^-;wRc8d_Bv5wEDLsFuCA zF*f@Csl~?;Ln!NEp`s0^QhGtf3_Lgp^hxl$jvZjGRmei%hU*vdX1sAqV2mMXHRX+X z9B56ZoQJ4E#mBI^Fd=q%S5-Yhuix%S6Ih9f%h+I{BjCRYBG$3_5SzQ$VD=K9 zVsjsxQv#?FvOplgvBpX;9J$Q3T+?-28`>QFec*a-QOTg2w!>y82+CRC?L+;A^zpCi z61IYqq@w7nZcw?pjsXT9gSz{g`k0*knvaeP4fF^B^Lj6jA15EpX*iFAf2h7^Wi22DmkO~xpW`1q2<^y2vV zl?+87Wnki0sIyf}XmM&$aZGrAR!M4hjAKE8OJYf4j8A@YVopp*YHmSHL1l7AVo|Pc zL1J=tVtQs?I#47%F*g-Pm82Gz6vw3H=aqnM&?~6C#bJ}1pHiBWY6r6EGY~TX0Lp|i At^fc4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/font_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/font_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cb5a9364df406c8e413d42dab2e8fe1765f7d02 GIT binary patch literal 15949 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/freetype_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/freetype_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcec118a8d24b78d0e3116ee948ceea8855d9e49 GIT binary patch literal 365 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/image__save_gl_surface_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/image__save_gl_surface_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60bbd4c0afbdfe0308093f1af993d7bbc000cc89 GIT binary patch literal 1326 zcmb7E&2Aev5GJ`lTCF9gQJeOXgOHm7JJ%FJQ6#n;!+>BHv7G>f5MnD*YfAeUlCmp9 z0SY7!A{~3|r9fYWrvg3o6?*D$B^5>vMLGayhcmo2Al_9P>@M?JjO`P2uUmjxF{;AJS#q_K>+zrsA25+1I|G2#s# zeMCGGc+&jfeZVvpJG?n1Y78e@D+H17IqJoK!F}kohizN{=O}a%{>_4ilkGh|n8oBseA|O16rN06u zkgJRmjyd^=sK-6X$G5HH0XxZ)RGcT*VuZob5#WU!Mu)KUZ@>(i;3aW&)RM=s@l9}m zR^&adHDPT7Tvq5kG0jQ5+*uG#!0v&)wQMi&!dnrH7HGL!+wZ|1uP{VxF28WHlQ!qT z^Z%V&-d~V9g3Gg0? z8(uDQ$#77Pl5BV(@@iPkM^}l;_p4+yO;TB;pm7CnKMpB9tP^Ex z4Ablr80YqJ{R-AjHO@Dsnre0<%@y0izeZlS+$cT-hJqM(a7-eyi+4$f#NPHBbGivf>J? zm?r8-^WMy8-psq2&8CdvWc9szC;r(syNIZ`pu{5r%Oo?*@QO=5u#mzC5bLO%_(NbH zv57u8r;U3ykAF$Q?%wuYXLSvWqShAXqE8Cjv>xOEZl0ZQb3n|-(R@#)Sr)X#ER)G7 z>m%&2pVY0{RDgW~uK^nK#e71?2l#uuK2=KukLsyi2PoC0b2mC@b=&5;QV&o&<+}Vu r`})}FywtX6EKRnqb`$^us=?x5VBxwxJsZECb9#j-K`c_9@+toZ0})tz literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/image_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/image_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abd277431cad6208f0c89ec4c04f069b674f8c33 GIT binary patch literal 14430 zcmds8TaX;rS?=5P^vur8j#jIiE!z`Wc07)?wqzR|BaCF(5l-0~MN*=qku%Kh>Dist z+;qCv+8t)V<#n(f;@sc?UQ)ZzW^c(VYUok zKTY3M@0M?=r|sM7>G%$wRx8tXeYc(Uv!<@^`JO7zCC|Ki+O4T}!7sFnez9HhOQ`FJ z%&Ue!ebErE$i8ZbY+$dHH*EhvFeAJhmi$a$Zyww-P}96(RCC*ymoZN??|D z|NWIH2&1r4uPilR3ObcWvlUdLZY2zYO0!XkmV-*WzSLZ-EC*{yMT^TpIG3;BpENP6 zZIY@JJ2I$?*lq=#IHSHya`GrJ8*xr`P(uf?BkEB-Hk)5EUAKiT z96Z4T!o@QqvckjD6*-Z|Gb^S<0Z&g9MG4QGm=^Hw}Q%Iy;Es*>q4=c-rWl1p`#g%%+{aQ*)^5D(C)>ST&P-#2NkJ0 z+noJ2ebod;;?QZ0R1rWn7m?f(KzAT&l zb?89wts}<39ymvgC2N@BUXpd+G_PAjcbJVV>?hRNmi5^aLoaexGQz_jnE6e6m>cA< zyWT+U9ux(1?`7j-MwDIgHgkh4_#uxy&JXgNVEQd6oMe}EP7yhZOVTmtRMR~*e>)WIo~OWn2l~(N#eek*)N|!lGg_`Jc3WLp zd8yu74Z=#ZqghjSdx5M#A9XrGE75~wPjKH~VlT$*C=cVc>S!JLcWKc?t}gl(i*)XG z2kGrKl2=GR4bpe!XfMpz4ObhD=2~psTG*zExQe_?z13T;!^Dh-MLLU8l`+a^#wcGE z9%M!-_9AFks{1(Gz7g^zwz^^LHUvJhBdHH!_nK@*fs8Y^)bl9&zLNzGE%0G{fauuelbq;?j}~g3kE8u+Ul^zZFrsp1%51s!gpfWqsW* zG-@IU7iF^-btPt~OsN($^Ome|7BnXlqBb>>n@jT-A4F035QyP8rv7uyyj8YJkhsG( zB~Sf94iAsgR{zfZBoRHPg2+Wm1@TF|L=eRd2xDZfP{g#YhByjKG5L;sFuAQoOW0sZ zr+@F>EVmNIbY34vV}}{NIuHf$3UvK+6}c_Z@pF@ymWCM z4MGpZa6IUwg1P@Xpmw?rMKoY5u19!WDI_2*qm7klTW=5(*>Au+yl&0{N0Bz5tX?x- zGaHt&s2;G24O?q&SXis<2J-RlCGWZ9-4vcG&!^@39coAvH|&PB1l1SORMBpiw(MbM z?fAd}7Mj&+Z;;t^2HAm2Wpwj1*NiB$;?h#TX+r%NE7?sby@AJ4^_D~09OkqQALd`j z7u;bCr`DcSeV$4BbfF5T22%}d%Uqcn7ND>SgFIAdaR8OIVIqz1Q6v5XcKjfAdbS@| zuzHo?=4ulPCg?;&T+J|C4J!AZIeofvD$zcPqN#+p>b)M2PhJ5pDx4SUH-ZXm46qsy z+LdRZ&0uiqi?F3iZ?)^;jj$qvo(w|OKWfRPg-RO&D%UHGt^}4#dy||AgtfA;uKMHT zTFnJnm+Nzts|o_LyE=wz*B6(YouCqQL=#q91dw}y5ypKfL}dns{fG9F>nrt_0(|t`*%onU_|#m|G`6uSN~OjbrM+SYN-Izr zd;4YdxP1;p9sz->hBQ`9S;b2#82n5Zzbp8KCqZbb!JDt2HhTJjX9;Q;Af*QPCJcgY#pjat%1~cSYcm2 zjb8k$-n3BZBp(Ne#VF1w?v>P}zK7+kDHuhi6uaF2*WB%gOG`^C*@IU@5Ji z?B$Ed4etjrvSrsX%ej(WhQ2SGN9_{$pzHv3nFZUkJ-+Ru=aRnC?Id1H^*z+uZNQ6L zD+sqN;ZpxV>#_D-!iT{LvNTH=7&?zI#W?0Dh{9

      sx%Y%*^I$|mzhuxv6<0W)Z-(jdE1TA2?2 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 CUDQ_q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/joystick_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/joystick_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37a5b5b43818ef93759e635381bd6c7c269d1518 GIT binary patch literal 1306 zcmcIkUyIW~5T8xbcH3)fulgVeDyRUDuwD{(I zkn_XTo=Cuh=2uUM%Z=)%nGPUg>VW_R+U(Wn8gXUE@;zt#c1)1g=nZVr(W zVhR)s!G%|#EM=dAvNep@C)>49 z+#Dh$w~%RYnF7~ROj+mP+R8>RCuz#?8|X>w#dH5u zn#q$``eQi^rbE;W_V z_3aSIxZkN5jt-_ujQ%x-Ce<{EHHqCIMsvBw@^`$0y1PgT`E$lwe22FTX=y$tGMEa{ xDZ6}zZK3&dIX%ao#L1=+$Sw2SnM1~F;qz>iBjerWbRE#YWSPin-)VO_`vryNAx8iJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/key_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/key_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..149f4dbb66a98d7f61fbd654ea34497fa05daeef GIT binary patch literal 2318 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 YXu^Cy_49D^+jHiB!h3&vZmg33fBax)E&u=k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/midi_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/midi_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d223bce03b7ef0b9a90c38ae87d77a1ae170c7b6 GIT binary patch literal 198 zcmZ?b<>g`k0*knvaneBgF^B^Lj6jA15Ep}#q%fp2Mlqx?1~X_f-Qv#7D@iR%OfJbR zOZC%ajN*uoFG)-hR3>L67Uk*|BqnDkrf24*14Yskb5mhdNosLPaZGMzN+#F_y@JYH95%W6 PDWy57b|CkC24V&PS+h8m literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/midi_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/midi_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dd5f60d45cd267a373140483d20d99dc4a0657e GIT binary patch literal 11515 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/mixer_music_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/mixer_music_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b1b95350e7a92e9faa63bc7574a5f2d4405b981 GIT binary patch literal 4907 zcmb_gNsk-H6|U-y#pW`rMkC3VXlrpON0Y@_9K|tgj{-wLq{NmCDGkP*9#)YG&zG&2m@@Q->d4bSN+xd z-m8TlR4O)s>+Mhf`str*gnW*blgog@dvGT$5S(!86KAZcLseaKG|-x_2Zm$N@jKHo z;hFARLBS~m%wa*%DN^zw;RZLK6K)EvYai=QNtC&@r^y|mjVdn)Skp(OUideBi#)8; ztSp{+LF@}R_R`(Dp4ndF_QFmx;v!>{f}5?hI=)EyNh$(Yg!rp5{OUf>LLffuE^b)_sFN0p@SNJQSSNN;^D(F>yjn_c0@z?n4px60zegpIc zev{t0tGr+DgqZ4*gaJAm_lRpqy0;?|@+jkqEBtj;QCs8*Q zdyV(w_@0+~jh{qK&u=^yLEMP@&0S9hcVe%(=e0Xw8=hdlCn^PCNke_Z4G^!3PqyNI zW+x*3B;NMDB&i@!L`?L-weyCyHEsKqMkx!>r(_^9W50(3lo;b`cwCl@?LZp zDm1I`XpBZ1ynZg4Q_ar@^a^xx;&x8$SjF@nV41@+V#8qkNC7KSEhD`nkc*B+II<_k(mUbC>azxjl42BB9R zl!vL;PVTB$7-j~Ccyjb0ek;?Xc01D#y@Nq%H|izA^`otu$(OV-&>D@0^|HhO$+RfR z44eisqZ@U?Oix6d6{LuLuPG$vxHM5ri8s}!GQ*ENUN2-uBK%fn<9FRwh#635MKbWx zB%>{fzICh~n6$#o+EMy!v=lLd0iDN@hH2Veb4uaRcm}<%SoIwcoDK@S_+(K0YEJlc!{V zBj@Hef~(=kAdzdzZ?%?;f*Q`Ocl^$ts6{(n(M*#qiCH4oP^^GB#hFBxAZr;+=_ky| z3)mL@D=(thL~#iP@|77;EW#;k@-n`;0-|1!=w^8p#j7Z;p->&wpyU`x(pip{b2qzV z#NULb31TK1&;vA0sM5-GaP$8YHR&Pe3o{9mRPpsEC?H=x0lsJo`E-n#rKNfoa%Bii z0Uvr^Gm)MCjno?I+yY*#BNM!@jhRUGQDLZKzC0n}RReNp&z6$Hd=B|k9NCa}^w;#~ zB-EagA%#qXD0rb!GN`5HZlzltEsd@7nlbK+1DcbbpTgH5582>~;yR4NJMTZ*zJI?q zSw?G^TkuU-confdjLa`S8~y9|pKW1omh;?%T1F2Cm(pFKjA~6U45PHR13>~@3SM8% ztYo*Bc6^DmmCE02$5FDML$O~LBsr9c$>OoJJT9VMdX!@+&c!k@SrC?)IDvJ!|C=1h+T1w7_KQb> zOWN;p6y>=nu>FEite=jNgUIg%;*U8NHmJ|Z91N4O)q)UhOcB905spe+9EdReOOB~B zcykV>S-S34N#r%nubUSM!eV02wy{S`T6^ndh5gHQkf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/mixer_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/mixer_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25b3d6831a8ee72a49fe2f54a5d98bc6511c0196 GIT binary patch literal 306 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 UfQHngAAv#$A7BRp8o1npzZTAgUjP6A literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/scrap_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/scrap_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4e621618117ebdcaac4e8f1a119d423e4ea017 GIT binary patch literal 9352 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 XfHt-PX-{U3&)u8*N#UY>#n%516IV@P literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/sndarray_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/sndarray_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cb4601c8f24b2cd84af79c8c774a4be301e52fd GIT binary patch literal 371 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/sprite_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/sprite_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f447b51e707b605ce41fdee761b23126e66baa5 GIT binary patch literal 33782 zcmdUYe{dYvec$cg-rnMHID#Mqf)p*CC`u+|iIyl?mK{o_NQ$yt3UVZ>bk3B|N9+MS z@bH6s2N66U>|~_aiDM~tqQ;5qxWLp&YS(ESCuyBdlQii#b*EFeO@F03)5dOGx9DG; zwv$QSChF(&eQ$r=?Hxdg@ua}qyWO|%y?yWd`}=)A?$p>=A%nk1KJ*(Odf-c$%pdV4 z_{-tqBtES_LE>gyqnW9wZ=+)1-fS96X2mozPiEY#YrULtt$JoL`%<=IAt&eB$gy=! z4mo+(L5`zyY~+l%1>_W7GAnu9jk-nL73+B^VO1RDjkzV{mBPFcizLhaB z;^#6m2e&c$%CQj)9=3ce5>xYE?!t!Y}c<` ze0+8FOs!qJcy48`*1UMWzO;IA_4?f9nzwY{YHjXHZK1KefSd)qB=~CM-K~qN_f_5; zTfOdO@rp6_+(hCSa-SF)^G~wC7m-9mbIq4Cm8?Q|#ZqXl

      r%wnAwouaH@B6ap(F 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/surface_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/surface_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2932029d628efdb72f865e1f9322bbff4e9b10ce GIT binary patch literal 66765 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 E8{BMflmGw# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/surfarray_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/surfarray_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1d03e4ab957c97204eec0991544df6a630bcf61 GIT binary patch literal 18171 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/surflock_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/surflock_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12961a0a3f5304a57c510793024d6098bf60ab26 GIT binary patch literal 2840 zcmbVO&2A$_5bmFu@z`PfynI*dDsa zVjVf`A>lpjBQJo&g~#B~S5A2aPE_^$*}(}}W;E5+-PKiHRsB`ZSDTv+0?+5izaLMw z3Hb{<#bX2W6h3tfBqSk?iI=t1qo&V1W?Js?kO?-o7G%IYTadXU?2s?mwLOm(+7bJ#+?4dLY$U5DIz^NxOCpHpsrV4yFgw^GC@vneM7VKiM6O#y^dAqo5y8 zr0Ahg@i1VX!lym~A_#5?wnIa9MPNHTw4ep!p#!ZQ) zN2s(%K?gpl6#d?VPyGfYC370m1-+m%I%l}w8JTn7!Pk&2SlPE1WJV)uM(!aAve{}n zckZqArX)mo*?wqYKP2Fyz29cn=!mp{be{hTA=XYZJq?CJ*K+T*6@&kJBT!1n^qU_i zL9836BK2`tgt}hvN;{Jg4z`)Ll!znER3wdhB!3_6J?VZAI#lrn-)d*-#TKsrP{p z+F&l-qT7bHmiY6X8+mj`0 zU+Qqe&543NVIR<1o^TvtM#9d|Aof8bbWFeU@K#MTmLs6jRarB-K%&4?;s0&g3d#T0 zRrs3ugg#at7$0*FDoxe=+j;mldn%B9tAF>2Rv}|5Kn*H@0ly(_>l#a(d;sS)HtRul2 zMQ#9TTXGZmcYt^{>WVzBqR*BLm zIfhz>Qa39DP!_hbvQQR??UIAJe6|{E!Pxo7Ysm^y%CxT!AlDrQcKwQ^EA=8Uv!%g5lL z|60V)qztAvGOT$lM$2i|ERY@#n$iN>G3j23S(LV!UQm&yLe?AO0 zp_%t!6k${n=13}?Q^H*7N)LKZ`Gbt~Rd$dal2%q`hK|h2;FO$D7RVWygFQ1cFALD; z7J}+-U#Q9`l_rTP_9InMCazJ4gdg?}v~6gn0Op7chy_c)m6nS%@#-Rs zus15Iev{`|E4top$yZK@x;%~-XnTfN?nh(+~nw@?s{L$uYnivftKniLzyS*drBEXQ5hwKHDRO2mqbC=^B+jB5}pp@)wyF)Cf>_77Aw z2o9t*>TGGICIi!C>HPe#6UHOdCV;gusE0R!ns#ED9ijKb&f$Ey8?UuRZEatznO4{< zO~4{gBy4qg00T$|5|LvH`q0=pqD^<;4MBYAw7emO{!ZPN}2gvIuy~_LpY%5vHXZRQi24w7D2NtX!HuE zMK@I$VKZN#??tKwOLcTZ^RUlgA`lwT96elxbMV;nk}6GapOE@Q7JiG`m33Eavx;2^OdZ!AxtEB!S(>sl@rl7RCLycC=#InLYm*@AI_ z^Dli7r7JoMAvD%s5&)|hub*YGir& z5e#VH2JVU<_g`k0*knvagsp#F^B^Lj6jA15Ep}#RIn5>g)^iu1T$zd`mJOr0!bo>Ut!Kx zF`>n&Ma41U`B^2Y*)fg<1ulsti7`I;$%#2JA*s0qF$I;$8Hq)?x&?{J*@@|ydFeor p^u*j$7*Tv8kZBICh?UP0w84x8Nkl+v73JCJ?FOhAH(5diyzFZ%!h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/threads_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/threads_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e54fe5efc2991cc2292f7c470b5bab65c5f23d1 GIT binary patch literal 5621 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 HzRUjujVTv2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/time_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/time_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f52bfc17fafcc8f2c1e3eb1c89719c9c7e6c642 GIT binary patch literal 2178 zcmb_dOK;Oa5Z<-(aFeEwl(xKycvOl6J#a#(LZt<9phQTdLb9S-Tkp0cacpA_+?5-3FIRfp`#`lfiR|)xn zAH9}>$ue~H8U!btI>hXb)TDwow1#f#F9_GTen7Y`NF%kcn`zLbcp5b6V@*b6d8Vn! zH9-!IBSIn48&b~xgs7xqqwF;eCd<&(5(q&|%899Q%C!Sx>Rjh37$G*#z?kM)Zort~ zV>}0Amgo66j0P`2^ogjj>Uegu+VMqIsKBNW5gTrS2U~@%=0F5wpS-7gMdd6bkXlb(>Ss09-zAC8hC0vKG8B-cxxa< zi)Xx(q+#+fadFbdVFKwQ@t-7+Dq1PiD7D4vPMJy!9v`YJvhWEwJnqG)tZflkTfUkA zwZe!be+I>A-~T`%#~|Vm5VM0IB-_PY-RlE#=TtfdfE@de2uyJh3?g}$AQ=z4jO%fC z@vQTRU`(7u4(fLEWddP7ygn=$=s2S7FAr{SZMId%ay-x9Nr23S3l{-7SyCyFMTTX$ zP!X0D1i3MmvXj^RWpTz}rSk+IY*#3#t(_}+)THA63c KAbN4dpnm{Ko#}7@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/touch_tags.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/touch_tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82cdec928f9319332e2ee05c278e209a3f3ac882 GIT binary patch literal 199 zcmZ?b<>g`k0*knvaWX*qF^B^Lj6jA15Ep}#q%fp2Mlqx?1~X_fMR5na_!!1#rsw4s zrTS?yMsdW)mn5ba$H%W^C<5sM6TiZotztrpQ;UjY!t=9AQnOrX;^KIRk8kUP0w84x8Nk Pl+v73JCIeMftUdR^g%c7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/touch_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/touch_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5aa7168a53cfb9f24bc68c972a4d72e069c4448c GIT binary patch literal 1971 zcmb7F&5q+l5bkc|u!(X{8*P11E$K0%j2cp&VcqBr96Wa`#M}IJURD zvnUbbvhyIBBNy(xN?$qg3UFAe+RiW81D3kn-Bqsss_N_Vmz_?V!1M8oKVJOq67nZ5 zRu8Pn=P=X&1SgzkB&^;vq_Acgn>wLGiEx(gJ!mFw=zUGN!`(Z=T|vf;*G||JKKCX} zek;hbbx$bx`GNEse}PXj=u_kAVwQ{&T&|w=!N0T4KA`RL6RYj;2LSZcw5}20wNN^t zH9~wd7*{aVF$hh@bjfUV1U{mJzGE8Y{5GBn)8wftvv_XYG*2}|>?E1`jYuE9`}@bM zPlnHxkZSl-G1g)-{Gu$M#X25-S0r&ZycW}PSk9ACETUHmkk*gx*at%lQsa2YhX@U`aW>r@(P!0UJmpO25Y2M!c0L zNE)(cA8FSj-I$%PfwINL9?*@|4jwFw#q$&#W}ZV}amNl;*GE zEai_dDr6C%r*!ebUR+qv{Vxtjcm^Jj8Za1U{Xcnk_IOgewE?^Z^@c08@nZyAU!Fr; zsm%@}+|)p`F|@CB1>CV`ceZOFPvIzAh<-yNMdiCF@ND@Ig}rzf^kM80+42NNo!b+- z0}7dFiGglx3ucR_v6=v(F4oV!>5`vUGT!Tod_ve zW$p1+fe)At`p3qPq8$2J6q$AuO$$EDa2`a_%UPV&nxh1J*;MFJ!6p8)B(?^L zoyGVwXspP$u%RYt`OS^#j$#$ryIWm2`2dYEL-IWo7brF@%g(TGNxaWEQOI(i1#aN_ z&bjNmIII@YPUAF>qJCQc4$Rn=&UUjw+S7;Y8%mv{q=i%t$< ZF#e}i4nD)0DGbx6J`J3}Iep^Oe*p}}#$5ma literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/transform_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/transform_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08cd9f9283f8b2c3e3b18f4b026ead42e51b00c8 GIT binary patch literal 22142 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 Hy5|1{$Vh5X literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/__pycache__/version_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/__pycache__/version_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5e2f3b4131fb355efe3fb96d870f2154824ebb7 GIT binary patch literal 1368 zcma)6&2Aev5GHrIf07aeZVNO`4>}ZR)F4LDQ~yxJwS&|_s-(7R2OA{>yQHLD?_bDO z8w;zGbMFh}ARY4vc@LVjzUY=3nHAvU3kJ@;tu#* zT88~OI>BMU33zvO`#?w)7x_S_YS!C7ipw(2$K5|f#HLDg{}SDZ<#|zcM{&-(@7VDf zbqD4E#x@M)0?IMBQk3C2hA*(^z&E#H5WrDt&7InT9FQeW$lPsor_sGecN^WWoXS1H zf6wN@Gg${a=y5V{)!+%TGppUYb%N*Zx-DmwSGN~F_m&tCs|Fshcu{+AEnZx(uxrv- z3~K+a#o&Skc{(^mhj3%Rp*{2v)o2maR*jPu$5+wP!YjmX5bqp98pK~A96@G-zBDQ7 zVeS37%JAuHXtOW4fJ};^y7Ax+{dMc^{XKecdvAaDejlLgkG{V7-Qyd*_pEmN|HJCR z)?oXW5BNGYVVqhfmUif_sz=(e)Rq+5i;Ap_Q=wfYn2aWx6s5>@P>$(DFfOFFu91xI%<4|aBxC1mK5?#jq|lyvMQQL517L%jRh6Y zO1h#2#28*c8vApI#v@Hq$eqU7OC&eI(Z3J3zaRb%A*tbEkyPSnxK)-rtYX7^Ma0tK zKxE~xJdP$zW;aU~9kDSKHz4K-t)~hqUk%SLiJH}Bd91G)g+dzE8&Q#~SXCmAj!nI* zZ$KcsgGtkU+-Z6Xx3CYLpv&*gpW_Yavo8N(;OO^S+NU&!Kq=KNO0$AbQ=@k% zHTgf=@uzuQ89$+`;PLK`v{figAbAt*#%ct2E87sM{MZPSv~%JkvoxjQ!%*hu<>M>3 zK@54u;+)c6Ag>y`PmTBtgeFN5=Z)9U9{}|>gDWs@') if is_lil_endian else ('>', '<') + buftools = self.buftools + Importer = buftools.Importer + a = BufferProxy({'typestr': '|u4', + 'shape': (10, 2), + 'data': (9, False)}) # 9? No data accesses. + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 4) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, 9) + b = Importer(a, buftools.PyBUF_WRITABLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 4) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, 9) + b = Importer(a, buftools.PyBUF_ND) + self.assertEqual(b.ndim, 2) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 4) + self.assertEqual(b.shape, (10, 2)) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, 9) + a = BufferProxy({'typestr': fsys + 'i2', + 'shape': (5, 10), + 'strides': (24, 2), + 'data': (42, False)}) # 42? No data accesses. + b = Importer(a, buftools.PyBUF_STRIDES) + self.assertEqual(b.ndim, 2) + self.assertTrue(b.format is None) + self.assertEqual(b.len, 100) + self.assertEqual(b.itemsize, 2) + self.assertEqual(b.shape, (5, 10)) + self.assertEqual(b.strides, (24, 2)) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, 42) + b = Importer(a, buftools.PyBUF_FULL_RO) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, '=h') + self.assertEqual(b.len, 100) + self.assertEqual(b.itemsize, 2) + self.assertEqual(b.shape, (5, 10)) + self.assertEqual(b.strides, (24, 2)) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, 42) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_CONTIG) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_CONTIG) + a = BufferProxy({'typestr': frev + 'i2', + 'shape': (3, 5, 10), + 'strides': (120, 24, 2), + 'data': (1000000, True)}) # 1000000? No data accesses. + b = Importer(a, buftools.PyBUF_FULL_RO) + self.assertEqual(b.ndim, 3) + self.assertEqual(b.format, frev + 'h') + self.assertEqual(b.len, 300) + self.assertEqual(b.itemsize, 2) + self.assertEqual(b.shape, (3, 5, 10)) + self.assertEqual(b.strides, (120, 24, 2)) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.readonly) + self.assertEqual(b.buf, 1000000) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_FULL) + + @unittest.skipIf(IS_PYPY or (not pygame.HAVE_NEWBUF), 'newbuf with ctypes') + def test_PgObject_AsBuffer_PyBUF_flags(self): + from pygame.bufferproxy import BufferProxy + import ctypes + + is_lil_endian = pygame.get_sdl_byteorder() == pygame.LIL_ENDIAN + fsys, frev = ('<', '>') if is_lil_endian else ('>', '<') + buftools = self.buftools + Importer = buftools.Importer + e = arrinter.Exporter((10, 2), typekind='f', + itemsize=ctypes.sizeof(ctypes.c_double)) + a = BufferProxy(e) + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, e.len) + self.assertEqual(b.itemsize, e.itemsize) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, e.data) + b = Importer(a, buftools.PyBUF_WRITABLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, e.len) + self.assertEqual(b.itemsize, e.itemsize) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, e.data) + b = Importer(a, buftools.PyBUF_ND) + self.assertEqual(b.ndim, e.nd) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, e.itemsize) + self.assertEqual(b.shape, e.shape) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, e.data) + e = arrinter.Exporter((5, 10), typekind='i', itemsize=2, + strides=(24, 2)) + a = BufferProxy(e) + b = Importer(a, buftools.PyBUF_STRIDES) + self.assertEqual(b.ndim, e.nd) + self.assertTrue(b.format is None) + self.assertEqual(b.len, e.len) + self.assertEqual(b.itemsize, e.itemsize) + self.assertEqual(b.shape, e.shape) + self.assertEqual(b.strides, e.strides) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, e.data) + b = Importer(a, buftools.PyBUF_FULL_RO) + self.assertEqual(b.ndim, e.nd) + self.assertEqual(b.format, '=h') + self.assertEqual(b.len, e.len) + self.assertEqual(b.itemsize, e.itemsize) + self.assertEqual(b.shape, e.shape) + self.assertEqual(b.strides, e.strides) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, e.data) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_WRITABLE) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_WRITABLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_CONTIG) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_CONTIG) + e = arrinter.Exporter((3, 5, 10), typekind='i', itemsize=2, + strides=(120, 24, 2), + flags=arrinter.PAI_ALIGNED) + a = BufferProxy(e) + b = Importer(a, buftools.PyBUF_FULL_RO) + self.assertEqual(b.ndim, e.nd) + self.assertEqual(b.format, frev + 'h') + self.assertEqual(b.len, e.len) + self.assertEqual(b.itemsize, e.itemsize) + self.assertEqual(b.shape, e.shape) + self.assertEqual(b.strides, e.strides) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.readonly) + self.assertEqual(b.buf, e.data) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_FULL) + + def test_PgObject_GetBuffer_exception(self): + # For consistency with surfarray + from pygame.bufferproxy import BufferProxy + + bp = BufferProxy(1) + self.assertRaises(ValueError, getattr, bp, 'length') + + def not_init_assertions(self): + self.assertFalse(pygame.get_init(), "pygame shouldn't be initialized") + self.assertFalse(pygame.display.get_init(), + "display shouldn't be initialized") + + if 'pygame.mixer' in sys.modules: + self.assertFalse(pygame.mixer.get_init(), + "mixer shouldn't be initialized") + + if 'pygame.font' in sys.modules: + self.assertFalse(pygame.font.get_init(), + "init shouldn't be initialized") + + ## !!! TODO : Remove when scrap works for OS X + import platform + if platform.system().startswith('Darwin'): + return + + try: + self.assertRaises(pygame.error, pygame.scrap.get) + except NotImplementedError: + # Scrap is optional. + pass + + # pygame.cdrom + # pygame.joystick + + def init_assertions(self): + self.assertTrue(pygame.get_init()) + self.assertTrue(pygame.display.get_init()) + + if 'pygame.mixer' in sys.modules: + self.assertTrue(pygame.mixer.get_init()) + + if 'pygame.font' in sys.modules: + self.assertTrue(pygame.font.get_init()) + + def test_quit__and_init(self): + # __doc__ (as of 2008-06-25) for pygame.base.quit: + + # pygame.quit(): return None + # uninitialize all pygame modules + + # Make sure everything is not init + self.not_init_assertions() + + # Initiate it + pygame.init() + + # Check + self.init_assertions() + + # Quit + pygame.quit() + + # All modules have quit + self.not_init_assertions() + + def test_register_quit(self): + """Ensure that a registered function is called on quit()""" + self.assertFalse(quit_hook_ran) + + pygame.init() + pygame.register_quit(quit_hook) + pygame.quit() + + self.assertTrue(quit_hook_ran) + + def test_get_error(self): + + # __doc__ (as of 2008-08-02) for pygame.base.get_error: + + # pygame.get_error(): return errorstr + # get the current error message + # + # SDL maintains an internal error message. This message will usually + # be given to you when pygame.error is raised. You will rarely need to + # call this function. + # + + # The first error could be all sorts of nonsense or empty. + e = pygame.get_error() + pygame.set_error("hi") + self.assertEqual(pygame.get_error(), "hi") + pygame.set_error("") + self.assertEqual(pygame.get_error(), "") + + + + def test_set_error(self): + + # The first error could be all sorts of nonsense or empty. + e = pygame.get_error() + pygame.set_error("hi") + self.assertEqual(pygame.get_error(), "hi") + pygame.set_error("") + self.assertEqual(pygame.get_error(), "") + + def test_unicode_error(self): + if sys.version_info.major > 2: + pygame.set_error(u'你好') + self.assertEqual(u'你好', pygame.get_error()) + else: + # no unicode objects for now + pygame.set_error(u'你好') + encstr = u'你好'.encode('utf8') + self.assertEqual(encstr, pygame.get_error()) + + def test_init(self): + + # __doc__ (as of 2008-08-02) for pygame.base.init: + + # pygame.init(): return (numpass, numfail) + # initialize all imported pygame modules + # + # Initialize all imported Pygame modules. No exceptions will be raised + # if a module fails, but the total number if successful and failed + # inits will be returned as a tuple. You can always initialize + # individual modules manually, but pygame.init is a convenient way to + # get everything started. The init() functions for individual modules + # will raise exceptions when they fail. + # + # You may want to initalise the different modules seperately to speed + # up your program or to not use things your game does not. + # + # It is safe to call this init() more than once: repeated calls will + # have no effect. This is true even if you have pygame.quit() all the + # modules. + # + + + + # Make sure everything is not init + self.not_init_assertions() + + # Initiate it + pygame.init() + + # Check + self.init_assertions() + + # Quit + pygame.quit() + + # All modules have quit + self.not_init_assertions() + + def test_get_init(self): + # Test if get_init() gets the init state. + self.assertFalse(pygame.get_init()) + + def test_get_init__after_init(self): + # Test if get_init() gets the init state after pygame.init() called. + pygame.init() + + self.assertTrue(pygame.get_init()) + + def test_get_init__after_quit(self): + # Test if get_init() gets the init state after pygame.quit() called. + pygame.init() + pygame.quit() + + self.assertFalse(pygame.get_init()) + + def todo_test_segfault(self): + + # __doc__ (as of 2008-08-02) for pygame.base.segfault: + + # crash + + self.fail() + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/blit_test.py b/venv/Lib/site-packages/pygame/tests/blit_test.py new file mode 100644 index 0000000..f551a68 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/blit_test.py @@ -0,0 +1,159 @@ +import unittest + +import pygame +from pygame.locals import * + +class BlitTest( unittest.TestCase ): + def test_SRCALPHA( self ): + """ SRCALPHA tests. + """ + #blend(s, 0, d) = d + s = pygame.Surface((1,1), SRCALPHA, 32) + s.fill((255, 255,255, 0)) + + d = pygame.Surface((1,1), SRCALPHA, 32) + d.fill((0, 0,255, 255)) + + s.blit(d, (0,0)) + self.assertEqual(s.get_at((0,0)), d.get_at((0,0)) ) + + #blend(s, 255, d) = s + s = pygame.Surface((1,1), SRCALPHA, 32) + s.fill((123, 0, 0, 255)) + s1 = pygame.Surface((1,1), SRCALPHA, 32) + s1.fill((123, 0, 0, 255)) + d = pygame.Surface((1,1), SRCALPHA, 32) + d.fill((10, 0,0, 0)) + s.blit(d, (0,0)) + self.assertEqual(s.get_at((0,0)), s1.get_at((0,0)) ) + + #TODO: these should be true too. + #blend(0, sA, 0) = 0 + #blend(255, sA, 255) = 255 + #blend(s, sA, d) <= 255 + + def test_BLEND( self ): + """ BLEND_ tests. + """ + + #test that it doesn't overflow, and that it is saturated. + s = pygame.Surface((1,1), SRCALPHA, 32) + s.fill((255, 255,255, 0)) + + d = pygame.Surface((1,1), SRCALPHA, 32) + d.fill((0, 0,255, 255)) + + s.blit(d, (0,0), None, BLEND_ADD) + + #print "d %s" % (d.get_at((0,0)),) + #print s.get_at((0,0)) + #self.assertEqual(s.get_at((0,0))[2], 255 ) + #self.assertEqual(s.get_at((0,0))[3], 0 ) + + + + s.blit(d, (0,0), None, BLEND_RGBA_ADD) + #print s.get_at((0,0)) + self.assertEqual(s.get_at((0,0))[3], 255 ) + + + # test adding works. + s.fill((20, 255,255, 0)) + d.fill((10, 0,255, 255)) + s.blit(d, (0,0), None, BLEND_ADD) + self.assertEqual(s.get_at((0,0))[2], 255 ) + + # test subbing works. + s.fill((20, 255,255, 0)) + d.fill((10, 0,255, 255)) + s.blit(d, (0,0), None, BLEND_SUB) + self.assertEqual(s.get_at((0,0))[0], 10 ) + + # no overflow in sub blend. + s.fill((20, 255,255, 0)) + d.fill((30, 0,255, 255)) + s.blit(d, (0,0), None, BLEND_SUB) + self.assertEqual(s.get_at((0,0))[0], 0 ) + + + def make_blit_list(self, num_surfs): + + blit_list = [] + for i in range(num_surfs): + dest = (i * 10, 0) + surf = pygame.Surface((10, 10), SRCALPHA, 32) + color = (i * 1, i * 1, i * 1) + surf.fill(color) + blit_list.append((surf, dest)) + return blit_list + + def test_blits(self): + + NUM_SURFS = 255 + PRINT_TIMING = 0 + dst = pygame.Surface((NUM_SURFS * 10, 10), SRCALPHA, 32) + dst.fill((230, 230, 230)) + blit_list = self.make_blit_list(NUM_SURFS) + + def blits(blit_list): + for surface, dest in blit_list: + dst.blit(surface, dest) + + from time import time + t0 = time() + results = blits(blit_list) + t1 = time() + if PRINT_TIMING: + print("python blits: %s" % (t1-t0)) + + dst.fill((230, 230, 230)) + t0 = time() + results = dst.blits(blit_list) + t1 = time() + if PRINT_TIMING: + print("Surface.blits :%s" % (t1-t0)) + + + # check if we blit all the different colors in the correct spots. + for i in range(NUM_SURFS): + color = (i * 1, i * 1, i * 1) + self.assertEqual(dst.get_at((i * 10, 0)), color) + self.assertEqual(dst.get_at(((i * 10) + 5, 5)), color) + + self.assertEqual(len(results), NUM_SURFS) + + t0 = time() + results = dst.blits(blit_list, doreturn = 0) + t1 = time() + if PRINT_TIMING: + print("Surface.blits doreturn=0: %s" % (t1-t0)) + self.assertEqual(results, None) + + + t0 = time() + results = dst.blits(((surf, dest) for surf, dest in blit_list)) + t1 = time() + if PRINT_TIMING: + print("Surface.blits generator: %s" % (t1-t0)) + + + def test_blits_not_sequence(self): + dst = pygame.Surface((100, 10), SRCALPHA, 32) + self.assertRaises(ValueError, dst.blits, None) + + def test_blits_wrong_length(self): + dst = pygame.Surface((100, 10), SRCALPHA, 32) + self.assertRaises(ValueError, dst.blits, [pygame.Surface((10, 10), SRCALPHA, 32)]) + + def test_blits_bad_surf_args(self): + dst = pygame.Surface((100, 10), SRCALPHA, 32) + self.assertRaises(TypeError, dst.blits, [(None, None)]) + + def test_blits_bad_dest(self): + dst = pygame.Surface((100, 10), SRCALPHA, 32) + self.assertRaises(TypeError, dst.blits, [(pygame.Surface((10, 10), SRCALPHA, 32), None)]) + + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/bufferproxy_test.py b/venv/Lib/site-packages/pygame/tests/bufferproxy_test.py new file mode 100644 index 0000000..7e1bcca --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/bufferproxy_test.py @@ -0,0 +1,483 @@ +import sys +import re +import weakref +import gc +import ctypes +import unittest + + +import pygame +from pygame.bufferproxy import BufferProxy +from pygame.compat import as_bytes + +try: + BufferError +except NameError: + from pygame import BufferError + + +class BufferProxyTest(unittest.TestCase): + view_keywords = {'shape': (5, 4, 3), + 'typestr': '|u1', + 'data': (0, True), + 'strides': (4, 20, 1)} + + def test_module_name(self): + self.assertEqual(pygame.bufferproxy.__name__, + "pygame.bufferproxy") + + def test_class_name(self): + self.assertEqual(BufferProxy.__name__, "BufferProxy") + + def test___array_struct___property(self): + kwds = self.view_keywords + v = BufferProxy(kwds) + d = pygame.get_array_interface(v) + self.assertEqual(len(d), 5) + self.assertEqual(d['version'], 3) + self.assertEqual(d['shape'], kwds['shape']) + self.assertEqual(d['typestr'], kwds['typestr']) + self.assertEqual(d['data'], kwds['data']) + self.assertEqual(d['strides'], kwds['strides']) + + def test___array_interface___property(self): + kwds = self.view_keywords + v = BufferProxy(kwds) + d = v.__array_interface__ + self.assertEqual(len(d), 5) + self.assertEqual(d['version'], 3) + self.assertEqual(d['shape'], kwds['shape']) + self.assertEqual(d['typestr'], kwds['typestr']) + self.assertEqual(d['data'], kwds['data']) + self.assertEqual(d['strides'], kwds['strides']) + + def test_parent_property(self): + kwds = dict(self.view_keywords) + p = [] + kwds['parent'] = p + v = BufferProxy(kwds) + + self.assertIs(v.parent, p) + + def test_before(self): + def callback(parent): + success.append(parent is p) + + class MyException(Exception): + pass + + def raise_exception(parent): + raise MyException("Just a test.") + + kwds = dict(self.view_keywords) + p = [] + kwds['parent'] = p + + # For array interface + success = [] + kwds['before'] = callback + v = BufferProxy(kwds) + self.assertEqual(len(success), 0) + d = v.__array_interface__ + self.assertEqual(len(success), 1) + self.assertTrue(success[0]) + d = v.__array_interface__ + self.assertEqual(len(success), 1) + d = v = None + gc.collect() + self.assertEqual(len(success), 1) + + # For array struct + success = [] + kwds['before'] = callback + v = BufferProxy(kwds) + self.assertEqual(len(success), 0) + c = v.__array_struct__ + self.assertEqual(len(success), 1) + self.assertTrue(success[0]) + c = v.__array_struct__ + self.assertEqual(len(success), 1) + c = v = None + gc.collect() + self.assertEqual(len(success), 1) + + # Callback raises an exception + kwds['before'] = raise_exception + v = BufferProxy(kwds) + self.assertRaises(MyException, lambda : v.__array_struct__) + + def test_after(self): + def callback(parent): + success.append(parent is p) + + kwds = dict(self.view_keywords) + p = [] + kwds['parent'] = p + + # For array interface + success = [] + kwds['after'] = callback + v = BufferProxy(kwds) + self.assertEqual(len(success), 0) + d = v.__array_interface__ + self.assertEqual(len(success), 0) + d = v.__array_interface__ + self.assertEqual(len(success), 0) + d = v = None + gc.collect() + self.assertEqual(len(success), 1) + self.assertTrue(success[0]) + + # For array struct + success = [] + kwds['after'] = callback + v = BufferProxy(kwds) + self.assertEqual(len(success), 0) + c = v.__array_struct__ + self.assertEqual(len(success), 0) + c = v.__array_struct__ + self.assertEqual(len(success), 0) + c = v = None + gc.collect() + self.assertEqual(len(success), 1) + self.assertTrue(success[0]) + + def test_attribute(self): + v = BufferProxy(self.view_keywords) + self.assertRaises(AttributeError, getattr, v, 'undefined') + v.undefined = 12; + self.assertEqual(v.undefined, 12) + del v.undefined + self.assertRaises(AttributeError, getattr, v, 'undefined') + + def test_weakref(self): + v = BufferProxy(self.view_keywords) + weak_v = weakref.ref(v) + + self.assertIs(weak_v(), v) + + v = None + gc.collect() + + self.assertIsNone(weak_v()) + + def test_gc(self): + """refcount agnostic check that contained objects are freed""" + def before_callback(parent): + return r[0] + def after_callback(parent): + return r[1] + class Obj(object): + pass + p = Obj() + a = Obj() + r = [Obj(), Obj()] + weak_p = weakref.ref(p) + weak_a = weakref.ref(a) + weak_r0 = weakref.ref(r[0]) + weak_r1 = weakref.ref(r[1]) + weak_before = weakref.ref(before_callback) + weak_after = weakref.ref(after_callback) + kwds = dict(self.view_keywords) + kwds['parent'] = p + kwds['before'] = before_callback + kwds['after'] = after_callback + v = BufferProxy(kwds) + v.some_attribute = a + weak_v = weakref.ref(v) + kwds = p = a = before_callback = after_callback = None + gc.collect() + self.assertTrue(weak_p() is not None) + self.assertTrue(weak_a() is not None) + self.assertTrue(weak_before() is not None) + self.assertTrue(weak_after() is not None) + v = None + [gc.collect() for x in range(4)] + self.assertTrue(weak_v() is None) + self.assertTrue(weak_p() is None) + self.assertTrue(weak_a() is None) + self.assertTrue(weak_before() is None) + self.assertTrue(weak_after() is None) + self.assertTrue(weak_r0() is not None) + self.assertTrue(weak_r1() is not None) + r = None + gc.collect() + self.assertTrue(weak_r0() is None) + self.assertTrue(weak_r1() is None) + + # Cycle removal + kwds = dict(self.view_keywords) + kwds['parent'] = [] + v = BufferProxy(kwds) + v.some_attribute = v + tracked = True + for o in gc.get_objects(): + if o is v: + break + else: + tracked = False + self.assertTrue(tracked) + kwds['parent'].append(v) + kwds = None + gc.collect() + n1 = len(gc.garbage) + v = None + gc.collect() + n2 = len(gc.garbage) + self.assertEqual(n2, n1) + + def test_c_api(self): + api = pygame.bufferproxy._PYGAME_C_API + api_type = type(pygame.base._PYGAME_C_API) + + self.assertIsInstance(api, api_type) + + def test_repr(self): + v = BufferProxy(self.view_keywords) + cname = BufferProxy.__name__ + oname, ovalue = re.findall(r"<([^)]+)\(([^)]+)\)>", repr(v))[0] + self.assertEqual(oname, cname) + self.assertEqual(v.length, int(ovalue)) + + def test_subclassing(self): + class MyBufferProxy(BufferProxy): + def __repr__(self): + return "*%s*" % (BufferProxy.__repr__(self),) + kwds = dict(self.view_keywords) + kwds['parent'] = 0 + v = MyBufferProxy(kwds) + self.assertEqual(v.parent, 0) + r = repr(v) + self.assertEqual(r[:2], '*<') + self.assertEqual(r[-2:], '>*') + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def NEWBUF_test_newbuf(self): + from ctypes import string_at + + from pygame.tests.test_utils import buftools + Exporter = buftools.Exporter + Importer = buftools.Importer + exp = Exporter((10,), 'B', readonly=True) + b = BufferProxy(exp) + self.assertEqual(b.length, exp.len) + self.assertEqual(b.raw, string_at(exp.buf, exp.len)) + d = b.__array_interface__ + try: + self.assertEqual(d['typestr'], '|u1') + self.assertEqual(d['shape'], exp.shape) + self.assertEqual(d['strides'], exp.strides) + self.assertEqual(d['data'], (exp.buf, True)) + finally: + d = None + exp = Exporter((3,), '=h') + b = BufferProxy(exp) + self.assertEqual(b.length, exp.len) + self.assertEqual(b.raw, string_at(exp.buf, exp.len)) + d = b.__array_interface__ + try: + lil_endian = pygame.get_sdl_byteorder() == pygame.LIL_ENDIAN + f = '{}i{}'.format('<' if lil_endian else '>', exp.itemsize) + self.assertEqual(d['typestr'], f) + self.assertEqual(d['shape'], exp.shape) + self.assertEqual(d['strides'], exp.strides) + self.assertEqual(d['data'], (exp.buf, False)) + finally: + d = None + + exp = Exporter((10, 2), '=i') + b = BufferProxy(exp) + imp = Importer(b, buftools.PyBUF_RECORDS) + self.assertTrue(imp.obj is b) + self.assertEqual(imp.buf, exp.buf) + self.assertEqual(imp.ndim, exp.ndim) + self.assertEqual(imp.format, exp.format) + self.assertEqual(imp.readonly, exp.readonly) + self.assertEqual(imp.itemsize, exp.itemsize) + self.assertEqual(imp.len, exp.len) + self.assertEqual(imp.shape, exp.shape) + self.assertEqual(imp.strides, exp.strides) + self.assertTrue(imp.suboffsets is None) + + d = {'typestr': '|u1', + 'shape': (10,), + 'strides': (1,), + 'data': (9, True)} # 9? Will not reading the data anyway. + b = BufferProxy(d) + imp = Importer(b, buftools.PyBUF_SIMPLE) + self.assertTrue(imp.obj is b) + self.assertEqual(imp.buf, 9) + self.assertEqual(imp.len, 10) + self.assertEqual(imp.format, None) + self.assertEqual(imp.itemsize, 1) + self.assertEqual(imp.ndim, 0) + self.assertTrue(imp.readonly) + self.assertTrue(imp.shape is None) + self.assertTrue(imp.strides is None) + self.assertTrue(imp.suboffsets is None) + + try: + pygame.bufferproxy.get_segcount + except AttributeError: + pass + else: + def test_oldbuf_arg(self): + self.OLDBUF_test_oldbuf_arg() + + def OLDBUF_test_oldbuf_arg(self): + from pygame.bufferproxy import (get_segcount, get_read_buffer, + get_write_buffer) + + content = as_bytes('\x01\x00\x00\x02') * 12 + memory = ctypes.create_string_buffer(content) + memaddr = ctypes.addressof(memory) + def raise_exception(o): + raise ValueError("An exception") + + bf = BufferProxy({'shape': (len(content),), + 'typestr': '|u1', + 'data': (memaddr, False), + 'strides': (1,)}) + seglen, segaddr = get_read_buffer(bf, 0) + self.assertEqual(segaddr, 0) + self.assertEqual(seglen, 0) + seglen, segaddr = get_write_buffer(bf, 0) + self.assertEqual(segaddr, 0) + self.assertEqual(seglen, 0) + segcount, buflen = get_segcount(bf) + self.assertEqual(segcount, 1) + self.assertEqual(buflen, len(content)) + seglen, segaddr = get_read_buffer(bf, 0) + self.assertEqual(segaddr, memaddr) + self.assertEqual(seglen, len(content)) + seglen, segaddr = get_write_buffer(bf, 0) + self.assertEqual(segaddr, memaddr) + self.assertEqual(seglen, len(content)) + + bf = BufferProxy({'shape': (len(content),), + 'typestr': '|u1', + 'data': (memaddr, True), + 'strides': (1,)}) + segcount, buflen = get_segcount(bf) + self.assertEqual(segcount, 1) + self.assertEqual(buflen, len(content)) + seglen, segaddr = get_read_buffer(bf, 0) + self.assertEqual(segaddr, memaddr) + self.assertEqual(seglen, len(content)) + self.assertRaises(ValueError, get_write_buffer, bf, 0) + + bf = BufferProxy({'shape': (len(content),), + 'typestr': '|u1', + 'data': (memaddr, True), + 'strides': (1,), + 'before': raise_exception}) + segcount, buflen = get_segcount(bf) + self.assertEqual(segcount, 0) + self.assertEqual(buflen, 0) + + bf = BufferProxy({'shape': (3, 4), + 'typestr': '|u4', + 'data': (memaddr, True), + 'strides': (12, 4)}) + segcount, buflen = get_segcount(bf) + self.assertEqual(segcount, 3 * 4) + self.assertEqual(buflen, 3 * 4 * 4) + for i in range(0, 4): + seglen, segaddr = get_read_buffer(bf, i) + self.assertEqual(segaddr, memaddr + i * 4) + self.assertEqual(seglen, 4) + + +class BufferProxyLegacyTest(unittest.TestCase): + content = as_bytes('\x01\x00\x00\x02') * 12 + buffer = ctypes.create_string_buffer(content) + data = (ctypes.addressof(buffer), True) + + def test_length(self): + + # __doc__ (as of 2008-08-02) for pygame.bufferproxy.BufferProxy.length: + + # The size of the buffer data in bytes. + bf = BufferProxy({'shape': (3, 4), + 'typestr': '|u4', + 'data': self.data, + 'strides': (12, 4)}) + self.assertEqual(bf.length, len(self.content)) + bf = BufferProxy({'shape': (3, 3), + 'typestr': '|u4', + 'data': self.data, + 'strides': (12, 4)}) + self.assertEqual(bf.length, 3*3*4) + + def test_raw(self): + + # __doc__ (as of 2008-08-02) for pygame.bufferproxy.BufferProxy.raw: + + # The raw buffer data as string. The string may contain NUL bytes. + + bf = BufferProxy({'shape': (len(self.content),), + 'typestr': '|u1', + 'data': self.data}) + self.assertEqual(bf.raw, self.content) + bf = BufferProxy({'shape': (3, 4), + 'typestr': '|u4', + 'data': self.data, + 'strides': (4, 12)}) + self.assertEqual(bf.raw, self.content) + bf = BufferProxy({'shape': (3, 4), + 'typestr': '|u1', + 'data': self.data, + 'strides': (16, 4)}) + self.assertRaises(ValueError, getattr, bf, 'raw') + + def test_write(self): + + # __doc__ (as of 2008-08-02) for pygame.bufferproxy.BufferProxy.write: + + # B.write (bufferproxy, buffer, offset) -> None + # + # Writes raw data to the bufferproxy. + # + # Writes the raw data from buffer to the BufferProxy object, starting + # at the specified offset within the BufferProxy. + # If the length of the passed buffer exceeds the length of the + # BufferProxy (reduced by the offset), an IndexError will be raised. + from ctypes import c_byte, sizeof, addressof, string_at, memset + + nullbyte = '\x00'.encode('latin_1') + Buf = c_byte * 10 + data_buf = Buf(*range(1, 3 * sizeof(Buf) + 1, 3)) + data = string_at(data_buf, sizeof(data_buf)) + buf = Buf() + bp = BufferProxy({'typestr': '|u1', + 'shape': (sizeof(buf),), + 'data': (addressof(buf), False)}) + try: + self.assertEqual(bp.raw, nullbyte * sizeof(Buf)) + bp.write(data) + self.assertEqual(bp.raw, data) + memset(buf, 0, sizeof(buf)) + bp.write(data[:3], 2) + raw = bp.raw + self.assertEqual(raw[:2], nullbyte * 2) + self.assertEqual(raw[2:5], data[:3]) + self.assertEqual(raw[5:], nullbyte * (sizeof(Buf) - 5)) + bp.write(data[:3], bp.length - 3) + raw = bp.raw + self.assertEqual(raw[-3:], data[:3]) + self.assertRaises(IndexError, bp.write, data, 1) + self.assertRaises(IndexError, bp.write, data[:5], -1) + self.assertRaises(IndexError, bp.write, data[:5], bp.length) + self.assertRaises(TypeError, bp.write, 12) + bp = BufferProxy({'typestr': '|u1', + 'shape': (sizeof(buf),), + 'data': (addressof(buf), True)}) + self.assertRaises(pygame.BufferError, bp.write, '123'.encode('latin_1')) + finally: + # Make sure bp is garbage collected before buf + bp = None + gc.collect() + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/camera_test.py b/venv/Lib/site-packages/pygame/tests/camera_test.py new file mode 100644 index 0000000..8dfb45a --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/camera_test.py @@ -0,0 +1,9 @@ +import unittest +import math + +import pygame +from pygame.compat import long_ + + +class CameraModuleTest(unittest.TestCase): + pass diff --git a/venv/Lib/site-packages/pygame/tests/cdrom_tags.py b/venv/Lib/site-packages/pygame/tests/cdrom_tags.py new file mode 100644 index 0000000..6ec1b19 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/cdrom_tags.py @@ -0,0 +1 @@ +__tags__ = ['interactive', 'SDL2_ignore'] diff --git a/venv/Lib/site-packages/pygame/tests/cdrom_test.py b/venv/Lib/site-packages/pygame/tests/cdrom_test.py new file mode 100644 index 0000000..af0426b --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/cdrom_test.py @@ -0,0 +1,318 @@ +import unittest +from pygame.tests.test_utils import question, prompt + +import pygame + + +pygame.cdrom.init() +# The number of CD drives available for testing. +CD_DRIVE_COUNT = pygame.cdrom.get_count() +pygame.cdrom.quit() + + +class CDROMModuleTest(unittest.TestCase): + def setUp(self): + pygame.cdrom.init() + + def tearDown(self): + pygame.cdrom.quit() + + def todo_test_CD(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD: + + # pygame.cdrom.CD(id): return CD + # class to manage a cdrom drive + # + # You can create a CD object for each cdrom on the system. Use + # pygame.cdrom.get_count() to determine how many drives actually + # exist. The id argument is an integer of the drive, starting at zero. + # + # The CD object is not initialized, you can only call CD.get_id() and + # CD.get_name() on an uninitialized drive. + # + # It is safe to create multiple CD objects for the same drive, they + # will all cooperate normally. + # + + self.fail() + + def test_get_count(self): + """Ensure the correct number of CD drives can be detected.""" + count = pygame.cdrom.get_count() + response = question('Is the correct number of CD drives on this ' + 'system [{}]?'.format(count)) + + self.assertTrue(response) + + def test_get_init(self): + """Ensure the initialization state can be retrieved.""" + self.assertTrue(pygame.cdrom.get_init()) + + def test_init(self): + """Ensure module still initialized after multiple init() calls.""" + pygame.cdrom.init() + pygame.cdrom.init() + + self.assertTrue(pygame.cdrom.get_init()) + + def test_quit(self): + """Ensure module not initialized after quit() called.""" + pygame.cdrom.quit() + + self.assertFalse(pygame.cdrom.get_init()) + + def test_quit__multiple(self): + """Ensure module still not initialized after multiple quit() calls.""" + pygame.cdrom.quit() + pygame.cdrom.quit() + + self.assertFalse(pygame.cdrom.get_init()) + + +@unittest.skipIf(0 == CD_DRIVE_COUNT, "No CD drives detected") +class CDTypeTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + pygame.cdrom.init() + + cls._cd_id = 0 # Only testing drive 0 for now. Expand in the future. + cls._cd = pygame.cdrom.CD(cls._cd_id) + + @classmethod + def tearDownClass(cls): + pygame.cdrom.quit() + + def setUp(self): + self._cd.init() + + def tearDown(self): + self._cd.quit() + + def test_eject(self): + """Ensure CD drive opens/ejects.""" + self._cd.eject() + response = question('Did the CD eject?') + + self.assertTrue(response) + + prompt("Please close the CD drive") + + def test_get_name(self): + """Ensure correct name for CD drive.""" + cd_name = self._cd.get_name() + response = question('Is the correct name for the CD drive [{}]?' + ''.format(cd_name)) + + self.assertTrue(response) + + def todo_test_get_all(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_all: + + # CD.get_all(): return [(audio, start, end, lenth), ...] + # get all track information + # + # Return a list with information for every track on the cdrom. The + # information consists of a tuple with four values. The audio value is + # True if the track contains audio data. The start, end, and length + # values are floating point numbers in seconds. Start and end + # represent absolute times on the entire disc. + # + + self.fail() + + def todo_test_get_busy(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_busy: + + # CD.get_busy(): return bool + # true if the drive is playing audio + # + # Returns True if the drive busy playing back audio. + + self.fail() + + def todo_test_get_current(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_current: + + # CD.get_current(): return track, seconds + # the current audio playback position + # + # Returns both the current track and time of that track. This method + # works when the drive is either playing or paused. + # + # Note, track 0 is the first track on the CD. Track numbers start at zero. + + self.fail() + + def test_get_empty(self): + """Ensure correct name for CD drive.""" + prompt("Please ensure the CD drive is closed") + is_empty = self._cd.get_empty() + response = question('Is the CD drive empty?') + + self.assertEqual(is_empty, response) + + def test_get_id(self): + """Ensure the drive id/index is correct.""" + cd_id = self._cd.get_id() + + self.assertEqual(self._cd_id, cd_id) + + def test_get_init(self): + """Ensure the initialization state can be retrieved.""" + self.assertTrue(self._cd.get_init()) + + def todo_test_get_numtracks(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_numtracks: + + # CD.get_numtracks(): return count + # the number of tracks on the cdrom + # + # Return the number of tracks on the cdrom in the drive. This will + # return zero of the drive is empty or has no tracks. + # + + self.fail() + + def todo_test_get_paused(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_paused: + + # CD.get_paused(): return bool + # true if the drive is paused + # + # Returns True if the drive is currently paused. + + self.fail() + + def todo_test_get_track_audio(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_track_audio: + + # CD.get_track_audio(track): return bool + # true if the cdrom track has audio data + # + # Determine if a track on a cdrom contains audio data. You can also + # call CD.num_tracks() and CD.get_all() to determine more information + # about the cdrom. + # + # Note, track 0 is the first track on the CD. Track numbers start at zero. + + self.fail() + + def todo_test_get_track_length(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_track_length: + + # CD.get_track_length(track): return seconds + # length of a cdrom track + # + # Return a floating point value in seconds of the length of the cdrom track. + # Note, track 0 is the first track on the CD. Track numbers start at zero. + + self.fail() + + def todo_test_get_track_start(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_track_start: + + # CD.get_track_start(track): return seconds + # start time of a cdrom track + # + # Return the absolute time in seconds where at start of the cdrom track. + # Note, track 0 is the first track on the CD. Track numbers start at zero. + + self.fail() + + def test_init(self): + """Ensure CD drive still initialized after multiple init() calls.""" + self._cd.init() + self._cd.init() + + self.assertTrue(self._cd.get_init()) + + def todo_test_pause(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.pause: + + # CD.pause(): return None + # temporarily stop audio playback + # + # Temporarily stop audio playback on the CD. The playback can be + # resumed at the same point with the CD.resume() method. If the CD is + # not playing this method does nothing. + # + # Note, track 0 is the first track on the CD. Track numbers start at zero. + + self.fail() + + def todo_test_play(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.play: + + # CD.init(): return None + # initialize a cdrom drive for use + # + # Playback audio from an audio cdrom in the drive. Besides the track + # number argument, you can also pass a starting and ending time for + # playback. The start and end time are in seconds, and can limit the + # section of an audio track played. + # + # If you pass a start time but no end, the audio will play to the end + # of the track. If you pass a start time and 'None' for the end time, + # the audio will play to the end of the entire disc. + # + # See the CD.get_numtracks() and CD.get_track_audio() to find tracks to playback. + # Note, track 0 is the first track on the CD. Track numbers start at zero. + + self.fail() + + def test_quit(self): + """Ensure CD drive not initialized after quit() called.""" + self._cd.quit() + + self.assertFalse(self._cd.get_init()) + + def test_quit__multiple(self): + """Ensure CD drive still not initialized after multiple quit() calls. + """ + self._cd.quit() + self._cd.quit() + + self.assertFalse(self._cd.get_init()) + + def todo_test_resume(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.resume: + + # CD.resume(): return None + # unpause audio playback + # + # Unpause a paused CD. If the CD is not paused or already playing, + # this method does nothing. + # + + self.fail() + + def todo_test_stop(self): + + # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.stop: + + # CD.stop(): return None + # stop audio playback + # + # Stops playback of audio from the cdrom. This will also lose the + # current playback position. This method does nothing if the drive + # isn't already playing audio. + # + + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/color_test.py b/venv/Lib/site-packages/pygame/tests/color_test.py new file mode 100644 index 0000000..992d9d4 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/color_test.py @@ -0,0 +1,1027 @@ +import unittest +import math +import operator +import platform + +import pygame +from pygame.compat import long_ + + +IS_PYPY = 'PyPy' == platform.python_implementation() +################################### CONSTANTS ################################## + +rgba_vals = [0, 1, 62, 63, 126, 127, 255] + +rgba_combinations = [ + (r,g,b,a) for r in rgba_vals + for g in rgba_vals + for b in rgba_vals + for a in rgba_vals + ] + +################################################################################ + + +def rgba_combos_Color_generator(): + for rgba in rgba_combinations: + yield pygame.Color(*rgba) + + +# Python gamma correct +def gamma_correct(rgba_0_255, gamma): + corrected = round(255.0 * math.pow(rgba_0_255 / 255.0, gamma)) + return max(min(int(corrected), 255), 0) + + +################################################################################ + +# TODO: add tests for +# correct_gamma() -- test against statically defined verified correct values +# coerce () -- ?? + +def _assignr(x, y): + x.r = y + + +def _assigng(x, y): + x.g = y + + +def _assignb(x, y): + x.b = y + + +def _assigna(x, y): + x.a = y + + +def _assign_item(x, p, y): + x[p] = y + + +class ColorTypeTest (unittest.TestCase): + def test_new(self): + c = pygame.Color.__new__(pygame.Color) + self.assertEqual(c, pygame.Color(0, 0, 0, 255)) + self.assertEqual(len(c), 4) + + def test_init(self): + c = pygame.Color(10, 20, 30, 200) + self.assertEqual(c, (10, 20, 30, 200)) + c.set_length(3) + self.assertEqual(len(c), 3) + c.__init__(100, 110, 120, 128) + self.assertEqual(len(c), 4) + self.assertEqual(c, (100, 110, 120, 128)) + + def test_invalid_html_hex_codes(self): + # This was a problem with the way 2 digit hex numbers were + # calculated. The test_hex_digits test is related to the fix. + Color = pygame.color.Color + self.assertRaises(ValueError, lambda: Color('# f000000')) + self.assertRaises(ValueError, lambda: Color('#f 000000')) + self.assertRaises(ValueError, lambda: Color('#-f000000')) + + def test_hex_digits(self): + # This is an implementation specific test. + # Two digit hex numbers are calculated using table lookups + # for the upper and lower digits. + Color = pygame.color.Color + self.assertEqual(Color('#00000000').r, 0x00) + self.assertEqual(Color('#10000000').r, 0x10) + self.assertEqual(Color('#20000000').r, 0x20) + self.assertEqual(Color('#30000000').r, 0x30) + self.assertEqual(Color('#40000000').r, 0x40) + self.assertEqual(Color('#50000000').r, 0x50) + self.assertEqual(Color('#60000000').r, 0x60) + self.assertEqual(Color('#70000000').r, 0x70) + self.assertEqual(Color('#80000000').r, 0x80) + self.assertEqual(Color('#90000000').r, 0x90) + self.assertEqual(Color('#A0000000').r, 0xA0) + self.assertEqual(Color('#B0000000').r, 0xB0) + self.assertEqual(Color('#C0000000').r, 0xC0) + self.assertEqual(Color('#D0000000').r, 0xD0) + self.assertEqual(Color('#E0000000').r, 0xE0) + self.assertEqual(Color('#F0000000').r, 0xF0) + self.assertEqual(Color('#01000000').r, 0x01) + self.assertEqual(Color('#02000000').r, 0x02) + self.assertEqual(Color('#03000000').r, 0x03) + self.assertEqual(Color('#04000000').r, 0x04) + self.assertEqual(Color('#05000000').r, 0x05) + self.assertEqual(Color('#06000000').r, 0x06) + self.assertEqual(Color('#07000000').r, 0x07) + self.assertEqual(Color('#08000000').r, 0x08) + self.assertEqual(Color('#09000000').r, 0x09) + self.assertEqual(Color('#0A000000').r, 0x0A) + self.assertEqual(Color('#0B000000').r, 0x0B) + self.assertEqual(Color('#0C000000').r, 0x0C) + self.assertEqual(Color('#0D000000').r, 0x0D) + self.assertEqual(Color('#0E000000').r, 0x0E) + self.assertEqual(Color('#0F000000').r, 0x0F) + + def test_comparison(self): + Color = pygame.color.Color + + # Check valid comparisons + self.assertTrue(Color(255, 0, 0, 0) == Color(255, 0, 0, 0)) + self.assertTrue(Color(0, 255, 0, 0) == Color(0, 255, 0, 0)) + self.assertTrue(Color(0, 0, 255, 0) == Color(0, 0, 255, 0)) + self.assertTrue(Color(0, 0, 0, 255) == Color(0, 0, 0, 255)) + self.assertFalse(Color(0, 0, 0, 0) == Color(255, 0, 0, 0)) + self.assertFalse(Color(0, 0, 0, 0) == Color(0, 255, 0, 0)) + self.assertFalse(Color(0, 0, 0, 0) == Color(0, 0, 255, 0)) + self.assertFalse(Color(0, 0, 0, 0) == Color(0, 0, 0, 255)) + self.assertTrue(Color(0, 0, 0, 0) != Color(255, 0, 0, 0)) + self.assertTrue(Color(0, 0, 0, 0) != Color(0, 255, 0, 0)) + self.assertTrue(Color(0, 0, 0, 0) != Color(0, 0, 255, 0)) + self.assertTrue(Color(0, 0, 0, 0) != Color(0, 0, 0, 255)) + self.assertFalse(Color(255, 0, 0, 0) != Color(255, 0, 0, 0)) + self.assertFalse(Color(0, 255, 0, 0) != Color(0, 255, 0, 0)) + self.assertFalse(Color(0, 0, 255, 0) != Color(0, 0, 255, 0)) + self.assertFalse(Color(0, 0, 0, 255) != Color(0, 0, 0, 255)) + + self.assertTrue(Color(255, 0, 0, 0) == (255, 0, 0, 0)) + self.assertTrue(Color(0, 255, 0, 0) == (0, 255, 0, 0)) + self.assertTrue(Color(0, 0, 255, 0) == (0, 0, 255, 0)) + self.assertTrue(Color(0, 0, 0, 255) == (0, 0, 0, 255)) + self.assertFalse(Color(0, 0, 0, 0) == (255, 0, 0, 0)) + self.assertFalse(Color(0, 0, 0, 0) == (0, 255, 0, 0)) + self.assertFalse(Color(0, 0, 0, 0) == (0, 0, 255, 0)) + self.assertFalse(Color(0, 0, 0, 0) == (0, 0, 0, 255)) + self.assertTrue(Color(0, 0, 0, 0) != (255, 0, 0, 0)) + self.assertTrue(Color(0, 0, 0, 0) != (0, 255, 0, 0)) + self.assertTrue(Color(0, 0, 0, 0) != (0, 0, 255, 0)) + self.assertTrue(Color(0, 0, 0, 0) != (0, 0, 0, 255)) + self.assertFalse(Color(255, 0, 0, 0) != (255, 0, 0, 0)) + self.assertFalse(Color(0, 255, 0, 0) != (0, 255, 0, 0)) + self.assertFalse(Color(0, 0, 255, 0) != (0, 0, 255, 0)) + self.assertFalse(Color(0, 0, 0, 255) != (0, 0, 0, 255)) + + self.assertTrue((255, 0, 0, 0) == Color(255, 0, 0, 0)) + self.assertTrue((0, 255, 0, 0) == Color(0, 255, 0, 0)) + self.assertTrue((0, 0, 255, 0) == Color(0, 0, 255, 0)) + self.assertTrue((0, 0, 0, 255) == Color(0, 0, 0, 255)) + self.assertFalse((0, 0, 0, 0) == Color(255, 0, 0, 0)) + self.assertFalse((0, 0, 0, 0) == Color(0, 255, 0, 0)) + self.assertFalse((0, 0, 0, 0) == Color(0, 0, 255, 0)) + self.assertFalse((0, 0, 0, 0) == Color(0, 0, 0, 255)) + self.assertTrue((0, 0, 0, 0) != Color(255, 0, 0, 0)) + self.assertTrue((0, 0, 0, 0) != Color(0, 255, 0, 0)) + self.assertTrue((0, 0, 0, 0) != Color(0, 0, 255, 0)) + self.assertTrue((0, 0, 0, 0) != Color(0, 0, 0, 255)) + self.assertFalse((255, 0, 0, 0) != Color(255, 0, 0, 0)) + self.assertFalse((0, 255, 0, 0) != Color(0, 255, 0, 0)) + self.assertFalse((0, 0, 255, 0) != Color(0, 0, 255, 0)) + self.assertFalse((0, 0, 0, 255) != Color(0, 0, 0, 255)) + + class TupleSubclass(tuple): + pass + self.assertTrue(Color(255, 0, 0, 0) == TupleSubclass((255, 0, 0, 0))) + self.assertTrue(TupleSubclass((255, 0, 0, 0)) == Color(255, 0, 0, 0)) + self.assertFalse(Color(255, 0, 0, 0) != TupleSubclass((255, 0, 0, 0))) + self.assertFalse(TupleSubclass((255, 0, 0, 0)) != Color(255, 0, 0, 0)) + + # These are not supported so will be unequal. + self.assertFalse(Color(255, 0, 0, 0) == "#ff000000") + self.assertTrue(Color(255, 0, 0, 0) != "#ff000000") + + self.assertFalse("#ff000000" == Color(255, 0, 0, 0)) + self.assertTrue("#ff000000" != Color(255, 0, 0, 0)) + + self.assertFalse(Color(255, 0, 0, 0) == 0xff000000) + self.assertTrue(Color(255, 0, 0, 0) != 0xff000000) + + self.assertFalse(0xff000000 == Color(255, 0, 0, 0)) + self.assertTrue(0xff000000 != Color(255, 0, 0, 0)) + + self.assertFalse(Color(255, 0, 0, 0) == [255, 0, 0, 0]) + self.assertTrue(Color(255, 0, 0, 0) != [255, 0, 0, 0]) + + self.assertFalse([255, 0, 0, 0] == Color(255, 0, 0 ,0)) + self.assertTrue([255, 0, 0, 0] != Color(255, 0, 0, 0)) + + # Comparison is not implemented for invalid color values. + class Test(object): + def __eq__(self, other): + return -1 + + def __ne__(self, other): + return -2 + + class TestTuple(tuple): + def __eq__(self, other): + return -1 + + def __ne__(self, other): + return -2 + + t = Test() + t_tuple = TestTuple(('a', 0, 0, 0)) + black = Color('black') + self.assertEqual(black == t, -1) + self.assertEqual(t == black, -1) + self.assertEqual(black != t, -2) + self.assertEqual(t != black, -2) + self.assertEqual(black == t_tuple, -1) + self.assertEqual(black != t_tuple, -2) + self.assertEqual(t_tuple == black, -1) + self.assertEqual(t_tuple != black, -2) + + def test_ignore_whitespace(self): + self.assertEqual(pygame.color.Color('red'), pygame.color.Color(' r e d ')) + + def test_slice(self): + #"""|tags: python3_ignore|""" + + # slicing a color gives you back a tuple. + # do all sorts of slice combinations. + c = pygame.Color(1,2,3,4) + + self.assertEqual((1,2,3,4), c[:]) + self.assertEqual((1,2,3), c[:-1]) + + self.assertEqual((), c[:-5]) + + self.assertEqual((1,2,3,4), c[:4]) + self.assertEqual((1,2,3,4), c[:5]) + self.assertEqual((1,2), c[:2]) + self.assertEqual((1,), c[:1]) + self.assertEqual((), c[:0]) + + + self.assertEqual((2,), c[1:-2]) + self.assertEqual((3, 4), c[-2:]) + self.assertEqual((4,), c[-1:]) + + + # NOTE: assigning to a slice is currently unsupported. + + + def test_unpack(self): + # should be able to unpack to r,g,b,a and r,g,b + c = pygame.Color(1,2,3,4) + r,g,b,a = c + self.assertEqual((1,2,3,4), (r,g,b,a)) + self.assertEqual(c, (r,g,b,a)) + + c.set_length(3) + r,g,b = c + self.assertEqual((1,2,3), (r,g,b)) + + def test_length(self): + # should be able to unpack to r,g,b,a and r,g,b + c = pygame.Color(1,2,3,4) + self.assertEqual(len(c), 4) + + c.set_length(3) + self.assertEqual(len(c), 3) + + # it keeps the old alpha anyway... + self.assertEqual(c.a, 4) + + # however you can't get the alpha in this way: + self.assertRaises(IndexError, lambda x:c[x], 4) + + c.set_length(4) + self.assertEqual(len(c), 4) + self.assertEqual(len(c), 4) + + self.assertRaises(ValueError, c.set_length, 5) + self.assertRaises(ValueError, c.set_length, -1) + self.assertRaises(ValueError, c.set_length, 0) + self.assertRaises(ValueError, c.set_length, pow(2, long_(33))) + + def test_case_insensitivity_of_string_args(self): + self.assertEqual(pygame.color.Color('red'), pygame.color.Color('Red')) + + def test_color(self): + c = pygame.Color(10, 20, 30, 40) + self.assertEqual(c.r, 10) + self.assertEqual(c.g, 20) + self.assertEqual(c.b, 30) + self.assertEqual(c.a, 40) + + c = pygame.Color("indianred3") + self.assertEqual(c.r, 205) + self.assertEqual(c.g, 85) + self.assertEqual(c.b, 85) + self.assertEqual(c.a, 255) + + c = pygame.Color(0xAABBCCDD) + self.assertEqual(c.r, 0xAA) + self.assertEqual(c.g, 0xBB) + self.assertEqual(c.b, 0xCC) + self.assertEqual(c.a, 0xDD) + + self.assertRaises(ValueError, pygame.Color, 257, 10, 105, 44) + self.assertRaises(ValueError, pygame.Color, 10, 257, 105, 44) + self.assertRaises(ValueError, pygame.Color, 10, 105, 257, 44) + self.assertRaises(ValueError, pygame.Color, 10, 105, 44, 257) + + def test_rgba(self): + c = pygame.Color(0) + self.assertEqual(c.r, 0) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 0) + self.assertEqual(c.a, 0) + + # Test simple assignments + c.r = 123 + self.assertEqual(c.r, 123) + self.assertRaises(ValueError, _assignr, c, 537) + self.assertEqual(c.r, 123) + self.assertRaises(ValueError, _assignr, c, -3) + self.assertEqual(c.r, 123) + + c.g = 55 + self.assertEqual(c.g, 55) + self.assertRaises(ValueError, _assigng, c, 348) + self.assertEqual(c.g, 55) + self.assertRaises(ValueError, _assigng, c, -44) + self.assertEqual(c.g, 55) + + c.b = 77 + self.assertEqual(c.b, 77) + self.assertRaises(ValueError, _assignb, c, 256) + self.assertEqual(c.b, 77) + self.assertRaises(ValueError, _assignb, c, -12) + self.assertEqual(c.b, 77) + + c.a = 255 + self.assertEqual(c.a, 255) + self.assertRaises(ValueError, _assigna, c, 312) + self.assertEqual(c.a, 255) + self.assertRaises(ValueError, _assigna, c, -10) + self.assertEqual(c.a, 255) + + def test_repr(self): + c = pygame.Color(68, 38, 26, 69) + t = "(68, 38, 26, 69)" + self.assertEqual(repr(c), t) + + def test_add(self): + c1 = pygame.Color(0) + self.assertEqual(c1.r, 0) + self.assertEqual(c1.g, 0) + self.assertEqual(c1.b, 0) + self.assertEqual(c1.a, 0) + + c2 = pygame.Color(20, 33, 82, 193) + self.assertEqual(c2.r, 20) + self.assertEqual(c2.g, 33) + self.assertEqual(c2.b, 82) + self.assertEqual(c2.a, 193) + + c3 = c1 + c2 + self.assertEqual(c3.r, 20) + self.assertEqual(c3.g, 33) + self.assertEqual(c3.b, 82) + self.assertEqual(c3.a, 193) + + c3 = c3 + c2 + self.assertEqual(c3.r, 40) + self.assertEqual(c3.g, 66) + self.assertEqual(c3.b, 164) + self.assertEqual(c3.a, 255) + + # Issue #286: Is type checking done for Python 3.x? + self.assertRaises(TypeError, operator.add, c1, None) + self.assertRaises(TypeError, operator.add, None, c1) + + def test_sub(self): + c1 = pygame.Color(0xFFFFFFFF) + self.assertEqual(c1.r, 255) + self.assertEqual(c1.g, 255) + self.assertEqual(c1.b, 255) + self.assertEqual(c1.a, 255) + + c2 = pygame.Color(20, 33, 82, 193) + self.assertEqual(c2.r, 20) + self.assertEqual(c2.g, 33) + self.assertEqual(c2.b, 82) + self.assertEqual(c2.a, 193) + + c3 = c1 - c2 + self.assertEqual(c3.r, 235) + self.assertEqual(c3.g, 222) + self.assertEqual(c3.b, 173) + self.assertEqual(c3.a, 62) + + c3 = c3 - c2 + self.assertEqual(c3.r, 215) + self.assertEqual(c3.g, 189) + self.assertEqual(c3.b, 91) + self.assertEqual(c3.a, 0) + + # Issue #286: Is type checking done for Python 3.x? + self.assertRaises(TypeError, operator.sub, c1, None) + self.assertRaises(TypeError, operator.sub, None, c1) + + def test_mul(self): + c1 = pygame.Color(0x01010101) + self.assertEqual(c1.r, 1) + self.assertEqual(c1.g, 1) + self.assertEqual(c1.b, 1) + self.assertEqual(c1.a, 1) + + c2 = pygame.Color(2, 5, 3, 22) + self.assertEqual(c2.r, 2) + self.assertEqual(c2.g, 5) + self.assertEqual(c2.b, 3) + self.assertEqual(c2.a, 22) + + c3 = c1 * c2 + self.assertEqual(c3.r, 2) + self.assertEqual(c3.g, 5) + self.assertEqual(c3.b, 3) + self.assertEqual(c3.a, 22) + + c3 = c3 * c2 + self.assertEqual(c3.r, 4) + self.assertEqual(c3.g, 25) + self.assertEqual(c3.b, 9) + self.assertEqual(c3.a, 255) + + # Issue #286: Is type checking done for Python 3.x? + self.assertRaises(TypeError, operator.mul, c1, None) + self.assertRaises(TypeError, operator.mul, None, c1) + + def test_div(self): + c1 = pygame.Color(0x80808080) + self.assertEqual(c1.r, 128) + self.assertEqual(c1.g, 128) + self.assertEqual(c1.b, 128) + self.assertEqual(c1.a, 128) + + c2 = pygame.Color(2, 4, 8, 16) + self.assertEqual(c2.r, 2) + self.assertEqual(c2.g, 4) + self.assertEqual(c2.b, 8) + self.assertEqual(c2.a, 16) + + c3 = c1 // c2 + self.assertEqual(c3.r, 64) + self.assertEqual(c3.g, 32) + self.assertEqual(c3.b, 16) + self.assertEqual(c3.a, 8) + + c3 = c3 // c2 + self.assertEqual(c3.r, 32) + self.assertEqual(c3.g, 8) + self.assertEqual(c3.b, 2) + self.assertEqual(c3.a, 0) + + # Issue #286: Is type checking done for Python 3.x? + self.assertRaises(TypeError, operator.floordiv, c1, None) + self.assertRaises(TypeError, operator.floordiv, None, c1) + + # Division by zero check + dividend = pygame.Color(255, 255, 255, 255) + for i in range(4): + divisor = pygame.Color(64, 64, 64, 64) + divisor[i] = 0 + quotient = pygame.Color(3, 3, 3, 3) + quotient[i] = 0 + self.assertEqual(dividend // divisor, quotient) + + def test_mod(self): + c1 = pygame.Color(0xFFFFFFFF) + self.assertEqual(c1.r, 255) + self.assertEqual(c1.g, 255) + self.assertEqual(c1.b, 255) + self.assertEqual(c1.a, 255) + + c2 = pygame.Color(2, 4, 8, 16) + self.assertEqual(c2.r, 2) + self.assertEqual(c2.g, 4) + self.assertEqual(c2.b, 8) + self.assertEqual(c2.a, 16) + + c3 = c1 % c2 + self.assertEqual(c3.r, 1) + self.assertEqual(c3.g, 3) + self.assertEqual(c3.b, 7) + self.assertEqual(c3.a, 15) + + # Issue #286: Is type checking done for Python 3.x? + self.assertRaises(TypeError, operator.mod, c1, None) + self.assertRaises(TypeError, operator.mod, None, c1) + + # Division by zero check + dividend = pygame.Color(255, 255, 255, 255) + for i in range(4): + divisor = pygame.Color(64, 64, 64, 64) + divisor[i] = 0 + quotient = pygame.Color(63, 63, 63, 63) + quotient[i] = 0 + self.assertEqual(dividend % divisor, quotient) + + def test_float(self): + c = pygame.Color(0xCC00CC00) + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 0) + self.assertEqual(float(c), float(0xCC00CC00)) + + c = pygame.Color(0x33727592) + self.assertEqual(c.r, 51) + self.assertEqual(c.g, 114) + self.assertEqual(c.b, 117) + self.assertEqual(c.a, 146) + self.assertEqual(float(c), float(0x33727592)) + + def test_oct(self): + c = pygame.Color(0xCC00CC00) + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 0) + self.assertEqual(oct(c), oct(0xCC00CC00)) + + c = pygame.Color(0x33727592) + self.assertEqual(c.r, 51) + self.assertEqual(c.g, 114) + self.assertEqual(c.b, 117) + self.assertEqual(c.a, 146) + self.assertEqual(oct(c), oct(0x33727592)) + + def test_hex(self): + c = pygame.Color(0xCC00CC00) + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 0) + self.assertEqual(hex(c), hex(0xCC00CC00)) + + c = pygame.Color(0x33727592) + self.assertEqual(c.r, 51) + self.assertEqual(c.g, 114) + self.assertEqual(c.b, 117) + self.assertEqual(c.a, 146) + self.assertEqual(hex(c), hex(0x33727592)) + + + def test_webstyle(self): + c = pygame.Color("#CC00CC11") + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 17) + self.assertEqual(hex(c), hex(0xCC00CC11)) + + c = pygame.Color("#CC00CC") + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 255) + self.assertEqual(hex(c), hex(0xCC00CCFF)) + + c = pygame.Color("0xCC00CC11") + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 17) + self.assertEqual(hex(c), hex(0xCC00CC11)) + + c = pygame.Color("0xCC00CC") + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 255) + self.assertEqual(hex(c), hex(0xCC00CCFF)) + + self.assertRaises(ValueError, pygame.Color, "#cc00qq") + self.assertRaises(ValueError, pygame.Color, "0xcc00qq") + self.assertRaises(ValueError, pygame.Color, "09abcdef") + self.assertRaises(ValueError, pygame.Color, "09abcde") + self.assertRaises(ValueError, pygame.Color, "quarky") + + def test_int(self): + # This will be a long + c = pygame.Color(0xCC00CC00) + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 0) + self.assertEqual(int(c), int(0xCC00CC00)) + + # This will be an int + c = pygame.Color(0x33727592) + self.assertEqual(c.r, 51) + self.assertEqual(c.g, 114) + self.assertEqual(c.b, 117) + self.assertEqual(c.a, 146) + self.assertEqual(int(c), int(0x33727592)) + + def test_long(self): + # This will be a long + c = pygame.Color(0xCC00CC00) + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 0) + self.assertEqual(c.b, 204) + self.assertEqual(c.a, 0) + self.assertEqual(long_ (c), long_ (0xCC00CC00)) + + # This will be an int + c = pygame.Color(0x33727592) + self.assertEqual(c.r, 51) + self.assertEqual(c.g, 114) + self.assertEqual(c.b, 117) + self.assertEqual(c.a, 146) + self.assertEqual(long_ (c), long_ (0x33727592)) + + def test_normalize(self): + c = pygame.Color(204, 38, 194, 55) + self.assertEqual(c.r, 204) + self.assertEqual(c.g, 38) + self.assertEqual(c.b, 194) + self.assertEqual(c.a, 55) + + t = c.normalize() + + self.assertAlmostEqual(t[0], 0.800000, 5) + self.assertAlmostEqual(t[1], 0.149016, 5) + self.assertAlmostEqual(t[2], 0.760784, 5) + self.assertAlmostEqual(t[3], 0.215686, 5) + + def test_len(self): + c = pygame.Color(204, 38, 194, 55) + self.assertEqual(len(c), 4) + + def test_get_item(self): + c = pygame.Color(204, 38, 194, 55) + self.assertEqual(c[0], 204) + self.assertEqual(c[1], 38) + self.assertEqual(c[2], 194) + self.assertEqual(c[3], 55) + + def test_set_item(self): + c = pygame.Color(204, 38, 194, 55) + self.assertEqual(c[0], 204) + self.assertEqual(c[1], 38) + self.assertEqual(c[2], 194) + self.assertEqual(c[3], 55) + + c[0] = 33 + self.assertEqual(c[0], 33) + c[1] = 48 + self.assertEqual(c[1], 48) + c[2] = 173 + self.assertEqual(c[2], 173) + c[3] = 213 + self.assertEqual(c[3], 213) + + # Now try some 'invalid' ones + self.assertRaises(ValueError, _assign_item, c, 0, 95.485) + self.assertEqual(c[0], 33) + self.assertRaises(ValueError, _assign_item, c, 1, -83) + self.assertEqual(c[1], 48) + self.assertRaises(ValueError, _assign_item, c, 2, "Hello") + self.assertEqual(c[2], 173) + + def test_Color_type_works_for_Surface_get_and_set_colorkey(self): + s = pygame.Surface((32, 32)) + + c = pygame.Color(33, 22, 11, 255) + s.set_colorkey(c) + + get_r, get_g, get_b, get_a = s.get_colorkey() + + self.assertTrue(get_r == c.r) + self.assertTrue(get_g == c.g) + self.assertTrue(get_b == c.b) + self.assertTrue(get_a == c.a) + +########## HSLA, HSVA, CMY, I1I2I3 ALL ELEMENTS WITHIN SPECIFIED RANGE ######### + + def test_hsla__all_elements_within_limits(self): + for c in rgba_combos_Color_generator(): + h, s, l, a = c.hsla + self.assertTrue(0 <= h <= 360) + self.assertTrue(0 <= s <= 100) + self.assertTrue(0 <= l <= 100) + self.assertTrue(0 <= a <= 100) + + def test_hsva__all_elements_within_limits(self): + for c in rgba_combos_Color_generator(): + h, s, v, a = c.hsva + self.assertTrue(0 <= h <= 360) + self.assertTrue(0 <= s <= 100) + self.assertTrue(0 <= v <= 100) + self.assertTrue(0 <= a <= 100) + + def test_cmy__all_elements_within_limits(self): + for c in rgba_combos_Color_generator(): + c, m, y = c.cmy + self.assertTrue(0 <= c <= 1) + self.assertTrue(0 <= m <= 1) + self.assertTrue(0 <= y <= 1) + + def test_i1i2i3__all_elements_within_limits(self): + for c in rgba_combos_Color_generator(): + i1, i2, i3 = c.i1i2i3 + self.assertTrue( 0 <= i1 <= 1) + self.assertTrue(-0.5 <= i2 <= 0.5) + self.assertTrue(-0.5 <= i3 <= 0.5) + + def test_issue_269(self): + """PyColor OverflowError on HSVA with hue value of 360 + + >>> c = pygame.Color(0) + >>> c.hsva = (360,0,0,0) + Traceback (most recent call last): + File "", line 1, in + OverflowError: this is not allowed to happen ever + >>> pygame.ver + '1.9.1release' + >>> + + """ + + c = pygame.Color(0) + c.hsva = 360, 0, 0, 0 + self.assertEqual(c.hsva, (0, 0, 0, 0)) + c.hsva = 360, 100, 100, 100 + self.assertEqual(c.hsva, (0, 100, 100, 100)) + self.assertEqual(c, (255, 0, 0, 255)) + +####################### COLORSPACE PROPERTY SANITY TESTS ####################### + + def colorspaces_converted_should_not_raise(self, prop): + fails = 0 + + x = 0 + for c in rgba_combos_Color_generator(): + x += 1 + + other = pygame.Color(0) + + try: + setattr(other, prop, getattr(c, prop)) + #eg other.hsla = c.hsla + + except ValueError: + fails += 1 + + self.assertTrue(x > 0, "x is combination counter, 0 means no tests!") + self.assertTrue((fails, x) == (0, x)) + + def test_hsla__sanity_testing_converted_should_not_raise(self): + self.colorspaces_converted_should_not_raise('hsla') + + def test_hsva__sanity_testing_converted_should_not_raise(self): + self.colorspaces_converted_should_not_raise('hsva') + + def test_cmy__sanity_testing_converted_should_not_raise(self): + self.colorspaces_converted_should_not_raise('cmy') + + def test_i1i2i3__sanity_testing_converted_should_not_raise(self): + self.colorspaces_converted_should_not_raise('i1i2i3') + +################################################################################ + + def colorspaces_converted_should_equate_bar_rounding(self, prop): + for c in rgba_combos_Color_generator(): + other = pygame.Color(0) + + try: + setattr(other, prop, getattr(c, prop)) + #eg other.hsla = c.hsla + + self.assertTrue(abs(other.r - c.r) <= 1) + self.assertTrue(abs(other.b - c.b) <= 1) + self.assertTrue(abs(other.g - c.g) <= 1) + # CMY and I1I2I3 do not care about the alpha + if not prop in ("cmy", "i1i2i3"): + self.assertTrue(abs(other.a - c.a) <= 1) + + except ValueError: + pass # other tests will notify, this tests equation + + def test_hsla__sanity_testing_converted_should_equate_bar_rounding(self): + self.colorspaces_converted_should_equate_bar_rounding('hsla') + + def test_hsva__sanity_testing_converted_should_equate_bar_rounding(self): + self.colorspaces_converted_should_equate_bar_rounding('hsva') + + def test_cmy__sanity_testing_converted_should_equate_bar_rounding(self): + self.colorspaces_converted_should_equate_bar_rounding('cmy') + + def test_i1i2i3__sanity_testing_converted_should_equate_bar_rounding(self): + self.colorspaces_converted_should_equate_bar_rounding('i1i2i3') + +################################################################################ + + def test_correct_gamma__verified_against_python_implementation(self): + "|tags:slow|" + # gamma_correct defined at top of page + + gammas = [i / 10.0 for i in range(1, 31)] # [0.1 ... 3.0] + gammas_len = len(gammas) + + for i, c in enumerate(rgba_combos_Color_generator()): + gamma = gammas[i % gammas_len] + + corrected = pygame.Color(*[gamma_correct(x, gamma) + for x in tuple(c)]) + lib_corrected = c.correct_gamma(gamma) + + self.assertTrue(corrected.r == lib_corrected.r) + self.assertTrue(corrected.g == lib_corrected.g) + self.assertTrue(corrected.b == lib_corrected.b) + self.assertTrue(corrected.a == lib_corrected.a) + + # TODO: test against statically defined verified _correct_ values + # assert corrected.r == 125 etc. + + def test_pickle(self): + import pickle + c1 = pygame.Color(1,2,3,4) + #c2 = pygame.Color(255,254,253,252) + pickle_string = pickle.dumps(c1) + c1_frompickle = pickle.loads(pickle_string) + self.assertEqual(c1,c1_frompickle) + +################################################################################ +# only available if ctypes module is also available + + @unittest.skipIf(IS_PYPY, 'PyPy has no ctypes') + def test_arraystruct(self): + + import pygame.tests.test_utils.arrinter as ai + import ctypes as ct + + c_byte_p = ct.POINTER(ct.c_byte) + c = pygame.Color(5, 7, 13, 23) + flags = (ai.PAI_CONTIGUOUS | ai.PAI_FORTRAN | + ai.PAI_ALIGNED | ai.PAI_NOTSWAPPED) + for i in range(1, 5): + c.set_length(i) + inter = ai.ArrayInterface(c) + self.assertEqual(inter.two, 2) + self.assertEqual(inter.nd, 1) + self.assertEqual(inter.typekind, 'u') + self.assertEqual(inter.itemsize, 1) + self.assertEqual(inter.flags, flags) + self.assertEqual(inter.shape[0], i) + self.assertEqual(inter.strides[0], 1) + data = ct.cast(inter.data, c_byte_p) + for j in range(i): + self.assertEqual(data[j], c[j]) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf(self): + from pygame.tests.test_utils import buftools + from ctypes import cast, POINTER, c_uint8 + + class ColorImporter(buftools.Importer): + def __init__(self, color, flags): + super(ColorImporter, self).__init__(color, flags) + self.items = cast(self.buf, POINTER(c_uint8)) + + def __getitem__(self, index): + if 0 <= index < 4: + return self.items[index] + raise IndexError("valid index values are between 0 and 3: " + "got {}".format(index)) + def __setitem__(self, index, value): + if 0 <= index < 4: + self.items[index] = value + else: + raise IndexError("valid index values are between 0 and 3: " + "got {}".format(index)) + + c = pygame.Color(50, 100, 150, 200) + imp = ColorImporter(c, buftools.PyBUF_SIMPLE) + self.assertTrue(imp.obj is c) + self.assertEqual(imp.ndim, 0) + self.assertEqual(imp.itemsize, 1) + self.assertEqual(imp.len, 4) + self.assertTrue(imp.readonly) + self.assertTrue(imp.format is None) + self.assertTrue(imp.shape is None) + self.assertTrue(imp.strides is None) + self.assertTrue(imp.suboffsets is None) + for i in range(4): + self.assertEqual(c[i], imp[i]) + imp[0] = 60 + self.assertEqual(c.r, 60) + imp[1] = 110 + self.assertEqual(c.g, 110) + imp[2] = 160 + self.assertEqual(c.b, 160) + imp[3] = 210 + self.assertEqual(c.a, 210) + imp = ColorImporter(c, buftools.PyBUF_FORMAT) + self.assertEqual(imp.ndim, 0) + self.assertEqual(imp.itemsize, 1) + self.assertEqual(imp.len, 4) + self.assertEqual(imp.format, 'B') + self.assertEqual(imp.ndim, 0) + self.assertEqual(imp.itemsize, 1) + self.assertEqual(imp.len, 4) + imp = ColorImporter(c, buftools.PyBUF_ND) + self.assertEqual(imp.ndim, 1) + self.assertEqual(imp.itemsize, 1) + self.assertEqual(imp.len, 4) + self.assertTrue(imp.format is None) + self.assertEqual(imp.shape, (4,)) + self.assertEqual(imp.strides, None) + imp = ColorImporter(c, buftools.PyBUF_STRIDES) + self.assertEqual(imp.ndim, 1) + self.assertTrue(imp.format is None) + self.assertEqual(imp.shape, (4,)) + self.assertEqual(imp.strides, (1,)) + imp = ColorImporter(c, buftools.PyBUF_C_CONTIGUOUS) + self.assertEqual(imp.ndim, 1) + imp = ColorImporter(c, buftools.PyBUF_F_CONTIGUOUS) + self.assertEqual(imp.ndim, 1) + imp = ColorImporter(c, buftools.PyBUF_ANY_CONTIGUOUS) + self.assertEqual(imp.ndim, 1) + for i in range(1, 5): + c.set_length(i) + imp = ColorImporter(c, buftools.PyBUF_ND) + self.assertEqual(imp.ndim, 1) + self.assertEqual(imp.len, i) + self.assertEqual(imp.shape, (i,)) + self.assertRaises(BufferError, ColorImporter, + c, buftools.PyBUF_WRITABLE) + + +class SubclassTest(unittest.TestCase): + + class MyColor(pygame.Color): + def __init__ (self, *args, **kwds): + super(SubclassTest.MyColor, self).__init__ (*args, **kwds) + self.an_attribute = True + + def test_add(self): + mc1 = self.MyColor(128, 128, 128, 255) + self.assertTrue(mc1.an_attribute) + c2 = pygame.Color(64, 64, 64, 255) + mc2 = mc1 + c2 + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + c3 = c2 + mc1 + self.assertTrue(type(c3) is pygame.Color) + + def test_sub(self): + mc1 = self.MyColor(128, 128, 128, 255) + self.assertTrue(mc1.an_attribute) + c2 = pygame.Color(64, 64, 64, 255) + mc2 = mc1 - c2 + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + c3 = c2 - mc1 + self.assertTrue(type(c3) is pygame.Color) + + def test_mul(self): + mc1 = self.MyColor(128, 128, 128, 255) + self.assertTrue(mc1.an_attribute) + c2 = pygame.Color(64, 64, 64, 255) + mc2 = mc1 * c2 + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + c3 = c2 * mc1 + self.assertTrue(type(c3) is pygame.Color) + + def test_div(self): + mc1 = self.MyColor(128, 128, 128, 255) + self.assertTrue(mc1.an_attribute) + c2 = pygame.Color(64, 64, 64, 255) + mc2 = mc1 // c2 + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + c3 = c2 // mc1 + self.assertTrue(type(c3) is pygame.Color) + + def test_mod(self): + mc1 = self.MyColor(128, 128, 128, 255) + self.assertTrue(mc1.an_attribute) + c2 = pygame.Color(64, 64, 64, 255) + mc2 = mc1 % c2 + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + c3 = c2 % mc1 + self.assertTrue(type(c3) is pygame.Color) + + def test_inv(self): + mc1 = self.MyColor(64, 64, 64, 64) + self.assertTrue(mc1.an_attribute) + mc2 = ~mc1 + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + + def test_correct_gamma(self): + mc1 = self.MyColor(64, 70, 75, 255) + self.assertTrue(mc1.an_attribute) + mc2 = mc1.correct_gamma(.03) + self.assertTrue(isinstance(mc2, self.MyColor)) + self.assertRaises(AttributeError, getattr, mc2, 'an_attribute') + + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/compat_test.py b/venv/Lib/site-packages/pygame/tests/compat_test.py new file mode 100644 index 0000000..d16f3f0 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/compat_test.py @@ -0,0 +1,87 @@ +import sys + +import unittest +from pygame import compat +encode_file_path = sys.modules['pygame.rwobject'].encode_file_path + +class CompatModuleTest(unittest.TestCase): + def test_as_unicode(self): + r = r'Bo\u00F6tes' + ords = [ord('B'), ord('o'), 0xF6, ord('t'), ord('e'), ord('s')] + self.assertEqual(len(r), 11) + u = compat.as_unicode(r) + self.assertIsInstance(u, compat.unicode_) + self.assertEqual([ord(c) for c in u], ords) + + def test_as_bytes(self): + ords = [0, 1, 0x7F, 0x80, 0xC3, 0x20, 0xC3, 0xB6, 0xFF] + s = ''.join([chr(i) for i in ords]) + self.assertEqual(len(s), len(ords)) + b = compat.as_bytes(s) + self.assertIsInstance(b, compat.bytes_) + self.assertEqual([compat.ord_(i) for i in b], ords) + + def test_ord_(self): + self.assertIsInstance(compat.ord_(compat.bytes_(1)[0]), int) + + def test_bytes_(self): + self.assertFalse(compat.bytes_ is compat.unicode_) + self.assertTrue(hasattr(compat.bytes_, 'capitalize')) + self.assertFalse(hasattr(compat.bytes_, 'isdecimal')) + + def test_unicode_(self): + self.assertTrue(hasattr(compat.unicode_(), 'isdecimal')) + + def test_long_(self): + self.assertIsInstance(int('99999999999999999999'), compat.long_) + + def test_geterror(self): + msg = 'Success' + try: + raise TypeError(msg) + except TypeError: + e = compat.geterror() + self.assertIsInstance(e, TypeError) + self.assertEqual(str(e), msg) + + def test_xrange_(self): + self.assertFalse(isinstance(compat.xrange_(2), list)) + + def test_unichr_(self): + ordval = 86 + c = compat.unichr_(ordval) + self.assertIsInstance(c, compat.unicode_) + self.assertEqual(ord(c), ordval) + + def test_get_BytesIO(self): + BytesIO = compat.get_BytesIO() + b1 = compat.as_bytes("\x00\xffabc") + b2 = BytesIO(b1).read() + self.assertIsInstance(b2, compat.bytes_) + self.assertEqual(b2, b1) + + def test_get_StringIO(self): + StringIO = compat.get_StringIO() + b1 = "abcde" + b2 = StringIO(b1).read() + self.assertIsInstance(b2, str) + self.assertEqual(b2, b1) + + def test_raw_input_(self): + StringIO = compat.get_StringIO() + msg = 'success' + tmp = sys.stdin + sys.stdin = StringIO(msg + '\n') + try: + s = compat.raw_input_() + self.assertEqual(s, msg) + finally: + sys.stdin = tmp + + def test_filesystem_encode(self): + upath = compat.as_unicode(r"ab\u212Acd") + self.assertEqual(compat.filesystem_encode(upath), + encode_file_path(upath)) + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/constants_test.py b/venv/Lib/site-packages/pygame/tests/constants_test.py new file mode 100644 index 0000000..6ac5748 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/constants_test.py @@ -0,0 +1,51 @@ +import unittest +import pygame.constants + + +class KmodTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.constants = [ + 'KMOD_NONE', + 'KMOD_LSHIFT', + 'KMOD_RSHIFT', + 'KMOD_LCTRL', + 'KMOD_RCTRL', + 'KMOD_LALT', + 'KMOD_RALT', + 'KMOD_LMETA', + 'KMOD_RMETA', + 'KMOD_NUM', + 'KMOD_CAPS', + 'KMOD_MODE', + 'KMOD_CTRL', + 'KMOD_SHIFT', + 'KMOD_ALT', + 'KMOD_META', + ] + if pygame.get_sdl_version()[0] >= 2: + cls.constants.extend([ + 'KMOD_LGUI', + 'KMOD_RGUI', + 'KMOD_GUI', + ]) + + def test_kmod_existence(self): + for k in self.constants: + self.assertTrue(hasattr(pygame.constants, k), 'missing constant {}'.format(k)) + + def test_kmod_types(self): + for k in self.constants: + self.assertEqual(type(getattr(pygame.constants, k)), int) + +class KeyConstantTests(unittest.TestCase): + def test_letters(self): + for c in range(ord('a'), ord('z') + 1): + c = chr(c) + self.assertTrue(hasattr(pygame.constants, 'K_%s' % c), + 'missing constant: K_%s' % c) + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/cursors_test.py b/venv/Lib/site-packages/pygame/tests/cursors_test.py new file mode 100644 index 0000000..1e465e8 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/cursors_test.py @@ -0,0 +1,63 @@ +import unittest +from pygame.tests.test_utils import fixture_path +import pygame + + +class CursorsModuleTest(unittest.TestCase): + def todo_test_compile(self): + + # __doc__ (as of 2008-06-25) for pygame.cursors.compile: + + # pygame.cursors.compile(strings, black, white,xor) -> data, mask + # compile cursor strings into cursor data + # + # This takes a set of strings with equal length and computes + # the binary data for that cursor. The string widths must be + # divisible by 8. + # + # The black and white arguments are single letter strings that + # tells which characters will represent black pixels, and which + # characters represent white pixels. All other characters are + # considered clear. + # + # This returns a tuple containing the cursor data and cursor mask + # data. Both these arguments are used when setting a cursor with + # pygame.mouse.set_cursor(). + + self.fail() + + def test_load_xbm(self): + # __doc__ (as of 2008-06-25) for pygame.cursors.load_xbm: + + # pygame.cursors.load_xbm(cursorfile, maskfile) -> cursor_args + # reads a pair of XBM files into set_cursor arguments + # + # Arguments can either be filenames or filelike objects + # with the readlines method. Not largely tested, but + # should work with typical XBM files. + + # Test that load_xbm will take filenames as arguments + cursorfile = fixture_path(r"xbm_cursors/white_sizing.xbm") + maskfile = fixture_path(r"xbm_cursors/white_sizing_mask.xbm") + cursor = pygame.cursors.load_xbm(cursorfile, maskfile) + + # Test that load_xbm will take file objects as arguments + with open(cursorfile) as cursor_f, open(maskfile) as mask_f: + cursor = pygame.cursors.load_xbm(cursor_f, mask_f) + + # Is it in a format that mouse.set_cursor won't blow up on? + pygame.display.init() + try: + pygame.mouse.set_cursor(*cursor) + except pygame.error as e: + if 'not currently supported' in str(e): + unittest.skip('skipping test as set_cursor() is not supported') + finally: + pygame.display.quit() + +################################################################################ + +if __name__ == '__main__': + unittest.main() + +################################################################################ diff --git a/venv/Lib/site-packages/pygame/tests/display_test.py b/venv/Lib/site-packages/pygame/tests/display_test.py new file mode 100644 index 0000000..7ec8bba --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/display_test.py @@ -0,0 +1,440 @@ +# -*- coding: utf-8 -*- + +import unittest +import pygame, pygame.transform +from pygame.compat import unicode_ + +from pygame import display + +class DisplayModuleTest(unittest.TestCase): + default_caption = "pygame window" + + def setUp(self): + display.init() + def tearDown(self): + display.quit() + + def test_update(self): + """ see if pygame.display.update takes rects with negative values. + "|Tags:display|" + """ + + #pygame.init() + screen = pygame.display.set_mode((100, 100)) + screen.fill((55, 55, 55)) + + r1 = pygame.Rect(0, 0, 100, 100) + pygame.display.update(r1) + + r2 = pygame.Rect(-10, 0, 100, 100) + pygame.display.update(r2) + + r3 = pygame.Rect(-10, 0, -100, -100) + pygame.display.update(r3) + + # NOTE: if I don't call pygame.quit there is a segfault. hrmm. + #pygame.quit() + # I think it's because unittest runs stuff in threads + # here's a stack trace... + + # NOTE to author of above: + # unittest doesn't run tests in threads + # segfault was probably caused by another tests need + # for a "clean slate" + + """ + #0 0x08103b7c in PyFrame_New () + #1 0x080bd666 in PyEval_EvalCodeEx () + #2 0x08105202 in PyFunction_SetClosure () + #3 0x080595ae in PyObject_Call () + #4 0x080b649f in PyEval_CallObjectWithKeywords () + #5 0x08059585 in PyObject_CallObject () + #6 0xb7f7aa2d in initbase () from /usr/lib/python2.4/site-packages/pygame/base.so + #7 0x080e09bd in Py_Finalize () + #8 0x08055597 in Py_Main () + #9 0xb7e04eb0 in __libc_start_main () from /lib/tls/libc.so.6 + #10 0x08054e31 in _start () + + """ + + def test_Info(self): + inf = pygame.display.Info() + self.assertNotEqual(inf.current_h, -1) + self.assertNotEqual(inf.current_w, -1) + #probably have an older SDL than 1.2.10 if -1. + + screen = pygame.display.set_mode((128,128)) + inf = pygame.display.Info() + self.assertEqual(inf.current_h, 128) + self.assertEqual(inf.current_w, 128) + + def todo_test_flip(self): + + # __doc__ (as of 2008-08-02) for pygame.display.flip: + + # pygame.display.flip(): return None + # update the full display Surface to the screen + # + # This will update the contents of the entire display. If your display + # mode is using the flags pygame.HWSURFACE and pygame.DOUBLEBUF, this + # will wait for a vertical retrace and swap the surfaces. If you are + # using a different type of display mode, it will simply update the + # entire contents of the surface. + # + # When using an pygame.OPENGL display mode this will perform a gl buffer swap. + + self.fail() + + def todo_test_get_active(self): + + # __doc__ (as of 2008-08-02) for pygame.display.get_active: + + # pygame.display.get_active(): return bool + # true when the display is active on the display + # + # After pygame.display.set_mode() is called the display Surface will + # be visible on the screen. Most windowed displays can be hidden by + # the user. If the display Surface is hidden or iconified this will + # return False. + # + + self.fail() + + def test_get_caption(self): + + # __doc__ (as of 2008-08-02) for pygame.display.get_caption: + + # pygame.display.get_caption(): return (title, icontitle) + # get the current window caption + # + # Returns the title and icontitle for the display Surface. These will + # often be the same value. + # + + screen = display.set_mode((100, 100)) + self.assertEqual(display.get_caption()[0], self.default_caption) + + def test_set_caption(self): + + # __doc__ (as of 2008-08-02) for pygame.display.set_caption: + + # pygame.display.set_caption(title, icontitle=None): return None + # set the current window caption + # + # If the display has a window title, this function will change the + # name on the window. Some systems support an alternate shorter title + # to be used for minimized displays. + # + + TEST_CAPTION = "test" + screen = display.set_mode((100, 100)) + self.assertIsNone(display.set_caption(TEST_CAPTION)) + self.assertEqual(display.get_caption()[0], TEST_CAPTION) + self.assertEqual(display.get_caption()[1], TEST_CAPTION) + + def test_caption_unicode(self): + TEST_CAPTION = u'å°' + display.set_caption(TEST_CAPTION) + import sys + if sys.version_info.major >= 3: + self.assertEqual(display.get_caption()[0], TEST_CAPTION) + else: + self.assertEqual(unicode_(display.get_caption()[0], 'utf8'), TEST_CAPTION) + + def todo_test_get_driver(self): + + # __doc__ (as of 2008-08-02) for pygame.display.get_driver: + + # pygame.display.get_driver(): return name + # get the name of the pygame display backend + # + # Pygame chooses one of many available display backends when it is + # initialized. This returns the internal name used for the display + # backend. This can be used to provide limited information about what + # display capabilities might be accelerated. See the SDL_VIDEODRIVER + # flags in pygame.display.set_mode() to see some of the common + # options. + # + + self.fail() + + def todo_test_get_init(self): + + # __doc__ (as of 2008-08-02) for pygame.display.get_init: + + # pygame.display.get_init(): return bool + # true if the display module is initialized + # + # Returns True if the pygame.display module is currently initialized. + + self.fail() + + def todo_test_get_surface(self): + + # __doc__ (as of 2008-08-02) for pygame.display.get_surface: + + # pygame.display.get_surface(): return Surface + # get a reference to the currently set display surface + # + # Return a reference to the currently set display Surface. If no + # display mode has been set this will return None. + # + + self.fail() + + def todo_test_get_wm_info(self): + + # __doc__ (as of 2008-08-02) for pygame.display.get_wm_info: + + # pygame.display.get_wm_info(): return dict + # Get information about the current windowing system + # + # Creates a dictionary filled with string keys. The strings and values + # are arbitrarily created by the system. Some systems may have no + # information and an empty dictionary will be returned. Most platforms + # will return a "window" key with the value set to the system id for + # the current display. + # + # New with pygame 1.7.1 + + self.fail() + + def todo_test_gl_get_attribute(self): + + # __doc__ (as of 2008-08-02) for pygame.display.gl_get_attribute: + + # pygame.display.gl_get_attribute(flag): return value + # get the value for an opengl flag for the current display + # + # After calling pygame.display.set_mode() with the pygame.OPENGL flag, + # it is a good idea to check the value of any requested OpenGL + # attributes. See pygame.display.gl_set_attribute() for a list of + # valid flags. + # + + self.fail() + + def todo_test_gl_set_attribute(self): + + # __doc__ (as of 2008-08-02) for pygame.display.gl_set_attribute: + + # pygame.display.gl_set_attribute(flag, value): return None + # request an opengl display attribute for the display mode + # + # When calling pygame.display.set_mode() with the pygame.OPENGL flag, + # Pygame automatically handles setting the OpenGL attributes like + # color and doublebuffering. OpenGL offers several other attributes + # you may want control over. Pass one of these attributes as the flag, + # and its appropriate value. This must be called before + # pygame.display.set_mode() + # + # The OPENGL flags are; + # GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_ACCUM_RED_SIZE, + # GL_ACCUM_GREEN_SIZE, GL_ACCUM_BLUE_SIZE, GL_ACCUM_ALPHA_SIZE, + # GL_MULTISAMPLEBUFFERS, GL_MULTISAMPLESAMPLES, GL_STEREO + + self.fail() + + def todo_test_iconify(self): + + # __doc__ (as of 2008-08-02) for pygame.display.iconify: + + # pygame.display.iconify(): return bool + # iconify the display surface + # + # Request the window for the display surface be iconified or hidden. + # Not all systems and displays support an iconified display. The + # function will return True if successfull. + # + # When the display is iconified pygame.display.get_active() will + # return False. The event queue should receive a ACTIVEEVENT event + # when the window has been iconified. + # + + self.fail() + + def todo_test_init(self): + + # __doc__ (as of 2008-08-02) for pygame.display.init: + + # pygame.display.init(): return None + # initialize the display module + # + # Initializes the pygame display module. The display module cannot do + # anything until it is initialized. This is usually handled for you + # automatically when you call the higher level pygame.init(). + # + # Pygame will select from one of several internal display backends + # when it is initialized. The display mode will be chosen depending on + # the platform and permissions of current user. Before the display + # module is initialized the environment variable SDL_VIDEODRIVER can + # be set to control which backend is used. The systems with multiple + # choices are listed here. + # + # Windows : windib, directx + # Unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib + # On some platforms it is possible to embed the pygame display into an + # already existing window. To do this, the environment variable + # SDL_WINDOWID must be set to a string containing the window id or + # handle. The environment variable is checked when the pygame display + # is initialized. Be aware that there can be many strange side effects + # when running in an embedded display. + # + # It is harmless to call this more than once, repeated calls have no effect. + + self.fail() + + def test_list_modes(self): + modes = pygame.display.list_modes( + depth=0, flags=pygame.FULLSCREEN, display=0 + ) + # modes == -1 means any mode is supported. + if modes != -1: + self.assertEqual(len(modes[0]), 2) + self.assertEqual(type(modes[0][0]), int) + + modes = pygame.display.list_modes() + if modes != -1: + self.assertEqual(len(modes[0]), 2) + self.assertEqual(type(modes[0][0]), int) + + modes = pygame.display.list_modes( + depth=0, flags=0, display=0 + ) + if modes != -1: + self.assertEqual(len(modes[0]), 2) + self.assertEqual(type(modes[0][0]), int) + + def test_mode_ok(self): + pygame.display.mode_ok((128, 128)) + modes = pygame.display.list_modes() + if modes != -1: + size = modes[0] + self.assertNotEqual(pygame.display.mode_ok(size), 0) + + pygame.display.mode_ok((128, 128), 0, 32) + pygame.display.mode_ok((128, 128), flags=0, depth=32, display=0) + + + def test_mode_ok_fullscreen(self): + modes = pygame.display.list_modes() + if modes != -1: + size = modes[0] + self.assertNotEqual(pygame.display.mode_ok( + size, + flags=pygame.FULLSCREEN), 0) + + def test_get_num_displays(self): + self.assertGreater(pygame.display.get_num_displays(), 0) + + def todo_test_quit(self): + + # __doc__ (as of 2008-08-02) for pygame.display.quit: + + # pygame.display.quit(): return None + # uninitialize the display module + # + # This will shut down the entire display module. This means any active + # displays will be closed. This will also be handled automatically + # when the program exits. + # + # It is harmless to call this more than once, repeated calls have no effect. + + self.fail() + + def todo_test_set_gamma(self): + + # __doc__ (as of 2008-08-02) for pygame.display.set_gamma: + + # pygame.display.set_gamma(red, green=None, blue=None): return bool + # change the hardware gamma ramps + # + # Set the red, green, and blue gamma values on the display hardware. + # If the green and blue arguments are not passed, they will both be + # the same as red. Not all systems and hardware support gamma ramps, + # if the function succeeds it will return True. + # + # A gamma value of 1.0 creates a linear color table. Lower values will + # darken the display and higher values will brighten. + # + + self.fail() + + def todo_test_set_gamma_ramp(self): + + # __doc__ (as of 2008-08-02) for pygame.display.set_gamma_ramp: + + # change the hardware gamma ramps with a custom lookup + # pygame.display.set_gamma_ramp(red, green, blue): return bool + # set_gamma_ramp(red, green, blue): return bool + # + # Set the red, green, and blue gamma ramps with an explicit lookup + # table. Each argument should be sequence of 256 integers. The + # integers should range between 0 and 0xffff. Not all systems and + # hardware support gamma ramps, if the function succeeds it will + # return True. + # + + self.fail() + + def todo_test_set_icon(self): + + # __doc__ (as of 2008-08-02) for pygame.display.set_icon: + + # pygame.display.set_icon(Surface): return None + # change the system image for the display window + # + # Sets the runtime icon the system will use to represent the display + # window. All windows default to a simple pygame logo for the window + # icon. + # + # You can pass any surface, but most systems want a smaller image + # around 32x32. The image can have colorkey transparency which will be + # passed to the system. + # + # Some systems do not allow the window icon to change after it has + # been shown. This function can be called before + # pygame.display.set_mode() to create the icon before the display mode + # is set. + # + + self.fail() + + def test_set_mode_kwargs(self): + + pygame.display.set_mode(size=(1, 1), flags=0, depth=0, display=0) + + + def todo_test_set_palette(self): + + # __doc__ (as of 2008-08-02) for pygame.display.set_palette: + + # pygame.display.set_palette(palette=None): return None + # set the display color palette for indexed displays + # + # This will change the video display color palette for 8bit displays. + # This does not change the palette for the actual display Surface, + # only the palette that is used to display the Surface. If no palette + # argument is passed, the system default palette will be restored. The + # palette is a sequence of RGB triplets. + # + + self.fail() + + def todo_test_toggle_fullscreen(self): + + # __doc__ (as of 2008-08-02) for pygame.display.toggle_fullscreen: + + # pygame.display.toggle_fullscreen(): return bool + # switch between fullscreen and windowed displays + # + # Switches the display window between windowed and fullscreen modes. + # This function only works under the unix x11 video driver. For most + # situations it is better to call pygame.display.set_mode() with new + # display flags. + # + + self.fail() + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/draw_test.py b/venv/Lib/site-packages/pygame/tests/draw_test.py new file mode 100644 index 0000000..42387db --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/draw_test.py @@ -0,0 +1,1294 @@ +import unittest +import sys + +import pygame +from pygame import draw +from pygame import draw_py +from pygame.locals import SRCALPHA +from pygame.tests import test_utils + +PY3 = sys.version_info >= (3, 0, 0) + +RED = BG_RED = pygame.Color('red') +GREEN = FG_GREEN = pygame.Color('green') + + +def get_border_values(surface, width, height): + """Returns a list containing lists with the values of the surface's + borders. + """ + border_top = [surface.get_at((x, 0)) for x in range(width)] + border_left = [surface.get_at((0, y)) for y in range(height)] + border_right = [ + surface.get_at((width - 1, y)) for y in range(height)] + border_bottom = [ + surface.get_at((x, height - 1)) for x in range(width)] + + return [border_top, border_left, border_right, border_bottom] + + +def corners(surface): + """Returns a tuple with the corner positions of the given surface. + + Clockwise from the top left corner. + """ + width, height = surface.get_size() + return ((0, 0), (width - 1, 0), (width - 1, height - 1), (0, height - 1)) + + +def border_pos_and_color(surface): + """Yields each border position and its color for a given surface. + + Clockwise from the top left corner. + """ + width, height = surface.get_size() + right, bottom = width - 1, height - 1 + + # Top edge. + for x in range(width): + pos = (x, 0) + yield pos, surface.get_at(pos) + + # Right edge. + # Top right done in top edge loop. + for y in range(1, height): + pos = (right, y) + yield pos, surface.get_at(pos) + + # Bottom edge. + # Bottom right done in right edge loop. + for x in range(right - 1, -1, -1): + pos = (x, bottom) + yield pos, surface.get_at(pos) + + # Left edge. + # Bottom left done in bottom edge loop. Top left done in top edge loop. + for y in range(bottom - 1, 0, -1): + pos = (0, y) + yield pos, surface.get_at(pos) + + +class DrawTestCase(unittest.TestCase): + """Base class to test draw module functions.""" + draw_rect = staticmethod(draw.rect) + draw_polygon = staticmethod(draw.polygon) + draw_circle = staticmethod(draw.circle) + draw_ellipse = staticmethod(draw.ellipse) + draw_arc = staticmethod(draw.arc) + draw_line = staticmethod(draw.line) + draw_lines = staticmethod(draw.lines) + draw_aaline = staticmethod(draw.aaline) + draw_aalines = staticmethod(draw.aalines) + + +class PythonDrawTestCase(unittest.TestCase): + """Base class to test draw_py module functions.""" + # draw_py is currently missing some functions. + #draw_rect = staticmethod(draw_py.draw_rect) + draw_polygon = staticmethod(draw_py.draw_polygon) + #draw_circle = staticmethod(draw_py.draw_circle) + #draw_ellipse = staticmethod(draw_py.draw_ellipse) + #draw_arc = staticmethod(draw_py.draw_arc) + draw_line = staticmethod(draw_py.draw_line) + draw_lines = staticmethod(draw_py.draw_lines) + draw_aaline = staticmethod(draw_py.draw_aaline) + draw_aalines = staticmethod(draw_py.draw_aalines) + + +### Ellipse Testing ########################################################### + +class DrawEllipseMixin(object): + """Mixin tests for drawing ellipses. + + This class contains all the general ellipse drawing tests. + """ + + def test_ellipse(self): + """Tests ellipses of differing sizes on surfaces of differing sizes. + + Checks if the number of sides touching the border of the surface is + correct. + """ + left_top = [(0, 0), (1, 0), (0, 1), (1, 1)] + sizes = [(4, 4), (5, 4), (4, 5), (5, 5)] + color = (1, 13, 24, 255) + + def same_size(width, height, border_width): + """Test for ellipses with the same size as the surface.""" + surface = pygame.Surface((width, height)) + + self.draw_ellipse(surface, color, (0, 0, width, height), + border_width) + + # For each of the four borders check if it contains the color + borders = get_border_values(surface, width, height) + for border in borders: + self.assertTrue(color in border) + + def not_same_size(width, height, border_width, left, top): + """Test for ellipses that aren't the same size as the surface.""" + surface = pygame.Surface((width, height)) + + self.draw_ellipse(surface, color, + (left, top, width - 1, height - 1), border_width) + + borders = get_border_values(surface, width, height) + + # Check if two sides of the ellipse are touching the border + sides_touching = [ + color in border for border in borders].count(True) + self.assertEqual(sides_touching, 2) + + for width, height in sizes: + for border_width in (0, 1): + same_size(width, height, border_width) + for left, top in left_top: + not_same_size(width, height, border_width, left, top) + + def _check_1_pixel_sized_ellipse(self, surface, collide_rect, + surface_color, ellipse_color): + # Helper method to check the surface for 1 pixel wide and/or high + # ellipses. + surf_w, surf_h = surface.get_size() + + surface.lock() # For possible speed up. + + for pos in ((x, y) for y in range(surf_h) for x in range(surf_w)): + # Since the ellipse is just a line we can use a rect to help find + # where it is expected to be drawn. + if collide_rect.collidepoint(pos): + expected_color = ellipse_color + else: + expected_color = surface_color + + self.assertEqual(surface.get_at(pos), expected_color, + 'collide_rect={}, pos={}'.format(collide_rect, pos)) + + surface.unlock() + + def test_ellipse__1_pixel_width(self): + """Ensures an ellipse with a width of 1 is drawn correctly. + + An ellipse with a width of 1 pixel is a vertical line. + """ + ellipse_color = pygame.Color('red') + surface_color = pygame.Color('black') + surf_w, surf_h = 10, 20 + + surface = pygame.Surface((surf_w, surf_h)) + rect = pygame.Rect((0, 0), (1, 0)) + collide_rect = rect.copy() + + # Calculate some positions. + off_left = -1 + off_right = surf_w + off_bottom = surf_h + center_x = surf_w // 2 + center_y = surf_h // 2 + + # Test some even and odd heights. + for ellipse_h in range(6, 10): + # The ellipse is drawn on the edge of the rect so collide_rect + # needs +1 height to track where it's drawn. + collide_rect.h = ellipse_h + 1 + rect.h = ellipse_h + + # Calculate some variable positions. + off_top = -(ellipse_h + 1) + half_off_top = -(ellipse_h // 2) + half_off_bottom = surf_h - (ellipse_h // 2) + + # Draw the ellipse in different positions: fully on-surface, + # partially off-surface, and fully off-surface. + positions = ((off_left, off_top), + (off_left, half_off_top), + (off_left, center_y), + (off_left, half_off_bottom), + (off_left, off_bottom), + + (center_x, off_top), + (center_x, half_off_top), + (center_x, center_y), + (center_x, half_off_bottom), + (center_x, off_bottom), + + (off_right, off_top), + (off_right, half_off_top), + (off_right, center_y), + (off_right, half_off_bottom), + (off_right, off_bottom)) + + for rect_pos in positions: + surface.fill(surface_color) # Clear before each draw. + rect.topleft = rect_pos + collide_rect.topleft = rect_pos + + self.draw_ellipse(surface, ellipse_color, rect) + + self._check_1_pixel_sized_ellipse(surface, collide_rect, + surface_color, ellipse_color) + + def test_ellipse__1_pixel_width_spanning_surface(self): + """Ensures an ellipse with a width of 1 is drawn correctly + when spanning the height of the surface. + + An ellipse with a width of 1 pixel is a vertical line. + """ + ellipse_color = pygame.Color('red') + surface_color = pygame.Color('black') + surf_w, surf_h = 10, 20 + + surface = pygame.Surface((surf_w, surf_h)) + rect = pygame.Rect((0, 0), (1, surf_h + 2)) # Longer than the surface. + + # Draw the ellipse in different positions: on-surface and off-surface. + positions = ((-1, -1), # (off_left, off_top) + (0, -1), # (left_edge, off_top) + (surf_w // 2, -1), # (center_x, off_top) + (surf_w - 1, -1), # (right_edge, off_top) + (surf_w, -1)) # (off_right, off_top) + + for rect_pos in positions: + surface.fill(surface_color) # Clear before each draw. + rect.topleft = rect_pos + + self.draw_ellipse(surface, ellipse_color, rect) + + self._check_1_pixel_sized_ellipse(surface, rect, surface_color, + ellipse_color) + + def test_ellipse__1_pixel_height(self): + """Ensures an ellipse with a height of 1 is drawn correctly. + + An ellipse with a height of 1 pixel is a horizontal line. + """ + ellipse_color = pygame.Color('red') + surface_color = pygame.Color('black') + surf_w, surf_h = 20, 10 + + surface = pygame.Surface((surf_w, surf_h)) + rect = pygame.Rect((0, 0), (0, 1)) + collide_rect = rect.copy() + + # Calculate some positions. + off_right = surf_w + off_top = -1 + off_bottom = surf_h + center_x = surf_w // 2 + center_y = surf_h // 2 + + # Test some even and odd widths. + for ellipse_w in range(6, 10): + # The ellipse is drawn on the edge of the rect so collide_rect + # needs +1 width to track where it's drawn. + collide_rect.w = ellipse_w + 1 + rect.w = ellipse_w + + # Calculate some variable positions. + off_left = -(ellipse_w + 1) + half_off_left = -(ellipse_w // 2) + half_off_right = surf_w - (ellipse_w // 2) + + # Draw the ellipse in different positions: fully on-surface, + # partially off-surface, and fully off-surface. + positions = ((off_left, off_top), + (half_off_left, off_top), + (center_x, off_top), + (half_off_right, off_top), + (off_right, off_top), + + (off_left, center_y), + (half_off_left, center_y), + (center_x, center_y), + (half_off_right, center_y), + (off_right, center_y), + + (off_left, off_bottom), + (half_off_left, off_bottom), + (center_x, off_bottom), + (half_off_right, off_bottom), + (off_right, off_bottom)) + + for rect_pos in positions: + surface.fill(surface_color) # Clear before each draw. + rect.topleft = rect_pos + collide_rect.topleft = rect_pos + + self.draw_ellipse(surface, ellipse_color, rect) + + self._check_1_pixel_sized_ellipse(surface, collide_rect, + surface_color, ellipse_color) + + def test_ellipse__1_pixel_height_spanning_surface(self): + """Ensures an ellipse with a height of 1 is drawn correctly + when spanning the width of the surface. + + An ellipse with a height of 1 pixel is a horizontal line. + """ + ellipse_color = pygame.Color('red') + surface_color = pygame.Color('black') + surf_w, surf_h = 20, 10 + + surface = pygame.Surface((surf_w, surf_h)) + rect = pygame.Rect((0, 0), (surf_w + 2, 1)) # Wider than the surface. + + # Draw the ellipse in different positions: on-surface and off-surface. + positions = ((-1, -1), # (off_left, off_top) + (-1, 0), # (off_left, top_edge) + (-1, surf_h // 2), # (off_left, center_y) + (-1, surf_h - 1), # (off_left, bottom_edge) + (-1, surf_h)) # (off_left, off_bottom) + + for rect_pos in positions: + surface.fill(surface_color) # Clear before each draw. + rect.topleft = rect_pos + + self.draw_ellipse(surface, ellipse_color, rect) + + self._check_1_pixel_sized_ellipse(surface, rect, surface_color, + ellipse_color) + + def test_ellipse__1_pixel_width_and_height(self): + """Ensures an ellipse with a width and height of 1 is drawn correctly. + + An ellipse with a width and height of 1 pixel is a single pixel. + """ + ellipse_color = pygame.Color('red') + surface_color = pygame.Color('black') + surf_w, surf_h = 10, 10 + + surface = pygame.Surface((surf_w, surf_h)) + rect = pygame.Rect((0, 0), (1, 1)) + + # Calculate some positions. + off_left = -1 + off_right = surf_w + off_top = -1 + off_bottom = surf_h + left_edge = 0 + right_edge = surf_w - 1 + top_edge = 0 + bottom_edge = surf_h - 1 + center_x = surf_w // 2 + center_y = surf_h // 2 + + # Draw the ellipse in different positions: center surface, + # top/bottom/left/right edges, and off-surface. + positions = ((off_left, off_top), + (off_left, top_edge), + (off_left, center_y), + (off_left, bottom_edge), + (off_left, off_bottom), + + (left_edge, off_top), + (left_edge, top_edge), + (left_edge, center_y), + (left_edge, bottom_edge), + (left_edge, off_bottom), + + (center_x, off_top), + (center_x, top_edge), + (center_x, center_y), + (center_x, bottom_edge), + (center_x, off_bottom), + + (right_edge, off_top), + (right_edge, top_edge), + (right_edge, center_y), + (right_edge, bottom_edge), + (right_edge, off_bottom), + + (off_right, off_top), + (off_right, top_edge), + (off_right, center_y), + (off_right, bottom_edge), + (off_right, off_bottom)) + + for rect_pos in positions: + surface.fill(surface_color) # Clear before each draw. + rect.topleft = rect_pos + + self.draw_ellipse(surface, ellipse_color, rect) + + self._check_1_pixel_sized_ellipse(surface, rect, surface_color, + ellipse_color) + + +class DrawEllipseTest(DrawEllipseMixin, DrawTestCase): + """Test draw module function ellipse. + + This class inherits the general tests from DrawEllipseMixin. It is also + the class to add any draw.ellipse specific tests to. + """ + + +@unittest.skip('draw_py.draw_ellipse not supported yet') +class PythonDrawEllipseTest(DrawEllipseMixin, PythonDrawTestCase): + """Test draw_py module function draw_ellipse. + + This class inherits the general tests from DrawEllipseMixin. It is also + the class to add any draw_py.draw_ellipse specific tests to. + """ + + +### Line Testing ############################################################## + +class LineMixin(object): + """Mixin test for drawing lines and aalines. + + This class contains all the general line/lines/aaline/aalines drawing + tests. + """ + + def setUp(self): + self._colors = ((0, 0, 0), (255, 0, 0), (0, 255, 0), (0, 0, 255), + (255, 255, 0), (255, 0, 255), (0, 255, 255), + (255, 255, 255)) + + # Create some surfaces with different sizes, depths, and flags. + self._surfaces = [] + for size in ((49, 49), (50, 50)): + for depth in (8, 16, 24, 32): + for flags in (0, SRCALPHA): + surface = pygame.display.set_mode(size, flags, depth) + self._surfaces.append(surface) + self._surfaces.append(surface.convert_alpha()) + + def test_line__color(self): + """Tests if the line drawn is the correct color.""" + pos = (0, 0) + for surface in self._surfaces: + for expected_color in self._colors: + self.draw_line(surface, expected_color, pos, (1, 0)) + + self.assertEqual(surface.get_at(pos), expected_color, + 'pos={}'.format(pos)) + + def test_aaline__color(self): + """Tests if the aaline drawn is the correct color.""" + pos = (0, 0) + for surface in self._surfaces: + for expected_color in self._colors: + self.draw_aaline(surface, expected_color, pos, (1, 0)) + + self.assertEqual(surface.get_at(pos), expected_color, + 'pos={}'.format(pos)) + + def test_line__gaps(self): + """Tests if the line drawn contains any gaps.""" + expected_color = (255, 255, 255) + for surface in self._surfaces: + width = surface.get_width() + self.draw_line(surface, expected_color, (0, 0), (width - 1, 0)) + + for x in range(width): + pos = (x, 0) + self.assertEqual(surface.get_at(pos), expected_color, + 'pos={}'.format(pos)) + + def test_aaline__gaps(self): + """Tests if the aaline drawn contains any gaps. + + See: #512 + """ + expected_color = (255, 255, 255) + for surface in self._surfaces: + width = surface.get_width() + self.draw_aaline(surface, expected_color, (0, 0), (width - 1, 0)) + + for x in range(width): + pos = (x, 0) + self.assertEqual(surface.get_at(pos), expected_color, + 'pos={}'.format(pos)) + + def test_lines__color(self): + """Tests if the lines drawn are the correct color. + + Draws lines around the border of the given surface and checks if all + borders of the surface only contain the given color. + """ + for surface in self._surfaces: + for expected_color in self._colors: + self.draw_lines(surface, expected_color, True, + corners(surface)) + + for pos, color in border_pos_and_color(surface): + self.assertEqual(color, expected_color, + 'pos={}'.format(pos)) + + def test_aalines__color(self): + """Tests if the aalines drawn are the correct color. + + Draws aalines around the border of the given surface and checks if all + borders of the surface only contain the given color. + """ + for surface in self._surfaces: + for expected_color in self._colors: + self.draw_aalines(surface, expected_color, True, + corners(surface)) + + for pos, color in border_pos_and_color(surface): + self.assertEqual(color, expected_color, + 'pos={}'.format(pos)) + + def test_lines__gaps(self): + """Tests if the lines drawn contain any gaps. + + Draws lines around the border of the given surface and checks if + all borders of the surface contain any gaps. + """ + expected_color = (255, 255, 255) + for surface in self._surfaces: + self.draw_lines(surface, expected_color, True, corners(surface)) + + for pos, color in border_pos_and_color(surface): + self.assertEqual(color, expected_color, 'pos={}'.format(pos)) + + def test_aalines__gaps(self): + """Tests if the aalines drawn contain any gaps. + + Draws aalines around the border of the given surface and checks if + all borders of the surface contain any gaps. + + See: #512 + """ + expected_color = (255, 255, 255) + for surface in self._surfaces: + self.draw_aalines(surface, expected_color, True, corners(surface)) + + for pos, color in border_pos_and_color(surface): + self.assertEqual(color, expected_color, 'pos={}'.format(pos)) + + +class PythonDrawLineTest(LineMixin, DrawTestCase): + """Test draw_py module functions: line, lines, aaline, and aalines. + + This class inherits the general tests from LineMixin. It is also the class + to add any draw_py.draw_line/lines/aaline/aalines specific tests to. + """ + + +class DrawLineTest(LineMixin, PythonDrawTestCase): + """Test draw module functions: line, lines, aaline, and aalines. + + This class inherits the general tests from LineMixin. It is also the class + to add any draw.line/lines/aaline/aalines specific tests to. + """ + + def test_path_data_validation(self): + """Test validation of multi-point drawing methods. + + See bug #521 + """ + surf = pygame.Surface((5, 5)) + rect = pygame.Rect(0, 0, 5, 5) + bad_values = ('text', b'bytes', 1 + 1j, # string, bytes, complex, + object(), (lambda x: x)) # object, function + bad_points = list(bad_values) + [(1,) , (1, 2, 3)] # wrong tuple length + bad_points.extend((1, v) for v in bad_values) # one wrong value + good_path = [(1, 1), (1, 3), (3, 3), (3, 1)] + # A) draw.lines + check_pts = [(x, y) for x in range(5) for y in range(5)] + for method, is_polgon in ((draw.lines, 0), (draw.aalines, 0), + (draw.polygon, 1)): + for val in bad_values: + # 1. at the beginning + draw.rect(surf, RED, rect, 0) + with self.assertRaises(TypeError): + if is_polgon: + method(surf, GREEN, [val] + good_path, 0) + else: + method(surf, GREEN, True, [val] + good_path) + # make sure, nothing was drawn : + self.assertTrue(all(surf.get_at(pt) == RED for pt in check_pts)) + # 2. not at the beginning (was not checked) + draw.rect(surf, RED, rect, 0) + with self.assertRaises(TypeError): + path = good_path[:2] + [val] + good_path[2:] + if is_polgon: + method(surf, GREEN, path, 0) + else: + method(surf, GREEN, True, path) + # make sure, nothing was drawn : + self.assertTrue(all(surf.get_at(pt) == RED for pt in check_pts)) + + def _test_endianness(self, draw_func): + """ test color component order + """ + depths = 24, 32 + for depth in depths: + surface = pygame.Surface((5, 3), 0, depth) + surface.fill(pygame.Color(0,0,0)) + draw_func(surface, pygame.Color(255, 0, 0), (0, 1), (2, 1), 1) + self.assertGreater(surface.get_at((1, 1)).r, 0, 'there should be red here') + surface.fill(pygame.Color(0,0,0)) + draw_func(surface, pygame.Color(0, 0, 255), (0, 1), (2, 1), 1) + self.assertGreater(surface.get_at((1, 1)).b, 0, 'there should be blue here') + + def test_line_endianness(self): + """ test color component order + """ + self._test_endianness(draw.line) + + def test_aaline_endianness(self): + """ test color component order + """ + self._test_endianness(draw.aaline) + + def test_color_validation(self): + surf = pygame.Surface((10, 10)) + colors = 123456, (1, 10, 100), RED # but not '#ab12df' or 'red' ... + points = ((0, 0), (1, 1), (1, 0)) + # 1. valid colors + for col in colors: + draw.line(surf, col, (0, 0), (1, 1)) + draw.aaline(surf, col, (0, 0), (1, 1)) + draw.aalines(surf, col, True, points) + draw.lines(surf, col, True, points) + draw.arc(surf, col, pygame.Rect(0, 0, 3, 3), 15, 150) + draw.ellipse(surf, col, pygame.Rect(0, 0, 3, 6), 1) + draw.circle(surf, col, (7, 3), 2) + draw.polygon(surf, col, points, 0) + # 2. invalid colors + for col in ('invalid', 1.256, object(), None, '#ab12df', 'red'): + with self.assertRaises(TypeError): + draw.line(surf, col, (0, 0), (1, 1)) + with self.assertRaises(TypeError): + draw.aaline(surf, col, (0, 0), (1, 1)) + with self.assertRaises(TypeError): + draw.aalines(surf, col, True, points) + with self.assertRaises(TypeError): + draw.lines(surf, col, True, points) + with self.assertRaises(TypeError): + draw.arc(surf, col, pygame.Rect(0, 0, 3, 3), 15, 150) + with self.assertRaises(TypeError): + draw.ellipse(surf, col, pygame.Rect(0, 0, 3, 6), 1) + with self.assertRaises(TypeError): + draw.circle(surf, col, (7, 3), 2) + with self.assertRaises(TypeError): + draw.polygon(surf, col, points, 0) + + +# Using a separate class to test line anti-aliasing. +class AntiAliasedLineMixin(object): + """Mixin tests for line anti-aliasing. + + This class contains all the general anti-aliasing line drawing tests. + """ + + def setUp(self): + self.surface = pygame.Surface((10, 10)) + draw.rect(self.surface, BG_RED, (0, 0, 10, 10), 0) + + def _check_antialiasing(self, from_point, to_point, should, check_points, + set_endpoints=True): + """Draw a line between two points and check colors of check_points.""" + if set_endpoints: + should[from_point] = should[to_point] = FG_GREEN + + def check_one_direction(from_point, to_point, should): + self.draw_aaline(self.surface, FG_GREEN, from_point, to_point, + True) + + for pt in check_points: + color = should.get(pt, BG_RED) + if PY3: # "subTest" is sooo helpful, but does not exist in PY2 + with self.subTest(from_pt=from_point, pt=pt, to=to_point): + self.assertEqual(self.surface.get_at(pt), color) + else: + self.assertEqual(self.surface.get_at(pt), color) + # reset + draw.rect(self.surface, BG_RED, (0, 0, 10, 10), 0) + + # it is important to test also opposite direction, the algorithm + # is (#512) or was not symmetric + check_one_direction(from_point, to_point, should) + if from_point != to_point: + check_one_direction(to_point, from_point, should) + + def test_short_non_antialiased_lines(self): + """test very short not anti aliased lines in all directions.""" + # Horizontal, vertical and diagonal lines should not be anti-aliased, + # even with draw.aaline ... + check_points = [(i, j) for i in range(3, 8) for j in range(3, 8)] + + def check_both_directions(from_pt, to_pt, other_points): + should = {pt: FG_GREEN for pt in other_points} + self._check_antialiasing(from_pt, to_pt, should, check_points) + + # 0. one point + check_both_directions((5, 5), (5, 5), []) + # 1. horizontal + check_both_directions((4, 7), (5, 7), []) + check_both_directions((5, 4), (7, 4), [(6, 4)]) + + # 2. vertical + check_both_directions((5, 5), (5, 6), []) + check_both_directions((6, 4), (6, 6), [(6, 5)]) + # 3. diagonals + check_both_directions((5, 5), (6, 6), []) + check_both_directions((5, 5), (7, 7), [(6, 6)]) + check_both_directions((5, 6), (6, 5), []) + check_both_directions((6, 4), (4, 6), [(5, 5)]) + + def test_short_line_anti_aliasing(self): + check_points = [(i, j) for i in range(3, 8) for j in range(3, 8)] + + def check_both_directions(from_pt, to_pt, should): + self._check_antialiasing(from_pt, to_pt, should, check_points) + + # lets say dx = abs(x0 - x1) ; dy = abs(y0 - y1) + brown = (127, 127, 0) + # dy / dx = 0.5 + check_both_directions((4, 4), (6, 5), {(5, 4): brown, (5, 5): brown}) + check_both_directions((4, 5), (6, 4), {(5, 4): brown, (5, 5): brown}) + # dy / dx = 2 + check_both_directions((4, 4), (5, 6), {(4, 5): brown, (5, 5): brown}) + check_both_directions((5, 4), (4, 6), {(4, 5): brown, (5, 5): brown}) + + # some little longer lines; so we need to check more points: + check_points = [(i, j) for i in range(2, 9) for j in range(2, 9)] + # dy / dx = 0.25 + reddish = (191, 63, 0) + greenish = (63, 191, 0) + should = {(4, 3): greenish, (5, 3): brown, (6, 3): reddish, + (4, 4): reddish, (5, 4): brown, (6, 4): greenish} + check_both_directions((3, 3), (7, 4), should) + should = {(4, 3): reddish, (5, 3): brown, (6, 3): greenish, + (4, 4): greenish, (5, 4): brown, (6, 4): reddish} + check_both_directions((3, 4), (7, 3), should) + # dy / dx = 4 + should = {(4, 4): greenish, (4, 5): brown, (4, 6): reddish, + (5, 4): reddish, (5, 5): brown, (5, 6): greenish, + } + check_both_directions((4, 3), (5, 7), should) + should = {(4, 4): reddish, (4, 5): brown, (4, 6): greenish, + (5, 4): greenish, (5, 5): brown, (5, 6): reddish} + check_both_directions((5, 3), (4, 7), should) + + def test_anti_aliasing_float_coordinates(self): + """Float coordinates should be blended smoothly.""" + check_points = [(i, j) for i in range(5) for j in range(5)] + brown = (127, 127, 0) + + # 0. identical point : current implementation does no smoothing... + expected = {(1, 2): FG_GREEN} + self._check_antialiasing((1.5, 2), (1.5, 2), expected, + check_points, set_endpoints=False) + expected = {(2, 2): FG_GREEN} + self._check_antialiasing((2.5, 2.7), (2.5, 2.7), expected, + check_points, set_endpoints=False) + + # 1. horizontal lines + # a) blend endpoints + expected = {(1, 2): brown, (2, 2): FG_GREEN} + self._check_antialiasing((1.5, 2), (2, 2), expected, + check_points, set_endpoints=False) + expected = {(1, 2): brown, (2, 2): FG_GREEN, (3, 2): brown} + self._check_antialiasing((1.5, 2), (2.5, 2), expected, + check_points, set_endpoints=False) + expected = {(2, 2): brown, (1, 2): FG_GREEN, } + self._check_antialiasing((1, 2), (1.5, 2), expected, + check_points, set_endpoints=False) + expected = {(1, 2): brown, (2, 2): (63, 191, 0)} + self._check_antialiasing((1.5, 2), (1.75, 2), expected, + check_points, set_endpoints=False) + + # b) blend y-coordinate + expected = {(x, y): brown for x in range(2, 5) for y in (1, 2)} + self._check_antialiasing((2, 1.5), (4, 1.5), expected, + check_points, set_endpoints=False) + + # 2. vertical lines + # a) blend endpoints + expected = {(2, 1): brown, (2, 2): FG_GREEN, (2, 3): brown} + self._check_antialiasing((2, 1.5), (2, 2.5), expected, + check_points, set_endpoints=False) + expected = {(2, 1): brown, (2, 2): (63, 191, 0)} + self._check_antialiasing((2, 1.5), (2, 1.75), expected, + check_points, set_endpoints=False) + # b) blend x-coordinate + expected = {(x, y): brown for x in (1, 2) for y in range(2, 5)} + self._check_antialiasing((1.5, 2), (1.5, 4), expected, + check_points, set_endpoints=False) + # 3. diagonal lines + # a) blend endpoints + expected = {(1, 1): brown, (2, 2): FG_GREEN, (3, 3): brown} + self._check_antialiasing((1.5, 1.5), (2.5, 2.5), expected, + check_points, set_endpoints=False) + expected = {(3, 1): brown, (2, 2): FG_GREEN, (1, 3): brown} + self._check_antialiasing((2.5, 1.5), (1.5, 2.5), expected, + check_points, set_endpoints=False) + # b) blend sidewards + expected = {(2, 1): brown, (2, 2): brown, (3, 2): brown, (3, 3): brown} + self._check_antialiasing((2, 1.5), (3, 2.5), expected, + check_points, set_endpoints=False) + + reddish = (191, 63, 0) + greenish = (63, 191, 0) + expected = {(2, 1): greenish, (2, 2): reddish, + (3, 2): greenish, (3, 3): reddish, + (4, 3): greenish, (4, 4): reddish} + self._check_antialiasing((2, 1.25), (4, 3.25), expected, + check_points, set_endpoints=False) + + def test_anti_aliasing_at_and_outside_the_border(self): + check_points = [(i, j) for i in range(10) for j in range(10)] + + reddish = (191, 63, 0) + brown = (127, 127, 0) + greenish = (63, 191, 0) + from_point, to_point = (3, 3), (7, 4) + should = {(4, 3): greenish, (5, 3): brown, (6, 3): reddish, + (4, 4): reddish, (5, 4): brown, (6, 4): greenish} + + for dx, dy in ((-4, 0), (4, 0), # moved to left and right borders + (0, -5), (0, -4), (0, -3), # upper border + (0, 5), (0, 6), (0, 7), # lower border + (-4, -4), (-4, -3), (-3, -4)): # upper left corner + first = from_point[0] + dx, from_point[1] + dy + second = to_point[0] + dx, to_point[1] + dy + expected = {(x + dx, y + dy): color + for (x, y), color in should.items()} + self._check_antialiasing(first, second, expected, check_points) + + +@unittest.expectedFailure +class AntiAliasingLineTest(AntiAliasedLineMixin, DrawTestCase): + """Test anti-aliasing for draw. + + This class inherits the general tests from AntiAliasedLineMixin. It is + also the class to add any anti-aliasing draw specific tests to. + """ + +class PythonAntiAliasingLineTest(AntiAliasedLineMixin, PythonDrawTestCase): + """Test anti-aliasing for draw_py. + + This class inherits the general tests from AntiAliasedLineMixin. It is + also the class to add any anti-aliasing draw_py specific tests to. + """ + + +### Draw Module Testing ####################################################### + +# These tests should eventually be moved to their appropriate mixin/class. +class DrawModuleTest(unittest.TestCase): + + def setUp(self): + (self.surf_w, self.surf_h) = self.surf_size = (320, 200) + self.surf = pygame.Surface(self.surf_size, pygame.SRCALPHA) + self.color = (1, 13, 24, 205) + + def test_rect__fill(self): + # __doc__ (as of 2008-06-25) for pygame.draw.rect: + + # pygame.draw.rect(Surface, color, Rect, width=0): return Rect + # draw a rectangle shape + + rect = pygame.Rect(10, 10, 25, 20) + drawn = draw.rect(self.surf, self.color, rect, 0) + + self.assertEqual(drawn, rect) + + # Should be colored where it's supposed to be + for pt in test_utils.rect_area_pts(rect): + color_at_pt = self.surf.get_at(pt) + self.assertEqual(color_at_pt, self.color) + + # And not where it shouldn't + for pt in test_utils.rect_outer_bounds(rect): + color_at_pt = self.surf.get_at(pt) + self.assertNotEqual(color_at_pt, self.color) + + # Issue #310: Cannot draw rectangles that are 1 pixel high + bgcolor = pygame.Color('black') + self.surf.fill(bgcolor) + hrect = pygame.Rect(1, 1, self.surf_w - 2, 1) + vrect = pygame.Rect(1, 3, 1, self.surf_h - 4) + drawn = draw.rect(self.surf, self.color, hrect, 0) + self.assertEqual(drawn, hrect) + x, y = hrect.topleft + w, h = hrect.size + self.assertEqual(self.surf.get_at((x - 1, y)), bgcolor) + self.assertEqual(self.surf.get_at((x + w, y)), bgcolor) + for i in range(x, x + w): + self.assertEqual(self.surf.get_at((i, y)), self.color) + drawn = draw.rect(self.surf, self.color, vrect, 0) + self.assertEqual(drawn, vrect) + x, y = vrect.topleft + w, h = vrect.size + self.assertEqual(self.surf.get_at((x, y - 1)), bgcolor) + self.assertEqual(self.surf.get_at((x, y + h)), bgcolor) + for i in range(y, y + h): + self.assertEqual(self.surf.get_at((x, i)), self.color) + + def test_rect__one_pixel_lines(self): + rect = pygame.Rect(10, 10, 56, 20) + + drawn = draw.rect(self.surf, self.color, rect, 1) + self.assertEqual(drawn, rect) + + # Should be colored where it's supposed to be + for pt in test_utils.rect_perimeter_pts(drawn): + color_at_pt = self.surf.get_at(pt) + self.assertEqual(color_at_pt, self.color) + + # And not where it shouldn't + for pt in test_utils.rect_outer_bounds(drawn): + color_at_pt = self.surf.get_at(pt) + self.assertNotEqual(color_at_pt, self.color) + + # See DrawLineTest class for additional draw.line() and draw.aaline() + # tests. + def test_line(self): + # (l, t), (l, t) + drawn = draw.line(self.surf, self.color, (1, 0), (200, 0)) + self.assertEqual(drawn.right, 201, + "end point arg should be (or at least was) inclusive") + + # Should be colored where it's supposed to be + for pt in test_utils.rect_area_pts(drawn): + self.assertEqual(self.surf.get_at(pt), self.color) + + # And not where it shouldn't + for pt in test_utils.rect_outer_bounds(drawn): + self.assertNotEqual(self.surf.get_at(pt), self.color) + + # Line width greater that 1 + line_width = 2 + offset = 5 + a = (offset, offset) + b = (self.surf_size[0] - offset, a[1]) + c = (a[0], self.surf_size[1] - offset) + d = (b[0], c[1]) + e = (a[0] + offset, c[1]) + f = (b[0], c[0] + 5) + lines = [(a, d), (b, c), (c, b), (d, a), + (a, b), (b, a), (a, c), (c, a), + (a, e), (e, a), (a, f), (f, a), + (a, a),] + for p1, p2 in lines: + msg = "%s - %s" % (p1, p2) + if p1[0] <= p2[0]: + plow = p1 + phigh = p2 + else: + plow = p2 + phigh = p1 + self.surf.fill((0, 0, 0)) + rec = draw.line(self.surf, (255, 255, 255), p1, p2, line_width) + xinc = yinc = 0 + if abs(p1[0] - p2[0]) > abs(p1[1] - p2[1]): + yinc = 1 + else: + xinc = 1 + for i in range(line_width): + p = (p1[0] + xinc * i, p1[1] + yinc * i) + self.assertEqual(self.surf.get_at(p), (255, 255, 255), msg) + p = (p2[0] + xinc * i, p2[1] + yinc * i) + self.assertEqual(self.surf.get_at(p), (255, 255, 255), msg) + p = (plow[0] - 1, plow[1]) + self.assertEqual(self.surf.get_at(p), (0, 0, 0), msg) + p = (plow[0] + xinc * line_width, plow[1] + yinc * line_width) + self.assertEqual(self.surf.get_at(p), (0, 0, 0), msg) + p = (phigh[0] + xinc * line_width, phigh[1] + yinc * line_width) + self.assertEqual(self.surf.get_at(p), (0, 0, 0), msg) + if p1[0] < p2[0]: + rx = p1[0] + else: + rx = p2[0] + if p1[1] < p2[1]: + ry = p1[1] + else: + ry = p2[1] + w = abs(p2[0] - p1[0]) + 1 + xinc * (line_width - 1) + h = abs(p2[1] - p1[1]) + 1 + yinc * (line_width - 1) + msg += ", %s" % (rec,) + self.assertEqual(rec, (rx, ry, w, h), msg) + + @unittest.expectedFailure + def test_line_for_gaps(self): + """ |tags: ignore| + """ + # __doc__ (as of 2008-06-25) for pygame.draw.line: + + # pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect + # draw a straight line segment + + # This checks bug Thick Line Bug #448 + + width = 200 + height = 200 + surf = pygame.Surface((width, height), pygame.SRCALPHA) + + def white_surrounded_pixels(x, y): + offsets = [(1, 0), (0, 1), (-1, 0), (0, -1)] + WHITE = (255, 255, 255, 255) + return len([1 for dx, dy in offsets + if surf.get_at((x+dx, y+dy)) == WHITE]) + + def check_white_line(start, end): + surf.fill((0, 0, 0)) + pygame.draw.line(surf, (255, 255, 255), start, end, 30) + + BLACK = (0, 0, 0, 255) + for x in range(1, width-1): + for y in range(1, height-1): + if surf.get_at((x, y)) == BLACK: + self.assertTrue(white_surrounded_pixels(x, y) < 3) + + check_white_line((50, 50), (140, 0)) + check_white_line((50, 50), (0, 120)) + check_white_line((50, 50), (199, 198)) + + +### Polygon Testing ########################################################### + +SQUARE = ([0, 0], [3, 0], [3, 3], [0, 3]) +DIAMOND = [(1, 3), (3, 5), (5, 3), (3, 1)] +CROSS = ([2, 0], [4, 0], [4, 2], [6, 2], + [6, 4], [4, 4], [4, 6], [2, 6], + [2, 4], [0, 4], [0, 2], [2, 2]) + + +class DrawPolygonMixin(object): + """Mixin tests for drawing polygons. + + This class contains all the general polygon drawing tests. + """ + + def setUp(self): + self.surface = pygame.Surface((20, 20)) + + def test_draw_square(self): + self.draw_polygon(self.surface, RED, SQUARE, 0) + # note : there is a discussion (#234) if draw.polygon should include or + # not the right or lower border; here we stick with current behavior, + # eg include those borders ... + for x in range(4): + for y in range(4): + self.assertEqual(self.surface.get_at((x, y)), RED) + + def test_draw_diamond(self): + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + self.draw_polygon(self.surface, GREEN, DIAMOND, 0) + # this diamond shape is equivalent to its four corners, plus inner square + for x, y in DIAMOND: + self.assertEqual(self.surface.get_at((x, y)), GREEN, msg=str((x, y))) + for x in range(2, 5): + for y in range(2, 5): + self.assertEqual(self.surface.get_at((x, y)), GREEN) + + def test_1_pixel_high_or_wide_shapes(self): + # 1. one-pixel-high, filled + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + self.draw_polygon(self.surface, GREEN, [(x, 2) for x, _y in CROSS], 0) + cross_size = 6 # the maximum x or y coordinate of the cross + for x in range(cross_size + 1): + self.assertEqual(self.surface.get_at((x, 1)), RED) + self.assertEqual(self.surface.get_at((x, 2)), GREEN) + self.assertEqual(self.surface.get_at((x, 3)), RED) + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + # 2. one-pixel-high, not filled + self.draw_polygon(self.surface, GREEN, [(x, 5) for x, _y in CROSS], 1) + for x in range(cross_size + 1): + self.assertEqual(self.surface.get_at((x, 4)), RED) + self.assertEqual(self.surface.get_at((x, 5)), GREEN) + self.assertEqual(self.surface.get_at((x, 6)), RED) + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + # 3. one-pixel-wide, filled + self.draw_polygon(self.surface, GREEN, [(3, y) for _x, y in CROSS], 0) + for y in range(cross_size + 1): + self.assertEqual(self.surface.get_at((2, y)), RED) + self.assertEqual(self.surface.get_at((3, y)), GREEN) + self.assertEqual(self.surface.get_at((4, y)), RED) + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + # 4. one-pixel-wide, not filled + self.draw_polygon(self.surface, GREEN, [(4, y) for _x, y in CROSS], 1) + for y in range(cross_size + 1): + self.assertEqual(self.surface.get_at((3, y)), RED) + self.assertEqual(self.surface.get_at((4, y)), GREEN) + self.assertEqual(self.surface.get_at((5, y)), RED) + + def test_draw_symetric_cross(self): + """non-regression on issue #234 : x and y where handled inconsistently. + + Also, the result is/was different whether we fill or not the polygon. + """ + # 1. case width = 1 (not filled: `polygon` calls internally the `lines` function) + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + self.draw_polygon(self.surface, GREEN, CROSS, 1) + inside = [(x, 3) for x in range(1, 6)] + [(3, y) for y in range(1, 6)] + for x in range(10): + for y in range(10): + if (x, y) in inside: + self.assertEqual(self.surface.get_at((x, y)), RED) + elif (x in range(2, 5) and y <7) or (y in range(2, 5) and x < 7): + # we are on the border of the cross: + self.assertEqual(self.surface.get_at((x, y)), GREEN) + else: + # we are outside + self.assertEqual(self.surface.get_at((x, y)), RED) + + # 2. case width = 0 (filled; this is the example from #234) + pygame.draw.rect(self.surface, RED, (0, 0, 10, 10), 0) + self.draw_polygon(self.surface, GREEN, CROSS, 0) + inside = [(x, 3) for x in range(1, 6)] + [(3, y) for y in range(1, 6)] + for x in range(10): + for y in range(10): + if (x in range(2, 5) and y <7) or (y in range(2, 5) and x < 7): + # we are on the border of the cross: + self.assertEqual(self.surface.get_at((x, y)), GREEN, msg=str((x, y))) + else: + # we are outside + self.assertEqual(self.surface.get_at((x, y)), RED) + + def test_illumine_shape(self): + """non-regression on issue #313""" + rect = pygame.Rect((0, 0, 20, 20)) + path_data = [(0, 0), (rect.width-1, 0), # upper border + (rect.width-5, 5-1), (5-1, 5-1), # upper inner + (5- 1, rect.height-5), (0, rect.height-1)] # lower diagonal + # The shape looks like this (the numbers are the indices of path_data) + + # 0**********************1 <-- upper border + # *********************** + # ********************** + # ********************* + # ****3**************2 <-- upper inner border + # ***** + # ***** (more lines here) + # ***** + # ****4 + # **** + # *** + # ** + # 5 + # + + # the current bug is that the "upper inner" line is not drawn, but only + # if 4 or some lower corner exists + pygame.draw.rect(self.surface, RED, (0, 0, 20, 20), 0) + + # 1. First without the corners 4 & 5 + self.draw_polygon(self.surface, GREEN, path_data[:4], 0) + for x in range(20): + self.assertEqual(self.surface.get_at((x, 0)), GREEN) # upper border + for x in range(4, rect.width-5 +1): + self.assertEqual(self.surface.get_at((x, 4)), GREEN) # upper inner + + # 2. with the corners 4 & 5 + pygame.draw.rect(self.surface, RED, (0, 0, 20, 20), 0) + self.draw_polygon(self.surface, GREEN, path_data, 0) + for x in range(4, rect.width-5 +1): + self.assertEqual(self.surface.get_at((x, 4)), GREEN) # upper inner + + def test_invalid_points(self): + self.assertRaises(TypeError, lambda: self.draw_polygon(self.surface, + RED, ((0, 0), (0, 20), (20, 20), 20), 0)) + + +class DrawPolygonTest(DrawPolygonMixin, DrawTestCase): + """Test draw module function polygon. + + This class inherits the general tests from DrawPolygonMixin. It is also + the class to add any draw.polygon specific tests to. + """ + + +class PythonDrawPolygonTest(DrawPolygonMixin, PythonDrawTestCase): + """Test draw_py module function draw_polygon. + + This class inherits the general tests from DrawPolygonMixin. It is also + the class to add any draw_py.draw_polygon specific tests to. + """ + + +### Rect Testing ############################################################## + +class DrawRectMixin(object): + """Mixin tests for drawing rects. + + This class contains all the general rect drawing tests. + """ + + def todo_test_circle(self): + self.fail() + + +class DrawRectTest(DrawRectMixin, DrawTestCase): + """Test draw module function rect. + + This class inherits the general tests from DrawRectMixin. It is also the + class to add any draw.rect specific tests to. + """ + + +class PythonDrawRectTest(DrawRectMixin, PythonDrawTestCase): + """Test draw_py module function draw_rect. + + This class inherits the general tests from DrawRectMixin. It is also the + class to add any draw_py.draw_rect specific tests to. + """ + + +### Circle Testing ############################################################ + +class DrawCircleMixin(object): + """Mixin tests for drawing circles. + + This class contains all the general circle drawing tests. + """ + + def todo_test_circle(self): + self.fail() + +class DrawCircleTest(DrawCircleMixin, DrawTestCase): + """Test draw module function circle. + + This class inherits the general tests from DrawCircleMixin. It is also + the class to add any draw.circle specific tests to. + """ + + +class PythonDrawCircleTest(DrawCircleMixin, PythonDrawTestCase): + """Test draw_py module function draw_circle." + + This class inherits the general tests from DrawCircleMixin. It is also + the class to add any draw_py.draw_circle specific tests to. + """ + + +### Arc Testing ############################################################### + +class DrawArcMixin(object): + """Mixin tests for drawing arcs. + + This class contains all the general arc drawing tests. + """ + + def todo_test_arc(self): + self.fail() + + +class DrawArcTest(DrawArcMixin, DrawTestCase): + """Test draw module function arc. + + This class inherits the general tests from DrawArcMixin. It is also the + class to add any draw.arc specific tests to. + """ + + +class PythonDrawArcTest(DrawArcMixin, PythonDrawTestCase): + """Test draw_py module function draw_arc. + + This class inherits the general tests from DrawArcMixin. It is also the + class to add any draw_py.draw_arc specific tests to. + """ + + +############################################################################### + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/event_test.py b/venv/Lib/site-packages/pygame/tests/event_test.py new file mode 100644 index 0000000..fccb4cf --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/event_test.py @@ -0,0 +1,340 @@ +import os +import unittest + +import pygame +from pygame.compat import as_unicode + +################################################################################ + +events = ( +# pygame.NOEVENT, +# pygame.ACTIVEEVENT, + pygame.KEYDOWN, + pygame.KEYUP, + pygame.MOUSEMOTION, + pygame.MOUSEBUTTONDOWN, + pygame.MOUSEBUTTONUP, + pygame.JOYAXISMOTION, + pygame.JOYBALLMOTION, + pygame.JOYHATMOTION, + pygame.JOYBUTTONDOWN, + pygame.JOYBUTTONUP, + pygame.VIDEORESIZE, + pygame.VIDEOEXPOSE, + pygame.QUIT, + pygame.SYSWMEVENT, + pygame.USEREVENT, +# pygame.NUMEVENTS, +) + + +class EventTypeTest(unittest.TestCase): + def test_Event(self): + """Ensure an Event object can be created.""" + e = pygame.event.Event(pygame.USEREVENT, some_attr=1, other_attr='1') + + self.assertEqual(e.some_attr, 1) + self.assertEqual(e.other_attr, "1") + + # Event now uses tp_dictoffset and tp_members: request 62 + # on Motherhamster Bugzilla. + self.assertEqual(e.type, pygame.USEREVENT) + self.assertIs(e.dict, e.__dict__) + + e.some_attr = 12 + + self.assertEqual(e.some_attr, 12) + + e.new_attr = 15 + + self.assertEqual(e.new_attr, 15) + + # For Python 2.x a TypeError is raised for a readonly member; + # for Python 3.x it is an AttributeError. + self.assertRaises((TypeError, AttributeError), setattr, e, 'type', 0) + self.assertRaises((TypeError, AttributeError), setattr, e, 'dict', None) + + # Ensure attributes are visible to dir(), part of the original + # posted request. + d = dir(e) + attrs = ('type', 'dict', '__dict__', 'some_attr', 'other_attr', + 'new_attr') + + for attr in attrs: + self.assertIn(attr, d) + + def test_as_str(self): + # Bug reported on Pygame mailing list July 24, 2011: + # For Python 3.x str(event) to raises an UnicodeEncodeError when + # an event attribute is a string with a non-ascii character. + try: + str(pygame.event.Event(events[0], a=as_unicode(r"\xed"))) + except UnicodeEncodeError: + self.fail("Event object raised exception for non-ascii character") + # Passed. + + +race_condition_notification = """ +This test is dependent on timing. The event queue is cleared in preparation for +tests. There is a small window where outside events from the OS may have effected +results. Try running the test again. +""" + +class EventModuleArgsTest(unittest.TestCase): + def setUp(self): + pygame.display.init() + pygame.event.clear() + + def tearDown(self): + pygame.display.quit() + + def test_get(self): + pygame.event.get() + pygame.event.get(None) + pygame.event.get(None, True) + + pygame.event.get(pump=False) + pygame.event.get(pump=True) + pygame.event.get(eventtype=None) + pygame.event.get(eventtype=pygame.USEREVENT, + pump=False) + + def test_clear(self): + pygame.event.clear() + pygame.event.clear(None) + pygame.event.clear(None, True) + + pygame.event.clear(pump=False) + pygame.event.clear(pump=True) + pygame.event.clear(eventtype=None) + pygame.event.clear(eventtype=pygame.USEREVENT, + pump=False) + + def test_peek(self): + pygame.event.peek() + pygame.event.peek(None) + pygame.event.peek(None, True) + + pygame.event.peek(pump=False) + pygame.event.peek(pump=True) + pygame.event.peek(eventtype=None) + pygame.event.peek(eventtype=pygame.USEREVENT, + pump=False) + + +class EventModuleTest(unittest.TestCase): + def setUp(self): + pygame.display.init() + pygame.event.clear() # flush events + + def tearDown(self): + pygame.event.clear() # flush events + pygame.display.quit() + + def test_event_attribute(self): + e1 = pygame.event.Event(pygame.USEREVENT, attr1='attr1') + self.assertEqual(e1.attr1, 'attr1') + + def test_set_blocked(self): + """Ensure events can be blocked from the queue.""" + event = events[0] + pygame.event.set_blocked(event) + + self.assertTrue(pygame.event.get_blocked(event)) + + pygame.event.post(pygame.event.Event(event)) + ret = pygame.event.get() + should_be_blocked = [e for e in ret if e.type == event] + + self.assertEqual(should_be_blocked, []) + + def test_set_blocked_all(self): + """Ensure all events can be unblocked at once.""" + pygame.event.set_blocked(None) + + for e in events: + self.assertTrue(pygame.event.get_blocked(e)) + + def test_post__and_poll(self): + """Ensure events can be posted to the queue.""" + e1 = pygame.event.Event(pygame.USEREVENT, attr1='attr1') + pygame.event.post(e1) + posted_event = pygame.event.poll() + + self.assertEqual(e1.attr1, posted_event.attr1, + race_condition_notification) + + # fuzzing event types + for i in range(1, 11): + pygame.event.post(pygame.event.Event(events[i])) + + self.assertEqual(pygame.event.poll().type, events[i], + race_condition_notification) + + def test_post_large_user_event(self): + pygame.event.post(pygame.event.Event(pygame.USEREVENT, {'a': "a" * 1024})) + e = pygame.event.poll() + + self.assertEqual(e.type, pygame.USEREVENT) + self.assertEqual(e.a, "a" * 1024) + + def test_get(self): + """Ensure get() retrieves all the events on the queue.""" + event_cnt = 10 + for _ in range(event_cnt): + pygame.event.post(pygame.event.Event(pygame.USEREVENT)) + + queue = pygame.event.get() + + self.assertEqual(len(queue), event_cnt) + self.assertTrue(all(e.type == pygame.USEREVENT for e in queue)) + + def test_get_type(self): + ev = pygame.event.Event(pygame.USEREVENT) + pygame.event.post(ev) + queue = pygame.event.get(pygame.USEREVENT) + self.assertEqual(len(queue), 1) + self.assertEqual(queue[0].type, pygame.USEREVENT) + + def test_clear(self): + """Ensure clear() removes all the events on the queue.""" + for e in events: + pygame.event.post(pygame.event.Event(e)) + + poll_event = pygame.event.poll() + + self.assertNotEqual(poll_event.type, pygame.NOEVENT) + + pygame.event.clear() + poll_event = pygame.event.poll() + + self.assertEqual(poll_event.type, pygame.NOEVENT, + race_condition_notification) + + def test_event_name(self): + """Ensure event_name() returns the correct event name.""" + self.assertEqual(pygame.event.event_name(pygame.KEYDOWN), "KeyDown") + self.assertEqual(pygame.event.event_name(pygame.USEREVENT), + "UserEvent") + + def test_wait(self): + """Ensure wait() waits for an event on the queue.""" + event = pygame.event.Event(events[0]) + pygame.event.post(event) + wait_event = pygame.event.wait() + + self.assertEqual(wait_event.type, event.type) + + def test_peek(self): + """Ensure queued events can be peeked at.""" + event_types = [pygame.KEYDOWN, pygame.KEYUP, pygame.MOUSEMOTION] + + for event_type in event_types: + pygame.event.post(pygame.event.Event(event_type)) + + for event_type in event_types: + self.assertTrue(pygame.event.peek(event_type)) + + self.assertTrue(pygame.event.peek(event_types)) + + def test_peek_empty(self): + pygame.event.clear() + self.assertFalse(pygame.event.peek()) + + def test_set_allowed(self): + """Ensure a blocked event type can be unblocked/allowed.""" + event = events[0] + pygame.event.set_blocked(event) + + self.assertTrue(pygame.event.get_blocked(event)) + + pygame.event.set_allowed(event) + + self.assertFalse(pygame.event.get_blocked(event)) + + def test_set_allowed_all(self): + """Ensure all events can be unblocked/allowed at once.""" + pygame.event.set_blocked(None) + + for e in events: + self.assertTrue(pygame.event.get_blocked(e)) + + pygame.event.set_allowed(None) + + for e in events: + self.assertFalse(pygame.event.get_blocked(e)) + + def test_pump(self): + """Ensure pump() functions properly.""" + pygame.event.pump() + + @unittest.skipIf(os.environ.get('SDL_VIDEODRIVER') == 'dummy', + 'requires the SDL_VIDEODRIVER to be a non "dummy" value') + def test_set_grab__and_get_symmetric(self): + """Ensure event grabbing can be enabled and disabled.""" + surf = pygame.display.set_mode((10,10)) + pygame.event.set_grab(True) + + self.assertTrue(pygame.event.get_grab()) + + pygame.event.set_grab(False) + + self.assertFalse(pygame.event.get_grab()) + + def test_event_equality(self): + a = pygame.event.Event(events[0], a=1) + b = pygame.event.Event(events[0], a=1) + c = pygame.event.Event(events[1], a=1) + d = pygame.event.Event(events[0], a=2) + + self.assertTrue(a == a) + self.assertFalse(a != a) + self.assertTrue(a == b) + self.assertFalse(a != b) + self.assertTrue(a != c) + self.assertFalse(a == c) + self.assertTrue(a != d) + self.assertFalse(a == d) + + def todo_test_get_blocked(self): + + # __doc__ (as of 2008-08-02) for pygame.event.get_blocked: + + # pygame.event.get_blocked(type): return bool + # test if a type of event is blocked from the queue + # + # Returns true if the given event type is blocked from the queue. + + self.fail() + + def todo_test_get_grab(self): + + # __doc__ (as of 2008-08-02) for pygame.event.get_grab: + + # pygame.event.get_grab(): return bool + # test if the program is sharing input devices + # + # Returns true when the input events are grabbed for this application. + # Use pygame.event.set_grab() to control this state. + # + + self.fail() + + def todo_test_poll(self): + + # __doc__ (as of 2008-08-02) for pygame.event.poll: + + # pygame.event.poll(): return Event + # get a single event from the queue + # + # Returns a single event from the queue. If the event queue is empty + # an event of type pygame.NOEVENT will be returned immediately. The + # returned event is removed from the queue. + # + + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/fastevent_tags.py b/venv/Lib/site-packages/pygame/tests/fastevent_tags.py new file mode 100644 index 0000000..c660bef --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/fastevent_tags.py @@ -0,0 +1 @@ +__tags__ = [] diff --git a/venv/Lib/site-packages/pygame/tests/fastevent_test.py b/venv/Lib/site-packages/pygame/tests/fastevent_test.py new file mode 100644 index 0000000..34723a5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/fastevent_test.py @@ -0,0 +1,150 @@ +import unittest +from pygame.tests.event_test import race_condition_notification +import pygame +from pygame import event, fastevent +from pygame.compat import geterror + +################################################################################ + +class FasteventModuleTest(unittest.TestCase): + + def setUp(self): + pygame.display.init() + fastevent.init() + event.clear() + + def tearDown(self): + # fastevent.quit() # Does not exist! + pygame.display.quit() + + def test_init(self): + # Test if module initialized after multiple init() calls. + fastevent.init() + fastevent.init() + + self.assertTrue(fastevent.get_init()) + + def test_auto_quit(self): + # Test if module uninitialized after calling pygame.quit(). + pygame.quit() + + self.assertFalse(fastevent.get_init()) + + def test_get_init(self): + # Test if get_init() gets the init state. + self.assertTrue(fastevent.get_init()) + + def test_get(self): + # __doc__ (as of 2008-08-02) for pygame.fastevent.get: + + # pygame.fastevent.get() -> list of Events + # get all events from the queue + + for _ in range(1, 11): + event.post(event.Event(pygame.USEREVENT)) + + self.assertListEqual([e.type for e in fastevent.get()], + [pygame.USEREVENT] * 10, + race_condition_notification) + + def test_poll(self): + + # __doc__ (as of 2008-08-02) for pygame.fastevent.poll: + + # pygame.fastevent.poll() -> Event + # get an available event + # + # Returns next event on queue. If there is no event waiting on the + # queue, this will return an event with type NOEVENT. + + self.assertEqual(fastevent.poll().type, pygame.NOEVENT, + race_condition_notification) + + def test_post(self): + + # __doc__ (as of 2008-08-02) for pygame.fastevent.post: + + # pygame.fastevent.post(Event) -> None + # place an event on the queue + # + # This will post your own event objects onto the event queue. + # You can past any event type you want, but some care must be + # taken. For example, if you post a MOUSEBUTTONDOWN event to the + # queue, it is likely any code receiving the event will expect + # the standard MOUSEBUTTONDOWN attributes to be available, like + # 'pos' and 'button'. + # + # Because pygame.fastevent.post() may have to wait for the queue + # to empty, you can get into a dead lock if you try to append an + # event on to a full queue from the thread that processes events. + # For that reason I do not recommend using this function in the + # main thread of an SDL program. + + for _ in range(1, 11): + fastevent.post(event.Event(pygame.USEREVENT)) + + self.assertListEqual([e.type for e in event.get()], + [pygame.USEREVENT] * 10, + race_condition_notification) + + try: + # Special case for post: METH_O. + fastevent.post(1) + except TypeError: + e = geterror() + msg = ("argument 1 must be %s, not %s" % + (fastevent.Event.__name__, type(1).__name__)) + self.assertEqual(str(e), msg) + else: + self.fail() + + def test_post__clear(self): + """Ensure posted events can be cleared.""" + for _ in range(10): + fastevent.post(event.Event(pygame.USEREVENT)) + + event.clear() + + self.assertListEqual(fastevent.get(), []) + self.assertListEqual(event.get(), []) + + def todo_test_pump(self): + + # __doc__ (as of 2008-08-02) for pygame.fastevent.pump: + + # pygame.fastevent.pump() -> None + # update the internal messages + # + # For each frame of your game, you will need to make some sort + # of call to the event queue. This ensures your program can internally + # interact with the rest of the operating system. If you are not using + # other event functions in your game, you should call pump() to allow + # pygame to handle internal actions. + # + # There are important things that must be dealt with internally in the + # event queue. The main window may need to be repainted. Certain joysticks + # must be polled for their values. If you fail to make a call to the event + # queue for too long, the system may decide your program has locked up. + + self.fail() + + def test_wait(self): + + # __doc__ (as of 2008-08-02) for pygame.fastevent.wait: + + # pygame.fastevent.wait() -> Event + # wait for an event + # + # Returns the current event on the queue. If there are no messages + # waiting on the queue, this will not return until one is + # available. Sometimes it is important to use this wait to get + # events from the queue, it will allow your application to idle + # when the user isn't doing anything with it. + + event.post(pygame.event.Event(1)) + self.assertEqual(fastevent.wait().type, 1, race_condition_notification) + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/fixtures/fonts/A_PyGameMono-8.png b/venv/Lib/site-packages/pygame/tests/fixtures/fonts/A_PyGameMono-8.png new file mode 100644 index 0000000000000000000000000000000000000000..b15961f08bce5b630952beb840bda9dab3db338f GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ;$P6R}d3f?JBJrD{mt%$ z63MDmssD6G@6DUv`;S+s69Z4K2k_?fnr^ zdYp)UUtjC5d&0H)QKF0%j9>TpS{mCAuKf~`3-;t`*ii4Il~e@#R*XwFKfb(TOGnsG z#A+~p=Gm@5xAK!1p@cTa=-G z1ca`9{nnECy{f4PFm{q6Q9ST5ktZ#C)rw^4EDlS|BMk$a`VspSl2bXPoW;1`>e>5L z&Xfgih3pIF9NA|HB+}Gg-$n^qFNCUzN_x`FXy%q$bv@>9<;|oKb0re~G7YC>M(K1r zB_j#TPRS~ju;){r_Wk3Q~Y#;BA=yHrfO3$0!UmYGQs0Vbn%Fu!>TIx~SA_ z8tsB6MxF5R0S`l#eUv)juTce+kr#alEMjQgR87m#+Ecc&w`|K0yB*eH_{Hc!qPl1> z5DT_x+xBSwU^ozM)BK@uTTd(+=_)NP)pmtqotiHaj`wdsRE<^5 zkE+eZ)v!j5%5kcefqTI#z{_Qge}2Bznl%GWPC={I%2zHc_b#jOmc#Pyp;J>f9f-b) zIY+T=A#*_*lE^f2!)4Q85RCSOB4N$zEidzWy+G!Nz3V=puH*?(L8TxYs3lc_-;z~h z;wtJ`;x@cjoN4sTJco5cU`+CS5Q#*}4_ASSt~9w7J0+Ukdhj|BBj(*>l9`v;=ML6< z>;Fz>id@P6^OKst_y(%zE*rwghTUf@V_q@i%3`!E>87NICBL8~3)JMjwtg4W_31OW z^U^$Y*6kt6^3a=$JXGwlExCtm(#1iK(buSBNBIixnyUZd@tarW^JaG;-&P<~@GEeSI=5Upda5vL=Ve$koRC(ca7LqoO&j^ZrGAL-> zLpDK2?ukg&EwLj)B%l>Pg~DPw6c!ed+6df)E>mXkzwnYE-;o~+ z`uO4Pg5JpZrY`vb@JB!0Z#*+%Jd)tOV}g4B@B*+KOM9I>Y6SjlJb@P2X!I87LM$2? zeqD%obLR!4*O{q*z`uW;Bcgx%Zy9$@Bwx6t@~yllcl;k0c|MxEskYW|HyQaxe$mD8 zg2PFc`yN-`;vO_*Q%#MbY%)A(%3JRhBtM?X%hfOL9@+W5_EX^#`p@*l=+V=sPQG&D zw0=o{XFtz3M*G`w#J^G_#Q3!#NFMC;l^;H$JB9c`?Iuj`K;^g)VxZMns*gWCX83iZ zMmPMOM&0Ud&g3~e-_rla2RbLroGZycaRs~ofSP=mE4fCwv5?=#%h492FDc}T&L3?2 zXS4H|{m@|lA^lj(`$iSdGZyPk<2j?xr~>uzUBG$@`8u8FeKN+=o!{wm6#EVLV@9Fw z%;Z}ykMh>h%Zy*(t!mCBzaZ;My#3+xf*t}B<9Wvft)62NGZp{FEECgMx|zNvW-(v| zhIg@`jr@wB?Y~I~TI;M3)W51G#Uv(v1+Dlw6c!tR*1~$E)?^a1d=aX^C|>+Gqgv3x zAzuhZ9~whJjD*gC4-RcOKf#L)h35&;A3FCgYJF$}w!V4D2mamA*cKzpSnABYy+23K z-Sx`!8QreC(l4i9KK}B+;Bf!T<1W|LjERB6Ctp2!&b3h9k@9xW1m($(2X1uS$mZQH zzXI|%Na`g)w%f_>oXrayoO0O7;oO_o_hMd+3EsK)Xv35#?elnlJ!!L3nse{OQ*Jl8 zvr!V_rijl{lBU?CnsCJ3@pW-=N#gNEZd#P>p6t6h$zd_WW*jqxQgPFWf5_fp!>Xp# z*sL%~F+EuoUqK!0-PyvKb;)i|;=cHr^EbpVXUVisCkv;hdJ=2MLzVdHm}Ci-P!lW8 zpBG5&a8m{nb#EV7{ekcpZh@#pb$t0 fodB6R-u`w(`p}i$zz(zTd+wP06Sn?_B|`KsxgTC( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/fixtures/fonts/test_fixed.otf b/venv/Lib/site-packages/pygame/tests/fixtures/fonts/test_fixed.otf new file mode 100644 index 0000000000000000000000000000000000000000..348889828d894b9b57fb6435497d5c034448cb1b GIT binary patch literal 58464 zcmd43cXSq2_vpXpNufW~&lJooQN#OO~?|av}Yu$f-xZKY^yPdYrKKq=RNy~QaT1qByBtR zM};O&L^5U;Ik>oC!*@%cS{GPST+KB{}6AApMe@w5wH{Kr^4R1C7SM3iWXr>RoJmCLg{f7)2Q8%#RHtd~6 zr|*znBjT-otzcPs0l~4ohQw@myxm%tsO_lHmsYFtJqB_eG1(de-Za zwdO;~6mSKKY+5pH+JAmcD=RsmF6H#%Q!4+^3#e;aNoR|8n2lDlXDOAJD)5>}E3x`f z2(TU?6(s3>6MWi>Pg8%bvl3xp&zC7ULjZ#(453uS^dM00U#mA7^c7peiiHPMHqEp~ z`2$8yWm;Q(akM|otJg2TzpQ_T6`h7#lF7P}hWjMg7o3I%NC{t;G(1o;`KG7gL6Xh4 zH4P7jewRjBff=Z)Dix;UmgKe$rr|!xY&}lH1EiTROBx<1xqai(@E{5E{hWpeLq8_< zWT?bQFBt~xOZ$7vNMIW%@zNix8T7Yg05F!)a7h4aSVk(5yi;EvQbU?rU!@?pfRjT@L?FwOSVg|?bO2F*!*uF7C z!-n;b32WP=Sy;<>Osk2oW&`@f#3sa)3+q2@SbX)06%+al9S}b(p+drd!4)uHv1P+% zG_DDw(#IS51mIwAc6&jN?GqQ95I4BjFbd7-e_whxTv+|hWBLvl&hLwX`pSD!MZ(3ul$-Zj7Exv8O9lldx`NKlP ziiVY-r}e{zg)Jyjw8)o5zABodShz7*4U^fH&&q7&wL+~*Ris$(^>nqsY$)zRv1 z#abggYnwf5N5k@l6$}f*+AIIn8V3L8KePQmG_%*_5=p6@qLEw95pU0xJ$v+A$k_{L z9-pmuX5AV0^sQ47UcZ}K>8%`AL93`$%qn4(vC3JIR%K#NWv|C=td45I>gmDmR)6q; zivO2?vt^FVl^=-wKUw)?o|RGN%dhgAERco7$3?`>KV`8ju>xhOER*F{7WrFN$|@^A zV_ZWV`H;ow7@I%O2S)`((cykb`na4$BcaD#zrwoRE`p zN>0leIV(OIh4HM%824aw>swJ)1Np}aw|X+>4dpLc zVFg)PnTHH`h~EmfGT|#0zR}0(YxQF1$f%=@ld7Nozx)f6B2rYsrI-|#5>ir1Nogq~ zWr>UBSz8rZSrIJfD5)$}h|JX_nq^&GYDi6~CAH;MRz@AEOEj-94G0~Lq%mu`sl3LT zX)Y~@m93;TF}tm_llIa3hueBWC+4GtE3(eegj%6yNNH2cE$z=d+Rn@l?U%jspMmhW95t^gsW8#Y+W` zdW?_G!JEbE?JzP;1)Yr((OqmSWbK~}IVO7n>~4DV-Gyd+>@qa5;us%DVv zk`K=*jd#3)2Q*=hyD*1Cn4|aPWBF31Go}j|vwv8%ds&r<%)7ZH>3Sv}Ra8S&OW{tqs;L>xgyEx^6wRj4y*Pr>~H&q%Xo(!`Hyq($~p1 zz&FJAwr`B@L-MvSec$@N_bv1-^R4x5_3iN;_MP-4`mXuz_#TnN1qWmf$Pth?AT*$O zK-qwZfNBA?0_p{{3g{5fC7^#me8AfQqXXU#_#|Lbz?6WQ0doU>30NAiDqvl}mViA0 zM*>a;Tn)Gxa6ce9FhgMWz+8a^0*eJ!3al1bE3kQByTI22y9M?M91@riI5P0Pz=?sA zgUSa*2i0pqhTA-*LPXkcWZG|3+Hd8w-zsUpRnvZ}rTs>y{l1d+8&T;6^1@=o3zHEq zY(~5=8u7wv#0#?#FYHFVFdXs1a^wrkkuNMqzOWqm!gAyb%aJcEN4~He`NDGK3(Ju& zEJwYt9QDF-#7pUjm*NpGP2HBqF%HnBI-qRBBEZjCnD-agCe3{v?wC# zMUx_;UbHEq@{2}ARDRj2$}j7v{IZV9FYBoMvX06x>!|#)j><3VsQj{yDlhA(^0JO9 zFYBoCvW_Y*>!|Xwjw&zfsPeLoDlhA(@=9!6Y;RJ|L8O-n@xA)Q#0(!Amk{^Hu>K?C z`^Ur%j~!5{Qr*bZpQs@N`V5Ur#b42%$a-~Ce_rV`U}&G=L*5u1GonJDUh#c;4ULOc zq~Fk9Z^bCmtIzOZ9uhaC7dB$+#Py4djTzL;lWgm8+x8(>96Y#JJCD}cqjl~ZH>_75 zGSgvgymB3y`c_Oc53iRBJ?RFi<{Ef~`e|@zT(4m*JfRjIrDgx&vHf}t9X@1mui?Ym zc%=42>2~{n)7z!BqF1WLUS5TLJmJ0`j7en-_6mbN^RcPWqs0B&*ies@;IaF7Fd@zS zu(aRd+JNEz))_^YV?4dI1sWCk%AkHjV`5?llkX4c1AA~xLc+ip^x}IB9UAv`Urq!b z^45Ta0li`BG!Cth5HobZ8~wcY|J%OK29p+9saoX*vHkio8NG%z@}!!)9PFW9TZehA z80F!kVur?5h>c4a+$*7fS|qco);HD^YpV6FHO-pNmNC!IF*xUIxj? zg-B+}B7Vs#+1S2vaA?mZA(C72NM1Ix{8E4eKp_d0!ldT^uSwCn|1U|A^|Lk4`o)@W z{c8PYEwC0^zq2X+Vf|?>ww73bSxc>D)^ckF+vG}Xm9^ShWBp^TwOnhRwVsW0qqWJ} zY;8$RtgNkU$}Wl3DbntVBvw?>%dejFoZn zzI-Gf$cHlCOE5?gt-aPhYrl2CI!NL;TfUPS95oKfr`BPThojap>$r8oI%%DzVbO zi=@d`3TcS=ET4}wbO34STQbrY;0yEx`GS4veCd4|q>nG7FOx5`FN@Fb%j(O< zyiW6FxB6+$c%(OPsu1qH~2WQEj<#qqUY^|~_$-Y15 z;9MC(X69*^XJDQW^K8y@E^pC%aRmkx_@Gc!p*n@S78+RS$3lxkJB9Wu+?n%frLeEU zW`->h0h3|AAYS^k7B!voh){(c>dxIiVrWoviRW=(@OkRDtoEIrB{_c zTvp1KD%ZW-$a3e)yXALRe4}Dq#R-)PM^uTZ7tuPRN5qiGqLC&lHtOA|303A**--6V z^ykrEMt>bWCHmXw>CrQzzl)w7JvaKt=%1s1iT*WuLGYr=4q~Y#{4;uLz zmupNqH2(2PMF z23;SVb8zD!{@8i3>tj#FK8_2Es}Xl0K68Bj_)_sz}zA+7&~L^hOyVj<$V9O4+nkt)rY^2-~LIf z3B@Pa6S_=zYr=06HcvP=;rVAtlUhuAYtna<{{FJ_m*c+taPo-BAAMcn>zZG;`MUqt zW4@mG_5E*}elu#y;3;#ate#qUYWZ*XPoFw{@$_BOugq985f0?ia+U$Kk2YPX}3RVlRs&-Kj|-j(r^BxAN)zv{YhW? zlRoh$IsT-#{Yi2Dq&NIY-Tg`J{YlOIN%j3nHT+4D{-iSgq$2*Le15;N%1m>NR6Os5 z7zvy07;|wn<^1n~o#~;Vn+?qo0Jk#cOmC&Zko@DoE;??inuPrzszx#YI2+n52{mT( z0LS#|K^&M>qo>$q#sGiQP?q7uF?`@#P=Tcm&l=-+gu~Xk2~;7RCa-R z#tF47hLx!@MpMQh8FU4sj~hb^Z3K4hp%}^htxXeZ*b~z;K%XwQjj!u`2?@(+Oxrh{ z++i90Mi#zB*W&JL*RJ0cV>%2&Wl|zo$^yXiPbu#G1Y3h|xJInpE^?;;?f1i-wH$6r zHHXeG0_?AgNUzcka+6_P+bYI1`gHKs`>xHTC< z2}ppEJF{)%uXh~Aq0d~()=WT9c|e8fSe<#oq2eftxxTQC{L%u@WjsKx0X(@%?U4Ja zyp5dFa`{~&KSoeocM6a^0C3|MK)3mTFOL9Hw3WFwI7WUOlTj%0YvDKkk z`4PH)9^&hj1)a7oc9Pv7M)4Y*@l9BQsM(m;NoULthmm~{ikSO5V(V`+d1gg`4LmVL zjAWY#f6GF!cG(?cj@FY|_!6EeIcA~sB(q|5ka=?6O;0N#1*1EL*mO>tdXRaLe51h5 z>$DU)i_Y^ha07EW48n)de2Xbc4Y0r-ie(2_wgWZ_5VQ`BXIWh2>Nr$z@R&o>hpFF{ zQ|H>V67gCpbm5#Bsecppv&DF<*^mxS^+gbC@3Yexd9wy({{}#n;(!)A)Il4qpr_KM z75aaic8wId3U=*|V=_)1qX}k1+27UydG3nP}j-V8|>j?!HFK*v^r!j)}`oI5c0oo6Lv;{)jkiF zu9IjO`G{Hc#pT9)%FjDplRW7f0jTCS~0Shv3xG(FHM?T6g*Z+fp23 zmV{B^($=seuRz<91XioN%i^afk<$RxIzwyPP>eLI%Nh$U z=L&3F9a$zR5qD^}G#!r4E&_;D>j<_XOhE&{&a;j&TaOCe$PTu2y3p>Y6t~WD=thzY z&_Ry82dEYbXnJ3Fkx4mh)<>|~&NW$#6yD_;b34&y_BNrtu`A$QBD7m8z^+YkjJfh9 zSmHaVDD>~pyl2BUz9qLV01dAsBhGJ z9hTJk8dmWzK*>J=5mCAxs?|Vr9%G#v@yi8JT$$H3(s>rENecQwi)VwKue-2%Zc)tr zAy}z#>bPqg!YOywX5A&vaRJAL$17Wby;_Wkxp_`1uhC4I%;W^+sseA(y@73c&Z9&8&VUVEq9W zV=DnqR3+ejM`1Zyl5!HEfFw0%#d^FN4l%a~AfOK{>y}N&r1@`-@pY-`GF~5)MeXm^ zVx;YKhn5vU*9`gwi)O$$8u)7^z_2&Pm=PxdD@M3XsH{G>zKG8%xK-j1{_9&jfaK#+%*zkiQ>;+h><~O#hA{`p()qfpv*XGm8rpi-&Vtj z+Jf4}S8Y~iLxg)(v5i?iPEuPSQ%W;2Vl{!CITq=FtYE$&u&u>_Oc%X&pW4pAWqj&{ z6d^OTBIY8KbE$+B)jYA`Ms}4h+a)Aid8Jo7WMXCPkYdVv^`y&Q;}`m?iGfMP)vW48 zT;uz3s^g^<1gy%ACQ8pbiSZ@8!O)mlg=pfmZ&3Yc5=zli!K%hlXTP&BCT^mJ-XFQd zj##jPYqc0IMh@qPc91DH)4sJyKUN|!PXRYj67iw*Ob?O zrf&@O{T`!>gD}y50Vvs#n#x^p#D5}K^!cM-_$z>5;wkPUn{33J9V*tbSeQ^v0y;^JBtY>JMbwCe$0ThP*^ z&n#W#5aGWB+wm!2Q-6xfvuJL$=|0UfC+}dSc$7_@ld%+-EUY69CK2PkixKO-fQ$lD7C*o0jj4M&nsg znF!84No8XcPmPhS>e`CeE=nbf*0|u-M>&}&v!aKPo-JUyQ?A;!9!BkStgV41?6g$Z zTpR3~lnsqANP@zooYnaa%|T_wPrDEc3JtwNvCOC5fY+Jk;Gj1V-HpGRnM=TCmj&B+ z0&K^pU~38r1HO8>Hv8asRHJ-QpMQ*E@aMwNtGB27PFT4`0U3^=nDnM{^E(Xqx>J<* zy&*c_Z4lpJxh%65V5ce~)HJi`#1C2~EQ0(tajq=<@qSnzvR9hl_QPnZp=jy?ZO5sp zLOV`HxKwfzaAr9|w=b$kXHdUdGM4ynm2fZ2Li5wCk9#WZqCCBVg@& z!)EW>jp8AuR^Ir+F;d`&Fn`{uwe%1gCj~x3^6Dd40lMIy3zEV4G4W&u!0ZuY9{qq$ zhVo!fY#kxJYmh2q)s;@ffEH6X-aQ}1Tn3?Cuc=R%OPg`i)5jeR)w$u-XbSJ>ecPC? zXCeO`Ys+lU0&V|XiaSc`dR+2cyRjt(y9DRX4gUnB@(;?o)0(wn`R;H}L?crjA z$jGX)eAQ{(TbEtjX7*g{FFWRv$F>J7@Y{M)S-%{W5-V-CU7SavYa?{NAz+yf&Z(L( zc1;AVddPH{75QkM`JpUzwbu2vbTvAIT2dUMjcC(NI7YU0jdZ`|WyDRoI_N)vP0K&hzz-aneFRmrp&+Ve!wm>K&!DxZn9ZW^4Vq9e996ZnY&f``8Ywr4ot;sqx? ztjXd2S|PB~?+TsV<+AJda`fRL`c)D-IW* z4|OG*@3VvdJ_Vs)y9>7?HpP#TlvZz1ToUZC)qlWBmZ-s6QKcXV`Dy?PWfH81+N22? zUF;M_{7yLFPzuE-v05BqGXR|^y8LH$)`504#$orXN^{MDCJyl2IhQPGG*q(#i#${z z^nKy5*gpaIHo?uf3EIPMV8O0>*`5V9OLUA)%q_MC^aOpBh}j5TZ;MV;oUJjppi8JM zJy#uk>rj_abXyqAzX4s>Bj0%eqLrfnkt?A^kJnB%yg`$sMqR|cgT;fpm>(DI5V(c` z_I(A|UmlQH+oc0xj(4T2X}C3Hq(d5RQrth>KuyR0ow#%U&5!SN+NdJ1w%e|;?&vK+ z%1=2Z^<-jodmocEYU-H$b)68^ej#mpJdu&|0-H5&m22emJTHIO-OpOq&kiY0jWJbi zV=A4~0!~z>361e=Tb*yF*-n}JE+YT2ZT;HD{i{>V<_z(4>oh z!^@|p&V(rl$JE6&V3%?_M6(GL&yGYTe^anaxe*TACxG)xYhxIyLCN=!upKeL7GL_MmG4- zUveDKHAx5_&A>X$WlNH#WKM*~^BCFC36^9*aan){ySwe|U<~e|#pY<3&B|H_IQjts zcXTzbC$O5!v4GR}gq5_>L2!E>6<@ASSG}uE3Yv`3MpGe53C{_OeFH0d2-LhAzzR*) zs*b0#iOvHcZr?3>30rX<7EMFUJ7K@={>gtw;xwcGQEYm%3O3YGzM#BvjTExD6W?UTEQ_6{&|vOtpHjncC^CA zU(k(xQBdpjwAsHaA(Uslt2sMZ?md8FLnu~luhKPEJHTqR)tos9t4beqHYM0}@hxb_ z0-$BXW6jaaLMvh&Xp2Or=xbg2JeXkN_U@&J!2B}>Qw2vMVpO=mpI{GIgHpP+P0HF5 zQy~{oI=O^8&B@{(jDvOUC#a{E0*-EUkPL!$zBR@BEKZZC3z~alA}+@SYX0sWb!KkU z1KH*dIaFPEq)XMI*N`@SsirWo)!eP=l6bv}-nGoo@_q#Oz{j-F?7yS%z?%qNc@1z_ z>pFNB{tb3kb1@I#{#j@jr@B~F=eU@|>-5K0B$zcE@;RB(uzF5NDV;p>%hbs$&GWlI zrlX?6Qbt*N>*Ae-%4*5G67Wt&$&<23+SN^DHyU@N@UdJvS3!ES0Z%WI?cGAu3i)dwN+_Cql#Grsl~=CQ$O$#I8C`3Q4Yb_xFQ zCgyIp1zave@xpzFDa{W^%tpOt$619(zi?R=O%O^x;t;#Hf;}U4O3(`7JWRxw;0wYL zCp%csFbD79WJcbe(bZJpibIWu9j34s#LMYjmO?(ESJhJ-VATM$3i;p{JPW9rkz$_H zVC8-Tlm38;tyH{xVJusH@Cxa%11i(5$5h>TQ%}OF^WC(XOO~C%VQEK1Af}EZM`yYw zWn(crNDpu&KXy6YOt%r}LW|5XZE>K*^!EM}+3UEcm8A}?zC>JN+qj*>W)yBUL4o(C z!A_zd*cGjmXFafc;!XNt1$P$ir6rIcBhnQ+zF$xX7y}5L2=KLbDe6)Wj1|DQHWxqV zq4DTUC$esW_Jb!&6?7s?eUVl&slBQ*g@7s96?)OlO`G{Ut`oT+PBD1);D^izrq_ShIs2&eVG(jE#iXXMPHm!xgE8hbOHH8-1 z2CT+HS|YEOwG{@q>;!Y6)_g)EH-)QEE3l(C!EzM_JJ!*`#nXWu+2?9JnlQ&D0U5wX zBg4BBnk0XEHIn>5^AF$#h92j*e)=#EbBp=1PKZ6C_0c&0jV^VdA z7Yd{E+Nmoj5_nGRS~$>v^W9<)|_uu)|!AfK+{5#wN(pPO`@NxMP493%uL>r3;1cZ@W5#rLUVIC9HL4KkJqblwlJH#c(lEz&3rR7=DdPk+vu4kEge1D1hujW zDj@)0MVD~1SQy@wVAet~t34oSgbnR9MpIsM*in5BP3Zp)PX2s?&VHF&F5&GdmM^um zc^J6_Y*-$^Pje_^i~eS3bi?=FviC{Vs~H=Y{|Lq>z_vu-WId#{Axj zD*1`7tJ19zvZgpV0mC2}`@qi^4#*w^t#kxf>2WT!uffVkvz_6~TgT%%qleldH5h6u zArB>P<8iWU8BnV5kjnQI0xLWZ%spf49{9_3@F_=JJTV;5ItK81XN0-|%(A97>0nET z16%dMbVI5tO#asOV+bRn;9?QYbmQbv-HbcULV6Se0P_Io3-Atf5SbjUcf=j z*&H@2GAH25H!gerb+D8U4%ltx#vB>y()|O4Va;3zO9Q_2sZD^MSW!p^GTO!(wh!!^ zW=>l89EjIScyI5pQAC~BOj1ICjiY4;3#A^(aRjW$dO&zRirEf<72nEGN!b*I#fX09 z%2pvss|J>M$7W`#VC-3OiY5w>Tpt=A9zt7*wtNQmqy)6U(GGoxa?!{oFj_H#sc$}z zyW$CFS|VQZb(_oo?uh4MwVKTzd+siyAJU=fUEGk`9LxLTS2C-WguKd#uIw%*#a`=% z*cx+qu$!AX=**C(t0sCP3f+j+fF)?;?gW<85>`?hmrf4^_%UQX!ti+;xK4Z8SLl|or^Q8=t#}!1yW?2U=KC zkILSoI%``WH>3^&dg>j=$mY>bNL?LJJuP^wdazD@m&PK_cEi$@!!+;8O~CnO6wj{^ zMzpj*y8~8mHqr%uN~1}h99nFo44P`L9Hf{hE5he{+Io%d9bmp4M+{5dF7&LRFW9nY z)MNrAIxh+<`%@3cZ#^oNXbmA?B&>=TxTO?dI|r(-Jtn=N;%i4W=DGH>@OL;w_Q|#p zH$jXnt%1y?f}*FhTkkSZ=H^PsvJd088Y30hRkaGVu#G9Z#N~9x3qIcItgVY!SBGj+ zPiJTaPSj#+82|lr=IH6H-B;{|+PV5VsKp<S0Q~G~|7o+0h>7d;pgD9_I39 zbnw0L6hr?M4kH7>GTm}nq_5E=$<~mDbJIj8AD)An?jP;cb+Dj|&~99C7>1c(SG^}a zH%s9~DeDJ1oC#Xl#;TCnRVU5sgWzj#Q}H)|Y^MPQb&S$Y0?WJ}Ec-sC#ex;^E-(FC z1x0^;>?ieck?dpR-31(ylYv6T8z?4k0=sy^VQ8;ccc^&P`{>s%PsI&7dyZUuw@r_y z14_(A;kw3@(2vl%HQHr=jB{{|HE=VW1iRE+Egh^t#pXy9go_UVw``Z~z}-~0ySY$cm2u7gegK}hP}lt95EiClb8HCM+Z6!yI#aB;8Bpsr@4=kzhu%~* z(J}g?8x!|wsDw1tXHACuJN{#9*ktb_OMr3>y)fJ@;NH+t9K z%YG70Q^|mL9@)lf{tUy$lo5uikPX(&W{vF7ihcbUH3`n;5^!!n4Qhjtl!jpG%Xz0) zeOE56(OqA+c_(NsJo|6eZB>^>m-0D;p~-aTNHSQxR=7MX?iNy0M+%*25B1xxTmr%G z6sNsz(+L&^S0$D%oUPkv(6a_EUdOPSqd!mwZ;vAMeMd1?z1c!O@|;GRKi_sz*L&*Y z^CrLQ=AMFEO7L`tPHnddl`|;%Mgh`21z11Zbg31I5{xBxcj0c*&RGM8zv!I# z>;yJC5G~Bd4aCU&XfSG|o3nP?#)R&4jp;E1VxB!%YF*fd^LBBY?Wx&^2glB2*dgs&fYwT3VX|C?zZR+X{Ewsd2n#L+{6PMQ)hw$@dxT=1C z(ZBE`{2a&7KUoJX?`&vKui4n#f}j)~MD>zi-5{VWAb+$&IrN(H`j4|&;v=Az$cFy$ zY-nYv=)%6OSObS{zezEVD{Knd&(KI{S!#e4$O`byr&vhehm$ zWmn1G`&_wNxH!T$P%A9}lyCrfGXnBoav0zpE|%Y-1<$V7w0pVN@1h@qM?ZAD!#@4q z-T`}N?OGH9R@sD%Ai%+T@DB#N4C6Jx(>Z`G8yy6XccoS4a!pM8J`;Az)bc?!a`{u6 zMt%(SWHE=RGzskTK$qxN25>bW#S2W0NEeE?Y7yRXj-#{K=06?cgmB*bR8n`^fbd~@ z(QK`~h!3Ya&W#c*D^Dra2v5-LRKt?{GKRG>$@>j7ZGeR9J}P+=XqMzHYo|6=a{u6! zHI7R0A83SjOrmQzshyQlA?WJ>NZHlUbWqIm`flnVv269x8|MZ`uP6vr-jJpau>|J9 zk`BAMT^W6y3Um39q)w07(@q$l>wi+Qx#Gv5PNlh)SId{Zi@_`EpE~a*F%C=W3+BQd zF!c{}j&S1njJaYX7kV4*dn*w>o(*tsFCyx1=GYyrXX z7MpVIQw}gfeWvmxn~BQ;t7L*pU-#F8SloM)_k1;%sC~*|&U(;xeWw;bBJ6<{H{lc# z^S%ennysxEc}45`)Wvoke9g@30@k|+*oB>-SnPc?Uus^3kaq&0%q1by%4cKq#5&N_*CS3be&%F7jO=X-xc(zx z&q8%_-l%tpl!9u7P`1x*kLZIG`^jM>&cn%9+$DhMKxe)T?arTILB&viatTICLm}!f z)4o0J=mJv~B4nx4xzEuK-r0O|ghe5XcD@)EPUborA_m?f*N5jLN6i z)n>zZ_<0*R>@$Pl*Ir4B<@KBb?5~bjI}Cp9*I~732nf7t>-^54v%Z>T)xgO@2!vgw z$@?a_c!1AlC_8D7f6#NhSx8tlD~~JTi(@wMS|`MODJWb!ifW*Z!gWiVwd0PX!5wy; zSeGD|?i}SaI>PCSAatg&gZilz3iqc7F1H2h;b51YZ3E!c0BCp0fnDz9z)b{uRuydD zNSn&Wx{P4H^AJ;?(b@$tTm&I0F+~`tofLD$(L!lF-36B3ht>f`MqXV{l~VR60hS1d zkY_#$xj%4OoR^uG)YomIw&0KKFoHYILiOTvs(QHC!I1}G&um_;@bE8am97SV%?H>s zNj?vzL)O#;B$Y%VWtdGRYpJ9}Kd{V?9DJ~-P4yAI9bnO#=s#KPGVm1;f4mYb^q$ba z_R~PU2M;qZ>303Bh0XfJP0aIe1#Fla3Gw!Xwl!c?eg?HvTZi-0FUsQG5@5l?*uT63 zR$y&ZpLGBWIwaId+#yqSXy+rBfK=MXodZ3W*!vnTQR^ac%baQmFT51Iy=~FV@dwxr zeQ0IYaWjTXSQxl?!zEIm2K#vr*zMwAiPMF}^^Hx&I0x`}zKef-tgf;1fGXbi!{1yU z>%0`H_aG_R9A;MaO)13^9Hg$rtL#(aD4)Q>dipz!kZ>DpliJdUtN*t3${w{P`OAng z4NoFFx<0lJ;55?eCZbZgj>3q15VEgyn3PvtJg1r3I{zU=p0m)F#LehmT;visjZNH| zjFF?I9je;5P%GSp4@*uLp_99XNHhoj^|@Fo@HyDMjSe=~+VnaZtkjP#v-u~7M;tBQ zP78jKqr6_5wP*$3K-QdvmCn00OGh?`>=&>k(V?b^u&jX;vw2tCS9htckguS6fiy#U z?<{4_Ln7T+fVIHEY7h9K%qF7cc%LQ8jleC?su>nOX-c&)3ZJw4AAt0L}(EL zuSq!o7KEgE(h+&fQZ1Yh zTsh$h&@0&5G!?99dayM|7#%aWwc1`e5wri45zr;;lyJ1W!}J6TBiGf%5&nRm*vn?M zGzQ$#$acCI*s(YV>HP;)=hP%5b5??NLU*`wgavbPgW#3tpe26f(8tZto(}{oo#3*3 zN2muCwLq_*b;%a)!M-rY#n_eEYVz-}wF>{*9Vso>&y8v$iMgqD3jAhb82cy`q(y-Rh91*3EIjtZRu zTUl9HKJCDc{EcMJ8eqrAIJ9$!%PMUKH){oL=fPH>dGb5llCME9G+8i~tAS^D4y+Qj z9b%VGY31LQRV9zI3LV4ViFL5jhYR&$RD5Hx{3J7$Qgkkpp4*I6dx}qoJ5<#3IqZ>< zc!-2PhJXKibV8FMJ_$iG-y$2DhQ|u;fnD{3Wf}%{rh>~nT#ceyb1?<+yKxTXZh&jL ziXJ=#oD6Wtg1#0UqbJ4!C&N8=*oC&v<9zu06wyaYkZSO*deX(cKrs?eAGJi-pLAPu&sG}T)cfze=1m072E5og8i!g zvq0m8yKHeq4Z_iUji6}-7q=KWhGzJuy=P-BIZH9&$7h3YVL(sfi39So*F>)TS zFt-pgXBUd5UpwA&ankB&Rg6Qw<|veESG2KN08l8FV#O$1YZ|0AWz{h_l_2=%4iq0R zM96!E>`9!BA1?qrzK>4Ow_s1AX$K!rQqFmdbjsY%=`h#1P~1}oV#y9*>$2P0jwgQ* z8wTZcLt1mKT0;lS^sqzP=(P&(1MzxH7~`VHQCj;IeUjX7V=HtQW{Q1=be8Hi?72c4 z3%Agg=6Zth`&Xf6YT?l5USJtl3435emq6M|X^}S5e><-_(*5hO$lbZQ-0irKx86p~ z*U@DlYXYv6fq%HQjgwHPxmAkd@v~H9PM`F|V;qv*o>2ExL9sz=p$#QAdC-QCwKV)f zzX1v)>+GC<9ikUHk9Y8H+w(WUY>JK@r*~4C1VnQqZ?3-qR;~fG{Wye#Oog^>lh(Y~ zJ38$A9m1XaHvXDJXya0sLEjYv`sNJ5mu{`G^|9;~7YXm>qw5nKyu7E2=|sS-S}<;p z55}QYM@J6ch*&@(YBl^=V6iP_S}Ez|tKA%iqmqm8eS; zc@rZkMI96`dTy5M4cC|wA4y1Col(8a6&`zswBu#>#fj89n2V8i%JL4oyyi~BbyKo@ zm#{Q89K-rCtgJby7bgGfN3&v)s@=kvwdALH_>wT;? z?iA&UZwp)UWhB=&q&T{$x>wP;HrLb3T$XTVK;ixjh=gnABcZ2g@XcS~7s9p8>ALX! zIF-4Q;-IrivB`pum2~iy#jd*doLib|Ya8@KQkoM{NeS6v1%o-&mHEbqa#0~<-b6WT zG|EZwFoGYWbg!JvRNNQpH}_XTc(TU@3r6Uk14tSUxDy6=_`u~-u_MML7ufA@y!!ck zPp=Z*A+Gp_bhSg;GuGZ;oUk7Ea%oPJN62o_g;cY#uwQG0U8>H%VG`Jel{PN{WCmMi zVYud7N?VO^(>V%$b)XGZhK?Vm_=soZbn zLOb#n*pXKOr?rCc5-x+46|6k1k)mOMZ~~{4n(sXi^yZR}4qrIQjGrBEF|l~n(X3mJ zc%NExCr^LNWYQjbf8OToEtk0sd}uRI1E|+D#b_Yik)Xa{!TSN(zX9Z?EfV&lFgedC zmgukZRB;c(F9k-r3;|G1|2aU9@Xkv_t3e zQ`Na-upK*HJ(u!V{fuw)aUK3$^Hprm5cICHb(qurz>YQ*LXciO>x~)%o;Sc{*#y|k zB7DjAJy?# zRS+yRMb(Q_*xPm*LI2ro;%D?53mcpz$*Qy4Tu`64e&l23tef` zwxWnv+yfRg)y6^+SkZ=Hr-+GCrmadB&#tiWObGdN!OvODVb*KuD!BM6Wj-C!zr1nn zG*#{S+`*3u*aVUL*QwAv$c|d@yHFp0AULsx)udt2vIbI=q7K2o5rUGn3w~#{OLTdf z7EU^mlvN)mn{#b#*3i2`U0xfRjHttkkT~PUsppXCpiqiv66w zxJXvD8F`(jd*RRu7DPPdDYSy0YsH}!J+b`Hpz>a*;h~hb<&GWT5{e%Q8`v6~!L3B` z(~jN}TC$hGG)-TCGviLNdd3RFi#Wt;tlB5&{Up7?=fA?Axo%~tgFn$&Ei11Y;c^_4u$bv*iO zqraN$kSNgrO-pI&J~ThsB*r*+KSyn7`plS@)WuWV7Qu zb_hi^5XjO9^|SxzG#{Dl0Jp7&b=3#;G)iXiSQ`h90IX|8@kw2Wcdvg@@da5_e8ODJ z<+uxVT^F!`zrpVB$8f=UHpgXFgVbyRO>ciBqOGedbG^bsClJcA4Qj4}fV}lsPE4?4 zheJjKuwV0o{A6?&KcNcn6E^DPke&Bw4ZDt0=Y#g;PjO&9x* zD!5GHPc{o=5a3*0z^Qop!fxaM&s4%zmh}i-{Q#`0I>3e8SgIcdkRXRy89!30UTk zN?x()3LQ1O@jo5~A-R4Pw8*!Fg}olELUrc&G8cFvy~8SA1oajbNT~`)J}d>6_bZpq>4+CP4c9P>@@iIwUCtkZn2BVP z>LUYPPDrgBj&#&%Zl9xAE<4!OPS9%UTHo2(#+o|YzF%pvIo43&@e~*Fv4BfoB9!>2 z%^K*9WFbGrQyamut%7@eskeK_Y;t&Yc%LvSCIHJ7=K?Zx5j^88qQ0ttp!+W4*AJ}p zAcyp(H6Zg6X!$eIQ_1H&2g|<`qxbj0($kB%^nqg3W-c<^+$9L!KGUXwiF^RX9@8Bc zOZjS@l1qrXa6v{$tXr5ZSrU*nkz&zCVA+oWN{k1D#yHH$7_fpZF(vu)D9qg&Be%{A zwl6Mpfp?ceNU{LO$7*@$6vWK@Jm_Vf40Ug!%HGeYyvuajT-pKk?jf+tfuc#@xx30c zrNfr9BfQ%|R9xj20{15h4g3-;`7ZV%#yPa0$Y#&M_nssoC%)!{yiP3pa|0?8AR!$& zhD|$;!e>7^A>NDkOS>W0K;S>vhWYfE) zVEL{he5RrR3My@di*7csv+p~h#^UWxll*M7&gZTWoB4d39MPP88~Gh|5#4?R>~ssT zUGX-3+*pAQnEl@f9{&}cmKxq|QJwc4l94k|OC1G-zGBnMiY`7_9<0(>FyCHbX;l_< z%AL1yUp^F0+oJi(Uvq<#>m7z^q0O8(hIROWuq^rkP8+5D>aaIm0vx-qZJ6sV^0~XP zYPUmZ!B&Sql;q8G({ox&(>EX#A7ZltKLFIrZ0lXDzEc>Gr-y`e^1deL$zz=lod5Y1 zsZ}|TohsK^kHzQMvdjNw|4%vnXwvxp3bRAHa92`%zHOdg-uU0XO7*^%`0YIj>582G zDVF4@rS5;Rx9y?*e{hP)_faZ%@V_)xwlty<8{TFXCBH`foEhkF&Ygm@4_EM)Lu6ma zAYD%ZTxxCO2v@;w1^{kU23#HQ0BQqn)J(6qcLOU==gl*}F8I>nOwCuvvC$x-jb;6yQg}M0*+}*N{KZxZSs!7hZm5%9JJu=u%yG%I1#^{8^HIeA*3Vg9e&EV0Si}^QkSJUm z=CzFpp5*<}!h(%#-hEO#zc+VyJzN7z(m|I&c$C>CN2?CI(Ce-~vB}g|$HG5Qh!yEv z=3^tWPt?)V9TtWz5?X*Cr6+B)%})y|OnOa)B5f`uT7Vr3RpPmg3XgZhQpT((oSlMd zzIIycr6-7{UhEa`272*to3jJU%RJ2OFw=w3lqP*0V0aFJpmAEl|5ifIK7!a6C}hV! z%#GVF+k*}5ehIMPn$Yf@0h2vo_iHJ(K&SimbQ|=P;8N8ga#=@j?Euj9nc%!~4p3|- z#iD%y(GfN}9Px-Uzv%9IzMeyzjsxr-B@}0Y?aA-O<{w)_SkxWS9>1XaOAO$rk8Kj$ z-e6q`H_|bLBvvYIa_K<%;V$}x90sF=O~N_}A?rEV^U2Vx;SM2cAcE#uCxyu$3cJ-; zO4ZPAlHXUDau5Y`4(ijn*bn?2q30`Tv-kEiFVj1;`SchJz7`5=DZ?U_nj*fi8Y#v9 z9;I$9aY;1WIU)Mtv(=!J`=7wHYc5KB!~Or2cOKwb6qj!~y~WUIYaMr3j)TMG;hV6%nQD&_Q}{DWuQ|y@n+B|2y|hFp=Qy z{&&CU`<`8R=H$#dXU_C9<()g@uvEW+<_}xM^-i3do1)yTJC8L>{FQsGaXzcgZyxPp zerV^=UZ8w*TrlEOQoH;j<*?Lq*Rel&M(}0o%6@#YarXa;@=a?2Yp%vN#!?OXLf!s>Yk{<@7pp41 z%G+pems78l_#-1KH50k;l)^rk&7UOK&}qoMxLX&Z?~cW;I!&?coJTGeme}DBD%*9f zqKwHSwon5@X`}YYv$U3x4;z~KSj7m;;H-w_zPuV82fB325t z;q{>n*=Aw1KgC;frD92xi1*z|hGpGSuy=MlCn__iQd{+3kb$K98rrvt=#1=@&yfiI z)?gZXN@uMfM24+Lq!FKfMlt56!@4*cU5!Uepbn0OSh_~D99#vzu^*ttAeuIxxX!Xz zlXH*=xhCxicXPMJy16%4k{4nvr-Ee`1M~YEl8$XFwhrvNB)Dh_@vHcjuzNMvOi!c_ z$!Ci8u2{vKZ9QhgPS_4HbRF#d7(G?|kYUhiO2X_prKNWcB~A9?-Wt@eyugW_3<1tS z{iy+1^rHmWYFXrT-CWSg4HT1`4PegxNL-S|3GrIQq@q617>jL$sg?r!@(4Ipwh@zR z)e6O`?NV4#GW)3Jtys`{z^@nzXi3c}&&$vr7^M(wxKzq@R!dl)vk|~-=_^I%zc)k@ zC>?b3OhbS;qFdWZlDxU41>7G;tl3{$?6JHAcI*vBkw~GYRR^qj67P0u*FNz8-hDDc z+v#&9U}|HcE}8`Y=wTEGZ{5ZB5M%nU;XBt-*V)ai1?-!-?=zneSH0~lfhVKaBS!*+I=NJ*dR?4?g9vw zyjAiwfMJSN*AYPE3X9}6eMRyb_pzq$bXK&nUuCsr?>GhF=y9^LCtES$z_!`vD&alX z*2pFz;KE91_6N`|1XxnkY43nLr=r5^%Wit)6p5g`FVyT6n&jN2S;2J#i&_A7;yDXi zU4;=SP8#gZ0}!_te*|k2$+b7t1ejI|;_;yxc%m(-E+R_Kq!QFWL=&m3)#a$T_k66{ zkA{vM0pUtR1gdOCp?ZFVz>Zfn2g9Bbw6C)T`$&+XmrW)>J3j*a>B-_C7t$CS4PL>z9z661E+su!te#*?VtI&Dw8Kit~(2wYiCgC(N^Csr^bJ) zZI8(Jt-xo{C-?d09Nl6HkzY?-X^feAFEs)_$-N7 zzl=b!S%oF`$;~K#>Z%HSjzqkfN*Stet-zjm-ac>Hc7x|sAt{OoVA9QZ_w*yapL9k+ z%xCG>DE!dTfG`!{-D|wfu(A16IcWFDs(;kz&8Qap9hq`U$IRpt*dq~i!OB$tnL|+j;$uJ zS`vgZ(x$>%fmKY;Yt$^XEz)^*H{nlu5nXy3*u|xqVc;i2LJqLjVWsUNRB#8V=Ry>A z^=*sw#~{=NE&{W|;g%gD5e2W*@^yeSmDqk0fg+!4{888CX9HE!3yQiQP;as#ncWFj zV>VikQ*Ns2Mz8}Jw*d7!=N-FIcH;t_Z4kW;p z&!l->t)ywkNf7^w)~5kvH|l=6l!|{3)LUzcGfYuS1}s{dY_5W19k}^DPD85|{Wio8f%LHFhg<$PJ0lc^x(7S?Set6Qb{LQwQGhR}xO*<$})klpq zjAmmH@|Z`!Ow@6Gt7aHwl(91>0w8+fKDQ4Ki)T8)>wd&(2^%jMGdADyIWCM^kgb|pg2T5U?a#t@H_p(Ld-#PS1Rr=VPwmATTf zd!UsZD!uLdBZi*;six&cm9s$GYpfG<8T(W(uy9G$u};$RK8^=Xn*&jvT5>;a^i~HH zRS6~@Rb?>j16^QO(6D#THAEH(w&emKWdnkdKPoay+frqo1lu{#nFCKM0zMPIJ!Lgu z;A#Vyp!h7cv@m`Ed+ig+bIVsT9O`a@sz_sqahb;codAm*V6h*!7vR$bTJHW_qCtGp zR+Mbs0JZ0Nu+_9Q)n>5MirKdNW3s^^Dm#1OWF08q02i45DC-C2E6a)(@&KD-PwgoKvN;>@P=%V zU||9(YEdP-yUK$!Y(6QCGepMb(}}{b1a@57(D8_@UhyYu<3Z16i*FW6b;EJ>BiLF7w) z*7)IXk;4DEFZHhkJ2NtWn+ScoYR1%B#Am;!n9SRc)yX*16?u&z+`-(lPuhs5{Mt%u`w`!pdeEv@+tY8h$hw>FVzI;XpUx5>ZYHYk^ zd%XLs3hX61b3Vd1Aw|2d2f0(45!~m4eUdSkb)k|^(&ef}Jf!4Kt1wvJ!??i3zKluX z4G+Tn_ssvi*-dbMCZ!af{Xj}#3!T#5+k(1J9|(4U-yQh1b))pmq`5Sr(2q2%Y6Ppd z6P5}&WC@&4vH3g*wG16lmCBKpR&%BHW#5m9ot?SVFwJH%V&4c?tWBN)%Y0C1!|-Os z04jqs11# ziNbrg48Aw;F(r8iv5H@l^oie*YIZ!BtMrF<&ss2!$H|fnz0$DxSp$r(cbp&hwuh6H z*=^-#TU55`lIwdyntHx&z)B0VoHKw6>u)w0ObZ56t~sXeZwng+T^F*I#I0gM#65GtkGHe zJy7SaS*Ig0geE`02nG*fnx);QBF32fm2s)d*>jH>|)u z(t7d-vPVoNkpFv{3`Mn5Obwi2+mpG0@|7lHzf3|r5mH_qp?MF`bguxgfGuF5GP&~4 z0)#J>dWmjs0RwNM=)_nl&to$c@c224vP7qSW&t`+&<^a32*ISJ&x|sR<97iLWCM2h zgSNV>6nuj8e2=$Q+MI9mis?K1={9}d1 z1T7e)<{`=2_MsMVcaTN?+6j=v?`tOM9@pF0uIygMUEW;vajTMYuEe3c%-v!e_Aes_ z`(PDCVcaC_QIR{+6a^~GhM3w>T3nfi1aK}x3VWCYl(-*n`I54jR+R~*f=QNrVy1vn zgwOcgFyZ=Dv8faf*!+=>pxhRb3p?{?f~uAl*fIjD5sIYlzasMu-zCDLF)80;4$Hz; zwznjbW=&xgEk&r*HvktXDm!hoBBgXsUNwStU;`^4`%p!REr0M9Pad`A=Tx>SSjFiFB8+IsG@0?u+p>x6|zO7E3}c2wTh#9*Dy!w6jjPEj&ip2-Y22R zMX?;nUA2hB@U#Z&f9H&u+%)RGl{BC#HDdcE(^FpG;T%hm`7kGVont85u98UE98t~s zNolZZrX;WaZqcp|0IpX-W%d}bYc&Dck%opOPwCmemmyUyZ$C@+X8li~p~xYChrflt z_;P_tda8{r1yf+cSDCWxcFm(_c*MOU=CJB{6sM=dE7uDwZ5-g}cgUY<3wBCc|M7j6 zoas3wEzG|e)T>*;d;>J8yx*ewXyo?I?qGhugI)iEq}k_28{ow?3WC1{_K2arf&n+C z3QbzerD__+1iWV?j~PDD&c07);aXk%-1mxQh?h>=XtJSQcL1wj1MRBXJW3*G`Vy$k zCK~6??E)ve)Z^9A#T#1gZ(J8%BENEfFfDYe!p>Gk{i=?HE!Fn4ss3_iIYZ5S=);Z=*fc^$M^6F^;0iwBo>k#N=C`OG(Rx<&DPtg+Ig&~(5?sLC>Eo3wXJJOo;ms~U|=41u-RL8w+wp>ZNu+fG7k;wLb6 zHcE~Th80o?B?&vEKX}YFv;z`r+i$_nKBdV(CA?V=8!!~vnFGK)QY_{LK5*r-UCzTP z>Fx!-SP5)}$Pu<*<@W3XoyL7DvmE|$K4y`Xrf12OhLtA2yNuTy-tFvW6%6HUCP=8; z?(OEqR}Nd2;;cb0RD5vJva`;zr*qrW9tHIs`-TLHKDkN10Lxyw7SCB_$W%mr%AVejMZff9Qga-oH$_k2`V&H<)}m;PRpwImaBG zM-H4X2V6}L8%K__0R`JcofHaB+JtiwO>Q&3^?_5HX%xA9;B@=L9b7T)9szGV+Et*| zoVPZzYmL#)(XN6KS8Z~Soa>3F2~<6#Zi5r#>86K)_#TobRFL64K0jg!&V9y zx|<3+Ss!ZgqneR-x2Dh;{Osc{bl7vjQm1Q1oa4V^Je@PBxu2b{ScHkS7hglGT7=lT zBbxAY473XhvpWh}@&nL*|5OCGK4}40WTL-`hPrAA0lU4XNJFCv8rY<)#R{u0)VKqH zss}CN<5Nl0CrBgs&)h;HcMP8L)17>x67?!2m-7|bul%&3G*1dv#i9xqt7@i0phi!A$%y~9!D!tm3Kfbe@ruibA1$3fq(Ei_O1jgk&RmWVZxStQ`%06 z9j1t5KV`#A8q266q(CjO=nPey9}jAEP|P7G8kWb$3A-;IEhUR0luF)}>mF#yi%FZk z+LrR%w+>cz2SDPJfHO>Z?Bt&n6YGb;QkYWMiO*<8Ne{q*q0X%H7n!{5P9srI*9JUg z8!n-F7Et$IK-(aN4L(dExLOypY_)p2ah43CBpp_{UPhJ-fTQ063RyBBblZ}_{PmJy zHJb7*8A8;pC4(hP2EZMb41~*DG7xQHO9tA82gbz3SK%xLKJ+HUr>8W>A(NDCKRF-o z3(2JJsd-@Y@7DY}cT*Zbu(PTP%7W$D2-QJtVfnPRSRB+rGBHF`#ux!RVU^TI>gxjc zyO4}bK`3bo0prpv>O6Qh6{UiELh$_*P(9mLQfb6J9Rurnz0Ql7tu|Mb;jPKe>Aj5ot0>9HwIGCVcm=6{D zJ9j~SUHX&X)yq_%a|Lt$vmnkxYce-HKhxlrHzxW%oDo3YayDeYSCXwD#a zw&?z06w->m(qyI{mFBZ-D6F+V3t{;hfeV^aK#z@pntG1%V1J6OjG|!Ca|n8|2ukX{ z3hh!Nw2HJS`+O6{kg~wg_Me37dsI^o7ZkeA4HJ!f>m#&zyF%kgSideeV#|MAAiS;n z30u1k0vE;+wp2d^vOb39DZN^~0`S-YL)F&M#MG%$3PajWXfNaSUPg$UrNKNNp!eio zJjZ>GS~;qznpoDnEAixG5>LkXG&T{KQD{t7iUl~ z#X=Q><#5WNm23g2<}(CF%u>Ty>pn{PY`Oq1yt8Ir)D8KtOlZGQNvhaGikiLOVlMTC zVWZ%CXr*Z;i~|ZA7h}-l-^Bt}S%XmQbg1QK0qT9FAhw7UR_p@=-OqTZ0-m*~p$S+m z<*`#yMO{&4cLvM;#DHZAZKz;Z!7{y2>G>vD&QqG!uoldo;><->RAS8_x0KUrpGKa^ zKf{L1L7gX5>~$TD^B9!uf8Lmdz>n(zS*ePBq`OIzz3@eW`#lj;qF`4rF@$~uc4(|c z9=m7;_$atxeZbC1&!{pJ?B3S&E&EU+U( zCfz$ST@3?=rz`_%HAm9BCY&0{fU-^TR%~WrMmkC7JUPK&m#=8b{$NwXs2K}Lm`ssf z3J0VmD)O0lOkl!zL`x^Zzy1SQ!$d^|4g~Y^29rji0;V9SS~jwPO=Xbt!1Ac3Us@z# zy#jmA(40Q1hF`9Hki*zM^0lCkh&_BSWG@*I%XPx*$}+U+p8&pf6e2Y&8pSZMVwH{T z$K2`nciZmuutD`v%YFLdj`lz21L-EW4shH0ql(5Kkw&Fd%BTcF{rQ&f!V^+cq4MU6fC55*G znCDpySg9y8?;8S@%(Uzau+)zfkDZ33`oS?k!)&rFci*>S79n49@I8n8@bIVCbqEmD zh4A@a*XaW-xPhVX90#k~1MvU_;?g7Q}hcsh-fP zcOx16+=k&$2^mICYFGZ&kQus8-upnv{`q~N8U(G-l-Tp$2O`o!-v@FYd5|kxHIcI}@FQd3M%Q-h>tL@=dP$iisenN@nh7{Rc>b}Pm z*08#EUP_<0RR!^4y87-Di@&rA+3R$Dn5tQs)rcmk^1+LGeFRCED8FcACw9kA-=Wib zREn_N2R`inMWJ%tD<<`8%Jku}FwSDF@*d7}Ey>aHJT+>$lm@1=KQnH);kWWJsP(8c z8{w7XMQwKC5sN9{L6l9n230md+?Vh1NwsYU>`=~p*!kJ4PA5FPp@LcrjFWKp@h9G= zC+OTBmYpL9$kY=vEV+eFFST+zz5BXcxy~5$t(!L>-*NbYyPBagr?GCChDs+IiMh zDk1Al(?Jc_MXlOw)oJXus1nOt#r5<=221!*! z$$C^(#MarTf6AHM(Vq#>mSUi&;)(qmGpsi_pB?d4K(;lzn&gn7bZAz2D= z`4Zs7I|jQn8;~{?@39Xx!N-bsgC#)*5S^XzzG9Hx3@iIGak>~_?3+7@)3XGa9S_Yr z8g6DwFwZBcdH3gKs}dDvDs+cIr;nn+Jz_CqoN2&j7_!lLmB4xwo~rN*AY>&%^*^;( zqqNa9zK@})S%TFS!Ai3=ZGsCNop;P)UO=r)Rj8O0)Ml(kE@qb|bL|M$qO{7h|VY(mfD@%wK zVu`)ygPk%&LXrG~5)>j-)Ukrm=UBI4j_5ilr1M8>CsQdGy zeNBn%)}wt)U&?5HkaLdK*TA$m_dM8p{0w(^*%uIvS;(-!d>z!gA)@LvLlU=uc}@hl zpDy%==2=GpsL;Hp3&DK0DeCQ~I1_aGR_+1f`!0Yz-$SA~Rg}=RuBhA}O#h{4 z94+iYL&Y5bM?hiEIBMGHz3~3AXB=-LSz?dQ+bi`9dRvZ$@)3DY!-suya^FAC=%j4t zJ{0-&?!|?$@;==!u-3QL`@}9YNoR*3jmq(OtB%tu&Re&3`M}%<1HMJinYMsay()&7cJP;)IY9V$m+<-=}!M-nP_Br0f;!Waa$s|B=O^~hP& zabXPA*vN7UP!$lBiZ_aKQ8m{nj>)@{_b|lweM^jGdPjH_JL(=7zfP#z8%>w9H}^8Y zE!QpVR}vuILhHtJ@H6TI4t0f=wFcV3QefHDh1OOY?~O?OU%mr)d#?<@?vH8*rCOjT z-_mx@p7$_FcJ@*v3+b`;(*gf0avpvxYML^&bAYHsjk5o zR)d;32+Vm#Ec;dR;e|D~bIOA`ml58$YSH;JFw`R#)5pP6&Kq(4URjC3N_N9T*5O29U z8Wk1&BwZn6$->D}@Qb!lH1-$adyIgVxyWF0I%7;+0ceL*+hiGS#>b#JwzUr&&?87-|lQWPWRa{_m7ox~nVaholwdR;J3;Jsv z^7P4{_406Hu3jF(zD=(@p2C5++ar_D#?Q{D-42;Xr?8#haSr$p{?Q9e9WrWy#a=hI ztMo3gE*E4=xcL>(m>U-2iQWjUlVYxR1F$c_g5U5OiJKZ=uo2nTd$fl)VKsO|GdK=` z*w7iVL02+?N+qAjG zmgV2@PCksX9y2swagZX_@e6?S#_Y<=d}3p__GSciJwY+4a-q_IqWuYUX|iD^Fcr)k zB4nAVhHb+^U?n}FeIGy@vsVs7+}`>yglj*-UqAtK-Gs&>^aC9I0Pi;1ft@%8?8;=Y zlQ9zH=pqSzU^r2f_|9N3UR31y5k<$nizuqnV(g12g!T>Ms(FTd*{nK$X;JnM8VE~} zD*FcB*d2g!9iYWa3y*qG)7QNLfom;ps<}RNT)4Pinwo%IU-> zc+Yv4Rt(PGxs~fev z4cPo-Fj}?VGjYR{5MLS~R2#Rec`LB-bn!ZC9^kB_(7@ZXyPu z?C4VD%AEmAmQqQstf8$0J0=M^@*dtJLkJVvUT8s@$<$5(X%@7$VCBv$R1LMli9(9g zSqnK&yb}d$G7=zXF7JHF*lnjfQN(14a2;C`Nya1E8_F!1q7=B}i*T*b`_4tuxo`m3 z^K<0a!uAhZ1a0%0!6NJ=d`vk_&r6Z>}{5ZnnBg_{=GaA^sCWWv#cUT-kN|dpBG8+3s7}-dQW7O5A8EyK0Xa zM$VT|RwDxqK~psY#v{;bQrD`^uZoR`svrzGvA_0 zRfPdyyQ2*w>v_1FimP$7D0N?1=ISb@rA9%_i!ic(LpXY(qRkWqYkZtwJ6r@S^BCAy zP65mtWhjQRjSxTZG1TQ>f^CaebgbTZ51hk$^h>aVE1>1Hz^c@)p4mSfjTr+%x|Z`mP>lH<29M#{&WTF90qIIFwA;+WQw! zK=$sRQR08jBA;Pk(X-%hzNwgPv@^`bF$?PPz7lVX9f+$YJ{og)4axYUU?JTBHIwm1 z(#q6b!wn2Nv2@;W>g!u9vh{q%&^ixyHp8{O>5R})bn;h>xke#1n?G z9s?Ra9`DUpjQjH;*&L(f-G=}}Yl6_i0UnV;`^18_9o=?4Xx_Uh4xaKsUtB+CPtFM`*VaXrELJ&{>xb4R?G2rI zH{l-W4VL6ZIOlq;{n$>`Q3`!&jA2mksTiPY(p8)rvi`Ur%efy55QB;lFCo5gA1b;% zZD@L}T1g$Y6{9Tcpnv3oE6O6)vGWb?CBmaWqpLzOu*K_8@^^2!nv10SmaBml>u||i zS`BEqw_IsPng^iCEm!1Y=}C*j1q#KQGE(cMnJrzTnX#?Hn|C2ugjD${2y&~GtIYji zgLWEB(|ctt+x=90hcOm?;^h=&y8=@UBiDT+kt+K+px$6W+dA;o!%n-tdot-ssSCA9 zGqCk@H94#ZcHmt@nBpYqz&Bv(1hoCjNGL@@&%`!`7LnpCCn9!N6qKV0*q2&b^uPUJ zXGV&GSc3hlS3ZrdCAR7R{_%Fr0Qed?Pp?90{9BK=$0<$wnL`9^HW9&5Kd}4L48=d~ z8wG6SWw?Rh3qd>dv4DSZtQ*OC#ZdQkL&etPLPe!#S){zPh0Qz!_a8pijd9C6*DZ+} zjFyl}=yNW!`xlONQ`dhwb}GLD-a2sUOeL{=IlVZ%CVQg09a9uf`uBdMS!xH6n!R;N zO{FoKz4WtSZ7RV{t_F7RyPEQ8=OwUBj-jYRHMRAMVsLl}e()4Pje&Sw-3(ZDDbAXc z4abD0{DwN2>E*mI+S!av-bze%CsZGq3hVse6xe-WC$1X?=O-=JM`iIIn~rz8{7hqS zo2r02u4?*^OR@O*n3!sx2D^Z@;P?@kjd4@qaT0O(MQkQNBwDiT?=_B4s)dEseg@2Q z0ho6kfX9~#?=N7U7XV&C25IkW0$smaD4Yw`wM0}uq`{^-M*g>tw4L*=i)fr%Gui2u z{T6lQGQu)#muSUaYXkt0k~d4F@~2GqnC3~rUTBIY7aFFDd&fBIV$EyrSw4VKj+vi zKXKY}uvDt@-+8csecUvrNo;U78NA{iv!45Bjwzis7 z)|!5lznw6hW)ZCwDXY3q11r|15d_~4h13Gibo zSd^5nA|wB%;Z^>#K?+vZgE%(>L9t8Ihj3gxsISMZu7FJ zd)k`4a|E*05)n#Y4M;Agz)Au#ngUWHXsCATTmw9lshPWOv>1gt80PJX@XzlBY`X^S z$U?xe6`J{^vnzf0Cyc7SEsij?1|qZ$L#Sql5%AMx7O5Ko=+FmRvwIBt4Ju|l;ZF{O zA9Dur?SmEb|3%PtJSbRKLk4%kxbY#hElngriRqHKQ=byXvozGJEiKIS-!#3@(z%o3 zD?8wFPb@K%d>(NXQWI8K6d<_12o19cy$GzdD85kvZ<(*avW6J2?Q}YRN*Pka9I1|kOeXxCx zX=lzD(9vKnRueqrZVSytEym|7&~k`KRa~sV41ua7C`xK9SZD)HUM0fnUBPb5fL1)( zqK+Rk6z*x~CxJ8dU|pWA7;{4aM`jzWU4TVZzl%5HoF*+&K{=%WDKa;*PghaEgAu56 z)k7%p4TW)AE;}WidB5&OF^qx3m9dC#Tq7{G0ujWFLLloQ%>vI`VNi|<_7m~BrU85`i;CC?&AXD6 zm-B4Zszh3biu{>?`(K1rH->;GCV@5jLCUX19RqBB6hipd3UD3lE=-duGZGNpz@Xh9 zS`_05DR>FZu5Si7Wp(RdSN7qG=$B&^w@z*47A%fGXo~iKkhV3-od3 zqyJNW|x+ zoXeW9!K%dxSZ&UsY(pgA?GJQecQaw3<6!(+8{yX7EnD@+z!Y-76^)VmtKfHEZ_&bv z0-mS?c=?RsUc5In?cy?C4mwA$oA;fj)$KWn&Oka3*Gr(Y+Bos3!mB|SM!lV~yPjwe&9H`x9R z3wv=uuq4A!{)1*6lmjh35iDt^X5Rj?luP6GT1v-PVJDWtudo(Y-4`s%#nGNPgxxhJ z$b`Dw8J3DLU?sp@>4G&vQVx)D=;r2UgfH}>_C^l)gWOMx9+1GfJ;K;YU&hI8g! z3--Hs&wr%w-UK`S8{h#p`MU&n~fON{irU4^YfxlLhM|*d>5^8{qRT zw9IlAv{_Q1htlzLhMK8FXjjF2eU%}#B@Md=6~Lk<7}8y>l>%1Z3cjOT7fE#s~`)N8r~;QdGptfY|wx4&L#g zx~{)Y686QCq)Uu7_WmIjqmn1s0Y~WTeQ=5~MdUd{6nC6tD6*Vnbb1KK#*Xu@n55X_ zB;}!epMvG>tpPp;et)ncInLzK*+cPpLbHdGevXQmd!8)1_fRHGy2Bm{D%^W00kQ_j zIUhqzuAtwTaXyhjX!*%Owr6s$E+av=U0nw4wyVoXlXG<$A)On|oS#0O3tT^CX(6w< z@H5~-FlW|B+vk=+8Mj{@q;7>&qiUh1Uui`9(=hDejSOiavR*(Yc_Ug4%E#R`wFZTsOp-u=bV=|M^izg5Lh9 zBih}MI-XVTM;*y)c^adAQt}!!2P~c8&J9k=NODs8MS3L%aWS$Jy0$o<4D&FPGPqWrvW5 zQ6^aY{?Qa~jZ<$%iFHPH>S*jq{iizQ*Io*&?i`-wx1 zVgrERnZ3}Td|AS~hSH>|+Ix(Jk=={jrc26Mi}&t}RAXtC(>_E> z9($LcllV<1T7E!Q^`uC09)enZA_~?m0gD=q_?8(KgXOK|)NG#NE zMQF`Ru>Fr1Mx`}?6Y+SHwkb3QfF<-K4bGBPe$x@_XYZwOo%fh*S=tQ94EG4g)(NCC;OCfS*W8)sJ8ts0mj0sG<(N2v(IGtC$2poqE!FbD!Gtw-_+D zKn)roU=iNZ%h322Pwm0YeQJ*ox1QRghPJQ{QWevP`^ep3l_vorPilr>x|9mt1qiP% z$97a`n#IiF5-h*Bz^+vX^FE@%Ix4UYU>90JE82iYrOJLJu+(@9!Wlq7Ff6ZBKoM^P zZ7sA?#qpNf3J7@=Z}4J3;C4gva+-v+A=+pcgKcR?jEA2lieG;uLZ16O5HEHRXm{B$COu{7-1ob-6O_S!ta&= zZI7*)zBEC}K3O^1+ons5`&UT#pP`kpQQK+Q-6}Lo}&qY>%($-tMc<`Q}{O zf4AMnw(DLJHEBOud_eJ?ObKkRg(L}+l>EfP zsJxP$CrX9DQ?d|pKJP3MuCaAd=zZW3MUi`J*#5tQ)(ci*a_ynJ2|aQdF+`k2b{|FK ze8eH$^^W|5C~){nafD8(;_ z*Ay3qtAg8xdk@zRR}B}7`x18#?k8MxTwPpe+`YIqxH>qYx59P6-Gyt76L|?+2`74D za3U9hD~XeERdEe)O>ht3Bn=I558>i))p0FxA}8@yz=^ElO{_-9|oox>f+CE@nswic*=$)Dsm5+~&@WvOwJrxLjPa8jpF z;-vnC_9ku+PRdN$Pk)@`GXy8)EOjpa!MMEeMZtY=QYWHM>b@}N1zpNl>NmfWwvgY2 z~gKx(qDo_<#E3HDPG;u)-~0XEyINg!tLoNr z>YP(&se%9@#1DUXV#>=an>69<*Cz>8zlyn`6LNC%NHje};Fo>)9zLO{u=J-de%MCf ze|3cDPE05*&%P&PMFE!gVL6uClmBDdHeL%^2H;^5aP9s5Y_dW3p-5X zT$!H|64pux)it)xzPXl=^5%}~ILNp6oTiQF`ONiM+;EN(c^qH+~vs$~} znDz@H!S`dE9})&D@ECiz%|~CS&G-i~VmJ7_y0=gqjtA=d@6pUwJMmpZD9gnMzf)%p zOeW(seFOCaKWk$q<4VU9nV7B#!utco;8176@p?k`Ui=sr zJzZFi^-P4S2sy*PplLV5GxTFJg>NS!h5&UK$rmb!6V{R@dYCN3;KhXzGk=6M;5Vo6 zy$0jw*!Nh!2*Yj+voTD@V8>8`p$Wqr3{@EFhw7igHfFJQl(?OgX^iAS?2E^6PEw+~*%xisVW*xXlPA1tn5?^q{nD7_h8C+p$$!FRE|2h%;+|2iyV zfz@5bVr*v}mZ#x&Mton5X|?eBU_Zuz7z7MS^azQddh#@jasE^Bo1d`mS`6tJ7T|aW zSUINKu`E&eni%OXBpBaI8O+!_KX>pd=OA5t1J36#iNz3t!O8C?8~NKv5%&KazTbhN zi2g`I*te=9Wb{zTM>woRcrbYXTR;pCQr3X2#VrBb6ftb3X@l=!jPoKsY+V@K{}^zb zn=x;KvIcA&h6AnvYZLq5jALSO{>~m5HvCIqYtT-5*jli;V|vQJ#fX2be;o6Fix2WYkP0mK!S5@S`MBFTIMm*Mj1eA; zHY)yGjP0@SHV?Ina~(Y84#W%Ri-Eyif&Em(KO^S7fZ=7~GC9m`BI|L?CdAJj%6Je* z@x2GzJBW2_hT^+eOv~N*h<~hHkL9|dzBm3c=06-95Z)w@V7-lOjWK59|Cbo?WjfLr zgU3O{w{=7D@}YP%j;9vKlJ?(XTqhgO!^mO|8Tarze!mC%TmAnuR_GjQ4f{#N{@D5| z^p5EyY;)YLF{58>yASIqIKXh8;T_Ix0@h6!9_#Q}a9(66IOyTQ3z*)G0n>CC(dv1TUGMlbE;3sIF&H?9Ilaz^^4&k--I+)NyaK^ z93z7ngD+cKmWO2?!+Z|+fNEC8>L~SpBJjB{Sk*CS8DJbowAAMz%?!(Gm;RcMFtKzBVi{`eq2VR%Hid)>4ptR{v0CbEkA z4BxNex3S0{u}wiD<-CI!gcD?~DvOlj9M33yF`C43mWOaTsQQ7}_;MV7AM$v_3pP&- zYV5m0&51~LlkvAObsJTzza?OdY8yo2hQB$WS?sj_zlBL zfmI(l!0IB*niN=Jn<@iYhKZj4)8>1aY=zIA9wn#JB_QF_*EQWw(U8uwKD%z`Bfv z*3mPhSVJHHzZ(VJq#UKDa;#H{p$fNWl<~AraU8Ys8(U7*^0~(u~1LnN-cfS}fl;_#I~_Ch8pg zma&+j5J~`31i1^7fl((xjQIfLKGIE8DAnEt%iwMpq#^Wm`X;@=-Np5A8@UI$cX=!=^_~N6doR-yC3$Fh`kf=4s}8 z%?BfBgepQC;TK_u2#zpD#74wNI3uP<%(766&SJI_E46xAbymGK$Qo*mv?f?bS~INk ztlidC)^*m6)_bfET8~(dTc5Q)Z++GJw)L#_Q|mWT8Buanc2s@T%&5kwx!345;Ws)s zh%+&feK>>bG>E>2Gx!8&unK3enR|!_-iI&dr}4ev-Qho(bf!R)Ntr>iDedMA9{RT# z)R=p3&cGLEFd`y+Xa@BW4ay8m|78Y6H)qgm-Df>~a|UnW3_igbq~Dyutf=N|fHQ!> z!ND&H8GK@J!k~R%^}woug*W!~pX)!{|8D=8{$2e$`*-x;-{16Q*Oxw*f4cm)%hxVn zx%}1TFE4+7`NHM%mp{Jzz~!#Xi!OIu4!x|s?0uPD8oc!DrFSmvy0re1bSd$Y^-|;| zWP6u_FZo{5UHtjtg^QnE%(|F-(Q+a8Le7OT7e-%5xsZIpej(<9`9kmo{|n^&mGj@9 z|DW?;oxgnk!}Dj(zj6Mh^L^)^Ie+5(vGa${KX88H`3dLq&c~jQJ|A`7;M<9i)>i zBzKTSWHIR?OUP1kC%KC(LpoYcR*;os6wA)k`Jkk80@a)EqKE|N>+GWmjhNxmXqlW)lXkZ;L% z2ehCAU+@Ee(1QU2AP|CJ1O!6}ghCjEgAq(%h6u1gBv>H|q9F!iAr9gp z0TRImc90+mlEDEZAq7%l6pV&6NQW_y0b?N(vXEnrLJsZ0784nq!tHLs7`SOeptt1y zr=NHp2UlI6Ca{QZ15$1#GmMifdr61w6lyL!6XDZY8VM8M&v_g z5Q3wiN4 zl1;{w9Fj}&$OPgf`D7v~Ah(f8WHKovMWmRNkW#d7l#>cFg;bI%v~Sdqsic-nBXy*n zOvh<4EL@8ixD|12H)7U4#I1)ByB0K(nZfw9-kFX$l<)o9Gy%mo8X{*n0};VFvD% zqd=w^)PYpAg!<#o(~b0TFT(;VP!;v2K2*dNdz#)wPQz&2drUMC`S%vuOMP)YJ*gHo z_7zA)%aM-O4bjm?g@y>y5~H3S za}-EIt|hPDeBbQwGUMOfcnIOs+FI7Sk!HF0RD%rW{L^$#q3ZPg2r+l=9+@FJ?1-Vag3^$}zd1 z-jwUgTiDc-Tc4Ad0LMH%##_eE@<>b|$2>eS>4_;G*9Am)p~`*5w=TinZjpV!OTyLO9NHC0KHDUGc2df|8s46#U*LxCE=t zV(R$^!Rc78{D||oC1?6jj>@Y02VsSIxKcemc@|S%PkqnyQ-j?zEGC_$=a`pQPirnh zm=smI0P~;S5aP<)Smn~yH$nQ)Wb;Z2T>iy1l`d+{Gc`@e>Er(_i+Oa2*%v3E03;8; z|Ift)0fFE^n3~OO;u}uMWCp&tx{E8_?g${rVQ&2O;eB8)docXiJ|d}?M(VbQsKehD#Kdi;D%X?7eV)-~av^Bd-vTtbvf z#lE`r1H?l1Ne}+uBKZ8`j;@4Y2T{I$rZfvS!`jKU~|T+Vp+(w9}b zb6xuJE;MWp zedV&}; zOJ#_=8ALgk#;P$@(h#l+E9x-Al!pmRb_V{s)K(1!9Rgg*WvH5+VXA}>GF%&n;fgio z&dM38$KL;?QGDU7rDc|-%F<+V$wie6L<~F%l!t(!z}&qm1!a}DzTE;W1QRi1u>!dvV7l_+ zZ^DoP*EKW4fd6Vk1e@=AvC zKJye1CC^<6^MK4eMcsM2;d&JFcz2$xu zei76-D5LVb7kGIy^!3BhejxqeQTQ8}euIA$#Tb9ei!uH!FV1)^FWy*pb=g&_y;^v+ z?&_ASN3RN=Uw;*D{PK%DqxK7szsL(PUcQuPJbUTlrK^`X`H~|w?^0fn@xs`P<)4q` z$}a*}ex4gNYCkl7NR=P?t)P&+voFI7eHq4=ilU6qzZhd2d6WLLJ-zqoqfe__kMBF~I?id2L+?}IdJ42pfkyje){|GCBy$7$c==N_l_BUwl2-p8Qt@VUdZ@X(e+)PAVt(CI^ihxpyQB8^46 zpk+Ip-VWRI!i@KB3p6g8N^p><0)iXU5`Z_BwYv~XkH#+HrTn!G{d z-qo;bWs(e6A5 zNH&!Fg0@_jtSv`@q#Olpqfwist;E3Tc~Z(ZqZ)U4rd1yQ+W(vbJglin@Dz8fh)PR(p4W; zRp4sCgv=7%n9zkC3n1B59qk>R@$3P2f^@{kx3{w_z(81ulEf6mx5pD!zrCX!UphKT zdwhEbw6}MV_72Q%hiRB@M|TXi0QfD2cC0qk0yaDi8^E6qchl|dSic>=Zx5P=crCmm zyhH9pubY7^R(>(>_lHkM`TP#lsDEU6zyA(Q`Mu8n7b#{5!si6)U`J8LzV%s$S|LFR z`_|_)>St(Y!e&B^G423x%%9Fxu%Z z&Ybc3dFtej$r~p>Jo)*_9~A}^9xr^W@QcFh zMf#$IB3IE{MPC$MFZL^rE6yw~DQ+%aQM|MGc=21spBMj9;!_e;l2MXV@ay#q>)PtpOxH{|O;4S^X8Nx)bTeXR$TKQuw9Z&JWB-ijXM8l{+DyNhQ8P1VR?M6~ zbIr_sGf&MtH}l(>HyZQ}2@M-(@r|T0vN5BvtZ`oBs>a^N-HituPc(i%+cdjk_MX`% zo5Gu#=RDu+)12A7s=06OdvmYP8$GXM-u9MNEhkz(Z~dnAuM2_~+`nMof`bcOZ6$5h zZ8O@wZ~Lk3dV5BDPWxT$YdT1WrbE|pyyMxz7>vyH&e0cjrBj z`9R(S8z1;;PwJkXdv5Hl-}~0Ssr&x&;KTSU7!Z`KKQ~{l)3)efqxCzRJF?zTJH<_kH`4&r2g;YJ6$q zODA9Y>Sg`QlV4u?@{yOnc}4$9&MSAla^#isuLit2@zw5EUw!r0KS_UD_@^U(y7XGq zYg1qAeeILiO|Lh<{@UxGzy8Y`K5s<5k@;4|JIQB$dY8OwdN`*X>A^u49;>)-Eq|M~}$KUnv{2Om!S@We-cA2ocm@T21& zo&UJ{n

      aU3UbJQil1v7Z5Z?HT-^B>9_t&Hlb--!uHI-*(-`oe`E_UnZpd7RZ0c zm^VeM5`kszHsOf8hpVA{{$2r*Wq zDiJ=;7Xb@C6=9(Wu_9pBVi77t5JhW^^!;14ov>nL4jki1Vv3Ysg3}>P^ zR-_^d`tpwQN~hReT;{w}+$26Aa&=-0mUK@jaEg87^ROr@8;hVuoGa3?;-sPRdx|jX z2k|$No)IsI^fB={{6947~VML`zpMXD8zB2~8n)S=Z?*v(U14txK*wY4y3*zH3C*GaGGFhz!3x?{rlS<(N`?T8l+A9kj_A5yeSU3ll;xNGMZ9%WT_A+eZ ze!jl!O%x(1nZmtByNB?kNj6IybaTMzPCa zby7(U-D*&`sFta=s5rYSOGQ5}hJT;u=1VU6` zY9Qrwpa}~#=taHW(?{#)?;-ko>39zw$cP{zC@6&E)ZxZ}Kvkfi;?){Y-V06HVd1M`0-jtgukE zMzvkVMm0orL~&LMBSIi3Viac=4dXbI1d^mn3U3LEZ6QgfB+7oIq@twO zBtgR^F~kV7I9V)r`UW_Y_!dsq1v$Bl7M(e}{cI{ckP5=OR9NKki3fc>;^PQc`EP*zMP-M^ERFkdvY>D_so@KM{TWNVA?Ri>uPJSASPb%_COco9)U1?aKLLSygW=TRHMuNM7ib7Hkm%GC9?bKQpi3|%a3n!apzd^0LVZGO!li_3 z37Q1?MA-3(C$!OUHF_|bM#~=F&gjCE5vOub2Jr!$!7u5g_SBe@fUx%+FNgC2pQA0&`iECkruu-;3j^uEP{wIeOW41=a`D~#q z5k8m~j&(BWAKz6UIHq)DXSbIpNfn(r7$^TWW*4{ff!{95Z52t$wD3WyZvhV>xnMRAxdD9KZ9iIf;o)kKMKUiP^ESv!CdH zQ&{d5+jwNT$wvrVkT;l{-HW_LrLw%Y*a3vnw=kL z&PU7K#)&X-k{=hyr6&{x0+#@R=?MwxftnTqL(wZ$eHC`=uN%1aIk3- z%*buarK!1jxs;nI#ZF3y^2-%9S;f7f&=(5Y(5z4zT3)OPa1^1}E$d1au5ImtD??O@ zVhECE?E-wY+wF`5amjs=f^}zfS9Dh}g+v;!P$^@iLkWz8h^S~EZg{0fxyh9wf z5SR(00)0Ro4vys1Q3fAyFTTp44+zZUI3#Ev7{&|!Pn<;K-FSVPBkR3uNVdN_N* z5{vWp{Di`sQC`_&gQcjzj5%9M3zyF+HAhUEJlVp~EXvuOQ_wlJz})uc^y=3a$8Y#@ zc4~rJT$sBwii_RRUFOWHPPRNaJF|L`aj!AKMCmL_G-Hp~9E z?AR3j>*yn8Qe7<*>S`AZZM7alJ1mwi8>pmv(CUJQAUScZH>?$*QV*3Be1m*^odWyO zsdPG3H*Vvecz9fgzEFC@85|035XYtC0-eeQ}$lx4eLah zqK7Fs7RG+qa4nMS9z#E`R9Qfv$JGSq>)a_k`7+aGr-A9v%0GRZNVd^izs{*>#v8 z{Nv(BY8a(ni!!_LBuZzswT>%n)5LLMVrVSB7GHCU8TqW)K=i6lXKDIl2ewGJ#jA+-YE$zYx zh1)Xn4c48n4aTYbu0b&L(^DTn1`4=``eh=U3QY%9z!0KCw21B8N51}cIkR_be0t=tPqRdyE$fV zjs-$3Fv0+xA*(~EDg>g#=F1v6D$XfuV2cJcaov9N{X3#oMN$7K#xvQ{_sPcaC@0ZG zZT5qye)Ig6`f(n9!G6@wyFEw^QSQ;FWnDosto2J{ScXEYU0I?9@xg9-9NzC(>`2KJ z7-M6Cj5<1#8`|SkYO`Use5r|Cfe1f#O#iT=FWL|L58EewQK3^6+!gk zvd$;BE?v5=BBLhL7@koz#`m^0v(l4i^iG@5-7#M z@DL&Gq^l|IOkbT&I~}VXw9~%YPCLC zj!3E-(K3QYkBA=O;cuFsl!W+c^tb!(_2+v1!GCPG=lrW4!0Y?x3XY;tmi7d-u6?;DlzPteZ1?2!o**FaXXwmeR*MpZ8+P_92tK5DhTRJga`qu{ zk%157-eOM=7)s zNIK=Bom$wTf^{lbt-Du87wRA=02T(U3D_RM1qia2!70>u%=K7;Qk@1`0#!x|t@ILd zdL$kRwf0L?&>-7y*8~KBr%DA#E?KC;+L75aVnL>>@PB)}gUJdEqzD>?{{xEI2Jqq3 zESR|khx?o8>K9%c=%qTnK{Ifl;IG%K;3vo$cnPvLawl)xwwb#_2#d6O_5Y{|4hd%7 z$`Zt*Fq}&Qc}fng@NV>8KIT03<8O(iVKhH!VI%s#{REpp6NgB%b}a!@nR2LyaNY zL%kifbcIn;K1{yrxg{-+w2k*U=^2wd%bC|!oDhecG4Zx>DS<9KXYOAaBK6Lkb8w*y zZ#TP^<&CWA$}_|ijIqR*brp`gy)Z!+YSq(Ub_|TOrpTT984Xg>G(>}uc(&}QENwJE zS3pkyty0fXE8y$mxH8&6X_=+L(qZAsA{rt(BDj?B+;F-&8Il>-OhhGXRWMkCQ-X7Y zJA?UvU@)}k^$1A2b+487TEUv$Z4aBT^Dv?0!q`<1vMZ0UxK5L4WKjDE!wv&AXw@T! zwhu?G0zgC@v@5xRr%;-LH}Om!N7`}|nj3Dv?iWGT)&dY=%if0|xL-sA>5xj0xp@~RCOJ#%j+*P98MrQJ?O zE*_EE@ttXDlkAPekL(gB-R8nV$LE~*d)YGOFuG^T$Ivj?`y$~v=nn2ov(B!AGn zkZp2*5F-5l@XiOPb)H~#Hsnv3 zkrf({-dI#Vdz7ywG^f3yuq79d(X zSC8xChwH=W?nQadp=fx>6YlkT#ETyGg&n@oVOeFN9i~;LZ6>bE*kjyj#>20mJp^S+ zg=zgxhHz7=qqxbTOoyu4?^?1W`QHURzX_{eSXjKG(HU?g^p2YR#pMz;QOakZ8E>3oX7R9__Ib2ax{818T7VYO=dF2&u?%A_9?mc@}SwBTD!M43nbFES| z6WIe*6CKk{y#G(iiQi4-#Cx}o78R7;ih`2GGyu1X;^=44{ud?17l-k?qVmew-NTy7 zS-P7I3ecy%lXvom@g#EdGep3>&et!%$;IFgVL$5$0NVi_m|g>*BB(qRp+3Va>U@^l zu&$C6b38lFs^zoz7Je^(mKS(30yQ@@vZKNu!~|bv8be$_SAl;D7(_74;=a6bfUBls z&cObi19uN>RrnAk4N%EX;C@urAWu$G%V^<8vB8ABoWq{^iv&zKbpCOpU>E9y7U7~G z2;}i1I0sbgRG9#Jy}P`7yt#DML=_dC9v-gPzE~Q&Ju1pSBrlZYF>;pudl@#NB5h|G-Ly1g?@*ibf3MzTICG+(IQlEzIb z6eUvwA8pMnEGf*2hNCn(b8^w73@h@i@f#oZIpsNi@snL`$Ct?cTVCNc6XunV&q&WH z9hKWul$Dm2S2ZcHPTWI<|HUKTBpAxch_ z^JH!%2UaeH%jM96kV11&b>K&6(livcRZmTbhH6Y+zRrNDjZ@c5<%-hl)2WbdNKZ-6 zP3PCAL2Vj%qy?u@Q4M#F+%%GUjw~2SJpzIQ;sUs)4}z?*?|ZaHta5_WBdI6|@PCj; zkVgr5Pp(U9Nupbl_9oG!j_$GVkrG{rse~&@_)rk$e&j#%qp-*@#)S+0Ia8PvCWmqU zVg6y0Qa`F9_fCKb*&j_pMc+}&ghb}xsr7ZRO%Hi2BKWXc;Vx=JouW258CA?%HbrGu z92SCZWx_*gj1;MINTN&`nL5gHD>p{_nPZfLV}{58w-%y^n*6X`5)GJW;f#z@6m%Nt zNah3lgqxeG^2w-7P|qK~@R8}G3zGvVsDg59J13OgSsXKA)iZ4w_4%oOs_5Mv{(kXM znR5#hOCS8}?loVY+AvM3c;xSU=A68LQNpO?wFh2pd2!&=x94OnJp3^k?0pj=PfzXN zACXlxx?;tY#JZWei|X_IL?8P1-m6FIL+o;tHr^|-DmOlT_NLNB7Y;RsNaJJn4XDZ% zB}um8&3&!QKi@x9?s%~8v-VAYeXQOrr3JNyXN@$szYC#76?dVl|g-r&t#?|vi; z?H09eRSd1*$hgp#>#ML*O!%dZMUNsTlyn+mo?HH6ve)o~enJji9U|B`w12BPGr#4* z{=4?SMzcPpsr^sr!UD8FeFDR@Cy-RKyJ$+^h_g3N=N+^}+OL@abS`3I=U3 z1V`xD<`Jj%cItGordTMnfW<=Uj6Bimv{cf{+E#71woiLbtI}#c>I}?J#!yB1MMsGP zHF#uNsM-#piCY^RlGEW9$JeclB$e?IRLwXpXwfrw%DKy*>nvG&dxd#-RO@}G7d|#H z_;^LlQ6LXr2HS+E^f`^|`Rhg7&MjN^{{3a~ljn|`T)3_w?eI3cqg$fmm!O4%gT*M< zRLgcGj*xCS1oXcnjX&awei&C2EU87s9gRG<5QN))$<`m)qM}^7aY2~XeCoHY{eOe^ z9s>W@TKY=1y}M-KZ;;;dLeFG+)-~|=r)q`e#fJuNoY?aAim|^Pb8g1#w4l($0FK|2 zOnOR#N-W{x@BnJ7eu}eII)hA^)O09t%A~QZIq1z z&5>w_#DOW{AfI^SZZ7%8yWD-k^4$X&I|mGC7IpW%75f&+oM#9f>^tclp>of<^;!V7L>{l@NrVfWuPEA9!#CjpDZs z%#OAXP{xE-e>@<<`Q7;IY3@7z>;9kj^#2KmhGUwIc)t(vK9M{luUHcg&GC?JEwNG| z$PiQ>#8m`Bg+B;>2ETGYuFI>(i&lBf@uJNfG*ig8R-qIS21~p*cvBfwPmjo{M%ip8 z%Zyu$)M)QE+3W4ycFs_96z@MWiC2p~n(MA1_lOXJ>tg+Nb%Nw6d(vLdOP_Hy-j}?2bh-D*Ry293xoX1ec$w$aJgqBIgG+r$O|@#!sMX@{TSyvW8Cz5Z*-%Mg zR;^@49f)aY$wQpOz)$a2ojy&kpQfAo+lA%*M`+pgWy-i-z`-rWadD(e&f}^P_&8t~ z%S_nk2v?6c2&o(0nR`S~lcUU`wNG#f91(PaEEFj(eZnOk+`sliKfHbRH^n0#orPp{77rEjtD~(zw(fISaFD<>;`W> z_L=2551TwWwrLS^k~5>{?$jUeGmfjx2;G7=ps zr-t^xPB;u)BZZafd(^Z+4G-YmU^*8sA#WgD6@dy5*yRC{9snNAn(HVnd-RI?n1_U* z&l61np5AJD3udT2fbzTsmxD*>I?%csIJB20Ght%11Lu_HK*543MQ(~1A`OhppjJ?X z2@!lr|Cv*WBadG0KS=T4#{RDmQ8MYv{kv~`iOb@i6K}^k31qY!qvIv?Zy|!35Jl@z zIopStyN1W14Rc4}xFLq9Ag2Obw$f(9!PE2&Vfk+%$nl2SRZ(m=fhNda_s7D0M)1=4 z1v$}ScHNr?UZXgZr+r&tJ8DW#jg-YTInI$Obt!kXUh~jbba8Sd|ZK zwATi!Y|zTS&apMvIFr(oyBl{0uiE%}R$OMII;Hv9tVMVGLXo@092=*%xm#F;MIYFH zwrL*55&Uf9a85iHmDxIM{3yBfD`j$#*qOT(0Vm0-)8}l^fD@txYycx|^fw!@7H|&T z=mL~&MYdKOm&Jf!veEF6sU%bmrRq=>JNMHk>--S*hA^%m5{P#s7m8>Xh>8>X;Cvl! zE`-#B$E{Fub)QUBjxP=$QN(uuByY+Ez1Mdhv4 zs(p2Uxrcv)JJfnVEyw8$dJVMxgFE7APH;$$Dv%;=!;qCt9)n|wY;$E~@yff7!&w~;Zrec-DJDjI3%)1Pmci69^*$q0twbynximT0Nl4+7#Oz zOT%l9dYty4CJ)eh7}1C_qE5?O>XegV%npb6!1nq-2!NQ2GN6hdR*@CSc1RSwMfepy zt~)VsMP@xJ-_6x7nfy?TlT_|Ri~GX!JU2Jr@p4&Mcc;b z2Yz{I*|}{+!+U(ijt|^&uA)2n;Q6{vx%3c)djesX?lB$p;DWh0JY(%;@UnVwDA{U9 zbju?E|LfJ&Lkp!*)fx46eWAWizf3P^^=I{idQPpEk#FhsYX3TsQ?vb&?MiO3jahz` z{hjUZjEUdWiBNPy$wob-4yE$nk6nCn@xYAJwD`_vmuB`o{P4hPSoz2O`35 zztn%DKNsv@?N5Vas$-}jp*(>Gr&gy@O)40Y%af@(8N9s%@N^C?tJ}p?b2Q{M{#}3& z(1sX8XoxAjJDtYWnfQ@)LV&+VoiAEmvK-1@tSqm4b$!#)lI_DX{?Kf3#+YJG2esn1 zWrw-gxvyv&WrmUey6Tg*zQ4whl2hskMFU+;QbqUlypTOt_ZI!%;=sNC`)sG5T%8u8 z5!Q&_j=G*Hn)a7~yI+y|{v$>(STfy*$u7Pm9F0<$hrFRjzf*r$&ut3>#liCg!5tr# z;-3_u6Y+08G!u^72hav9@DJZ`bS8id>~M$`@D%o`!B%;SZ+@$;Ti2`O%5)7nnvMLx zqI2jd=yW6esy#gk@s)gK-+JF(-+jI+Um5Q)?K5#BZV?f5w9Y<)IpVjB;75!gL3KBU zM@8asyMht5&;)@tNj!6hj8HPo zcV$PHt*C+CUlYm}-8L`=&Xg>gWTpB2PYcUOHEo|Ze#N}Wy8Z{bALVIT#{OSpoip5W zKrQ-SensAqMZS>dZ_k9BOgJzG)}+F!B)BgI4w=Ez9Ab_)?=tgMVTZ!#24C2qhV2x1 zs;6{SI@G7a90MMafw<~eW`}U$A%k(TeXzHaDo3d zxA(K{1OFWOOUyGq=`-(cEZ^LimesbWe#{-W*XP9)_rBV;^4ac5fzSJ-R4gf-vAWoj zHE(m#xaA9H-xd$6tG3@h_S6&BQPtxj!!qi!b1Ozi1$Z0d(~IZkHEfw07hAHp$m}Re z4Ygzx+p~&OBmJ~kSk|Vs+Q{eEy785IB5W5S4eQcG5dbe<+{f-vY!KO{3w8xVT_$2KyIXQ0>i;SkPp`WlCPOj7$}K`EZ^LpHlI&37G&lL;`^}o}vIT8S^;Zu28R)qe z2SWKZ{MWyQ@L%s9lFRqtULK2UKZ2~2$0`TVs<=6v+qs#mgIo_Vpwi`6>f$MZ2>FSZE_vxCB0~!%aU(++vKymrh4+QfUR?JtmgC{=Q^6K9+KTay zG~wOXRCE=fWX$=z*8kF*utpp1<>T$;;}zx$tKLKz*OXXgiH)|#S}G;(64TERUg|Xn zFB?Ba&R?7WoxZSyZlE-uLWkEXFPewv6T*AKX?}QB_?&RA)41A5Cm5#~XB)ZAiBOX` zH*rZKw_FDex(*#J*8!N^N*yX`m{>`mlRyr7$LZ4Pia+NT3H?(5#`k0A>Ai^EaAERJgGwB0;On)sw5aC&6e(v9+jS!UYGty z`d>*CC4pKBl<1qUW9|QuxJAQa*beB;9ChkmEfTChD3Kr&?7;m z)Fjb-)+A`8Ac_8u1aC<2sQWEOa!TtYVaMz4dh3){1*{z-fhdiT=qJ**5`9~Oozh|H zS&7?#_kjAAE_0?y5GMil=pn&BCHP+H^eqWaNw8kpAsu1^1RPqrG*POSxL65-CGe7< zsb7L0CAc8LI}*r)FG%p11iK}`c9%*pSAwY$6iARELA(T^5_n2*LxLY9I4{B55P$$783G7mqM8hP|N`O6FReCrp0k(fsf(Inn!s^~B(Hf=p7zq+32$8^B zg3-T8a7BX8Bse3%a}qo*!7d3lNw7p|zCfyxD9#p#gR{lq;B0X?7nI>(^N%UbZ;;?l zW%#wq@W)EPJ}^q?_K}uJd!^ITMQKn{5d?aUx(wNUcp|6eqGfHsl7J0}cqY-u82~YRmibzuX1!wyXKt z$qiL)(=wW-)TYW;e0fJ|ZDUi$wDz_&+pA=(VPW>b{7?dUXX97tBTE(5sjxn zAlf)B=Xooi%i#s9;oJgUyGWLMtTZ21S`ifHvGQdao1w81tx@9^&8zX*CN|B)Ry#y1OQu%l+V|Lp>}Tz&Vz09I+7H=J+CQRGRa8kqhb0{EU2F=6?A}`9=8+S&=uH zS(TZFp{&4wO6F5xoQ6l1G6u=Yu(1v*Jn?7=Y^cJ21H)=XCFxQV^{6-(8zX@}Y1CkZ z;G68*V}D|3{S&bW!xxLI_@U9SEDOuAkX4opvkPO3V$rvFTFm_x`x?9Mt=J@>>a7{R zoBxJ?Yxv)J(eTRQOrfinf^SJ*)A$@cd6JnWz(Jjs;EcF|T%$4lRvETwi?!a$z1Bt6 zeb&#d3Ziv?@wt_KK>NMc=Rl*pY-NkA+d(haSXmLMpR@kis@SaT9uU54eaFh5va+LA zcG${pu(B;y7`*$ed@7l|tE@Z`Z^Ozy5lx=7zHQ|XTaR1$?N+wO%C=eAN-LXdWx}+U zYh@lm{CAkjPg&1c`AI7qv>vnaLsqr{?gA@=yD8a9&BBAn`p;TFvGP+^{Wz{ZWIYK$ zXzM{MM+c(T6;|GAWdUj~*~)SCGgc<9evGcyYu#c!WIbwC%dNVVI3d^C zYMl$3Jyvr)PTT|1x2-a|pooi81FE?A2`d}2viMn5IA@PlecO80%AXfc1ZVJa>WkAF zg6U9hl)K~|$kb=Bs*9BX_z)8Vv_8Qyg6HDwHfB=&3WkG`Z{pt=1vZFL1P-&SL=m$gNCRDagr9<1#YGBoQUWk zv!*z?A4;$eZZ(Fv1F9m1D^^8ZTTYJyc^?SkW+ftRLVS!(Fhz*^f>$qvWhvkM;v0zm zIw$`H5n%fcDD&^X`HP21#@`-Wz>5(3WR@oDlg#Cuox!3@`CBtX0?Lbw2N2?>e2V4C zr^rGlm#&ZrA0wp>Pb3L0449ZxZfAG>`OmQh=B>LvzjYVd9M1{r&|mSIHD~SFHaV?7n!W5cS;^Tfn{@ z@4Fu%aqJv+n*XLFY7ja4rx5jzY@km8);*!~8;9e4udZ|>+1%~=^Pkc1f?cM~yZ-BD zoNnb0$}rC$YyUsLFQp+85gGn}dK%wCXoRq_O}$a&3LV<6>;qUqjj7$l`%IKN{s98@ zOdeA{_RKf+nN0A~op`#uB|_hNJnOv;MXF=W6MFi^8+*w28b2I~2&j~!+Y6PyHcf_OEgRl?C!JLCmKJcv4^y$w3jq_k9G)Cy0%i=q{&GCsnA%i#<-TKaY6Ww#!hPN zc8#dzE!rMxA4HTsC?{*VByri_HTJf4R^tzA$2ER~cDu%VwJjQ-udynvRpSA=ZnDPL ze4u@%@e@XCdfI4vbZssOJzBmPL<4#nP%VyYFKe87cT|(bJ+&e;iJoGlD{|J@)Dxz* zMGk393_%{;8Wyb@t2-a>*fEXuqU+R@qH9r&=W12)`+HP-UgLCMhcvm1 zI!t+JA8KESM}#}asqsFn&^Bm@Diw~2sHSMyFlqul7zR6tHOkiyk?{;#ZhQ_jc36+6P^r zq{PB$aV#grUXA_oA-3UFwuwK;w-4XM&kP5ITpM{m*01c3eF#5!j-Kj5uIQ-<*IE8mIr-*5xQ)>`FzJW)LhziCMKi)b_*{!#=uV=2t|odZr} z{ZL@*IZz;N(MQ6@_d3NsA$+wmDTNKij=%A)@;&CsjJ=;s{Q+(VY^9r(SyF}6g3Psw z?csf4zCB@I0_TO4)2;ecUXlh^f|`+%!SnJawd-Y;^>sVz4%EqY(*}||gy$$ZB_ooO z(%j*Pue^NPiD`Ur8k)(QJQj>|x*d=Fy(rk1Y7ljD`h`Rdbv2O+U2Ot-kNd*M3>t=$z!po|a$PS(YZ7GTWAJ z&6&SzUhz+-UbVP-dGce2FW)z75?30hUDA;5ESOg5)-Rt`^8EK=Wzil*-k@pewLLXe za~lIUHLu)Ky+~p1ip8A^SI~3agXfwF+3E+n^XVaZ4sa;BRC6>c*qiBi8s#$Y2+faS5n)|ES zNHsfAeWsdw^P-uqL@6Of4MjQS!&eaSK?PZLz|`Q|c#aZTzv8OsGUm!cwtEhFKq$+Z zEMX?I$y`Z!HHpF)Kf&FlWX3k__+}+19pVZ2JJ}HUjVTr1y5{vC|0ttrMO()eo%#8l z>)NNT(EU7n_!o;V^VOASE0&Tekpku8*rG|bDPGT-#j%fKzuz#py1cCK;j6cNhQw~pA+@@QDfjh;B-I< z1bnUlB*TDqN;{*Wh?h$vK{246zz(yfsZoc=UxaYkc#Ipk%tb@uV|V3sp^a%2lxrBa z2z7(FN5sYo{0Ai-;UkibSW>#)KXb({=W)xF)rT(K`PBM~+?Iu_H#IEz`fA<&oMTh} z%+-22&t7)_#-=sv5~f{yN&Wo0UcdT^Z(ldBGPPpCwpPdDwUw)dEtE_1aj)m%e6d4c zFfV&mHeXz^wu0BQPR4~sYEirjO^u4l>@jaM-)L5n+Vx`TK;k*1d{z$xI{YSP`X?qx zNtA4%sOFOLqO!pR#0P>2;*rNRmPYNL%ks$M#oex~3QuZf6@mrg)=-gtZ#`_F*!^K!jxan4$V&re!AiIdTkYn>KLdWY`MWCxMo zQZSGQPH;1KdBKT-Qw4GXiJ2sb8N6>PnwO^rq8=B$d7*8QOhGUgDiSC}rKL+cLokZ^?tW`epX4e&wTCR>xNmDXui z#g1seGx}OUq4=CG=5TpktX+l4H<9}@Lz&%~%QJUo9>_eBX?A8dWAn+(7c)<1p35{h zF2@!(j>(z&{N6~WUJ#5>H2R86`AI<}>zT}nR(MhrVOVn1YjUy_Xobjmp-?4A24FzZ z$`aCnQW)tAtbs|5v~vIn8U7N#LIkD6PuT?DuFL< zSlht!g7dr2_%4R$rh)@8EBAFsUQZaj@f9hY~&A!A^9r?hZE4G1$SK9ia|>s^dIuF|Ej% zT^segoGsB5k0n}dV)+(aXc$3 z%r1z;r(p$46QNo_wqBgD#&ee)?9(0JPu$TP?rqQK$&K?iL{{Gc9pcja)^Gk!83vca zAEj}2IygDHx~A>27QbI#*;=!Dc13JKe#gowzOJ6^uB+!iQPkCt)3*Qhn{GID+syt; zy-l@+GURS&!IwY%!yo0BH$K=`UcUOl4O@?_EH3N)2G|k&_;s+vUm=6Cq${42G(6E< zgrwTqb!0CdNf<%)V$Oh+b0X(d&Y2wLL=JQ2umQvoi}@TFN*QVGC%gc~a(T7;Iwd!7RkWliKI@ zHm%t^GxPiI@`dgC>dwNUAt*#l-c>uZBDHSSEpvxM{E4FgukISYL47TDeb&^v z0yFN312_TEhPWrn1>3CKWpg_gkQ7@cYYO$eI3+ED_%@5-P&;j5$1Eo-{D_5ZAlv}I z@WGw8FdP8l+X>yBofqjAK0MWlsyuVBs>13G;*`vsqnaYAEM(54411AChI`pJG&H0J z9((K`XOxC7UZ&^GM}CQQmeIFVR;k|wTZ$`UF4SxhS!qv6zyM8gr36y+6vdp9lIA_= zWzEL( zC?cAVGCa0RGFe{^S!Gyp5MgX9)|jkWTw6#1fvs?^ZHw)YO{R|_+uOFYwohy(1Wp@v zg?{L5HnZGra2=8lHN|glwsZPeZXdBL2pkieJMC({U7s^Qvcf)K9~9xb>S?mp8ov?8 z>w=+Dj~_f^KX12~0m)%iG^Z+o7fFscHzPU|Lu?~Gv5kg~7oso=m>Wg3=JHK$BmRQq zl#w$uF-TJ`kKMj!Xo$V{R;-i#lKu6H*iQAeFE8cxSZMezAtUh2Sd$n}>-8$R{e;9$ z;Yq^PSq^9uMU&1TM3)1V=9qdykn@a^Ce-{8D=Hn#xVap%svdWcf;(}F#FLs z5d%q4xIWC&!^{$9zxXixMVR+v5p_@ax$rAt6^CbzQy7iVrTFusZCn?IgD2b-UJ|}M ztoXxBp-X%i=1+!S40Cj3Cv{-_ur18)9ihJHBkXjTp_wPCzxRbX2&oO;9cGPTmK$au z{V+UEbRV^KAk2HitSii#safU>`@`HI+7Z4v{Al?3u(Dp9?-%EudFwGh#mrURmLrRLY;av{9ahbNtcINl{m>6X7$fw=NDmlFwC~l zDaO6Y#^vZ*IChkX>6Ukd6*P1z%=n7%!SG=CL|DPq%fl=bW|E#1W?FW2w9w@>VNOqS zhU~;u70`OcL{9TK{%BB)ve@X%O)Gl*#pU=#dnX(b1QQNl=nES?ATA>sqz_}}!zcaG z4hoL?7-?4!WQa5!pZBmSkfkbVR)n_j6_cYZC5L9z)-P?zd74xK3hLx?T3y$r`i=t` za@v$=uRi;#8M#l5Qt>Cc*S4gW&bzK>_*QvNcGt9Wvl^^##Nq19m6y|JaOrKmG>sBn z$=vJb4Bu*uG5N0;V|k99{yB$yfN@Pkg~%pEAtWw|szCS##-I+uAn{IG&0N3E_&#$rp@bw7rQiIg2$WsUO& zydGqdsK!c*LM!9%KOT3YWd7r?8=uZqTtN_rnU{Uiut72 z+1OuNZ+YtgFK@r)&0DTNy0W0?vZFh$|JKUFf|am8!_E*}fcu*%Gwqx4n+{ z7jG}-H|8GB<>>SoJqa^Yr+<;3cbXTO`Hk{nFwsOy1K#D7fyo)pcFE;Jgz$NnqPdPu zVa-$6hA9W9aQ_rGGKHO(a%Kw82u8DA9;Y*1tBI=r3rho88w_X%*cv855f+NyIM;vG z11Vf~&xS2elwp#HFEpP({6BDW^x3PLH{7$V@JDHlE2mFc+g(Nmhpx*S(|GodQ-|j* z?B#*-#?06v)l?8^EJg@dWrMG(Gn5j&?e$%~_phtVUh$oqXwlhlB|Hqq`s6(LB3r7F zzNKF^FSIJe7niIp;q`&e0I#vMBUJ)L$tX8eF{vJvtk#Of)2`>(cBYUADrg$(31Q zfES82$3HJRh>Y3fPZWlU_{u^=sEgQjtUL@bLa5Yn)?#OWdE%$9Ok3R(_KL;C z<6ISH8}4hKy_&g-x-OsEwlbWV9=^1lo@O#k;T}XIWu#%2^oDB+WcR@vzo=o)`0BhF znU!6WQ+d<2!4*Z7{SRKbZg5Ry-lg9WdIIKW{xv*Dztn_Wj+Amhy`*F%_(@?fv;_f$ zrb*sHL`8ZN5?yAep~1j(8eb()ehKC7TqF?VOV1Sd*Nx#1v ze7T3^)v#hjkXJF0N@<&vK8fdcB3Ck^6Rrk7m^6r7d^xFpz}9Kiy_1l!7mU!FoD;~# ziux1ve4w7yinQ>K5 zNv7UE!@r=%RnSsCxw+V%u*jjuFr8!?+VrzWV&qLoY2&TBv(;EX5>6C zR)fg*g%zvN!TKGP$SNbVrr%Dma`MeckP5(ryiU1RxgUZ43VtO-)_Zm$MkT@SkzMT; z?SK)u7eMHqVpa#zn9~$ZAQ&%;Gbt`u0mne5OqxG{F_kLd*a%t)q6In4!irT*28-It zlu9_$3^OnOAJ^@vzWV1suWa^B&eUx7Px+g>|Ni&g!}De}YbN6!_JTh?1ja|6 zv|VpIEHhtLaaKc?>~*y3A=?2Pf6>Mc*pApnY_hFjfVH2_J(tU+Tvu*6Uaz9%9y2UZ z#|q9D@R0(xAwDPCX-$LkN`L$^byft($mLLapIX&7la_<9TNQIs3F148veUE z5Xls?M<;x~`OC*IobZE753b_BqIZQAviv#j)5VwQwZhH_S6GeIF7X>tbAvZHr#m?S z!up-to%@^uae?0nOa5y4D)}ZEp>yy(Vhw#>Z^DL%NOZc8b-TmG6_m#iACzRW2WciJ zU2nUz_grlJx0>!^3Xrv3G8}>D^${Bf+Ium#C8j5ekFLZeNc_Gp@zuol619;;b~5qp zL_V0v_9Pxk5-=n|A)a5Z1 zMyxLp#v*p06^dgSO{2mUHj0tBY$L^mQiK(gq)q-3|rlmw)=&t3$# z>YnD-W;lwbHhcI>VhoN9Bi7_K@Mf|6Jw5l2sjQ)BdJ(^-Xn)bYMRK*P&BeF62(nJD z$!yQ$H3H!1yzT)b)@O8P@Or=i5PJ${CXh_s0+5~>dpl55=~pFw35I7b+H!Ov`3Rw) z?g)ZCGc(Lg$|=lY3v-yqoRdT0nnlH~Vv^~dp^8XnF{>(O`Niz>V)kCm3yL&dzWcv~^A7pEkPNPn%^4!Mz)IxUb_ke}<s3~s zVP)4SEJ;|jJ9Y@gZW zlQu@#m&a}L9vd^+@@?(5KHH5p+V?UjESiWOO!JRM585m;vmj^*8GR5;1NxTJe~tjc z1>uhKMYv^+2zvC0m`o9k{-&K_Rs9qNbsn-GwafpC_-CKl*;zY#M}&bM7h#+xh`;&3 z$UJO+*#5Hp9T>SRhp|Bt@r3^TGbbW@=&F78ZFafU&hlXf_`~LN7o2r|WJL*OYq=<66Gxg}QpYH%4Eyd+hJpIf&-}(~VPCKeNjx zsR8OuyIra66a5i(I??}{@YG1Xon_l$M1;wKBZTyX06dU~D1h}KEUNOB(KuK{eO8H3 zR&i=JGQS5!9H`44wQqod^`PAZyQ*SF!klJuO31#5XTBpqO~j3ijuuRoqJ#>Kq|trj z6XwOcFg}cdIdR~PpICyihe=dqW1=x*LKQU$L}(~1MOZb*vzm2{3 z65AEK?Ptuv5?+bjhKQ#h##(uhJ7P=Nw}w9%e$&uzRruh(#JC7ZQWgPI#I5Hw2u`a^ z^7tu=6A2WdRBG=mOk$8uT{EZb55MKIs?u$E~jQrvcCPo$_LgrDrP8y+jf;G z)x+OSFI`+3vDjLovnTPjxEO<;$J=>UhxvV9s#Sf9Y13Ec^&6V4?lA#AKqkl{f}`!q!= z8I96|y^$>GfNucL31HsWDg3g8oR!sLm0e9CA5}GtECmq7!nH!!#1uq>U7WRCHZ?o5 zHdv$QctSawW07!M9ASM zoJz#a_%o6^aF~Q2(PPzZc;{f^OoE^0nTKPu%-8?d4QM;g%Qp#LUiq9<2wx4jIgPZW zT5xo7FyPBS@3f%K#0mKnOpunqry>7(KX>}O{iprs{7MKL>;1CdpHlj1Fg+P8JsQI? z%Ff{C;fe}_o0EXHO(7e#)mSjQtMUcxHU)xV4V@yK?hbxz!c1`;pp%yT*KT>S^3Gbi`A75;mmtK>CJs zIXwX5M%v>#LO)Inq*BO zj&qI?huNW{HHU;a<&7VoEb;xeqy(Q7)g<653C{xWh(Xi?eH?D}Y6B=abrPYIBh6iw zXSChcxocs5%appziakAr(V1O&DHWBKsck!|0*&ETUKI3|CZq;Z4&;~FlYMs0>Ch^Q z?@XPPq~QT@>F=@U*t3xH@U!zIeJ@`k%MYu^!NQ08P0yJ)1@7{C1XWN4x8tUlO}x{z z$kcC=J(RLyF)^!&a(yYkS7|4=YQ2SjF0y+2k-+;Mi=0n8*=r)*7uma=BC!{hv)FT# z5`3eD!5K@QTa`*3`h=g315B=VXp9t*$!xaDQbJC@HZ z3aEA6amV3EAEgIBY&jmMPTO}dLbc*T6HP-Qw_OR3;K@hBd7T#%bOOC4BtV^F^f#q>Gp^# z59lsbjC&i^=svN?bPUDizzg9~3 zU8o_oPxmi$ta0!K$*YsOFN39kV`S#FdL%NG$^{*$+;T#%gNxVgZ=Wt}w?3hxFlA4CK~s+{m|GTR^z$UKFj#bhaJu}Y!e3PAtL=HDXFo{D*4giyR6 zY^<0aH&&7eftH0oX2kuW1{cW@Ax}o@bBO>Ih!Z}SV*j+th1buycKyA}OQx>BJ$mh| ztLN7wjK=<@>-{VRp?^(VmNsdRJYrpT=T9~s{^jmw^L_VewezlMHUa?qDL|0qWCLcv zDDVj?fb1}*J(bn)cFt20^Af8Q)T>`dx5EjO(Pyky0C z39^UNM>$H3Y(UMCV?fx#;3U`l3F!=Cf9cujj>L$RZ|li%I{c6xveVJ*7#Ag{9h&CQ z^NJ%5fJH|fj-Y?DFWGDkZt+xXtGKa3t}p?r96;?zWTFQ~vL6U90xuexMF>?U@DK^O zR7CA!B1j|$rvXh0O*0E(2jNgi5x@hDhf+fSgsK71I#HK}z!qzjsHJ|<=4r$2i{}5} z2j!RDy}EtJWgUr6SPQCKayM!#0+NB*SNyXF3g`CJhVIv9Nn}S*tmLfxbZ7NDjr63MB)r?9~q^_F_YRgz{+@UiX^1QDouXoL5 zH9I>yuCKXt&5FE|V194ks+#LNA_GQZ~v;iqT>Ai{ysF-&^IF(oYB{S@6ys4eG(gqfk(Gtta^aecjH~s zwNXSzG`%7_ca2i|p)inQcALVvi&|2`yGHDvd}91fM^c0B^ArFa~6GFxQ9i&qQF(7!76mO^n^{*|f0CpcnHa%kcW5jLv2e%`# zcnDoz@`;|Ma?hcgB9jLObuhj{k6YJHH8U zbWDc@dc|+`RN4HfB#M(Foa`OT2bfgkm&D{C^jIN#g&u23wD4c!=fKm@V-1l^dMqXj z{t)v0De&xIeDV=`tPtlU%z-U|*fep5&|?J@giMo8u0fAWpw{hq9;98ToHP# zIA7?o#)Zy`KF0M}TmS$Rf<)-CM$J=>DaF`FdMr`~jZ0DyROq6l$5LfgK_c|nIJMAY zsS>GiF6ptTU&_T~X6zGsER`v35+p*8wXhYI4PrJ_jPScb%Nfi0c&D(&p7>NTRELhn3QGVk(vytL-%= zCV9@{&5L(0mbXXuMfv(DTO4JjQMLtM6JFzLck$v*mRHR3N?8f!L7Ay2yuj7mlw59` zkv@YvI=iwvYY%p@uG+5JS?!rEX{Jt9P3s(-g(^FNS^BJlvy@r%{(%BU-+E$-FEXpN zGZT8plSGFaWHe}no zJ4*GkfWuYRxpqeBg3eldN~PXY*|~L2FkN3W(_cF+&z@M=5~_(*=DM6^o&D2G=X6v% z9c6m7{O0?syj80FgfCWii1^hXKPB%K3j?^!#bmx4 zu$Pi~ucBjzqQm5@F!eSGx#Xo(BRO5+^}`DLP+{*W>=lJQsywgodlYu7f+UTBV0k26 zDN#6T%zdbQq3{=h_kUWEA63{9h3!yoR`_~_Em2svNKVHpOyQtyRtSGuQFMt zpBM$s)QB(tC!`K>$CTPvrY?A8#_So+sXM1~=Ttww4op2Vb!4hZn!%(Qt{EF<49qw< zi?PX`*j#wa5E27~ zxiSUnCK62ysA24IjK*##dGRTKLPp92HOj%&pH^M6`@!dWFMDoq?aZt02o)k)K*NXB*_D4>rJI^=^?{ z_NtyzT4;4g%IHHbgg4HdW^+VPujD^;a>%7tvVwxZ??bk?>sXzTVBqzGb*#5;OWmG2 zIaKz=`+=Rrlma)D!Vkvr2nn#8=O3h{`y7H(&rY5GK1QIu|PnACx*) zc~&YeCdD}lK9t;NeZPZ!0g)IKXuPa~Dxxf_L`fpZqLO7;Cw%Bq~dvFWLlg1Ve(J(fGoC0*+}TCbQ{oRO2@ zu_P6Hit6)|xst!9vOHQJ*k3fgHqgLt&a9hV)wZ-QjVV*grsOypXIMkCn{o()EB0DL zg$j^c%~JsDT>JX$+K#*yh1)W#O6po@&YC0Lss!Z6ut0E28}+$s69`yYUTe9=vfqO0 zSyTl`UMmsIz3l$T`Jv;Z<<^}jIw9+nK<>xV!~BuyL-nI$jH-(V*a|j))JuzWF2N~> zd!N=U;-LYdV`t8{F zSkJBOie|RiAG;-XTjqpKsM5Vumy-V-lYXV1begjO(yP_)o}tJ@hWJDw9xbrANc?e0 zej3#=vC_j@6(wK^^gWLhKR2q1Jt6;L2xTXSUxHeDfedPvBGUP1lyGu5H!L@hvFZ|= zEAmwWC`@+QuaY^YHcuO`Y-(z2ZmT|7qn~VSM97D$rn#p1UkRWo69rI3MNL!HD{Yom zZ!2$orPf*Fui056pRQ$6t*drJtz6SqTiaG6UnF=$aa%|eur8Efgiu{5dQjdN{7Xj& zhmTm7gpU9u#!~)&6hKTy77*b1JhU81LLu)G<_2T`zsa50?4LcjlU08Gt~K+1dt`af zcaKNs{=bNr*!Nj9c1&)*etqALq}W3|+7^kuH4n?Hk#p)}%C#mdMzLcEb!u;kC(L4a z;%zI}ez94(RekIdV_v;RUdo@vd_y>*Q=gOENJcm8bAQsauwhQahfE*Ik4cjrldM$4 zOt$7csd}GuQneK<-;g>+i#Jg!+K6U^9X-CVy*QwgKU+Ghzp-)6tg^CMYZ@E-XO&)& zUfzXpOdJO5W7T85xtO=H<0a&di*QVT*B# zPbF9R333*k(mcJ|{yT-;f`}^a_?3Bzw7I4_kCjX8F{)pwY@Vg-1 zgnCZ`nenk*3qqHW|a)sSrT{xw!y(Iy*myE2& z?y{~clewB#(?-uKg4FW!B0s%W&udrMHGDtk1F$;k2XK@O*V0#Ksh7ml)R!eyCqZe9 zy!%G%xbnSZ=Fg1%1!vxZ80RZsb1ndW;PgyF>fWDsZysNlcWoZeqe{~rkG);@cPFr& z2?tJvl0saA7>C*MOD=mOW?xl}*-+Uhz@E~}jfOb5iH(?{q{Sb z?vTX%RLo($#5L(0hEI~0ILYf(Q*E~dP&Z%&JYD3M!$W|i#?T0rypEgxE$l>_$aq-^ z<&NB+c!{c5OTrB<3LTNeC}!r`N|@c)A11Y|=}Ip3PR=W;%W;Myj!Z|(lbhC_;+4;IbXN`>V3nR z@tSw((5c^oPVIzc^M>anJLWS~^MF<5j9!8bC4di3AJQKbSFWoHSij04*N}+J{KTaW z2pDiC%EaU&4bkQMgGu*fMNH@N*oM4;JRZtp{<9LGuA+##ms8H#;!3i}8irPkw+x+_ z>chn6Lr5Qi$v|e_f0_;7I`-rv-z!yyQ!; z$_q~j0)yz$Dz8V84-p1B{ZbRB6{~c|Fu!>vnWFaK2T-a8nZnH(W zliFh?Mtk^-x7jKBbu0BqwqtY`7(H^Eq|Jb^qq^uDB(?$)6g)kL8UkL9(KFE$TH(^} z*imIZWHi;mJECt8&_37X?9UNJpZHu~FLVLazPrY>-=tV077GPW^Mb>Lg;GZQ^7Ng6 z^VT!r_9V9<0KU_c+9moe(QlMccSi!acA$hMWmyXEFLF*3)ht21GoNq=EKm!G0r+Pr;SEy{M%De!l<1oeB%r>*+qWUck?v>rL z;8nJ_LS}_!Y__zXc7{9Re7nYo{xE+i) zl)V9fBzX^v|B>CVqBffR%J6Sq{uzHld2ZOkpC4|M17Bv{#ay2Bv_$?c`<+oAEnbI7 z`Kz2$(NLMM#wx|LUlW@}b-(aj@`)Fut62=s(smrsriDJ2cuj)t5zHJh!83(%o@oYM z$`DIX^MMib-66Y6vW~u0@XW>Z_cMe=(mNF=6ec*wsVB5gJY%%~0K3X)-!9reHW|;vP)=K4e|t4is^P9}lUT z#7FNy^y%vmA~h4}?}uHK?to5cQ_SPkBO@aSZ{urB)PJMx2e5-^RnSUSWg;!*KJY5R zzXt7*UkmO9bQE=+Ar(aQBhI}Xd4fjGF_)AjZP44cTG^7o%>ll|f3u%2PTrr)mn1Q( z-{?@N4jfy+D@ANdB$=_V(N0Zq)DHIeaUd4V(!O$ z53SOu6eK2=c&bkl)?#E2OiAWYA+y{$d6X|0=RnxL9rwm7kQwF3?p5xJS0XzcTWeG! zle72=QHV?wCF3_ms32La{@z$3)g&|Cr5X_99}#AXo(lR7g2{p zyqAhNFCG`X!V87``j4Tapj8?@1MOc-e?QMN+7~C}6_$)si}!BO)4MdEnchGx}%hVsrNf{Xm78_^8d4TXS z-dFta9owW`RA*Pf*CAu_Pw=UGA~r&PRi2E^iG1_IN4`k5% zNl(Sb+savm4=E>=w-q^nB|RjW8Kq}8lAZE?_ zq9D`q*xW3p`cizWeDckyOaKP2^RUGp*6(801YZJ$uLz{M%QQAmW9b!3D)^?78%p@x z5|*4lH=obTW4HL(bpK*3`ejrVP3cXMZRT|IC;K-1$dCt1uk2zHy?JgExtWIz5@weTw3fxJ&}WMdBn{mx62(s zZ4t%ov6)B9)|fTVa#PB3n+g9A3?ORMh)I}Sg<>5ESfcn!0}LPxZ;*&s8BMHF)5Mj( zG;Tk>14U|HWVcVKQZsvdcRoM8@W|C2v400x^OW`XUv}f2!zY5>VjYDsj=b;#@a0aE z-q8==S;_V`-`ULfhVBgUy=8Zn@og<^TOFI@+wHr^V2{yVcz2WT_+tiK7C+O4JcH_#Xx@T3wSlf@TiG z01V?VRSy>P2goMc#f-HsP^l>N55XhC-833RB2ux9*c>=msXVZv94K1wwM(LhYPomX z^jUdJSJw0_@2Sa}+%P#St9fyK>*bvVL(Nw|ab@3q{nc5O4V787vzO1VWd&0=&ztN` zJL>Qz+2(iG&1|agT-jOK*-&29T$0yR>dTpV&B8C?CD``(hMKbI6;0vAZPlUjjQqxW zecmRp5oEN$AXLwSS6hki@J@b+1JIGDx=BaAb7)$-oIA>SUqQcx%{BN`oM4;UHcmaE z{kKNj2mCga0BV1lX#d1eWa{`CW9|QFjDEKC>BRn=8R}Z}74$ns>47BkA?Rt2!41$H z^NXSOR^yDZu_o@>w0ZO#=*U|9oDSohpAXH5_bNUw$(m2cs;ycp%tON*1ytU^|wUc64|NLf6|AjYdt? z&yGB+m$*Bt=S1sV%{^IJ(<=^$bhBWvAX?#aPmg*$rl|8AN}Z5R#A)O`gH;V{E=IM` z!0`(eP02D%&bEo!&vcmV)}mUmVeB<*z40a7G6qv7Iob%ZFCgPX*dUZqha3V23|vSN zSv84gvOKdx9W9BSXG{)e`R6RV{fb#*_-?Tm`!c8Z?OXQk@8nNga{1ON=Y91H!!--_ z0`m{84gE(p3_Lcu`Fm>#|Lx1@PYQcxz-r&SZ1Ju+h5R$ZgIm#413WnQ?60k?9R-AA zmCHJcA3NN!ZdPRgsXZ6MNVd04ZxK*&eubG5{gs`S3oa!X$&&_h9Pwdn7U3d-N1zOg z^+E!81nY&u^1>w4LW3wC`uRE{7j_Z!Zv`O)_`=v z-29?(>Iv=B_z~@6{LpwH`U22v!ThhJr}1F)r(gOn(2F%AE`T*-aiMWWoU=&=Sg~Gs zO5DTWa1SPF+MuysaMOzCrGH*8+=K}zG=Y8#mPlf~fD@W8S}(i>+J2S#FWP2Z*df*n zpyd~>7cdHWwMuK!E6!EBTw|cOU9V{Fy)>rY+q!a-JNG=d{_^8Db_LSsA8XsY>5|e}h^+MQ*|2o_v7evbZo1~= z{^{(~OZF`emM-15{I?m&CLT66?IQ4|~iKj&S7!&8?^tr?+MLAzd zPyILOXG{NgLi_e$!&lN19~%Adm;M2IF^13~jG=-&1H!I7P^$LOppU|~~fP7XSSEVPqQSX^E74GxjE&JFtj1TY( zDdv#FA})^Nc~~|13Gw~AM~0u5|1kW6N8}ftc_#MI?YGBvKJyI4_5??Mtqdtk5i^=C zl>+N>+19MRS$u2y-gJIV{{DP^O>lpZA9gX+o|~z%))dxdW$F1jK-qDozLCn0q&}HC zk}9W$268%Jv^8Qu^@Q^YsyX3cXfSj>B%cYf(;>JT0wErv!Qir|MDl!-ilT`QK=GIf z_!I>IjfDk80T^gZqbie_P7Gcb-a`S+BbE~=PAQO3g)iWOwZ!OBLRt8azg~L(l-_SY zTU5;cxcdJ3CEtF$xZp<#wpeDq0oF78bQ=48-kPZd;9~&ylviwdr}g+2US3w(|4Q3) zSG8Ud9RB6x0wDKXf5SXJxilA8KE&HM1Bc>of>#%s4E^ULylYrXh_#;``3UkmH)(?W zzLs5WbdK* z0cZT@P;sGg#+W`Mat*~jEEVHz3rmmpDS(UA1ajQ|(L2C?F6}4WBIw_QzjK8?qpxaP z74OgAj-lpVHsz>>nZ= zBGVZ9&;{s3{GE%jh=56HfE~w?hpxK-nn?cHML9L=3-w>4 z{r?B0Sy^Uto?#1L5SvHX9UW>O68x_kh8#UgJ z(&KrceHw3~eT=u!b#xKhx0a16Z=>`^`+pm4pLO$WmN(Y_g2Ljj?Ehv`UAbt zU06I(FTA+l-x%vRJ(v9A@~>=nyx%jVcSfHh`t2$%zv#IEbzdM12kZuMRNhuX_VtAlX;AS_6*?}<3`sqnM zX{Z)_4#jeTN3S9As5VL^4sji-tWX!bUgO=p^6HN zB~JHej^wX+4m943e$J5oBIx7mw%AZ%+4z${e^*1!4T|xG zFjmO92S$B^EQIl#T~#LKjL)&47Z}_^4ow&Du}k_7v`=yzHU=)uX!jLeKyS29@6l-g zA@-R;&&tq#L1p7twomWTXn&Rjf3|49o!akO@RjY;dlc#OFejRpJ8e<(3NttJ<$5X`Og)7d zyi_~VhR7v~{5}$G9~0If6+yzPkyK_;>d8p+6!-zyCB7$@!xse`ECIwD0sbW3s7Q&@ zH_TqV_ud!z$Pezh=Lf@#-#WZmVfTK3zk9zJkxSox8y+z$Js-&MBI)pRk{RxhsT2|h z580IB^lq__2}`C8tW{VO`jJ=JZ zEG93i9fd1jz;7IbEB~%?oP_lufmjY7=Chd8_6k21=5F{$2j37QNBBFrJ$<4N)1Vb= zU&DSedz2Ql@y`@Q zGKM_Kh{zhhGR88KUc$#V%4cW$5Zl(SK&3`~ULaIdjbanZe-zjYweO#e07C+35OENQ zJ?bI#s4D9!8z&`viBDAdpvtzWdk_*92YT@Q_+;dafj)k@-b8jB7SCCd&H&!;G2ezrLNHco)Eu^OOY^yvXwlJmT|edL*=^4 zxC@sqSLGMgH&h+~w1$CDVMl5bK}=v^7{H#$$HU57lnq7ZIDtkWKo{jED213d3?K=z zH;DuB6e1iQN0vbNoBO4qIDS6f>31>jb&8m$;K!27ES0kN1yAgQJO{2j$#S(?dS z#yg#)C(3-i#>zG3LbxE<2(Q__th$=Qo~lW=3_w4BUC4FJCt@D0jmz~^@W=}p0H++E z7qKY02N*3O^)1NhOm;~39?pC?li!{3NCuY^3Ccf_p!|=fFi{F=GNOS~zVNX|AM=sL zJQv^2_5>i<0$?~dp*2AxoPWfx1pMVxa{i!y(0|5%-mi4~0m8`!pY*@ze*>Ty)Ji>24bJ)5G5-nwDZjkj z&jLu5_lNw={sV%_gcH_-;FO;=V+(ta_@6}EsyKTU@-|QV8C~F*U#7FV{m9p1VZXrs z_Ye3F;(+4x`~7?b4GZjlKSMw8YXc6`RnMR?KTG?%o^i-G;PE(pAz!m^r|+Ck_1T?3 z(h)`QVA~J*T*H8^AQR2Ms0koY2PpW?KqFZ`S{4Ao6A0{Dwh@)gA+(WIYc&_U+_FWn*Hy9C{bV{~A^{g5d# zOTe1yL3SEm{{8 zDse$=gVip!rO?*eTH8wd*w(hMm8Y-m(+U~h@9*3RTkZ4wpU>z0yq`DXIdkuvIrrXk z&-tC-`uz>|n+;mO=<{y)8IKk3LhEzS<-{Ai+;1A%_r$xUd%dQ={Q&-wNDgHHblyJH zA)M3b{o+0s3mQXx8u@;f3GQx`>U64#(&AM8eiUwZ3whL@bh$*WTAlE$6^@cNiM_@m zS1(WQm*VeB?gMhoPX~9A9N%s*B?e2-Il703uHFOMjYd0~V{BUgl^u;qh?%G7l5El) zYUz5UL=njV`%E&@0d7Uyf{|@SGFKi;(mOTpS5@wSOYAx1v^C0BxDcO2%$;y04&sA> z!QfBHG$k9e+4N?ax9f!$9ZADy<_2o8_P{%83gVTkR<0uBvtD@1!G#$!CyOtNU*_Mv zw0`g20VM2G9*%nt@zC_gr}K9QpW2Hx0jUrBKIP?DsOIO$EC8rGL+Ps-a{vh!}ROJFWzA0@h?^}mN*LVH0kF7*e!TJN}zov{7= zRmhy8U(gk-7@8YWes-cuF*mU85;BU`-{Wi#+F{+%?Y?&Ti++FV)jOts#r=}Zso7B` zKt>Vm>2}F0B)9159fRkCha#{_$Y*)-t=N0H`EobfGwCVp$rbvCfv)kS>O4@%9yUH@ zYe!^}j!N=Y93wGUkJKH6&j}Yip0@mA}<83e0Mdgq?sa-M{upc*+VLQ;W z-QhiBGa+yi1ifJn2zX@(2&DBT%hphuCSXPVn;Z<3bO2k2{KD{#Ne#j7tOa%IO?kGQ z$=x&OePw+!rZ6&z0x6K`(r??mf5xV-bycR#c+?xrtx8*6II8yc{q1b@(gU{^)i2&L z@zNGuW7eG51i!zbsVQ}2XLF9a~~V;jrKULf0AWH|Ik_eA<%0!>ndutof|h94n2JE#Yi)kFWemH)=EpHke>Xm@ z-zlYmo;;`CvCYO70)pMjW|Xj5`D_|xjnx%DRKmV%Um*#$@`0!P(!3E}W12#5EF z{E8#JIDJyO+>qX$-kp9p{cQSY>4tPQoZXV{R3Zvj3TFeg%wY}#*{{2trL+fwKBYa) z?Qi$Vx$O>JxLvOW!za946L>c;AcDaV9$gfndeyT}SepeNW#$zxJ}5}9dRk|}vBOow z(}yDB6GMXh#RUy?6Vj>2sC z&x|M@(J(^ZJ%WvB?s26xN@HQtkL0r4va!ihTVtcXp)KlMlh&8UH@bGXc$&*w*p}+7 zZu9z)u@JFMJ+zHc>Ow@N3wN1>`xjN@Cj;V!#ajdWz3>4;FyIvhG^iXo$)y1&AQ8}z zEkJ}2>V>2ck*kg{Ln}K0F)-u|qbs^D*WtErk8F5%+sc=_8wdZ&lGl#;?j6GKr6GUf z^2VlBlM9O{FRe#COg4ULD#Y1y=Ef*(2@9~~ug#k(++1>Q$X@cBD}FAthbaKEJI)%v?) z_t5V5+5TwGb@vM`Bmbe$!-{^{1f0MQO*i}6<%|94xi{SJT+o4k7z@#VmG*q>Ppnlu zpNdU=wmRkpS|jpYi1C<_XkU{UkKwq)+~IXM&@!$6&`|$uJX^)aivCBTe|NL`rTr7n zAo_sX@y8uTyK55KX0@az8&`dID$?_^J-J^3xQ40SEuOAUA&X*@imTmFapogicpnjbVCQmuN!{TAVV`@!SnAR=Q7CXxYM zP2$bR`>iIOAtCF9F+Y&=0=&?jrI;TQtnU1e>g5delTTVQ)IaccU@!Q{` z_|>maeDDE^pZ^@i&whsD{r6G)^rt9({9_b9{2_`nXHb0q`zXHmJrv*h4vKf)LGkw6 zD8Bhk6sJ$47#KkDjc=ehbqd96uc3JPWfcAWC{CV4@zP5uUVIV73ooE}?l~0CK8xa+ zXHb0gt0=zm6%o+6o(I^c>Hk`k3ELs&><9$K8oVuhf(a^i(=0n6c0Uw;=u<| z?B0#yfd^3Be}9Yms|!^N`8SQe4+&)4p{iCE;6>sfCrL1dPI@s!5UmUzS)Bppnpq z==#N4#2Nvuew;<|1*n-x$Qu{?%}#B-By4fO`;lEjcExHD^79WMKfAt0y!3tjLr+75 zlxclKesxHlYQ5$(E+-+**o>&P`*v3d;?#++=2r0MOu&^%!m|H_6`O zbvSHF@(N=&3>(2zqs*Fpu3cJ+v+Mx48} zoH*a*x_?j_oGnO;!@|9+gfipA&-LQ{ins(}m%t{4_jQErP0(5jWRNmSZ-_J4LOFDV zZQ^EX55K&>C)$%hX)7Li)w4*a-7_|P0uh;sYDE#a& z--hH>qy@OvH%jZD_$U!GB7AC^&szV3{RP$k+P~0SY4_j8 z2Bhy3U(Xrs{!GeDJi(A(9>!EWgYfm%uF=MzsnLE@0O5qOlEgDy^Be6sNPf_s;|ccI z&~HQl$K+7Pwb2`5Y;hf3n&1Pp>r7?D=ZJg5({Q#RyI6acYp)ZZj&Mqn@3rTd%p>?s zE_6%r+g{Ge@%ggKi30k3Eu!{%Mg0;e7116nTY5g&(e=98D`PmBW36j;^xwihZnr1w zITLtX^0xIU#W5~!L#=1n%j=}!QVn@*s=LX%wAo#)`2)-#M=GJ&I7x8X}VQLZQ zR9fK3zuF!?hZMg;eAx)Cf1xu$dvk&|Ig+kMu;9Km-z(y4gzpvjnpbc?#3w|FPsom3 z>$8UTTK^PNqxFB7Ekb)Sz6g-PySG`i{;wI|QJ|M!5xnh4aZiWXk;FCVrpB2;7KWZc zj3u-<@+;yU&ZYLyCt-}mJ(+P&bImsCniw41lh!}Y6VX3(gPRieF6v)0!;kVy`X_z0 z=pXj6LG*8hUde1tbS>^f>zBq-^b0zV`Jvqh`gK{6ap+6>rLoldogf`Tdm4N3u0HR# zy05u&p%3RS2B0ak_~aN|U}T+MtCMM^@7gSnFG z+{fzsug`L>>%T6&IUWmp!D;ZWZ|h%#L1V9a`xXP+;NI@$I~+_)^dtA$*mPT`ZLP?e zk!@tzCYJ6m^RM!6_Un8uatfDI-ZOn{`rIV9ksofhsmj!Bl1*kr;M-gt+0+ij7q?rH zL)qoB$&($y?%?sD9JEQmo6}G&u&=Ew4?v?|jy-_1I72}|LK4(s92~6Nm?39)GOEj~ z>*4O`56DMd_2F<)G?*0nN%BwQ{qaXr9#O2hW0y^iOv!*|((K7q3%B)t@e_Sv@1u1K zClmmC7*kk_V>i|#LOTaDVhqbv-5b>HDqkovBg!)j3k@8e2cM{~0>i@-L}7Kp2LbcX znw?~hm~tYMK>gWz+2Ja7@!g0KlOhs#NQdF-Rqt}uOR~YD zk3`JI9Yz*2E-`K}%0}AgOAIo3F&moNnoczFlBSNP-A$*PE;Q+jn^>QjO*eO%*8;!E zQeR(qe;0sfx!+&YtsYj7s{^V|CEyU%l$4X5ZPr^OGBWrfai0XlIHM7m(d8K0xxnPW z##?@d%p2pW3 zvq#@tR(A8~?8lvo-@&*&pg8)uqt};NnyQp$`h1x|Uoa^ZpZ*H~I^WZG6;4WXSS~iQ z)$#jvr>w5DNri=z>eAEeCJn|j$BoF->GJAZGvn>@9m&I@9#3>wa%fnF*~B~jtoRatQbU~NqvzU~j+GXD9%+`gLEQ5L(q|vH<9TJoCJ5BeQcn`iJ({2jP%F+O4zU~3lw716qj1Shpy4hz8ZVKQDLu5@Y zo-2%^n0HsKpL}1!+^PFk!nXM@*OInMoU$Ns(moAc%cKq<+Qlg2QV-m4txw_ih)acr zu9YEIf(&8KvR8iar$wLe4;KRl%1&3K=PK8|$8Xk8g{Ez?3cynKG5Z_}I5;%TmTpI6 zK6GweLVmyG7XAQJQ==`#42bo3wBu|5D8H&dge)+iBX~%xDCD5}l#EW`hbdH=fobPA z4}QqAbnhYJ{_?LdhIi9oxR z4WE3!!x2W_zl{3{#il_&2{<-~^#l6P^e~9wfqp51IX(^jlF||r&-On;*ae2@%uv1b zDupRkh`#7I6B*LJ9+jOv>gF;!tF_AZ`Le;p(7SJg&kk|l0cnC-Z4ZL@CQ+d$1TU+r z&w-?|yj>c=lN&55!kR4J`(c@-C3ZJ6fs&G|dZY5nQQ)IOHSovJx?_+UR@g(zlgdkqyg*r_^x<}hA|#DaTeyPMOgQRMYbtA7 zjw<~M->tAjs}e<3+USa2B~y{lDd!bVE#6UNabtUxqsqsLzC1`v(W9_w3jGwrhxZOl zz#cUzGpA*5;HW?d>`?=0(U!&lD+$0&Cg2Q20`j@QdGXz8wZP_SaRh*g;P>lysRCW# zGC-Di<adpF{ z-PDv;Rc)H1_ZE!PeJ!gntG=eN{iZT}Xc#`M{ibrP7%usBUz3ydAA>4cq!sFvqh_|y z%nq2IGx1w>PwM!sGCRPZ0OnwE?lgyQJe-Rc9rGq^9K&hEk|S zG68wdaO21bN{+h^o%toav(9KfAaJJl!&GjV}pKxbgHKyVH@25_615bcp+#$w!U zfZpDGng*tUG(*@gfVpx;XoAkn1t9@nw~{VAblI$gGwT;kZ@e7;`93y!pYB8yaA@(p z;bZs{`!?=cKSkdQIXRQ~1vc&S(#xBqc_)Eh1X0xdaxkdZXQh&;oSE4oYN+@`9SmwU zL}+mgXAx059HLe&R%=VDfaeMTDQ3t&gc!(5jPVuhJ#IdUEd(M`k81thA6qCVIsd!x z66{f zr-d8}`PIB!FuK6XU& zLCkveU<>&!@+v(wmoxS72f~eiu4i;5{*wNiqT?Pl_1^6*;>I)4TcaLYKiqf1ol@Ll z;Eqi#Q}nm$IU_ejRmcuJgcETMJ4wAS#N$=G25#pp3Zjo>3Sr3wEX|9fW@Qj4h4DU8#B;4#u+JFb<^^ z1F$0gNlv0}mAIoyOg@kv^!HauGT20a1r+%wW_uR;YdIaZ2f3BRwTpXE24hTDt@-$90c;%@d0&{%4B7&*yeB){;SGOj@FbRSUIr5{4~te9J9b-O-`duyu*^Fn5U>7BAEw zf^)QE7{A0Z>|f%0n83s_tYG38hA>gjn4#6vr)xEAW8yr_W1{_(DO8_6IeD^n42zjK z52KlA2fLZ5VLB7_gbCXB64X}S`Fi#=(oIFJBE=@9K*;b>XH(zE-u!-FDlZGVfz!`4;!Y{1qIso`T1H6vmm}d zeKI#!t6?4#?O`1hbyk*EgPRcTGBUK|^mOew8rAAZM61JLtp?X2+LLoC^$!E1s9|3e zbtt6O$;ny`?gZz1P6h(nG5NF7@4&5yT61abIY}O^bRJxbs6peYR?|R;HCI=Q%zB34 zOI3kjiXi^iEtX7>a3y{GOe8ql4RFnQ_$4R)u(r)~~<04@JK5P3e_WGf%10IUB@14ND zmu47+{z*S(VAJO~;6tF0(||%w0}5>s;(Kfk zT9@!0P}GA5Q5-mc0$YXn9=nD1J$4L*`~wuVuMY(XxHz8#%B`p%x8leSx~h9_bW)euKRQ$iT9-wQ~ zWR`oNtAxyg<7c2{{1g135R@(SGtVHpuvott^3`xPSB^qsP@N638=mUc2z=Q0!~DP?Rh7>zXn^sY z4C%ndAq66_+|cxo1PZJs_L4q;QifDBz&l5?n5Lm;^<4h}i(kyp`Qk4QsohhZ@fYsb zeSXn;{~>u^?v$nylc}_MO75kji7}>_Vgtnh;}|@l?knOLqoRE;{J#yzf(cWf=I5Ho zPf;M9R5!zSbD@jP^0OHcHY1gV00p<#RqIp01X;aiqMcHU>UDEb7~2Vpb5E>(1>T@ zb`xNXFUG%k@n(U<_zcs3ZO+@Hy5HPLu#2O*zrImmG5(g1AAC6h!no{hW`!50`Hjwn zZ^r-rmF{zU+W@%O-TjmO(}BTw?ud|Aw3t6J#>1|RF~#l}$fE=^#4IuWO_=9S>3gb0 zq+HwR*x}$v()-CPP{|^zJ%S%DsNI-}+=+rwPJtT6R=8P-n-#;<>1IA>mb20+8=UO- z&c8dkGvvs3)H>uO2m7PrpHROVjXqnJtcwibDMy_w1-$et3|{kV}E4-gyx&p zREZ=*ERj%iX`OK^yhI$bJrRyOmxg?083r6$eUvmqQPKZ2*a_1T=4w_3KrVB#a|}j1 zgNcci>u-8DzR9In?N*!Jn&yaac$YVPn*lOsRz_Y{PF}{W!b=D|NX$V47vocMWxOaR z!9Xzyn3J%!>pno!AsnI7DKaxB>199&k*Ij{rH{+-|W*#&&~S zZpRO=_yUv3jQ$tXW~B%70IRE#{=Z9CbMZU6IT!DdKfd&;{+>e@Up;h)Z#i&4d#A#G z8a{*u@}I_Ffp*clk&M!$YiN~GXN;*Uq;9CZ28i4x^+b|bL?jhFEmHjg&jIg}C|4rh znZ)sxK*NFogXT3zm=@9;b?I&yGz{qO)SbVG>wM9D9la!-9Fvw}T%N!^Sfw}Bd!Lor zV#-F`hqSx$Uei$%pJ}?y#2>Lz>?B3h{GlV4{E&oD>;1%2>hM$sE~!Wj$p2|dl|5Ot(ab9Dz&pe4L*(*_fOhTae27QuhK+&XW<7%(2^zY=`k6=!x?~ z0uERp^+~e$M0Peh+AH--??@&iqRTR~DzX~0`m)~1dN0fPan|Qq{74q-%i5d8JF>d6 z__QphW-*>cBke{YN;>cGe1^0Fj*ttJkGOzxiX9Xo^%z_F6Vnb84!-FC5i6rgD0hWp zf&@TyF}^UJYhwu~HrUh>@tVjl#V=0X^6u6#1I2T9%o%=ac>B)Tg#(RS-|d^qo}c!> z*B7y~@xr!k3u@%nORv@}*w)5=5-(l!^#`WKr;9Oz$C3Uk*hg!m->9=YGg+sfJyyzg zm9kPNOs9_}v0Z?oq>pRlKABg^NV>d^^Qz(NhVwPmebv0Gn&pF5M_68ENv_%5k=vEK zJ6B%e?sgw`%en4ccQAc+TVm!lrKGhCRGzKmB{<>I&khGC1^M|Pa|FY|_TbszM?w9O zAX^bU9E5f_5-bVIreJ#=GdnyvCHnk!cb;2m2ekr?B#%C%E1>NZ+w0&vp#24_2o{-K z5y;KYi9}5a+$u6x&_C?B3D_!QRdqd#GN7gPNQ9Y)YQo?KaE5$60OKc8TJyn2{_~kw z-Ll8#=jTMn20kA=*|B3*{>U}YE?xHAnvwalc61D${5&u=nv*~Ov1N6!XZ};aZ^n~< z+OuTftJ|vpX`nlFzWnZ8ho`T3dDEy-n_gZs{qU~4%g-Ou;j60cUmaMo=TA>+HgCAw z{4cQ9k!;)vKtqh zo;7hoRV2R|o!w+$v1~qr@8j}1{(H`Acq<241;X2Y_p|PI-SP}KOLEt^d9r(!dz<^8 zZXNPheea)c_Io;?>^_Ayx^KJLEcbe}m#f??53NtR|LE3P+-yG@e%t-No4@2{N8N0n zn{9TpHEuS;z0l1^yIH2Y!p+@orgO8;MVIfm-*fY)-LJU$LvGgRX6xMSRyUjGW>xNH zH_vnfn1dSs)y>#B_jxye$IXtoPq_JBH|uh<1#X61AYM0hi?zlUtKa+B{kfZ;qpSD3 z-*L-5?%i&V8)$QPxOt0!A;#S3V(c3%J)o$$v zneImSG_>h+8*A{xJ~VyLE#nq+;^Nc+d?e8Rw43$2S>jg}_)VW%|DO9}H-AHn2!6p! z=w2M|VmCM2A53aT(5MQ!VUy%KdAz)lVscE_vjpXE*I;rJCoX(j1^GxYn8aezTG0MT z_bvXe@|yyhWa#^Z@$PCPe1QYB#s_Ux4c7b+hh@U=_xEMRA(6_BtbMeUK+ruRCG?O5 zNKX0&A3T4Cy~IwO8T=>ZF6AwQukjYSX7Cn%cs->t1-+&?txki{4Qw$@%gdsmLGVrC zBj9Ek8qr`1T<2@j3?JDgqJ2UuEPYRF&uZZu*IGN$DIyHWV_NWIOX4@ne-Z8b68#Uw za{ybCEy&DqrC-tu;L7+piE~ih-w>Alf%Q>Zi&d2u1UwyfpyvC_liXfy1fCQwLJz zR2BJ;Q&q|7PuJ}(J5qL{OztjYkutT6mk|J%$vKiqWvNabqRj%1>NbnBFoCm;AW|?< zAjJY-8(v^#p)&;l#ld8Bl^5WjAj1%izU+@2@96(50wU%v#9M(t2g>VZ@=rht<3I+4 z$szDBBrPV%NFE;=HFHJtnYTXpQB&891~1pyJptRB{-T^Ty&MQUfDSwOPHNrU z(NznkjI>(|$1ZFh-Jym*9X_uqn|WD~K|IW9np@=?-Y_byxM#AbGF{f>kG^+641T`yk$c=D(7ilaa;*ih0!#iX%o^fSqeOqBAP%;cl1M6m_kY zD_*#B;gR76S?>S%xAPxeSeY?$a#78y*~2gWGj;6bnFTG&TeGt#_sr^EnNl-zMDwD? zboTJ918YWC=hV!p1cdytPk&h)+dQRp#gyT0OZD7s@n3k-lkIsEmW&>?d~)FfDLXa{ zn^+SeuyZUU$O=ZR;eP_}At-&S*46pP`+1(9)%nKzc*vLU<4Hc2Z>_bCv&zXxu7DtpiaPdK}eW3yVGGWw)2{>y}{m&?8S$XVc{eDWxJ{2 zngfGGDRB@xJz!@?>`XY4(kp)!I#k5@RWNn;W70+<*)(56@pb8 zPyY?6mRvf$+vhiZHW1(73M1}gz*Q0ih{Rlf!f*)16`T4-_5PG%-8EW6 z7@;1>fQQt{t5bVZ`I1z&u4ro!UsA+kdaUOK9yYbW&J?63DJeF7NZ3Am@UiBl4L{IrSR_Iv_rdxoJIodKs2u2O^ znT;4Ps!8OMJ4%}-gj%;Q9Fftw zV&dekrf~eSEx$0&#zs^voK&iA>|edA|E|%k-OqN!-{QYwKb!vG>KQ4a$*UfkJ)yUw zx~jcb9w3aV_?y*hwjRD^`76CGjoq)V?mBVrEm1c0jy^n}*lR$aYoJRi-I>L<$gDE6 zDU(;HvwRcF(lhvBSzF9XNXb{^{AOQC3jT9uWEj+}k``n#IeilHGS%v6pxPMfD#wPM z4bDlWUT>}w;!p}ueFq9hPWk;ay2}!KFQsZEWn>CV4 zvq%nK?n|ha*mtWCs_$DInYLu}O&#~oDa>!_s4Aa6GQF(*zM1O=#`F~5HGXzS^)0>Q zTXrlPtyGL#6)qVbT97lgGEy{cO;c@qQ@)-Xa@85-^-CrWn=$|9v5nKm)ih^W@3rK% zH5E1$1;tvP5kD+**aex$B_Hk%z%jw$@%>Zhvt3ps34&d!`eIr3T)Ta5^d%)ZRM znMX5qJAwy;&j;n2AR87w6h0P~hoy~3n~)|isOqaaS|w*!&8XrR;8|Sklg37K%gW4Q z-y|O&0F9+BO!7H>5uXYiS6^9in?58KZ5aB@d!AgqLS>u ztd)vs3!_wXtK>5$SfPTV9eALCyqaTun|6?jP-Um zKlb#o=i%y0v{Udun8O*;f>Qu%`a~_ll+9>X+sKG=8H6FLCtz(ptwmIo0P5y~O>eSY z$YPf%i6Ij*D|S<0!UYU%iqqw=QWOAz0+TNWF@|s@Ozbo8+hW%tLS&P-rw^OA*j8L} z%@uqDzx}x+yIC)X>ZdGej%}Wn6TewE<61<6#`XEWl2Sz5PpDJ~&*0*{^gOb(1pH!> z{`+`EA!y#esV?2`dDg@C1)mNgK`Ps#XWQYcYG#`X# z61TiMxi^_NB~MT8OooEdZ{r3tOVYC>;QK@gKHC@eb^CVtKJ#7n8GI`IRD3x-5&u{u z*d>qNSCxzwQ%MfXp=Iq!%V_y1hxywg5ob!9MRICDr-=}AxSh}%rO_!MmpQOKg1%qR z`3T_bA|^u1%hH&e(Xx%E$sVjrW3&k9;uk(%`uw{3KYp_Qcvn?CzkWe$zC8FVdDz%_ zqwD9lz@s8V&TYDd|0>=a-#O=XmU5b{W$Wj@8UMqjpI7w!{OHl2-BY3ap#1Llo_OND zyEWY#@woS6KP9o^$2L>*S^Y=kYZF1DV>wB$w>#P$D=6bGJMXyQKn}!i$1aB~Ih>A& zLq2oX@sZ;*huq;{-Hx*kt~%Nr{P@thE@*GbgZ98>2Rnysy}ZG}4m*xJc$b5HTz||Ug#|O!X$DtM{0QZrym5!k+fdoGtB$UPn+dO z%wIM0X=c_;%4uf)FH9qVP$d!ilw>(#;iRaH!2RZkF?eG%3fSsUT=rQD?y*tE~hL}9f&Gv>_XLxOR zOIV%}hDR)%h(Coo(2!6qTSQ&IqVtmeB`<8F;T%!dssV8amnNK zsE7vgNEsy=9T`V5PGq1TTh!w-wAsjwynz(!2@Mj^Z-$o_52yGQp>3zF0DnZ~h2BWW z*%E0&+i^-9X)UNp4v8fOYyrrjg&hGgD+vQw20NRXl3!SpYl#>#l3OCxGh4@Gvgf~X z*5r0O^+tbk&=kM?hWxGht&7Kmjq>IsN9N?-_KQ3CDF5)f;XdDp`fB&!TiP6q-=Q;L z4d+Wzw1^e6?8*$<>aVc!iA2ia-xD)ho(DT1FgrrSn`YEZxibR&!7HyM*WEg9%z`n| zmkB7@P?T1i<}II8nWEN48dBmr^luMtYFabBxMKF*9Va;Jv0jrmvV}nY8zJm}G-KDFO~CDaq(?I;Cd77u{~%Xq9JMKeYbY zD)(F8v2u$w#ad^jFOZnP+hanqw+rfJqs5!zEB&ZJAdtE)wzc1YaiUu;AKP4_$Al8 zZVYZ5Al{}~a$&iIY0T(IGJrmoHyO0oP*XAGSFXZ3 z!5)X-5(*Nm1TF|P1?6N5rVEgaX@pG;`Z{EZrX(oxOASkQPJAxD;p?pWflZ3{Yr$0c zruo14)%){wwU;_hu^ERZ-%(h&Qp|JW7ngu0jf0SN*M_m%$MVi7rNWRG=dkHzZ0ayp z!`brDcaMGm`NKx%kLFe-RT-wpwp{Qz*4EV4VXaGBH?{6;HRvtvS!_}wHFK7$J;YW3 zPckc1(GYG11!e(Dz#@gg+e~U$(a_zntKoRVK*QOFq{H}dxj}BA4c`TTz=r&>@PlAajhO&SWLkYIif zKBuvxUY)DvBA^W-Q}10#>2Me zN~G0lMx}MFbqjDkbB(SRQ53aBIwHI%0!9_GWSiy&tY$-s(wFr(%8JXl&Db(2xjlJB z^4VlvvfZ0*^tOc^c3*BHaSshRD~8VL)3Uk5e^JZ=jv#9y6(rNr^8m3xOwD?EBqL@E znt!Bm&(LzwW2k+0rdwDyr6L$#?o7$_yy?k_cylH-Ra&hDl#L#VwbQi#a2eePz=)*B@l)1 zUXy>^r3Gy1>Kax*acljpZKG3locE7d^X&55Ufz1sTf?TVX=z%Zrlq#D%^XI13D>Rr z)&rBgS(VYWkr5!X{pF6g?i)90--o@6o?bn&vh$(2@wYRov%IypKT7j}*7qSHWB*9a z-d4?aRIy!^Y-1%`QpP$st8g?rra9y(=3C91&2qVUjF}^Q=y|mQ0TOc1Vs8n-q_-iw zJ*?Z2Cj2?LacmeMQ5CL9sccv3;na^vlNn5D=@8t;=~t1>J+-8c)m>rV>zFl~ODp%j z+(&b{*nd1E9U31o@~AOa_E$=6#ZEsY!cWT+tJhTyaBt%6F|8mIlJS$qGXapN=`Y37 zO&8e!|BXy2cmrdR%$uuj9#a}|L?&#SQ@N`B>O#zDyrp6E%6TniA#c(6<$G^woZnjI zU*pa%t&!g@0R^EY5%_P(N-1T9Fz*7gSsVnYMz3GL?v!?F4edHs1ZdyAboBg@#&3h+|+wr}7cK>+$=w9M%boujF_ue$FZ_WJt zvc*T1pZ#IQEjuvx6zJ`tH-l_EUoFe9_1btif_Y^NlgeEV*+L>ww%*Y!rAN|vdU|FS zwvTgJ>~I!yCPZT^_#1DV;ESe%GaAhBZZ;14KThMpKS=NcLly_UvkmRy#6 zm9+52__=FnO99a!`PF|zPc*_KXsWP7;CaH*O0|Bg%(gflcJL+c4Q>wSr({!}iKhqw z7Y2gEK7IrWl4uW9%4Vmz#C*Z5Gnp?$*<}RlL>U-s#2!Ew9geb)#eo=4p~a(lk6j)@ zzm__awtGQLv|av+O*KTcHG%C#-&Go(M&W-qZ-L_vG zm{NB8(`)!6gYzHSTekGMI~(`xxHB(z<<^HWSEqwc{z5ke@261Otol0BSz_-W=ZpDx zlW)3@Q(DE7AOi@OKd)BdgGEU}+@7b+!#$qhSer3(?0LND0z*rRWK?0zSBsga&F#)< z3p)!^+Vm#B0Wiu!bB>s{PZ@a%!Q2j``!AuHBo`rqMb?O=U}S*ftEtgQwT5`ffU80% z&5`JeG-|GTru)UXzSovNx9a7)#+2T6c$u%MV?@fHM-DtbZOfd}ug`32obcqsyz-Hs z?Hp@}FJ_PETehFQf8m?^Zgbz~n7C?J+fUy$@y55_n{fYk*1z?Wdv*?tr%AN-_R4dQ4_H$<@hYlV!Qnv)03Bcvz07+QXCm z5>Wp_fnYEt9KO|$M`d|npr)Xul0dFN)_Ul-{k<{jNVs9h1^ixgkCiqee`&@9AKoTI% zl0FEa05RW01L8h4Peb}d6gUgMTadM`6~2T`G6OlpPQJ-rdoE>IZho>QVoVR#M@pJU z)MY-vOmD<@vwh$AY;dt$!)8`ZsRqbUZ;~aYe&P7|2RvnP?4_U4K6P(=rhb@y1lCrM z8e8vXZYP2**L${k_Iu>@7G@EL=56NvW;xjGbLg8*lD$PCrO6SfD|9ADPxM6ed{kZ$ zWf8H;+M+$t-Oo6~O}nu~Z?JUuvXJUh)tnvQ~uko1`a)glRXU|F=; zn2_*X<#N%?O>J4P)NOie>vLOAZ>oDad(x(v&)vbot?Os=t%I9399v$=;^I$ z8+hN~hS>Vn2-AHFQw+~I6+GFW!Iw0^({$?o=(AD2KlE&f-{E8%YPZ*Na+l1{I*|2T zmfj4k%Y6R<|8su5BDIbjnQJPt71_!?W7Qth2@`jin9($lnX#aB6&V(VxD5$I5FE?{BV*<+# z-&R`LxwpM>(ZmWU=PM>I9@D1Qy= zUr;_w%`aVAd_>Cx2ir3FFMrSvC4lC?d==|K&~)(|VOs{Y`Cri)<&T49nSS+oe`dOd z!KWca4Ds4z!%pCAqaSHC-1EgTkpDyt2Ype0>sz8$%?NOVA2eYL zy>|Ie{mw+1BQa<30LmIp3T}yr9CMKt-LG8X)-lTgPdbv(zN1lsD8xa2F1oCH zbLDS8$eXccPUX$xRb_=cuVi?1TH8Il%QxP+IQoqQ8ru=0*JFF*&G+X%xS-M%DN5bw zjD}pDD?YqqgW2IS4O(@-156v{lJILcTtF~ z?^wR{3xvJ7j=A_D$1w*#lyfYHZ_irkCdC#L$Jq)V75)U_e zOzqtiHLBO!(kCG&Tej4muCuiVo$iPm9yO}F%iZHX?LOx=xZOc*=wT8ETVE`&%~uLn zeC#abWQ$TzAYxaw%_hMFh@D2Ta#0_&^h8WFBil7T+c2*IW_ra7n_A8Mfx%Tt6MIf9 zi`~C;Qp%y+rF#c9J|DmQ!i?F+nRN6wtZ3}Z-o}O7bYC>y{nGLSU8nk5%BC!?o;c~g z1vOXwwNJb-qHK0EG<|p<0>4xE@>YrCuVb=q68?^wzxMyiZw&oW{tm)(HIN4xcrN$l z3nmNZeKzESpQ*RjDC}ty`>KUKX@*(lVKc8qb?d4vuc)&W>;#=E*Y4~kkamQ znc8hOv%?~r-KmK&A!T;4U}=ekz`&3{2$`bb zc>MsIG4zmcv9UuBNm;4%_Y5B6)2@FkqMh)$Eyi=DNWGw){CUnh0rIlNBqOBxJUlR5 zEm^_JU{g?b+srZNadOr!v2aTYeC11|(^?L$6Uu4joFbo4E-3u6!kkK%as=d5m!xZV z2Lh7I)^3+AnxFrtWg7J)j!EE=3G(>^VG04|jJmETkx`A3`ds>zJzFZ*EWb5_XyVDi z&oXcAS~vW6@AHNY%ghe9QKNzJBPOrg_Qp$tFW{94dMN20BWxtrpP+}w67-Pr-DCw| zQMk^ZtQtI3*a$p7hLwuF?@>07jT7{fFdB{F9AEO)_87Zo;*0b_jGaZAr>d4YSdvMx zZUd8m)}Iuu_<>9b3y0A-txN{qud)%Ja6w$IDmMXOs)`V=>DNvKoPy3Ob_7N zv5x+srV@p8c#?I7IYviHaSHdeJ7klTjCd_02Lcx2x>s?Mo}5W(JmWx`;PZtD(l~!H@bS5dklZ?_4u|@cWzNtj;VCUC zlxyXjYQb@iwc0w?O4*yvliv;M3u-Ik8cbw^GCA=nJ)9CwO^x_+V|jX$)s$zk7~K_l zY)#%fc^~J=dC`b7qAHP=k0b10>-4e%`n zi_J7R9e!qCX9wbE=WlEb^4kX=4mNI_&r0J9zn*dFpZs}~&0-kbh<7>$ei&W)houqB zsFrV!QZ}4TsXLLz3wV)TUPiXL1kvw<+9rK%I^SetG20RwuM3Qan<=@XZ?HI9^aV^V z_a?`R)a0y|qN3q3=Z?&Sna^j+-RPvBoEFj5}{Hq8ejo3ht7|lKdXK8X)D**WvJR!Nih(Eka{F8cGfLFv9_-QGJkR?nzQ%WaI6j-1jxv#_$` zzNwA3w^cjLWm8tSwjWwqPkRbzIPEDOX`|{oMppF$Zcdh3j>QOC@`*YMnjzqc0T5(P z9%4IGYnyeqRX%TJyR3%+6fH~E65ugE?O`51M`BK(*)fN&7_OJ@Bqm#}Cb1F2#Zl-j z1gil>8pf`iSg-<-5@jyUQ4Pb9XiY^`HNr%mIR=w7=YRS2a|q|-g9voJw4nUfoT6Oa zi(hoh&*aR?9yaV^EV1wEgJK_jDY1_}l-NfpIgcSZdNms?=(Bic-D7xWzx0T@Xqt76 zwa+R~bFdwh4UEk)EjIC;z_|)yg47}iMXBsnR`#(lAf zpZV=Jr^D85J8S#QrYnZ;OfjNVtlo}d+&TB#+$MM@QCcvpbgXmGT~b=nXUd>+OsGyi6Bg3mJro5Z!8HuaQqT zb{hFTh6lkoP%5D!2(MX&N&^pZIDRh)YzS-*=t8jwk_hqhDXcw(LDgtV@ftD>6$TkU zNpR_md08f_U^1lWf2bkagMzI=I1dD6EBrcA+^jt)JKK{IX-qH-*D&Om5!&W6w07pQ zFJ;0rzMSPoQq+IPUJu0?{+oDAfekPeBMg3~Oz?AXlhY$U3@8E1k)G-1Q&JLi z5de5V>MjA?AZnoVh#KewqDD-*s1cGbY5+Ni8bA(IzY0}D5{0T?MPazYJ8C=y{IIZ3 zCS+yYOSU)$-%Pm^aE$ms%wfSh;=LwIFRLp)2(leP77H#3ZV1ZQ4yOk?16u-ebAY|? zXT5&5z`w@NXZRU(lRcd2xsUTc=z1k+a~4P(_`lx{ydU5z1NQ{@jKIPG-z770r{Uf} zFp|7GnIq$o-`oJt$rW&a(?NA|LACn=UY{N*YGjKY5zWH9QBJxykjLS0=tqHMG70W$ zNVrN+MXG2UqJ6454URDNyn%`M5dQ1p$+2bQBcs*Yz~qdnC0VtVHQA+uZ~ub5#d^-L z`kQ;EAZRS)-0jcuRm2)+$**6!AUnzTZyn+z4_}Fo+@;QGPMwjuFja1K&2lYv$#vzd zF3c(m7}4Gw+8Xm>6c{NYB8zz{4YWu4^!x4?m+HP=%X@_nh1T=+eGN&ObUIpCH)_UKGJ-`{JAdn zkz|Q)Vg6X8aWH$#;oK6FOzgOcNha0Q1wq?5gi~PDMIbzI0RGEhirRHzE}NMNM+hf2;rEBLn6Z_D__L|s66HvCjrUe*a8Bw{7(#Mi)l>TgE@7UNIHr7We_!w7h46+&= zPi4q!iQr?}Krxdvo;)$^;xQ638*QPQ#8&QlW`OvjR}( zR%WsqV-Y|D+Au8~j_W3d*z1J@i;yaC$6%9+KP3+7Q`~WB$+gpjZrNDe|3%>d`^oF< z$Jfsm-ES~sxR|?t#(k4qxj=2aL9Ucpw#?KNW{4F-KH?{?mnV%byX22WfKTCT2mZPp za*)3r80l9PLvx``74px@PZI`c>^#u)h^PXHiVg0VARk+J$O2T3ylYj5&XMH3DjQ=%6+kB*7&blaNl8dW zmu!@SL9ZqgW7-RHEO7Az*Cm)Pn)_nb<3$K{@xSPI7+%PbR6KB_Nc`x4ro|%V&K03J z{u_$p$9uxF3i+R&_4Y4+QYjX8Fml=D*F0ENenqUy^Z;;DnzJweC%-nb4Mp|lvfnDs(8{X;~+gnC0&mvzj%0LY@ZE4C<=q)f&0v&d zMs0vmFvHLm> zV;aH=enxG0%E-0^*>*2mudsC)Y+Vi;=h^PzwP_pDcqK`J`NL|5Z5SqJ9pBpn>%0QPJ|f+^k^j%!Wg%50ZJiq^U|spBc&C9Ss~nGuqFuws1VMWo19KGpA*eY zXgnEv?r#SVefCt$82?~kfaTlfKmEx=hyV7~nQxC+`@+gK$Jf@PUbX(js;UIY%KVf6 zwO7-NKJdFEGrkOH1!LBMeL4bq;XhKr4HPIYn_aA7}J*W%k_PIl1A?sDGm1I1&V` zs1y(opN0Bp6>C8Vpw`x?eOaZ_-deR);eOiQYiqsI*6Y0jnf$(MpBWO+-u`~~{_lU1 znK^SFd#}Cr+H0@9_IfzO^Vw>~+ZZclqZoH0#%oGSLgHMkeC>13$CHA-m7qv)YC~F3 zmrr6Mm^8k+f^flKld>DEDn&}`vdRg1WEF@8G~Eiz9z+1589+=>;3|pGZwOQebk!0~ zWq~dVw-Q)KB-JaVzGpLt)oF~jOY=B001lU)fpm2E2zEU8@(E{06|bqKcq3Y(o|=vRZ% z0nJw8W_~Qm5=#=v((NNH2X?IYSRMxX7nHWDYKpT}3uYb4;)kh6L=;6idiL5ja4*^$!Wg&DBEZz8lE!i@)g z6!YZ4k`+BlQzbDT7Mm%Ju*-_gnC|#)dw{_|5W+n)9(lZKA`DCOMok-0)74xwdey;s z(Q$o$ZtiMG&uCoSdj8$<^JjO5;bP`}&mnZI|0n7SV?%+N0csV5R8<3WxO(7QIN8dxPJ*k@0-nD*sLO5 z)o!Eg6Bb9Qy&i|H&A{xe!{hK85<09&cGHl47D2N<36cFY88?uA=_*b|Lk6M>HmcyA z#NsMio>+@HT^<|#c}hijxtINgwLE_Lmyh3)RbOA1!MEQhpMEa-#jAH!4*WrAY11or zzt0-ZU2cnwlN2#d!oUN3Yr%`I10D+50&Vt_$?VAl_Dn8<2AdVGpIS$L;I@^mc~j zhFcBtjBN7bkSF9klyf9UZiaT@NkuNnsL$YjbG4c0W*>n;bv6+!D4f@z&A3KDQ{yx^|V?G~y%g1_sdwjf$ewF*UPk~G61x?FF zAbw6!_<18f&Z&b4kK`z3gT?G{FLHl4{WBWgLfp% z7|WVJopgPrll>-I;H~vktw-bS*!Fa@}~-;MT7!X9K4``%h;a# zI!qQZRqH3P(S8$G^k6N4G<_YBSSS1}RXDW>4T7#rt&TApA@U4Us>XN|``NdDRCXx! z_NCqHYOmj@Y3pZJEb7c_8C7C@%r<60@8lVGFRU(Yon1C^aeJU*$pfCq*3!u{=g(`H zT$Z@gQ82D*!pwx6+7i$Bg^igd6MGu#W{=KSxS@DlXMOW6vnqf}j2YtDf5Mn?OD}4v zW*7UT>kAiG9PIaw&m0_4tv^;Tsa!<#T!9Q34De3H_i#CntVBvG!Wvq`Fpg%LhPN^~Zc zBi6}nq9LTZoL5RUUf@lwO|UUl@=vp^L@N0Z0#l zHxXEb{q0BJL6&SDHT1(j>{#-oX%mvl*}2R1-FH79XcZY|&pK6CQjcr*!d<6Jj6cQ_9?Hfx>pcW#8_GqhceU!e#mz%S!^k!mnNZl?VPH2InAcE%oKP~&OnkA*W~%H?j3{DlqoKx4li3D1uciQhsVy4C zZ~GL2MSAbC^#1g->GHAk3+Y@-?@nI}Ih)QIw!x;L2Ad$lC^Ri4Bm55kSI(g|hHH>lm+vNjzfSimcf>6>xZ7dF z>MnNkUh5t!pJrWXU2m1EtmCcRYb~&HEWI73q_F1h@UlbRK`5WHdiP}YXPwQGr({8| z6Ye)N3FKC8K5xEYR!!y%4!reiUew6R^JhB8u876qbuaAt1l zw;(1Y8IYfc3At)9bsS^;&?1SPLo(cb88r603TqHd)gyociE4EH4>Ui1^R#VD=PI#`S5z$iyk z_!_<&16@J(rQQ4x4S86*;etUm8I%sA z!@#KL;u2+?{@1}Zj>Z6^PQhFLNnbPwFfaXBJ}m@Hz(_tmnaU*S@~;!ReXLL9p9#6E zMa&_XmF2Gqn8UE`Nl>_&a1H}dX%Pt!OezTNu$gt4SvhtRH~>_VWX!3$kAaX$X!?X9 z1hTM*JgmrM0E;w&C{JD-eX1||ln{62)2I&ci2RJmD`}woj9?Elqq7WS;8#~IO^~{z zKWO${osV`t+bK^@frd4Vg$M1S*WsI@dajzrLPXf@P;WTWveSZTa*7YflI)ayGVBCu zTD8;!yOfa7-kJ}E=Y9ktRHPY&_Ha{y0xznB{Dkodixajd^dWtVlxEgcmZPE+DMxdC1XUb}80os5k( z#CvNbOo%lmnKw{YS19H?k=F{DX+NVb5~*lJc2`mXlik;li!8Pv^GFS#M;SuGIII$5 zhSi8!AbfXKTAo7SsEzOAspuv-i)Ky*O`DeRK}{cFnY+p1I78H5S4X&0T0I9#LXrk4LY!27&=w&zz3EXSPyk zqQJsO*QMNeXkh@ci8d^LWaY@*?x(+&yz>6e;`-Hx^!`sqr$c5z|5H2|$S_#{+#tsP zyyM0;ifo|OBqoJTCh!6f;#>S2_GPuyjIhMZab)jZV`pr*uL#`oEJ+AoNW+@;3W%eT z9QQuB7CGCAm5e@~b=wk*=MVb!J%0HOto7PxpwQ|B5HRUh!1f4^Ql;xP|4PSgj(efN zCHhKAfxDKiMKd3@vn}@B*m#xg>AkEag~0V-VVsiS?l4mvRcUthu0S)HM=OPce+aaQLxActQPSHXAAII>fm z#S>RIvxjxuVa=rT&J9|Xv4!>kS~SH}W#aj!?Iub^sbD|g9@8ZgtQUJP*;$|cS9T7@ z$)WhCU~U9{GQgL?3n)S~%yzI5;4sP^H0i>L2-^UJPVj#sZqW?#t;L83O%LA%_av0m3P7w6rswJzS}Vm?99&wzJqoofI8MucGL4GKp2>T&udO7 z3guSq7)+_tdplwqL}g$pgXt{6>S*zq5x$n0Q>Rk&;I|TF%5F6UR!s>BW^0Gd;h0L( zvaSOmsgI_lfj2Qd3nd6K4|x7mdWW_Mt|&TSvSL5;%c`D-mqwRHpJ$hU*4*8YwqeH` zeC@tN6K+9Bj6;vPM&B;?KPxo6k*E~W^`80Qt6D~F5_|0O53nvSl8$JzZq7wsICgUeTj5|U49scqVJ&8nvRgG6G()sY6L7nte>I-&RvK!tz-L;Z=B8X54$nHca8*J8V4 zJLSNFdA_{K8_XVzQ~#!O@I>)1Cr0vu5; z#a?a3CjU-9-;lFChu@rjXFA`Myfc~KpZKjrp4AFbI@`pJCX*G8hKD`OQ{0UKa749{pj{578VvSdSdhKPcAGfT=*?&y9+c=vZWpBi{0Azo7fJx z!26(3l6*yh@Hs5CI2IrNaFxUY5-Y~CtQ{BeRQhJ4p zoaUX!S72I2CQk%w1VMorIczaulR8@H)Hc*gNTu-+JJFOlUu2f4Ls9=149i zy?F}x7fH|ux{UBI`cL#Z@^H%>dCn2Awxr0FP8Q0#caaz~7V_$b>{ur~rkRgauxy{% z5yqVSkv0=4DWw!=3ODBG*JU8eR2e%2{Zd1(#aP#($o&{HV!}I*+*+zhI@ZwNaJE4{ z)^MSL4>qv14Tl?!HOO`F;?GHUggU$yJ{7jiDjW&>PZ{lDuR}#Bg+@eAh&juEdxIu~ z(YG%9iLsJK0|<+BN+!r)c9vHiqNH^ABjdX((Wqj=pl= zOwMYVzIaT}j!BtGHJ#zyrVMy36jY>JT;;P{w54rD%BgMp_HEmrGj?R5v362r^2jCk zPQUz%G0P{HDe663@dU<=;D2fEY0eulePjE;5ugt^2Os4>rF^;UjKKK@>0Mk9J~hyt z%=nT|4XqtM6g=t~ZQX_}wjqh_G_jqW1xr{XRIX|1`OX%HBdyV^8XPyt? zan|Pb=Jn^D%`?%y<|#0*ygXfjM+_>)r_c|vc}H+)@G4r9h`{=g0aUTQG6o|O@hL>W zIba{XK!S4(`ONUDJ5H?+O}+ET+|Iqr#@b(S+`Ou7>9|~lJrZ4{%r(>IJyn76ES_KvyRrhRQe_0m;_lq(77toVITK0zS zA*kpcf`98X8F0g}F^p$^9-T$_0lp@I_7H^%{%(H;pUaiXScx|6aVOjFWTdC#%M(}~ zY0wbYaa+Q^gvS$Pm~Jn(vpNW}bP`(xv+PUlx7cCX02S0K#P0Ip^kWWolY>0a@m0OP?h9tGxjQAeK!461~^sAF3xgaYKvQ<`=ZEdvjK`Z;C zm3`0phV{2r`Ee^dfb+gaAIEOOavv-9vB!O^+Q+O8pX@E0dNlXt+_!RNM{aiRlw8@E zn+vJW=Sb~H^ybASKe3Og3m3_x-J%5K^rHL_fpru%ghXyIW0D1N9($NV?WJF*dxr^# zU)FvN6S~w%F_~mcbjerh!~XhLT~zs7TvYi={n(IPMtuf8Vt|52^1y#+#|x5C$1wDQ z=e1;Dm?gEityYH$5gEd9PH#t!?$=Lyg@ZXPF`-4bIguUNQyH^&98G*V@vTJJk(ix0 zB@waz6D3Dd(o}@b)t6Q9&DJF`@{=c|T#=M<9t&?FFCz~96^U6)&^fNyRw0b?>G$$fq7_{q5NNmH;cJL^gwQuthMjtS8EoP&9o=A2?_54H3oZ3ay>Mknm?b5bzB z!glwNZ4gGvf!;h{N=s%&e<~czovG!i=Tk4Fs-{#5qI)(V9}8Rv@WB9Ei_p5q0&-sZ zR9{AhnkA)LlcYonW7^+`f>o?)5v>%eAH8jVXO__?85Y}xKzpyuA&^e4nswOdD-+4d z_}tMqe4d#TpFIX<@jHhmjN$W(m^*|XUCbT7(&rA=7@Ir1m^-F=Q>81J--q-*q^Bpn z5BVQSq!5bx_FDX9uI#J)kDwQj^|ft8n`3TsSf*Hb0c2n-939FO1!^^Ajj~%ARFsz$ zwp%%bBU!Qc$}L}-+l9_hK8ApjSoR*aAH#1%Ze$J7EOY*YJ$eD zS|^G%;=lGqkHl7pmwrr6N?`A>MPl-c#ti8FYBfK+p>&rbgWNKx%Nd%~i%e-}C8X6= zx{&-s6#>&hyt;uPYN54|(BK*R2A+Lc-O3&wc>Pj_+6xq+2wLx0KyyaqbjmlhIpuP= zrOIZhr5_q+NcrXLJiEYDET$!62iGGHLLw29A?-e+f*jHiq7F8;kG=PJbfi+x?i=_R z^OYHU*msg2nS}jl^vlD%33Vp*u^`OZpC5d_uRP=!5$_rB>jCH--lTq~j53hZ#xdHz z#r*+v`}2d3^_2!4B}4arsr*Oyf8c)VcdDR0SUFTW(aD#}-@prE_frL(fe}Nc3%b(b zKYj)NL;OzM54jOi3Hey_P=#JYTyDHl2g#ax8Sn7=-nWVTPE%%NA~9jzulLUe+|9QV`rf)UW-+_ zz=DuSx7RWj&vWG6NbyH%Tu#ST;1_Qz*%DBU=OA_&KIBtsnq- z01G~np&+liP`$FAy|$A?7yQ3wlKxv|nDFTTM`fVT{y92XxqI+w$WddZKRAu}l%yX3 zzAf_eEUZ%go}lJbXhCGu=)-ou<)9E@ESStC%Old$Mi}URM$6exuzbfP;T9pBLkTP? zl(fa-$?|L}tDGZ0e_z$i_OZUE?M<%<+z*vs^@1c1oZO3$)nLOcZ1!Y&HkVb*eoeVht=H1{BWgqRB1X|`XhZ0~ zsDq>uD{6SeA_WJ2KU9VPtE&iA&l=v2+kq$YeG_;x5uQ}S6S7A0gF{VFpXQIi%ck)Y zDnEuNWYIx*8HBqZ%~;dyin7gUgjwDCqsHw`zOn5ytM>v=Txyq}M@A+pKUJEe)w`$$ z(H$PD#*=!#eW+i0W2RjuDfyuNQ2Nnyglc-kE=l&M4IWe;`h8^(_6y`ONWuIF4E&@n zgFQXPp40m*XV@`2XmMwHZUt%w{`ys2IlNP^hIPdYk`wX@U=;DZ>^SfqwBMf+?_y6rT9BHRUScJ3|2izY>Jt6tr*^F{s0Ojdxkx zM1B>sUyYvpGL1C7wl_vCf+hif^dj#P^pYy|{CD6_BKURS3GfuFHRTaYGHijME_VX^ zK>e41A5Lcf82BOT+jBJ?-aUA;{3pz1R^*rWTl*!G*(ALL({qE;AC%X~M`di}FxmQw z@U#=SPzU-*s|!sv^3TeeE>hA2idYT`J*cUrbkajU%;>EU2J3K6X~oKLkf^gWqbK; z@=MTnwY?y@uoVVXJ#_XTX@xj2Qp|UmKE!Zp#29=TrZKxI-#L=FsYna%kb<3Our?5% zkP&I^rtdxJk!WZ|%x^23ctd^NqV_bMq6Zn3?34+@PW8RQVQuuVsAsytCvsrUq1QTZ^a8@3jC1%-S|^=7hp(6 zro~3=XfBmD%kOEno25G?zKQRIBI^cPbtIT<;qDZCTu&b}X~~E0F@!q0G?LC%(Z`6` zC1`f^r<`=wMjv4C=QTSHCiFF&tU$mh@-(}kZIhih%gl_OFyym@(;<`H6@52otUx=Z z{aE|8rf8abecz&!bNZI`FmF#m4}ZPqiynSY54*XC&FNt+J*>EgrT4Hu_OSbVe%!-1 z^{^E^Y-SIu>tTi-dP27Jr1Y6j=JuK0WG~R>o&&=_3h-pgb!%l6dP4R=Yw)<}AUzxl_=7ZLvJ2>V`yJsV*=BM(OS<_NnX!rCKjG?mAG8@UwWXCmyu$kP$N zB63fJqr$of3q)9^xZ#t?K!m>#c|G!8MBW^ECc@`X;SG`Yi2U#u5%zI}>E%BdVVmi3 z6iyepfc0|$D2jhN@hDB*I>gXkQSRq8Ne@jjoBcc$r?$ z2Ldto#}R`Y8X_!}pkV`Xggh+}vP;}EFR~)S>mn>Y5{PiUh^NsGex(FlD-dlQiL3uY zFtAesf_oxtPK31xM5YS}(M((ge9uN0+fPkpiv<=NseI;$u-}UgITm63aD?rSu(c7^ z6=7P0Wk;A4VWw55rk}p$)O>gIsnXL^PSv;zPbHkrJf$E%m&nuB_{nF`PwQ_HL6@`z zv_+>I2(IhW?F1=4u6U7YwEl|SKvsl9uc6EF0)}7LuU>iZD<4DQS8hPGumEz106bdY zh*#{|`t<{!2~7s9VkvwUE{_~Z+Hv1$e5}ib7Cg=1aKf}2&-nHBr{85PeqTh zj&DbwV^eprRgLV%?C8DGy_sTuoP&C&iF(IsfoZI; z7`Ds!$Cuxh1M0b(Bo^(40KHK3Q`srmxdwBJm}(L~h1rH?PYg2+qCX}eG4vsr2RcW> zlbaUxEEN50zr1cQ9!AwmxRGyD9+h&WH7`h6@XW}9Cw;Qzd_D}IbI#{WzakGnDcSIQ z>pjvX$O|OO7JwiWJe%oqwP()Do8{Q;r-`g{TdEpto@C3O9bjKY96R%{cO-Pq9{|5({uA|86$kIm7AhdL>~jw$_O;iB`w#Qjj~a;NKPMe^&;$W zhjXoS4?J)TPDmBkC)g||+f+51GKes{(sgC63wK`!L+>!N1cy8`>0Wg04v39x-l!!) z8Ugi*5DTP^pB)8_$Ze;q_xr>p(`@!8&v($dD@_&o@zJ2GaUqR@CN>SG-uM2&scPE5c zkQQXI_2^a7Hj;oQ_JHBRKn^vrFo&>LL2gPmnvr6W-eAhHtrZzNz?sNDtN+mgCx>j7 zln!&1#_`8B})qWGJ?YL=@ z|Dh3wH>Ga9ck3P3@4KNkvwmh>U3OKz=f=q0IAdXY}t}m;u%`uYQFp`ZNIVao>@@s7GYX7udZr9Qa!=Glc?5wV=Em^W7tGyl8>?Whevs;tMQDWuXp;#abDAcP>Zl8OOFPoNhAz*nj!n~8c-rh~J=5fA zlZ$*EIg|Z4d3iZoa(3tNqu4Lkz&SiQo*WbWB4tx-%!ur5l;u%h`XGrlGCx5Mfe9SQ z19P^%JroEKTOfrJ;#3C_QhpuwESwbHj+|lixH5GJGmm?S*JH95kz`0v5UyEpDFn|?_GcBrtt&6Rkw~_ z^XP&*?-}^jeV1Rf+Be_Iezfhcf87>cIJwPaSh#U(O3iF7ZFIdQwJ0mAI5XL9^Hoo2 zSbNK|4X%uW6w8d%{0y(vnq4ys{KSd<@R{Hzqot2tkoe%o+IUCX@&Z;Lm=L%%aCbn- zZ>VY*->{)!dxJWnwpOVt3$6B~I1^A?seojGHxj)+|-FTzCP3B25Vp7WHRGq&NlZi2y^++BZAU3OW7!UzAZV-(l_(Pl^ zFO^t2+<;%-juqXQR~s4uWe+SPYhxSbLtD4T9O&$zlFBh+50{@w9)=T!lvcpmrtp*vL6&h7g3lL_QRs+N^{Ai^|vpE zt;x-^Dkt63zkaJ}L`r(KVau)GzhhkGtedgJySQ-H&P7|C!DO%By>;r{iz#I%cun)* zXNI%ty;zsiI&_NEuO-~JSaapfp4*L&%}X|&dT)R zMO=#seQj-3ebvVslbs^i#h9ezq-3eIuMt_!!;QIpmgC6p3{wUloVB}C&ZeACxsYN? zDX3yq6{qT-pLA-%cqLi(Bxas+JYRT91joR#fFenM_DP7A{*bt#$`cdY$dQnK*jSo!@nKJ}y{37-b(f)R(wgx6?b8Yx7Tne}e)+_5^KQ#^?JH-oK^q@!t|}BVYAaRrH&ip&Gf_v6r+ z&PtewFtA4v#h-cxJG`_6LWpGy31~aP@kWF3Au|N4b;ageVMIba?Mg=>o*;WJG~U(h z*|=)W7T?(1ys_CxtP`$6CY{nLtH-*1B{wFd7p3_My{3vuH5rq8Rz39Sp@)yUGVE;$ znNHr`u=2W!lF4hD7xg`GbHQhI*VUvco~jw6bMlc^GpgqFY&)pa|4Wi&BAE;sjDXz+ z=`-!NU0_)h#Avj{QYE(C!q!_@vt@>5iADBW3M^cOOyJLvl}t}2x2B}0aH}`n%Y&m? zy{9eT-R6{>btBr+_Bana`<-%j8gr&O(@c9{J8~>v4(2l{pXFPav5izq9WeG4bL1YA zVk(AZF=FMlwfn&h}QDdwDNJq zBf^!bQ77N5e53zD^b)_-n2NqCgjBR2v4B#bH@eGADdawake?i;5LBB?vOfh8 zQD8cSP<61KC@ubBNlMZWHTdmvuUA6QmLMe060M}8L@6o!p?{5ZRC-Gyqcc@1D*c&c z_GT(li4T{1aRYZG`yFx_7M96iG;bpBu2?L<4ZibDk}M${I0xRO)h5u0S-sj|1Z_i^ zJAxG!6dIBY9$H2qoE&zmkPTg~hI}4sv|g|2*fsuSm~2uLKjG>;AX$&C7}Z zKjfPSz0Mx|P`OPBV>MJJP17pp+F6D}JB*n1yeo%wX- zLW|RzgrF?2E)lk2ot3m_41Fr+T__I+BbAg%nRpFU$y%Ucf+LXt3$IUj7rJveDuvV``*51 z?3DX{c}Mh-l(IZe_NZASOX?O+Eai7YMk&elg6XD2$t4l`gO0(^4U>ibU=vn%g*=^q zA#^GSR*HN^A6Eu*l8t0o&Pm(Giz zZh*camS=plsAE^WbbO1_u>*Z$E_N}rB6wx3sbE3)>q{?V_%PT9Lm>mL3=9bv+eLNY zmWuzXj?P#+Vl5b|gC8jRzo_H(|C>7Y4yywZYlqcw{|zwP(BPAIO*_~PUs3K5ZY0JY zlNKB1^YPFnq-bWzVUv5EMwe4)WzM9%SxGBg2G_Pc@FALMG4aAqkZ;Xw$PU-vF>Tr% z_2KM>O!)&=oV&1T{MwTIlC|TT7Uq&Z49FXNjbBia%>2wIrbyR~~!&>ayg+SJ!qq?SOJZBDuItNi zyELaml5M>vAVn`(hue=5DK3S;3}APKc;M=?9=p0S`2)g99N*b61;s)m!`+*#>E*+c zi$ScSdiDCMbb=iaII=&EM&- zYw&PQ?_E{nwLLk&uZ9--K<8js(2NW@sz`G&x1{8Gl6@Jnl%crcRU!omq7ObibS+#?c0TI+(N*wV^`oalnSC`lUjh%jc;w(8w;JUMBj=9f<3?H?;rem$gy{aV>aqi6 zPnIdZ!tz31Sm=1V{EKp4gkQj6A|%@8HGUnAknfnyCKNOo)QsMbbsLi*vD(#i^R zI|9{H!QeG-ueaZ;7`@(LU`^m$Kz0OP4)8!zhlO$jLCHYYfgzIFNWvBgJ0NCI;#)XP zllVabHpDoQp_()eWKk*XG@#njZG{!FvVrd%MH3+h|61J*Pvmsbb7_&&9gM#0iPr4y zJ04rmxn**mH`sQ=_UlR}X_Zce$#-ncXsECC=9g?3x9*|&#s6f=4{7<;GshvrR#Hh* z>DZOmjg*g!=vltJy!YpOCN-|OyM5H|J$LprLh>s~tkCa^yMt^6}&I~9uI&$M*H|8k?;?3&?P0w1Z7(4xWRpL!{g zq`gORa06$Byp_-5@-oJXSeVTQ8)Y_|WN46?M`oYNY=!)={5|<&S*enz%UqI~mCK0^ zSat>_8J3vBZA1jZKj#_rC_c|x&mNEL@HE1gM6N&Tc?%vTIInrS_48dGzT0yMar4i4 z6v^ZBbl?F+k_~bq;zQfWZy909Y>X@?Is=W^O&2DPaBQV87wE?zJSXvj)BAAGWQdNm z-BpWhj#yV9lusf2sSs>ZeGf69^OU6Mcb%DD2jdCJ8P4dlyOhr^*>*i5&o7$RTy8Q| zv`j0y`~+mZkE4^-?*M;B#B|A*=T1?M!kF+as7VlRj!aaT1Tmza;=oI=ZIOZQAVsnU ziLE2ex6l)le#)hMcKOuH$}7>yhP_{`F^2w=x(81`g!0Q#z7;+_<~vRIoA~3fG$u+< z!&2#S7*+2vvh~J0jC`??RU4a)GvH-FGWY~&--=ls779*Kzlj{6j~Zkib|JLD7OWcJ zW+=Ty4$m6=f{ZfUv)&?LHHjM~pB<6>y0{6cfteX$=#ZZVD^E)ENYTtF4;Ye%#}_!z z=aV9U(t_dD1$n&FP1_*gF=i-oAL5$_4k%+UALrqLr{u??lUKp?uypwY1IpzuVEIUG zT*AARF#jv|6?~dU;y&KN*K&nBfjQ{3pJgX7CV?>;b!6AJME)J`*4HLX3Jv~MS&01+ zlk@_%RzRX(1Bsf^?l#(5mlT8sFqoWcOuJ1-O>db#HK`6$&@{zFCsb1x>2YZPXbN_a z6svsH!pbcjh|jghqO76xZ{!TlFIbqv5`^)nT=%Jk9mArX@3tJZyk+^+qO7$rx{h*~ZdDliPiJ}Jr7_!8tO!s#NfC=gju4$lr1+JNdDWOw4Lmq-6_ ziY5G&eRpeuoO08^Wc6#n$}H&(wNriv96ltClh$kPJ1bfBxaM*2)Mpl%sX0tdVufj@ zDkTwp_}Zt>9npN_bt6irZD^hU)VS>S>GMMfOH~#<(Q?bk&@Gb!t)cYHP;0a^bj##G zOGSEWd26s`BcD8Z*YYtt4m92nF05U=d(PCa_l)}5{xLVS71b`;{nYJu^!7qqQ&V$& zbKyn(Fx1&xd^^z;8PyuPm7jpG*-v0`r|J?Kh8yj~l;Cw-Y%sUuW zj=&Q%Rm#&6+r9I=yxlp^$x|hp-7dMY(|0BaKh`rrNMKN{s8=*77`yS^WEb;}zxCS- z7d^eXWodQS9g`>DF~5p)X+!_r6DQu?zac7dzVP9dbt6|kvKZlcvA6e)=w!ZM{hgG@ zWi88+o0eOWE33{Vr{9U;_!~ca-OngP)r)@F|2&hl$Nu^E;fa0_mcP-@&3^X2U;C%` z!hY?{FT!{FS*pL-U+0&tes;;v{)m)*+Dk8oSNJ#k@A1pn3T^i@y3XPMgh#)?_1+`T zg;&w{6HkS4>T!SXBael@?`NC*5Bi_>%kBPo{uQXX|K5G!hyBm^zvq`D{#|~)!p~4# zfxpJz;+KE#XTSEdKK~E>+(6lAi7&0bCJUIRObh#aCrl30 z8Lq?np8t=2PUXMhmmef}Mm2^B)HZ5Nx}Vqn(f@^?)8*g#Z8Is_l z%H9)&fv~9B4lUXq|6xDp@tlSuGP1+x{H)u*7N?K-`~9lJpY0F&Wuwo#hZGapEw&&m zzqz7N%uRydfqhF`YKMjdJ3J9#3c&rqsIjkwi3D2^Q0>rc5`cX~Ah5nGZW=)X07iHK zj*jcslj(x^37drg{l*~2pKif`j4tt81hXVrf+i?8y!qn}T(VHmc}c(*!-?YCcmY&3dq7 zaED~@WV~7b1A7mC!fJmIweryq?S6nIMIU>aXR_JRb1Y{+Te+X*N8jHc-M^oBwv1Td zpDC@#BdOaHR%q!~BR9b^@L4lrpgh|M;}YpveG6X(*Q7Ygm~u!koD$mjxW>B?jp#6}DvU_Qw zBC?rg-(}`aX1>h0$%xpms>Drjl%>F~KnaiJp&qvuAcINUaelfZ&x{Yt< zhJlL%JEn01I}#<83dY1@sZVKzY^h4_)9MjaraTK;_ypQ$+BmKyVZcRw|J^=5=Dz53 zdWPo?JS6|pa0EMZFqiXTkIgJ${_SIK8;NznGXUii(mf;2SXC`;4kwY$9_*qJD?Otj ziJ#mzeOhm0d&r+G)UocU(Mz(dBFKis^zvAn3tqNI2W3-jR20kTmC9^xlaSBB(! zK~e_K_n|r);xRDRO*PNmH@9f%n5;@zSSM#E z=A@}fj%=sjWHcQ4&!^5rM%Fkp3sXGUPIB^OkH0v3In_P*IXo>-@>A$fZ=Z}EUbK=w z$1X$KcA+i|5E+zaQD5eM>M6$F9oUC{L8Kfh<$Gj`goT};P>dz>5P7x9$D3?~d~6wU%f$7eiC^^x5Nq6Y4giw2hM z<)`*uTCKx5uuskcoG3%DS7nBi2FajARVssvG61rG05C%)v&cnz0rtfY6tRcF_%3QI zU?(^fBmX|&Kq(l~D&r?m0yW{2D{u%Qk?-2e4_Tt*x zuYrRs5ebfv%fb&59Ljwcq0K@W$TS9gpbVo_c!FHW;s`MrMPsgjB5+bEkRpH~v;Z97 zMZg2h03O1NUe4iwM>uynXSZzl|ivP3@_rK01q zSrleuhEt-jVT4gB%F=s_s6*gdeVMuoL~?003X9Q|fUD@Z(X7S*qq2ahAtDRK;EGWi zumx%(d>s@RBdo{ZLRnTRbi!y?P2ZzdO32u#nQfBIf`*!`Xz6j4r~u|hjXHqXE*f5} z08M z2?ON4y?dh%V32V39{S{$fS1ZDX)+5kQJ4|yQwGQ-rkpYv<)}jR2Ky-@IAOOc#tn@f zl*D@U@nb$Yd<+3Tvs7^s!GRE`CQdaLbCmk|xH6!RCLPW=?Fi~YAJJcYSP2r6m+yUN z?`7!n8Nn<1-7JNUGppfc0EzfqnCNJHV(UAage836()UM8I2$jrb72dr_nAR0o! z%5((jSl8J@?DIYO{mUnTE4~30qd^y6RMzNi(#M64ujkAL!W9_RX$y2O7L#B*#|@Xv zXw-9jK=dn-jIbZpM@Th95@I2QDzFi@4(+;FEPqI#in4zRUSyW4(7Tuqu142si-hFk zQNs|GqnGvJH;g+G!YuOpgfE>(#YmB8k?7|Nz7(_BW)=7%$4nalptca^2w#=~Zj2J0 zKBo@hE7mun?@>)oHD)O^NdD#C%P0AUz0pj*L0*2bSZxt)BEHUd5&eT^iM|xXJK+Xm zk7lq(3)OSnFhKn61iz$nNxfHMBLSF;QCN&W=`8bdE*gij*?Td*3w#|{tX#Ckj22js zy@LphNDVCbBsX1_3>Xw}r5)<@_;Q`PUvApVes?*4?>mD3sd-{<0DZ+^*XhfmD0Y*m z!z!?(6ER^9BJXk2C2B_>A28^{kHWKDMPH&VdW$d+<@U?@7>n$81NR!k7hl|~zJpc? z8er=L-!)5>F9AUyX2Ey`ff+B-Nc=klR;kYmg22SwFt7|vNf4O);YBRc1n(65L#Hq5 zZ==8#QJTz@({Rr*DHjcldRKv;~vXx1UKV8Ryg^-DniJDtR6K#GY_@H$bxz!xZ( zdciuJwocm2jM->-oU~k03>Wp9#6ZD#jE@wZX^F~mfHk78%lUHq-l%c!z`g8uXp-7; zNtf@2<~*xZa|-ljH*gCLN-*&gHfxls`Z9^>JnTzEc4ZojO@)Hah?8C6HDcbeN+XXe z_E;^-aT^z00GK>&Gg_mPY50T<1QJK9jI%UB1mMKr#)9U+UWm8Hrd^#W%Q{~Zd>*@i zQrpP{gTZApH6hmseiDH@(VH{?6dXZ|eB5@4IQ3~|z``$@nP8>BXPg4Xd?m&#SuF^D zjZVZjU%q$mJA%gvLLAsMKf=vhoF^Y^aJrWLLMEQBU;CnH?6vJ&p6S$n{K;lF~5CSJuP^V*b_lK(Yju5AS+>XJqmxJ%C)rFiSj?9UnAQo&j0Ot?k=S4%VJR*%(7eKQp&Ek7 zz%un^;2FIse@K(Q82_>P*ecZ@m+dB+kM-e+2=T-UgxF)SM6u2lb&>3g+?a75aJ6J6 z<{9;6eP)iyXMz(5{E9XaA8<$$`s^l?%S@vZ6Z1(YbR15VCIK$!7dnCyj!S0ZY$pxM zfHg+GXry4E)IMNYZ>B!ogaipQc;bP839UK}^9>i9Fu{FDZC2mW`Gep|F_{>x*33q$ z)h?M#wio~g(3pu3Ja9#Nq}eVcv5Zjq*kFa6xrAkBxODRVivCB7O&BGbXbN$&%=I*u3PBCTeEI;c%I4HfMZ# zBEArlv2+SPVINQh+vS!^SEfRNVG!`}b`tqQg)NAfh)Hm%fqT(FqT*<#`m!;M1}keo z#Nfw7!-7wUcDtpCr>qV~5~5CHkqK_$CT?NHewyS-1h=q}Jke)XFFA?6j@yZtNvw{G z*63;C8Zf$z6LpMt03=<`)CH%Qur1hhjF-fCH8GUo@Ju?PBqf?ju6JM{E5|)tr5|o| zI;h=a_ef6kh8@tHO5_QbiGP!nK&}NbvIjV^5q?ErAj%ixo4|~-@pnLp)LSuDuFr~C zn+Z_@i*N88fg>6dF0B4LPbvussoX)}sDRCQDkTZlZyqb1NCte$@f0-)fSu;vOH$%R zhv+_=Wx!?BVI;f}<{)Ln7?AU`;hYE%|xK;Ujny z&3k}_uTq~8yfP7sWTxNCUdFOilG{JZ*$;c>CXBJM>t)alq=&XWpZOC7{68CjGzVy~=KYKLw0 zb=X0h2hG(Y`1-Dp)<`!>w@90%Ez&mWYtlW?XYG>?N)Jniq{pRi^NN$-eDuKsd!Kxs zu~Sd1n$cWl--JWWzH#OB@ujwnOD0uksyoG*yB1HZ%24iFH>auC6%l7{TRU4Ta^ALJ zYF(;%mpF58cLyAW@4cyWv_EMpoyqClaQ&!!Pw&RNZo9X)_ukv?+Nf?n{Ky0Q_dM~$ z)63c_a@Y>K%h3}q_eqxR%p`CB_U?PW_B@mOwm-gf(Fz=#?m4`;yQgd3EIOWk{p{(7 zuA9ikws`5Z#kd8}>@=Fh9r{~eJZ+}LLFWK#& zW1Gim+lO@}9ZRr@m9}l!jAL!o#@^dDdZ)AWFiRbeRK+a4lzDutXL@*id8yAPZQLl? ze5K{%!_#{#E1$UcuJr8<+qq*qEk>q3GXq@IU%Z4?_cuJr$HF_ym5#<3#+5*H5*@>eH+KfBhk9sf00&8xAD?*jpWT zY#es{_s%B|yXXJ)e)u+CsrTAr7p`6VUfR>czJd4QrAr6);`@;PerxH{Xm?LfbYV}A zV#oIa{r%R^-8lS;vwx=ydM;M-0hOfVc`5X=|A8rIS7|bBSR1n#K2Bw=`c*rV}&fhf-pd- zWetd?Gmf>gb_SnCA}M$#ed$eP^uK+cNO^c2^qcA}{E9b`?C^Wz$H`xDFFpVF?kDn% zKRf*U@0}<7P+3&ZfAvj6fbIq9gD&xZR{Z1O(!EQUg7WEKKf844<+=ZZyVy5|m-On= zrSg+kSBPqseyK_wt}8%&b;*-wB2AUW!R}Hseqb)w%hMyA0 z!-r(I7=ZeRJ|xAsj15fv{O|%|gH*3LHdOWN7_c<%sc^h8zUe1!$4wGuZwYe2+lI%b zHpF$DD$S7QNS)FGX$j)Gu9DWlM|+bLk+#B9d#AKZ+KYr44`L_jo6?ig)6%ojbJ9up zT7O@9Mf#ESx^zbRh4i-cp7eqA&(a^HKT4lSf06!O`a&9jxia>@kk876ovKs@&r=3N z30B4`uy<7l57j2t3{#>>Y$^m5XjZDhR=@Oy4 zkxOqW6;$>rwuLW~H{!CK{wj2{eM)RHl zGE8I)w-_cW-$ktwOc~iX_-sB?`R=7@bZzh89}IJq@6a_fXM08CzBBNR0r>H=Z{XTQ zWuJb{Fmd3>z*EY;OVd!&RnLLv80G>e-?>!Bmr&cFOF~@G!&qyYCBNpm(+JB7)d}M@ zV>a+&kdfzrtO{X=My5zuOd-078F|PRo;NL8%U++x-iRhdzrhx=ZvGbk#XtqG9(ZHm zRXzq~e_MJ?8KD$otyCzD&@#sRr~7$(&b%Dno<1*~k58VS%(E;WDb+iJ-gtQ4yl-x7Zr=FK zdGii$Y*w}*kWmvI4ZDIaysC}>s5C)IVF|fNt&}O53$a`ee(=H1oge(1#l9(#1gg9S z%Y|P7!qoajJKEcK5MuT3NyBO$2Gj6c=+-a6$fX*0tftPRL7QJ6U-dyQ2w3kQ#Gcfc3<{r;JuCGC0s@Pr$dwoaHB3bnLgT~!edSA=+^ zdZr&&{4=X>2v3;Mx|FVjTAFJrDr(RdDtiv&WD~}aOUjYT;4L>^+NX7TeEGf&KG~Cz zpRplBPEQG>Y)+BWJps>Vk32rNsIh895&lex$XXz!nJWB&+Q69lo_aQ?p0(DqRK%wk z)#M0t!K`04HED>s5NHZCDPH6!w`VETzRoi+We!r93g;Q}Fvt26O06?w_Zq*33-}k7 zo@CZPL~$_o01aM?hPcZnnS!V>_f0xxWSo%+F~z}yi&Us;*YH-i0Bsm~V-`h2AWf10>&@5C_+UzoqEoQI>wPn3#3PhaP(Hy?5!8&GL#KPQ~gd7Q*Q2I-ejrIPc50iO0So%0VnhL03*Q%FPE@Zi;`8Ia-)8itMU zmhYPX!oo2V_wJi`4K|pLx%e|9qVLb^dNB_{Lpf_1ywQ-LG(aEJBHii;aVonuIi)^#Y~$+kmjb6SOx}6N*3nn={kpX^+08eVFI-rDQ}aFDixySf zq%^!I+md|VQ)SOLtg9O{YIO(?B>SvpoBG~+<`H>)WzUD!G>+-*LZL;ahS8Pfi|^XG zurjz{!QDF-l~)okWxs*hT7j|^wo8bXqK)w;reah(0_@YkAe?C&2(&Kcvh%qYa(S-m zO?8tsD2zfgke~HJAuCLjq+VEeNtv3zD4dCaq-QABW#t)4O&Suzaou_h$aR!+2fsmG zWMBnWMCO>uu(^VXT1?{%4XQgA=%a`ZH0F?9v!Jkmzh65yul2gpC8KV>Ze}>VoJoVy zglLrUyz9nfW@l%Pxo%d&=&Z~!e5`3iNyo}tuL}fbUU%!NsncxVYC$wrLkr*Aklk7u zXw4ooX7u#Z*6aqfd8%{~E*@K@Cag$Ww4#cp2FGMJnex6mLJWk)S{j-v8Yf7#y|uh{ z>>h+caWpbhBhkg1L>a_m6=gA zUY`Z&u4E%woyB-^HF&f<=&JE&6eU19k`1crup_ek2+f_3Ei|)HL9$5B%_@+UZT)2W z%vm?zJZt*&8Mn4x_t4xiqepAA=ZqRNW)!5k!~|oXPu8Pc@J$?F3H_e(E@QoQgd*0~LqsPphHD(OSc@1DhDr_f%6hExM z2Y-rg_*W>Fgj@We( zX<%97?PJHabTy8BdEcy=i_Ct1MQZcBTiUz3#x~BI&`>fXh#`SgcLYBoHN#u{C(t7Y zwUoL^jc}Q$8a>V)%u*0qo~0+ICt|q>D?Kr%bV9pWNv&}HyaGvk2|fZ5)F}MZX(Av3 zMwfY$hxfQ>DakW*A=YX#KQ4@8LTR~t$~1jtda;&P#p~w=W|uWAD4x>R)|uTA@}!$o z!{nm>)7qE7M^)YX-*aY5GLwXmkU-2bWMfS-nVD=5AV3lV#1J4Lf(VnzO=e&+6J{Ym z)#8F1s~fIWTPdx){;iLqwTL2pS|1igjJO391V#Ev^|gJzKHigg-`}}Q0=53z|L324 z&Ya)9_nhB$e&^hK&;6a>@zh1z+8W!3rR1f#78lKKYwMkQn=@@fwjnDkb7t9;C-9vi zZPZ+6XHPtaXB`0SkSmYT+t3B?UfT^+4C43lUTx?52zN%nMw=RXW#@rauQruFyrm-Qb(s@7&ln8B0l8 zf4qG8*2=LvL(89N9yQ5cdq-PFpLg<;tFMMPGLv4Fat)J>H{(ghQ9p{Ok4~=Ff^%)W zYV`1=q;izWABjQk$nx598UeDgA<&z6>;Olu5l{>DZwm5EBiEQTrL(KXlEu!qJnWj} zC@as+$;qv)$Nn6F+DUcO+9sA6Z|*$Q_|&4-+b2)IVRD^!?EJ(_=4l-zbF0c`*VUzC zyc!liZv4`C2cGguq(J?YLVNx2?2SdK^&#-Hk$krkCG5JAR=Bv3&BPsXSW#6GD=uOg zMa)pd5{e2+MlTu7Mi&?4WhIM6FjxjdTgRrk(7a;mo_?TMypUv{ghbfs=wvoMJ86%P znha^CD}+kJ;*Cm^@ynu;;w7%y+S;k}9pk_GsJL*>s@h4D>)K08`TlQq@RDynVhz*e z!s0PiF^8;`1usf;xXO6V5Ue zd22Evu;v#w<&@jE+mG4}`SyAC5J01S-mn!E297oD;4Fk!tb)}1g?UnX8yu~SZKF)7 zcG!*b1&=&6@C6Ht2eAHwoU$*V;b{9J`p#IX1~ALi)@$UVNz*aIV}PQVf8Rq7Wlrvz zZ*R;_D;+-8m22(4ec!%)v}+(XSKBaIo;$&8z6(18jjJ2uxs~~U_Opwp2KOl=nfg?j zmg*8!l0;4AIoorN<{0vG=H-L{8gs6cXQ(VWLuDBv$%X%$9DhTGJN}jg|1;Zk-isErKg{f1T zQ*u-Cr@Gtg?B9%==@`Wf9oSegZ+P)ozH<0DH6G)i*vssB{s>|l^wmhx@Omr03o>*L zVvAxUAO<61tGBY|_~Y+)KNMVyWv&!;=UX`3eS6 zDv*>ny4gTG?s8fqaYTua?@}Up<4s{Os{6#TF^cJa=$h5#j>Tn<(KyDX6z<|XO*ez? zNT?H!hH&OX&l_RDLRG`)H1`zduHs{Ey|jwm@?hvIOXkQ-%j@{Gz(3o&H^fW7IlhKx zB^Qq=v|c*RMyI5gq!&PzNw#?ddDiIsH7Dek$FVo_V&QU|8N~SDk3Ewp%-`hDx|} zS!pL?gLT+h(@AnofeJ;a#0xMv1jeCNRIU{iAxFaZKr|;_uc$c@X{}nUuMw-Ip&0Uk zve2D^!b_LT4m8b>=S)o8WEwf9s%X~Y`Ey-YXWcxSUAz=d&s|nEvl~*(obH=5cJ$== zj?}Bli$*M3K7Ubh7JGNie`JpyGYjD!Ao~RF#)jM!-><5EwCR-DEYW_1+-6-Vv4i+- z6G!u*m}L7b`Gn~catNn|EMg@KtsB9ZmSPxDi1&2btB$X$Uv>3_P33K?>n^$Z)utTJ zv(LU5=sNI=pD$U1v8WV!zQwdn%(u*!?*5h30Q<*!_Ig@Iy#PQtDSZO{m{Lci@|NmZ zNuM@PVN<5$eR|5t4mz1r`m|{ln>B0fr*&lxo}EF>Exo+)S@Y6Wm5`LwiV7^bM@70 z<`m|ZPq7zOmt+(+`5K!2jiWP4YKn@cm1P^B&T$l^rx!SKvdYJd8a2jo>Cqhb*pVa0 zRpt~<9-oypzAm$B*^J`i8B43mn%#DjA)(k^UsyVCazSC;yorU=+{JkI%y&1#kK{As zv;1F7UttabYsO;MO;#SWY_f3M?9}9gVvkkx?0S>Uv@vlTCO6;{@O=?*h{hG%s}P~# z0=C!{FKCQx5aBQA$=j7;VC|u;^X+_>*|&VT&%BG<=WjJWTe~b$+r4sScWq=@Eez!b zV-9N+{j;ckgfBisbs z$njw^8-d?31&G_UD{BOM^3oeeKQvwZF!$38lx#L#WM2tgU0s z0&AcC7EWL$oavSL&Sz@=@aUyCOcygg&Ha#gl)&Ro^CirFPDeDn#M=}3x`aCu_(oi! zL1+|u4HkWDt52ZNvI!f_D;Rtwz%ib`F|1&TUp7>YL6)X1F@aRAx?Ab4$`lkQKri(A&4?M@u1JCmoGoEi6p1YR&Ij2Z;^#$0l&^8i3^;wKo zbSGw-w%4a@Oy8bxS&KR^AS}rRJgQ+QTN()vv;r27$r;$BSjepz{_n@Px6aD1u1Z{H z$|#*Pd18BOV_sEt!gZ#M33E&ri%W~A)|Relbpn`HGjT<$OOerTx@br>|2yo;k+w}br@NPfh9d*!M4EpmhW3Wu^25DV?C@bAIsrXQ!!u8t)k%x*>7S_ zV9lG#M6_x(E@3!gx?!Z#Tkq(!$bG(^+RSjRItp z7z!?<^rqI9*F!A`q9@ccbRclgiMBfvVrf0gmaR^UB{~;IO&7;CF0H7no8qom+K35d z`pZE~Ygn-OtCwz3VFvG{Gb+sCzG+ZlgXCfn6*fv)?0pr6ml>WE6g*}rlQ*caMcQDP zufhpZhT&@!PLxtGr>~T^BH~L}g>6!q@q!8`OW!x=sBnrj!Te{~Av0pm8`Cd%xD+sx z^5DIoz^M*OeYh48M>2A%yH?OD zlcWZJw?FFNAa~k3JyDPSX}iy51kynk>~Ki)fRzX?`#WR>fqkJTh!YD?wi}d=k=k)3INHSE*BhiP2IhuT)hdo`0J{!Dv$`+%4OkWe)o!`xX4z zReo@#!c|&b3U#2;KSujXnKhgeHoGL{N7RP0OBF&syh$vU!x8A%UQy=2(YKM)6pDCn zmn(2k0Mc)%uFr2nVh3e11TwBDIPnNm>Jcrm8s|b%7k-HV86qA&P--He*=S3zFs!g3 zPFSKs7Nw*g*X?j$C_}rG`LzKfT@T`ysFBIq;imN06z73r7q}wB9xO>mVbt~D3SkZb z_K9GBc6i^?=UltE1)c$Ac*Vl>)2sl2?eudmFbc5*NJc$qiULstdWe;jQTjw-$2 zmIfxW?ryZ2V(Dc9XAgS&can~-@0B~{h`&3Cj!@={_MrSCpdw``Mo9*s81J_mc9&2T znH#CB3xf1PA7rkY(MMo79WWnR7!7rR5UwePWe08uovbXPDEXh)hNs^}&z_`?$ReWcPx!m=IL zBC(EDvNvjvhEP_v2Vks0RP}U+Wx0pUIVMK(KA+#~v#$@u>>jUI?v29isrcW*3rgVv!Y;{C#kH5JLY z&!=MPK^ndRr%M^q2*kb2!c4;`%$r_?Ih$NO6Xc_nMq}=2~c zB5oUH=raxs(@xw-+)|}fg_}tYzT-~9tbd&}MVgBDt$OtQ8MqfWApTnu{IQ!cT+YF4 zdJDR7t27UT;d~6K3o-mH!VTaW>;rNwc2r!39X^*!*W=s3O4!X)(rxhadI>Uqfd}<% z@Y((W?*6;5H^@iu;l7V?JXdXn2g;pzhWVJ8q{pQ_@b3Dv^tJROc!C{`)O@()9J$%__z{j)!9&JtVG;M}o+Z_0twqUP_e};!!D>hhZWAoVpwve^6MR=b5 zZ>-KgD}BbULCA({*;2NQU5AkR*JB%&mCOS#6EEvzGV5a9%*Xs}6>hS6yN}(^9$-7!gX|&pFnfeO${u4s zke*?yX3{g~}$Kfz8cPqRJjpV-gX|6$LtpGyz2XW2iqz0#xX7i=GU zjy=zQi8YSD!b?nJi z9b@mXe)cXq&fa71vk$Ni^&>XGPOy{gW9*1|ik)VkVj1LF_8I$}onv3H^Xzx*-`MZj z1@;H_C3afHBLbA|Mu+==-| zH?QPXyjt4AYj`c6#3%DQK7~)^(|A3f&S&tMct?4NH%gDd`|?ZpUf#=__$=u$_#18K z&C>nS1AI20!{_oAel>5!?xbyeK3~8W@^-$6FGdi-CHz{xlrQ7g@#Xw_zJjmh9^S#d zypzkki+6J$-g8&+)jYs^c#ww>7;X&@^9Yaf7+;I6VAf&Jwhf58*Q-_3u*f6AY>#Dac@V}?`BU8We0D%GP}%k&J3L{d4?pJFQGcLQHsietnPs*riC>juwjzmN zQQd5nXTOs3*>kvmm37V_UhAqs*fw_vBevC-9nkGQ7{H^e-)nC1cwbDN5VhavAFt;l8gNlNKp59O-8V>dPWJ6=H+aL$K zE%Q|2L#pue6yZZ6OP=S81-m`rSWmzcizbJL9+?*?JcJb<77QV43lBLkFHm?0E7?M& zRzzghg@dZIMh0P9`w#@S=#T?*yMiVvGGjY6X_T6DkM? zra&mz9Z8x_yeP#yI%t{RC{9^CvdFFTA^}gtr@)~>*tT$pf^3l?2V!(^R!mp(8A?90 z))Wl|Ly_c8KVGgPc*mlnr0IcPpGSa+o?s{{2V}p;*4P{IgGF&Vp)smnpN&yMoU+a9 z@l)?t4i*h5oHVaT?p6w=`BD5bS|&luI75zlOtU=b#uk;1aVbt2K*!YX17svZrn#Qp zUJtrVPe-SRUmfGEF}}nP!xfZyo8Pd&7cwpMclUSKM15liikrGg7*nSlhn(bgnc11UbA{U6(*4xqL4|YYv_eMUL>$#3Xy_sgid28 z^$PZEDo&+!)QjRENmLeKqNmI6uW&e=E)A-z&>^P|4PJHY=PGrmN{6a-s78lsHK@v= zLpqHrjYfrA$5)|asnD@h=vbUO7N?HIsbO(Ab^e?>KBvx~Q^)MoF*|k4E*-N=$L!KE zyL276bQ&(5hD)d6(rLJK8ZMoNTc_dHX}EP7Zk>i(r!lA(w@$;Y({SrF+&YaaovSLn zMwMQpO0Q9+*QnOHs@8d_)_JMcc|kxm)m|_;uR%KIY8`X6j=4t1T%*fdqtmF-Y1HU6 zYIGVkI*l5gMvYFRMyFA$)2P*H)ao>9bsDugjar>Xtxls>r%^qKMWcZpqRNX{kUFH% zfcvz5PNPxb&}dXRG#ZHZrkB&?sBq{sDs&oyJXdPx9JMv(Yr4Z8Jk|9n*)`%;VD1xH z;x*bZkl3d|=4+LL>qSPRztd6SQ1gnUE`N6nvun7g2&OOwIBJr`WCU&^xX=+uUK7Ke zfSx475xLXc;}6nfOGNgDf}M%-Ixj{rlu{778kM}d$r$j5J?37_Kx4dXjDd?uuFj6zfeAxtIx8E_R0cf(q1usX+yb^>zkrYK6{VM??l6PDfQzC>-_C4c`;6 z`GXK1($WN?RbCVGuk{4vpjS5eLa~UP47~(G-F~kpfcs?<6^5Pz(Ow5^M3?9$k9>VQVwsqy2|0qv4oBT=E@5hnyuja9c^Si|hr_;G9exHZf|EUI3q z3#j7}XK;t?2!y<=Eoe!~P0CTAOUc7g^*D;>r%u@^hFD5u(G zZmy`QbSqgUbrZTAh8b9*VZWz4)~n=U^|&*r90$70^zavuMSa{Y{K2&yG1QF`q+Ci0 z^~yo@WTeLrqxE=Y*x6eBzz~TA&0Tn_3dlzKF-3a8vC$idb(nmz2Shvlo*wi+Yfmhq z+Mb*;1Xep_lfzL#9TK^CXGC6!4%~@HPxZ80?XOxcUM3-bwR*lLp*yg?*H>9xp#e?} zaA|;B11dG3N&~7jK*v+7o~dzY0G46l5Bp$YelQJRPT~C`z7oRu4Ksl>w}>e!{v-S% zHi$aY$N(i_?yglbHZ--gOWEG_;eb?x*Q?c1S-=wwV*Zax(@r(;q5DpVE-LuiF*`RD zUx~oy6!@mlr4yK!vth=p9h*x!Tm^&^H=#Bh8#l)_Agj#*kRahIE$ct8CXG8V|>{((KN}BW9l^RHytr& znsdwx%y*jhoA;VOFn?~^ZyAR3__s{8v|}@cm6qL>QwdcGKTY^`!jXip6GtYNCDtW& zB<@K3BYdHsu{K**S?{#oYkkbR+j`2D0$|T^AqVNjNr0sqtJX4T-Q@P-h=# zXmxy|&UNv9D7zh+HK1ndrN2mNNJS`R6#UfU>?9=cg_&ki2Ka`d2I0*`$`kl~k`pBw z05>5uBej6q0_2O3FGjuu`BK!o4k;O&HK=RTQK)D$uT7Yc;_WzU!TD5_OhY0_oR<<=SNu5ZL0S{{p|yN05`T@YL%tC$ zcQ?}g;ECbN%TflrUfP2e_MwG+sJ9iZ>_gqHsI!%=jX%!5hvOUK``AtKCUzU(+X3H! z{4S&|IJX1oKBNbw4)$=o2@{Ut_%TpBhHnF~jK7B$VIc|NKOd6hgQH#Gr~w>ddt9X3 z<39!VCHU%aIljAuY>*2pz*a!24kSMkaE{%KbSu&( zq|HcMkai&5hqM#vVWdan=l+VCqRFAuj$cNNxFf5*h_=0`YZTgqMz%ta_rULSv{FWq z6YZam_9uA{=;gbF4AcSx;CcWpFaXZ;*#@K=z`EFa-2${ay9@Yzc zFhI7~^fpO?G`@@3ge-u&!^jHmY?R9GnLA)3D3apmv&VM^D;;{NDIcP#XZX)1Y=5t#}j^ zPa}5T`uJhgI*eL}VbzCG^Dt^2M$N;hc^I`0qsC#33F{&6O-Q#QZ9&?Ov;*lrq@75Q z#?MHGq1qAHl{z=$`ghf{{uLir@~~6k15^&<`(bL_jGk_m0?^v`;(gp4@5d8DQhcTO z?UT~jGg1Rqb)IL>Nu>yg-p_so_(kLg;w#xp@!jm@_yKkZ@as7D2K=5*AU}yR9|JxI zpV_4NRw;$;!CAucf~b8SwRfTRG1NZK4&vG&9KQ-oujBYI(s87d;AI4A9$?R)#Ipj! z0rniOynu5rA{{_`zl5B4I0#-8EL(x$0DBAN-a|S8nE3ew=``T;@$>i+dWGDe(g!Mi z;ISVRwzB8J+Y88F1Yd;h4Zuf`-a?t9NbdkXj`SYV`$!+)+(*byBL58e=SW{5omX{g zW-mb>FAGWcvt!Wd2RJ^7FRonB8~|5Is)qVO6&k|zm!R`kkw~vcVXq(HJY+$bGDQp2 z5~Rz1XyLrjVYC|9AY^Ju>;ges)A z(^`P&zJ%k0(2GK=A3Et5?F9|vTXX8A8!?jIh>@%xV`@LFYOAi@XHk1l!^EE|tFVTC z!4F|RjPq}ZHe3n0cSG*o>>SRWj~~FjMB_(TB}zRHtc2+RV6ujTpm+%RtMUE9o=Cd4 zp+!i9uix6!PawVL6c z|5t42fU4#FXg9(~7C>$1Qf-Px5*h<`iBZU^v<+-uYwd%eN*Z|!9J~!m;7#;%>en{4 zHFt~A;yFk#INoek@zcmadZHFQFVTu>8Y7f3>on{&6_$5QlsSqkZzCPURi%7C^eDz9 z_A&BLK$%9Avq*xjp*DIL5{*BD7-&R0Ciomub=pYtZL5}efuoh%Bt5RPDv9q?rI#0 zQ5?sLjQtp&(7wP?%8o+s$4K``+L&ZGq^ZQ+B66Xgc;XhWi(bOIwe~Dy5^P9 zxnGnxrgF0X%BwaTo4)F8Fq2DJ_M3 zum)LEzuHRY&~KEQ)YeM-o<}cG+LkP0kb6ifcuUk449RPXqS zcw#o-Igj4T=sj@&caR@|i`__cr&q?)19;Q)qg)1jhsMEE$OR9fYT+GJ2Ol7c=CoA0 zjxAQbN>&Juk}ly%(nJ0uY>n_7A-|Dz@CvyV9wFopqIrVcBYZ%1!u#Vka`o%O#cbkC6h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/fixtures/fonts/u13079_PyGameMono-8.png b/venv/Lib/site-packages/pygame/tests/fixtures/fonts/u13079_PyGameMono-8.png new file mode 100644 index 0000000000000000000000000000000000000000..911da8a6cf8238dccacdddce217744446e508b6a GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJy$P6T>pSlAi8Q21RLR^9L|NsA&-kg6I$l~*K kaSY*@nVgaSf$dNk1KSM7rD8`d`az04UHx3vIVCg!0CbKQWB>pF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing.xbm b/venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing.xbm new file mode 100644 index 0000000..d334d8d --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing.xbm @@ -0,0 +1,8 @@ +#define resize_white_width 16 +#define resize_white_height 16 +#define resize_white_x_hot 7 +#define resize_white_y_hot 7 +static unsigned char resize_white_bits[] = { + 0xff, 0x03, 0x01, 0x02, 0xfd, 0x03, 0x05, 0x00, 0xf5, 0x0f, 0x15, 0x08, + 0xd5, 0xeb, 0x55, 0xaa, 0x55, 0xaa, 0xd7, 0xab, 0x10, 0xa8, 0xf0, 0xb7, + 0x00, 0xa8, 0xc0, 0x9f, 0x40, 0x80, 0xc0, 0xff}; diff --git a/venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm b/venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm new file mode 100644 index 0000000..f00bc46 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm @@ -0,0 +1,8 @@ +#define resize_white_mask_width 16 +#define resize_white_mask_height 16 +#define resize_white_mask_x_hot 7 +#define resize_white_mask_y_hot 7 +static unsigned char resize_white_mask_bits[] = { + 0xff, 0x03, 0xff, 0x03, 0xff, 0x03, 0x07, 0x00, 0xf7, 0x0f, 0xf7, 0x0f, + 0xf7, 0xef, 0x77, 0xee, 0x77, 0xee, 0xf7, 0xef, 0xf0, 0xef, 0xf0, 0xff, + 0x00, 0xf8, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff}; diff --git a/venv/Lib/site-packages/pygame/tests/font_tags.py b/venv/Lib/site-packages/pygame/tests/font_tags.py new file mode 100644 index 0000000..c660bef --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/font_tags.py @@ -0,0 +1 @@ +__tags__ = [] diff --git a/venv/Lib/site-packages/pygame/tests/font_test.py b/venv/Lib/site-packages/pygame/tests/font_test.py new file mode 100644 index 0000000..9f59807 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/font_test.py @@ -0,0 +1,546 @@ +# -*- coding: utf8 -*- + +import sys +import os +import unittest +import platform + +import pygame +from pygame import font as pygame_font # So font can be replaced with ftfont +from pygame.compat import as_unicode, unicode_, as_bytes, xrange_, filesystem_errors +from pygame.compat import PY_MAJOR_VERSION + +FONTDIR = os.path.join(os.path.dirname (os.path.abspath (__file__)), + 'fixtures', 'fonts') + +UCS_4 = sys.maxunicode > 0xFFFF + +def equal_images(s1, s2): + size = s1.get_size() + if s2.get_size() != size: + return False + w, h = size + for x in xrange_(w): + for y in xrange_(h): + if s1.get_at((x, y)) != s2.get_at((x, y)): + return False + return True + + +IS_PYPY = 'PyPy' == platform.python_implementation() + + +@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO +class FontModuleTest( unittest.TestCase ): + + def setUp(self): + pygame_font.init() + + def tearDown(self): + pygame_font.quit() + + def test_SysFont(self): + # Can only check that a font object is returned. + fonts = pygame_font.get_fonts() + if 'arial' in fonts: + # Try to use arial font if it is there, rather than a random font + # which can be different depending on installed fonts on the system. + font_name = 'arial' + else: + font_name = sorted(fonts)[0] + o = pygame_font.SysFont(font_name, 20) + self.assertTrue(isinstance(o, pygame_font.FontType)) + o = pygame_font.SysFont(font_name, 20, italic=True) + self.assertTrue(isinstance(o, pygame_font.FontType)) + o = pygame_font.SysFont(font_name, 20, bold=True) + self.assertTrue(isinstance(o, pygame_font.FontType)) + o = pygame_font.SysFont('thisisnotafont', 20) + self.assertTrue(isinstance(o, pygame_font.FontType)) + + def test_get_default_font(self): + self.assertEqual(pygame_font.get_default_font(), 'freesansbold.ttf') + + def test_get_fonts_returns_something(self): + fnts = pygame_font.get_fonts() + self.assertTrue(fnts) + + # to test if some files exist... + #def XXtest_has_file_osx_10_5_sdk(self): + # import os + # f = "/Developer/SDKs/MacOSX10.5.sdk/usr/X11/include/ft2build.h" + # self.assertEqual(os.path.exists(f), True) + + #def XXtest_has_file_osx_10_4_sdk(self): + # import os + # f = "/Developer/SDKs/MacOSX10.4u.sdk/usr/X11R6/include/ft2build.h" + # self.assertEqual(os.path.exists(f), True) + + def test_get_fonts(self): + fnts = pygame_font.get_fonts() + + self.assertTrue(fnts, msg=repr(fnts)) + + if (PY_MAJOR_VERSION >= 3): + # For Python 3.x, names will always be unicode strings. + name_types = (str,) + else: + # For Python 2.x, names may be either unicode or ascii strings. + name_types = (str, unicode) + + for name in fnts: + # note, on ubuntu 2.6 they are all unicode strings. + + self.assertTrue(isinstance(name, name_types), name) + # Font names can be comprised of only numeric characters, so + # just checking name.islower() will not work as expected here. + self.assertFalse(any(c.isupper() for c in name)) + self.assertTrue(name.isalnum(), name) + + def test_get_init(self): + self.assertTrue(pygame_font.get_init()) + pygame_font.quit() + self.assertFalse(pygame_font.get_init()) + + def test_init(self): + pygame_font.init() + + def test_match_font_all_exist(self): + fonts = pygame_font.get_fonts() + + # Ensure all listed fonts are in fact available, and the returned file + # name is a full path. + for font in fonts: + path = pygame_font.match_font(font) + self.assertFalse(path is None) + self.assertTrue(os.path.isabs(path)) + + def test_match_font_bold(self): + fonts = pygame_font.get_fonts() + + # Look for a bold font. + self.assertTrue(any(pygame_font.match_font(font, bold=True) + for font in fonts)) + + + def test_match_font_italic(self): + fonts = pygame_font.get_fonts() + + # Look for an italic font. + self.assertTrue(any(pygame_font.match_font(font, italic=True) + for font in fonts)) + + def test_match_font_comma_separated(self): + fonts = pygame_font.get_fonts() + + # Check for not found. + self.assertTrue(pygame_font.match_font('thisisnotafont') is None) + + # Check comma separated list. + names = ','.join(['thisisnotafont', fonts[-1], 'anothernonfont']) + self.assertFalse(pygame_font.match_font(names) is None) + names = ','.join(['thisisnotafont1', 'thisisnotafont2', 'thisisnotafont3']) + self.assertTrue(pygame_font.match_font(names) is None) + + def test_quit(self): + pygame_font.quit() + + +@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO +class FontTest(unittest.TestCase): + + def setUp(self): + pygame_font.init() + + def tearDown(self): + pygame_font.quit() + + def test_render_args(self): + screen = pygame.display.set_mode((600, 400)) + rect = screen.get_rect() + f = pygame_font.Font(None, 20) + screen.fill((10, 10, 10)) + font_surface = f.render(" bar", True, (0, 0, 0), (255, 255, 255)) + font_rect = font_surface.get_rect() + font_rect.topleft = rect.topleft + self.assertTrue(font_surface) + screen.blit(font_surface, font_rect, font_rect) + pygame.display.update() + self.assertEqual(tuple(screen.get_at((0,0)))[:3], (255, 255, 255)) + self.assertEqual(tuple(screen.get_at(font_rect.topleft))[:3], (255, 255, 255)) + + # If we don't have a real display, don't do this test. + # Transparent background doesn't seem to work without a read video card. + if os.environ.get('SDL_VIDEODRIVER') != 'dummy': + screen.fill((10, 10, 10)) + font_surface = f.render(" bar", True, (0, 0, 0), None) + font_rect = font_surface.get_rect() + font_rect.topleft = rect.topleft + self.assertTrue(font_surface) + screen.blit(font_surface, font_rect, font_rect) + pygame.display.update() + self.assertEqual(tuple(screen.get_at((0,0)))[:3], (10, 10, 10)) + self.assertEqual(tuple(screen.get_at(font_rect.topleft))[:3], (10, 10, 10)) + + screen.fill((10, 10, 10)) + font_surface = f.render(" bar", True, (0, 0, 0)) + font_rect = font_surface.get_rect() + font_rect.topleft = rect.topleft + self.assertTrue(font_surface) + screen.blit(font_surface, font_rect, font_rect) + pygame.display.update(rect) + self.assertEqual(tuple(screen.get_at((0,0)))[:3], (10, 10, 10)) + self.assertEqual(tuple(screen.get_at(font_rect.topleft))[:3], (10, 10, 10)) + + + +@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO +class FontTypeTest( unittest.TestCase ): + + def setUp(self): + pygame_font.init() + + def tearDown(self): + pygame_font.quit() + + def test_get_ascent(self): + # Ckecking ascent would need a custom test font to do properly. + f = pygame_font.Font(None, 20) + ascent = f.get_ascent() + self.assertTrue(isinstance(ascent, int)) + self.assertTrue(ascent > 0) + s = f.render("X", False, (255, 255, 255)) + self.assertTrue(s.get_size()[1] > ascent) + + def test_get_descent(self): + # Ckecking descent would need a custom test font to do properly. + f = pygame_font.Font(None, 20) + descent = f.get_descent() + self.assertTrue(isinstance(descent, int)) + self.assertTrue(descent < 0) + + def test_get_height(self): + # Ckecking height would need a custom test font to do properly. + f = pygame_font.Font(None, 20) + height = f.get_height() + self.assertTrue(isinstance(height, int)) + self.assertTrue(height > 0) + s = f.render("X", False, (255, 255, 255)) + self.assertTrue(s.get_size()[1] == height) + + def test_get_linesize(self): + # Ckecking linesize would need a custom test font to do properly. + # Questions: How do linesize, height and descent relate? + f = pygame_font.Font(None, 20) + linesize = f.get_linesize() + self.assertTrue(isinstance(linesize, int)) + self.assertTrue(linesize > 0) + + def test_metrics(self): + # Ensure bytes decoding works correctly. Can only compare results + # with unicode for now. + f = pygame_font.Font(None, 20) + um = f.metrics(as_unicode(".")) + bm = f.metrics(as_bytes(".")) + + self.assertEqual(len(um), 1) + self.assertEqual(len(bm), 1) + self.assertIsNotNone(um[0]) + self.assertEqual(um, bm) + + u = u"\u212A" + b = u.encode("UTF-16")[2:] # Keep byte order consistent. [2:] skips BOM + bm = f.metrics(b) + + self.assertEqual(len(bm), 2) + + try: # FIXME why do we do this try/except ? + um = f.metrics(u) + except pygame.error: + pass + else: + self.assertEqual(len(um), 1) + self.assertNotEqual(bm[0], um[0]) + self.assertNotEqual(bm[1], um[0]) + + if UCS_4: + u = u"\U00013000" + bm = f.metrics(u) + + self.assertEqual(len(bm), 1) + self.assertIsNone(bm[0]) + + return # unfinished + # The documentation is useless here. How large a list? + # How do list positions relate to character codes? + # What about unicode characters? + + # __doc__ (as of 2008-08-02) for pygame_font.Font.metrics: + + # Font.metrics(text): return list + # Gets the metrics for each character in the pased string. + # + # The list contains tuples for each character, which contain the + # minimum X offset, the maximum X offset, the minimum Y offset, the + # maximum Y offset and the advance offset (bearing plus width) of the + # character. [(minx, maxx, miny, maxy, advance), (minx, maxx, miny, + # maxy, advance), ...] + + self.fail() + + def test_render(self): + f = pygame_font.Font(None, 20) + s = f.render("foo", True, [0, 0, 0], [255, 255, 255]) + s = f.render("xxx", True, [0, 0, 0], [255, 255, 255]) + s = f.render("", True, [0, 0, 0], [255, 255, 255]) + s = f.render("foo", False, [0, 0, 0], [255, 255, 255]) + s = f.render("xxx", False, [0, 0, 0], [255, 255, 255]) + s = f.render("xxx", False, [0, 0, 0]) + s = f.render(" ", False, [0, 0, 0]) + s = f.render(" ", False, [0, 0, 0], [255, 255, 255]) + # null text should be 1 pixel wide. + s = f.render("", False, [0, 0, 0], [255, 255, 255]) + self.assertEqual(s.get_size()[0], 1) + # None text should be 1 pixel wide. + s = f.render(None, False, [0, 0, 0], [255, 255, 255]) + self.assertEqual(s.get_size()[0], 1) + # Non-text should raise a TypeError. + self.assertRaises(TypeError, f.render, + [], False, [0, 0, 0], [255, 255, 255]) + self.assertRaises(TypeError, f.render, + 1, False, [0, 0, 0], [255, 255, 255]) + # is background transparent for antialiasing? + s = f.render(".", True, [255, 255, 255]) + self.assertEqual(s.get_at((0, 0))[3], 0) + # is Unicode and bytes encoding correct? + # Cannot really test if the correct characters are rendered, but + # at least can assert the encodings differ. + su = f.render(as_unicode("."), False, [0, 0, 0], [255, 255, 255]) + sb = f.render(as_bytes("."), False, [0, 0, 0], [255, 255, 255]) + self.assertTrue(equal_images(su, sb)) + u = as_unicode(r"\u212A") + b = u.encode("UTF-16")[2:] # Keep byte order consistent. [2:] skips BOM + sb = f.render(b, False, [0, 0, 0], [255, 255, 255]) + try: # FIXME why do we do this try/except ? + su = f.render(u, False, [0, 0, 0], [255, 255, 255]) + except pygame.error: + pass + else: + self.assertFalse(equal_images(su, sb)) + + # If the font module is SDL_ttf based, then it can only supports UCS-2; + # it will raise an exception for an out-of-range UCS-4 code point. + if UCS_4 and not hasattr(f, 'ucs4'): + ucs_2 = as_unicode(r"\uFFEE") + s = f.render(ucs_2, False, [0, 0, 0], [255, 255, 255]) + ucs_4 = as_unicode(r"\U00010000") + self.assertRaises(UnicodeError, f.render, + ucs_4, False, [0, 0, 0], [255, 255, 255]) + + b = as_bytes("ab\x00cd") + self.assertRaises(ValueError, f.render, b, 0, [0, 0, 0]) + u = as_unicode("ab\x00cd") + self.assertRaises(ValueError, f.render, b, 0, [0, 0, 0]) + + def test_set_bold(self): + f = pygame_font.Font(None, 20) + self.assertFalse(f.get_bold()) + f.set_bold(True) + self.assertTrue(f.get_bold()) + f.set_bold(False) + self.assertFalse(f.get_bold()) + + def test_set_italic(self): + f = pygame_font.Font(None, 20) + self.assertFalse(f.get_italic()) + f.set_italic(True) + self.assertTrue(f.get_italic()) + f.set_italic(False) + self.assertFalse(f.get_italic()) + + def test_set_underline(self): + f = pygame_font.Font(None, 20) + self.assertFalse(f.get_underline()) + f.set_underline(True) + self.assertTrue(f.get_underline()) + f.set_underline(False) + self.assertFalse(f.get_underline()) + + def test_size(self): + f = pygame_font.Font(None, 20) + text = as_unicode("Xg") + size = f.size(text) + w, h = size + s = f.render(text, False, (255, 255, 255)) + btext = text.encode("ascii") + + self.assertIsInstance(w, int) + self.assertIsInstance(h, int) + self.assertEqual(s.get_size(), size) + self.assertEqual(f.size(btext), size) + + text = as_unicode(r"\u212A") + btext = text.encode("UTF-16")[2:] # Keep the byte order consistent. + bsize = f.size(btext) + try: # FIXME why do we do this try/except ? + size = f.size(text) + except pygame.error: + pass + else: + self.assertNotEqual(size, bsize) + + def test_font_file_not_found(self): + # A per BUG reported by Bo Jangeborg on pygame-user mailing list, + # http://www.mail-archive.com/pygame-users@seul.org/msg11675.html + + pygame_font.init() + self.assertRaises(IOError, + pygame_font.Font, + unicode_('some-fictional-font.ttf'), 20) + + def test_load_from_file(self): + font_name = pygame_font.get_default_font() + font_path = os.path.join(os.path.split(pygame.__file__)[0], + pygame_font.get_default_font()) + f = pygame_font.Font(font_path, 20) + + def test_load_from_file_obj(self): + font_name = pygame_font.get_default_font() + font_path = os.path.join(os.path.split(pygame.__file__)[0], + pygame_font.get_default_font()) + with open(font_path, "rb") as f: + font = pygame_font.Font(f, 20) + + def test_load_default_font_filename(self): + # In font_init, a special case is when the filename argument is + # identical to the default font file name. + f = pygame_font.Font(pygame_font.get_default_font(), 20) + + def _load_unicode(self, path): + import shutil + fdir = unicode_(FONTDIR) + temp = os.path.join(fdir, path) + pgfont = os.path.join(fdir, u'test_sans.ttf') + shutil.copy(pgfont, temp) + try: + with open(temp, 'rb') as f: + pass + except IOError: + raise unittest.SkipTest('the path cannot be opened') + try: + pygame_font.Font(temp, 20) + finally: + os.remove(temp) + + def test_load_from_file_unicode_0(self): + """ASCII string as a unicode object""" + self._load_unicode(u'temp_file.ttf') + + def test_load_from_file_unicode_1(self): + self._load_unicode(u'你好.ttf') + + def test_load_from_file_bytes(self): + font_path = os.path.join(os.path.split(pygame.__file__)[0], + pygame_font.get_default_font()) + filesystem_encoding = sys.getfilesystemencoding() + try: # FIXME why do we do this try/except ? + font_path = font_path.decode(filesystem_encoding, + filesystem_errors) + except AttributeError: + pass + bfont_path = font_path.encode(filesystem_encoding, + filesystem_errors) + f = pygame_font.Font(bfont_path, 20) + + +@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO +class VisualTests( unittest.TestCase ): + + __tags__ = ['interactive'] + + screen = None + aborted = False + + def setUp(self): + if self.screen is None: + pygame.init() + self.screen = pygame.display.set_mode((600, 200)) + self.screen.fill((255, 255, 255)) + pygame.display.flip() + self.f = pygame_font.Font(None, 32) + + def abort(self): + if self.screen is not None: + pygame.quit() + self.aborted = True + + def query(self, + bold=False, italic=False, underline=False, antialiase=False): + if self.aborted: + return False + spacing = 10 + offset = 20 + y = spacing + f = self.f + screen = self.screen + screen.fill((255, 255, 255)) + pygame.display.flip() + if not (bold or italic or underline or antialiase): + text = "normal" + else: + modes = [] + if bold: + modes.append("bold") + if italic: + modes.append("italic") + if underline: + modes.append("underlined") + if antialiase: + modes.append("antialiased") + text = "%s (y/n):" % ('-'.join(modes),) + f.set_bold(bold) + f.set_italic(italic) + f.set_underline(underline) + s = f.render(text, antialiase, (0, 0, 0)) + screen.blit(s, (offset, y)) + y += s.get_size()[1] + spacing + f.set_bold(False) + f.set_italic(False) + f.set_underline(False) + s = f.render("(some comparison text)", False, (0, 0, 0)) + screen.blit(s, (offset, y)) + pygame.display.flip() + while 1: + for evt in pygame.event.get(): + if evt.type == pygame.KEYDOWN: + if evt.key == pygame.K_ESCAPE: + self.abort() + return False + if evt.key == pygame.K_y: + return True + if evt.key == pygame.K_n: + return False + if evt.type == pygame.QUIT: + self.abort() + return False + + def test_bold(self): + self.assertTrue(self.query(bold=True)) + + def test_italic(self): + self.assertTrue(self.query(italic=True)) + + def test_underline(self): + self.assertTrue(self.query(underline=True)) + + def test_antialiase(self): + self.assertTrue(self.query(antialiase=True)) + + def test_bold_antialiase(self): + self.assertTrue(self.query(bold=True, antialiase=True)) + + def test_italic_underline(self): + self.assertTrue(self.query(italic=True, underline=True)) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/freetype_tags.py b/venv/Lib/site-packages/pygame/tests/freetype_tags.py new file mode 100644 index 0000000..5c56fc3 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/freetype_tags.py @@ -0,0 +1,12 @@ +__tags__ = ['development'] + +exclude = False + +try: + import pygame.freetype +except ImportError: + exclude = True + +if exclude: + __tags__.extend(['ignore', 'subprocess_ignore']) + diff --git a/venv/Lib/site-packages/pygame/tests/freetype_test.py b/venv/Lib/site-packages/pygame/tests/freetype_test.py new file mode 100644 index 0000000..05603ef --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/freetype_test.py @@ -0,0 +1,1554 @@ +import os +if os.environ.get('SDL_VIDEODRIVER') == 'dummy': + __tags__ = ('ignore', 'subprocess_ignore') + +import unittest +import sys +import ctypes +import weakref +import gc +import platform + +IS_PYPY = 'PyPy' == platform.python_implementation() + + +try: + from pygame.tests.test_utils import arrinter +except NameError: + pass + +import pygame +try: + import pygame.freetype as ft +except ImportError: + ft = None +from pygame.compat import as_unicode, bytes_, unichr_, unicode_ + + +FONTDIR = os.path.join(os.path.dirname (os.path.abspath (__file__)), + 'fixtures', 'fonts') + +def nullfont(): + """return an uninitialized font instance""" + return ft.Font.__new__(ft.Font) + +max_point_size_FX6 = 0x7FFFFFFF +max_point_size = max_point_size_FX6 >> 6 +max_point_size_f = max_point_size_FX6 * 0.015625 + +def surf_same_image(a, b): + """Return True if a's pixel buffer is identical to b's""" + + a_sz = a.get_height() * a.get_pitch() + b_sz = b.get_height() * b.get_pitch() + if a_sz != b_sz: + return False + a_bytes = ctypes.string_at(a._pixels_address, a_sz) + b_bytes = ctypes.string_at(b._pixels_address, b_sz) + return a_bytes == b_bytes + + +class FreeTypeFontTest(unittest.TestCase): + + _fixed_path = os.path.join(FONTDIR, 'test_fixed.otf') + _sans_path = os.path.join(FONTDIR, 'test_sans.ttf') + _mono_path = os.path.join(FONTDIR, 'PyGameMono.otf') + _bmp_8_75dpi_path = os.path.join(FONTDIR, 'PyGameMono-8.bdf') + _bmp_18_75dpi_path = os.path.join(FONTDIR, 'PyGameMono-18-75dpi.bdf') + _bmp_18_100dpi_path = os.path.join(FONTDIR, 'PyGameMono-18-100dpi.bdf') + _TEST_FONTS = {} + + @classmethod + def setUpClass(cls): + ft.init() + + # Setup the test fonts. + + # Inconsolata is an open-source font designed by Raph Levien. + # Licensed under the Open Font License. + # http://www.levien.com/type/myfonts/inconsolata.html + cls._TEST_FONTS['fixed'] = ft.Font(cls._fixed_path) + + # Liberation Sans is an open-source font designed by Steve Matteson. + # Licensed under the GNU GPL. + # https://fedorahosted.org/liberation-fonts/ + cls._TEST_FONTS['sans'] = ft.Font(cls._sans_path) + + # A scalable mono test font made for pygame. It contains only + # a few glyphs: '\0', 'A', 'B', 'C', and U+13079. + # It also contains two bitmap sizes: 8.0 X 8.0 and 19.0 X 19.0. + cls._TEST_FONTS['mono'] = ft.Font(cls._mono_path) + + # A fixed size bitmap mono test font made for pygame. + # It contains only a few glyphs: '\0', 'A', 'B', 'C', and U+13079. + # The size is 8.0 X 8.0. + cls._TEST_FONTS['bmp-8-75dpi'] = ft.Font(cls._bmp_8_75dpi_path) + + # A fixed size bitmap mono test font made for pygame. + # It contains only a few glyphs: '\0', 'A', 'B', 'C', and U+13079. + # The size is 8.0 X 8.0. + cls._TEST_FONTS['bmp-18-75dpi'] = ft.Font(cls._bmp_18_75dpi_path) + + # A fixed size bitmap mono test font made for pygame. + # It contains only a few glyphs: '\0', 'A', 'B', 'C', and U+13079. + # The size is 8.0 X 8.0. + cls._TEST_FONTS['bmp-18-100dpi'] = ft.Font(cls._bmp_18_100dpi_path) + + @classmethod + def tearDownClass(cls): + ft.quit() + + def test_freetype_defaultfont(self): + font = ft.Font(None) + self.assertEqual(font.name, "FreeSans") + + def test_freetype_Font_init(self): + + self.assertRaises(IOError, ft.Font, os.path.join (FONTDIR, 'nonexistant.ttf')) + + f = self._TEST_FONTS['sans'] + self.assertIsInstance(f, ft.Font) + + f = self._TEST_FONTS['fixed'] + self.assertIsInstance(f, ft.Font) + + # Test keyword arguments + f = ft.Font(size=22, file=None) + self.assertEqual(f.size, 22) + f = ft.Font(font_index=0, file=None) + self.assertNotEqual(ft.get_default_resolution(), 100) + f = ft.Font(resolution=100, file=None) + self.assertEqual(f.resolution, 100) + f = ft.Font(ucs4=True, file=None) + self.assertTrue(f.ucs4) + self.assertRaises(OverflowError, ft.Font, file=None, + size=(max_point_size + 1)) + self.assertRaises(OverflowError, ft.Font, file=None, size=-1) + + f = ft.Font(None, size=24) + self.assertTrue(f.height > 0) + self.assertRaises(IOError, f.__init__, + os.path.join(FONTDIR, 'nonexistant.ttf')) + + # Test attribute preservation during reinitalization + f = ft.Font(self._sans_path, size=24, ucs4=True) + self.assertEqual(f.name, 'Liberation Sans') + self.assertTrue(f.scalable) + self.assertFalse(f.fixed_width) + self.assertTrue(f.antialiased) + self.assertFalse(f.oblique) + self.assertTrue(f.ucs4) + f.antialiased = False + f.oblique = True + f.__init__(self._mono_path) + self.assertEqual(f.name, 'PyGameMono') + self.assertTrue(f.scalable) + self.assertTrue(f.fixed_width) + self.assertFalse(f.antialiased) + self.assertTrue(f.oblique) + self.assertTrue(f.ucs4) + + # For a bitmap font, the size is automatically set to the first + # size in the available sizes list. + f = ft.Font(self._bmp_8_75dpi_path) + sizes = f.get_sizes() + self.assertEqual(len(sizes), 1) + size_pt, width_px, height_px, x_ppem, y_ppem = sizes[0] + self.assertEqual(f.size, (x_ppem, y_ppem)) + f.__init__(self._bmp_8_75dpi_path, size=12) + self.assertEqual(f.size, 12.0) + + @unittest.skipIf(IS_PYPY, "PyPy doesn't use refcounting") + def test_freetype_Font_dealloc(self): + import sys + handle = open(self._sans_path, 'rb') + + def load_font(): + tempFont = ft.Font(handle) + + try: + load_font() + + self.assertEqual(sys.getrefcount(handle), 2) + finally: + # Ensures file is closed even if test fails. + handle.close() + + def test_freetype_Font_scalable(self): + + f = self._TEST_FONTS['sans'] + self.assertTrue(f.scalable) + + self.assertRaises(RuntimeError, lambda : nullfont().scalable) + + def test_freetype_Font_fixed_width(self): + + f = self._TEST_FONTS['sans'] + self.assertFalse(f.fixed_width) + + f = self._TEST_FONTS['mono'] + self.assertTrue(f.fixed_width) + + self.assertRaises(RuntimeError, lambda : nullfont().fixed_width) + + def test_freetype_Font_fixed_sizes(self): + + f = self._TEST_FONTS['sans'] + self.assertEqual(f.fixed_sizes, 0) + f = self._TEST_FONTS['bmp-8-75dpi'] + self.assertEqual(f.fixed_sizes, 1) + f = self._TEST_FONTS['mono'] + self.assertEqual(f.fixed_sizes, 2) + + def test_freetype_Font_get_sizes(self): + f = self._TEST_FONTS['sans'] + szlist = f.get_sizes() + self.assertIsInstance(szlist, list) + self.assertEqual(len(szlist), 0) + + f = self._TEST_FONTS['bmp-8-75dpi'] + szlist = f.get_sizes() + self.assertIsInstance(szlist, list) + self.assertEqual(len(szlist), 1) + + size8 = szlist[0] + self.assertIsInstance(size8[0], int) + self.assertEqual(size8[0], 8) + self.assertIsInstance(size8[1], int) + self.assertIsInstance(size8[2], int) + self.assertIsInstance(size8[3], float) + self.assertEqual(int(size8[3] * 64.0 + 0.5), 8 * 64) + self.assertIsInstance(size8[4], float) + self.assertEqual(int(size8[4] * 64.0 + 0.5), 8 * 64) + + f = self._TEST_FONTS['mono'] + szlist = f.get_sizes() + self.assertIsInstance(szlist, list) + self.assertEqual(len(szlist), 2) + + size8 = szlist[0] + self.assertEqual(size8[3], 8) + self.assertEqual(int(size8[3] * 64.0 + 0.5), 8 * 64) + self.assertEqual(int(size8[4] * 64.0 + 0.5), 8 * 64) + + size19 = szlist[1] + self.assertEqual(size19[3], 19) + self.assertEqual(int(size19[3] * 64.0 + 0.5), 19 * 64) + self.assertEqual(int(size19[4] * 64.0 + 0.5), 19 * 64) + + def test_freetype_Font_use_bitmap_strikes(self): + f = self._TEST_FONTS['mono'] + try: + # use_bitmap_strikes == True + # + self.assertTrue(f.use_bitmap_strikes) + + # bitmap compatible properties + s_strike, sz = f.render_raw('A', size=19) + try: + f.vertical = True + s_strike_vert, sz = f.render_raw('A', size=19) + finally: + f.vertical = False + try: + f.wide = True + s_strike_wide, sz = f.render_raw('A', size=19) + finally: + f.wide = False + try: + f.underline = True + s_strike_underline, sz = f.render_raw('A', size=19) + finally: + f.underline = False + + # bitmap incompatible properties + s_strike_rot45, sz = f.render_raw('A', size=19, rotation=45) + try: + f.strong = True + s_strike_strong, sz = f.render_raw('A', size=19) + finally: + f.strong = False + try: + f.oblique = True + s_strike_oblique, sz = f.render_raw('A', size=19) + finally: + f.oblique = False + + # compare with use_bitmap_strikes == False + # + f.use_bitmap_strikes = False + self.assertFalse(f.use_bitmap_strikes) + + # bitmap compatible properties + s_outline, sz = f.render_raw('A', size=19) + self.assertNotEqual(s_outline, s_strike) + try: + f.vertical = True + s_outline, sz = f.render_raw('A', size=19) + self.assertNotEqual(s_outline, s_strike_vert) + finally: + f.vertical = False + try: + f.wide = True + s_outline, sz = f.render_raw('A', size=19) + self.assertNotEqual(s_outline, s_strike_wide) + finally: + f.wide = False + try: + f.underline = True + s_outline, sz = f.render_raw('A', size=19) + self.assertNotEqual(s_outline, s_strike_underline) + finally: + f.underline = False + + # bitmap incompatible properties + s_outline, sz = f.render_raw('A', size=19, rotation=45) + self.assertEqual(s_outline, s_strike_rot45) + try: + f.strong = True + s_outline, sz = f.render_raw('A', size=19) + self.assertEqual(s_outline, s_strike_strong) + finally: + f.strong = False + try: + f.oblique = True + s_outline, sz = f.render_raw('A', size=19) + self.assertEqual(s_outline, s_strike_oblique) + finally: + f.oblique = False + finally: + f.use_bitmap_strikes = True + + def test_freetype_Font_bitmap_files(self): + """Ensure bitmap file restrictions are caught""" + f = self._TEST_FONTS['bmp-8-75dpi'] + f_null = nullfont() + s = pygame.Surface((10, 10), 0, 32) + a = s.get_view('3') + + exception = AttributeError + self.assertRaises(exception, setattr, f, 'strong', True) + self.assertRaises(exception, setattr, f, 'oblique', True) + self.assertRaises(exception, setattr, f, 'style', ft.STYLE_STRONG) + self.assertRaises(exception, setattr, f, 'style', ft.STYLE_OBLIQUE) + exception = RuntimeError + self.assertRaises(exception, setattr, f_null, 'strong', True) + self.assertRaises(exception, setattr, f_null, 'oblique', True) + self.assertRaises(exception, setattr, f_null, 'style', ft.STYLE_STRONG) + self.assertRaises(exception, setattr, f_null, 'style', ft.STYLE_OBLIQUE) + exception = ValueError + self.assertRaises(exception, f.render, + 'A', (0, 0, 0), size=8, rotation=1) + self.assertRaises(exception, f.render, + 'A', (0, 0, 0), size=8, style=ft.STYLE_OBLIQUE) + self.assertRaises(exception, f.render, + 'A', (0, 0, 0), size=8, style=ft.STYLE_STRONG) + self.assertRaises(exception, f.render_raw, 'A', size=8, rotation=1) + self.assertRaises(exception, f.render_raw, + 'A', size=8, style=ft.STYLE_OBLIQUE) + self.assertRaises(exception, f.render_raw, + 'A', size=8, style=ft.STYLE_STRONG) + self.assertRaises(exception, f.render_to, + s, (0, 0), 'A', (0, 0, 0), size=8, rotation=1) + self.assertRaises(exception, f.render_to, + s, (0, 0), 'A', (0, 0, 0), size=8, + style=ft.STYLE_OBLIQUE) + self.assertRaises(exception, f.render_to, + s, (0, 0), 'A', (0, 0, 0), size=8, + style=ft.STYLE_STRONG) + self.assertRaises(exception, f.render_raw_to, + a, 'A', size=8, rotation=1) + self.assertRaises(exception, f.render_raw_to, + a, 'A', size=8, style=ft.STYLE_OBLIQUE) + self.assertRaises(exception, f.render_raw_to, + a, 'A', size=8, style=ft.STYLE_STRONG) + self.assertRaises(exception, f.get_rect, 'A', size=8, rotation=1) + self.assertRaises(exception, f.get_rect, + 'A', size=8, style=ft.STYLE_OBLIQUE) + self.assertRaises(exception, f.get_rect, + 'A', size=8, style=ft.STYLE_STRONG) + + # Unsupported point size + exception = pygame.error + self.assertRaises(exception, f.get_rect, 'A', size=42) + self.assertRaises(exception, f.get_metrics, 'A', size=42) + self.assertRaises(exception, f.get_sized_ascender, 42) + self.assertRaises(exception, f.get_sized_descender, 42) + self.assertRaises(exception, f.get_sized_height, 42) + self.assertRaises(exception, f.get_sized_glyph_height, 42) + + def test_freetype_Font_get_metrics(self): + + font = self._TEST_FONTS['sans'] + + metrics = font.get_metrics('ABCD', size=24) + self.assertEqual(len(metrics), len('ABCD')) + self.assertIsInstance(metrics, list) + + for metrics_tuple in metrics: + self.assertIsInstance(metrics_tuple, tuple, metrics_tuple) + self.assertEqual(len(metrics_tuple), 6) + + for m in metrics_tuple[:4]: + self.assertIsInstance(m, int) + + for m in metrics_tuple[4:]: + self.assertIsInstance(m, float) + + # test for empty string + metrics = font.get_metrics('', size=24) + self.assertEqual(metrics, []) + + # test for invalid string + self.assertRaises(TypeError, font.get_metrics, 24, 24) + + # raises exception when uninitalized + self.assertRaises(RuntimeError, nullfont().get_metrics, + 'a', size=24) + + def test_freetype_Font_get_rect(self): + + font = self._TEST_FONTS['sans'] + + def test_rect(r): + self.assertIsInstance(r, pygame.Rect) + + rect_default = font.get_rect("ABCDabcd", size=24) + test_rect(rect_default) + self.assertTrue(rect_default.size > (0, 0)) + self.assertTrue(rect_default.width > rect_default.height) + + rect_bigger = font.get_rect("ABCDabcd", size=32) + test_rect(rect_bigger) + self.assertTrue(rect_bigger.size > rect_default.size) + + rect_strong = font.get_rect("ABCDabcd", size=24, style=ft.STYLE_STRONG) + test_rect(rect_strong) + self.assertTrue(rect_strong.size > rect_default.size) + + font.vertical = True + rect_vert = font.get_rect("ABCDabcd", size=24) + test_rect(rect_vert) + self.assertTrue(rect_vert.width < rect_vert.height) + font.vertical = False + + rect_oblique = font.get_rect("ABCDabcd", size=24, style=ft.STYLE_OBLIQUE) + test_rect(rect_oblique) + self.assertTrue(rect_oblique.width > rect_default.width) + self.assertTrue(rect_oblique.height == rect_default.height) + + rect_under = font.get_rect("ABCDabcd", size=24, style=ft.STYLE_UNDERLINE) + test_rect(rect_under) + self.assertTrue(rect_under.width == rect_default.width) + self.assertTrue(rect_under.height > rect_default.height) + + # Rect size should change if UTF surrogate pairs are treated as + # one code point or two. + ufont = self._TEST_FONTS['mono'] + rect_utf32 = ufont.get_rect(as_unicode(r'\U00013079'), size=24) + rect_utf16 = ufont.get_rect(as_unicode(r'\uD80C\uDC79'), size=24) + self.assertEqual(rect_utf16, rect_utf32); + ufont.ucs4 = True + try: + rect_utf16 = ufont.get_rect(as_unicode(r'\uD80C\uDC79'), size=24) + finally: + ufont.ucs4 = False + self.assertNotEqual(rect_utf16, rect_utf32); + + self.assertRaises(RuntimeError, + nullfont().get_rect, 'a', size=24) + + # text stretching + rect12 = font.get_rect('A', size=12.0) + rect24 = font.get_rect('A', size=24.0) + rect_x = font.get_rect('A', size=(24.0, 12.0)) + self.assertEqual(rect_x.width, rect24.width) + self.assertEqual(rect_x.height, rect12.height) + rect_y = font.get_rect('A', size=(12.0, 24.0)) + self.assertEqual(rect_y.width, rect12.width) + self.assertEqual(rect_y.height, rect24.height) + + def test_freetype_Font_height(self): + + f = self._TEST_FONTS['sans'] + self.assertEqual(f.height, 2355) + + f = self._TEST_FONTS['fixed'] + self.assertEqual(f.height, 1100) + + self.assertRaises(RuntimeError, lambda : nullfont().height) + + + def test_freetype_Font_name(self): + + f = self._TEST_FONTS['sans'] + self.assertEqual(f.name, 'Liberation Sans') + + f = self._TEST_FONTS['fixed'] + self.assertEqual(f.name, 'Inconsolata') + + nf = nullfont() + self.assertEqual(nf.name, repr(nf)) + + def test_freetype_Font_size(self): + + f = ft.Font(None, size=12) + self.assertEqual(f.size, 12) + f.size = 22 + self.assertEqual(f.size, 22) + f.size = 0 + self.assertEqual(f.size, 0) + f.size = max_point_size + self.assertEqual(f.size, max_point_size) + f.size = 6.5 + self.assertEqual(f.size, 6.5) + f.size = max_point_size_f + self.assertEqual(f.size, max_point_size_f) + self.assertRaises(OverflowError, setattr, f, 'size', -1) + self.assertRaises(OverflowError, setattr, f, 'size', + (max_point_size + 1)) + + f.size = 24.0, 0 + size = f.size + self.assertIsInstance(size, float) + self.assertEqual(size, 24.0) + + f.size = 16, 16 + size = f.size + self.assertIsInstance(size, tuple) + self.assertEqual(len(size), 2) + + x, y = size + self.assertIsInstance(x, float) + self.assertEqual(x, 16.0) + self.assertIsInstance(y, float) + self.assertEqual(y, 16.0) + + f.size = 20.5, 22.25 + x, y = f.size + self.assertEqual(x, 20.5) + self.assertEqual(y, 22.25) + + f.size = 0, 0 + size = f.size + self.assertIsInstance(size, float) + self.assertEqual(size, 0.0) + self.assertRaises(ValueError, setattr, f, 'size', (0, 24.0)) + self.assertRaises(TypeError, setattr, f, 'size', (24.0,)) + self.assertRaises(TypeError, setattr, f, 'size', (24.0, 0, 0)) + self.assertRaises(TypeError, setattr, f, 'size', (24.0j, 24.0)) + self.assertRaises(TypeError, setattr, f, 'size', (24.0, 24.0j)) + self.assertRaises(OverflowError, setattr, f, 'size', (-1, 16)) + self.assertRaises(OverflowError, setattr, f, 'size', + (max_point_size + 1, 16)) + self.assertRaises(OverflowError, setattr, f, 'size', (16, -1)) + self.assertRaises(OverflowError, setattr, f, 'size', + (16, max_point_size + 1)) + + # bitmap files with identical point size but differing ppems. + f75 = self._TEST_FONTS['bmp-18-75dpi'] + sizes = f75.get_sizes() + self.assertEqual(len(sizes), 1) + size_pt, width_px, height_px, x_ppem, y_ppem = sizes[0] + self.assertEqual(size_pt, 18) + self.assertEqual(x_ppem, 19.0) + self.assertEqual(y_ppem, 19.0) + rect = f75.get_rect('A', size=18) + rect = f75.get_rect('A', size=19) + rect = f75.get_rect('A', size=(19.0, 19.0)) + self.assertRaises(pygame.error, f75.get_rect, 'A', size=17) + f100 = self._TEST_FONTS['bmp-18-100dpi'] + sizes = f100.get_sizes() + self.assertEqual(len(sizes), 1) + size_pt, width_px, height_px, x_ppem, y_ppem = sizes[0] + self.assertEqual(size_pt, 18) + self.assertEqual(x_ppem, 25.0) + self.assertEqual(y_ppem, 25.0) + rect = f100.get_rect('A', size=18) + rect = f100.get_rect('A', size=25) + rect = f100.get_rect('A', size=(25.0, 25.0)) + self.assertRaises(pygame.error, f100.get_rect, 'A', size=17) + + def test_freetype_Font_rotation(self): + + test_angles = [(30, 30), + (360, 0), (390, 30), + (720, 0), (764, 44), + (-30, 330), + (-360, 0), (-390, 330), + (-720, 0), (-764, 316)] + + f = ft.Font(None) + self.assertEqual(f.rotation, 0) + for r, r_reduced in test_angles: + f.rotation = r + self.assertEqual(f.rotation, r_reduced, + "for angle %d: %d != %d" % + (r, f.rotation, r_reduced)) + self.assertRaises(TypeError, setattr, f, 'rotation', '12') + + def test_freetype_Font_render_to(self): + # Rendering to an existing target surface is equivalent to + # blitting a surface returned by Font.render with the target. + font = self._TEST_FONTS['sans'] + + surf = pygame.Surface((800, 600)) + color = pygame.Color(0, 0, 0) + + rrect = font.render_to(surf, (32, 32), + 'FoobarBaz', color, None, size=24) + self.assertIsInstance(rrect, pygame.Rect) + self.assertEqual(rrect.top, rrect.height) + ## self.assertEqual(rrect.left, something or other) + + rcopy = rrect.copy() + rcopy.topleft = (32, 32) + self.assertTrue(surf.get_rect().contains(rcopy)) + + rect = pygame.Rect(20, 20, 2, 2) + rrect = font.render_to(surf, rect, 'FoobarBax', color, None, size=24) + self.assertEqual(rrect.top, rrect.height) + self.assertNotEqual(rrect.size, rect.size) + rrect = font.render_to(surf, (20.1, 18.9), 'FoobarBax', + color, None, size=24) + ## self.assertEqual(tuple(rend[1].topleft), (20, 18)) + + rrect = font.render_to(surf, rect, '', color, None, size=24) + self.assertFalse(rrect) + self.assertEqual(rrect.height, font.get_sized_height(24)) + + # invalid surf test + self.assertRaises(TypeError, font.render_to, + "not a surface", "text", color) + self.assertRaises(TypeError, font.render_to, + pygame.Surface, "text", color) + + # invalid dest test + for dest in [None, 0, 'a', 'ab', + (), (1,), ('a', 2), (1, 'a'), (1+2j, 2), (1, 1+2j), + (1, int), (int, 1)]: + self.assertRaises(TypeError, font.render, + surf, dest, 'foobar', color, size=24) + + # misc parameter test + self.assertRaises(ValueError, font.render_to, surf, (0, 0), + 'foobar', color) + self.assertRaises(TypeError, font.render_to, surf, (0, 0), + 'foobar', color, "", size=24) + self.assertRaises(ValueError, font.render_to, surf, (0, 0), + 'foobar', color, None, style=42, size=24) + self.assertRaises(TypeError, font.render_to, surf, (0, 0), + 'foobar', color, None, style=None, size=24) + self.assertRaises(ValueError, font.render_to, surf, (0, 0), + 'foobar', color, None, style=97, size=24) + + def test_freetype_Font_render(self): + + font = self._TEST_FONTS['sans'] + + surf = pygame.Surface((800, 600)) + color = pygame.Color(0, 0, 0) + + rend = font.render('FoobarBaz', pygame.Color(0, 0, 0), None, size=24) + self.assertIsInstance(rend, tuple) + self.assertEqual(len(rend), 2) + self.assertIsInstance(rend[0], pygame.Surface) + self.assertIsInstance(rend[1], pygame.Rect) + self.assertEqual(rend[0].get_rect().size, rend[1].size) + + s, r = font.render('', pygame.Color(0, 0, 0), None, size=24) + self.assertEqual(r.width, 1) + self.assertEqual(r.height, font.get_sized_height(24)) + self.assertEqual(s.get_size(), r.size) + self.assertEqual(s.get_bitsize(), 32) + + # misc parameter test + self.assertRaises(ValueError, font.render, 'foobar', color) + self.assertRaises(TypeError, font.render, 'foobar', color, "", + size=24) + self.assertRaises(ValueError, font.render, 'foobar', color, None, + style=42, size=24) + self.assertRaises(TypeError, font.render, 'foobar', color, None, + style=None, size=24) + self.assertRaises(ValueError, font.render, 'foobar', color, None, + style=97, size=24) + + # valid surrogate pairs + font2 = self._TEST_FONTS['mono'] + ucs4 = font2.ucs4 + try: + font2.ucs4 = False + rend1 = font2.render(as_unicode(r'\uD80C\uDC79'), color, size=24) + rend2 = font2.render(as_unicode(r'\U00013079'), color, size=24) + self.assertEqual(rend1[1], rend2[1]) + font2.ucs4 = True + rend1 = font2.render(as_unicode(r'\uD80C\uDC79'), color, size=24) + self.assertNotEqual(rend1[1], rend2[1]) + finally: + font2.ucs4 = ucs4 + + # malformed surrogate pairs + self.assertRaises(UnicodeEncodeError, font.render, + as_unicode(r'\uD80C'), color, size=24) + self.assertRaises(UnicodeEncodeError, font.render, + as_unicode(r'\uDCA7'), color, size=24) + self.assertRaises(UnicodeEncodeError, font.render, + as_unicode(r'\uD7FF\uDCA7'), color, size=24) + self.assertRaises(UnicodeEncodeError, font.render, + as_unicode(r'\uDC00\uDCA7'), color, size=24) + self.assertRaises(UnicodeEncodeError, font.render, + as_unicode(r'\uD80C\uDBFF'), color, size=24) + self.assertRaises(UnicodeEncodeError, font.render, + as_unicode(r'\uD80C\uE000'), color, size=24) + + # raises exception when uninitalized + self.assertRaises(RuntimeError, nullfont().render, + 'a', (0, 0, 0), size=24) + + # Confirm the correct glpyhs are returned for a couple of + # unicode code points, 'A' and '\U00023079'. For each code point + # the rendered glyph is compared with an image of glyph bitmap + # as exported by FontForge. + path = os.path.join(FONTDIR, 'A_PyGameMono-8.png') + A = pygame.image.load(path) + path = os.path.join(FONTDIR, 'u13079_PyGameMono-8.png') + u13079 = pygame.image.load(path) + + font = self._TEST_FONTS['mono'] + font.ucs4 = False + A_rendered, r = font.render('A', bgcolor=pygame.Color('white'), size=8) + u13079_rendered, r = font.render(as_unicode(r'\U00013079'), + bgcolor=pygame.Color('white'), size=8) + + ## before comparing the surfaces, make sure they are the same + ## pixel format. Use 32-bit SRCALPHA to avoid row padding and + ## undefined bytes (the alpha byte will be set to 255.) + bitmap = pygame.Surface(A.get_size(), pygame.SRCALPHA, 32) + bitmap.blit(A, (0, 0)) + rendering = pygame.Surface(A_rendered.get_size(), pygame.SRCALPHA, 32) + rendering.blit(A_rendered, (0, 0)) + self.assertTrue(surf_same_image(rendering, bitmap)) + bitmap = pygame.Surface(u13079.get_size(), pygame.SRCALPHA, 32) + bitmap.blit(u13079, (0, 0)) + rendering = pygame.Surface(u13079_rendered.get_size(), + pygame.SRCALPHA, 32) + rendering.blit(u13079_rendered, (0, 0)) + self.assertTrue(surf_same_image(rendering, bitmap)) + + def test_freetype_Font_render_mono(self): + font = self._TEST_FONTS['sans'] + color = pygame.Color('black') + colorkey = pygame.Color('white') + text = "." + + save_antialiased = font.antialiased + font.antialiased = False + try: + surf, r = font.render(text, color, size=24) + self.assertEqual(surf.get_bitsize(), 8) + flags = surf.get_flags() + self.assertTrue(flags & pygame.SRCCOLORKEY) + self.assertFalse(flags & (pygame.SRCALPHA | pygame.HWSURFACE)) + self.assertEqual(surf.get_colorkey(), colorkey) + self.assertIsNone(surf.get_alpha()) + + translucent_color = pygame.Color(*color) + translucent_color.a = 55 + surf, r = font.render(text, translucent_color, size=24) + self.assertEqual(surf.get_bitsize(), 8) + flags = surf.get_flags() + self.assertTrue(flags & (pygame.SRCCOLORKEY | pygame.SRCALPHA)) + self.assertFalse(flags & pygame.HWSURFACE) + self.assertEqual(surf.get_colorkey(), colorkey) + self.assertEqual(surf.get_alpha(), translucent_color.a) + + surf, r = font.render(text, color, colorkey, size=24) + self.assertEqual(surf.get_bitsize(), 32) + finally: + font.antialiased = save_antialiased + + @unittest.skipIf(pygame.get_sdl_version()[0] == 2, "skipping due to blending issue (#864)") + def test_freetype_Font_render_to_mono(self): + # Blitting is done in two stages. First the target is alpha filled + # with the background color, if any. Second, the foreground + # color is alpha blitted to the background. + font = self._TEST_FONTS['sans'] + text = " ." + rect = font.get_rect(text, size=24) + size = rect.size + fg = pygame.Surface((1, 1), pygame.SRCALPHA, 32) + bg = pygame.Surface((1, 1), pygame.SRCALPHA, 32) + surrogate = pygame.Surface((1, 1), pygame.SRCALPHA, 32) + surfaces = [pygame.Surface(size, 0, 8), + pygame.Surface(size, 0, 16), + pygame.Surface(size, pygame.SRCALPHA, 16), + pygame.Surface(size, 0, 24), + pygame.Surface(size, 0, 32), + pygame.Surface(size, pygame.SRCALPHA, 32)] + fg_colors = [ + surfaces[0].get_palette_at(2), + surfaces[1].unmap_rgb(surfaces[1].map_rgb((128, 64, 200))), + surfaces[2].unmap_rgb(surfaces[2].map_rgb((99, 0, 100, 64))), + (128, 97, 213), + (128, 97, 213), + (128, 97, 213, 60)] + fg_colors = [pygame.Color(*c) for c in fg_colors] + self.assertEqual(len(surfaces), len(fg_colors)) # integrity check + bg_colors = [ + surfaces[0].get_palette_at(4), + surfaces[1].unmap_rgb(surfaces[1].map_rgb((220, 20, 99))), + surfaces[2].unmap_rgb(surfaces[2].map_rgb((55, 200, 0, 86))), + (255, 120, 13), + (255, 120, 13), + (255, 120, 13, 180)] + bg_colors = [pygame.Color(*c) for c in bg_colors] + self.assertEqual(len(surfaces), len(bg_colors)) # integrity check + + save_antialiased = font.antialiased + font.antialiased = False + try: + fill_color = pygame.Color('black') + for i, surf in enumerate(surfaces): + surf.fill(fill_color) + fg_color = fg_colors[i] + fg.set_at((0, 0), fg_color) + surf.blit(fg, (0, 0)) + r_fg_color = surf.get_at((0, 0)) + surf.set_at((0, 0), fill_color) + rrect = font.render_to(surf, (0, 0), text, fg_color, + size=24) + bottomleft = 0, rrect.height - 1 + self.assertEqual(surf.get_at(bottomleft), fill_color, + "Position: {}. Depth: {}." + " fg_color: {}.".format(bottomleft, + surf.get_bitsize(), fg_color)) + bottomright = rrect.width - 1, rrect.height - 1 + self.assertEqual(surf.get_at(bottomright), r_fg_color, + "Position: {}. Depth: {}." + " fg_color: {}.".format(bottomright, + surf.get_bitsize(), fg_color)) + for i, surf in enumerate(surfaces): + surf.fill(fill_color) + fg_color = fg_colors[i] + bg_color = bg_colors[i] + bg.set_at((0, 0), bg_color) + fg.set_at((0, 0), fg_color) + if surf.get_bitsize() == 24: + # For a 24 bit target surface test against Pygame's alpha + # blit as there appears to be a problem with SDL's alpha + # blit: + # + # self.assertEqual(surf.get_at(bottomright), r_fg_color) + # + # raises + # + # AssertionError: (128, 97, 213, 255) != (129, 98, 213, 255) + # + surrogate.set_at((0, 0), fill_color) + surrogate.blit(bg, (0, 0)) + r_bg_color = surrogate.get_at((0, 0)) + surrogate.blit(fg, (0, 0)) + r_fg_color = surrogate.get_at((0, 0)) + else: + # Surface blit values for comparison. + surf.blit(bg, (0, 0)) + r_bg_color = surf.get_at((0, 0)) + surf.blit(fg, (0, 0)) + r_fg_color = surf.get_at((0, 0)) + surf.set_at((0, 0), fill_color) + rrect = font.render_to(surf, (0, 0), text, fg_color, + bg_color, size=24) + bottomleft = 0, rrect.height - 1 + self.assertEqual(surf.get_at(bottomleft), r_bg_color) + bottomright = rrect.width - 1, rrect.height - 1 + self.assertEqual(surf.get_at(bottomright), r_fg_color) + finally: + font.antialiased = save_antialiased + + def test_freetype_Font_render_raw(self): + + font = self._TEST_FONTS['sans'] + + text = "abc" + size = font.get_rect(text, size=24).size + rend = font.render_raw(text, size=24) + self.assertIsInstance(rend, tuple) + self.assertEqual(len(rend), 2) + + r, s = rend + self.assertIsInstance(r, bytes_) + self.assertIsInstance(s, tuple) + self.assertTrue(len(s), 2) + + w, h = s + self.assertIsInstance(w, int) + self.assertIsInstance(h, int) + self.assertEqual(s, size) + self.assertEqual(len(r), w * h) + + r, (w, h) = font.render_raw('', size=24) + self.assertEqual(w, 0) + self.assertEqual(h, font.height) + self.assertEqual(len(r), 0) + + # bug with decenders: this would crash + rend = font.render_raw('render_raw', size=24) + + # bug with non-printable characters: this would cause a crash + # because the text length was not adjusted for skipped characters. + text = unicode_("").join([unichr_(i) for i in range(31, 64)]) + rend = font.render_raw(text, size=10) + + def test_freetype_Font_render_raw_to(self): + + # This only checks that blits do not crash. It needs to check: + # - int values + # - invert option + # + + font = self._TEST_FONTS['sans'] + text = "abc" + + # No frills antialiased render to int1 (__render_glyph_INT) + srect = font.get_rect(text, size=24) + surf = pygame.Surface(srect.size, 0, 8) + rrect = font.render_raw_to(surf.get_view('2'), text, size=24) + self.assertEqual(rrect, srect) + + for bpp in [24, 32]: + surf = pygame.Surface(srect.size, 0, bpp) + rrect = font.render_raw_to(surf.get_view('r'), text, size=24) + self.assertEqual(rrect, srect) + + # Underlining to int1 (__fill_glyph_INT) + srect = font.get_rect(text, size=24, style=ft.STYLE_UNDERLINE) + surf = pygame.Surface(srect.size, 0, 8) + rrect = font.render_raw_to(surf.get_view('2'), text, size=24, + style=ft.STYLE_UNDERLINE) + self.assertEqual(rrect, srect) + + for bpp in [24, 32]: + surf = pygame.Surface(srect.size, 0, bpp) + rrect = font.render_raw_to(surf.get_view('r'), text, size=24, + style=ft.STYLE_UNDERLINE) + self.assertEqual(rrect, srect) + + # Unaliased (mono) rendering to int1 (__render_glyph_MONO_as_INT) + font.antialiased = False + try: + srect = font.get_rect(text, size=24) + surf = pygame.Surface(srect.size, 0, 8) + rrect = font.render_raw_to(surf.get_view('2'), text, size=24) + self.assertEqual(rrect, srect) + + for bpp in [24, 32]: + surf = pygame.Surface(srect.size, 0, bpp) + rrect = font.render_raw_to(surf.get_view('r'), text, size=24) + self.assertEqual(rrect, srect) + finally: + font.antialiased = True + + # Antialiased render to ints sized greater than 1 byte + # (__render_glyph_INT) + srect = font.get_rect(text, size=24) + + for bpp in [16, 24, 32]: + surf = pygame.Surface(srect.size, 0, bpp) + rrect = font.render_raw_to(surf.get_view('2'), text, size=24) + self.assertEqual(rrect, srect) + + # Underline render to ints sized greater than 1 byte + # (__fill_glyph_INT) + srect = font.get_rect(text, size=24, style=ft.STYLE_UNDERLINE) + + for bpp in [16, 24, 32]: + surf = pygame.Surface(srect.size, 0, bpp) + rrect = font.render_raw_to(surf.get_view('2'), text, size=24, + style=ft.STYLE_UNDERLINE) + self.assertEqual(rrect, srect) + + # Unaliased (mono) rendering to ints greater than 1 byte + # (__render_glyph_MONO_as_INT) + font.antialiased = False + try: + srect = font.get_rect(text, size=24) + + for bpp in [16, 24, 32]: + surf = pygame.Surface(srect.size, 0, bpp) + rrect = font.render_raw_to(surf.get_view('2'), + text, size=24) + self.assertEqual(rrect, srect) + finally: + font.antialiased = True + + def test_freetype_Font_text_is_None(self): + f = ft.Font(self._sans_path, 36) + f.style = ft.STYLE_NORMAL + f.rotation = 0 + text = 'ABCD' + + # reference values + get_rect = f.get_rect(text) + f.vertical = True + get_rect_vert = f.get_rect(text) + + self.assertTrue(get_rect_vert.width < get_rect.width) + self.assertTrue(get_rect_vert.height > get_rect.height) + f.vertical = False + render_to_surf = pygame.Surface(get_rect.size, pygame.SRCALPHA, 32) + + if IS_PYPY: + return + + arr = arrinter.Array(get_rect.size, 'u', 1) + render = f.render(text, (0, 0, 0)) + render_to = f.render_to(render_to_surf, (0, 0), text, (0, 0, 0)) + render_raw = f.render_raw(text) + render_raw_to = f.render_raw_to(arr, text) + + # comparisons + surf = pygame.Surface(get_rect.size, pygame.SRCALPHA, 32) + self.assertEqual(f.get_rect(None), get_rect) + s, r = f.render(None, (0, 0, 0)) + self.assertEqual(r, render[1]) + self.assertTrue(surf_same_image(s, render[0])) + r = f.render_to(surf, (0, 0), None, (0, 0, 0)) + self.assertEqual(r, render_to) + self.assertTrue(surf_same_image(surf, render_to_surf)) + px, sz = f.render_raw(None) + self.assertEqual(sz, render_raw[1]) + self.assertEqual(px, render_raw[0]) + sz = f.render_raw_to(arr, None) + self.assertEqual(sz, render_raw_to) + + def test_freetype_Font_text_is_None(self): + f = ft.Font(self._sans_path, 36) + f.style = ft.STYLE_NORMAL + f.rotation = 0 + text = 'ABCD' + + # reference values + get_rect = f.get_rect(text) + f.vertical = True + get_rect_vert = f.get_rect(text) + + # vertical: trigger glyph positioning. + f.vertical = True + r = f.get_rect(None) + self.assertEqual(r, get_rect_vert) + f.vertical = False + + # wide style: trigger glyph reload + r = f.get_rect(None, style=ft.STYLE_WIDE) + self.assertEqual(r.height, get_rect.height) + self.assertTrue(r.width > get_rect.width) + r = f.get_rect(None) + self.assertEqual(r, get_rect) + + # rotated: trigger glyph reload + r = f.get_rect(None, rotation=90) + self.assertEqual(r.width, get_rect.height) + self.assertEqual(r.height, get_rect.width) + + # this method will not support None text + self.assertRaises(TypeError, f.get_metrics, None) + + def test_freetype_Font_fgcolor(self): + f = ft.Font(self._bmp_8_75dpi_path) + notdef = '\0' # the PyGameMono .notdef glyph has a pixel at (0, 0) + f.origin = False + f.pad = False + black = pygame.Color('black') # initial color + green = pygame.Color('green') + alpha128 = pygame.Color(10, 20, 30, 128) + + c = f.fgcolor + self.assertIsInstance(c, pygame.Color) + self.assertEqual(c, black) + + s, r = f.render(notdef) + self.assertEqual(s.get_at((0, 0)), black) + + f.fgcolor = green + self.assertEqual(f.fgcolor, green) + + s, r = f.render(notdef) + self.assertEqual(s.get_at((0, 0)), green) + + f.fgcolor = alpha128 + s, r = f.render(notdef) + self.assertEqual(s.get_at((0, 0)), alpha128) + + surf = pygame.Surface(f.get_rect(notdef).size, pygame.SRCALPHA, 32) + f.render_to(surf, (0, 0), None) + self.assertEqual(surf.get_at((0, 0)), alpha128) + + self.assertRaises(AttributeError, setattr, f, 'fgcolor', None) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf(self): + from pygame.tests.test_utils import buftools + Exporter = buftools.Exporter + font = self._TEST_FONTS['sans'] + srect = font.get_rect("Hi", size=12) + for format in ['b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', + 'x', '1x', '2x', '3x', '4x', '5x', '6x', '7x', + '8x', '9x', 'h', '=h', '@h', '!h', '1h', '=1h']: + newbuf = Exporter(srect.size, format=format) + rrect = font.render_raw_to(newbuf, "Hi", size=12) + self.assertEqual(rrect, srect) + # Some unsupported formats + for format in ['f', 'd', '2h', '?', 'hh']: + newbuf = Exporter(srect.size, format=format, itemsize=4) + self.assertRaises(ValueError, font.render_raw_to, + newbuf, "Hi", size=12) + + def test_freetype_Font_style(self): + + font = self._TEST_FONTS['sans'] + + # make sure STYLE_NORMAL is the default value + self.assertEqual(ft.STYLE_NORMAL, font.style) + + # make sure we check for style type + with self.assertRaises(TypeError): + font.style = "None" + with self.assertRaises(TypeError): + font.style = None + + # make sure we only accept valid constants + with self.assertRaises(ValueError): + font.style = 112 + + # make assure no assignements happened + self.assertEqual(ft.STYLE_NORMAL, font.style) + + # test assignement + font.style = ft.STYLE_UNDERLINE + self.assertEqual(ft.STYLE_UNDERLINE, font.style) + + # test complex styles + st = ( ft.STYLE_STRONG | ft.STYLE_UNDERLINE | + ft.STYLE_OBLIQUE ) + + font.style = st + self.assertEqual(st, font.style) + + # and that STYLE_DEFAULT has no effect (continued from above) + self.assertNotEqual(st, ft.STYLE_DEFAULT) + font.style = ft.STYLE_DEFAULT + self.assertEqual(st, font.style) + + # revert changes + font.style = ft.STYLE_NORMAL + self.assertEqual(ft.STYLE_NORMAL, font.style) + + def test_freetype_Font_resolution(self): + text = "|" # Differs in width and height + resolution = ft.get_default_resolution() + new_font = ft.Font(self._sans_path, resolution=2 * resolution) + self.assertEqual(new_font.resolution, 2 * resolution) + size_normal = self._TEST_FONTS['sans'].get_rect(text, size=24).size + size_scaled = new_font.get_rect(text, size=24).size + size_by_2 = size_normal[0] * 2 + self.assertTrue(size_by_2 + 2 >= size_scaled[0] >= size_by_2 - 2, + "%i not equal %i" % (size_scaled[1], size_by_2)) + size_by_2 = size_normal[1] * 2 + self.assertTrue(size_by_2 + 2 >= size_scaled[1] >= size_by_2 - 2, + "%i not equal %i" % (size_scaled[1], size_by_2)) + new_resolution = resolution + 10 + ft.set_default_resolution(new_resolution) + try: + new_font = ft.Font(self._sans_path, resolution=0) + self.assertEqual(new_font.resolution, new_resolution) + finally: + ft.set_default_resolution() + + def test_freetype_Font_path(self): + self.assertEqual(self._TEST_FONTS['sans'].path, self._sans_path) + self.assertRaises(AttributeError, getattr, nullfont(), 'path') + + # This Font cache test is conditional on freetype being built by a debug + # version of Python or with the C macro PGFT_DEBUG_CACHE defined. + def test_freetype_Font_cache(self): + glyphs = "abcde" + glen = len(glyphs) + other_glyphs = "123" + oglen = len(other_glyphs) + uempty = unicode_("") +## many_glyphs = (uempty.join([unichr_(i) for i in range(32,127)] + +## [unichr_(i) for i in range(161,172)] + +## [unichr_(i) for i in range(174,239)])) + many_glyphs = uempty.join([unichr_(i) for i in range(32,127)]) + mglen = len(many_glyphs) + + count = 0 + access = 0 + hit = 0 + miss = 0 + + f = ft.Font(None, size=24, font_index=0, resolution=72, ucs4=False) + f.style = ft.STYLE_NORMAL + f.antialiased = True + + # Ensure debug counters are zero + self.assertEqual(f._debug_cache_stats, (0, 0, 0, 0, 0)) + # Load some basic glyphs + count = access = miss = glen + f.render_raw(glyphs) + self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) + # Vertical should not affect the cache + access += glen + hit += glen + f.vertical = True + f.render_raw(glyphs) + f.vertical = False + self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) + # New glyphs will + count += oglen + access += oglen + miss += oglen + f.render_raw(other_glyphs) + self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) + # Point size does + count += glen + access += glen + miss += glen + f.render_raw(glyphs, size=12) + self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) + # Underline style does not + access += oglen + hit += oglen + f.underline = True + f.render_raw(other_glyphs) + f.underline = False + self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) + # Oblique style does + count += glen + access += glen + miss += glen + f.oblique = True + f.render_raw(glyphs) + f.oblique = False + self.assertEqual(f._debug_cache_stats, (count, 0, access, hit, miss)) + # Strong style does; by this point cache clears can happen + count += glen + access += glen + miss += glen + f.strong = True + f.render_raw(glyphs) + f.strong = False + ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats + self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), + (count, access, hit, miss)) + # Rotation does + count += glen + access += glen + miss += glen + f.render_raw(glyphs, rotation=10) + ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats + self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), + (count, access, hit, miss)) + # aliased (mono) glyphs do + count += oglen + access += oglen + miss += oglen + f.antialiased = False + f.render_raw(other_glyphs) + f.antialiased = True + ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats + self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), + (count, access, hit, miss)) + # Trigger a cleanup for sure. + count += 2 * mglen + access += 2 * mglen + miss += 2 * mglen + f.get_metrics(many_glyphs, size=8) + f.get_metrics(many_glyphs, size=10) + ccount, cdelete_count, caccess, chit, cmiss = f._debug_cache_stats + self.assertTrue(ccount < count) + self.assertEqual((ccount + cdelete_count, caccess, chit, cmiss), + (count, access, hit, miss)) + + try: + ft.Font._debug_cache_stats + except AttributeError: + del test_freetype_Font_cache + + def test_undefined_character_code(self): + # To be consistent with pygame.font.Font, undefined codes + # are rendered as the undefined character, and has metrics + # of None. + font = self._TEST_FONTS['sans'] + + img, size1 = font.render(unichr_(1), (0, 0, 0), size=24) + img, size0 = font.render("", (0, 0, 0), size=24) + self.assertTrue(size1.width > size0.width ) + + metrics = font.get_metrics(unichr_(1) + unichr_(48), size=24) + self.assertEqual(len(metrics), 2) + self.assertIsNone(metrics[0]) + self.assertIsInstance(metrics[1], tuple) + + @unittest.skipIf(pygame.get_sdl_version()[0] == 2, "SDL2 surfaces are only limited by memory") + def test_issue_144(self): + """Issue #144: unable to render text""" + + # The bug came in two parts. The first was a convertion bug from + # FT_Fixed to integer in for an Intel x86_64 Pygame build. The second + # was to have the raised exception disappear before Font.render + # returned to Python level. + # + font = ft.Font(None, size=64) + s = 'M' * 100000 # Way too long for an SDL surface + self.assertRaises(pygame.error, font.render, s, (0, 0, 0)) + + def test_issue_242(self): + """Issue #242: get_rect() uses 0 as default style""" + + # Issue #242: freetype.Font.get_rect() ignores style defaults when + # the style argument is not given + # + # The text boundary rectangle returned by freetype.Font.get_rect() + # should match the boundary of the same text rendered directly to a + # surface. This permits accurate text positioning. To work properly, + # get_rect() should calculate the text boundary to reflect text style, + # such as underline. Instead, it ignores the style settings for the + # Font object when the style argument is omitted. + # + # When the style argument is not given, freetype.get_rect() uses + # unstyled text when calculating the boundary rectangle. This is + # because _ftfont_getrect(), in _freetype.c, set the default + # style to 0 rather than FT_STYLE_DEFAULT. + # + font = self._TEST_FONTS['sans'] + + # Try wide style on a wide character. + prev_style = font.wide + font.wide = True + try: + rect = font.get_rect('M', size=64) + surf, rrect = font.render(None, size=64) + self.assertEqual(rect, rrect) + finally: + font.wide = prev_style + + # Try strong style on several wide characters. + prev_style = font.strong + font.strong = True + try: + rect = font.get_rect('Mm_', size=64) + surf, rrect = font.render(None, size=64) + self.assertEqual(rect, rrect) + finally: + font.strong = prev_style + + # Try oblique style on a tall, narrow character. + prev_style = font.oblique + font.oblique = True + try: + rect = font.get_rect('|', size=64) + surf, rrect = font.render(None, size=64) + self.assertEqual(rect, rrect) + finally: + font.oblique = prev_style + + # Try underline style on a glyphless character. + prev_style = font.underline + font.underline = True + try: + rect = font.get_rect(' ', size=64) + surf, rrect = font.render(None, size=64) + self.assertEqual(rect, rrect) + finally: + font.underline = prev_style + + def test_issue_237(self): + """Issue #237: Memory overrun when rendered with underlining""" + + # Issue #237: Memory overrun when text without descenders is rendered + # with underlining + # + # The bug crashes the Python interpreter. The bug is caught with C + # assertions in ft_render_cb.c when the Pygame module is compiled + # for debugging. So far it is only known to affect Times New Roman. + # + name = "Times New Roman" + font = ft.SysFont(name, 19) + if font.name != name: + # The font is unavailable, so skip the test. + return + font.underline = True + s, r = font.render("Amazon", size=19) + + # Some other checks to make sure nothing else broke. + for adj in [-2, -1.9, -1, 0, 1.9, 2]: + font.underline_adjustment = adj + s, r = font.render("Amazon", size=19) + + def test_issue_243(self): + """Issue Y: trailing space ignored in boundary calculation""" + + # Issue #243: For a string with trailing spaces, freetype ignores the + # last space in boundary calculations + # + font = self._TEST_FONTS['fixed'] + r1 = font.get_rect(" ", size=64) + self.assertTrue(r1.width > 1) + r2 = font.get_rect(" ", size=64) + self.assertEqual(r2.width, 2 * r1.width) + + def test_garbage_collection(self): + """Check reference counting on returned new references""" + def ref_items(seq): + return [weakref.ref(o) for o in seq] + + font = self._TEST_FONTS['bmp-8-75dpi'] + font.size = font.get_sizes()[0][0] + text = 'A' + rect = font.get_rect(text) + surf = pygame.Surface(rect.size, pygame.SRCALPHA, 32) + refs = [] + refs.extend(ref_items(font.render(text, (0, 0, 0)))) + refs.append(weakref.ref(font.render_to(surf, (0, 0), text, (0, 0, 0)))) + refs.append(weakref.ref(font.get_rect(text))) + + n = len(refs) + self.assertTrue(n > 0) + + # for pypy we garbage collection twice. + for i in range(2): + gc.collect() + + for i in range(n): + self.assertIsNone(refs[i](), "ref %d not collected" % i) + + try: + from sys import getrefcount + except ImportError: + pass + else: + array = arrinter.Array(rect.size, 'u', 1) + o = font.render_raw(text) + self.assertEqual(getrefcount(o), 2) + self.assertEqual(getrefcount(o[0]), 2) + self.assertEqual(getrefcount(o[1]), 2) + self.assertEqual(getrefcount(font.render_raw_to(array, text)), 1) + o = font.get_metrics('AB') + self.assertEqual(getrefcount(o), 2) + for i in range(len(o)): + self.assertEqual(getrefcount(o[i]), 2, + "refcount fail for item %d" % i) + o = font.get_sizes() + self.assertEqual(getrefcount(o), 2) + for i in range(len(o)): + self.assertEqual(getrefcount(o[i]), 2, + "refcount fail for item %d" % i) + + def test_display_surface_quit(self): + """Font.render_to() on a closed display surface""" + + # The Font.render_to() method checks that PySurfaceObject.surf is NULL + # and raise a exception if it is. This fixes a bug in Pygame revision + # 0600ea4f1cfb and earlier where Pygame segfaults instead. + null_surface = pygame.Surface.__new__(pygame.Surface) + f = self._TEST_FONTS['sans'] + self.assertRaises(pygame.error, f.render_to, + null_surface, (0, 0), "Crash!", size=12) + + def test_issue_565(self): + """get_metrics supporting rotation/styles/size""" + + tests = [ + {'method': 'size', 'value': 36, 'msg': 'metrics same for size'}, + {'method': 'rotation', 'value': 90, 'msg': 'metrics same for rotation'}, + {'method': 'oblique', 'value': True, 'msg': 'metrics same for oblique'} + ] + text = "|" + + def run_test(method, value, msg): + font = ft.Font(self._sans_path, size=24) + before = font.get_metrics(text) + font.__setattr__(method, value) + after = font.get_metrics(text) + self.assertNotEqual(before, after, msg) + + for test in tests: + run_test(test['method'], test['value'], test['msg']) + + +class FreeTypeTest(unittest.TestCase): + def setUp(self): + ft.init() + + def tearDown(self): + ft.quit() + + def test_resolution(self): + try: + ft.set_default_resolution() + resolution = ft.get_default_resolution() + self.assertEqual(resolution, 72) + new_resolution = resolution + 10 + ft.set_default_resolution(new_resolution) + self.assertEqual(ft.get_default_resolution(), new_resolution) + ft.init(resolution=resolution+20) + self.assertEqual(ft.get_default_resolution(), new_resolution) + finally: + ft.set_default_resolution() + + def test_autoinit_and_autoquit(self): + pygame.init() + self.assertTrue(ft.get_init()) + pygame.quit() + self.assertFalse(ft.get_init()) + + # Ensure autoquit is replaced at init time + pygame.init() + self.assertTrue(ft.get_init()) + pygame.quit() + self.assertFalse(ft.get_init()) + + def test_init(self): + # Test if module initialized after calling init(). + ft.quit() + ft.init() + + self.assertTrue(ft.get_init()) + + def test_init__multiple(self): + # Test if module initialized after multiple init() calls. + ft.init() + ft.init() + + self.assertTrue(ft.get_init()) + + def test_quit(self): + # Test if module uninitialized after calling quit(). + ft.quit() + + self.assertFalse(ft.get_init()) + + def test_quit__multiple(self): + # Test if module initialized after multiple quit() calls. + ft.quit() + ft.quit() + + self.assertFalse(ft.get_init()) + + def test_get_init(self): + # Test if get_init() gets the init state. + self.assertTrue(ft.get_init()) + + def test_cache_size(self): + DEFAULT_CACHE_SIZE = 64 + self.assertEqual(ft.get_cache_size(), DEFAULT_CACHE_SIZE) + ft.quit() + self.assertEqual(ft.get_cache_size(), 0) + new_cache_size = DEFAULT_CACHE_SIZE * 2 + ft.init(cache_size=new_cache_size) + self.assertEqual(ft.get_cache_size(), new_cache_size) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/ftfont_tags.py b/venv/Lib/site-packages/pygame/tests/ftfont_tags.py new file mode 100644 index 0000000..5e17673 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/ftfont_tags.py @@ -0,0 +1,12 @@ +__tags__ = ['development'] + +exclude = False + +try: + import pygame.ftfont +except ImportError: + exclude = True + +if exclude: + __tags__.extend(['ignore', 'subprocess_ignore']) + diff --git a/venv/Lib/site-packages/pygame/tests/ftfont_test.py b/venv/Lib/site-packages/pygame/tests/ftfont_test.py new file mode 100644 index 0000000..0acd0ef --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/ftfont_test.py @@ -0,0 +1,20 @@ +import sys +import os +import unittest +from pygame.tests import font_test + +import pygame.ftfont + +font_test.pygame_font = pygame.ftfont +# Disable UCS-4 specific tests as this "Font" type does accept UCS-4 codes. +font_test.UCS_4 = False + +for name in dir(font_test): + obj = getattr(font_test, name) + if (isinstance(obj, type) and # conditional and + issubclass(obj, unittest.TestCase)): + new_name = 'Ft%s' % name + globals()[new_name] = type(new_name, (obj, ), {}) + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/gfxdraw_test.py b/venv/Lib/site-packages/pygame/tests/gfxdraw_test.py new file mode 100644 index 0000000..a6e3390 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/gfxdraw_test.py @@ -0,0 +1,817 @@ +import unittest +import pygame +import pygame.gfxdraw +from pygame.locals import * +from pygame.tests.test_utils import SurfaceSubclass + +def intensity(c, i): + """Return color c changed by intensity i + + For 0 <= i <= 127 the color is a shade, with 0 being black, 127 being the + unaltered color. + + For 128 <= i <= 255 the color is a tint, with 255 being white, 128 the + unaltered color. + + """ + r, g, b = c[0:3] + if 0 <= i <= 127: + # Darken + return ((r * i) // 127, (g * i) // 127, (b * i) // 127) + # Lighten + return (r + ((255 - r) * (255 - i)) // 127, + g + ((255 - g) * (255 - i)) // 127, + b + ((255 - b) * (255 - i)) // 127) + + +class GfxdrawDefaultTest( unittest.TestCase ): + + is_started = False + + foreground_color = (128, 64, 8) + background_color = (255, 255, 255) + + def make_palette(base_color): + """Return color palette that is various intensities of base_color""" + # Need this function for Python 3.x so the base_color + # is within the scope of the list comprehension. + return [intensity(base_color, i) for i in range(0, 256)] + + default_palette = make_palette(foreground_color) + + default_size = (100, 100) + + def check_at(self, surf, posn, color): + sc = surf.get_at(posn) + fail_msg = ("%s != %s at %s, bitsize: %i, flags: %i, masks: %s" % + (sc, color, posn, surf.get_bitsize(), surf.get_flags(), + surf.get_masks())) + self.assertEqual(sc, color, fail_msg) + + def check_not_at(self, surf, posn, color): + sc = surf.get_at(posn) + fail_msg = ("%s != %s at %s, bitsize: %i, flags: %i, masks: %s" % + (sc, color, posn, surf.get_bitsize(), surf.get_flags(), + surf.get_masks())) + self.assertNotEqual(sc, color, fail_msg) + + @classmethod + def setUpClass(cls): + # Necessary for Surface.set_palette. + pygame.init() + pygame.display.set_mode((1, 1)) + + @classmethod + def tearDownClass(cls): + pygame.quit() + + def setUp(self): + # This makes sure pygame is always initialized before each test (in + # case a test calls pygame.quit()). + if not pygame.get_init(): + pygame.init() + + Surface = pygame.Surface + size = self.default_size + palette = self.default_palette + if not self.is_started: + # Create test surfaces + self.surfaces = [Surface(size, 0, 8), + Surface(size, SRCALPHA, 16), + Surface(size, SRCALPHA, 32)] + self.surfaces[0].set_palette(palette) + nonpalette_fmts = ( + #(8, (0xe0, 0x1c, 0x3, 0x0)), + (12, (0xf00, 0xf0, 0xf, 0x0)), + (15, (0x7c00, 0x3e0, 0x1f, 0x0)), + (15, (0x1f, 0x3e0, 0x7c00, 0x0)), + (16, (0xf00, 0xf0, 0xf, 0xf000)), + (16, (0xf000, 0xf00, 0xf0, 0xf)), + (16, (0xf, 0xf0, 0xf00, 0xf000)), + (16, (0xf0, 0xf00, 0xf000, 0xf)), + (16, (0x7c00, 0x3e0, 0x1f, 0x8000)), + (16, (0xf800, 0x7c0, 0x3e, 0x1)), + (16, (0x1f, 0x3e0, 0x7c00, 0x8000)), + (16, (0x3e, 0x7c0, 0xf800, 0x1)), + (16, (0xf800, 0x7e0, 0x1f, 0x0)), + (16, (0x1f, 0x7e0, 0xf800, 0x0)), + (24, (0xff, 0xff00, 0xff0000, 0x0)), + (24, (0xff0000, 0xff00, 0xff, 0x0)), + (32, (0xff0000, 0xff00, 0xff, 0x0)), + (32, (0xff000000, 0xff0000, 0xff00, 0x0)), + (32, (0xff, 0xff00, 0xff0000, 0x0)), + (32, (0xff00, 0xff0000, 0xff000000, 0x0)), + (32, (0xff0000, 0xff00, 0xff, 0xff000000)), + (32, (0xff000000, 0xff0000, 0xff00, 0xff)), + (32, (0xff, 0xff00, 0xff0000, 0xff000000)), + (32, (0xff00, 0xff0000, 0xff000000, 0xff)) + ) + for bitsize, masks in nonpalette_fmts: + self.surfaces.append(Surface(size, 0, bitsize, masks)) + for surf in self.surfaces: + surf.fill(self.background_color) + + def test_gfxdraw__subclassed_surface(self): + """Ensure pygame.gfxdraw works on subclassed surfaces.""" + surface = SurfaceSubclass((11, 13), SRCALPHA, 32) + surface.fill(pygame.Color('blue')) + expected_color = pygame.Color('red') + x, y = 1, 2 + + pygame.gfxdraw.pixel(surface, x, y, expected_color) + + self.assertEqual(surface.get_at((x, y)), expected_color) + + def test_pixel(self): + """pixel(surface, x, y, color): return None""" + fg = self.foreground_color + bg = self.background_color + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.pixel(surf, 2, 2, fg) + for x in range(1, 4): + for y in range(1, 4): + if x == 2 and y == 2: + self.check_at(surf, (x, y), fg_adjusted) + else: + self.check_at(surf, (x, y), bg_adjusted) + + def test_hline(self): + """hline(surface, x1, x2, y, color): return None""" + fg = self.foreground_color + bg = self.background_color + startx = 10 + stopx = 80 + y = 50 + fg_test_points = [(startx, y), (stopx, y), ((stopx - startx) // 2, y)] + bg_test_points = [(startx - 1, y), (stopx + 1, y), + (startx, y - 1), (startx, y + 1), + (stopx, y - 1), (stopx, y + 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.hline(surf, startx, stopx, y, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_vline(self): + """vline(surface, x, y1, y2, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 50 + starty = 10 + stopy = 80 + fg_test_points = [(x, starty), (x, stopy), (x, (stopy - starty) // 2)] + bg_test_points = [(x, starty - 1), (x, stopy + 1), + (x - 1, starty), (x + 1, starty), + (x - 1, stopy), (x + 1, stopy)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.vline(surf, x, starty, stopy, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_rectangle(self): + """rectangle(surface, rect, color): return None""" + fg = self.foreground_color + bg = self.background_color + rect = pygame.Rect(10, 15, 55, 62) + rect_tuple = tuple(rect) + fg_test_points = [rect.topleft, + (rect.right - 1, rect.top), + (rect.left, rect.bottom - 1), + (rect.right - 1, rect.bottom - 1)] + bg_test_points = [(rect.left - 1, rect.top - 1), + (rect.left + 1, rect.top + 1), + (rect.right, rect.top - 1), + (rect.right - 2, rect.top + 1), + (rect.left - 1, rect.bottom), + (rect.left + 1, rect.bottom - 2), + (rect.right, rect.bottom), + (rect.right - 2, rect.bottom - 2)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.rectangle(surf, rect, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + surf.fill(bg) + pygame.gfxdraw.rectangle(surf, rect_tuple, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_box(self): + """box(surface, rect, color): return None""" + fg = self.foreground_color + bg = self.background_color + rect = pygame.Rect(10, 15, 55, 62) + rect_tuple = tuple(rect) + fg_test_points = [rect.topleft, + (rect.left + 1, rect.top + 1), + (rect.right - 1, rect.top), + (rect.right - 2, rect.top + 1), + (rect.left, rect.bottom - 1), + (rect.left + 1, rect.bottom - 2), + (rect.right - 1, rect.bottom - 1), + (rect.right - 2, rect.bottom - 2)] + bg_test_points = [(rect.left - 1, rect.top - 1), + (rect.right, rect.top - 1), + (rect.left - 1, rect.bottom), + (rect.right, rect.bottom)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.box(surf, rect, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + surf.fill(bg) + pygame.gfxdraw.box(surf, rect_tuple, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_line(self): + """line(surface, x1, y1, x2, y2, color): return None""" + fg = self.foreground_color + bg = self.background_color + x1 = 10 + y1 = 15 + x2 = 92 + y2 = 77 + fg_test_points = [(x1, y1), (x2, y2)] + bg_test_points = [(x1 - 1, y1), (x1, y1 - 1), (x1 - 1, y1 - 1), + (x2 + 1, y2), (x2, y2 + 1), (x2 + 1, y2 + 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.line(surf, x1, y1, x2, y2, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_circle(self): + """circle(surface, x, y, r, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + r = 30 + fg_test_points = [(x, y - r), + (x, y + r), + (x - r, y), + (x + r, y)] + bg_test_points = [(x, y), + (x, y - r + 1), + (x, y - r - 1), + (x, y + r + 1), + (x, y + r - 1), + (x - r - 1, y), + (x - r + 1, y), + (x + r + 1, y), + (x + r - 1, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.circle(surf, x, y, r, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_arc(self): + """arc(surface, x, y, r, start, end, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + r = 30 + start = 0 # +x direction, but not (x + r, y) (?) + end = 90 # -y direction, including (x, y + r) + fg_test_points = [(x, y + r), (x + r, y + 1)] + bg_test_points = [(x, y), + (x, y - r), + (x - r, y), + (x, y + r + 1), + (x, y + r - 1), + (x - 1, y + r), + (x + r + 1, y), + (x + r - 1, y), + (x + r, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.arc(surf, x, y, r, start, end, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_aacircle(self): + """aacircle(surface, x, y, r, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + r = 30 + fg_test_points = [(x, y - r), + (x, y + r), + (x - r, y), + (x + r, y)] + bg_test_points = [(x, y), + (x, y - r + 1), + (x, y - r - 1), + (x, y + r + 1), + (x, y + r - 1), + (x - r - 1, y), + (x - r + 1, y), + (x + r + 1, y), + (x + r - 1, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.aacircle(surf, x, y, r, fg) + for posn in fg_test_points: + self.check_not_at(surf, posn, bg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_filled_circle(self): + """filled_circle(surface, x, y, r, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + r = 30 + fg_test_points = [(x, y - r), + (x, y - r + 1), + (x, y + r), + (x, y + r - 1), + (x - r, y), + (x - r + 1, y), + (x + r, y), + (x + r - 1, y), + (x, y)] + bg_test_points = [(x, y - r - 1), + (x, y + r + 1), + (x - r - 1, y), + (x + r + 1, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.filled_circle(surf, x, y, r, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_ellipse(self): + """ellipse(surface, x, y, rx, ry, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + rx = 30 + ry = 35 + fg_test_points = [(x, y - ry), + (x, y + ry), + (x - rx, y), + (x + rx, y)] + bg_test_points = [(x, y), + (x, y - ry + 1), + (x, y - ry - 1), + (x, y + ry + 1), + (x, y + ry - 1), + (x - rx - 1, y), + (x - rx + 1, y), + (x + rx + 1, y), + (x + rx - 1, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.ellipse(surf, x, y, rx, ry, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_aaellipse(self): + """aaellipse(surface, x, y, rx, ry, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + rx = 30 + ry = 35 + fg_test_points = [(x, y - ry), + (x, y + ry), + (x - rx, y), + (x + rx, y)] + bg_test_points = [(x, y), + (x, y - ry + 1), + (x, y - ry - 1), + (x, y + ry + 1), + (x, y + ry - 1), + (x - rx - 1, y), + (x - rx + 1, y), + (x + rx + 1, y), + (x + rx - 1, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.aaellipse(surf, x, y, rx, ry, fg) + for posn in fg_test_points: + self.check_not_at(surf, posn, bg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_filled_ellipse(self): + """filled_ellipse(surface, x, y, rx, ry, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + rx = 30 + ry = 35 + fg_test_points = [(x, y - ry), + (x, y - ry + 1), + (x, y + ry), + (x, y + ry - 1), + (x - rx, y), + (x - rx + 1, y), + (x + rx, y), + (x + rx - 1, y), + (x, y)] + bg_test_points = [(x, y - ry - 1), + (x, y + ry + 1), + (x - rx - 1, y), + (x + rx + 1, y)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.filled_ellipse(surf, x, y, rx, ry, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_pie(self): + """pie(surface, x, y, r, start, end, color): return None""" + fg = self.foreground_color + bg = self.background_color + x = 45 + y = 40 + r = 30 + start = 0 # +x direction, including (x + r, y) + end = 90 # -y direction, but not (x, y + r) (?) + fg_test_points = [(x, y), + (x + 1, y), + (x, y + 1), + (x + r, y)] + bg_test_points = [(x - 1, y), + (x, y - 1), + (x - 1, y - 1), + (x + 1, y + 1), + (x + r + 1, y), + (x + r, y - 1), + (x, y + r + 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.pie(surf, x, y, r, start, end, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_trigon(self): + """trigon(surface, x1, y1, x2, y2, x3, y3, color): return None""" + fg = self.foreground_color + bg = self.background_color + x1 = 10 + y1 = 15 + x2 = 92 + y2 = 77 + x3 = 20 + y3 = 60 + fg_test_points = [(x1, y1), (x2, y2), (x3, y3)] + bg_test_points = [(x1 - 1, y1 - 1), + (x2 + 1, y2 + 1), + (x3 - 1, y3 + 1), + (x1 + 10, y1 + 30)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.trigon(surf, x1, y1, x2, y2, x3, y3, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_aatrigon(self): + """aatrigon(surface, x1, y1, x2, y2, x3, y3, color): return None""" + fg = self.foreground_color + bg = self.background_color + x1 = 10 + y1 = 15 + x2 = 92 + y2 = 77 + x3 = 20 + y3 = 60 + fg_test_points = [(x1, y1), (x2, y2), (x3, y3)] + bg_test_points = [(x1 - 1, y1 - 1), + (x2 + 1, y2 + 1), + (x3 - 1, y3 + 1), + (x1 + 10, y1 + 30)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.aatrigon(surf, x1, y1, x2, y2, x3, y3, fg) + for posn in fg_test_points: + self.check_not_at(surf, posn, bg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + @unittest.expectedFailure + def test_aatrigon__with_horizontal_edge(self): + """Ensure aatrigon draws horizontal edges correctly. + + This test creates 2 surfaces and draws an aatrigon on each. The pixels + on each surface are compared to ensure they are the same. The only + difference between the 2 aatrigons is the order the points are drawn. + The order of the points should have no impact on the final drawing. + + Related to issue #622. + """ + bg_color = pygame.Color('white') + line_color = pygame.Color('black') + width, height = 11, 10 + expected_surface = pygame.Surface((width, height), 0, 32) + expected_surface.fill(bg_color) + surface = pygame.Surface((width, height), 0, 32) + surface.fill(bg_color) + + x1, y1 = width - 1, 0 + x2, y2 = (width - 1) // 2, height - 1 + x3, y3 = 0, 0 + + # The points in this order draw as expected. + pygame.gfxdraw.aatrigon(expected_surface, x1, y1, x2, y2, x3, y3, + line_color) + + # The points in reverse order fail to draw the horizontal edge along + # the top. + pygame.gfxdraw.aatrigon(surface, x3, y3, x2, y2, x1, y1, line_color) + + # The surfaces are locked for a possible speed up of pixel access. + expected_surface.lock() + surface.lock() + for x in range(width): + for y in range(height): + self.assertEqual(expected_surface.get_at((x, y)), + surface.get_at((x, y)), + 'pos=({}, {})'.format(x, y)) + + surface.unlock() + expected_surface.unlock() + + def test_filled_trigon(self): + """filled_trigon(surface, x1, y1, x2, y2, x3, y3, color): return None""" + fg = self.foreground_color + bg = self.background_color + x1 = 10 + y1 = 15 + x2 = 92 + y2 = 77 + x3 = 20 + y3 = 60 + fg_test_points = [(x1, y1), (x2, y2), (x3, y3), + (x1 + 10, y1 + 30)] + bg_test_points = [(x1 - 1, y1 - 1), + (x2 + 1, y2 + 1), + (x3 - 1, y3 + 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.filled_trigon(surf, x1, y1, x2, y2, x3, y3, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_polygon(self): + """polygon(surface, points, color): return None""" + fg = self.foreground_color + bg = self.background_color + points = [(10, 80), (10, 15), (92, 25), (92, 80)] + fg_test_points = (points + + [(points[0][0], points[0][1] - 1), + (points[0][0] + 1, points[0][1]), + (points[3][0] - 1, points[3][1]), + (points[3][0], points[3][1] - 1), + (points[2][0], points[2][1] + 1)]) + bg_test_points = [(points[0][0] - 1, points[0][1]), + (points[0][0], points[0][1] + 1), + (points[0][0] - 1, points[0][1] + 1), + (points[0][0] + 1, points[0][1] - 1), + (points[3][0] + 1, points[3][1]), + (points[3][0], points[3][1] + 1), + (points[3][0] + 1, points[3][1] + 1), + (points[3][0] - 1, points[3][1] - 1), + (points[2][0] + 1, points[2][1]), + (points[2][0] - 1, points[2][1] + 1), + (points[1][0] - 1, points[1][1]), + (points[1][0], points[1][1] - 1), + (points[1][0] - 1, points[1][1] - 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.polygon(surf, points, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_aapolygon(self): + """aapolygon(surface, points, color): return None""" + fg = self.foreground_color + bg = self.background_color + points = [(10, 80), (10, 15), (92, 25), (92, 80)] + fg_test_points = points + bg_test_points = [(points[0][0] - 1, points[0][1]), + (points[0][0], points[0][1] + 1), + (points[0][0] - 1, points[0][1] + 1), + (points[0][0] + 1, points[0][1] - 1), + (points[3][0] + 1, points[3][1]), + (points[3][0], points[3][1] + 1), + (points[3][0] + 1, points[3][1] + 1), + (points[3][0] - 1, points[3][1] - 1), + (points[2][0] + 1, points[2][1]), + (points[2][0] - 1, points[2][1] + 1), + (points[1][0] - 1, points[1][1]), + (points[1][0], points[1][1] - 1), + (points[1][0] - 1, points[1][1] - 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.aapolygon(surf, points, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_not_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + @unittest.expectedFailure + def test_aapolygon__with_horizontal_edge(self): + """Ensure aapolygon draws horizontal edges correctly. + + This test creates 2 surfaces and draws a polygon on each. The pixels + on each surface are compared to ensure they are the same. The only + difference between the 2 polygons is that one is drawn using + aapolygon() and the other using multiple line() calls. They should + produce the same final drawing. + + Related to issue #622. + """ + bg_color = pygame.Color('white') + line_color = pygame.Color('black') + width, height = 11, 10 + expected_surface = pygame.Surface((width, height), 0, 32) + expected_surface.fill(bg_color) + surface = pygame.Surface((width, height), 0, 32) + surface.fill(bg_color) + + points = ((0, 0), (0, height - 1), (width - 1, height - 1), + (width - 1, 0)) + + # The points are used to draw the expected aapolygon using the line() + # function. + for (x1, y1), (x2, y2) in zip(points, points[1:] + points[:1]): + pygame.gfxdraw.line(expected_surface, x1, y1, x2, y2, line_color) + + # The points in this order fail to draw the horizontal edge along + # the top. + pygame.gfxdraw.aapolygon(surface, points, line_color) + + # The surfaces are locked for a possible speed up of pixel access. + expected_surface.lock() + surface.lock() + for x in range(width): + for y in range(height): + self.assertEqual(expected_surface.get_at((x, y)), + surface.get_at((x, y)), + 'pos=({}, {})'.format(x, y)) + + surface.unlock() + expected_surface.unlock() + + def test_filled_polygon(self): + """filled_polygon(surface, points, color): return None""" + fg = self.foreground_color + bg = self.background_color + points = [(10, 80), (10, 15), (92, 25), (92, 80)] + fg_test_points = (points + + [(points[0][0], points[0][1] - 1), + (points[0][0] + 1, points[0][1]), + (points[0][0] + 1, points[0][1] - 1), + (points[3][0] - 1, points[3][1]), + (points[3][0], points[3][1] - 1), + (points[3][0] - 1, points[3][1] - 1), + (points[2][0], points[2][1] + 1), + (points[2][0] - 1, points[2][1] + 1)]) + bg_test_points = [(points[0][0] - 1, points[0][1]), + (points[0][0], points[0][1] + 1), + (points[0][0] - 1, points[0][1] + 1), + (points[3][0] + 1, points[3][1]), + (points[3][0], points[3][1] + 1), + (points[3][0] + 1, points[3][1] + 1), + (points[2][0] + 1, points[2][1]), + (points[1][0] - 1, points[1][1]), + (points[1][0], points[1][1] - 1), + (points[1][0] - 1, points[1][1] - 1)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.filled_polygon(surf, points, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + def test_textured_polygon(self): + """textured_polygon(surface, points, texture, tx, ty): return None""" + w, h = self.default_size + fg = self.foreground_color + bg = self.background_color + tx = 0 + ty = 0 + texture = pygame.Surface((w + tx, h + ty), 0, 24) + texture.fill(fg, (0, 0, w, h)) + points = [(10, 80), (10, 15), (92, 25), (92, 80)] + # Don't know how to really check this as boarder points may + # or may not be included in the textured polygon. + fg_test_points = [(points[1][0] + 30, points[1][1] + 40)] + bg_test_points = [(points[0][0] - 1, points[0][1]), + (points[0][0], points[0][1] + 1), + (points[0][0] - 1, points[0][1] + 1), + (points[3][0] + 1, points[3][1]), + (points[3][0], points[3][1] + 1), + (points[3][0] + 1, points[3][1] + 1), + (points[2][0] + 1, points[2][1]), + (points[1][0] - 1, points[1][1]), + (points[1][0], points[1][1] - 1), + (points[1][0] - 1, points[1][1] - 1)] + for surf in self.surfaces[1:]: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.textured_polygon(surf, points, texture, -tx, -ty) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + # Alpha blit to 8 bits-per-pixel surface forbidden. + texture = pygame.Surface(self.default_size, SRCALPHA, 32) + self.assertRaises(ValueError, + pygame.gfxdraw.textured_polygon, + self.surfaces[0], + points, + texture, 0, 0) + + def test_bezier(self): + """bezier(surface, points, steps, color): return None""" + fg = self.foreground_color + bg = self.background_color + points = [(10, 50), (25, 15), (60, 80), (92, 30)] + fg_test_points = [points[0], points[3]] + bg_test_points = [(points[0][0] - 1, points[0][1]), + (points[3][0] + 1, points[3][1]), + (points[1][0], points[1][1] + 3), + (points[2][0], points[2][1] - 3)] + for surf in self.surfaces: + fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) + bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) + pygame.gfxdraw.bezier(surf, points, 30, fg) + for posn in fg_test_points: + self.check_at(surf, posn, fg_adjusted) + for posn in bg_test_points: + self.check_at(surf, posn, bg_adjusted) + + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/image__save_gl_surface_test.py b/venv/Lib/site-packages/pygame/tests/image__save_gl_surface_test.py new file mode 100644 index 0000000..be4ee95 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/image__save_gl_surface_test.py @@ -0,0 +1,44 @@ +import os +import unittest + +from pygame.tests import test_utils +import pygame +from pygame.locals import * + + +@unittest.skipIf(os.environ.get('SDL_VIDEODRIVER') == 'dummy', + 'OpenGL requires a non-"dummy" SDL_VIDEODRIVER') +class GL_ImageSave(unittest.TestCase): + def test_image_save_works_with_opengl_surfaces(self): + """ + |tags:display,slow,opengl| + """ + + pygame.display.init() + screen = pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF) + pygame.display.flip() + + tmp_dir = test_utils.get_tmp_dir() + # Try the imageext module. + tmp_file = os.path.join(tmp_dir, "opengl_save_surface_test.png") + pygame.image.save(screen, tmp_file) + + self.assertTrue(os.path.exists(tmp_file)) + + os.remove(tmp_file) + + # Only test the image module. + tmp_file = os.path.join(tmp_dir, "opengl_save_surface_test.bmp") + pygame.image.save(screen, tmp_file) + + self.assertTrue(os.path.exists(tmp_file)) + + os.remove(tmp_file) + + # stops tonnes of tmp dirs building up in trunk dir + os.rmdir(tmp_dir) + pygame.display.quit() + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/image_tags.py b/venv/Lib/site-packages/pygame/tests/image_tags.py new file mode 100644 index 0000000..3f6c181 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/image_tags.py @@ -0,0 +1,7 @@ +__tags__ = [] + +import pygame +import sys +if 'pygame.image' not in sys.modules: + __tags__.extend(('ignore', 'subprocess_ignore')) + diff --git a/venv/Lib/site-packages/pygame/tests/image_test.py b/venv/Lib/site-packages/pygame/tests/image_test.py new file mode 100644 index 0000000..9ec64a2 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/image_test.py @@ -0,0 +1,527 @@ +# -*- coding: utf-8 -*- + +import array +import os +import tempfile +import unittest +import glob + +from pygame.tests.test_utils import example_path, png +import pygame, pygame.image, pygame.pkgdata +from pygame.compat import xrange_, ord_, unicode_ + + +def test_magic(f, magic_hex): + """ tests a given file to see if the magic hex matches. + """ + data = f.read(len(magic_hex)) + + if len(data) != len(magic_hex): + return 0 + + for i in range(len(magic_hex)): + if magic_hex[i] != ord_(data[i]): + return 0 + + return 1 + + +class ImageModuleTest( unittest.TestCase ): + def testLoadIcon(self): + """ see if we can load the pygame icon. + """ + f = pygame.pkgdata.getResource("pygame_icon.bmp") + self.assertEqual(f.mode, "rb") + + surf = pygame.image.load_basic(f) + + self.assertEqual(surf.get_at((0,0)),(5, 4, 5, 255)) + self.assertEqual(surf.get_height(),32) + self.assertEqual(surf.get_width(),32) + + def testLoadPNG(self): + """ see if we can load a png with color values in the proper channels. + """ + # Create a PNG file with known colors + reddish_pixel = (210, 0, 0, 255) + greenish_pixel = (0, 220, 0, 255) + bluish_pixel = (0, 0, 230, 255) + greyish_pixel = (110, 120, 130, 140) + pixel_array = [reddish_pixel + greenish_pixel, + bluish_pixel + greyish_pixel] + + f_descriptor, f_path = tempfile.mkstemp(suffix='.png') + + with os.fdopen(f_descriptor, 'wb') as f: + w = png.Writer(2, 2, alpha=True) + w.write(f, pixel_array) + + # Read the PNG file and verify that pygame interprets it correctly + surf = pygame.image.load(f_path) + + self.assertEqual(surf.get_at((0, 0)), reddish_pixel) + self.assertEqual(surf.get_at((1, 0)), greenish_pixel) + self.assertEqual(surf.get_at((0, 1)), bluish_pixel) + self.assertEqual(surf.get_at((1, 1)), greyish_pixel) + + # Read the PNG file obj. and verify that pygame interprets it correctly + with open(f_path, 'rb') as f: + surf = pygame.image.load(f) + + self.assertEqual(surf.get_at((0, 0)), reddish_pixel) + self.assertEqual(surf.get_at((1, 0)), greenish_pixel) + self.assertEqual(surf.get_at((0, 1)), bluish_pixel) + self.assertEqual(surf.get_at((1, 1)), greyish_pixel) + + os.remove(f_path) + + def testLoadJPG(self): + """ see if we can load a jpg. + """ + + f = example_path('data/alien1.jpg') # normalized + # f = os.path.join("examples", "data", "alien1.jpg") + surf = pygame.image.load(f) + + with open(f, "rb") as f: + surf = pygame.image.load(f) + + # with open(os.path.join("examples", "data", "alien1.jpg"), "rb") as f: + # surf = pygame.image.load(open(os.path.join("examples", "data", + # "alien1.jpg"), "rb")) + + def testSaveJPG(self): + """ JPG equivalent to issue #211 - color channel swapping + + Make sure the SDL surface color masks represent the rgb memory format + required by the JPG library. The masks are machine endian dependent + """ + + from pygame import Color, Rect + + # The source image is a 2 by 2 square of four colors. Since JPEG is + # lossy, there can be color bleed. Make each color square 16 by 16, + # to avoid the significantly color value distorts found at color + # boundaries due to the compression value set by Pygame. + square_len = 16 + sz = 2 * square_len, 2 * square_len + + # +---------------------------------+ + # | red | green | + # |----------------+----------------| + # | blue | (255, 128, 64) | + # +---------------------------------+ + # + # as (rect, color) pairs. + def as_rect(square_x, square_y): + return Rect(square_x * square_len, square_y * square_len, + square_len, square_len) + squares = [(as_rect(0, 0), Color("red")), + (as_rect(1, 0), Color("green")), + (as_rect(0, 1), Color("blue")), + (as_rect(1, 1), Color(255, 128, 64))] + + # A surface format which is not directly usable with libjpeg. + surf = pygame.Surface(sz, 0, 32) + for rect, color in squares: + surf.fill(color, rect) + + # Assume pygame.image.Load works correctly as it is handled by the + # third party SDL_image library. + f_path = tempfile.mktemp(suffix='.jpg') + pygame.image.save(surf, f_path) + jpg_surf = pygame.image.load(f_path) + + # Allow for small differences in the restored colors. + def approx(c): + mask = 0xFC + return pygame.Color(c.r & mask, c.g & mask, c.b & mask) + offset = square_len // 2 + for rect, color in squares: + posn = rect.move((offset, offset)).topleft + self.assertEqual(approx(jpg_surf.get_at(posn)), approx(color)) + + def testSavePNG32(self): + """ see if we can save a png with color values in the proper channels. + """ + # Create a PNG file with known colors + reddish_pixel = (215, 0, 0, 255) + greenish_pixel = (0, 225, 0, 255) + bluish_pixel = (0, 0, 235, 255) + greyish_pixel = (115, 125, 135, 145) + + surf = pygame.Surface((1, 4), pygame.SRCALPHA, 32) + surf.set_at((0, 0), reddish_pixel) + surf.set_at((0, 1), greenish_pixel) + surf.set_at((0, 2), bluish_pixel) + surf.set_at((0, 3), greyish_pixel) + + f_path = tempfile.mktemp(suffix='.png') + pygame.image.save(surf, f_path) + + try: + # Read the PNG file and verify that pygame saved it correctly + reader = png.Reader(filename=f_path) + width, height, pixels, metadata = reader.asRGBA8() + + # pixels is a generator + self.assertEqual(tuple(next(pixels)), reddish_pixel) + self.assertEqual(tuple(next(pixels)), greenish_pixel) + self.assertEqual(tuple(next(pixels)), bluish_pixel) + self.assertEqual(tuple(next(pixels)), greyish_pixel) + + finally: + # Ensures proper clean up. + if not reader.file.closed: + reader.file.close() + del reader + os.remove(f_path) + + def testSavePNG24(self): + """ see if we can save a png with color values in the proper channels. + """ + # Create a PNG file with known colors + reddish_pixel = (215, 0, 0) + greenish_pixel = (0, 225, 0) + bluish_pixel = (0, 0, 235) + greyish_pixel = (115, 125, 135) + + surf = pygame.Surface((1, 4), 0, 24) + surf.set_at((0, 0), reddish_pixel) + surf.set_at((0, 1), greenish_pixel) + surf.set_at((0, 2), bluish_pixel) + surf.set_at((0, 3), greyish_pixel) + + f_path = tempfile.mktemp(suffix='.png') + pygame.image.save(surf, f_path) + + try: + # Read the PNG file and verify that pygame saved it correctly + reader = png.Reader(filename=f_path) + width, height, pixels, metadata = reader.asRGB8() + + # pixels is a generator + self.assertEqual(tuple(next(pixels)), reddish_pixel) + self.assertEqual(tuple(next(pixels)), greenish_pixel) + self.assertEqual(tuple(next(pixels)), bluish_pixel) + self.assertEqual(tuple(next(pixels)), greyish_pixel) + + finally: + # Ensures proper clean up. + if not reader.file.closed: + reader.file.close() + del reader + os.remove(f_path) + + def test_save(self): + + s = pygame.Surface((10,10)) + s.fill((23,23,23)) + magic_hex = {} + magic_hex['jpg'] = [0xff, 0xd8, 0xff, 0xe0] + magic_hex['png'] = [0x89 ,0x50 ,0x4e ,0x47] + # magic_hex['tga'] = [0x0, 0x0, 0xa] + magic_hex['bmp'] = [0x42, 0x4d] + + + formats = ["jpg", "png", "bmp"] + # uppercase too... JPG + formats = formats + [x.upper() for x in formats] + + for fmt in formats: + try: + temp_filename = "%s.%s" % ("tmpimg", fmt) + pygame.image.save(s, temp_filename) + + # Using 'with' ensures the file is closed even if test fails. + with open(temp_filename, "rb") as handle: + # Test the magic numbers at the start of the file to ensure + # they are saved as the correct file type. + self.assertEqual((1, fmt), (test_magic(handle, + magic_hex[fmt.lower()]), fmt)) + + # load the file to make sure it was saved correctly. + # Note load can load a jpg saved with a .png file name. + s2 = pygame.image.load(temp_filename) + #compare contents, might only work reliably for png... + # but because it's all one color it seems to work with jpg. + self.assertEqual(s2.get_at((0,0)), s.get_at((0,0))) + finally: + #clean up the temp file, comment out to leave tmp file after run. + os.remove(temp_filename) + + def test_save_colorkey(self): + """ make sure the color key is not changed when saving. + """ + s = pygame.Surface((10,10), pygame.SRCALPHA, 32) + s.fill((23,23,23)) + s.set_colorkey((0,0,0)) + colorkey1 = s.get_colorkey() + p1 = s.get_at((0,0)) + + temp_filename = "tmpimg.png" + try: + pygame.image.save(s, temp_filename) + s2 = pygame.image.load(temp_filename) + finally: + os.remove(temp_filename) + + colorkey2 = s.get_colorkey() + # check that the pixel and the colorkey is correct. + self.assertEqual(colorkey1, colorkey2) + self.assertEqual(p1, s2.get_at((0,0))) + + def test_load_unicode_path(self): + import shutil + orig = unicode_(example_path("data/asprite.bmp")) + temp = os.path.join(unicode_(example_path('data')), u'你好.bmp') + shutil.copy(orig, temp) + try: + im = pygame.image.load(temp) + finally: + os.remove(temp) + + def _unicode_save(self, temp_file): + im = pygame.Surface((10, 10), 0, 32) + try: + with open(temp_file, 'w') as f: + pass + os.remove(temp_file) + except IOError: + raise unittest.SkipTest('the path cannot be opened') + + self.assertFalse(os.path.exists(temp_file)) + + try: + pygame.image.save(im, temp_file) + + self.assertGreater(os.path.getsize(temp_file), 10) + finally: + try: + os.remove(temp_file) + except EnvironmentError: + pass + + def test_save_unicode_path(self): + """save unicode object with non-ASCII chars""" + self._unicode_save(u"你好.bmp") + + def assertPremultipliedAreEqual(self, string1, string2, source_string): + self.assertEqual(len(string1), len(string2)) + block_size = 20 + if string1 != string2: + for block_start in xrange_(0, len(string1), block_size): + block_end = min(block_start + block_size, len(string1)) + block1 = string1[block_start:block_end] + block2 = string2[block_start:block_end] + if block1 != block2: + source_block = source_string[block_start:block_end] + msg = "string difference in %d to %d of %d:\n%s\n%s\nsource:\n%s" % (block_start, block_end, len(string1), block1.encode("hex"), block2.encode("hex"), source_block.encode("hex")) + self.fail(msg) + + def test_to_string__premultiplied(self): + """ test to make sure we can export a surface to a premultiplied alpha string + """ + + def convertRGBAtoPremultiplied(surface_to_modify): + for x in xrange_(surface_to_modify.get_width()): + for y in xrange_(surface_to_modify.get_height()): + color = surface_to_modify.get_at((x, y)) + premult_color = (color[0]*color[3]/255, + color[1]*color[3]/255, + color[2]*color[3]/255, + color[3]) + surface_to_modify.set_at((x, y), premult_color) + + test_surface = pygame.Surface((256, 256), pygame.SRCALPHA, 32) + for x in xrange_(test_surface.get_width()): + for y in xrange_(test_surface.get_height()): + i = x + y*test_surface.get_width() + test_surface.set_at((x,y), ((i*7) % 256, (i*13) % 256, (i*27) % 256, y)) + premultiplied_copy = test_surface.copy() + convertRGBAtoPremultiplied(premultiplied_copy) + self.assertPremultipliedAreEqual(pygame.image.tostring(test_surface, "RGBA_PREMULT"), + pygame.image.tostring(premultiplied_copy, "RGBA"), + pygame.image.tostring(test_surface, "RGBA")) + self.assertPremultipliedAreEqual(pygame.image.tostring(test_surface, "ARGB_PREMULT"), + pygame.image.tostring(premultiplied_copy, "ARGB"), + pygame.image.tostring(test_surface, "ARGB")) + + no_alpha_surface = pygame.Surface((256, 256), 0, 24) + self.assertRaises(ValueError, pygame.image.tostring, no_alpha_surface, "RGBA_PREMULT") + + # Custom assert method to check for identical surfaces. + def _assertSurfaceEqual(self, surf_a, surf_b, msg=None): + a_width, a_height = surf_a.get_width(), surf_a.get_height() + + # Check a few things to see if the surfaces are equal. + self.assertEqual(a_width, surf_b.get_width(), msg) + self.assertEqual(a_height, surf_b.get_height(), msg) + self.assertEqual(surf_a.get_size(), surf_b.get_size(), msg) + self.assertEqual(surf_a.get_rect(), surf_b.get_rect(), msg) + self.assertEqual(surf_a.get_colorkey(), surf_b.get_colorkey(), msg) + self.assertEqual(surf_a.get_alpha(), surf_b.get_alpha(), msg) + self.assertEqual(surf_a.get_flags(), surf_b.get_flags(), msg) + self.assertEqual(surf_a.get_bitsize(), surf_b.get_bitsize(), msg) + self.assertEqual(surf_a.get_bytesize(), surf_b.get_bytesize(), msg) + # Anything else? + + # Making the method lookups local for a possible speed up. + surf_a_get_at = surf_a.get_at + surf_b_get_at = surf_b.get_at + for y in xrange_(a_height): + for x in xrange_(a_width): + self.assertEqual(surf_a_get_at((x, y)), surf_b_get_at((x, y)), + msg) + + def test_fromstring__and_tostring(self): + """Ensure methods tostring() and fromstring() are symmetric.""" + + #################################################################### + def RotateRGBAtoARGB(str_buf): + byte_buf = array.array("B", str_buf) + num_quads = len(byte_buf)//4 + for i in xrange_(num_quads): + alpha = byte_buf[i*4 + 3] + byte_buf[i*4 + 3] = byte_buf[i*4 + 2] + byte_buf[i*4 + 2] = byte_buf[i*4 + 1] + byte_buf[i*4 + 1] = byte_buf[i*4 + 0] + byte_buf[i*4 + 0] = alpha + return byte_buf.tostring() + + #################################################################### + def RotateARGBtoRGBA(str_buf): + byte_buf = array.array("B", str_buf) + num_quads = len(byte_buf)//4 + for i in xrange_(num_quads): + alpha = byte_buf[i*4 + 0] + byte_buf[i*4 + 0] = byte_buf[i*4 + 1] + byte_buf[i*4 + 1] = byte_buf[i*4 + 2] + byte_buf[i*4 + 2] = byte_buf[i*4 + 3] + byte_buf[i*4 + 3] = alpha + return byte_buf.tostring() + + #################################################################### + test_surface = pygame.Surface((64, 256), flags=pygame.SRCALPHA, + depth=32) + for i in xrange_(256): + for j in xrange_(16): + intensity = j*16 + 15 + test_surface.set_at((j + 0, i), (intensity, i, i, i)) + test_surface.set_at((j + 16, i), (i, intensity, i, i)) + test_surface.set_at((j + 32, i), (i, i, intensity, i)) + test_surface.set_at((j + 32, i), (i, i, i, intensity)) + + self._assertSurfaceEqual(test_surface, test_surface, + 'failing with identical surfaces') + + rgba_buf = pygame.image.tostring(test_surface, "RGBA") + rgba_buf = RotateARGBtoRGBA(RotateRGBAtoARGB(rgba_buf)) + test_rotate_functions = pygame.image.fromstring( + rgba_buf, test_surface.get_size(), "RGBA") + + self._assertSurfaceEqual(test_surface, test_rotate_functions, + 'rotate functions are not symmetric') + + rgba_buf = pygame.image.tostring(test_surface, "RGBA") + argb_buf = RotateRGBAtoARGB(rgba_buf) + test_from_argb_string = pygame.image.fromstring( + argb_buf, test_surface.get_size(), "ARGB") + + self._assertSurfaceEqual(test_surface, test_from_argb_string, + '"RGBA" rotated to "ARGB" failed') + + argb_buf = pygame.image.tostring(test_surface, "ARGB") + rgba_buf = RotateARGBtoRGBA(argb_buf) + test_to_argb_string = pygame.image.fromstring( + rgba_buf, test_surface.get_size(), "RGBA") + + self._assertSurfaceEqual(test_surface, test_to_argb_string, + '"ARGB" rotated to "RGBA" failed') + + for fmt in ('ARGB', 'RGBA'): + fmt_buf = pygame.image.tostring(test_surface, fmt) + test_to_from_fmt_string = pygame.image.fromstring( + fmt_buf, test_surface.get_size(), fmt) + + self._assertSurfaceEqual(test_surface, test_to_from_fmt_string, + 'tostring/fromstring functions are not ' + 'symmetric with "{}" format'.format(fmt)) + + def todo_test_frombuffer(self): + + # __doc__ (as of 2008-08-02) for pygame.image.frombuffer: + + # pygame.image.frombuffer(string, size, format): return Surface + # create a new Surface that shares data inside a string buffer + # + # Create a new Surface that shares pixel data directly from the string + # buffer. This method takes the same arguments as + # pygame.image.fromstring(), but is unable to vertically flip the + # source data. + # + # This will run much faster than pygame.image.fromstring, since no + # pixel data must be allocated and copied. + + self.fail() + + def todo_test_get_extended(self): + + # __doc__ (as of 2008-08-02) for pygame.image.get_extended: + + # pygame.image.get_extended(): return bool + # test if extended image formats can be loaded + # + # If pygame is built with extended image formats this function will + # return True. It is still not possible to determine which formats + # will be available, but generally you will be able to load them all. + + self.fail() + + def todo_test_load_basic(self): + + # __doc__ (as of 2008-08-02) for pygame.image.load_basic: + + # pygame.image.load(filename): return Surface + # pygame.image.load(fileobj, namehint=): return Surface + # load new image from a file + + self.fail() + + def todo_test_load_extended(self): + + # __doc__ (as of 2008-08-02) for pygame.image.load_extended: + + # pygame module for image transfer + + self.fail() + + def todo_test_save_extended(self): + + # __doc__ (as of 2008-08-02) for pygame.image.save_extended: + + # pygame module for image transfer + + self.fail() + + def threads_load(self, images): + import pygame.threads + for i in range(10): + surfs = pygame.threads.tmap(pygame.image.load, images) + for s in surfs: + self.assertIsInstance(s, pygame.Surface) + + def test_load_png_threads(self): + self.threads_load(glob.glob(example_path("data/*.png"))) + + def test_load_jpg_threads(self): + self.threads_load(glob.glob(example_path("data/*.jpg"))) + + def test_load_bmp_threads(self): + self.threads_load(glob.glob(example_path("data/*.bmp"))) + + def test_load_gif_threads(self): + self.threads_load(glob.glob(example_path("data/*.gif"))) + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/imageext_tags.py b/venv/Lib/site-packages/pygame/tests/imageext_tags.py new file mode 100644 index 0000000..60df1da --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/imageext_tags.py @@ -0,0 +1,8 @@ +__tags__ = [] + +import pygame +import sys +if 'pygame.imageext' not in sys.modules: + __tags__.extend(('ignore', 'subprocess_ignore')) + + diff --git a/venv/Lib/site-packages/pygame/tests/imageext_test.py b/venv/Lib/site-packages/pygame/tests/imageext_test.py new file mode 100644 index 0000000..530dc12 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/imageext_test.py @@ -0,0 +1,90 @@ +# -*- coding: utf8 -*- +import os +import os.path +import sys +import unittest + +from pygame.tests.test_utils import example_path +import pygame, pygame.image, pygame.pkgdata +from pygame.compat import as_unicode, unicode_ +imageext = sys.modules['pygame.imageext'] + +class ImageextModuleTest( unittest.TestCase ): + # Most of the testing is done indirectly through image_test.py + # This just confirms file path encoding and error handling. + def test_save_non_string_file(self): + im = pygame.Surface((10, 10), 0, 32) + self.assertRaises(TypeError, imageext.save_extended, im, []) + + def test_load_non_string_file(self): + self.assertRaises(pygame.error, imageext.load_extended, []) + + @unittest.skip("SDL silently removes invalid characters") + def test_save_bad_filename(self): + im = pygame.Surface((10, 10), 0, 32) + u = u"a\x00b\x00c.png" + self.assertRaises(pygame.error, imageext.save_extended, im, u) + + @unittest.skip("SDL silently removes invalid characters") + def test_load_bad_filename(self): + u = u"a\x00b\x00c.png" + self.assertRaises(pygame.error, imageext.load_extended, u) + + def test_save_unknown_extension(self): + im = pygame.Surface((10, 10), 0, 32) + s = "foo.bar" + self.assertRaises(pygame.error, imageext.save_extended, im, s) + + def test_load_unknown_extension(self): + s = "foo.bar" + self.assertRaises(pygame.error, imageext.load_extended, s) + + def test_load_unknown_file(self): + s = "nonexistent.png" + self.assertRaises(pygame.error, imageext.load_extended, s) + + def test_load_unicode_path_0(self): + u = unicode_(example_path("data/alien1.png")) + im = imageext.load_extended(u) + + def test_load_unicode_path_1(self): + """non-ASCII unicode""" + import shutil + orig = unicode_(example_path("data/alien1.png")) + temp = os.path.join(unicode_(example_path('data')), u'你好.png') + shutil.copy(orig, temp) + try: + im = imageext.load_extended(temp) + finally: + os.remove(temp) + + def _unicode_save(self, temp_file): + im = pygame.Surface((10, 10), 0, 32) + try: + with open(temp_file, 'w') as f: + pass + os.remove(temp_file) + except IOError: + raise unittest.SkipTest('the path cannot be opened') + + self.assertFalse(os.path.exists(temp_file)) + + try: + imageext.save_extended(im, temp_file) + + self.assertGreater(os.path.getsize(temp_file), 10) + finally: + try: + os.remove(temp_file) + except EnvironmentError: + pass + + def test_save_unicode_path_0(self): + """unicode object with ASCII chars""" + self._unicode_save(u"temp_file.png") + + def test_save_unicode_path_1(self): + self._unicode_save(u"你好.png") + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/joystick_test.py b/venv/Lib/site-packages/pygame/tests/joystick_test.py new file mode 100644 index 0000000..7d5b328 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/joystick_test.py @@ -0,0 +1,91 @@ +import unittest + +class JoystickTypeTest(unittest.TestCase): + def todo_test_Joystick(self): + + # __doc__ (as of 2008-08-02) for pygame.joystick.Joystick: + + # pygame.joystick.Joystick(id): return Joystick + # create a new Joystick object + # + # Create a new joystick to access a physical device. The id argument + # must be a value from 0 to pygame.joystick.get_count()-1. + # + # To access most of the Joystick methods, you'll need to init() the + # Joystick. This is separate from making sure the joystick module is + # initialized. When multiple Joysticks objects are created for the + # same physical joystick device (i.e., they have the same ID number), + # the state and values for those Joystick objects will be shared. + # + # The Joystick object allows you to get information about the types of + # controls on a joystick device. Once the device is initialized the + # Pygame event queue will start receiving events about its input. + # + # You can call the Joystick.get_name() and Joystick.get_id() functions + # without initializing the Joystick object. + # + + self.fail() + +class JoytickModuleTest(unittest.TestCase): + def todo_test_get_count(self): + + # __doc__ (as of 2008-08-02) for pygame.joystick.get_count: + + # pygame.joystick.get_count(): return count + # number of joysticks on the system + # + # Return the number of joystick devices on the system. The count will + # be 0 if there are no joysticks on the system. + # + # When you create Joystick objects using Joystick(id), you pass an + # integer that must be lower than this count. + # + + self.fail() + + def todo_test_get_init(self): + + # __doc__ (as of 2008-08-02) for pygame.joystick.get_init: + + # pygame.joystick.get_init(): return bool + # true if the joystick module is initialized + # + # Test if the pygame.joystick.init() function has been called. + + self.fail() + + def todo_test_init(self): + + # __doc__ (as of 2008-08-02) for pygame.joystick.init: + + # pygame.joystick.init(): return None + # initialize the joystick module + # + # This function is called automatically by pygame.init(). + # It initializes the joystick module. This will scan the system for + # all joystick devices. The module must be initialized before any + # other functions will work. + # + # It is safe to call this function more than once. + + self.fail() + + def todo_test_quit(self): + + # __doc__ (as of 2008-08-02) for pygame.joystick.quit: + + # pygame.joystick.quit(): return None + # uninitialize the joystick module + # + # Uninitialize the joystick module. After you call this any existing + # joystick objects will no longer work. + # + # It is safe to call this function more than once. + + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/key_test.py b/venv/Lib/site-packages/pygame/tests/key_test.py new file mode 100644 index 0000000..0163c7d --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/key_test.py @@ -0,0 +1,68 @@ +import unittest +import pygame +import pygame.key + + +class KeyModuleTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + pygame.init() + + @classmethod + def tearDownClass(cls): + pygame.quit() + + def setUp(cls): + # This makes sure pygame is always initialized before each test (in + # case a test calls pygame.quit()). + if not pygame.get_init(): + pygame.init() + + def test_import(self): + 'does it import' + import pygame.key + + def todo_test_get_focused(self): + + # __doc__ (as of 2008-08-02) for pygame.key.get_focused: + + # pygame.key.get_focused(): return bool + # true if the display is receiving keyboard input from the system + # + # This is true when the display window has keyboard focus from the + # system. If the display needs to ensure it does not lose keyboard + # focus, it can use pygame.event.set_grab() to grab all input. + # + + self.fail() + + def test_get_pressed(self): + states = pygame.key.get_pressed() + self.assertEqual(states[pygame.K_RIGHT], 0) + + def test_name(self): + self.assertEqual(pygame.key.name(pygame.K_RETURN), "return") + self.assertEqual(pygame.key.name(pygame.K_0), "0") + self.assertEqual(pygame.key.name(pygame.K_SPACE), "space") + + def test_set_and_get_mods(self): + pygame.key.set_mods(pygame.KMOD_CTRL) + self.assertEqual(pygame.key.get_mods(), pygame.KMOD_CTRL) + + pygame.key.set_mods(pygame.KMOD_ALT) + self.assertEqual(pygame.key.get_mods(), pygame.KMOD_ALT) + pygame.key.set_mods(pygame.KMOD_CTRL | pygame.KMOD_ALT) + self.assertEqual(pygame.key.get_mods(), pygame.KMOD_CTRL | pygame.KMOD_ALT) + + def test_set_and_get_repeat(self): + self.assertEqual(pygame.key.get_repeat(), (0, 0)) + + pygame.key.set_repeat(10, 15) + self.assertEqual(pygame.key.get_repeat(), (10, 15)) + + pygame.key.set_repeat() + self.assertEqual(pygame.key.get_repeat(), (0, 0)) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/mask_test.py b/venv/Lib/site-packages/pygame/tests/mask_test.py new file mode 100644 index 0000000..f7a508c --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/mask_test.py @@ -0,0 +1,2050 @@ +from collections import OrderedDict +import random +import unittest + +import pygame +import pygame.mask +from pygame.locals import * + + +def random_mask(size = (100,100)): + """random_mask(size=(100,100)): return Mask + Create a mask of the given size, with roughly half the bits set at random.""" + m = pygame.Mask(size) + for i in range(size[0] * size[1] // 2): + x, y = random.randint(0,size[0] - 1), random.randint(0, size[1] - 1) + m.set_at((x,y)) + return m + +def maskFromSurface(surface, threshold = 127): + mask = pygame.Mask(surface.get_size()) + key = surface.get_colorkey() + if key: + for y in range(surface.get_height()): + for x in range(surface.get_width()): + if surface.get_at((x+0.1,y+0.1)) != key: + mask.set_at((x,y),1) + else: + for y in range(surface.get_height()): + for x in range (surface.get_width()): + if surface.get_at((x,y))[3] > threshold: + mask.set_at((x,y),1) + return mask + + +class MaskTypeTest(unittest.TestCase): + ORIGIN_OFFSETS = ((0, 0), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), + (-1, -1), (-1, 0), (-1, 1)) + + def _assertMaskEqual(self, m1, m2, msg=None): + # Checks to see if the 2 given masks are equal. + m1_count = m1.count() + + self.assertEqual(m1.get_size(), m2.get_size(), msg=msg) + self.assertEqual(m1_count, m2.count(), msg=msg) + self.assertEqual(m1_count, m1.overlap_area(m2, (0, 0)), msg=msg) + + # This can be used to help debug exact locations. + ##for i in range(m1.get_size()[0]): + ## for j in range(m1.get_size()[1]): + ## self.assertEqual(m1.get_at((i, j)), m2.get_at((i, j))) + + def test_mask(self): + """Ensure masks are created correctly without fill parameter.""" + expected_count = 0 + expected_size = (11, 23) + mask1 = pygame.mask.Mask(expected_size) + mask2 = pygame.mask.Mask(size=expected_size) + + self.assertEqual(mask1.count(), expected_count) + self.assertEqual(mask1.get_size(), expected_size) + + self.assertEqual(mask2.count(), expected_count) + self.assertEqual(mask2.get_size(), expected_size) + + def test_mask__negative_size(self): + """Ensure the mask constructor handles negative sizes correctly.""" + for size in ((1, -1), (-1, 1), (-1, -1)): + with self.assertRaises(ValueError): + mask = pygame.Mask(size) + + def test_mask__fill_kwarg(self): + """Ensure masks are created correctly using the fill keyword.""" + width, height = 37, 47 + expected_size = (width, height) + fill_counts = {True : width * height, False : 0 } + + for fill, expected_count in fill_counts.items(): + msg = 'fill={}'.format(fill) + + mask = pygame.mask.Mask(expected_size, fill=fill) + + self.assertEqual(mask.count(), expected_count, msg) + self.assertEqual(mask.get_size(), expected_size, msg) + + def test_mask__fill_arg(self): + """Ensure masks are created correctly using a fill arg.""" + width, height = 59, 71 + expected_size = (width, height) + fill_counts = {True : width * height, False : 0 } + + for fill, expected_count in fill_counts.items(): + msg = 'fill={}'.format(fill) + + mask = pygame.mask.Mask(expected_size, fill) + + self.assertEqual(mask.count(), expected_count, msg) + self.assertEqual(mask.get_size(), expected_size, msg) + + def test_mask__size_kwarg(self): + """Ensure masks are created correctly using the size keyword.""" + width, height = 73, 83 + expected_size = (width, height) + fill_counts = {True : width * height, False : 0 } + + for fill, expected_count in fill_counts.items(): + msg = 'fill={}'.format(fill) + + mask1 = pygame.mask.Mask(fill=fill, size=expected_size) + mask2 = pygame.mask.Mask(size=expected_size, fill=fill) + + self.assertEqual(mask1.count(), expected_count, msg) + self.assertEqual(mask2.count(), expected_count, msg) + self.assertEqual(mask1.get_size(), expected_size, msg) + self.assertEqual(mask2.get_size(), expected_size, msg) + + def test_get_size(self): + """Ensure a mask's size is correctly retrieved.""" + expected_size = (93, 101) + mask = pygame.mask.Mask(expected_size) + + self.assertEqual(mask.get_size(), expected_size) + + def test_get_at(self): + """Ensure individual mask bits are correctly retrieved.""" + width, height = 5, 7 + mask0 = pygame.mask.Mask((width, height)) + mask1 = pygame.mask.Mask((width, height), fill=True) + mask0_expected_bit = 0 + mask1_expected_bit = 1 + pos = (width - 1, height - 1) + + # Check twice to make sure bits aren't toggled. + self.assertEqual(mask0.get_at(pos), mask0_expected_bit) + self.assertEqual(mask0.get_at(pos), mask0_expected_bit) + self.assertEqual(mask1.get_at(pos), mask1_expected_bit) + self.assertEqual(mask1.get_at(pos), mask1_expected_bit) + + def test_get_at__out_of_bounds(self): + """Ensure get_at() checks bounds.""" + width, height = 11, 3 + mask = pygame.mask.Mask((width, height)) + + with self.assertRaises(IndexError): + mask.get_at((width, 0)) + + with self.assertRaises(IndexError): + mask.get_at((0, height)) + + with self.assertRaises(IndexError): + mask.get_at((-1, 0)) + + with self.assertRaises(IndexError): + mask.get_at((0, -1)) + + def test_set_at(self): + """Ensure individual mask bits are set to 1.""" + width, height = 13, 17 + mask0 = pygame.mask.Mask((width, height)) + mask1 = pygame.mask.Mask((width, height), fill=True) + mask0_expected_count = 1 + mask1_expected_count = mask1.count() + expected_bit = 1 + pos = (width - 1, height - 1) + + mask0.set_at(pos, expected_bit) # set 0 to 1 + mask1.set_at(pos, expected_bit) # set 1 to 1 + + self.assertEqual(mask0.get_at(pos), expected_bit) + self.assertEqual(mask0.count(), mask0_expected_count) + self.assertEqual(mask1.get_at(pos), expected_bit) + self.assertEqual(mask1.count(), mask1_expected_count) + + def test_set_at__to_0(self): + """Ensure individual mask bits are set to 0.""" + width, height = 11, 7 + mask0 = pygame.mask.Mask((width, height)) + mask1 = pygame.mask.Mask((width, height), fill=True) + mask0_expected_count = 0 + mask1_expected_count = mask1.count() - 1 + expected_bit = 0 + pos = (width - 1, height - 1) + + mask0.set_at(pos, expected_bit) # set 0 to 0 + mask1.set_at(pos, expected_bit) # set 1 to 0 + + self.assertEqual(mask0.get_at(pos), expected_bit) + self.assertEqual(mask0.count(), mask0_expected_count) + self.assertEqual(mask1.get_at(pos), expected_bit) + self.assertEqual(mask1.count(), mask1_expected_count) + + def test_set_at__default_value(self): + """Ensure individual mask bits are set using the default value.""" + width, height = 3, 21 + mask0 = pygame.mask.Mask((width, height)) + mask1 = pygame.mask.Mask((width, height), fill=True) + mask0_expected_count = 1 + mask1_expected_count = mask1.count() + expected_bit = 1 + pos = (width - 1, height - 1) + + mask0.set_at(pos) # set 0 to 1 + mask1.set_at(pos) # set 1 to 1 + + self.assertEqual(mask0.get_at(pos), expected_bit) + self.assertEqual(mask0.count(), mask0_expected_count) + self.assertEqual(mask1.get_at(pos), expected_bit) + self.assertEqual(mask1.count(), mask1_expected_count) + + def test_set_at__out_of_bounds(self): + """Ensure set_at() checks bounds.""" + width, height = 11, 3 + mask = pygame.mask.Mask((width, height)) + + with self.assertRaises(IndexError): + mask.set_at((width, 0)) + + with self.assertRaises(IndexError): + mask.set_at((0, height)) + + with self.assertRaises(IndexError): + mask.set_at((-1, 0)) + + with self.assertRaises(IndexError): + mask.set_at((0, -1)) + + def test_overlap(self): + """Ensure the overlap intersection is correctly calculated. + + Testing the different combinations of full/empty masks: + (mask1-filled) 1 overlap 1 (mask2-filled) + (mask1-empty) 0 overlap 1 (mask2-filled) + (mask1-filled) 1 overlap 0 (mask2-empty) + (mask1-empty) 0 overlap 0 (mask2-empty) + """ + expected_size = (4, 4) + offset = (0, 0) + expected_default = None + expected_overlaps = {(True, True) : offset} + + for fill2 in (True, False): + mask2 = pygame.mask.Mask(expected_size, fill=fill2) + mask2_count = mask2.count() + + for fill1 in (True, False): + key = (fill1, fill2) + msg = 'key={}'.format(key) + mask1 = pygame.mask.Mask(expected_size, fill=fill1) + mask1_count = mask1.count() + expected_pos = expected_overlaps.get(key, expected_default) + + overlap_pos = mask1.overlap(mask2, offset) + + self.assertEqual(overlap_pos, expected_pos, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), expected_size, msg) + self.assertEqual(mask2.get_size(), expected_size, msg) + + def test_overlap__offset(self): + """Ensure an offset overlap intersection is correctly calculated.""" + mask1 = pygame.mask.Mask((65, 3), fill=True) + mask2 = pygame.mask.Mask((66, 4), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + expected_pos = (max(offset[0], 0), max(offset[1], 0)) + + overlap_pos = mask1.overlap(mask2, offset) + + self.assertEqual(overlap_pos, expected_pos, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_overlap__offset_with_unset_bits(self): + """Ensure an offset overlap intersection is correctly calculated + when (0, 0) bits not set.""" + mask1 = pygame.mask.Mask((65, 3), fill=True) + mask2 = pygame.mask.Mask((66, 4), fill=True) + unset_pos = (0, 0) + mask1.set_at(unset_pos, 0) + mask2.set_at(unset_pos, 0) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + x, y = offset + expected_y = max(y, 0) + if 0 == y: + expected_x = max(x + 1, 1) + elif 0 < y: + expected_x = max(x + 1, 0) + else: + expected_x = max(x, 1) + + overlap_pos = mask1.overlap(mask2, offset) + + self.assertEqual(overlap_pos, (expected_x, expected_y), msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + self.assertEqual(mask1.get_at(unset_pos), 0, msg) + self.assertEqual(mask2.get_at(unset_pos), 0, msg) + + def test_overlap__no_overlap(self): + """Ensure an offset overlap intersection is correctly calculated + when there is no overlap.""" + mask1 = pygame.mask.Mask((65, 3), fill=True) + mask1_count = mask1.count() + mask1_size = mask1.get_size() + + mask2_w, mask2_h = 67, 5 + mask2_size = (mask2_w, mask2_h) + mask2 = pygame.mask.Mask(mask2_size) + set_pos = (mask2_w - 1, mask2_h - 1) + mask2.set_at(set_pos) + mask2_count = 1 + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + + overlap_pos = mask1.overlap(mask2, offset) + + self.assertIsNone(overlap_pos, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + self.assertEqual(mask2.get_at(set_pos), 1, msg) + + def test_overlap__offset_boundary(self): + """Ensures overlap handles offsets and boundaries correctly.""" + mask1 = pygame.mask.Mask((13, 3), fill=True) + mask2 = pygame.mask.Mask((7, 5), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Check the 4 boundaries. + offsets = ((mask1_size[0], 0), # off right + (0, mask1_size[1]), # off bottom + (-mask2_size[0], 0), # off left + (0, -mask2_size[1])) # off top + + for offset in offsets: + msg = 'offset={}'.format(offset) + + overlap_pos = mask1.overlap(mask2, offset) + + self.assertIsNone(overlap_pos, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_overlap__invalid_mask_arg(self): + """Ensure overlap handles invalid mask arguments correctly.""" + size = (5, 3) + offset = (0, 0) + mask = pygame.mask.Mask(size) + invalid_mask = pygame.Surface(size) + + with self.assertRaises(TypeError): + overlap_pos = mask.overlap(invalid_mask, offset) + + def test_overlap__invalid_offset_arg(self): + """Ensure overlap handles invalid offset arguments correctly.""" + size = (2, 7) + offset = '(0, 0)' + mask1 = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask(size) + + with self.assertRaises(TypeError): + overlap_pos = mask1.overlap(mask2, offset) + + def test_overlap_area(self): + """Ensure the overlap_area is correctly calculated. + + Testing the different combinations of full/empty masks: + (mask1-filled) 1 overlap_area 1 (mask2-filled) + (mask1-empty) 0 overlap_area 1 (mask2-filled) + (mask1-filled) 1 overlap_area 0 (mask2-empty) + (mask1-empty) 0 overlap_area 0 (mask2-empty) + """ + expected_size = width, height = (4, 4) + offset = (0, 0) + expected_default = 0 + expected_counts = {(True, True) : width * height} + + for fill2 in (True, False): + mask2 = pygame.mask.Mask(expected_size, fill=fill2) + mask2_count = mask2.count() + + for fill1 in (True, False): + key = (fill1, fill2) + msg = 'key={}'.format(key) + mask1 = pygame.mask.Mask(expected_size, fill=fill1) + mask1_count = mask1.count() + expected_count = expected_counts.get(key, expected_default) + + overlap_count = mask1.overlap_area(mask2, offset) + + self.assertEqual(overlap_count, expected_count, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), expected_size, msg) + self.assertEqual(mask2.get_size(), expected_size, msg) + + def test_overlap_area__offset(self): + """Ensure an offset overlap_area is correctly calculated.""" + mask1 = pygame.mask.Mask((65, 3), fill=True) + mask2 = pygame.mask.Mask((66, 4), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Using rects to help determine the overlapping area. + rect1 = pygame.Rect((0, 0), mask1_size) + rect2 = pygame.Rect((0, 0), mask2_size) + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + rect2.topleft = offset + overlap_rect = rect1.clip(rect2) + expected_count = overlap_rect.w * overlap_rect.h + + overlap_count = mask1.overlap_area(mask2, offset) + + self.assertEqual(overlap_count, expected_count, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_overlap_area__offset_boundary(self): + """Ensures overlap_area handles offsets and boundaries correctly.""" + mask1 = pygame.mask.Mask((11, 3), fill=True) + mask2 = pygame.mask.Mask((5, 7), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + expected_count = 0 + + # Check the 4 boundaries. + offsets = ((mask1_size[0], 0), # off right + (0, mask1_size[1]), # off bottom + (-mask2_size[0], 0), # off left + (0, -mask2_size[1])) # off top + + for offset in offsets: + msg = 'offset={}'.format(offset) + + overlap_count = mask1.overlap_area(mask2, offset) + + self.assertEqual(overlap_count, expected_count, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_overlap_area__invalid_mask_arg(self): + """Ensure overlap_area handles invalid mask arguments correctly.""" + size = (3, 5) + offset = (0, 0) + mask = pygame.mask.Mask(size) + invalid_mask = pygame.Surface(size) + + with self.assertRaises(TypeError): + overlap_count = mask.overlap_area(invalid_mask, offset) + + def test_overlap_area__invalid_offset_arg(self): + """Ensure overlap_area handles invalid offset arguments correctly.""" + size = (7, 2) + offset = '(0, 0)' + mask1 = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask(size) + + with self.assertRaises(TypeError): + overlap_count = mask1.overlap_area(mask2, offset) + + def test_overlap_mask(self): + """Ensure overlap_mask's mask has correct bits set. + + Testing the different combinations of full/empty masks: + (mask1-filled) 1 overlap_mask 1 (mask2-filled) + (mask1-empty) 0 overlap_mask 1 (mask2-filled) + (mask1-filled) 1 overlap_mask 0 (mask2-empty) + (mask1-empty) 0 overlap_mask 0 (mask2-empty) + """ + expected_size = (4, 4) + offset = (0, 0) + expected_default = pygame.mask.Mask(expected_size) + expected_masks = { + (True, True) : pygame.mask.Mask(expected_size, fill=True)} + + for fill2 in (True, False): + mask2 = pygame.mask.Mask(expected_size, fill=fill2) + mask2_count = mask2.count() + + for fill1 in (True, False): + key = (fill1, fill2) + msg = 'key={}'.format(key) + mask1 = pygame.mask.Mask(expected_size, fill=fill1) + mask1_count = mask1.count() + expected_mask = expected_masks.get(key, expected_default) + + overlap_mask = mask1.overlap_mask(mask2, offset) + + self._assertMaskEqual(overlap_mask, expected_mask, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), expected_size, msg) + self.assertEqual(mask2.get_size(), expected_size, msg) + + def test_overlap_mask__bits_set(self): + """Ensure overlap_mask's mask has correct bits set.""" + mask1 = pygame.mask.Mask((50, 50), fill=True) + mask2 = pygame.mask.Mask((300, 10), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + mask3 = mask1.overlap_mask(mask2, (-1, 0)) + + for i in range(50): + for j in range(10): + self.assertEqual(mask3.get_at((i, j)), 1, + '({}, {})'.format(i, j)) + + for i in range(50): + for j in range(11, 50): + self.assertEqual(mask3.get_at((i, j)), 0, + '({}, {})'.format(i, j)) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count) + self.assertEqual(mask2.count(), mask2_count) + self.assertEqual(mask1.get_size(), mask1_size) + self.assertEqual(mask2.get_size(), mask2_size) + + def test_overlap_mask__offset(self): + """Ensure an offset overlap_mask's mask is correctly calculated.""" + mask1 = pygame.mask.Mask((65, 3), fill=True) + mask2 = pygame.mask.Mask((66, 4), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + expected_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Using rects to help determine the overlapping area. + rect1 = pygame.Rect((0, 0), expected_size) + rect2 = pygame.Rect((0, 0), mask2_size) + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + rect2.topleft = offset + overlap_rect = rect1.clip(rect2) + expected_count = overlap_rect.w * overlap_rect.h + + overlap_mask = mask1.overlap_mask(mask2, offset) + + self.assertEqual(overlap_mask.count(), expected_count, msg) + self.assertEqual(overlap_mask.get_size(), expected_size, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), expected_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_overlap_mask__offset_boundary(self): + """Ensures overlap_mask handles offsets and boundaries correctly.""" + mask1 = pygame.mask.Mask((9, 3), fill=True) + mask2 = pygame.mask.Mask((11, 5), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + expected_count = 0 + expected_size = mask1_size + + # Check the 4 boundaries. + offsets = ((mask1_size[0], 0), # off right + (0, mask1_size[1]), # off bottom + (-mask2_size[0], 0), # off left + (0, -mask2_size[1])) # off top + + for offset in offsets: + msg = 'offset={}'.format(offset) + + overlap_mask = mask1.overlap_mask(mask2, offset) + + self.assertEqual(overlap_mask.count(), expected_count, msg) + self.assertEqual(overlap_mask.get_size(), expected_size, msg) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_overlap_mask__invalid_mask_arg(self): + """Ensure overlap_mask handles invalid mask arguments correctly.""" + size = (3, 2) + offset = (0, 0) + mask = pygame.mask.Mask(size) + invalid_mask = pygame.Surface(size) + + with self.assertRaises(TypeError): + overlap_mask = mask.overlap_mask(invalid_mask, offset) + + def test_overlap_mask__invalid_offset_arg(self): + """Ensure overlap_mask handles invalid offset arguments correctly.""" + size = (5, 2) + offset = '(0, 0)' + mask1 = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask(size) + + with self.assertRaises(TypeError): + overlap_mask = mask1.overlap_mask(mask2, offset) + + def test_mask_access( self ): + """ do the set_at, and get_at parts work correctly? + """ + m = pygame.Mask((10,10)) + m.set_at((0,0), 1) + self.assertEqual(m.get_at((0,0)), 1) + m.set_at((9,0), 1) + self.assertEqual(m.get_at((9,0)), 1) + + #s = pygame.Surface((10,10)) + #s.set_at((1,0), (0, 0, 1, 255)) + #self.assertEqual(s.get_at((1,0)), (0, 0, 1, 255)) + #s.set_at((-1,0), (0, 0, 1, 255)) + + # out of bounds, should get IndexError + self.assertRaises(IndexError, lambda : m.get_at((-1,0)) ) + self.assertRaises(IndexError, lambda : m.set_at((-1,0), 1) ) + self.assertRaises(IndexError, lambda : m.set_at((10,0), 1) ) + self.assertRaises(IndexError, lambda : m.set_at((0,10), 1) ) + + def test_fill(self): + """Ensure a mask can be filled.""" + width, height = 11, 23 + expected_count = width * height + expected_size = (width, height) + mask = pygame.mask.Mask(expected_size) + + mask.fill() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def test_clear(self): + """Ensure a mask can be cleared.""" + expected_count = 0 + expected_size = (13, 27) + mask = pygame.mask.Mask(expected_size, fill=True) + + mask.clear() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def test_invert(self): + """Ensure a mask can be inverted.""" + side = 73 + expected_size = (side, side) + mask1 = pygame.mask.Mask(expected_size) + mask2 = pygame.mask.Mask(expected_size, fill=True) + expected_count1 = side * side + expected_count2 = 0 + + for i in range(side): + expected_count1 -= 1 + expected_count2 += 1 + pos = (i, i) + mask1.set_at(pos) + mask2.set_at(pos, 0) + + mask1.invert() + mask2.invert() + + self.assertEqual(mask1.count(), expected_count1) + self.assertEqual(mask2.count(), expected_count2) + self.assertEqual(mask1.get_size(), expected_size) + self.assertEqual(mask2.get_size(), expected_size) + + for i in range(side): + pos = (i, i) + msg = 'pos={}'.format(pos) + + self.assertEqual(mask1.get_at(pos), 0, msg) + self.assertEqual(mask2.get_at(pos), 1, msg) + + def test_invert__full(self): + """Ensure a full mask can be inverted.""" + expected_count = 0 + expected_size = (43, 97) + mask = pygame.mask.Mask(expected_size, fill=True) + + mask.invert() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def test_invert__empty(self): + """Ensure an empty mask can be inverted.""" + width, height = 43, 97 + expected_size = (width, height) + expected_count = width * height + mask = pygame.mask.Mask(expected_size) + + mask.invert() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def test_scale(self): + """Ensure a mask can be scaled.""" + width, height = 43, 61 + original_size = (width, height) + + for fill in (True, False): + original_mask = pygame.mask.Mask(original_size, fill=fill) + original_count = width * height if fill else 0 + + # Test a range of sizes. Also tests scaling to 'same' + # size when new_w, new_h = width, height + for new_w in range(width - 10, width + 10): + for new_h in range(height - 10, height + 10): + expected_size = (new_w, new_h) + expected_count = new_w * new_h if fill else 0 + msg = 'size={}'.format(expected_size) + + mask = original_mask.scale(expected_size) + + self.assertEqual(mask.count(), expected_count, msg) + self.assertEqual(mask.get_size(), expected_size) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), original_count, + msg) + self.assertEqual(original_mask.get_size(), original_size, + msg) + + def test_scale__negative_size(self): + """Ensure scale handles negative sizes correctly.""" + mask = pygame.Mask((100, 100)) + + with self.assertRaises(ValueError): + mask.scale((-1, -1)) + + with self.assertRaises(ValueError): + mask.scale((-1, 10)) + + with self.assertRaises(ValueError): + mask.scale((10, -1)) + + def test_draw(self): + """Ensure a mask can be drawn onto another mask. + + Testing the different combinations of full/empty masks: + (mask1-filled) 1 draw 1 (mask2-filled) + (mask1-empty) 0 draw 1 (mask2-filled) + (mask1-filled) 1 draw 0 (mask2-empty) + (mask1-empty) 0 draw 0 (mask2-empty) + """ + expected_size = (4, 4) + offset = (0, 0) + expected_default = pygame.mask.Mask(expected_size, fill=True) + expected_masks = {(False, False) : pygame.mask.Mask(expected_size)} + + for fill2 in (True, False): + mask2 = pygame.mask.Mask(expected_size, fill=fill2) + mask2_count = mask2.count() + + for fill1 in (True, False): + key = (fill1, fill2) + msg = 'key={}'.format(key) + mask1 = pygame.mask.Mask(expected_size, fill=fill1) + expected_mask = expected_masks.get(key, expected_default) + + mask1.draw(mask2, offset) + + self._assertMaskEqual(mask1, expected_mask, msg) + + # Ensure mask2 unchanged. + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask2.get_size(), expected_size, msg) + + def test_draw__offset(self): + """Ensure an offset mask can be drawn onto another mask.""" + mask1 = pygame.mask.Mask((65, 3)) + mask2 = pygame.mask.Mask((66, 4), fill=True) + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Using rects to help determine the overlapping area. + rect1 = pygame.Rect((0, 0), mask1_size) + rect2 = pygame.Rect((0, 0), mask2_size) + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + rect2.topleft = offset + overlap_rect = rect1.clip(rect2) + expected_count = overlap_rect.w * overlap_rect.h + mask1.clear() # Ensure it's empty for testing each offset. + + mask1.draw(mask2, offset) + + self.assertEqual(mask1.count(), expected_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + + # Ensure mask2 unchanged. + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_draw__offset_boundary(self): + """Ensures draw handles offsets and boundaries correctly.""" + mask1 = pygame.mask.Mask((13, 5)) + mask2 = pygame.mask.Mask((7, 3), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Check the 4 boundaries. + offsets = ((mask1_size[0], 0), # off right + (0, mask1_size[1]), # off bottom + (-mask2_size[0], 0), # off left + (0, -mask2_size[1])) # off top + + for offset in offsets: + msg = 'offset={}'.format(offset) + + mask1.draw(mask2, offset) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_draw__invalid_mask_arg(self): + """Ensure draw handles invalid mask arguments correctly.""" + size = (7, 3) + offset = (0, 0) + mask = pygame.mask.Mask(size) + invalid_mask = pygame.Surface(size) + + with self.assertRaises(TypeError): + mask.draw(invalid_mask, offset) + + def test_draw__invalid_offset_arg(self): + """Ensure draw handles invalid offset arguments correctly.""" + size = (5, 7) + offset = '(0, 0)' + mask1 = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask(size) + + with self.assertRaises(TypeError): + mask1.draw(mask2, offset) + + def test_erase(self): + """Ensure a mask can erase another mask. + + Testing the different combinations of full/empty masks: + (mask1-filled) 1 erase 1 (mask2-filled) + (mask1-empty) 0 erase 1 (mask2-filled) + (mask1-filled) 1 erase 0 (mask2-empty) + (mask1-empty) 0 erase 0 (mask2-empty) + """ + expected_size = (4, 4) + offset = (0, 0) + expected_default = pygame.mask.Mask(expected_size) + expected_masks = { + (True, False) : pygame.mask.Mask(expected_size, fill=True)} + + for fill2 in (True, False): + mask2 = pygame.mask.Mask(expected_size, fill=fill2) + mask2_count = mask2.count() + + for fill1 in (True, False): + key = (fill1, fill2) + msg = 'key={}'.format(key) + mask1 = pygame.mask.Mask(expected_size, fill=fill1) + expected_mask = expected_masks.get(key, expected_default) + + mask1.erase(mask2, offset) + + self._assertMaskEqual(mask1, expected_mask, msg) + + # Ensure mask2 unchanged. + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask2.get_size(), expected_size, msg) + + def test_erase__offset(self): + """Ensure an offset mask can erase another mask.""" + mask1 = pygame.mask.Mask((65, 3)) + mask2 = pygame.mask.Mask((66, 4), fill=True) + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Using rects to help determine the overlapping area. + rect1 = pygame.Rect((0, 0), mask1_size) + rect2 = pygame.Rect((0, 0), mask2_size) + rect1_area = rect1.w * rect1.h + + for offset in self.ORIGIN_OFFSETS: + msg = 'offset={}'.format(offset) + rect2.topleft = offset + overlap_rect = rect1.clip(rect2) + expected_count = rect1_area - (overlap_rect.w * overlap_rect.h) + mask1.fill() # Ensure it's filled for testing each offset. + + mask1.erase(mask2, offset) + + self.assertEqual(mask1.count(), expected_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + + # Ensure mask2 unchanged. + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_erase__offset_boundary(self): + """Ensures erase handles offsets and boundaries correctly.""" + mask1 = pygame.mask.Mask((7, 11), fill=True) + mask2 = pygame.mask.Mask((3, 13), fill=True) + mask1_count = mask1.count() + mask2_count = mask2.count() + mask1_size = mask1.get_size() + mask2_size = mask2.get_size() + + # Check the 4 boundaries. + offsets = ((mask1_size[0], 0), # off right + (0, mask1_size[1]), # off bottom + (-mask2_size[0], 0), # off left + (0, -mask2_size[1])) # off top + + for offset in offsets: + msg = 'offset={}'.format(offset) + + mask1.erase(mask2, offset) + + # Ensure mask1/mask2 unchanged. + self.assertEqual(mask1.count(), mask1_count, msg) + self.assertEqual(mask2.count(), mask2_count, msg) + self.assertEqual(mask1.get_size(), mask1_size, msg) + self.assertEqual(mask2.get_size(), mask2_size, msg) + + def test_erase__invalid_mask_arg(self): + """Ensure erase handles invalid mask arguments correctly.""" + size = (3, 7) + offset = (0, 0) + mask = pygame.mask.Mask(size) + invalid_mask = pygame.Surface(size) + + with self.assertRaises(TypeError): + mask.erase(invalid_mask, offset) + + def test_erase__invalid_offset_arg(self): + """Ensure erase handles invalid offset arguments correctly.""" + size = (7, 5) + offset = '(0, 0)' + mask1 = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask(size) + + with self.assertRaises(TypeError): + mask1.erase(mask2, offset) + + def test_count(self): + """Ensure a mask's set bits are correctly counted.""" + side = 67 + expected_size = (side, side) + expected_count = 0 + mask = pygame.mask.Mask(expected_size) + + for i in range(side): + expected_count += 1 + mask.set_at((i, i)) + + count = mask.count() + + self.assertEqual(count, expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def test_count__full_mask(self): + """Ensure a full mask's set bits are correctly counted.""" + width, height = 17, 97 + expected_size = (width, height) + expected_count = width * height + mask = pygame.mask.Mask(expected_size, fill=True) + + count = mask.count() + + self.assertEqual(count, expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def test_count__empty_mask(self): + """Ensure an empty mask's set bits are correctly counted.""" + expected_count = 0 + expected_size = (13, 27) + mask = pygame.mask.Mask(expected_size) + + count = mask.count() + + self.assertEqual(count, expected_count) + self.assertEqual(mask.get_size(), expected_size) + + def todo_test_centroid(self): + """Ensure a mask's centroid is correctly calculated.""" + self.fail() + + def test_centroid__empty_mask(self): + """Ensure an empty mask's centroid is correctly calculated.""" + expected_centroid = (0, 0) + expected_size = (101, 103) + mask = pygame.mask.Mask(expected_size) + + centroid = mask.centroid() + + self.assertEqual(centroid, expected_centroid) + self.assertEqual(mask.get_size(), expected_size) + + def todo_test_angle(self): + """Ensure a mask's orientation angle is correctly calculated.""" + self.fail() + + def test_angle__empty_mask(self): + """Ensure an empty mask's angle is correctly calculated.""" + expected_angle = 0.0 + expected_size = (107, 43) + mask = pygame.mask.Mask(expected_size) + + angle = mask.angle() + + self.assertIsInstance(angle, float) + self.assertAlmostEqual(angle, expected_angle) + self.assertEqual(mask.get_size(), expected_size) + + def test_drawing(self): + """ Test fill, clear, invert, draw, erase + """ + m = pygame.Mask((100,100)) + self.assertEqual(m.count(), 0) + + m.fill() + self.assertEqual(m.count(), 10000) + + m2 = pygame.Mask((10, 10), fill=True) + m.erase(m2, (50,50)) + self.assertEqual(m.count(), 9900) + + m.invert() + self.assertEqual(m.count(), 100) + + m.draw(m2, (0,0)) + self.assertEqual(m.count(), 200) + + m.clear() + self.assertEqual(m.count(), 0) + + def test_outline(self): + """ + """ + + m = pygame.Mask((20,20)) + self.assertEqual(m.outline(), []) + + m.set_at((10,10), 1) + self.assertEqual(m.outline(), [(10,10)]) + + m.set_at((10,12), 1) + self.assertEqual(m.outline(10), [(10,10)]) + + m.set_at((11,11), 1) + self.assertEqual(m.outline(), [(10,10), (11,11), (10,12), (11,11), (10,10)]) + self.assertEqual(m.outline(2), [(10,10), (10,12), (10,10)]) + + #TODO: Test more corner case outlines. + + def test_convolve__size(self): + sizes = [(1,1), (31,31), (32,32), (100,100)] + for s1 in sizes: + m1 = pygame.Mask(s1) + for s2 in sizes: + m2 = pygame.Mask(s2) + o = m1.convolve(m2) + for i in (0,1): + self.assertEqual(o.get_size()[i], + m1.get_size()[i] + m2.get_size()[i] - 1) + + def test_convolve__point_identities(self): + """Convolving with a single point is the identity, while convolving a point with something flips it.""" + m = random_mask((100,100)) + k = pygame.Mask((1,1)) + k.set_at((0,0)) + + self._assertMaskEqual(m, m.convolve(k)) + self._assertMaskEqual(m, k.convolve(k.convolve(m))) + + def test_convolve__with_output(self): + """checks that convolution modifies only the correct portion of the output""" + + m = random_mask((10,10)) + k = pygame.Mask((2,2)) + k.set_at((0,0)) + + o = pygame.Mask((50,50)) + test = pygame.Mask((50,50)) + + m.convolve(k,o) + test.draw(m,(1,1)) + self._assertMaskEqual(o, test) + + o.clear() + test.clear() + + m.convolve(k,o, (10,10)) + test.draw(m,(11,11)) + self._assertMaskEqual(o, test) + + def test_convolve__out_of_range(self): + full = pygame.Mask((2, 2), fill=True) + + self.assertEqual(full.convolve(full, None, ( 0, 3)).count(), 0) + self.assertEqual(full.convolve(full, None, ( 0, 2)).count(), 3) + self.assertEqual(full.convolve(full, None, (-2, -2)).count(), 1) + self.assertEqual(full.convolve(full, None, (-3, -3)).count(), 0) + + def test_convolve(self): + """Tests the definition of convolution""" + m1 = random_mask((100,100)) + m2 = random_mask((100,100)) + conv = m1.convolve(m2) + + for i in range(conv.get_size()[0]): + for j in range(conv.get_size()[1]): + self.assertEqual(conv.get_at((i,j)) == 0, + m1.overlap(m2, (i - 99, j - 99)) is None) + + def _draw_component_pattern_box(self, mask, size, pos, inverse=False): + # Helper method to create/draw a 'box' pattern for testing. + # + # 111 + # 101 3x3 example pattern + # 111 + pattern = pygame.mask.Mask((size, size), fill=True) + pattern.set_at((size // 2, size // 2), 0) + + if inverse: + mask.erase(pattern, pos) + pattern.invert() + else: + mask.draw(pattern, pos) + + return pattern + + def _draw_component_pattern_x(self, mask, size, pos, inverse=False): + # Helper method to create/draw an 'X' pattern for testing. + # + # 101 + # 010 3x3 example pattern + # 101 + pattern = pygame.mask.Mask((size, size)) + + ymax = size - 1 + for y in range(size): + for x in range(size): + if x == y or x == ymax - y: + pattern.set_at((x, y)) + + if inverse: + mask.erase(pattern, pos) + pattern.invert() + else: + mask.draw(pattern, pos) + + return pattern + + def _draw_component_pattern_plus(self, mask, size, pos, inverse=False): + # Helper method to create/draw a '+' pattern for testing. + # + # 010 + # 111 3x3 example pattern + # 010 + pattern = pygame.mask.Mask((size, size)) + + xmid = ymid = size // 2 + for y in range(size): + for x in range(size): + if x == xmid or y == ymid: + pattern.set_at((x, y)) + + if inverse: + mask.erase(pattern, pos) + pattern.invert() + else: + mask.draw(pattern, pos) + + return pattern + + def test_connected_component(self): + """Ensure a mask's connected component is correctly calculated.""" + width, height = 41, 27 + expected_size = (width, height) + original_mask = pygame.mask.Mask(expected_size) + patterns = [] # Patterns and offsets. + + # Draw some connected patterns on the original mask. + offset = (0, 0) + pattern = self._draw_component_pattern_x(original_mask, 3, offset) + patterns.append((pattern, offset)) + + size = 4 + offset = (width - size, 0) + pattern = self._draw_component_pattern_plus(original_mask, size, + offset) + patterns.append((pattern, offset)) + + # Make this one the largest connected component. + offset = (width // 2, height // 2) + pattern = self._draw_component_pattern_box(original_mask, 7, offset) + patterns.append((pattern, offset)) + + expected_pattern, expected_offset = patterns[-1] + expected_count = expected_pattern.count() + original_count = sum(p.count() for p, _ in patterns) + + mask = original_mask.connected_component() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + self.assertEqual(mask.overlap_area(expected_pattern, expected_offset), + expected_count) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), original_count) + self.assertEqual(original_mask.get_size(), expected_size) + + for pattern, offset in patterns: + self.assertEqual(original_mask.overlap_area(pattern, offset), + pattern.count()) + + def test_connected_component__full_mask(self): + """Ensure a mask's connected component is correctly calculated + when the mask is full.""" + expected_size = (23, 31) + original_mask = pygame.mask.Mask(expected_size, fill=True) + expected_count = original_mask.count() + + mask = original_mask.connected_component() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), expected_count) + self.assertEqual(original_mask.get_size(), expected_size) + + def test_connected_component__empty_mask(self): + """Ensure a mask's connected component is correctly calculated + when the mask is empty.""" + expected_size = (37, 43) + original_mask = pygame.mask.Mask(expected_size) + original_count = original_mask.count() + expected_count = 0 + + mask = original_mask.connected_component() + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), original_count) + self.assertEqual(original_mask.get_size(), expected_size) + + def test_connected_component__one_set_bit(self): + """Ensure a mask's connected component is correctly calculated + when the coordinate's bit is set with a connected component of 1 bit. + """ + width, height = 71, 67 + expected_size = (width, height) + original_mask = pygame.mask.Mask(expected_size, fill=True) + xset, yset = width // 2, height // 2 + set_pos = (xset, yset) + expected_offset = (xset - 1, yset - 1) + + # This isolates the bit at set_pos from all the other bits. + expected_pattern = self._draw_component_pattern_box(original_mask, 3, + expected_offset, inverse=True) + expected_count = 1 + original_count = original_mask.count() + + mask = original_mask.connected_component(set_pos) + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + self.assertEqual(mask.overlap_area(expected_pattern, expected_offset), + expected_count) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), original_count) + self.assertEqual(original_mask.get_size(), expected_size) + self.assertEqual(original_mask.overlap_area( + expected_pattern, expected_offset), expected_count) + + def test_connected_component__multi_set_bits(self): + """Ensure a mask's connected component is correctly calculated + when the coordinate's bit is set with a connected component of > 1 bit. + """ + expected_size = (113, 67) + original_mask = pygame.mask.Mask(expected_size) + p_width, p_height = 11, 13 + set_pos = xset, yset = 11, 21 + expected_offset = (xset - 1, yset - 1) + expected_pattern = pygame.mask.Mask((p_width, p_height), fill=True) + + # Make an unsymmetrical pattern. All the set bits need to be connected + # in the resulting pattern for this to work properly. + for y in range(3, p_height): + for x in range(1, p_width): + if x == y or x == y - 3 or x == p_width - 4: + expected_pattern.set_at((x, y), 0) + + expected_count = expected_pattern.count() + original_mask.draw(expected_pattern, expected_offset) + + mask = original_mask.connected_component(set_pos) + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + self.assertEqual(mask.overlap_area(expected_pattern, expected_offset), + expected_count) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), expected_count) + self.assertEqual(original_mask.get_size(), expected_size) + self.assertEqual(original_mask.overlap_area( + expected_pattern, expected_offset), expected_count) + + def test_connected_component__unset_bit(self): + """Ensure a mask's connected component is correctly calculated + when the coordinate's bit is unset. + """ + width, height = 109, 101 + expected_size = (width, height) + original_mask = pygame.mask.Mask(expected_size, fill=True) + unset_pos = (width // 2, height // 2) + original_mask.set_at(unset_pos, 0) + original_count = original_mask.count() + expected_count = 0 + + mask = original_mask.connected_component(unset_pos) + + self.assertEqual(mask.count(), expected_count) + self.assertEqual(mask.get_size(), expected_size) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), original_count) + self.assertEqual(original_mask.get_size(), expected_size) + self.assertEqual(original_mask.get_at(unset_pos), 0) + + def test_connected_component__out_of_bounds(self): + """Ensure connected_component() checks bounds.""" + width, height = 19, 11 + original_size = (width, height) + original_mask = pygame.mask.Mask(original_size, fill=True) + original_count = original_mask.count() + + for pos in ((0, -1), (-1, 0), (0, height + 1), (width + 1, 0)): + with self.assertRaises(IndexError): + mask = original_mask.connected_component(pos) + + # Ensure the original mask is unchanged. + self.assertEqual(original_mask.count(), original_count) + self.assertEqual(original_mask.get_size(), original_size) + + def test_connected_components(self): + """ + """ + + m = pygame.Mask((10,10)) + self.assertEqual(repr(m.connected_components()), "[]") + + comp = m.connected_component() + self.assertEqual(m.count(), comp.count()) + + m.set_at((0,0), 1) + m.set_at((1,1), 1) + comp = m.connected_component() + comps = m.connected_components() + comps1 = m.connected_components(1) + comps2 = m.connected_components(2) + comps3 = m.connected_components(3) + self.assertEqual(comp.count(), comps[0].count()) + self.assertEqual(comps1[0].count(), 2) + self.assertEqual(comps2[0].count(), 2) + self.assertEqual(repr(comps3), "[]") + + m.set_at((9, 9), 1) + comp = m.connected_component() + comp1 = m.connected_component((1, 1)) + comp2 = m.connected_component((2, 2)) + comps = m.connected_components() + comps1 = m.connected_components(1) + comps2 = m.connected_components(2) + comps3 = m.connected_components(3) + self.assertEqual(comp.count(), 2) + self.assertEqual(comp1.count(), 2) + self.assertEqual(comp2.count(), 0) + self.assertEqual(len(comps), 2) + self.assertEqual(len(comps1), 2) + self.assertEqual(len(comps2), 1) + self.assertEqual(len(comps3), 0) + + def test_get_bounding_rects(self): + """ + """ + + m = pygame.Mask((10,10)) + m.set_at((0,0), 1) + m.set_at((1,0), 1) + + m.set_at((0,1), 1) + + m.set_at((0,3), 1) + m.set_at((3,3), 1) + + r = m.get_bounding_rects() + + self.assertEqual( + repr(r), + "[, , ]") + + #1100 + #1111 + m = pygame.Mask((4,2)) + m.set_at((0,0), 1) + m.set_at((1,0), 1) + m.set_at((2,0), 0) + m.set_at((3,0), 0) + + m.set_at((0,1), 1) + m.set_at((1,1), 1) + m.set_at((2,1), 1) + m.set_at((3,1), 1) + + r = m.get_bounding_rects() + self.assertEqual(repr(r), "[]") + + #00100 + #01110 + #00100 + m = pygame.Mask((5,3)) + m.set_at((0,0), 0) + m.set_at((1,0), 0) + m.set_at((2,0), 1) + m.set_at((3,0), 0) + m.set_at((4,0), 0) + + m.set_at((0,1), 0) + m.set_at((1,1), 1) + m.set_at((2,1), 1) + m.set_at((3,1), 1) + m.set_at((4,1), 0) + + m.set_at((0,2), 0) + m.set_at((1,2), 0) + m.set_at((2,2), 1) + m.set_at((3,2), 0) + m.set_at((4,2), 0) + + r = m.get_bounding_rects() + self.assertEqual(repr(r), "[]") + + #00010 + #00100 + #01000 + m = pygame.Mask((5,3)) + m.set_at((0,0), 0) + m.set_at((1,0), 0) + m.set_at((2,0), 0) + m.set_at((3,0), 1) + m.set_at((4,0), 0) + + m.set_at((0,1), 0) + m.set_at((1,1), 0) + m.set_at((2,1), 1) + m.set_at((3,1), 0) + m.set_at((4,1), 0) + + m.set_at((0,2), 0) + m.set_at((1,2), 1) + m.set_at((2,2), 0) + m.set_at((3,2), 0) + m.set_at((4,2), 0) + + r = m.get_bounding_rects() + self.assertEqual(repr(r), "[]") + + #00011 + #11111 + m = pygame.Mask((5,2)) + m.set_at((0,0), 0) + m.set_at((1,0), 0) + m.set_at((2,0), 0) + m.set_at((3,0), 1) + m.set_at((4,0), 1) + + m.set_at((0,1), 1) + m.set_at((1,1), 1) + m.set_at((2,1), 1) + m.set_at((3,1), 1) + m.set_at((3,1), 1) + + r = m.get_bounding_rects() + #TODO: this should really make one bounding rect. + #self.assertEqual(repr(r), "[]") + + def test_zero_mask(self): + mask = pygame.mask.Mask((0, 0)) + self.assertEqual(mask.get_size(), (0, 0)) + + mask = pygame.mask.Mask((100, 0)) + self.assertEqual(mask.get_size(), (100, 0)) + + mask = pygame.mask.Mask((0, 100)) + self.assertEqual(mask.get_size(), (0, 100)) + + def test_zero_mask_get_size(self): + """Ensures get_size correctly handles zero sized masks.""" + for expected_size in ((41, 0), (0, 40), (0, 0)): + mask = pygame.mask.Mask(expected_size) + + size = mask.get_size() + + self.assertEqual(size, expected_size) + + def test_zero_mask_get_at(self): + """Ensures get_at correctly handles zero sized masks.""" + for size in ((51, 0), (0, 50), (0, 0)): + mask = pygame.mask.Mask(size) + + with self.assertRaises(IndexError): + value = mask.get_at((0, 0)) + + def test_zero_mask_set_at(self): + """Ensures set_at correctly handles zero sized masks.""" + for size in ((31, 0), (0, 30), (0, 0)): + mask = pygame.mask.Mask(size) + + with self.assertRaises(IndexError): + mask.set_at((0, 0)) + + def test_zero_mask_overlap(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask((100, 100)) + self.assertEqual(mask.overlap(mask2, (0, 0)), None) + self.assertEqual(mask2.overlap(mask, (0, 0)), None) + + def test_zero_mask_overlap_area(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask((100, 100)) + self.assertEqual(mask.overlap_area(mask2, (0, 0)), 0) + self.assertEqual(mask2.overlap_area(mask, (0, 0)), 0) + + def test_zero_mask_overlap_mask(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask((100, 100)) + + overlap_mask = mask.overlap_mask(mask2, (0, 0)) + overlap_mask2 = mask2.overlap_mask(mask, (0, 0)) + + self.assertEqual(mask.get_size(), overlap_mask.get_size()) + self.assertEqual(mask2.get_size(), overlap_mask2.get_size()) + + def test_zero_mask_fill(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size, fill=True) + self.assertEqual(mask.count(), 0) + + def test_zero_mask_clear(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask.clear() + self.assertEqual(mask.count(), 0) + + def test_zero_mask_flip(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask.invert() + self.assertEqual(mask.count(), 0) + + def test_zero_mask_scale(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask2 = mask.scale((2, 3)) + self.assertEqual(mask2.get_size(), (2, 3)) + + def test_zero_mask_draw(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask((100, 100), fill=True) + before = [mask2.get_at((x, y)) for x in range(100) for y in range(100)] + mask.draw(mask2, (0, 0)) + after = [mask2.get_at((x, y)) for x in range(100) for y in range(100)] + self.assertEqual(before, after) + + def test_zero_mask_erase(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + mask2 = pygame.mask.Mask((100, 100), fill=True) + before = [mask2.get_at((x, y)) for x in range(100) for y in range(100)] + mask.erase(mask2, (0, 0)) + after = [mask2.get_at((x, y)) for x in range(100) for y in range(100)] + self.assertEqual(before, after) + + def test_zero_mask_count(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size, fill=True) + self.assertEqual(mask.count(), 0) + + def test_zero_mask_centroid(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + self.assertEqual(mask.centroid(), (0, 0)) + + def test_zero_mask_angle(self): + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + mask = pygame.mask.Mask(size) + self.assertEqual(mask.angle(), 0.0) + + def test_zero_mask_outline(self): + """Ensures outline correctly handles zero sized masks.""" + expected_points = [] + + for size in ((61, 0), (0, 60), (0, 0)): + mask = pygame.mask.Mask(size) + + points = mask.outline() + + self.assertListEqual(points, expected_points, + 'size={}'.format(size)) + + def test_zero_mask_outline__with_arg(self): + """Ensures outline correctly handles zero sized masks + when using the skip pixels argument.""" + expected_points = [] + + for size in ((66, 0), (0, 65), (0, 0)): + mask = pygame.mask.Mask(size) + + points = mask.outline(10) + + self.assertListEqual(points, expected_points, + 'size={}'.format(size)) + + def test_zero_mask_convolve(self): + """Ensures convolve correctly handles zero sized masks. + + Tests the different combinations of sized and zero sized masks. + """ + for size1 in ((17, 13), (71, 0), (0, 70), (0, 0)): + mask1 = pygame.mask.Mask(size1, fill=True) + + for size2 in ((11, 7), (81, 0), (0, 60), (0, 0)): + msg = 'sizes={}, {}'.format(size1, size2) + mask2 = pygame.mask.Mask(size2, fill=True) + expected_size = (max(0, size1[0] + size2[0] - 1), + max(0, size1[1] + size2[1] - 1)) + + mask = mask1.convolve(mask2) + + self.assertIsNot(mask, mask2, msg) + self.assertEqual(mask.get_size(), expected_size, msg) + + def test_zero_mask_convolve__with_output_mask(self): + """Ensures convolve correctly handles zero sized masks + when using an output mask argument. + + Tests the different combinations of sized and zero sized masks. + """ + for size1 in ((11, 17), (91, 0), (0, 90), (0, 0)): + mask1 = pygame.mask.Mask(size1, fill=True) + + for size2 in ((13, 11), (83, 0), (0, 62), (0, 0)): + mask2 = pygame.mask.Mask(size2, fill=True) + + for output_size in ((7, 5), (71, 0), (0, 70), (0, 0)): + msg = 'sizes={}, {}, {}'.format(size1, size2, output_size) + output_mask = pygame.mask.Mask(output_size) + + mask = mask1.convolve(mask2, output_mask) + + self.assertIs(mask, output_mask, msg) + self.assertEqual(mask.get_size(), output_size, msg) + + def test_zero_mask_connected_component(self): + """Ensures connected_component correctly handles zero sized masks.""" + expected_count = 0 + + for size in ((81, 0), (0, 80), (0, 0)): + mask = pygame.mask.Mask(size) + + cc_mask = mask.connected_component() + + self.assertEqual(cc_mask.get_size(), size) + self.assertEqual(cc_mask.count(), expected_count, + 'size={}'.format(size)) + + def test_zero_mask_connected_component__indexed(self): + """Ensures connected_component correctly handles zero sized masks + when using an index argument.""" + for size in ((91, 0), (0, 90), (0, 0)): + mask = pygame.mask.Mask(size) + + with self.assertRaises(IndexError): + cc_mask = mask.connected_component((0, 0)) + + def test_zero_mask_connected_components(self): + """Ensures connected_components correctly handles zero sized masks.""" + expected_cc_masks = [] + + for size in ((11, 0), (0, 10), (0, 0)): + mask = pygame.mask.Mask(size) + + cc_masks = mask.connected_components() + + self.assertListEqual(cc_masks, expected_cc_masks, + 'size={}'.format(size)) + + def test_zero_mask_get_bounding_rects(self): + """Ensures get_bounding_rects correctly handles zero sized masks.""" + expected_bounding_rects = [] + + for size in ((21, 0), (0, 20), (0, 0)): + mask = pygame.mask.Mask(size) + + bounding_rects = mask.get_bounding_rects() + + self.assertListEqual(bounding_rects, expected_bounding_rects, + 'size={}'.format(size)) + + +class MaskModuleTest(unittest.TestCase): + # The @unittest.expectedFailure decorator can be removed when issue #897 + # is fixed. + @unittest.expectedFailure + def test_from_surface(self): + """Ensures from_surface creates a mask with the correct bits set. + + This test checks the masks created by the from_surface function using + 16 and 32 bit surfaces. Each alpha value (0-255) is tested against + several different threshold values. + Note: On 16 bit surface the requested alpha value can differ from what + is actually set. This test uses the value read from the surface. + """ + threshold_count = 256 + surface_color = [55, 155, 255, 0] + expected_size = (11, 9) + all_set_count = expected_size[0] * expected_size[1] + none_set_count = 0 + + for depth in (16, 32): + surface = pygame.Surface(expected_size, SRCALPHA, depth) + + for alpha in range(threshold_count): + surface_color[3] = alpha + surface.fill(surface_color) + + if depth < 32: + # On surfaces with depths < 32 the requested alpha can be + # different than what gets set. Use the value read from the + # surface. + alpha = surface.get_at((0, 0))[3] + + # Test the mask created at threshold values low, high and + # around alpha. + threshold_test_values = set( + [-1, 0, alpha - 1, alpha, alpha + 1, 255, 256]) + + for threshold in threshold_test_values: + msg = 'depth={}, alpha={}, threshold={}'.format( + depth, alpha, threshold) + + if alpha > threshold: + expected_count = all_set_count + else: + expected_count = none_set_count + + mask = pygame.mask.from_surface(surface, threshold) + + self.assertEqual(mask.get_size(), expected_size, msg) + self.assertEqual(mask.count(), expected_count, msg) + + def test_from_surface__different_alphas_32bit(self): + """Ensures from_surface creates a mask with the correct bits set + when pixels have different alpha values (32 bits surfaces). + + This test checks the masks created by the from_surface function using + a 32 bit surface. The surface is created with each pixel having a + different alpha value (0-255). This surface is tested over a range + of threshold values (0-255). + """ + offset = (0, 0) + threshold_count = 256 + surface_color = [10, 20, 30, 0] + expected_size = (threshold_count, 1) + expected_mask = pygame.Mask(expected_size, fill=True) + surface = pygame.Surface(expected_size, SRCALPHA, 32) + + # Give each pixel a different alpha. + surface.lock() # Lock for possible speed up. + for a in range(threshold_count): + surface_color[3] = a + surface.set_at((a, 0), surface_color) + surface.unlock() + + # Test the mask created for each different alpha threshold. + for threshold in range(threshold_count): + msg = 'threshold={}'.format(threshold) + expected_mask.set_at((threshold, 0), 0) + expected_count = expected_mask.count() + + mask = pygame.mask.from_surface(surface, threshold) + + self.assertEqual(mask.get_size(), expected_size, msg) + self.assertEqual(mask.count(), expected_count, msg) + self.assertEqual(mask.overlap_area(expected_mask, offset), + expected_count, msg) + + # The @unittest.expectedFailure decorator can be removed when issue #897 + # is fixed. + @unittest.expectedFailure + def test_from_surface__different_alphas_16bit(self): + """Ensures from_surface creates a mask with the correct bits set + when pixels have different alpha values (16 bit surfaces). + + This test checks the masks created by the from_surface function using + a 16 bit surface. Each pixel of the surface is set with a different + alpha value (0-255), but since this is a 16 bit surface the requested + alpha value can differ from what is actually set. The resulting surface + will have groups of alpha values which complicates the test as the + alpha groups will all be set/unset at a given threshold. The setup + calculates these groups and an expected mask for each. This test data + is then used to test each alpha grouping over a range of threshold + values. + """ + threshold_count = 256 + surface_color = [110, 120, 130, 0] + expected_size = (threshold_count, 1) + surface = pygame.Surface(expected_size, SRCALPHA, 16) + + # Give each pixel a different alpha. + surface.lock() # Lock for possible speed up. + for a in range(threshold_count): + surface_color[3] = a + surface.set_at((a, 0), surface_color) + surface.unlock() + + alpha_thresholds = OrderedDict() + special_thresholds = set() + + # Create the threshold ranges and identify any thresholds that need + # special handling. + for threshold in range(threshold_count): + # On surfaces with depths < 32 the requested alpha can be different + # than what gets set. Use the value read from the surface. + alpha = surface.get_at((threshold, 0))[3] + + if alpha not in alpha_thresholds: + alpha_thresholds[alpha] = [threshold] + else: + alpha_thresholds[alpha].append(threshold) + + if threshold < alpha: + special_thresholds.add(threshold) + + # Use each threshold group to create an expected mask. + test_data = [] # [(from_threshold, to_threshold, expected_mask), ...] + offset = (0, 0) + erase_mask = pygame.Mask(expected_size) + exp_mask = pygame.Mask(expected_size, fill=True) + + for thresholds in alpha_thresholds.values(): + for threshold in thresholds: + if threshold in special_thresholds: + # Any special thresholds just reuse previous exp_mask. + test_data.append((threshold, threshold + 1, exp_mask)) + else: + to_threshold = thresholds[-1] + 1 + + # Make the expected mask by erasing the unset bits. + for thres in range(to_threshold): + erase_mask.set_at((thres, 0), 1) + + exp_mask = pygame.Mask(expected_size, fill=True) + exp_mask.erase(erase_mask, offset) + test_data.append((threshold, to_threshold, exp_mask)) + break + + # All the setup is done. Now test the masks created over the threshold + # ranges. + for from_threshold, to_threshold, expected_mask in test_data: + expected_count = expected_mask.count() + + for threshold in range(from_threshold, to_threshold): + msg = 'threshold={}'.format(threshold) + + mask = pygame.mask.from_surface(surface, threshold) + + self.assertEqual(mask.get_size(), expected_size, msg) + self.assertEqual(mask.count(), expected_count, msg) + self.assertEqual(mask.overlap_area(expected_mask, offset), + expected_count, msg) + + def todo_test_from_surface__with_colorkey(self): + """Ensures from_surface creates a mask with the correct bits set + when the surface uses a colorkey. + """ + self.fail() + + def test_from_threshold(self): + """ Does mask.from_threshold() work correctly? + """ + + a = [16, 24, 32] + + for i in a: + surf = pygame.surface.Surface((70,70), 0, i) + surf.fill((100,50,200),(20,20,20,20)) + mask = pygame.mask.from_threshold(surf,(100,50,200,255),(10,10,10,255)) + + rects = mask.get_bounding_rects() + + self.assertEqual(mask.count(), 400) + self.assertEqual(mask.get_bounding_rects(), [pygame.Rect((20,20,20,20))]) + + for i in a: + surf = pygame.surface.Surface((70,70), 0, i) + surf2 = pygame.surface.Surface((70,70), 0, i) + surf.fill((100,100,100)) + surf2.fill((150,150,150)) + surf2.fill((100,100,100), (40,40,10,10)) + mask = pygame.mask.from_threshold(surf, (0,0,0,0), (10,10,10,255), surf2) + + self.assertEqual(mask.count(), 100) + self.assertEqual(mask.get_bounding_rects(), [pygame.Rect((40,40,10,10))]) + + def test_zero_size_from_surface(self): + """Ensures from_surface can create masks from zero sized surfaces.""" + for size in ((100, 0), (0, 100), (0, 0)): + mask = pygame.mask.from_surface(pygame.Surface(size)) + + self.assertIsInstance(mask, pygame.mask.MaskType, + 'size={}'.format(size)) + self.assertEqual(mask.get_size(), size) + + def test_zero_size_from_threshold(self): + a = [16, 24, 32] + sizes = ((100, 0), (0, 100), (0, 0)) + + for size in sizes: + for i in a: + surf = pygame.surface.Surface(size, 0, i) + surf.fill((100, 50, 200), (20, 20, 20, 20)) + mask = pygame.mask.from_threshold(surf, (100, 50, 200, 255), (10, 10, 10, 255)) + + self.assertEqual(mask.count(), 0) + + rects = mask.get_bounding_rects() + self.assertEqual(rects, []) + + for i in a: + surf = pygame.surface.Surface(size, 0, i) + surf2 = pygame.surface.Surface(size, 0, i) + surf.fill((100, 100, 100)) + surf2.fill((150, 150, 150)) + surf2.fill((100, 100, 100), (40, 40, 10, 10)) + mask = pygame.mask.from_threshold(surf, (0, 0, 0, 0), (10, 10, 10, 255), surf2) + + self.assertEqual(mask.count(), 0) + + rects = mask.get_bounding_rects() + self.assertEqual(rects, []) + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/math_test.py b/venv/Lib/site-packages/pygame/tests/math_test.py new file mode 100644 index 0000000..07a1dee --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/math_test.py @@ -0,0 +1,1612 @@ +# -*- coding: utf-8 -*- +import sys +import unittest +import math +from time import clock +import platform + +import pygame.math +from pygame.math import Vector2, Vector3 + +IS_PYPY = 'PyPy' == platform.python_implementation() +PY3 = sys.version_info.major == 3 + + +class Vector2TypeTest(unittest.TestCase): + + def setUp(self): + pygame.math.enable_swizzling() + self.zeroVec = Vector2() + self.e1 = Vector2(1, 0) + self.e2 = Vector2(0, 1) + self.t1 = (1.2, 3.4) + self.l1 = list(self.t1) + self.v1 = Vector2(self.t1) + self.t2 = (5.6, 7.8) + self.l2 = list(self.t2) + self.v2 = Vector2(self.t2) + self.s1 = 5.6 + self.s2 = 7.8 + + def tearDown(self): + pygame.math.enable_swizzling() + + def testConstructionDefault(self): + v = Vector2() + self.assertEqual(v.x, 0.) + self.assertEqual(v.y, 0.) + + def testConstructionScalar(self): + v = Vector2(1) + self.assertEqual(v.x, 1.) + self.assertEqual(v.y, 1.) + + def testConstructionScalarKeywords(self): + v = Vector2(x=1) + self.assertEqual(v.x, 1.) + self.assertEqual(v.y, 1.) + + def testConstructionKeywords(self): + v = Vector2(x=1, y=2) + self.assertEqual(v.x, 1.) + self.assertEqual(v.y, 2.) + + def testConstructionXY(self): + v = Vector2(1.2, 3.4) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + + def testConstructionTuple(self): + v = Vector2((1.2, 3.4)) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + + def testConstructionList(self): + v = Vector2([1.2, 3.4]) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + + def testConstructionVector2(self): + v = Vector2(Vector2(1.2, 3.4)) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + + def testAttributAccess(self): + tmp = self.v1.x + self.assertEqual(tmp, self.v1.x) + self.assertEqual(tmp, self.v1[0]) + tmp = self.v1.y + self.assertEqual(tmp, self.v1.y) + self.assertEqual(tmp, self.v1[1]) + self.v1.x = 3.141 + self.assertEqual(self.v1.x, 3.141) + self.v1.y = 3.141 + self.assertEqual(self.v1.y, 3.141) + def assign_nonfloat(): + v = Vector2() + v.x = "spam" + self.assertRaises(TypeError, assign_nonfloat) + + def testSequence(self): + v = Vector2(1.2, 3.4) + Vector2()[:] + self.assertEqual(len(v), 2) + self.assertEqual(v[0], 1.2) + self.assertEqual(v[1], 3.4) + self.assertRaises(IndexError, lambda : v[2]) + self.assertEqual(v[-1], 3.4) + self.assertEqual(v[-2], 1.2) + self.assertRaises(IndexError, lambda : v[-3]) + self.assertEqual(v[:], [1.2, 3.4]) + self.assertEqual(v[1:], [3.4]) + self.assertEqual(v[:1], [1.2]) + self.assertEqual(list(v), [1.2, 3.4]) + self.assertEqual(tuple(v), (1.2, 3.4)) + v[0] = 5.6 + v[1] = 7.8 + self.assertEqual(v.x, 5.6) + self.assertEqual(v.y, 7.8) + v[:] = [9.1, 11.12] + self.assertEqual(v.x, 9.1) + self.assertEqual(v.y, 11.12) + def overpopulate(): + v = Vector2() + v[:] = [1, 2, 3] + self.assertRaises(ValueError, overpopulate) + def underpopulate(): + v = Vector2() + v[:] = [1] + self.assertRaises(ValueError, underpopulate) + def assign_nonfloat(): + v = Vector2() + v[0] = "spam" + self.assertRaises(TypeError, assign_nonfloat) + + def testExtendedSlicing(self): + # deletion + def delSlice(vec, start=None, stop=None, step=None): + if start is not None and stop is not None and step is not None: + del vec[start:stop:step] + elif start is not None and stop is None and step is not None: + del vec[start::step] + elif start is None and stop is None and step is not None: + del vec[::step] + v = Vector2(self.v1) + self.assertRaises(TypeError, delSlice, v, None, None, 2) + self.assertRaises(TypeError, delSlice, v, 1, None, 2) + self.assertRaises(TypeError, delSlice, v, 1, 2, 1) + + # assignment + v = Vector2(self.v1) + v[::2] = [-1] + self.assertEqual(v, [-1, self.v1.y]) + v = Vector2(self.v1) + v[::-2] = [10] + self.assertEqual(v, [self.v1.x, 10]) + v = Vector2(self.v1) + v[::-1] = v + self.assertEqual(v, [self.v1.y, self.v1.x]) + a = Vector2(self.v1) + b = Vector2(self.v1) + c = Vector2(self.v1) + a[1:2] = [2.2] + b[slice(1,2)] = [2.2] + c[1:2:] = (2.2,) + self.assertEqual(a, b) + self.assertEqual(a, c) + self.assertEqual(type(a), type(self.v1)) + self.assertEqual(type(b), type(self.v1)) + self.assertEqual(type(c), type(self.v1)) + + def testAdd(self): + v3 = self.v1 + self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x + self.v2.x) + self.assertEqual(v3.y, self.v1.y + self.v2.y) + v3 = self.v1 + self.t2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x + self.t2[0]) + self.assertEqual(v3.y, self.v1.y + self.t2[1]) + v3 = self.v1 + self.l2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x + self.l2[0]) + self.assertEqual(v3.y, self.v1.y + self.l2[1]) + v3 = self.t1 + self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.t1[0] + self.v2.x) + self.assertEqual(v3.y, self.t1[1] + self.v2.y) + v3 = self.l1 + self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.l1[0] + self.v2.x) + self.assertEqual(v3.y, self.l1[1] + self.v2.y) + + def testSub(self): + v3 = self.v1 - self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x - self.v2.x) + self.assertEqual(v3.y, self.v1.y - self.v2.y) + v3 = self.v1 - self.t2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x - self.t2[0]) + self.assertEqual(v3.y, self.v1.y - self.t2[1]) + v3 = self.v1 - self.l2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x - self.l2[0]) + self.assertEqual(v3.y, self.v1.y - self.l2[1]) + v3 = self.t1 - self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.t1[0] - self.v2.x) + self.assertEqual(v3.y, self.t1[1] - self.v2.y) + v3 = self.l1 - self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.l1[0] - self.v2.x) + self.assertEqual(v3.y, self.l1[1] - self.v2.y) + + def testScalarMultiplication(self): + v = self.s1 * self.v1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, self.s1 * self.v1.x) + self.assertEqual(v.y, self.s1 * self.v1.y) + v = self.v1 * self.s2 + self.assertEqual(v.x, self.v1.x * self.s2) + self.assertEqual(v.y, self.v1.y * self.s2) + + def testScalarDivision(self): + v = self.v1 / self.s1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertAlmostEqual(v.x, self.v1.x / self.s1) + self.assertAlmostEqual(v.y, self.v1.y / self.s1) + v = self.v1 // self.s2 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, self.v1.x // self.s2) + self.assertEqual(v.y, self.v1.y // self.s2) + + def testBool(self): + self.assertEqual(bool(self.zeroVec), False) + self.assertEqual(bool(self.v1), True) + self.assertTrue(not self.zeroVec) + self.assertTrue(self.v1) + + def testUnary(self): + v = +self.v1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, self.v1.x) + self.assertEqual(v.y, self.v1.y) + self.assertNotEqual(id(v), id(self.v1)) + v = -self.v1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, -self.v1.x) + self.assertEqual(v.y, -self.v1.y) + self.assertNotEqual(id(v), id(self.v1)) + + def testCompare(self): + int_vec = Vector2(3, -2) + flt_vec = Vector2(3.0, -2.0) + zero_vec = Vector2(0, 0) + self.assertEqual(int_vec == flt_vec, True) + self.assertEqual(int_vec != flt_vec, False) + self.assertEqual(int_vec != zero_vec, True) + self.assertEqual(flt_vec == zero_vec, False) + self.assertEqual(int_vec == (3, -2), True) + self.assertEqual(int_vec != (3, -2), False) + self.assertEqual(int_vec != [0, 0], True) + self.assertEqual(int_vec == [0, 0], False) + self.assertEqual(int_vec != 5, True) + self.assertEqual(int_vec == 5, False) + self.assertEqual(int_vec != [3, -2, 0], True) + self.assertEqual(int_vec == [3, -2, 0], False) + + def testStr(self): + v = Vector2(1.2, 3.4) + self.assertEqual(str(v), "[1.2, 3.4]") + + def testRepr(self): + v = Vector2(1.2, 3.4) + self.assertEqual(v.__repr__(), "") + self.assertEqual(v, Vector2(v.__repr__())) + + def testIter(self): + it = self.v1.__iter__() + if PY3: + next_ = it.__next__ + else: + next_ = it.next + self.assertEqual(next_(), self.v1[0]) + self.assertEqual(next_(), self.v1[1]) + self.assertRaises(StopIteration, lambda : next_()) + it1 = self.v1.__iter__() + it2 = self.v1.__iter__() + self.assertNotEqual(id(it1), id(it2)) + self.assertEqual(id(it1), id(it1.__iter__())) + self.assertEqual(list(it1), list(it2)); + self.assertEqual(list(self.v1.__iter__()), self.l1) + idx = 0 + for val in self.v1: + self.assertEqual(val, self.v1[idx]) + idx += 1 + + def test_rotate(self): + v1 = Vector2(1, 0) + v2 = v1.rotate(90) + v3 = v1.rotate(90 + 360) + self.assertEqual(v1.x, 1) + self.assertEqual(v1.y, 0) + self.assertEqual(v2.x, 0) + self.assertEqual(v2.y, 1) + self.assertEqual(v3.x, v2.x) + self.assertEqual(v3.y, v2.y) + v1 = Vector2(-1, -1) + v2 = v1.rotate(-90) + self.assertEqual(v2.x, -1) + self.assertEqual(v2.y, 1) + v2 = v1.rotate(360) + self.assertEqual(v1.x, v2.x) + self.assertEqual(v1.y, v2.y) + v2 = v1.rotate(0) + self.assertEqual(v1.x, v2.x) + self.assertEqual(v1.y, v2.y) + # issue 214 + self.assertEqual(Vector2(0, 1).rotate(359.99999999), Vector2(0, 1)) + + def test_rotate_ip(self): + v = Vector2(1, 0) + self.assertEqual(v.rotate_ip(90), None) + self.assertEqual(v.x, 0) + self.assertEqual(v.y, 1) + v = Vector2(-1, -1) + v.rotate_ip(-90) + self.assertEqual(v.x, -1) + self.assertEqual(v.y, 1) + + def test_normalize(self): + v = self.v1.normalize() + # length is 1 + self.assertAlmostEqual(v.x * v.x + v.y * v.y, 1.) + # v1 is unchanged + self.assertEqual(self.v1.x, self.l1[0]) + self.assertEqual(self.v1.y, self.l1[1]) + # v2 is paralell to v1 + self.assertAlmostEqual(self.v1.x * v.y - self.v1.y * v.x, 0.) + self.assertRaises(ValueError, lambda : self.zeroVec.normalize()) + + def test_normalize_ip(self): + v = +self.v1 + # v has length != 1 before normalizing + self.assertNotEqual(v.x * v.x + v.y * v.y, 1.) + # inplace operations should return None + self.assertEqual(v.normalize_ip(), None) + # length is 1 + self.assertAlmostEqual(v.x * v.x + v.y * v.y, 1.) + # v2 is paralell to v1 + self.assertAlmostEqual(self.v1.x * v.y - self.v1.y * v.x, 0.) + self.assertRaises(ValueError, lambda : self.zeroVec.normalize_ip()) + + def test_is_normalized(self): + self.assertEqual(self.v1.is_normalized(), False) + v = self.v1.normalize() + self.assertEqual(v.is_normalized(), True) + self.assertEqual(self.e2.is_normalized(), True) + self.assertEqual(self.zeroVec.is_normalized(), False) + + def test_cross(self): + self.assertEqual(self.v1.cross(self.v2), + self.v1.x * self.v2.y - self.v1.y * self.v2.x) + self.assertEqual(self.v1.cross(self.l2), + self.v1.x * self.l2[1] - self.v1.y * self.l2[0]) + self.assertEqual(self.v1.cross(self.t2), + self.v1.x * self.t2[1] - self.v1.y * self.t2[0]) + self.assertEqual(self.v1.cross(self.v2), -self.v2.cross(self.v1)) + self.assertEqual(self.v1.cross(self.v1), 0) + + def test_dot(self): + self.assertAlmostEqual(self.v1.dot(self.v2), + self.v1.x * self.v2.x + self.v1.y * self.v2.y) + self.assertAlmostEqual(self.v1.dot(self.l2), + self.v1.x * self.l2[0] + self.v1.y * self.l2[1]) + self.assertAlmostEqual(self.v1.dot(self.t2), + self.v1.x * self.t2[0] + self.v1.y * self.t2[1]) + self.assertEqual(self.v1.dot(self.v2), self.v2.dot(self.v1)) + self.assertEqual(self.v1.dot(self.v2), self.v1 * self.v2) + + def test_angle_to(self): + self.assertEqual(self.v1.rotate(self.v1.angle_to(self.v2)).normalize(), + self.v2.normalize()) + self.assertEqual(Vector2(1, 1).angle_to((-1, 1)), 90) + self.assertEqual(Vector2(1, 0).angle_to((0, -1)), -90) + self.assertEqual(Vector2(1, 0).angle_to((-1, 1)), 135) + self.assertEqual(abs(Vector2(1, 0).angle_to((-1, 0))), 180) + + def test_scale_to_length(self): + v = Vector2(1, 1) + v.scale_to_length(2.5) + self.assertEqual(v, Vector2(2.5, 2.5) / math.sqrt(2)) + self.assertRaises(ValueError, lambda : self.zeroVec.scale_to_length(1)) + self.assertEqual(v.scale_to_length(0), None) + self.assertEqual(v, self.zeroVec) + + def test_length(self): + self.assertEqual(Vector2(3, 4).length(), 5) + self.assertEqual(Vector2(-3, 4).length(), 5) + self.assertEqual(self.zeroVec.length(), 0) + + def test_length_squared(self): + self.assertEqual(Vector2(3, 4).length_squared(), 25) + self.assertEqual(Vector2(-3, 4).length_squared(), 25) + self.assertEqual(self.zeroVec.length_squared(), 0) + + def test_reflect(self): + v = Vector2(1, -1) + n = Vector2(0, 1) + self.assertEqual(v.reflect(n), Vector2(1, 1)) + self.assertEqual(v.reflect(3*n), v.reflect(n)) + self.assertEqual(v.reflect(-v), -v) + self.assertRaises(ValueError, lambda : v.reflect(self.zeroVec)) + + def test_reflect_ip(self): + v1 = Vector2(1, -1) + v2 = Vector2(v1) + n = Vector2(0, 1) + self.assertEqual(v2.reflect_ip(n), None) + self.assertEqual(v2, Vector2(1, 1)) + v2 = Vector2(v1) + v2.reflect_ip(3*n) + self.assertEqual(v2, v1.reflect(n)) + v2 = Vector2(v1) + v2.reflect_ip(-v1) + self.assertEqual(v2, -v1) + self.assertRaises(ValueError, lambda : v2.reflect_ip(Vector2())) + + def test_distance_to(self): + diff = self.v1 - self.v2 + self.assertEqual(self.e1.distance_to(self.e2), math.sqrt(2)) + self.assertAlmostEqual(self.v1.distance_to(self.v2), + math.sqrt(diff.x * diff.x + diff.y * diff.y)) + self.assertEqual(self.v1.distance_to(self.v1), 0) + self.assertEqual(self.v1.distance_to(self.v2), + self.v2.distance_to(self.v1)) + + def test_distance_squared_to(self): + diff = self.v1 - self.v2 + self.assertEqual(self.e1.distance_squared_to(self.e2), 2) + self.assertAlmostEqual(self.v1.distance_squared_to(self.v2), + diff.x * diff.x + diff.y * diff.y) + self.assertEqual(self.v1.distance_squared_to(self.v1), 0) + self.assertEqual(self.v1.distance_squared_to(self.v2), + self.v2.distance_squared_to(self.v1)) + + def test_update(self): + v = Vector2(3, 4) + v.update(0) + self.assertEqual(v, Vector2((0, 0))) + v.update(5, 1) + self.assertEqual(v, Vector2(5, 1)) + v.update((4, 1)) + self.assertNotEqual(v, Vector2((5, 1))) + + def test_swizzle(self): + self.assertTrue(hasattr(pygame.math, "enable_swizzling")) + self.assertTrue(hasattr(pygame.math, "disable_swizzling")) + # swizzling not disabled by default + pygame.math.disable_swizzling() + self.assertRaises(AttributeError, lambda : self.v1.yx) + pygame.math.enable_swizzling() + + self.assertEqual(self.v1.yx, (self.v1.y, self.v1.x)) + self.assertEqual(self.v1.xxyyxy, (self.v1.x, self.v1.x, self.v1.y, + self.v1.y, self.v1.x, self.v1.y)) + self.v1.xy = self.t2 + self.assertEqual(self.v1, self.t2) + self.v1.yx = self.t2 + self.assertEqual(self.v1, (self.t2[1], self.t2[0])) + self.assertEqual(type(self.v1), Vector2) + def invalidSwizzleX(): + Vector2().xx = (1, 2) + def invalidSwizzleY(): + Vector2().yy = (1, 2) + self.assertRaises(AttributeError, invalidSwizzleX) + self.assertRaises(AttributeError, invalidSwizzleY) + def invalidAssignment(): + Vector2().xy = 3 + self.assertRaises(TypeError, invalidAssignment) + def unicodeAttribute(): + getattr(Vector2(), "ä") + self.assertRaises(AttributeError, unicodeAttribute) + + def test_swizzle_return_types(self): + self.assertEqual(type(self.v1.x), float) + self.assertEqual(type(self.v1.xy), Vector2) + self.assertEqual(type(self.v1.xyx), Vector3) + # but we don't have vector4 or above... so tuple. + self.assertEqual(type(self.v1.xyxy), tuple) + self.assertEqual(type(self.v1.xyxyx), tuple) + + def test_elementwise(self): + # behaviour for "elementwise op scalar" + self.assertEqual(self.v1.elementwise() + self.s1, + (self.v1.x + self.s1, self.v1.y + self.s1)) + self.assertEqual(self.v1.elementwise() - self.s1, + (self.v1.x - self.s1, self.v1.y - self.s1)) + self.assertEqual(self.v1.elementwise() * self.s2, + (self.v1.x * self.s2, self.v1.y * self.s2)) + self.assertEqual(self.v1.elementwise() / self.s2, + (self.v1.x / self.s2, self.v1.y / self.s2)) + self.assertEqual(self.v1.elementwise() // self.s1, + (self.v1.x // self.s1, self.v1.y // self.s1)) + self.assertEqual(self.v1.elementwise() ** self.s1, + (self.v1.x ** self.s1, self.v1.y ** self.s1)) + self.assertEqual(self.v1.elementwise() % self.s1, + (self.v1.x % self.s1, self.v1.y % self.s1)) + self.assertEqual(self.v1.elementwise() > self.s1, + self.v1.x > self.s1 and self.v1.y > self.s1) + self.assertEqual(self.v1.elementwise() < self.s1, + self.v1.x < self.s1 and self.v1.y < self.s1) + self.assertEqual(self.v1.elementwise() == self.s1, + self.v1.x == self.s1 and self.v1.y == self.s1) + self.assertEqual(self.v1.elementwise() != self.s1, + self.v1.x != self.s1 and self.v1.y != self.s1) + self.assertEqual(self.v1.elementwise() >= self.s1, + self.v1.x >= self.s1 and self.v1.y >= self.s1) + self.assertEqual(self.v1.elementwise() <= self.s1, + self.v1.x <= self.s1 and self.v1.y <= self.s1) + self.assertEqual(self.v1.elementwise() != self.s1, + self.v1.x != self.s1 and self.v1.y != self.s1) + # behaviour for "scalar op elementwise" + self.assertEqual(5 + self.v1.elementwise(), Vector2(5, 5) + self.v1) + self.assertEqual(3.5 - self.v1.elementwise(), Vector2(3.5, 3.5) - self.v1) + self.assertEqual(7.5 * self.v1.elementwise() , 7.5 * self.v1) + self.assertEqual(-3.5 / self.v1.elementwise(), (-3.5 / self.v1.x, -3.5 / self.v1.y)) + self.assertEqual(-3.5 // self.v1.elementwise(), (-3.5 // self.v1.x, -3.5 // self.v1.y)) + self.assertEqual(-3.5 ** self.v1.elementwise(), (-3.5 ** self.v1.x, -3.5 ** self.v1.y)) + self.assertEqual(3 % self.v1.elementwise(), (3 % self.v1.x, 3 % self.v1.y)) + self.assertEqual(2 < self.v1.elementwise(), 2 < self.v1.x and 2 < self.v1.y) + self.assertEqual(2 > self.v1.elementwise(), 2 > self.v1.x and 2 > self.v1.y) + self.assertEqual(1 == self.v1.elementwise(), 1 == self.v1.x and 1 == self.v1.y) + self.assertEqual(1 != self.v1.elementwise(), 1 != self.v1.x and 1 != self.v1.y) + self.assertEqual(2 <= self.v1.elementwise(), 2 <= self.v1.x and 2 <= self.v1.y) + self.assertEqual(-7 >= self.v1.elementwise(), -7 >= self.v1.x and -7 >= self.v1.y) + self.assertEqual(-7 != self.v1.elementwise(), -7 != self.v1.x and -7 != self.v1.y) + + # behaviour for "elementwise op vector" + self.assertEqual(type(self.v1.elementwise() * self.v2), type(self.v1)) + self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2) + self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2) + self.assertEqual(self.v1.elementwise() - self.v2, self.v1 - self.v2) + self.assertEqual(self.v1.elementwise() * self.v2, (self.v1.x * self.v2.x, self.v1.y * self.v2.y)) + self.assertEqual(self.v1.elementwise() / self.v2, (self.v1.x / self.v2.x, self.v1.y / self.v2.y)) + self.assertEqual(self.v1.elementwise() // self.v2, (self.v1.x // self.v2.x, self.v1.y // self.v2.y)) + self.assertEqual(self.v1.elementwise() ** self.v2, (self.v1.x ** self.v2.x, self.v1.y ** self.v2.y)) + self.assertEqual(self.v1.elementwise() % self.v2, (self.v1.x % self.v2.x, self.v1.y % self.v2.y)) + self.assertEqual(self.v1.elementwise() > self.v2, self.v1.x > self.v2.x and self.v1.y > self.v2.y) + self.assertEqual(self.v1.elementwise() < self.v2, self.v1.x < self.v2.x and self.v1.y < self.v2.y) + self.assertEqual(self.v1.elementwise() >= self.v2, self.v1.x >= self.v2.x and self.v1.y >= self.v2.y) + self.assertEqual(self.v1.elementwise() <= self.v2, self.v1.x <= self.v2.x and self.v1.y <= self.v2.y) + self.assertEqual(self.v1.elementwise() == self.v2, self.v1.x == self.v2.x and self.v1.y == self.v2.y) + self.assertEqual(self.v1.elementwise() != self.v2, self.v1.x != self.v2.x and self.v1.y != self.v2.y) + # behaviour for "vector op elementwise" + self.assertEqual(self.v2 + self.v1.elementwise(), self.v2 + self.v1) + self.assertEqual(self.v2 - self.v1.elementwise(), self.v2 - self.v1) + self.assertEqual(self.v2 * self.v1.elementwise(), (self.v2.x * self.v1.x, self.v2.y * self.v1.y)) + self.assertEqual(self.v2 / self.v1.elementwise(), (self.v2.x / self.v1.x, self.v2.y / self.v1.y)) + self.assertEqual(self.v2 // self.v1.elementwise(), (self.v2.x // self.v1.x, self.v2.y // self.v1.y)) + self.assertEqual(self.v2 ** self.v1.elementwise(), (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y)) + self.assertEqual(self.v2 % self.v1.elementwise(), (self.v2.x % self.v1.x, self.v2.y % self.v1.y)) + self.assertEqual(self.v2 < self.v1.elementwise(), self.v2.x < self.v1.x and self.v2.y < self.v1.y) + self.assertEqual(self.v2 > self.v1.elementwise(), self.v2.x > self.v1.x and self.v2.y > self.v1.y) + self.assertEqual(self.v2 <= self.v1.elementwise(), self.v2.x <= self.v1.x and self.v2.y <= self.v1.y) + self.assertEqual(self.v2 >= self.v1.elementwise(), self.v2.x >= self.v1.x and self.v2.y >= self.v1.y) + self.assertEqual(self.v2 == self.v1.elementwise(), self.v2.x == self.v1.x and self.v2.y == self.v1.y) + self.assertEqual(self.v2 != self.v1.elementwise(), self.v2.x != self.v1.x and self.v2.y != self.v1.y) + + # behaviour for "elementwise op elementwise" + self.assertEqual(self.v2.elementwise() + self.v1.elementwise(), self.v2 + self.v1) + self.assertEqual(self.v2.elementwise() - self.v1.elementwise(), self.v2 - self.v1) + self.assertEqual(self.v2.elementwise() * self.v1.elementwise(), (self.v2.x * self.v1.x, self.v2.y * self.v1.y)) + self.assertEqual(self.v2.elementwise() / self.v1.elementwise(), (self.v2.x / self.v1.x, self.v2.y / self.v1.y)) + self.assertEqual(self.v2.elementwise() // self.v1.elementwise(), (self.v2.x // self.v1.x, self.v2.y // self.v1.y)) + self.assertEqual(self.v2.elementwise() ** self.v1.elementwise(), (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y)) + self.assertEqual(self.v2.elementwise() % self.v1.elementwise(), (self.v2.x % self.v1.x, self.v2.y % self.v1.y)) + self.assertEqual(self.v2.elementwise() < self.v1.elementwise(), self.v2.x < self.v1.x and self.v2.y < self.v1.y) + self.assertEqual(self.v2.elementwise() > self.v1.elementwise(), self.v2.x > self.v1.x and self.v2.y > self.v1.y) + self.assertEqual(self.v2.elementwise() <= self.v1.elementwise(), self.v2.x <= self.v1.x and self.v2.y <= self.v1.y) + self.assertEqual(self.v2.elementwise() >= self.v1.elementwise(), self.v2.x >= self.v1.x and self.v2.y >= self.v1.y) + self.assertEqual(self.v2.elementwise() == self.v1.elementwise(), self.v2.x == self.v1.x and self.v2.y == self.v1.y) + self.assertEqual(self.v2.elementwise() != self.v1.elementwise(), self.v2.x != self.v1.x and self.v2.y != self.v1.y) + + # other behaviour + self.assertEqual(abs(self.v1.elementwise()), (abs(self.v1.x), abs(self.v1.y))) + self.assertEqual(-self.v1.elementwise(), -self.v1) + self.assertEqual(+self.v1.elementwise(), +self.v1) + self.assertEqual(bool(self.v1.elementwise()), bool(self.v1)) + self.assertEqual(bool(Vector2().elementwise()), bool(Vector2())) + self.assertEqual(self.zeroVec.elementwise() ** 0, (1, 1)) + self.assertRaises(ValueError, lambda : pow(Vector2(-1, 0).elementwise(), 1.2)) + self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1) + + def test_elementwise(self): + v1 = self.v1 + v2 = self.v2 + s1 = self.s1 + s2 = self.s2 + # behaviour for "elementwise op scalar" + self.assertEqual(v1.elementwise() + s1, (v1.x + s1, v1.y + s1)) + self.assertEqual(v1.elementwise() - s1, (v1.x - s1, v1.y - s1)) + self.assertEqual(v1.elementwise() * s2, (v1.x * s2, v1.y * s2)) + self.assertEqual(v1.elementwise() / s2, (v1.x / s2, v1.y / s2)) + self.assertEqual(v1.elementwise() // s1, (v1.x // s1, v1.y // s1)) + self.assertEqual(v1.elementwise() ** s1, (v1.x ** s1, v1.y ** s1)) + self.assertEqual(v1.elementwise() % s1, (v1.x % s1, v1.y % s1)) + self.assertEqual(v1.elementwise() > s1, v1.x > s1 and v1.y > s1) + self.assertEqual(v1.elementwise() < s1, v1.x < s1 and v1.y < s1) + self.assertEqual(v1.elementwise() == s1, v1.x == s1 and v1.y == s1) + self.assertEqual(v1.elementwise() != s1, v1.x != s1 and v1.y != s1) + self.assertEqual(v1.elementwise() >= s1, v1.x >= s1 and v1.y >= s1) + self.assertEqual(v1.elementwise() <= s1, v1.x <= s1 and v1.y <= s1) + self.assertEqual(v1.elementwise() != s1, v1.x != s1 and v1.y != s1) + # behaviour for "scalar op elementwise" + self.assertEqual(s1 + v1.elementwise(), (s1 + v1.x, s1 + v1.y)) + self.assertEqual(s1 - v1.elementwise(), (s1 - v1.x, s1 - v1.y)) + self.assertEqual(s1 * v1.elementwise(), (s1 * v1.x, s1 * v1.y)) + self.assertEqual(s1 / v1.elementwise(), (s1 / v1.x, s1 / v1.y)) + self.assertEqual(s1 // v1.elementwise(), (s1 // v1.x, s1 // v1.y)) + self.assertEqual(s1 ** v1.elementwise(), (s1 ** v1.x, s1 ** v1.y)) + self.assertEqual(s1 % v1.elementwise(), (s1 % v1.x, s1 % v1.y)) + self.assertEqual(s1 < v1.elementwise(), s1 < v1.x and s1 < v1.y) + self.assertEqual(s1 > v1.elementwise(), s1 > v1.x and s1 > v1.y) + self.assertEqual(s1 == v1.elementwise(), s1 == v1.x and s1 == v1.y) + self.assertEqual(s1 != v1.elementwise(), s1 != v1.x and s1 != v1.y) + self.assertEqual(s1 <= v1.elementwise(), s1 <= v1.x and s1 <= v1.y) + self.assertEqual(s1 >= v1.elementwise(), s1 >= v1.x and s1 >= v1.y) + self.assertEqual(s1 != v1.elementwise(), s1 != v1.x and s1 != v1.y) + + # behaviour for "elementwise op vector" + self.assertEqual(type(v1.elementwise() * v2), type(v1)) + self.assertEqual(v1.elementwise() + v2, v1 + v2) + self.assertEqual(v1.elementwise() - v2, v1 - v2) + self.assertEqual(v1.elementwise() * v2, (v1.x * v2.x, v1.y * v2.y)) + self.assertEqual(v1.elementwise() / v2, (v1.x / v2.x, v1.y / v2.y)) + self.assertEqual(v1.elementwise() // v2, (v1.x // v2.x, v1.y // v2.y)) + self.assertEqual(v1.elementwise() ** v2, (v1.x ** v2.x, v1.y ** v2.y)) + self.assertEqual(v1.elementwise() % v2, (v1.x % v2.x, v1.y % v2.y)) + self.assertEqual(v1.elementwise() > v2, v1.x > v2.x and v1.y > v2.y) + self.assertEqual(v1.elementwise() < v2, v1.x < v2.x and v1.y < v2.y) + self.assertEqual(v1.elementwise() >= v2, v1.x >= v2.x and v1.y >= v2.y) + self.assertEqual(v1.elementwise() <= v2, v1.x <= v2.x and v1.y <= v2.y) + self.assertEqual(v1.elementwise() == v2, v1.x == v2.x and v1.y == v2.y) + self.assertEqual(v1.elementwise() != v2, v1.x != v2.x and v1.y != v2.y) + # behaviour for "vector op elementwise" + self.assertEqual(v2 + v1.elementwise(), v2 + v1) + self.assertEqual(v2 - v1.elementwise(), v2 - v1) + self.assertEqual(v2 * v1.elementwise(), (v2.x * v1.x, v2.y * v1.y)) + self.assertEqual(v2 / v1.elementwise(), (v2.x / v1.x, v2.y / v1.y)) + self.assertEqual(v2 // v1.elementwise(), (v2.x // v1.x, v2.y // v1.y)) + self.assertEqual(v2 ** v1.elementwise(), (v2.x ** v1.x, v2.y ** v1.y)) + self.assertEqual(v2 % v1.elementwise(), (v2.x % v1.x, v2.y % v1.y)) + self.assertEqual(v2 < v1.elementwise(), v2.x < v1.x and v2.y < v1.y) + self.assertEqual(v2 > v1.elementwise(), v2.x > v1.x and v2.y > v1.y) + self.assertEqual(v2 <= v1.elementwise(), v2.x <= v1.x and v2.y <= v1.y) + self.assertEqual(v2 >= v1.elementwise(), v2.x >= v1.x and v2.y >= v1.y) + self.assertEqual(v2 == v1.elementwise(), v2.x == v1.x and v2.y == v1.y) + self.assertEqual(v2 != v1.elementwise(), v2.x != v1.x and v2.y != v1.y) + + # behaviour for "elementwise op elementwise" + self.assertEqual(v2.elementwise() + v1.elementwise(), v2 + v1) + self.assertEqual(v2.elementwise() - v1.elementwise(), v2 - v1) + self.assertEqual(v2.elementwise() * v1.elementwise(), (v2.x * v1.x, v2.y * v1.y)) + self.assertEqual(v2.elementwise() / v1.elementwise(), (v2.x / v1.x, v2.y / v1.y)) + self.assertEqual(v2.elementwise() // v1.elementwise(), (v2.x // v1.x, v2.y // v1.y)) + self.assertEqual(v2.elementwise() ** v1.elementwise(), (v2.x ** v1.x, v2.y ** v1.y)) + self.assertEqual(v2.elementwise() % v1.elementwise(), (v2.x % v1.x, v2.y % v1.y)) + self.assertEqual(v2.elementwise() < v1.elementwise(), v2.x < v1.x and v2.y < v1.y) + self.assertEqual(v2.elementwise() > v1.elementwise(), v2.x > v1.x and v2.y > v1.y) + self.assertEqual(v2.elementwise() <= v1.elementwise(), v2.x <= v1.x and v2.y <= v1.y) + self.assertEqual(v2.elementwise() >= v1.elementwise(), v2.x >= v1.x and v2.y >= v1.y) + self.assertEqual(v2.elementwise() == v1.elementwise(), v2.x == v1.x and v2.y == v1.y) + self.assertEqual(v2.elementwise() != v1.elementwise(), v2.x != v1.x and v2.y != v1.y) + + # other behaviour + self.assertEqual(abs(v1.elementwise()), (abs(v1.x), abs(v1.y))) + self.assertEqual(-v1.elementwise(), -v1) + self.assertEqual(+v1.elementwise(), +v1) + self.assertEqual(bool(v1.elementwise()), bool(v1)) + self.assertEqual(bool(Vector2().elementwise()), bool(Vector2())) + self.assertEqual(self.zeroVec.elementwise() ** 0, (1, 1)) + self.assertRaises(ValueError, lambda : pow(Vector2(-1, 0).elementwise(), 1.2)) + self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1) + self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1) + self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() / 0) + self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() // 0) + self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() % 0) + self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() / self.zeroVec) + self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() // self.zeroVec) + self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() % self.zeroVec) + self.assertRaises(ZeroDivisionError, lambda : 2 / self.zeroVec.elementwise()) + self.assertRaises(ZeroDivisionError, lambda : 2 // self.zeroVec.elementwise()) + self.assertRaises(ZeroDivisionError, lambda : 2 % self.zeroVec.elementwise()) + + def test_slerp(self): + self.assertRaises(ValueError, lambda : self.zeroVec.slerp(self.v1, .5)) + self.assertRaises(ValueError, lambda : self.v1.slerp(self.zeroVec, .5)) + self.assertRaises(ValueError, + lambda : self.zeroVec.slerp(self.zeroVec, .5)) + v1 = Vector2(1, 0) + v2 = Vector2(0, 1) + steps = 10 + angle_step = v1.angle_to(v2) / steps + for i, u in ((i, v1.slerp(v2, i/float(steps))) for i in range(steps+1)): + self.assertAlmostEqual(u.length(), 1) + self.assertAlmostEqual(v1.angle_to(u), i * angle_step) + self.assertEqual(u, v2) + + v1 = Vector2(100, 0) + v2 = Vector2(0, 10) + radial_factor = v2.length() / v1.length() + for i, u in ((i, v1.slerp(v2, -i/float(steps))) for i in range(steps+1)): + self.assertAlmostEqual(u.length(), (v2.length() - v1.length()) * (float(i)/steps) + v1.length()) + self.assertEqual(u, v2) + self.assertEqual(v1.slerp(v1, .5), v1) + self.assertEqual(v2.slerp(v2, .5), v2) + self.assertRaises(ValueError, lambda : v1.slerp(-v1, 0.5)) + + def test_lerp(self): + v1 = Vector2(0, 0) + v2 = Vector2(10, 10) + self.assertEqual(v1.lerp(v2, 0.5), (5, 5)) + self.assertRaises(ValueError, lambda : v1.lerp(v2, 2.5)) + + v1 = Vector2(-10, -5) + v2 = Vector2(10, 10) + self.assertEqual(v1.lerp(v2, 0.5), (0, 2.5)) + + def test_polar(self): + v = Vector2() + v.from_polar(self.v1.as_polar()) + self.assertEqual(self.v1, v) + self.assertEqual(self.e1.as_polar(), (1, 0)) + self.assertEqual(self.e2.as_polar(), (1, 90)) + self.assertEqual((2 * self.e2).as_polar(), (2, 90)) + self.assertRaises(TypeError, lambda : v.from_polar((None, None))) + self.assertRaises(TypeError, lambda : v.from_polar("ab")) + self.assertRaises(TypeError, lambda : v.from_polar((None, 1))) + self.assertRaises(TypeError, lambda : v.from_polar((1, 2, 3))) + self.assertRaises(TypeError, lambda : v.from_polar((1,))) + self.assertRaises(TypeError, lambda : v.from_polar(1, 2)) + v.from_polar((.5, 90)) + self.assertEqual(v, .5 * self.e2) + v.from_polar((1, 0)) + self.assertEqual(v, self.e1) + + def test_subclass_operation(self): + class Vector(pygame.math.Vector2): + pass + + vec = Vector() + + vec_a = Vector(2, 0) + vec_b = Vector(0, 1) + + vec_a + vec_b + vec_a *= 2 + + + +class Vector3TypeTest(unittest.TestCase): + + def setUp(self): + self.zeroVec = Vector3() + self.e1 = Vector3(1, 0, 0) + self.e2 = Vector3(0, 1, 0) + self.e3 = Vector3(0, 0, 1) + self.t1 = (1.2, 3.4, 9.6) + self.l1 = list(self.t1) + self.v1 = Vector3(self.t1) + self.t2 = (5.6, 7.8, 2.1) + self.l2 = list(self.t2) + self.v2 = Vector3(self.t2) + self.s1 = 5.6 + self.s2 = 7.8 + + def testConstructionDefault(self): + v = Vector3() + self.assertEqual(v.x, 0.) + self.assertEqual(v.y, 0.) + self.assertEqual(v.z, 0.) + + def testConstructionXYZ(self): + v = Vector3(1.2, 3.4, 9.6) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + self.assertEqual(v.z, 9.6) + + def testConstructionTuple(self): + v = Vector3((1.2, 3.4, 9.6)) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + self.assertEqual(v.z, 9.6) + + def testConstructionList(self): + v = Vector3([1.2, 3.4, -9.6]) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + self.assertEqual(v.z, -9.6) + + def testConstructionVector3(self): + v = Vector3(Vector3(1.2, 3.4, -9.6)) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + self.assertEqual(v.z, -9.6) + + def testConstructionScalar(self): + v = Vector3(1) + self.assertEqual(v.x, 1.) + self.assertEqual(v.y, 1.) + self.assertEqual(v.z, 1.) + + def testConstructionScalarKeywords(self): + v = Vector3(x=1) + self.assertEqual(v.x, 1.) + self.assertEqual(v.y, 1.) + self.assertEqual(v.z, 1.) + + def testConstructionKeywords(self): + v = Vector3(x=1, y=2, z=3) + self.assertEqual(v.x, 1.) + self.assertEqual(v.y, 2.) + self.assertEqual(v.z, 3.) + + def testConstructionMissing(self): + def assign_missing_value(): + v = Vector3(1, 2) + self.assertRaises(ValueError, assign_missing_value) + + def assign_missing_value(): + v = Vector3(x=1, y=2) + self.assertRaises(ValueError, assign_missing_value) + + def testAttributAccess(self): + tmp = self.v1.x + self.assertEqual(tmp, self.v1.x) + self.assertEqual(tmp, self.v1[0]) + tmp = self.v1.y + self.assertEqual(tmp, self.v1.y) + self.assertEqual(tmp, self.v1[1]) + tmp = self.v1.z + self.assertEqual(tmp, self.v1.z) + self.assertEqual(tmp, self.v1[2]) + self.v1.x = 3.141 + self.assertEqual(self.v1.x, 3.141) + self.v1.y = 3.141 + self.assertEqual(self.v1.y, 3.141) + self.v1.z = 3.141 + self.assertEqual(self.v1.z, 3.141) + def assign_nonfloat(): + v = Vector2() + v.x = "spam" + self.assertRaises(TypeError, assign_nonfloat) + + def testSequence(self): + v = Vector3(1.2, 3.4, -9.6) + self.assertEqual(len(v), 3) + self.assertEqual(v[0], 1.2) + self.assertEqual(v[1], 3.4) + self.assertEqual(v[2], -9.6) + self.assertRaises(IndexError, lambda : v[3]) + self.assertEqual(v[-1], -9.6) + self.assertEqual(v[-2], 3.4) + self.assertEqual(v[-3], 1.2) + self.assertRaises(IndexError, lambda : v[-4]) + self.assertEqual(v[:], [1.2, 3.4, -9.6]) + self.assertEqual(v[1:], [3.4, -9.6]) + self.assertEqual(v[:1], [1.2]) + self.assertEqual(v[:-1], [1.2, 3.4]) + self.assertEqual(v[1:2], [3.4]) + self.assertEqual(list(v), [1.2, 3.4, -9.6]) + self.assertEqual(tuple(v), (1.2, 3.4, -9.6)) + v[0] = 5.6 + v[1] = 7.8 + v[2] = -2.1 + self.assertEqual(v.x, 5.6) + self.assertEqual(v.y, 7.8) + self.assertEqual(v.z, -2.1) + v[:] = [9.1, 11.12, -13.41] + self.assertEqual(v.x, 9.1) + self.assertEqual(v.y, 11.12) + self.assertEqual(v.z, -13.41) + def overpopulate(): + v = Vector3() + v[:] = [1, 2, 3, 4] + self.assertRaises(ValueError, overpopulate) + def underpopulate(): + v = Vector3() + v[:] = [1] + self.assertRaises(ValueError, underpopulate) + def assign_nonfloat(): + v = Vector2() + v[0] = "spam" + self.assertRaises(TypeError, assign_nonfloat) + + def testExtendedSlicing(self): + # deletion + def delSlice(vec, start=None, stop=None, step=None): + if start is not None and stop is not None and step is not None: + del vec[start:stop:step] + elif start is not None and stop is None and step is not None: + del vec[start::step] + elif start is None and stop is None and step is not None: + del vec[::step] + v = Vector3(self.v1) + self.assertRaises(TypeError, delSlice, v, None, None, 2) + self.assertRaises(TypeError, delSlice, v, 1, None, 2) + self.assertRaises(TypeError, delSlice, v, 1, 2, 1) + + # assignment + v = Vector3(self.v1) + v[::2] = [-1.1, -2.2] + self.assertEqual(v, [-1.1, self.v1.y, -2.2]) + v = Vector3(self.v1) + v[::-2] = [10, 20] + self.assertEqual(v, [20, self.v1.y, 10]) + v = Vector3(self.v1) + v[::-1] = v + self.assertEqual(v, [self.v1.z, self.v1.y, self.v1.x]) + a = Vector3(self.v1) + b = Vector3(self.v1) + c = Vector3(self.v1) + a[1:2] = [2.2] + b[slice(1,2)] = [2.2] + c[1:2:] = (2.2,) + self.assertEqual(a, b) + self.assertEqual(a, c) + self.assertEqual(type(a), type(self.v1)) + self.assertEqual(type(b), type(self.v1)) + self.assertEqual(type(c), type(self.v1)) + + def testAdd(self): + v3 = self.v1 + self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x + self.v2.x) + self.assertEqual(v3.y, self.v1.y + self.v2.y) + self.assertEqual(v3.z, self.v1.z + self.v2.z) + v3 = self.v1 + self.t2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x + self.t2[0]) + self.assertEqual(v3.y, self.v1.y + self.t2[1]) + self.assertEqual(v3.z, self.v1.z + self.t2[2]) + v3 = self.v1 + self.l2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x + self.l2[0]) + self.assertEqual(v3.y, self.v1.y + self.l2[1]) + self.assertEqual(v3.z, self.v1.z + self.l2[2]) + v3 = self.t1 + self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.t1[0] + self.v2.x) + self.assertEqual(v3.y, self.t1[1] + self.v2.y) + self.assertEqual(v3.z, self.t1[2] + self.v2.z) + v3 = self.l1 + self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.l1[0] + self.v2.x) + self.assertEqual(v3.y, self.l1[1] + self.v2.y) + self.assertEqual(v3.z, self.l1[2] + self.v2.z) + + def testSub(self): + v3 = self.v1 - self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x - self.v2.x) + self.assertEqual(v3.y, self.v1.y - self.v2.y) + self.assertEqual(v3.z, self.v1.z - self.v2.z) + v3 = self.v1 - self.t2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x - self.t2[0]) + self.assertEqual(v3.y, self.v1.y - self.t2[1]) + self.assertEqual(v3.z, self.v1.z - self.t2[2]) + v3 = self.v1 - self.l2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.v1.x - self.l2[0]) + self.assertEqual(v3.y, self.v1.y - self.l2[1]) + self.assertEqual(v3.z, self.v1.z - self.l2[2]) + v3 = self.t1 - self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.t1[0] - self.v2.x) + self.assertEqual(v3.y, self.t1[1] - self.v2.y) + self.assertEqual(v3.z, self.t1[2] - self.v2.z) + v3 = self.l1 - self.v2 + self.assertTrue(isinstance(v3, type(self.v1))) + self.assertEqual(v3.x, self.l1[0] - self.v2.x) + self.assertEqual(v3.y, self.l1[1] - self.v2.y) + self.assertEqual(v3.z, self.l1[2] - self.v2.z) + + def testScalarMultiplication(self): + v = self.s1 * self.v1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, self.s1 * self.v1.x) + self.assertEqual(v.y, self.s1 * self.v1.y) + self.assertEqual(v.z, self.s1 * self.v1.z) + v = self.v1 * self.s2 + self.assertEqual(v.x, self.v1.x * self.s2) + self.assertEqual(v.y, self.v1.y * self.s2) + self.assertEqual(v.z, self.v1.z * self.s2) + + def testScalarDivision(self): + v = self.v1 / self.s1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertAlmostEqual(v.x, self.v1.x / self.s1) + self.assertAlmostEqual(v.y, self.v1.y / self.s1) + self.assertAlmostEqual(v.z, self.v1.z / self.s1) + v = self.v1 // self.s2 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, self.v1.x // self.s2) + self.assertEqual(v.y, self.v1.y // self.s2) + self.assertEqual(v.z, self.v1.z // self.s2) + + def testBool(self): + self.assertEqual(bool(self.zeroVec), False) + self.assertEqual(bool(self.v1), True) + self.assertTrue(not self.zeroVec) + self.assertTrue(self.v1) + + def testUnary(self): + v = +self.v1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, self.v1.x) + self.assertEqual(v.y, self.v1.y) + self.assertEqual(v.z, self.v1.z) + self.assertNotEqual(id(v), id(self.v1)) + v = -self.v1 + self.assertTrue(isinstance(v, type(self.v1))) + self.assertEqual(v.x, -self.v1.x) + self.assertEqual(v.y, -self.v1.y) + self.assertEqual(v.z, -self.v1.z) + self.assertNotEqual(id(v), id(self.v1)) + + def testCompare(self): + int_vec = Vector3(3, -2, 13) + flt_vec = Vector3(3.0, -2.0, 13.) + zero_vec = Vector3(0, 0, 0) + self.assertEqual(int_vec == flt_vec, True) + self.assertEqual(int_vec != flt_vec, False) + self.assertEqual(int_vec != zero_vec, True) + self.assertEqual(flt_vec == zero_vec, False) + self.assertEqual(int_vec == (3, -2, 13), True) + self.assertEqual(int_vec != (3, -2, 13), False) + self.assertEqual(int_vec != [0, 0], True) + self.assertEqual(int_vec == [0, 0], False) + self.assertEqual(int_vec != 5, True) + self.assertEqual(int_vec == 5, False) + self.assertEqual(int_vec != [3, -2, 0, 1], True) + self.assertEqual(int_vec == [3, -2, 0, 1], False) + + def testStr(self): + v = Vector3(1.2, 3.4, 5.6) + self.assertEqual(str(v), "[1.2, 3.4, 5.6]") + + def testRepr(self): + v = Vector3(1.2, 3.4, -9.6) + self.assertEqual(v.__repr__(), "") + self.assertEqual(v, Vector3(v.__repr__())) + + def testIter(self): + it = self.v1.__iter__() + if PY3: + next_ = it.__next__ + else: + next_ = it.next + self.assertEqual(next_(), self.v1[0]) + self.assertEqual(next_(), self.v1[1]) + self.assertEqual(next_(), self.v1[2]) + self.assertRaises(StopIteration, lambda : next_()) + it1 = self.v1.__iter__() + it2 = self.v1.__iter__() + self.assertNotEqual(id(it1), id(it2)) + self.assertEqual(id(it1), id(it1.__iter__())) + self.assertEqual(list(it1), list(it2)); + self.assertEqual(list(self.v1.__iter__()), self.l1) + idx = 0 + for val in self.v1: + self.assertEqual(val, self.v1[idx]) + idx += 1 + + def test_rotate(self): + v1 = Vector3(1, 0, 0) + axis = Vector3(0, 1, 0) + v2 = v1.rotate(90, axis) + v3 = v1.rotate(90 + 360, axis) + self.assertEqual(v1.x, 1) + self.assertEqual(v1.y, 0) + self.assertEqual(v1.z, 0) + self.assertEqual(v2.x, 0) + self.assertEqual(v2.y, 0) + self.assertEqual(v2.z, -1) + self.assertEqual(v3.x, v2.x) + self.assertEqual(v3.y, v2.y) + self.assertEqual(v3.z, v2.z) + v1 = Vector3(-1, -1, -1) + v2 = v1.rotate(-90, axis) + self.assertEqual(v2.x, 1) + self.assertEqual(v2.y, -1) + self.assertEqual(v2.z, -1) + v2 = v1.rotate(360, axis) + self.assertEqual(v1.x, v2.x) + self.assertEqual(v1.y, v2.y) + self.assertEqual(v1.z, v2.z) + v2 = v1.rotate(0, axis) + self.assertEqual(v1.x, v2.x) + self.assertEqual(v1.y, v2.y) + self.assertEqual(v1.z, v2.z) + # issue 214 + self.assertEqual(Vector3(0, 1, 0).rotate(359.9999999, Vector3(0, 0, 1)), + Vector3(0, 1, 0)) + + def test_rotate_ip(self): + v = Vector3(1, 0, 0) + axis = Vector3(0, 1, 0) + self.assertEqual(v.rotate_ip(90, axis), None) + self.assertEqual(v.x, 0) + self.assertEqual(v.y, 0) + self.assertEqual(v.z, -1) + v = Vector3(-1, -1, 1) + v.rotate_ip(-90, axis) + self.assertEqual(v.x, -1) + self.assertEqual(v.y, -1) + self.assertEqual(v.z, -1) + + def test_rotate_x(self): + v1 = Vector3(1, 0, 0) + v2 = v1.rotate_x(90) + v3 = v1.rotate_x(90 + 360) + self.assertEqual(v1.x, 1) + self.assertEqual(v1.y, 0) + self.assertEqual(v1.z, 0) + self.assertEqual(v2.x, 1) + self.assertEqual(v2.y, 0) + self.assertEqual(v2.z, 0) + self.assertEqual(v3.x, v2.x) + self.assertEqual(v3.y, v2.y) + self.assertEqual(v3.z, v2.z) + v1 = Vector3(-1, -1, -1) + v2 = v1.rotate_x(-90) + self.assertEqual(v2.x, -1) + self.assertAlmostEqual(v2.y, -1) + self.assertAlmostEqual(v2.z, 1) + v2 = v1.rotate_x(360) + self.assertAlmostEqual(v1.x, v2.x) + self.assertAlmostEqual(v1.y, v2.y) + self.assertAlmostEqual(v1.z, v2.z) + v2 = v1.rotate_x(0) + self.assertEqual(v1.x, v2.x) + self.assertAlmostEqual(v1.y, v2.y) + self.assertAlmostEqual(v1.z, v2.z) + + def test_rotate_x_ip(self): + v = Vector3(1, 0, 0) + self.assertEqual(v.rotate_x_ip(90), None) + self.assertEqual(v.x, 1) + self.assertEqual(v.y, 0) + self.assertEqual(v.z, 0) + v = Vector3(-1, -1, 1) + v.rotate_x_ip(-90) + self.assertEqual(v.x, -1) + self.assertAlmostEqual(v.y, 1) + self.assertAlmostEqual(v.z, 1) + + def test_rotate_y(self): + v1 = Vector3(1, 0, 0) + v2 = v1.rotate_y(90) + v3 = v1.rotate_y(90 + 360) + self.assertEqual(v1.x, 1) + self.assertEqual(v1.y, 0) + self.assertEqual(v1.z, 0) + self.assertAlmostEqual(v2.x, 0) + self.assertEqual(v2.y, 0) + self.assertAlmostEqual(v2.z, -1) + self.assertAlmostEqual(v3.x, v2.x) + self.assertEqual(v3.y, v2.y) + self.assertAlmostEqual(v3.z, v2.z) + v1 = Vector3(-1, -1, -1) + v2 = v1.rotate_y(-90) + self.assertAlmostEqual(v2.x, 1) + self.assertEqual(v2.y, -1) + self.assertAlmostEqual(v2.z, -1) + v2 = v1.rotate_y(360) + self.assertAlmostEqual(v1.x, v2.x) + self.assertEqual(v1.y, v2.y) + self.assertAlmostEqual(v1.z, v2.z) + v2 = v1.rotate_y(0) + self.assertEqual(v1.x, v2.x) + self.assertEqual(v1.y, v2.y) + self.assertEqual(v1.z, v2.z) + + def test_rotate_y_ip(self): + v = Vector3(1, 0, 0) + self.assertEqual(v.rotate_y_ip(90), None) + self.assertAlmostEqual(v.x, 0) + self.assertEqual(v.y, 0) + self.assertAlmostEqual(v.z, -1) + v = Vector3(-1, -1, 1) + v.rotate_y_ip(-90) + self.assertAlmostEqual(v.x, -1) + self.assertEqual(v.y, -1) + self.assertAlmostEqual(v.z, -1) + + def test_rotate_z(self): + v1 = Vector3(1, 0, 0) + v2 = v1.rotate_z(90) + v3 = v1.rotate_z(90 + 360) + self.assertEqual(v1.x, 1) + self.assertEqual(v1.y, 0) + self.assertEqual(v1.z, 0) + self.assertAlmostEqual(v2.x, 0) + self.assertAlmostEqual(v2.y, 1) + self.assertEqual(v2.z, 0) + self.assertAlmostEqual(v3.x, v2.x) + self.assertAlmostEqual(v3.y, v2.y) + self.assertEqual(v3.z, v2.z) + v1 = Vector3(-1, -1, -1) + v2 = v1.rotate_z(-90) + self.assertAlmostEqual(v2.x, -1) + self.assertAlmostEqual(v2.y, 1) + self.assertEqual(v2.z, -1) + v2 = v1.rotate_z(360) + self.assertAlmostEqual(v1.x, v2.x) + self.assertAlmostEqual(v1.y, v2.y) + self.assertEqual(v1.z, v2.z) + v2 = v1.rotate_z(0) + self.assertAlmostEqual(v1.x, v2.x) + self.assertAlmostEqual(v1.y, v2.y) + self.assertEqual(v1.z, v2.z) + + def test_rotate_z_ip(self): + v = Vector3(1, 0, 0) + self.assertEqual(v.rotate_z_ip(90), None) + self.assertAlmostEqual(v.x, 0) + self.assertAlmostEqual(v.y, 1) + self.assertEqual(v.z, 0) + v = Vector3(-1, -1, 1) + v.rotate_z_ip(-90) + self.assertAlmostEqual(v.x, -1) + self.assertAlmostEqual(v.y, 1) + self.assertEqual(v.z, 1) + + def test_normalize(self): + v = self.v1.normalize() + # length is 1 + self.assertAlmostEqual(v.x * v.x + v.y * v.y + v.z * v.z, 1.) + # v1 is unchanged + self.assertEqual(self.v1.x, self.l1[0]) + self.assertEqual(self.v1.y, self.l1[1]) + self.assertEqual(self.v1.z, self.l1[2]) + # v2 is paralell to v1 (tested via cross product) + cross = ((self.v1.y * v.z - self.v1.z * v.y) ** 2 + + (self.v1.z * v.x - self.v1.x * v.z) ** 2 + + (self.v1.x * v.y - self.v1.y * v.x) ** 2) + self.assertAlmostEqual(cross, 0.) + self.assertRaises(ValueError, lambda : self.zeroVec.normalize()) + + def test_normalize_ip(self): + v = +self.v1 + # v has length != 1 before normalizing + self.assertNotEqual(v.x * v.x + v.y * v.y + v.z * v.z, 1.) + # inplace operations should return None + self.assertEqual(v.normalize_ip(), None) + # length is 1 + self.assertAlmostEqual(v.x * v.x + v.y * v.y + v.z * v.z, 1.) + # v2 is paralell to v1 (tested via cross product) + cross = ((self.v1.y * v.z - self.v1.z * v.y) ** 2 + + (self.v1.z * v.x - self.v1.x * v.z) ** 2 + + (self.v1.x * v.y - self.v1.y * v.x) ** 2) + self.assertAlmostEqual(cross, 0.) + self.assertRaises(ValueError, lambda : self.zeroVec.normalize_ip()) + + def test_is_normalized(self): + self.assertEqual(self.v1.is_normalized(), False) + v = self.v1.normalize() + self.assertEqual(v.is_normalized(), True) + self.assertEqual(self.e2.is_normalized(), True) + self.assertEqual(self.zeroVec.is_normalized(), False) + + def test_cross(self): + def cross(a, b): + return Vector3(a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0]) + self.assertEqual(self.v1.cross(self.v2), cross(self.v1, self.v2)) + self.assertEqual(self.v1.cross(self.l2), cross(self.v1, self.l2)) + self.assertEqual(self.v1.cross(self.t2), cross(self.v1, self.t2)) + self.assertEqual(self.v1.cross(self.v2), -self.v2.cross(self.v1)) + self.assertEqual(self.v1.cross(self.v1), self.zeroVec) + + def test_dot(self): + self.assertAlmostEqual(self.v1.dot(self.v2), + self.v1.x * self.v2.x + self.v1.y * self.v2.y + self.v1.z * self.v2.z) + self.assertAlmostEqual(self.v1.dot(self.l2), + self.v1.x * self.l2[0] + self.v1.y * self.l2[1] + self.v1.z * self.l2[2]) + self.assertAlmostEqual(self.v1.dot(self.t2), + self.v1.x * self.t2[0] + self.v1.y * self.t2[1] + self.v1.z * self.t2[2]) + self.assertAlmostEqual(self.v1.dot(self.v2), self.v2.dot(self.v1)) + self.assertAlmostEqual(self.v1.dot(self.v2), self.v1 * self.v2) + + def test_angle_to(self): + self.assertEqual(Vector3(1, 1, 0).angle_to((-1, 1, 0)), 90) + self.assertEqual(Vector3(1, 0, 0).angle_to((0, 0, -1)), 90) + self.assertEqual(Vector3(1, 0, 0).angle_to((-1, 0, 1)), 135) + self.assertEqual(abs(Vector3(1, 0, 1).angle_to((-1, 0, -1))), 180) + # if we rotate v1 by the angle_to v2 around their cross product + # we should look in the same direction + self.assertEqual(self.v1.rotate(self.v1.angle_to(self.v2), self.v1.cross(self.v2)).normalize(), + self.v2.normalize()) + + def test_scale_to_length(self): + v = Vector3(1, 1, 1) + v.scale_to_length(2.5) + self.assertEqual(v, Vector3(2.5, 2.5, 2.5) / math.sqrt(3)) + self.assertRaises(ValueError, lambda : self.zeroVec.scale_to_length(1)) + self.assertEqual(v.scale_to_length(0), None) + self.assertEqual(v, self.zeroVec) + + def test_length(self): + self.assertEqual(Vector3(3, 4, 5).length(), math.sqrt(3 * 3 + 4 * 4 + 5 * 5)) + self.assertEqual(Vector3(-3, 4, 5).length(), math.sqrt(-3 * -3 + 4 * 4 + 5 * 5)) + self.assertEqual(self.zeroVec.length(), 0) + + def test_length_squared(self): + self.assertEqual(Vector3(3, 4, 5).length_squared(), 3 * 3 + 4 * 4 + 5 * 5) + self.assertEqual(Vector3(-3, 4, 5).length_squared(), -3 * -3 + 4 * 4 + 5 * 5) + self.assertEqual(self.zeroVec.length_squared(), 0) + + def test_reflect(self): + v = Vector3(1, -1, 1) + n = Vector3(0, 1, 0) + self.assertEqual(v.reflect(n), Vector3(1, 1, 1)) + self.assertEqual(v.reflect(3*n), v.reflect(n)) + self.assertEqual(v.reflect(-v), -v) + self.assertRaises(ValueError, lambda : v.reflect(self.zeroVec)) + + def test_reflect_ip(self): + v1 = Vector3(1, -1, 1) + v2 = Vector3(v1) + n = Vector3(0, 1, 0) + self.assertEqual(v2.reflect_ip(n), None) + self.assertEqual(v2, Vector3(1, 1, 1)) + v2 = Vector3(v1) + v2.reflect_ip(3*n) + self.assertEqual(v2, v1.reflect(n)) + v2 = Vector3(v1) + v2.reflect_ip(-v1) + self.assertEqual(v2, -v1) + self.assertRaises(ValueError, lambda : v2.reflect_ip(self.zeroVec)) + + def test_distance_to(self): + diff = self.v1 - self.v2 + self.assertEqual(self.e1.distance_to(self.e2), math.sqrt(2)) + self.assertEqual(self.v1.distance_to(self.v2), + math.sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z)) + self.assertEqual(self.v1.distance_to(self.v1), 0) + self.assertEqual(self.v1.distance_to(self.v2), + self.v2.distance_to(self.v1)) + + def test_distance_squared_to(self): + diff = self.v1 - self.v2 + self.assertEqual(self.e1.distance_squared_to(self.e2), 2) + self.assertAlmostEqual(self.v1.distance_squared_to(self.v2), + diff.x * diff.x + diff.y * diff.y + diff.z * diff.z) + self.assertEqual(self.v1.distance_squared_to(self.v1), 0) + self.assertEqual(self.v1.distance_squared_to(self.v2), + self.v2.distance_squared_to(self.v1)) + + def test_swizzle(self): + self.assertTrue(hasattr(pygame.math, "enable_swizzling")) + self.assertTrue(hasattr(pygame.math, "disable_swizzling")) + # swizzling enabled by default + pygame.math.disable_swizzling() + self.assertRaises(AttributeError, lambda : self.v1.yx) + pygame.math.enable_swizzling() + + self.assertEqual(self.v1.yxz, (self.v1.y, self.v1.x, self.v1.z)) + self.assertEqual(self.v1.xxyyzzxyz, (self.v1.x, self.v1.x, self.v1.y, + self.v1.y, self.v1.z, self.v1.z, + self.v1.x, self.v1.y, self.v1.z)) + self.v1.xyz = self.t2 + self.assertEqual(self.v1, self.t2) + self.v1.zxy = self.t2 + self.assertEqual(self.v1, (self.t2[1], self.t2[2], self.t2[0])) + self.v1.yz = self.t2[:2] + self.assertEqual(self.v1, (self.t2[1], self.t2[0], self.t2[1])) + self.assertEqual(type(self.v1), Vector3) + + @unittest.skipIf(IS_PYPY, "known pypy failure") + def test_invalid_swizzle(self): + def invalidSwizzleX(): + Vector3().xx = (1, 2) + def invalidSwizzleY(): + Vector3().yy = (1, 2) + def invalidSwizzleZ(): + Vector3().zz = (1, 2) + def invalidSwizzleW(): + Vector3().ww = (1, 2) + self.assertRaises(AttributeError, invalidSwizzleX) + self.assertRaises(AttributeError, invalidSwizzleY) + self.assertRaises(AttributeError, invalidSwizzleZ) + self.assertRaises(AttributeError, invalidSwizzleW) + def invalidAssignment(): + Vector3().xy = 3 + self.assertRaises(TypeError, invalidAssignment) + + def test_swizzle_return_types(self): + self.assertEqual(type(self.v1.x), float) + self.assertEqual(type(self.v1.xy), Vector2) + self.assertEqual(type(self.v1.xyz), Vector3) + # but we don't have vector4 or above... so tuple. + self.assertEqual(type(self.v1.xyxy), tuple) + self.assertEqual(type(self.v1.xyxyx), tuple) + + def test_dir_works(self): + # not every single one of the attributes... + attributes = set(['lerp', 'normalize', 'normalize_ip', 'reflect', 'slerp', 'x', 'y']) + # check if this selection of attributes are all there. + self.assertTrue(attributes.issubset(set(dir(self.v1)))) + + def test_elementwise(self): + # behaviour for "elementwise op scalar" + self.assertEqual(self.v1.elementwise() + self.s1, + (self.v1.x + self.s1, self.v1.y + self.s1, self.v1.z + self.s1)) + self.assertEqual(self.v1.elementwise() - self.s1, + (self.v1.x - self.s1, self.v1.y - self.s1, self.v1.z - self.s1)) + self.assertEqual(self.v1.elementwise() * self.s2, + (self.v1.x * self.s2, self.v1.y * self.s2, self.v1.z * self.s2)) + self.assertEqual(self.v1.elementwise() / self.s2, + (self.v1.x / self.s2, self.v1.y / self.s2, self.v1.z / self.s2)) + self.assertEqual(self.v1.elementwise() // self.s1, + (self.v1.x // self.s1, self.v1.y // self.s1, self.v1.z // self.s1)) + self.assertEqual(self.v1.elementwise() ** self.s1, + (self.v1.x ** self.s1, self.v1.y ** self.s1, self.v1.z ** self.s1)) + self.assertEqual(self.v1.elementwise() % self.s1, + (self.v1.x % self.s1, self.v1.y % self.s1, self.v1.z % self.s1)) + self.assertEqual(self.v1.elementwise() > self.s1, + self.v1.x > self.s1 and self.v1.y > self.s1 and self.v1.z > self.s1) + self.assertEqual(self.v1.elementwise() < self.s1, + self.v1.x < self.s1 and self.v1.y < self.s1 and self.v1.z < self.s1) + self.assertEqual(self.v1.elementwise() == self.s1, + self.v1.x == self.s1 and self.v1.y == self.s1 and self.v1.z == self.s1) + self.assertEqual(self.v1.elementwise() != self.s1, + self.v1.x != self.s1 and self.v1.y != self.s1 and self.v1.z != self.s1) + self.assertEqual(self.v1.elementwise() >= self.s1, + self.v1.x >= self.s1 and self.v1.y >= self.s1 and self.v1.z >= self.s1) + self.assertEqual(self.v1.elementwise() <= self.s1, + self.v1.x <= self.s1 and self.v1.y <= self.s1 and self.v1.z <= self.s1) + # behaviour for "scalar op elementwise" + self.assertEqual(5 + self.v1.elementwise(), Vector3(5, 5, 5) + self.v1) + self.assertEqual(3.5 - self.v1.elementwise(), Vector3(3.5, 3.5, 3.5) - self.v1) + self.assertEqual(7.5 * self.v1.elementwise() , 7.5 * self.v1) + self.assertEqual(-3.5 / self.v1.elementwise(), (-3.5 / self.v1.x, -3.5 / self.v1.y, -3.5 / self.v1.z)) + self.assertEqual(-3.5 // self.v1.elementwise(), (-3.5 // self.v1.x, -3.5 // self.v1.y, -3.5 // self.v1.z)) + self.assertEqual(-3.5 ** self.v1.elementwise(), (-3.5 ** self.v1.x, -3.5 ** self.v1.y, -3.5 ** self.v1.z)) + self.assertEqual(3 % self.v1.elementwise(), (3 % self.v1.x, 3 % self.v1.y, 3 % self.v1.z)) + self.assertEqual(2 < self.v1.elementwise(), 2 < self.v1.x and 2 < self.v1.y and 2 < self.v1.z) + self.assertEqual(2 > self.v1.elementwise(), 2 > self.v1.x and 2 > self.v1.y and 2 > self.v1.z) + self.assertEqual(1 == self.v1.elementwise(), 1 == self.v1.x and 1 == self.v1.y and 1 == self.v1.z) + self.assertEqual(1 != self.v1.elementwise(), 1 != self.v1.x and 1 != self.v1.y and 1 != self.v1.z) + self.assertEqual(2 <= self.v1.elementwise(), 2 <= self.v1.x and 2 <= self.v1.y and 2 <= self.v1.z) + self.assertEqual(-7 >= self.v1.elementwise(), -7 >= self.v1.x and -7 >= self.v1.y and -7 >= self.v1.z) + self.assertEqual(-7 != self.v1.elementwise(), -7 != self.v1.x and -7 != self.v1.y and -7 != self.v1.z) + + # behaviour for "elementwise op vector" + self.assertEqual(type(self.v1.elementwise() * self.v2), type(self.v1)) + self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2) + self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2) + self.assertEqual(self.v1.elementwise() - self.v2, self.v1 - self.v2) + self.assertEqual(self.v1.elementwise() * self.v2, (self.v1.x * self.v2.x, self.v1.y * self.v2.y, self.v1.z * self.v2.z)) + self.assertEqual(self.v1.elementwise() / self.v2, (self.v1.x / self.v2.x, self.v1.y / self.v2.y, self.v1.z / self.v2.z)) + self.assertEqual(self.v1.elementwise() // self.v2, (self.v1.x // self.v2.x, self.v1.y // self.v2.y, self.v1.z // self.v2.z)) + self.assertEqual(self.v1.elementwise() ** self.v2, (self.v1.x ** self.v2.x, self.v1.y ** self.v2.y, self.v1.z ** self.v2.z)) + self.assertEqual(self.v1.elementwise() % self.v2, (self.v1.x % self.v2.x, self.v1.y % self.v2.y, self.v1.z % self.v2.z)) + self.assertEqual(self.v1.elementwise() > self.v2, self.v1.x > self.v2.x and self.v1.y > self.v2.y and self.v1.z > self.v2.z) + self.assertEqual(self.v1.elementwise() < self.v2, self.v1.x < self.v2.x and self.v1.y < self.v2.y and self.v1.z < self.v2.z) + self.assertEqual(self.v1.elementwise() >= self.v2, self.v1.x >= self.v2.x and self.v1.y >= self.v2.y and self.v1.z >= self.v2.z) + self.assertEqual(self.v1.elementwise() <= self.v2, self.v1.x <= self.v2.x and self.v1.y <= self.v2.y and self.v1.z <= self.v2.z) + self.assertEqual(self.v1.elementwise() == self.v2, self.v1.x == self.v2.x and self.v1.y == self.v2.y and self.v1.z == self.v2.z) + self.assertEqual(self.v1.elementwise() != self.v2, self.v1.x != self.v2.x and self.v1.y != self.v2.y and self.v1.z != self.v2.z) + # behaviour for "vector op elementwise" + self.assertEqual(self.v2 + self.v1.elementwise(), self.v2 + self.v1) + self.assertEqual(self.v2 - self.v1.elementwise(), self.v2 - self.v1) + self.assertEqual(self.v2 * self.v1.elementwise(), (self.v2.x * self.v1.x, self.v2.y * self.v1.y, self.v2.z * self.v1.z)) + self.assertEqual(self.v2 / self.v1.elementwise(), (self.v2.x / self.v1.x, self.v2.y / self.v1.y, self.v2.z / self.v1.z)) + self.assertEqual(self.v2 // self.v1.elementwise(), (self.v2.x // self.v1.x, self.v2.y // self.v1.y, self.v2.z // self.v1.z)) + self.assertEqual(self.v2 ** self.v1.elementwise(), (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y, self.v2.z ** self.v1.z)) + self.assertEqual(self.v2 % self.v1.elementwise(), (self.v2.x % self.v1.x, self.v2.y % self.v1.y, self.v2.z % self.v1.z)) + self.assertEqual(self.v2 < self.v1.elementwise(), self.v2.x < self.v1.x and self.v2.y < self.v1.y and self.v2.z < self.v1.z) + self.assertEqual(self.v2 > self.v1.elementwise(), self.v2.x > self.v1.x and self.v2.y > self.v1.y and self.v2.z > self.v1.z) + self.assertEqual(self.v2 <= self.v1.elementwise(), self.v2.x <= self.v1.x and self.v2.y <= self.v1.y and self.v2.z <= self.v1.z) + self.assertEqual(self.v2 >= self.v1.elementwise(), self.v2.x >= self.v1.x and self.v2.y >= self.v1.y and self.v2.z >= self.v1.z) + self.assertEqual(self.v2 == self.v1.elementwise(), self.v2.x == self.v1.x and self.v2.y == self.v1.y and self.v2.z == self.v1.z) + self.assertEqual(self.v2 != self.v1.elementwise(), self.v2.x != self.v1.x and self.v2.y != self.v1.y and self.v2.z != self.v1.z) + + # behaviour for "elementwise op elementwise" + self.assertEqual(self.v2.elementwise() + self.v1.elementwise(), self.v2 + self.v1) + self.assertEqual(self.v2.elementwise() - self.v1.elementwise(), self.v2 - self.v1) + self.assertEqual(self.v2.elementwise() * self.v1.elementwise(), + (self.v2.x * self.v1.x, self.v2.y * self.v1.y, self.v2.z * self.v1.z)) + self.assertEqual(self.v2.elementwise() / self.v1.elementwise(), + (self.v2.x / self.v1.x, self.v2.y / self.v1.y, self.v2.z / self.v1.z)) + self.assertEqual(self.v2.elementwise() // self.v1.elementwise(), + (self.v2.x // self.v1.x, self.v2.y // self.v1.y, self.v2.z // self.v1.z)) + self.assertEqual(self.v2.elementwise() ** self.v1.elementwise(), + (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y, self.v2.z ** self.v1.z)) + self.assertEqual(self.v2.elementwise() % self.v1.elementwise(), + (self.v2.x % self.v1.x, self.v2.y % self.v1.y, self.v2.z % self.v1.z)) + self.assertEqual(self.v2.elementwise() < self.v1.elementwise(), + self.v2.x < self.v1.x and self.v2.y < self.v1.y and self.v2.z < self.v1.z) + self.assertEqual(self.v2.elementwise() > self.v1.elementwise(), + self.v2.x > self.v1.x and self.v2.y > self.v1.y and self.v2.z > self.v1.z) + self.assertEqual(self.v2.elementwise() <= self.v1.elementwise(), + self.v2.x <= self.v1.x and self.v2.y <= self.v1.y and self.v2.z <= self.v1.z) + self.assertEqual(self.v2.elementwise() >= self.v1.elementwise(), + self.v2.x >= self.v1.x and self.v2.y >= self.v1.y and self.v2.z >= self.v1.z) + self.assertEqual(self.v2.elementwise() == self.v1.elementwise(), + self.v2.x == self.v1.x and self.v2.y == self.v1.y and self.v2.z == self.v1.z) + self.assertEqual(self.v2.elementwise() != self.v1.elementwise(), + self.v2.x != self.v1.x and self.v2.y != self.v1.y and self.v2.z != self.v1.z) + + # other behaviour + self.assertEqual(abs(self.v1.elementwise()), (abs(self.v1.x), abs(self.v1.y), abs(self.v1.z))) + self.assertEqual(-self.v1.elementwise(), -self.v1) + self.assertEqual(+self.v1.elementwise(), +self.v1) + self.assertEqual(bool(self.v1.elementwise()), bool(self.v1)) + self.assertEqual(bool(Vector3().elementwise()), bool(Vector3())) + self.assertEqual(self.zeroVec.elementwise() ** 0, (1, 1, 1)) + self.assertRaises(ValueError, lambda : pow(Vector3(-1, 0, 0).elementwise(), 1.2)) + self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1) + self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() / 0) + self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() // 0) + self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() % 0) + self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() / self.zeroVec) + self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() // self.zeroVec) + self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() % self.zeroVec) + self.assertRaises(ZeroDivisionError, lambda : 2 / self.zeroVec.elementwise()) + self.assertRaises(ZeroDivisionError, lambda : 2 // self.zeroVec.elementwise()) + self.assertRaises(ZeroDivisionError, lambda : 2 % self.zeroVec.elementwise()) + + + def test_slerp(self): + self.assertRaises(ValueError, lambda : self.zeroVec.slerp(self.v1, .5)) + self.assertRaises(ValueError, lambda : self.v1.slerp(self.zeroVec, .5)) + self.assertRaises(ValueError, + lambda : self.zeroVec.slerp(self.zeroVec, .5)) + steps = 10 + angle_step = self.e1.angle_to(self.e2) / steps + for i, u in ((i, self.e1.slerp(self.e2, i/float(steps))) for i in range(steps+1)): + self.assertAlmostEqual(u.length(), 1) + self.assertAlmostEqual(self.e1.angle_to(u), i * angle_step) + self.assertEqual(u, self.e2) + + v1 = Vector3(100, 0, 0) + v2 = Vector3(0, 10, 7) + radial_factor = v2.length() / v1.length() + for i, u in ((i, v1.slerp(v2, -i/float(steps))) for i in range(steps+1)): + self.assertAlmostEqual(u.length(), (v2.length() - v1.length()) * (float(i)/steps) + v1.length()) + self.assertEqual(u, v2) + self.assertEqual(v1.slerp(v1, .5), v1) + self.assertEqual(v2.slerp(v2, .5), v2) + self.assertRaises(ValueError, lambda : v1.slerp(-v1, 0.5)) + + def test_lerp(self): + v1 = Vector3(0, 0, 0) + v2 = Vector3(10, 10, 10) + self.assertEqual(v1.lerp(v2, 0.5), (5, 5, 5)) + self.assertRaises(ValueError, lambda : v1.lerp(v2, 2.5)) + + v1 = Vector3(-10, -5, -20) + v2 = Vector3(10, 10, -20) + self.assertEqual(v1.lerp(v2, 0.5), (0, 2.5, -20)) + + def test_spherical(self): + v = Vector3() + v.from_spherical(self.v1.as_spherical()) + self.assertEqual(self.v1, v) + self.assertEqual(self.e1.as_spherical(), (1, 90, 0)) + self.assertEqual(self.e2.as_spherical(), (1, 90, 90)) + self.assertEqual(self.e3.as_spherical(), (1, 0, 0)) + self.assertEqual((2 * self.e2).as_spherical(), (2, 90, 90)) + self.assertRaises(TypeError, lambda : v.from_spherical((None, None, None))) + self.assertRaises(TypeError, lambda : v.from_spherical("abc")) + self.assertRaises(TypeError, lambda : v.from_spherical((None, 1, 2))) + self.assertRaises(TypeError, lambda : v.from_spherical((1, 2, 3, 4))) + self.assertRaises(TypeError, lambda : v.from_spherical((1, 2))) + self.assertRaises(TypeError, lambda : v.from_spherical(1, 2, 3)) + v.from_spherical((.5, 90, 90)) + self.assertEqual(v, .5 * self.e2) + + def test_inplace_operators(self): + + v = Vector3(1,1,1) + v *= 2 + self.assertEqual(v, (2.0,2.0,2.0)) + + v = Vector3(4,4,4) + v /= 2 + self.assertEqual(v, (2.0,2.0,2.0)) + + + v = Vector3(3.0,3.0,3.0) + v -= (1,1,1) + self.assertEqual(v, (2.0,2.0,2.0)) + + v = Vector3(3.0,3.0,3.0) + v += (1,1,1) + self.assertEqual(v, (4.0,4.0,4.0)) + + def test_pickle(self): + import pickle + v2 = Vector2(1, 2) + v3 = Vector3(1, 2, 3) + self.assertEqual(pickle.loads(pickle.dumps(v2)), v2) + self.assertEqual(pickle.loads(pickle.dumps(v3)), v3) + + + def test_subclass_operation(self): + class Vector(pygame.math.Vector3): + pass + v = Vector(2.0, 2.0, 2.0) + v *= 2 + self.assertEqual(v, (4.0, 4.0, 4.0)) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/midi_tags.py b/venv/Lib/site-packages/pygame/tests/midi_tags.py new file mode 100644 index 0000000..c6c9454 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/midi_tags.py @@ -0,0 +1 @@ +__tags__ = ['interactive'] diff --git a/venv/Lib/site-packages/pygame/tests/midi_test.py b/venv/Lib/site-packages/pygame/tests/midi_test.py new file mode 100644 index 0000000..b8d1b6a --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/midi_test.py @@ -0,0 +1,385 @@ +import unittest +import os +import sys +import time + +import pygame +import pygame.midi +import pygame.compat +from pygame.locals import * + + +class MidiInputTest(unittest.TestCase): + + def setUp(self): + pygame.midi.init() + in_id = pygame.midi.get_default_input_id() + if in_id != -1: + self.midi_input = pygame.midi.Input(in_id) + else: + self.midi_input = None + + def tearDown(self): + if self.midi_input: + self.midi_input.close() + pygame.midi.quit() + + def test_Input(self): + """|tags: interactive| + """ + + i = pygame.midi.get_default_input_id() + if self.midi_input: + self.assertEqual(self.midi_input.device_id, i) + + # try feeding it an input id. + i = pygame.midi.get_default_output_id() + + # can handle some invalid input too. + self.assertRaises(pygame.midi.MidiException, pygame.midi.Input, i) + self.assertRaises(pygame.midi.MidiException, pygame.midi.Input, 9009) + self.assertRaises(pygame.midi.MidiException, pygame.midi.Input, -1) + self.assertRaises(TypeError, pygame.midi.Input, "1234") + self.assertRaises(OverflowError, pygame.midi.Input, pow(2, 99)) + + def test_poll(self): + + if not self.midi_input: + self.skipTest('No midi Input device') + + self.assertFalse(self.midi_input.poll()) + # TODO fake some incoming data + + pygame.midi.quit() + self.assertRaises(RuntimeError, self.midi_input.poll) + # set midi_input to None to avoid error in tearDown + self.midi_input = None + + def test_read(self): + + if not self.midi_input: + self.skipTest('No midi Input device') + + read = self.midi_input.read(5) + self.assertEqual(read, []) + # TODO fake some incoming data + + pygame.midi.quit() + self.assertRaises(RuntimeError, self.midi_input.read, 52) + # set midi_input to None to avoid error in tearDown + self.midi_input = None + + def test_close(self): + if not self.midi_input: + self.skipTest('No midi Input device') + + self.assertIsNotNone(self.midi_input._input) + self.midi_input.close() + self.assertIsNone(self.midi_input._input) + + +class MidiOutputTest(unittest.TestCase): + + def setUp(self): + pygame.midi.init() + m_out_id = pygame.midi.get_default_output_id() + if m_out_id != -1: + self.midi_output = pygame.midi.Output(m_out_id) + else: + self.midi_output = None + + def tearDown(self): + if self.midi_output: + self.midi_output.close() + pygame.midi.quit() + + def test_Output(self): + """|tags: interactive| + """ + i = pygame.midi.get_default_output_id() + if self.midi_output: + self.assertEqual(self.midi_output.device_id, i) + + # try feeding it an input id. + i = pygame.midi.get_default_input_id() + + # can handle some invalid input too. + self.assertRaises(pygame.midi.MidiException, pygame.midi.Output, i) + self.assertRaises(pygame.midi.MidiException, pygame.midi.Output, 9009) + self.assertRaises(pygame.midi.MidiException, pygame.midi.Output, -1) + self.assertRaises(TypeError, pygame.midi.Output,"1234") + self.assertRaises(OverflowError, pygame.midi.Output, pow(2,99)) + + def test_note_off(self): + """|tags: interactive| + """ + + if self.midi_output: + out = self.midi_output + out.note_on(5, 30, 0) + out.note_off(5, 30, 0) + with self.assertRaises(ValueError) as cm: + out.note_off(5, 30, 25) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + with self.assertRaises(ValueError) as cm: + out.note_off(5, 30, -1) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + + def test_note_on(self): + """|tags: interactive| + """ + + if self.midi_output: + out = self.midi_output + out.note_on(5, 30, 0) + out.note_on(5, 42, 10) + with self.assertRaises(ValueError) as cm: + out.note_on(5, 30, 25) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + with self.assertRaises(ValueError) as cm: + out.note_on(5, 30, -1) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + + def test_set_instrument(self): + + if not self.midi_output: + self.skipTest('No midi device') + out = self.midi_output + out.set_instrument(5) + out.set_instrument(42, channel=2) + with self.assertRaises(ValueError) as cm: + out.set_instrument(-6) + self.assertEqual(str(cm.exception), "Undefined instrument id: -6") + with self.assertRaises(ValueError) as cm: + out.set_instrument(156) + self.assertEqual(str(cm.exception), "Undefined instrument id: 156") + with self.assertRaises(ValueError) as cm: + out.set_instrument(5, -1) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + with self.assertRaises(ValueError) as cm: + out.set_instrument(5, 16) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + + def test_write(self): + if not self.midi_output: + self.skipTest('No midi device') + + out = self.midi_output + out.write([[[0xc0, 0, 0], 20000]]) + # is equivalent to + out.write([[[0xc0], 20000]]) + # example from the docstring : + # 1. choose program change 1 at time 20000 and + # 2. send note 65 with velocity 100 500 ms later + out.write([ + [[0xc0, 0, 0], 20000], + [[0x90, 60, 100], 20500] + ]) + + out.write([]) + verrry_long = [[[0x90, 60, i % 100], 20000 + 100 * i] for i in range(1024)] + out.write(verrry_long) + + too_long = [[[0x90, 60, i % 100], 20000 + 100 * i] for i in range(1025)] + self.assertRaises(IndexError, out.write, too_long) + # test wrong data + with self.assertRaises(TypeError) as cm: + out.write('Non sens ?') + error_msg = "unsupported operand type(s) for &: 'str' and 'int'" + self.assertEqual(str(cm.exception), error_msg) + + with self.assertRaises(TypeError) as cm: + out.write(["Hey what's that?"]) + self.assertEqual(str(cm.exception), error_msg) + + def test_write_short(self): + """|tags: interactive| + """ + if not self.midi_output: + self.skipTest('No midi device') + + out = self.midi_output + # program change + out.write_short(0xc0) + # put a note on, then off. + out.write_short(0x90, 65, 100) + out.write_short(0x80, 65, 100) + out.write_short(0x90) + + def test_write_sys_ex(self): + if not self.midi_output: + self.skipTest('No midi device') + + out = self.midi_output + out.write_sys_ex(pygame.midi.time(), + [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7]) + + def test_pitch_bend(self): + # FIXME : pitch_bend in the code, but not in documentation + if not self.midi_output: + self.skipTest('No midi device') + + out = self.midi_output + with self.assertRaises(ValueError) as cm: + out.pitch_bend(5, channel=-1) + self.assertEqual(str(cm.exception), "Channel not between 0 and 15.") + with self.assertRaises(ValueError) as cm: + out.pitch_bend(5, channel=16) + with self.assertRaises(ValueError) as cm: + out.pitch_bend(-10001, 1) + self.assertEqual(str(cm.exception), "Pitch bend value must be between " + "-8192 and +8191, not -10001.") + with self.assertRaises(ValueError) as cm: + out.pitch_bend(10665, 2) + + def test_close(self): + if not self.midi_output: + self.skipTest('No midi device') + self.assertIsNotNone(self.midi_output._output) + self.midi_output.close() + self.assertIsNone(self.midi_output._output) + + def test_abort(self): + if not self.midi_output: + self.skipTest('No midi device') + self.assertEqual(self.midi_output._aborted, 0) + self.midi_output.abort() + self.assertEqual(self.midi_output._aborted, 1) + + +class MidiModuleTest(unittest.TestCase): + + def setUp(self): + pygame.midi.init() + + def tearDown(self): + pygame.midi.quit() + + def test_MidiException(self): + + def raiseit(): + raise pygame.midi.MidiException('Hello Midi param') + + with self.assertRaises(pygame.midi.MidiException) as cm: + raiseit() + self.assertEqual(cm.exception.parameter, 'Hello Midi param') + + def test_get_count(self): + c = pygame.midi.get_count() + self.assertIsInstance(c, int) + self.assertTrue(c >= 0) + + def test_get_default_input_id(self): + + midin_id = pygame.midi.get_default_input_id() + # if there is a not None return make sure it is an int. + self.assertIsInstance(midin_id, int) + self.assertTrue(midin_id >= -1) + pygame.midi.quit() + self.assertRaises(RuntimeError, pygame.midi.get_default_output_id) + + def test_get_default_output_id(self): + + c = pygame.midi.get_default_output_id() + self.assertIsInstance(c, int) + self.assertTrue(c >= -1) + pygame.midi.quit() + self.assertRaises(RuntimeError, pygame.midi.get_default_output_id) + + def test_get_device_info(self): + + an_id = pygame.midi.get_default_output_id() + if an_id != -1: + interf, name, input, output, opened = pygame.midi.get_device_info(an_id) + self.assertEqual(output, 1) + self.assertEqual(input, 0) + self.assertEqual(opened, 0) + + an_in_id = pygame.midi.get_default_input_id() + if an_in_id != -1: + r = pygame.midi.get_device_info(an_in_id) + # if r is None, it means that the id is out of range. + interf, name, input, output, opened = r + + self.assertEqual(output, 0) + self.assertEqual(input, 1) + self.assertEqual(opened, 0) + out_of_range = pygame.midi.get_count() + for num in range(out_of_range): + self.assertIsNotNone(pygame.midi.get_device_info(num)) + info = pygame.midi.get_device_info(out_of_range) + self.assertIsNone(info) + + def test_init(self): + + pygame.midi.quit() + self.assertRaises(RuntimeError, pygame.midi.get_count) + # initialising many times should be fine. + pygame.midi.init() + pygame.midi.init() + pygame.midi.init() + pygame.midi.init() + + self.assertTrue(pygame.midi.get_init()) + + def test_midis2events(self): + + midi_data = ([[0xc0, 0, 1, 2], 20000], + [[0x90, 60, 100, 'blablabla'], 20000] + ) + events = pygame.midi.midis2events(midi_data, 2) + self.assertEqual(len(events), 2) + + for eve in events: + # pygame.event.Event is a function, but ... + self.assertEqual(eve.__class__.__name__, 'Event') + self.assertEqual(eve.vice_id, 2) + # FIXME I don't know what we want for the Event.timestamp + # For now it accepts it accepts int as is: + self.assertIsInstance(eve.timestamp, int) + self.assertEqual(eve.timestamp, 20000) + self.assertEqual(events[1].data3, 'blablabla') + + def test_quit(self): + + # It is safe to call this more than once. + pygame.midi.quit() + pygame.midi.init() + pygame.midi.quit() + pygame.midi.quit() + pygame.midi.init() + pygame.midi.init() + pygame.midi.quit() + + self.assertFalse(pygame.midi.get_init()) + + def test_get_init(self): + # Already initialized as pygame.midi.init() was called in setUp(). + self.assertTrue(pygame.midi.get_init()) + + def test_time(self): + + mtime = pygame.midi.time() + self.assertIsInstance(mtime, int) + # should be close to 2-3... since the timer is just init'd. + self.assertTrue(0 <= mtime < 100) + + + def test_conversions(self): + """ of frequencies to midi note numbers and ansi note names. + """ + from pygame.midi import ( + frequency_to_midi, midi_to_frequency, midi_to_ansi_note + ) + self.assertEqual(frequency_to_midi(27.5), 21) + self.assertEqual(frequency_to_midi(36.7), 26) + self.assertEqual(frequency_to_midi(4186.0), 108) + self.assertEqual(midi_to_frequency(21), 27.5) + self.assertEqual(midi_to_frequency(26), 36.7) + self.assertEqual(midi_to_frequency(108), 4186.0) + self.assertEqual(midi_to_ansi_note(21), 'A0') + self.assertEqual(midi_to_ansi_note(102), 'F#7') + self.assertEqual(midi_to_ansi_note(108), 'C8') + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/mixer_music_tags.py b/venv/Lib/site-packages/pygame/tests/mixer_music_tags.py new file mode 100644 index 0000000..a131d09 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/mixer_music_tags.py @@ -0,0 +1,7 @@ +__tags__ = [] + +import pygame +import sys +if 'pygame.mixer_music' not in sys.modules: + __tags__.extend(('ignore', 'subprocess_ignore')) + diff --git a/venv/Lib/site-packages/pygame/tests/mixer_music_test.py b/venv/Lib/site-packages/pygame/tests/mixer_music_test.py new file mode 100644 index 0000000..e7ee608 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/mixer_music_test.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- + +import os +import sys +import unittest + +from pygame.tests.test_utils import example_path +import pygame +from pygame.compat import as_unicode, unicode_, filesystem_encode + + +class MixerMusicModuleTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Initializing the mixer is slow, so minimize the times it is called. + pygame.mixer.init() + + @classmethod + def tearDownClass(cls): + pygame.mixer.quit() + + def setUp(cls): + # This makes sure the mixer is always initialized before each test (in + # case a test calls pygame.mixer.quit()). + if pygame.mixer.get_init() is None: + pygame.mixer.init() + + def test_load(self): + "|tags:music|" + # __doc__ (as of 2008-07-13) for pygame.mixer_music.load: + + # pygame.mixer.music.load(filename): return None + # Load a music file for playback + + data_fname = example_path('data') + formats = ['mp3', 'ogg', 'wav'] + + for f in formats: + path = os.path.join(data_fname, 'house_lo.%s' % f) + if os.sep == '\\': + path = path.replace('\\', '\\\\') + umusfn = as_unicode(path) + bmusfn = filesystem_encode(umusfn) + + pygame.mixer.music.load(umusfn) + pygame.mixer.music.load(bmusfn) + + def test_load_object(self): + """test loading music from file-like objects.""" + formats = ['ogg', 'wav'] + data_fname = example_path('data') + for f in formats: + path = os.path.join(data_fname, 'house_lo.%s' % f) + if os.sep == '\\': + path = path.replace('\\', '\\\\') + bmusfn = filesystem_encode(path) + + with open(bmusfn, 'rb') as musf: + pygame.mixer.music.load(musf) + + def test_load_unicode(self): + """test non-ASCII unicode path""" + import shutil + ep = unicode_(example_path('data')) + temp_file = os.path.join(ep, u'你好.wav') + org_file = os.path.join(ep, u'house_lo.wav') + try: + with open(temp_file, 'w') as f: + pass + os.remove(temp_file) + except IOError: + raise unittest.SkipTest('the path cannot be opened') + shutil.copy(org_file, temp_file) + try: + pygame.mixer.music.load(temp_file) + pygame.mixer.music.load(org_file) # unload + finally: + os.remove(temp_file) + + def todo_test_queue(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.queue: + + # This will load a music file and queue it. A queued music file will + # begin as soon as the current music naturally ends. If the current + # music is ever stopped or changed, the queued song will be lost. + # + # The following example will play music by Bach six times, then play + # music by Mozart once: + # + # pygame.mixer.music.load('bach.ogg') + # pygame.mixer.music.play(5) # Plays six times, not five! + # pygame.mixer.music.queue('mozart.ogg') + + self.fail() + + def todo_test_stop(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.stop: + + # Stops the music playback if it is currently playing. + + self.fail() + + def todo_test_rewind(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.rewind: + + # Resets playback of the current music to the beginning. + + self.fail() + + def todo_test_get_pos(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_pos: + + # This gets the number of milliseconds that the music has been playing + # for. The returned time only represents how long the music has been + # playing; it does not take into account any starting position + # offsets. + # + + self.fail() + + def todo_test_fadeout(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.fadeout: + + # This will stop the music playback after it has been faded out over + # the specified time (measured in milliseconds). + # + # Note, that this function blocks until the music has faded out. + + self.fail() + + def todo_test_play(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.play: + + # This will play the loaded music stream. If the music is already + # playing it will be restarted. + # + # The loops argument controls the number of repeats a music will play. + # play(5) will cause the music to played once, then repeated five + # times, for a total of six. If the loops is -1 then the music will + # repeat indefinitely. + # + # The starting position argument controls where in the music the song + # starts playing. The starting position is dependent on the format of + # music playing. MP3 and OGG use the position as time (in seconds). + # MOD music it is the pattern order number. Passing a startpos will + # raise a NotImplementedError if it cannot set the start position + # + + self.fail() + + def todo_test_load(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.load: + + # This will load a music file and prepare it for playback. If a music + # stream is already playing it will be stopped. This does not start + # the music playing. + # + # Music can only be loaded from filenames, not python file objects + # like the other pygame loading functions. + # + + self.fail() + + def todo_test_get_volume(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_volume: + + # Returns the current volume for the mixer. The value will be between + # 0.0 and 1.0. + # + + self.fail() + + def todo_test_set_endevent(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.set_endevent: + + # This causes Pygame to signal (by means of the event queue) when the + # music is done playing. The argument determines the type of event + # that will be queued. + # + # The event will be queued every time the music finishes, not just the + # first time. To stop the event from being queued, call this method + # with no argument. + # + + self.fail() + + def todo_test_pause(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.pause: + + # Temporarily stop playback of the music stream. It can be resumed + # with the pygame.mixer.music.unpause() function. + # + + self.fail() + + def todo_test_get_busy(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_busy: + + # Returns True when the music stream is actively playing. When the + # music is idle this returns False. + # + + self.fail() + + def todo_test_get_endevent(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_endevent: + + # Returns the event type to be sent every time the music finishes + # playback. If there is no endevent the function returns + # pygame.NOEVENT. + # + + self.fail() + + def todo_test_unpause(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.unpause: + + # This will resume the playback of a music stream after it has been paused. + + self.fail() + + def todo_test_set_volume(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer_music.set_volume: + + # Set the volume of the music playback. The value argument is between + # 0.0 and 1.0. When new music is loaded the volume is reset. + # + + self.fail() + + def todo_test_set_pos(self): + + # __doc__ (as of 2010-24-05) for pygame.mixer_music.set_pos: + + #This sets the position in the music file where playback will start. The + # meaning of "pos", a float (or a number that can be converted to a float), + # depends on the music format. Newer versions of SDL_mixer have better + # positioning support than earlier. An SDLError is raised if a particular + # format does not support positioning. + # + + self.fail() + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/mixer_tags.py b/venv/Lib/site-packages/pygame/tests/mixer_tags.py new file mode 100644 index 0000000..7cba721 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/mixer_tags.py @@ -0,0 +1,7 @@ +__tags__ = [] + +import pygame +import sys +if 'pygame.mixer' not in sys.modules: + __tags__.extend(('ignore', 'subprocess_ignore')) + diff --git a/venv/Lib/site-packages/pygame/tests/mixer_test.py b/venv/Lib/site-packages/pygame/tests/mixer_test.py new file mode 100644 index 0000000..e00926c --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/mixer_test.py @@ -0,0 +1,1029 @@ +# -*- coding: utf8 -*- + +import sys +import os +import unittest +import platform + +from pygame.tests.test_utils import example_path, AssertRaisesRegexMixin + +import pygame +from pygame import mixer +from pygame.compat import unicode_, as_bytes, bytes_ + + +IS_PYPY = 'PyPy' == platform.python_implementation() + +################################### CONSTANTS ################################## + +FREQUENCIES = [11025, 22050, 44100, 48000] +SIZES = [-16, -8, 8, 16] +if pygame.get_sdl_version()[0] >= 2: + SIZES.append(32) + +CHANNELS = [1, 2] +BUFFERS = [3024] + +CONFIGS = [{'frequency' : f, 'size' : s, 'channels': c} + for f in FREQUENCIES + for s in SIZES + for c in CHANNELS] +# Using all CONFIGS fails on a Mac; probably older SDL_mixer; we could do: +# if platform.system() == 'Darwin': +# But using all CONFIGS is very slow (> 10 sec for example) +# And probably, we don't need to be so exhaustive, hence: + +CONFIG = {'frequency' : 22050, 'size' : -16, 'channels' : 2} # base config +if pygame.get_sdl_version()[0] >= 2: + CONFIG = {'frequency' : 44100, 'size' : 32, 'channels' : 2} # base config + +############################## MODULE LEVEL TESTS ############################## + +class MixerModuleTest(unittest.TestCase): + + def tearDown(self): + mixer.quit() + mixer.pre_init(0, 0, 0, 0) + + def test_init__keyword_args(self): + # note: this test used to loop over all CONFIGS, but it's very slow.. + mixer.init(**CONFIG) + mixer_conf = mixer.get_init() + + self.assertEqual(mixer_conf[0], CONFIG['frequency']) + # Not all "sizes" are supported on all systems, hence "abs". + self.assertEqual(abs(mixer_conf[1]), abs(CONFIG['size'])) + self.assertEqual(mixer_conf[2], CONFIG['channels']) + + def test_pre_init__keyword_args(self): + # note: this test used to loop over all CONFIGS, but it's very slow.. + mixer.pre_init(**CONFIG) + mixer.init() + + mixer_conf = mixer.get_init() + + self.assertEqual(mixer_conf[0], CONFIG['frequency']) + # Not all "sizes" are supported on all systems, hence "abs". + self.assertEqual(abs(mixer_conf[1]), abs(CONFIG['size'])) + self.assertEqual(mixer_conf[2], CONFIG['channels']) + + def test_pre_init__zero_values(self): + # Ensure that argument values of 0 are replaced with + # default values. No way to check buffer size though. + mixer.pre_init(44100, -8, 1) # Non default values + mixer.pre_init(0, 0, 0) # Should reset to default values + mixer.init() + self.assertEqual(mixer.get_init(), (22050, -16, 2)) + + def test_init__zero_values(self): + # Ensure that argument values of 0 are replaced with + # preset values. No way to check buffer size though. + mixer.pre_init(44100, 8, 1, allowedchanges=0) # None default values + mixer.init(0, 0, 0) + self.assertEqual(mixer.get_init(), (44100, 8, 1)) + + @unittest.skip('SDL_mixer bug') + def test_get_init__returns_exact_values_used_for_init(self): + # fix in 1.9 - I think it's a SDL_mixer bug. + + # TODO: When this bug is fixed, testing through every combination + # will be too slow so adjust as necessary, at the moment it + # breaks the loop after first failure + + for init_conf in CONFIGS: + frequency, size, channels + if (frequency, size) == (22050, 16): + continue + mixer.init(frequency, size, channels) + + mixer_conf = mixer.get_init() + + self.assertEqual(init_conf, mixer_conf) + mixer.quit() + + def test_get_init__returns_None_if_mixer_not_initialized(self): + self.assertIsNone(mixer.get_init()) + + def test_get_num_channels__defaults_eight_after_init(self): + mixer.init() + self.assertEqual(mixer.get_num_channels(), 8) + + def test_set_num_channels(self): + mixer.init() + + default_num_channels = mixer.get_num_channels() + for i in range(1, default_num_channels + 1): + mixer.set_num_channels(i) + self.assertEqual(mixer.get_num_channels(), i) + + def test_quit(self): + """ get_num_channels() Should throw pygame.error if uninitialized + after mixer.quit() """ + mixer.init() + mixer.quit() + self.assertRaises(pygame.error, mixer.get_num_channels) + + def test_sound_args(self): + def get_bytes(snd): + return snd.get_raw() + mixer.init() + + sample = as_bytes('\x00\xff') * 24 + wave_path = example_path(os.path.join('data', 'house_lo.wav')) + uwave_path = unicode_(wave_path) + bwave_path = uwave_path.encode(sys.getfilesystemencoding()) + snd = mixer.Sound(file=wave_path) + self.assertTrue(snd.get_length() > 0.5) + snd_bytes = get_bytes(snd) + self.assertTrue(len(snd_bytes) > 1000) + self.assertEqual(get_bytes(mixer.Sound(wave_path)), snd_bytes) + self.assertEqual(get_bytes(mixer.Sound(file=uwave_path)), snd_bytes) + self.assertEqual(get_bytes(mixer.Sound(uwave_path)), snd_bytes) + arg_emsg = 'Sound takes either 1 positional or 1 keyword argument' + + with self.assertRaises(TypeError) as cm: + mixer.Sound() + self.assertEqual(str(cm.exception), arg_emsg) + with self.assertRaises(TypeError) as cm: + mixer.Sound(wave_path, buffer=sample) + self.assertEqual(str(cm.exception), arg_emsg) + with self.assertRaises(TypeError) as cm: + mixer.Sound(sample, file=wave_path) + self.assertEqual(str(cm.exception), arg_emsg) + with self.assertRaises(TypeError) as cm: + mixer.Sound(buffer=sample, file=wave_path) + self.assertEqual(str(cm.exception), arg_emsg) + + with self.assertRaises(TypeError) as cm: + mixer.Sound(foobar=sample) + self.assertEqual(str(cm.exception), + "Unrecognized keyword argument 'foobar'") + + snd = mixer.Sound(wave_path, **{}) + self.assertEqual(get_bytes(snd), snd_bytes) + snd = mixer.Sound(*[], **{'file': wave_path}) + + with self.assertRaises(TypeError) as cm: + mixer.Sound([]) + self.assertEqual(str(cm.exception), + 'Unrecognized argument (type list)') + + with self.assertRaises(TypeError) as cm: + snd = mixer.Sound(buffer=[]) + emsg = 'Expected object with buffer interface: got a list' + self.assertEqual(str(cm.exception), emsg) + + ufake_path = unicode_('12345678') + self.assertRaises(IOError, mixer.Sound, ufake_path) + self.assertRaises(IOError, mixer.Sound, '12345678') + + with self.assertRaises(TypeError) as cm: + mixer.Sound(buffer=unicode_('something')) + emsg = 'Unicode object not allowed as buffer object' + self.assertEqual(str(cm.exception), emsg) + self.assertEqual(get_bytes(mixer.Sound(buffer=sample)), sample) + if type(sample) != str: + somebytes = get_bytes(mixer.Sound(sample)) + # on python 2 we do not allow using string except as file name. + self.assertEqual(somebytes, sample) + self.assertEqual(get_bytes(mixer.Sound(file=bwave_path)), snd_bytes) + self.assertEqual(get_bytes(mixer.Sound(bwave_path)), snd_bytes) + + snd = mixer.Sound(wave_path) + with self.assertRaises(TypeError) as cm: + mixer.Sound(wave_path, array=snd) + self.assertEqual(str(cm.exception), arg_emsg) + with self.assertRaises(TypeError) as cm: + mixer.Sound(buffer=sample, array=snd) + self.assertEqual(str(cm.exception), arg_emsg) + snd2 = mixer.Sound(array=snd) + self.assertEqual(snd.get_raw(), snd2.get_raw()) + + def test_sound_unicode(self): + """test non-ASCII unicode path""" + mixer.init() + import shutil + ep = unicode_(example_path('data')) + temp_file = os.path.join(ep, u'你好.wav') + org_file = os.path.join(ep, u'house_lo.wav') + shutil.copy(org_file, temp_file) + try: + with open(temp_file, 'rb') as f: + pass + except IOError: + raise unittest.SkipTest('the path cannot be opened') + + try: + sound = mixer.Sound(temp_file) + del sound + finally: + os.remove(temp_file) + + @unittest.skipIf(os.environ.get('SDL_AUDIODRIVER') == 'disk', + 'this test fails without real sound card') + def test_array_keyword(self): + try: + from numpy import (array, arange, zeros, + int8, uint8, + int16, uint16, + int32, uint32) + except ImportError: + self.skipTest('requires numpy') + + freq = 22050 + format_list = [-8, 8, -16, 16] + channels_list = [1, 2] + + a_lists = dict((f, []) for f in format_list) + a32u_mono = arange(0, 256, 1, uint32) + a16u_mono = a32u_mono.astype(uint16) + a8u_mono = a32u_mono.astype(uint8) + au_list_mono = [(1, a) for a in [a8u_mono, a16u_mono, a32u_mono]] + for format in format_list: + if format > 0: + a_lists[format].extend(au_list_mono) + a32s_mono = arange(-128, 128, 1, int32) + a16s_mono = a32s_mono.astype(int16) + a8s_mono = a32s_mono.astype(int8) + as_list_mono = [(1, a) for a in [a8s_mono, a16s_mono, a32s_mono]] + for format in format_list: + if format < 0: + a_lists[format].extend(as_list_mono) + a32u_stereo = zeros([a32u_mono.shape[0], 2], uint32) + a32u_stereo[:,0] = a32u_mono + a32u_stereo[:,1] = 255 - a32u_mono + a16u_stereo = a32u_stereo.astype(uint16) + a8u_stereo = a32u_stereo.astype(uint8) + au_list_stereo = [(2, a) + for a in [a8u_stereo, a16u_stereo, a32u_stereo]] + for format in format_list: + if format > 0: + a_lists[format].extend(au_list_stereo) + a32s_stereo = zeros([a32s_mono.shape[0], 2], int32) + a32s_stereo[:,0] = a32s_mono + a32s_stereo[:,1] = -1 - a32s_mono + a16s_stereo = a32s_stereo.astype(int16) + a8s_stereo = a32s_stereo.astype(int8) + as_list_stereo = [(2, a) + for a in [a8s_stereo, a16s_stereo, a32s_stereo]] + for format in format_list: + if format < 0: + a_lists[format].extend(as_list_stereo) + + for format in format_list: + for channels in channels_list: + try: + mixer.init(freq, format, channels) + except pygame.error: + # Some formats (e.g. 16) may not be supported. + continue + try: + __, f, c = mixer.get_init() + if f != format or c != channels: + # Some formats (e.g. -8) may not be supported. + continue + for c, a in a_lists[format]: + self._test_array_argument(format, a, c == channels) + finally: + mixer.quit() + + def _test_array_argument(self, format, a, test_pass): + from numpy import array, all as all_ + + try: + snd = mixer.Sound(array=a) + except ValueError: + if not test_pass: + return + self.fail("Raised ValueError: Format %i, dtype %s" % + (format, a.dtype)) + if not test_pass: + self.fail("Did not raise ValueError: Format %i, dtype %s" % + (format, a.dtype)) + a2 = array(snd) + a3 = a.astype(a2.dtype) + lshift = abs(format) - 8 * a.itemsize + if lshift >= 0: + # This is asymmetric with respect to downcasting. + a3 <<= lshift + self.assertTrue(all_(a2 == a3), + "Format %i, dtype %s" % (format, a.dtype)) + + def _test_array_interface_fail(self, a): + self.assertRaises(ValueError, mixer.Sound, array=a) + + def test_array_interface(self): + mixer.init(22050, -16, 1, allowedchanges=0) + snd = mixer.Sound(buffer=as_bytes('\x00\x7f') * 20) + d = snd.__array_interface__ + self.assertTrue(isinstance(d, dict)) + if pygame.get_sdl_byteorder() == pygame.LIL_ENDIAN: + typestr = '') if is_lil_endian else ('>', '<') + shape = (10, channels)[:ndim] + strides = (channels * itemsize, itemsize)[2 - ndim:] + exp = Exporter(shape, format=frev + 'i') + snd = mixer.Sound(array=exp) + buflen = len(exp) * itemsize * channels + imp = Importer(snd, buftools.PyBUF_SIMPLE) + self.assertEqual(imp.ndim, 0) + self.assertTrue(imp.format is None) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, itemsize) + self.assertTrue(imp.shape is None) + self.assertTrue(imp.strides is None) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_WRITABLE) + self.assertEqual(imp.ndim, 0) + self.assertTrue(imp.format is None) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, itemsize) + self.assertTrue(imp.shape is None) + self.assertTrue(imp.strides is None) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_FORMAT) + self.assertEqual(imp.ndim, 0) + self.assertEqual(imp.format, format) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, itemsize) + self.assertTrue(imp.shape is None) + self.assertTrue(imp.strides is None) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_ND) + self.assertEqual(imp.ndim, ndim) + self.assertTrue(imp.format is None) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, itemsize) + self.assertEqual(imp.shape, shape) + self.assertTrue(imp.strides is None) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_STRIDES) + self.assertEqual(imp.ndim, ndim) + self.assertTrue(imp.format is None) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, itemsize) + self.assertEqual(imp.shape, shape) + self.assertEqual(imp.strides, strides) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_FULL_RO) + self.assertEqual(imp.ndim, ndim) + self.assertEqual(imp.format, format) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, 2) + self.assertEqual(imp.shape, shape) + self.assertEqual(imp.strides, strides) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_FULL_RO) + self.assertEqual(imp.ndim, ndim) + self.assertEqual(imp.format, format) + self.assertEqual(imp.len, buflen) + self.assertEqual(imp.itemsize, itemsize) + self.assertEqual(imp.shape, exp.shape) + self.assertEqual(imp.strides, strides) + self.assertTrue(imp.suboffsets is None) + self.assertFalse(imp.readonly) + self.assertEqual(imp.buf, snd._samples_address) + imp = Importer(snd, buftools.PyBUF_C_CONTIGUOUS) + self.assertEqual(imp.ndim, ndim) + self.assertTrue(imp.format is None) + self.assertEqual(imp.strides, strides) + imp = Importer(snd, buftools.PyBUF_ANY_CONTIGUOUS) + self.assertEqual(imp.ndim, ndim) + self.assertTrue(imp.format is None) + self.assertEqual(imp.strides, strides) + if ndim == 1: + imp = Importer(snd, buftools.PyBUF_F_CONTIGUOUS) + self.assertEqual(imp.ndim, 1) + self.assertTrue(imp.format is None) + self.assertEqual(imp.strides, strides) + else: + self.assertRaises(BufferError, Importer, snd, + buftools.PyBUF_F_CONTIGUOUS) + + def todo_test_fadeout(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.fadeout: + + # pygame.mixer.fadeout(time): return None + # fade out the volume on all sounds before stopping + # + # This will fade out the volume on all active channels over the time + # argument in milliseconds. After the sound is muted the playback will + # stop. + # + + self.fail() + + def todo_test_find_channel(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.find_channel: + + # pygame.mixer.find_channel(force=False): return Channel + # find an unused channel + # + # This will find and return an inactive Channel object. If there are + # no inactive Channels this function will return None. If there are no + # inactive channels and the force argument is True, this will find the + # Channel with the longest running Sound and return it. + # + # If the mixer has reserved channels from pygame.mixer.set_reserved() + # then those channels will not be returned here. + # + + self.fail() + + def todo_test_get_busy(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.get_busy: + + # pygame.mixer.get_busy(): return bool + # test if any sound is being mixed + # + # Returns True if the mixer is busy mixing any channels. If the mixer + # is idle then this return False. + # + + self.fail() + + def todo_test_pause(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.pause: + + # pygame.mixer.pause(): return None + # temporarily stop playback of all sound channels + # + # This will temporarily stop all playback on the active mixer + # channels. The playback can later be resumed with + # pygame.mixer.unpause() + # + + self.fail() + + def todo_test_set_reserved(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.set_reserved: + + # pygame.mixer.set_reserved(count): return None + # reserve channels from being automatically used + # + # The mixer can reserve any number of channels that will not be + # automatically selected for playback by Sounds. If sounds are + # currently playing on the reserved channels they will not be stopped. + # + # This allows the application to reserve a specific number of channels + # for important sounds that must not be dropped or have a guaranteed + # channel to play on. + # + + self.fail() + + def todo_test_stop(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.stop: + + # pygame.mixer.stop(): return None + # stop playback of all sound channels + # + # This will stop all playback of all active mixer channels. + + self.fail() + + def todo_test_unpause(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.unpause: + + # pygame.mixer.unpause(): return None + # resume paused playback of sound channels + # + # This will resume all active sound channels after they have been paused. + + self.fail() + +############################## CHANNEL CLASS TESTS ############################# + +class ChannelTypeTest(AssertRaisesRegexMixin, unittest.TestCase): + @classmethod + def setUpClass(cls): + # Initializing the mixer is slow, so minimize the times it is called. + mixer.init() + + @classmethod + def tearDownClass(cls): + mixer.quit() + + def setUp(cls): + # This makes sure the mixer is always initialized before each test (in + # case a test calls pygame.mixer.quit()). + if mixer.get_init() is None: + mixer.init() + + def test_channel(self): + """Ensure Channel() creation works.""" + channel = mixer.Channel(0) + + self.assertIsInstance(channel, mixer.ChannelType) + self.assertEqual(channel.__class__.__name__, 'Channel') + + def test_channel__without_arg(self): + """Ensure exception for Channel() creation with no argument.""" + with self.assertRaises(TypeError): + mixer.Channel() + + def test_channel__invalid_id(self): + """Ensure exception for Channel() creation with an invalid id.""" + with self.assertRaises(IndexError): + mixer.Channel(-1) + + def test_channel__before_init(self): + """Ensure exception for Channel() creation with non-init mixer.""" + mixer.quit() + + with self.assertRaisesRegex(pygame.error, 'mixer not initialized'): + mixer.Channel(0) + + def todo_test_fadeout(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.fadeout: + + # Channel.fadeout(time): return None + # stop playback after fading channel out + # + # Stop playback of a channel after fading out the sound over the given + # time argument in milliseconds. + # + + self.fail() + + def test_get_busy(self): + """Ensure an idle channel's busy state is correct.""" + expected_busy = False + channel = mixer.Channel(0) + + busy = channel.get_busy() + + self.assertEqual(busy, expected_busy) + + def todo_test_get_busy__active(self): + """Ensure an active channel's busy state is correct.""" + self.fail() + + def todo_test_get_endevent(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_endevent: + + # Channel.get_endevent(): return type + # get the event a channel sends when playback stops + # + # Returns the event type to be sent every time the Channel finishes + # playback of a Sound. If there is no endevent the function returns + # pygame.NOEVENT. + # + + self.fail() + + def todo_test_get_queue(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_queue: + + # Channel.get_queue(): return Sound + # return any Sound that is queued + # + # If a Sound is already queued on this channel it will be returned. + # Once the queued sound begins playback it will no longer be on the + # queue. + # + + self.fail() + + def todo_test_get_sound(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_sound: + + # Channel.get_sound(): return Sound + # get the currently playing Sound + # + # Return the actual Sound object currently playing on this channel. If + # the channel is idle None is returned. + # + + self.fail() + + def test_get_volume(self): + """Ensure a channel's volume can be retrieved.""" + expected_volume = 1.0 # default + channel = mixer.Channel(0) + + volume = channel.get_volume() + + self.assertAlmostEqual(volume, expected_volume) + + def todo_test_get_volume__while_playing(self): + """Ensure a channel's volume can be retrieved while playing.""" + self.fail() + + def todo_test_pause(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.pause: + + # Channel.pause(): return None + # temporarily stop playback of a channel + # + # Temporarily stop the playback of sound on a channel. It can be + # resumed at a later time with Channel.unpause() + # + + self.fail() + + def todo_test_play(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.play: + + # Channel.play(Sound, loops=0, maxtime=0, fade_ms=0): return None + # play a Sound on a specific Channel + # + # This will begin playback of a Sound on a specific Channel. If the + # Channel is currently playing any other Sound it will be stopped. + # + # The loops argument has the same meaning as in Sound.play(): it is + # the number of times to repeat the sound after the first time. If it + # is 3, the sound will be played 4 times (the first time, then three + # more). If loops is -1 then the playback will repeat indefinitely. + # + # As in Sound.play(), the maxtime argument can be used to stop + # playback of the Sound after a given number of milliseconds. + # + # As in Sound.play(), the fade_ms argument can be used fade in the sound. + + self.fail() + + def todo_test_queue(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.queue: + + # Channel.queue(Sound): return None + # queue a Sound object to follow the current + # + # When a Sound is queued on a Channel, it will begin playing + # immediately after the current Sound is finished. Each channel can + # only have a single Sound queued at a time. The queued Sound will + # only play if the current playback finished automatically. It is + # cleared on any other call to Channel.stop() or Channel.play(). + # + # If there is no sound actively playing on the Channel then the Sound + # will begin playing immediately. + # + + self.fail() + + def todo_test_set_endevent(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.set_endevent: + + # Channel.set_endevent(): return None + # Channel.set_endevent(type): return None + # have the channel send an event when playback stops + # + # When an endevent is set for a channel, it will send an event to the + # pygame queue every time a sound finishes playing on that channel + # (not just the first time). Use pygame.event.get() to retrieve the + # endevent once it's sent. + # + # Note that if you called Sound.play(n) or Channel.play(sound,n), the + # end event is sent only once: after the sound has been played "n+1" + # times (see the documentation of Sound.play). + # + # If Channel.stop() or Channel.play() is called while the sound was + # still playing, the event will be posted immediately. + # + # The type argument will be the event id sent to the queue. This can + # be any valid event type, but a good choice would be a value between + # pygame.locals.USEREVENT and pygame.locals.NUMEVENTS. If no type + # argument is given then the Channel will stop sending endevents. + # + + self.fail() + + def todo_test_set_volume(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.set_volume: + + # Channel.set_volume(value): return None + # Channel.set_volume(left, right): return None + # set the volume of a playing channel + # + # Set the volume (loudness) of a playing sound. When a channel starts + # to play its volume value is reset. This only affects the current + # sound. The value argument is between 0.0 and 1.0. + # + # If one argument is passed, it will be the volume of both speakers. + # If two arguments are passed and the mixer is in stereo mode, the + # first argument will be the volume of the left speaker and the second + # will be the volume of the right speaker. (If the second argument is + # None, the first argument will be the volume of both speakers.) + # + # If the channel is playing a Sound on which set_volume() has also + # been called, both calls are taken into account. For example: + # + # sound = pygame.mixer.Sound("s.wav") + # channel = s.play() # Sound plays at full volume by default + # sound.set_volume(0.9) # Now plays at 90% of full volume. + # sound.set_volume(0.6) # Now plays at 60% (previous value replaced). + # channel.set_volume(0.5) # Now plays at 30% (0.6 * 0.5). + + self.fail() + + def todo_test_stop(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.stop: + + # Channel.stop(): return None + # stop playback on a Channel + # + # Stop sound playback on a channel. After playback is stopped the + # channel becomes available for new Sounds to play on it. + # + + self.fail() + + def todo_test_unpause(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.unpause: + + # Channel.unpause(): return None + # resume pause playback of a channel + # + # Resume the playback on a paused channel. + + self.fail() + +############################### SOUND CLASS TESTS ############################## + +class SoundTypeTest(AssertRaisesRegexMixin, unittest.TestCase): + @classmethod + def setUpClass(cls): + # Initializing the mixer is slow, so minimize the times it is called. + mixer.init() + + @classmethod + def tearDownClass(cls): + mixer.quit() + + def setUp(cls): + # This makes sure the mixer is always initialized before each test (in + # case a test calls pygame.mixer.quit()). + if mixer.get_init() is None: + mixer.init() + + # See MixerModuleTest's methods test_sound_args(), test_sound_unicode(), + # and test_array_keyword() for additional testing of Sound() creation. + def test_sound(self): + """Ensure Sound() creation with a filename works.""" + filename = example_path(os.path.join('data', 'house_lo.wav')) + sound1 = mixer.Sound(filename) + sound2 = mixer.Sound(file=filename) + + self.assertIsInstance(sound1, mixer.Sound) + self.assertIsInstance(sound2, mixer.Sound) + + def test_sound__from_file_object(self): + """Ensure Sound() creation with a file object works.""" + filename = example_path(os.path.join('data', 'house_lo.wav')) + + # Using 'with' ensures the file is closed even if test fails. + with open(filename, "rb") as file_obj: + sound = mixer.Sound(file_obj) + + self.assertIsInstance(sound, mixer.Sound) + + def test_sound__from_sound_object(self): + """Ensure Sound() creation with a Sound() object works.""" + filename = example_path(os.path.join('data', 'house_lo.wav')) + sound_obj = mixer.Sound(file=filename) + + sound = mixer.Sound(sound_obj) + + self.assertIsInstance(sound, mixer.Sound) + + def todo_test_sound__from_buffer(self): + """Ensure Sound() creation with a buffer works.""" + self.fail() + + def todo_test_sound__from_array(self): + """Ensure Sound() creation with an array works.""" + self.fail() + + def test_sound__without_arg(self): + """Ensure exception raised for Sound() creation with no argument.""" + with self.assertRaises(TypeError): + mixer.Sound() + + def test_sound__before_init(self): + """Ensure exception raised for Sound() creation with non-init mixer.""" + mixer.quit() + filename = example_path(os.path.join('data', 'house_lo.wav')) + + with self.assertRaisesRegex(pygame.error, 'mixer not initialized'): + mixer.Sound(file=filename) + + @unittest.skipIf(IS_PYPY, 'pypy skip') + def test_samples_address(self): + """Test the _samples_address getter.""" + from ctypes import pythonapi, c_void_p, py_object + + try: + Bytes_FromString = pythonapi.PyBytes_FromString # python 3 + except: + Bytes_FromString = pythonapi.PyString_FromString # python 2 + + Bytes_FromString.restype = c_void_p + Bytes_FromString.argtypes = [py_object] + samples = as_bytes('abcdefgh') # keep byte size a multiple of 4 + sample_bytes = Bytes_FromString(samples) + + snd = mixer.Sound(buffer=samples) + + self.assertNotEqual(snd._samples_address, sample_bytes) + + def todo_test_fadeout(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.fadeout: + + # Sound.fadeout(time): return None + # stop sound playback after fading out + # + # This will stop playback of the sound after fading it out over the + # time argument in milliseconds. The Sound will fade and stop on all + # actively playing channels. + # + + self.fail() + + def todo_test_get_length(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.get_length: + + # Sound.get_length(): return seconds + # get the length of the Sound + # + # Return the length of this Sound in seconds. + + self.fail() + + def test_get_num_channels(self): + """Ensure correct number of channels.""" + expected_channels = 0 + filename = example_path(os.path.join('data', 'house_lo.wav')) + sound = mixer.Sound(file=filename) + + num_channels = sound.get_num_channels() + + self.assertEqual(num_channels, expected_channels) + + def todo_test_get_num_channels__while_playing(self): + """Ensure correct number of channels while playing.""" + self.fail() + + def test_get_volume(self): + """Ensure a sound's volume can be retrieved.""" + expected_volume = 1.0 # default + filename = example_path(os.path.join('data', 'house_lo.wav')) + sound = mixer.Sound(file=filename) + + volume = sound.get_volume() + + self.assertAlmostEqual(volume, expected_volume) + + def todo_test_get_volume__while_playing(self): + """Ensure a sound's volume can be retrieved while playing.""" + self.fail() + + def todo_test_play(self): + + # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.play: + + # Sound.play(loops=0, maxtime=0, fade_ms=0): return Channel + # begin sound playback + # + # Begin playback of the Sound (i.e., on the computer's speakers) on an + # available Channel. This will forcibly select a Channel, so playback + # may cut off a currently playing sound if necessary. + # + # The loops argument controls how many times the sample will be + # repeated after being played the first time. A value of 5 means that + # the sound will be played once, then repeated five times, and so is + # played a total of six times. The default value (zero) means the + # Sound is not repeated, and so is only played once. If loops is set + # to -1 the Sound will loop indefinitely (though you can still call + # stop() to stop it). + # + # The maxtime argument can be used to stop playback after a given + # number of milliseconds. + # + # The fade_ms argument will make the sound start playing at 0 volume + # and fade up to full volume over the time given. The sample may end + # before the fade-in is complete. + # + # This returns the Channel object for the channel that was selected. + + self.fail() + + def test_set_volume(self): + """Ensure a sound's volume can be set.""" + float_delta = 1.0 / 128 # SDL volume range is 0 to 128 + filename = example_path(os.path.join('data', 'house_lo.wav')) + sound = mixer.Sound(file=filename) + current_volume = sound.get_volume() + + # (volume_set_value : expected_volume) + volumes = ((-1, current_volume), # value < 0 won't change volume + (0, 0.0), + (0.01, 0.01), + (0.1, 0.1), + (0.5, 0.5), + (0.9, 0.9), + (0.99, 0.99), + (1, 1.0), + (1.1, 1.0), + (2.0, 1.0)) + + for volume_set_value, expected_volume in volumes: + sound.set_volume(volume_set_value) + + self.assertAlmostEqual(sound.get_volume(), expected_volume, + delta=float_delta) + + def todo_test_set_volume__while_playing(self): + """Ensure a sound's volume can be set while playing.""" + self.fail() + + def test_stop(self): + """Ensure stop can be called while not playing a sound.""" + expected_channels = 0 + filename = example_path(os.path.join('data', 'house_lo.wav')) + sound = mixer.Sound(file=filename) + + sound.stop() + + self.assertEqual(sound.get_num_channels(), expected_channels) + + def todo_test_stop__while_playing(self): + """Ensure stop stops a playing sound.""" + self.fail() + + def test_get_raw(self): + """Ensure get_raw returns the correct bytestring.""" + samples = as_bytes('abcdefgh') # keep byte size a multiple of 4 + snd = mixer.Sound(buffer=samples) + + raw = snd.get_raw() + + self.assertIsInstance(raw, bytes_) + self.assertEqual(raw, samples) + + +##################################### MAIN ##################################### + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/mouse_test.py b/venv/Lib/site-packages/pygame/tests/mouse_test.py new file mode 100644 index 0000000..8215cc8 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/mouse_test.py @@ -0,0 +1,150 @@ +import unittest + + +class MouseModuleTest(unittest.TestCase): + def todo_test_get_cursor(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.get_cursor: + + # pygame.mouse.get_cursor(): return (size, hotspot, xormasks, andmasks) + # get the image for the system mouse cursor + # + # Get the information about the mouse system cursor. The return value + # is the same data as the arguments passed into + # pygame.mouse.set_cursor(). + # + + self.fail() + + def todo_test_get_focused(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.get_focused: + + # pygame.mouse.get_focused(): return bool + # check if the display is receiving mouse input + # + # Returns true when pygame is receiving mouse input events (or, in + # windowing terminology, is "active" or has the "focus"). + # + # This method is most useful when working in a window. By contrast, in + # full-screen mode, this method always returns true. + # + # Note: under MS Windows, the window that has the mouse focus also has + # the keyboard focus. But under X-Windows, one window can receive + # mouse events and another receive keyboard events. + # pygame.mouse.get_focused() indicates whether the pygame window + # receives mouse events. + # + + self.fail() + + def todo_test_get_pos(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.get_pos: + + # pygame.mouse.get_pos(): return (x, y) + # get the mouse cursor position + # + # Returns the X and Y position of the mouse cursor. The position is + # relative the the top-left corner of the display. The cursor position + # can be located outside of the display window, but is always + # constrained to the screen. + # + + self.fail() + + def todo_test_get_pressed(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.get_pressed: + + # pygame.moouse.get_pressed(): return (button1, button2, button3) + # get the state of the mouse buttons + # + # Returns a sequence of booleans representing the state of all the + # mouse buttons. A true value means the mouse is currently being + # pressed at the time of the call. + # + # Note, to get all of the mouse events it is better to use either + # pygame.event.wait() or pygame.event.get() and check all of those events + # to see if they are MOUSEBUTTONDOWN, MOUSEBUTTONUP, or MOUSEMOTION. + # Note, that on X11 some XServers use middle button emulation. When + # you click both buttons 1 and 3 at the same time a 2 button event can + # be emitted. + # + # Note, remember to call pygame.event.get() before this function. + # Otherwise it will not work. + # + + self.fail() + + def todo_test_get_rel(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.get_rel: + + # pygame.mouse.get_rel(): return (x, y) + # get the amount of mouse movement + # + # Returns the amount of movement in X and Y since the previous call to + # this function. The relative movement of the mouse cursor is + # constrained to the edges of the screen, but see the virtual input + # mouse mode for a way around this. Virtual input mode is described + # at the top of the page. + # + + self.fail() + + def todo_test_set_cursor(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.set_cursor: + + # pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None + # set the image for the system mouse cursor + # + # When the mouse cursor is visible, it will be displayed as a black + # and white bitmap using the given bitmask arrays. The size is a + # sequence containing the cursor width and height. Hotspot is a + # sequence containing the cursor hotspot position. xormasks is a + # sequence of bytes containing the cursor xor data masks. Lastly is + # andmasks, a sequence of bytes containting the cursor bitmask data. + # + # Width must be a multiple of 8, and the mask arrays must be the + # correct size for the given width and height. Otherwise an exception + # is raised. + # + # See the pygame.cursor module for help creating default and custom + # masks for the system cursor. + # + + self.fail() + + def todo_test_set_pos(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.set_pos: + + # pygame.mouse.set_pos([x, y]): return None + # set the mouse cursor position + # + # Set the current mouse position to arguments given. If the mouse + # cursor is visible it will jump to the new coordinates. Moving the + # mouse will generate a new pygaqme.MOUSEMOTION event. + # + + self.fail() + + def todo_test_set_visible(self): + + # __doc__ (as of 2008-08-02) for pygame.mouse.set_visible: + + # pygame.mouse.set_visible(bool): return bool + # hide or show the mouse cursor + # + # If the bool argument is true, the mouse cursor will be visible. This + # will return the previous visible state of the cursor. + # + + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/overlay_tags.py b/venv/Lib/site-packages/pygame/tests/overlay_tags.py new file mode 100644 index 0000000..a92aa6a --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/overlay_tags.py @@ -0,0 +1,2 @@ +# Overlay support was removed in SDL 2 +__tags__ = ['SDL2_ignore'] diff --git a/venv/Lib/site-packages/pygame/tests/overlay_test.py b/venv/Lib/site-packages/pygame/tests/overlay_test.py new file mode 100644 index 0000000..d5c1799 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/overlay_test.py @@ -0,0 +1,36 @@ +import unittest + + +class OverlayTypeTest(unittest.TestCase): + def todo_test_display(self): + + # __doc__ (as of 2008-08-02) for pygame.overlay.overlay.display: + + # Overlay.display((y, u, v)): return None + # Overlay.display(): return None + # set the overlay pixel data + + self.fail() + + def todo_test_get_hardware(self): + + # __doc__ (as of 2008-08-02) for pygame.overlay.overlay.get_hardware: + + # Overlay.get_hardware(rect): return int + # test if the Overlay is hardware accelerated + + self.fail() + + def todo_test_set_location(self): + + # __doc__ (as of 2008-08-02) for pygame.overlay.overlay.set_location: + + # Overlay.set_location(rect): return None + # control where the overlay is displayed + + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/pixelarray_test.py b/venv/Lib/site-packages/pygame/tests/pixelarray_test.py new file mode 100644 index 0000000..f877ed2 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/pixelarray_test.py @@ -0,0 +1,1420 @@ +import sys +import platform +try: + reduce +except NameError: + from functools import reduce +import operator +import weakref +import gc +import unittest + +from pygame.tests.test_utils import SurfaceSubclass + +try: + from pygame.tests.test_utils import arrinter +except NameError: + pass + +import pygame +from pygame.compat import xrange_ + +PY3 = sys.version_info >= (3, 0, 0) +IS_PYPY = 'PyPy' == platform.python_implementation() + + +class TestMixin (object): + def assert_surfaces_equal (self, s1, s2): + # Assumes the surfaces are the same size. + w, h = s1.get_size () + for x in range (w): + for y in range (h): + self.assertEqual (s1.get_at ((x, y)), s2.get_at ((x, y)), + "size: (%i, %i), position: (%i, %i)" % + (w, h, x, y)) + +class PixelArrayTypeTest (unittest.TestCase, TestMixin): + def test_compare(self): + # __doc__ (as of 2008-06-25) for pygame.pixelarray.PixelArray.compare: + + # PixelArray.compare (array, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray + # Compares the PixelArray with another one. + + w = 10 + h = 20 + size = w, h + sf = pygame.Surface (size, 0, 32) + ar = pygame.PixelArray (sf) + sf2 = pygame.Surface (size, 0, 32) + self.assertRaises (TypeError, ar.compare, sf2) + ar2 = pygame.PixelArray (sf2) + ar3 = ar.compare (ar2) + self.assertTrue(isinstance (ar3, pygame.PixelArray)) + self.assertEqual (ar3.shape, size) + sf2.fill (pygame.Color ('white')) + self.assert_surfaces_equal (sf2, ar3.surface) + del ar3 + r = pygame.Rect (2, 5, 6, 13) + sf.fill (pygame.Color ('blue'), r) + sf2.fill (pygame.Color ('red')) + sf2.fill (pygame.Color ('blue'), r) + ar3 = ar.compare (ar2) + sf.fill (pygame.Color ('white'), r) + self.assert_surfaces_equal (sf, ar3.surface) + + # FINISH ME! + # Test other bit depths, slices, and distance != 0. + + def test_close(self): + """ does not crash when it is deleted. + """ + s = pygame.Surface((10,10)) + a = pygame.PixelArray(s) + a.close() + del a + + def test_close_raises(self): + """ when you try to do an operation after it is closed. + """ + s = pygame.Surface((10,10)) + a = pygame.PixelArray(s) + a.close() + def do_operation(): + a[:] + self.assertRaises (ValueError, do_operation) + + def do_operation2(): + a[:] = 1 + self.assertRaises (ValueError, do_operation2) + + def do_operation3(): + a.make_surface() + self.assertRaises (ValueError, do_operation3) + + def do_operation4(): + for x in a: + pass + self.assertRaises (ValueError, do_operation4) + + def test_context_manager(self): + """ closes properly. + """ + s = pygame.Surface((10,10)) + with pygame.PixelArray(s) as a: + a[:] + + def test_pixel_array (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 20), 0, bpp) + sf.fill ((0, 0, 0)) + ar = pygame.PixelArray (sf) + + self.assertEqual (ar._pixels_address, sf._pixels_address) + + if sf.mustlock (): + self.assertTrue (sf.get_locked ()) + + self.assertEqual (len (ar), 10) + + del ar + if sf.mustlock (): + self.assertFalse (sf.get_locked ()) + + def test_as_class (self): + # Check general new-style class freatures. + sf = pygame.Surface ((2, 3), 0, 32) + ar = pygame.PixelArray (sf) + self.assertRaises (AttributeError, getattr, ar, 'nonnative') + ar.nonnative = 'value' + self.assertEqual (ar.nonnative, 'value') + r = weakref.ref (ar) + self.assertTrue (r() is ar) + del ar + gc.collect () + self.assertTrue (r() is None) + + class C (pygame.PixelArray): + def __str__ (self): + return "string (%i, %i)" % self.shape + + ar = C (sf) + self.assertEqual (str (ar), "string (2, 3)") + r = weakref.ref (ar) + self.assertTrue (r() is ar) + del ar + gc.collect () + self.assertTrue (r() is None) + + def test_pixelarray__subclassed_surface(self): + """Ensure the PixelArray constructor accepts subclassed surfaces.""" + surface = SurfaceSubclass((3, 5), 0, 32) + pixelarray = pygame.PixelArray(surface) + + self.assertIsInstance(pixelarray, pygame.PixelArray) + + # Sequence interfaces + def test_get_column (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((6, 8), 0, bpp) + sf.fill ((0, 0, 255)) + val = sf.map_rgb ((0, 0, 255)) + ar = pygame.PixelArray (sf) + + ar2 = ar.__getitem__ (1) + self.assertEqual (len(ar2), 8) + self.assertEqual (ar2.__getitem__ (0), val) + self.assertEqual (ar2.__getitem__ (1), val) + self.assertEqual (ar2.__getitem__ (2), val) + + ar2 = ar.__getitem__ (-1) + self.assertEqual (len(ar2), 8) + self.assertEqual (ar2.__getitem__ (0), val) + self.assertEqual (ar2.__getitem__ (1), val) + self.assertEqual (ar2.__getitem__ (2), val) + + def test_get_pixel (self): + w = 10 + h = 20 + size = w, h + bg_color = (0, 0, 255) + fg_color_y = (0, 0, 128) + fg_color_x = (0, 0, 11) + for bpp in (8, 16, 24, 32): + sf = pygame.Surface (size, 0, bpp) + mapped_bg_color = sf.map_rgb (bg_color) + mapped_fg_color_y = sf.map_rgb (fg_color_y) + mapped_fg_color_x = sf.map_rgb (fg_color_x) + self.assertNotEqual (mapped_fg_color_y, mapped_bg_color, + "Unusable test colors for bpp %i" % (bpp,)) + self.assertNotEqual (mapped_fg_color_x, mapped_bg_color, + "Unusable test colors for bpp %i" % (bpp,)) + self.assertNotEqual (mapped_fg_color_y, mapped_fg_color_x, + "Unusable test colors for bpp %i" % (bpp,)) + sf.fill (bg_color) + + ar = pygame.PixelArray (sf) + + ar_y = ar.__getitem__ (1) + for y in xrange_ (h): + ar2 = ar_y.__getitem__ (y) + self.assertEqual (ar2, mapped_bg_color, + "ar[1][%i] == %i, mapped_bg_color == %i" % + (y, ar2, mapped_bg_color)) + + sf.set_at ((1, y), fg_color_y) + ar2 = ar_y.__getitem__ (y) + self.assertEqual (ar2, mapped_fg_color_y, + "ar[1][%i] == %i, mapped_fg_color_y == %i" % + (y, ar2, mapped_fg_color_y)) + + sf.set_at ((1, 1), bg_color) + for x in xrange_ (w): + ar2 = ar.__getitem__ (x).__getitem__ (1) + self.assertEqual (ar2, mapped_bg_color, + "ar[%i][1] = %i, mapped_bg_color = %i" % + (x, ar2, mapped_bg_color)) + sf.set_at ((x, 1), fg_color_x) + ar2 = ar.__getitem__ (x).__getitem__ (1) + self.assertEqual (ar2, mapped_fg_color_x, + "ar[%i][1] = %i, mapped_fg_color_x = %i" % + (x, ar2, mapped_fg_color_x)) + + ar2 = ar.__getitem__ (0).__getitem__ (0) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (1).__getitem__ (0) + self.assertEqual (ar2, mapped_fg_color_y, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (-4).__getitem__ (1) + self.assertEqual (ar2, mapped_fg_color_x, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (-4).__getitem__ (5) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (-4).__getitem__ (0) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (-w + 1).__getitem__ (0) + self.assertEqual (ar2, mapped_fg_color_y, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (-w).__getitem__ (0) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (5).__getitem__ (-4) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (5).__getitem__ (-h + 1) + self.assertEqual (ar2, mapped_fg_color_x, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (5).__getitem__ (-h) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (0).__getitem__ (-h + 1) + self.assertEqual (ar2, mapped_fg_color_x, "bpp = %i" % (bpp,)) + + ar2 = ar.__getitem__ (0).__getitem__ (-h) + self.assertEqual (ar2, mapped_bg_color, "bpp = %i" % (bpp,)) + + def test_set_pixel (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 20), 0, bpp) + sf.fill ((0, 0, 0)) + ar = pygame.PixelArray (sf) + + ar.__getitem__ (0).__setitem__ (0, (0, 255, 0)) + self.assertEqual (ar[0][0], sf.map_rgb ((0, 255, 0))) + + ar.__getitem__ (1).__setitem__ (1, (128, 128, 128)) + self.assertEqual (ar[1][1], sf.map_rgb ((128, 128, 128))) + + ar.__getitem__(-1).__setitem__ (-1, (128, 128, 128)) + self.assertEqual (ar[9][19], sf.map_rgb ((128, 128, 128))) + + ar.__getitem__ (-2).__setitem__ (-2, (128, 128, 128)) + self.assertEqual (ar[8][-2], sf.map_rgb ((128, 128, 128))) + + def test_set_column (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((6, 8), 0, bpp) + sf.fill ((0, 0, 0)) + ar = pygame.PixelArray (sf) + + sf2 = pygame.Surface ((6, 8), 0, bpp) + sf2.fill ((0, 255, 255)) + ar2 = pygame.PixelArray (sf2) + + # Test single value assignment + ar.__setitem__ (2, (128, 128, 128)) + self.assertEqual (ar[2][0], sf.map_rgb ((128, 128, 128))) + self.assertEqual (ar[2][1], sf.map_rgb ((128, 128, 128))) + + ar.__setitem__ (-1, (0, 255, 255)) + self.assertEqual (ar[5][0], sf.map_rgb ((0, 255, 255))) + self.assertEqual (ar[-1][1], sf.map_rgb ((0, 255, 255))) + + ar.__setitem__ (-2, (255, 255, 0)) + self.assertEqual (ar[4][0], sf.map_rgb ((255, 255, 0))) + self.assertEqual (ar[-2][1], sf.map_rgb ((255, 255, 0))) + + # Test list assignment. + ar.__setitem__ (0, [(255, 255, 255)] * 8) + self.assertEqual (ar[0][0], sf.map_rgb ((255, 255, 255))) + self.assertEqual (ar[0][1], sf.map_rgb ((255, 255, 255))) + + # Test tuple assignment. + # Changed in Pygame 1.9.2 - Raises an exception. + self.assertRaises (ValueError, ar.__setitem__, 1, + ((204, 0, 204), (17, 17, 17), (204, 0, 204), + (17, 17, 17), (204, 0, 204), (17, 17, 17), + (204, 0, 204), (17, 17, 17))) + + # Test pixel array assignment. + ar.__setitem__ (1, ar2.__getitem__ (3)) + self.assertEqual (ar[1][0], sf.map_rgb ((0, 255, 255))) + self.assertEqual (ar[1][1], sf.map_rgb ((0, 255, 255))) + + def test_get_slice (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 20), 0, bpp) + sf.fill ((0, 0, 0)) + ar = pygame.PixelArray (sf) + + self.assertEqual (len (ar[0:2]), 2) + self.assertEqual (len (ar[3:7][3]), 20) + + self.assertEqual (ar[0:0], None) + self.assertEqual (ar[5:5], None) + self.assertEqual (ar[9:9], None) + + # Has to resolve to ar[7:8] + self.assertEqual (len (ar[-3:-2]), 1) # 2D + self.assertEqual (len (ar[-3:-2][0]), 20) # 1D + + # Try assignments. + + # 2D assignment. + ar[2:5] = (255, 255, 255) + + # 1D assignment + ar[3][3:7] = (10, 10, 10) + self.assertEqual (ar[3][5], sf.map_rgb ((10, 10, 10))) + self.assertEqual (ar[3][6], sf.map_rgb ((10, 10, 10))) + + @unittest.skipIf(IS_PYPY, 'skipping for PyPy (segfaults on mac pypy3 6.0.0)') + def test_contains (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 20), 0, bpp) + sf.fill ((0, 0, 0)) + sf.set_at ((8, 8), (255, 255, 255)) + + ar = pygame.PixelArray (sf) + self.assertTrue ((0, 0, 0) in ar) + self.assertTrue ((255, 255, 255) in ar) + self.assertFalse ((255, 255, 0) in ar) + self.assertFalse (0x0000ff in ar) + + # Test sliced array + self.assertTrue ((0, 0, 0) in ar[8]) + self.assertTrue ((255, 255, 255) in ar[8]) + self.assertFalse ((255, 255, 0) in ar[8]) + self.assertFalse (0x0000ff in ar[8]) + + def test_get_surface (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface((10, 20), 0, bpp) + sf.fill((0, 0, 0)) + ar = pygame.PixelArray(sf) + self.assertTrue(ar.surface is sf) + + def test_get_surface__subclassed_surface(self): + """Ensure the surface attribute can handle subclassed surfaces.""" + expected_surface = SurfaceSubclass((5, 3), 0, 32) + pixelarray = pygame.PixelArray(expected_surface) + + surface = pixelarray.surface + + self.assertIs(surface, expected_surface) + self.assertIsInstance(surface, pygame.Surface) + self.assertIsInstance(surface, SurfaceSubclass) + + def test_set_slice (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((6, 8), 0, bpp) + sf.fill ((0, 0, 0)) + ar = pygame.PixelArray (sf) + + # Test single value assignment + val = sf.map_rgb ((128, 128, 128)) + ar[0:2] = val + self.assertEqual (ar[0][0], val) + self.assertEqual (ar[0][1], val) + self.assertEqual (ar[1][0], val) + self.assertEqual (ar[1][1], val) + + val = sf.map_rgb ((0, 255, 255)) + ar[-3:-1] = val + self.assertEqual (ar[3][0], val) + self.assertEqual (ar[-2][1], val) + + val = sf.map_rgb ((255, 255, 255)) + ar[-3:] = (255, 255, 255) + self.assertEqual (ar[4][0], val) + self.assertEqual (ar[-1][1], val) + + # Test array size mismatch. + # Changed in ver. 1.9.2 + # (was "Test list assignment, this is a vertical assignment.") + val = sf.map_rgb ((0, 255, 0)) + self.assertRaises (ValueError, ar.__setitem__, slice (2, 4), + [val] * 8) + + # And the horizontal assignment. + val = sf.map_rgb ((255, 0, 0)) + val2 = sf.map_rgb ((128, 0, 255)) + ar[0:2] = [val, val2] + self.assertEqual (ar[0][0], val) + self.assertEqual (ar[1][0], val2) + self.assertEqual (ar[0][1], val) + self.assertEqual (ar[1][1], val2) + self.assertEqual (ar[0][4], val) + self.assertEqual (ar[1][4], val2) + self.assertEqual (ar[0][5], val) + self.assertEqual (ar[1][5], val2) + + # Test pixelarray assignment. + ar[:] = (0, 0, 0) + sf2 = pygame.Surface ((6, 8), 0, bpp) + sf2.fill ((255, 0, 255)) + + val = sf.map_rgb ((255, 0, 255)) + ar2 = pygame.PixelArray (sf2) + + ar[:] = ar2[:] + self.assertEqual (ar[0][0], val) + self.assertEqual (ar[5][7], val) + + # Ensure p1 ... pn are freed for array[...] = [p1, ..., pn] + # Bug fix: reference counting. + if hasattr(sys, 'getrefcount'): + class Int(int): + """Unique int instances""" + pass + + sf = pygame.Surface ((5, 2), 0, 32) + ar = pygame.PixelArray (sf) + pixel_list = [Int(i) for i in range(ar.shape[0])] + refcnts_before = [sys.getrefcount (i) for i in pixel_list] + ar[...] = pixel_list + refcnts_after = [sys.getrefcount (i) for i in pixel_list] + gc.collect () + self.assertEqual (refcnts_after, refcnts_before) + + def test_subscript (self): + # By default we do not need to work with any special __***__ + # methods as map subscripts are the first looked up by the + # object system. + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((6, 8), 0, bpp) + sf.set_at ((1, 3), (0, 255, 0)) + sf.set_at ((0, 0), (0, 255, 0)) + sf.set_at ((4, 4), (0, 255, 0)) + val = sf.map_rgb ((0, 255, 0)) + + ar = pygame.PixelArray (sf) + + # Test single value requests. + self.assertEqual (ar[1,3], val) + self.assertEqual (ar[0,0], val) + self.assertEqual (ar[4,4], val) + self.assertEqual (ar[1][3], val) + self.assertEqual (ar[0][0], val) + self.assertEqual (ar[4][4], val) + + # Test ellipse working. + self.assertEqual (len (ar[...,...]), 6) + self.assertEqual (len (ar[1,...]), 8) + self.assertEqual (len (ar[...,3]), 6) + + # Test simple slicing + self.assertEqual (len (ar[:,:]), 6) + self.assertEqual (len (ar[:,]), 6) + self.assertEqual (len (ar[1,:]), 8) + self.assertEqual (len (ar[:,2]), 6) + # Empty slices + self.assertEqual (ar[4:4,], None) + self.assertEqual (ar[4:4,...], None) + self.assertEqual (ar[4:4,2:2], None) + self.assertEqual (ar[4:4,1:4], None) + self.assertEqual (ar[4:4:2,], None) + self.assertEqual (ar[4:4:-2,], None) + self.assertEqual (ar[4:4:1,...], None) + self.assertEqual (ar[4:4:-1,...], None) + self.assertEqual (ar[4:4:1,2:2], None) + self.assertEqual (ar[4:4:-1,1:4], None) + self.assertEqual (ar[...,4:4], None) + self.assertEqual (ar[1:4,4:4], None) + self.assertEqual (ar[...,4:4:1], None) + self.assertEqual (ar[...,4:4:-1], None) + self.assertEqual (ar[2:2,4:4:1], None) + self.assertEqual (ar[1:4,4:4:-1], None) + + # Test advanced slicing + ar[0] = 0 + ar[1] = 1 + ar[2] = 2 + ar[3] = 3 + ar[4] = 4 + ar[5] = 5 + + # We should receive something like [0,2,4] + self.assertEqual (ar[::2,1][0], 0) + self.assertEqual (ar[::2,1][1], 2) + self.assertEqual (ar[::2,1][2], 4) + # We should receive something like [2,2,2] + self.assertEqual (ar[2,::2][0], 2) + self.assertEqual (ar[2,::2][1], 2) + self.assertEqual (ar[2,::2][2], 2) + + # Should create a 3x3 array of [0,2,4] + ar2 = ar[::2,::2] + self.assertEqual (len (ar2), 3) + self.assertEqual (ar2[0][0], 0) + self.assertEqual (ar2[0][1], 0) + self.assertEqual (ar2[0][2], 0) + self.assertEqual (ar2[2][0], 4) + self.assertEqual (ar2[2][1], 4) + self.assertEqual (ar2[2][2], 4) + self.assertEqual (ar2[1][0], 2) + self.assertEqual (ar2[2][0], 4) + self.assertEqual (ar2[1][1], 2) + + # Should create a reversed 3x8 array over X of [1,2,3] -> [3,2,1] + ar2 = ar[3:0:-1] + self.assertEqual (len (ar2), 3) + self.assertEqual (ar2[0][0], 3) + self.assertEqual (ar2[0][1], 3) + self.assertEqual (ar2[0][2], 3) + self.assertEqual (ar2[0][7], 3) + self.assertEqual (ar2[2][0], 1) + self.assertEqual (ar2[2][1], 1) + self.assertEqual (ar2[2][2], 1) + self.assertEqual (ar2[2][7], 1) + self.assertEqual (ar2[1][0], 2) + self.assertEqual (ar2[1][1], 2) + # Should completely reverse the array over X -> [5,4,3,2,1,0] + ar2 = ar[::-1] + self.assertEqual (len (ar2), 6) + self.assertEqual (ar2[0][0], 5) + self.assertEqual (ar2[0][1], 5) + self.assertEqual (ar2[0][3], 5) + self.assertEqual (ar2[0][-1], 5) + self.assertEqual (ar2[1][0], 4) + self.assertEqual (ar2[1][1], 4) + self.assertEqual (ar2[1][3], 4) + self.assertEqual (ar2[1][-1], 4) + self.assertEqual (ar2[-1][-1], 0) + self.assertEqual (ar2[-2][-2], 1) + self.assertEqual (ar2[-3][-1], 2) + + # Test advanced slicing + ar[:] = 0 + ar2 = ar[:,1] + ar2[:] = [99] * len(ar2) + self.assertEqual (ar2[0], 99) + self.assertEqual (ar2[-1], 99) + self.assertEqual (ar2[-2], 99) + self.assertEqual (ar2[2], 99) + self.assertEqual (ar[0,1], 99) + self.assertEqual (ar[1,1], 99) + self.assertEqual (ar[2,1], 99) + self.assertEqual (ar[-1,1], 99) + self.assertEqual (ar[-2,1], 99) + + # Cases where a 2d array should have a dimension of length 1. + ar2 = ar[1:2,:] + self.assertEqual (ar2.shape, (1, ar.shape[1])) + ar2 = ar[:,1:2] + self.assertEqual (ar2.shape, (ar.shape[0], 1)) + sf2 = pygame.Surface ((1, 5), 0, 32) + ar2 = pygame.PixelArray (sf2) + self.assertEqual (ar2.shape, sf2.get_size ()) + sf2 = pygame.Surface ((7, 1), 0, 32) + ar2 = pygame.PixelArray (sf2) + self.assertEqual (ar2.shape, sf2.get_size ()) + + # Array has a single ellipsis subscript: the identity operator + ar2 = ar[...] + self.assertTrue(ar2 is ar) + + # Ensure x and y are freed for p = array[x, y] + # Bug fix: reference counting + if hasattr(sys, 'getrefcount'): + class Int(int): + """Unique int instances""" + pass + + sf = pygame.Surface ((2, 2), 0, 32) + ar = pygame.PixelArray (sf) + x, y = Int(0), Int(1) + rx_before, ry_before = sys.getrefcount (x), sys.getrefcount (y) + p = ar[x, y] + rx_after, ry_after = sys.getrefcount (x), sys.getrefcount (y) + self.assertEqual (rx_after, rx_before) + self.assertEqual (ry_after, ry_before) + + def test_ass_subscript (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((6, 8), 0, bpp) + sf.fill ((255, 255, 255)) + ar = pygame.PixelArray (sf) + + # Test ellipse working + ar[...,...] = (0, 0, 0) + self.assertEqual (ar[0,0], 0) + self.assertEqual (ar[1,0], 0) + self.assertEqual (ar[-1,-1], 0) + ar[...,] = (0, 0, 255) + self.assertEqual (ar[0,0], sf.map_rgb ((0, 0, 255))) + self.assertEqual (ar[1,0], sf.map_rgb ((0, 0, 255))) + self.assertEqual (ar[-1,-1], sf.map_rgb ((0, 0, 255))) + ar[:,...] = (255, 0, 0) + self.assertEqual (ar[0,0], sf.map_rgb ((255, 0, 0))) + self.assertEqual (ar[1,0], sf.map_rgb ((255, 0, 0))) + self.assertEqual (ar[-1,-1], sf.map_rgb ((255, 0, 0))) + ar[...] = (0, 255, 0) + self.assertEqual (ar[0,0], sf.map_rgb ((0, 255, 0))) + self.assertEqual (ar[1,0], sf.map_rgb ((0, 255, 0))) + self.assertEqual (ar[-1,-1], sf.map_rgb ((0, 255, 0))) + + # Ensure x and y are freed for array[x, y] = p + # Bug fix: reference counting + if hasattr(sys, 'getrefcount'): + class Int(int): + """Unique int instances""" + pass + + sf = pygame.Surface ((2, 2), 0, 32) + ar = pygame.PixelArray (sf) + x, y = Int(0), Int(1) + rx_before, ry_before = sys.getrefcount (x), sys.getrefcount (y) + ar[x, y] = 0 + rx_after, ry_after = sys.getrefcount (x), sys.getrefcount (y) + self.assertEqual (rx_after, rx_before) + self.assertEqual (ry_after, ry_before) + + def test_pixels_field(self): + for bpp in [1, 2, 3, 4]: + sf = pygame.Surface ((11, 7), 0, bpp * 8) + ar = pygame.PixelArray (sf) + ar2 = ar[1:,:] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + ar.itemsize) + ar2 = ar[:,1:] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + ar.strides[1]) + ar2 = ar[::-1,:] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + (ar.shape[0] - 1) * ar.itemsize) + ar2 = ar[::-2,:] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + (ar.shape[0] - 1) * ar.itemsize) + ar2 = ar[:,::-1] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + (ar.shape[1] - 1) * ar.strides[1]) + ar3 = ar2[::-1,:] + self.assertEqual (ar3._pixels_address - ar._pixels_address, + (ar.shape[0] - 1) * ar.strides[0] + + (ar.shape[1] - 1) * ar.strides[1]) + ar2 = ar[:,::-2] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + (ar.shape[1] - 1) * ar.strides[1]) + ar2 = ar[2::,3::] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + ar.strides[0] * 2 + ar.strides[1] * 3) + ar2 = ar[2::2,3::4] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + ar.strides[0] * 2 + ar.strides[1] * 3) + ar2 = ar[9:2:-1,:] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + ar.strides[0] * 9) + ar2 = ar[:,5:2:-1] + self.assertEqual (ar2._pixels_address - ar._pixels_address, + ar.strides[1] * 5) + ##? ar2 = ar[:,9:2:-1] + + def test_make_surface (self): + bg_color = pygame.Color (255, 255, 255) + fg_color = pygame.Color (128, 100, 0) + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 20), 0, bpp) + bg_color_adj = sf.unmap_rgb (sf.map_rgb (bg_color)) + fg_color_adj = sf.unmap_rgb (sf.map_rgb (fg_color)) + sf.fill (bg_color_adj) + sf.fill (fg_color_adj, (2, 5, 4, 11)) + ar = pygame.PixelArray (sf) + newsf = ar[::2,::2].make_surface () + rect = newsf.get_rect () + self.assertEqual (rect.width, 5) + self.assertEqual (rect.height, 10) + for p in [(0, 2), (0, 3), (1, 2), + (2, 2), (3, 2), (3, 3), + (0, 7), (0, 8), (1, 8), + (2, 8), (3, 8), (3, 7)]: + self.assertEqual (newsf.get_at (p), bg_color_adj) + for p in [(1, 3), (2, 3), (1, 5), (2, 5), (1, 7), (2, 7)]: + self.assertEqual (newsf.get_at (p), fg_color_adj) + + # Bug when array width is not a multiple of the slice step. + w = 17 + lst = list(range(w)) + w_slice = len(lst[::2]) + h = 3 + sf = pygame.Surface ((w, h), 0, 32) + ar = pygame.PixelArray (sf) + ar2 = ar[::2,:] + sf2 = ar2.make_surface () + w2, h2 = sf2.get_size () + self.assertEqual (w2, w_slice) + self.assertEqual (h2, h) + + # Bug when array height is not a multiple of the slice step. + # This can hang the Python interpreter. + h = 17 + lst = list(range(h)) + h_slice = len(lst[::2]) + w = 3 + sf = pygame.Surface ((w, h), 0, 32) + ar = pygame.PixelArray (sf) + ar2 = ar[:,::2] + sf2 = ar2.make_surface () # Hangs here. + w2, h2 = sf2.get_size () + self.assertEqual (w2, w) + self.assertEqual (h2, h_slice) + + def test_make_surface__subclassed_surface(self): + """Ensure make_surface can handle subclassed surfaces.""" + expected_size = (3, 5) + expected_flags = 0 + expected_depth = 32 + original_surface = SurfaceSubclass(expected_size, expected_flags, + expected_depth) + pixelarray = pygame.PixelArray(original_surface) + + surface = pixelarray.make_surface() + + self.assertIsNot(surface, original_surface) + self.assertIsInstance(surface, pygame.Surface) + self.assertNotIsInstance(surface, SurfaceSubclass) + self.assertEqual(surface.get_size(), expected_size) + self.assertEqual(surface.get_flags(), expected_flags) + self.assertEqual(surface.get_bitsize(), expected_depth) + + def test_iter (self): + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((5, 10), 0, bpp) + ar = pygame.PixelArray (sf) + iterations = 0 + for col in ar: + self.assertEqual (len (col), 10) + iterations += 1 + self.assertEqual (iterations, 5) + + def test_replace (self): + #print "replace start" + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 10), 0, bpp) + sf.fill ((255, 0, 0)) + rval = sf.map_rgb ((0, 0, 255)) + oval = sf.map_rgb ((255, 0, 0)) + ar = pygame.PixelArray (sf) + ar[::2].replace ((255, 0, 0), (0, 0, 255)) + self.assertEqual (ar[0][0], rval) + self.assertEqual (ar[1][0], oval) + self.assertEqual (ar[2][3], rval) + self.assertEqual (ar[3][6], oval) + self.assertEqual (ar[8][9], rval) + self.assertEqual (ar[9][9], oval) + + ar[::2].replace ((0, 0, 255), (255, 0, 0), weights=(10, 20, 50)) + self.assertEqual (ar[0][0], oval) + self.assertEqual (ar[2][3], oval) + self.assertEqual (ar[3][6], oval) + self.assertEqual (ar[8][9], oval) + self.assertEqual (ar[9][9], oval) + #print "replace end" + + def test_extract (self): + #print "extract start" + for bpp in (8, 16, 24, 32): + sf = pygame.Surface ((10, 10), 0, bpp) + sf.fill ((0, 0, 255)) + sf.fill ((255, 0, 0), (2, 2, 6, 6)) + + white = sf.map_rgb ((255, 255, 255)) + black = sf.map_rgb ((0, 0, 0)) + + ar = pygame.PixelArray (sf) + newar = ar.extract ((255, 0, 0)) + + self.assertEqual (newar[0][0], black) + self.assertEqual (newar[1][0], black) + self.assertEqual (newar[2][3], white) + self.assertEqual (newar[3][6], white) + self.assertEqual (newar[8][9], black) + self.assertEqual (newar[9][9], black) + + newar = ar.extract ((255, 0, 0), weights=(10, 0.1, 50)) + self.assertEqual (newar[0][0], black) + self.assertEqual (newar[1][0], black) + self.assertEqual (newar[2][3], white) + self.assertEqual (newar[3][6], white) + self.assertEqual (newar[8][9], black) + self.assertEqual (newar[9][9], black) + #print "extract end" + + def test_2dslice_assignment (self): + w = 2 * 5 * 8 + h = 3 * 5 * 9 + sf = pygame.Surface ((w, h), 0, 32) + ar = pygame.PixelArray (sf) + size = (w, h) + strides = (1, w) + offset = 0 + self._test_assignment (sf, ar, size, strides, offset) + xslice = slice (None, None, 2) + yslice = slice (None, None, 3) + ar, size, strides, offset = self._array_slice ( + ar, size, (xslice, yslice), strides, offset) + self._test_assignment (sf, ar, size, strides, offset) + xslice = slice (5, None, 5) + yslice = slice (5, None, 5) + ar, size, strides, offset = self._array_slice ( + ar, size, (xslice, yslice), strides, offset) + self._test_assignment (sf, ar, size, strides, offset) + + def _test_assignment (self, sf, ar, ar_size, ar_strides, ar_offset): + self.assertEqual (ar.shape, ar_size) + ar_w, ar_h = ar_size + ar_xstride, ar_ystride = ar_strides + sf_w, sf_h = sf.get_size () + black = pygame.Color ('black') + color = pygame.Color (0, 0, 12) + pxcolor = sf.map_rgb (color) + sf.fill (black) + for ar_x, ar_y in [(0, 0), + (0, ar_h - 4), + (ar_w - 3, 0), + (0, ar_h - 1), + (ar_w - 1, 0), + (ar_w - 1, ar_h - 1)]: + sf_offset = ar_offset + ar_x * ar_xstride + ar_y * ar_ystride + sf_y = sf_offset // sf_w + sf_x = sf_offset - sf_y * sf_w + sf_posn = (sf_x, sf_y) + sf_pix = sf.get_at (sf_posn) + self.assertEqual (sf_pix, black, + "at pixarr posn (%i, %i) (surf posn (%i, %i)): " + "%s != %s" % + (ar_x, ar_y, sf_x, sf_y, sf_pix, black)) + ar[ar_x, ar_y] = pxcolor + sf_pix = sf.get_at (sf_posn) + self.assertEqual (sf_pix, color, + "at pixarr posn (%i, %i) (surf posn (%i, %i)): " + "%s != %s" % + (ar_x, ar_y, sf_x, sf_y, sf_pix, color)) + + def _array_slice (self, ar, size, slices, strides, offset): + ar = ar[slices] + xslice, yslice = slices + w, h = size + xstart, xstop, xstep = xslice.indices(w) + ystart, ystop, ystep = yslice.indices(h) + w = (xstop - xstart + xstep - 1) // xstep + h = (ystop - ystart + ystep - 1) // ystep + xstride, ystride = strides + offset += xstart * xstride + ystart * ystride + xstride *= xstep + ystride *= ystep + return ar, (w, h), (xstride, ystride), offset + + def test_array_properties(self): + # itemsize, ndim, shape, and strides. + for bpp in [1, 2, 3, 4]: + sf = pygame.Surface ((2, 2), 0, bpp * 8) + ar = pygame.PixelArray (sf) + self.assertEqual (ar.itemsize, bpp) + + for shape in [(4, 16), (5, 13)]: + w, h = shape + sf = pygame.Surface (shape, 0, 32) + bpp = sf.get_bytesize () + pitch = sf.get_pitch () + ar = pygame.PixelArray (sf) + self.assertEqual (ar.ndim, 2) + self.assertEqual (ar.shape, shape) + self.assertEqual (ar.strides, (bpp, pitch)) + ar2 = ar[::2,:] + w2 = len(([0] * w)[::2]) + self.assertEqual (ar2.ndim, 2) + self.assertEqual (ar2.shape, (w2, h)) + self.assertEqual (ar2.strides, (2 * bpp, pitch)) + ar2 = ar[:,::2] + h2 = len(([0] * h)[::2]) + self.assertEqual (ar2.ndim, 2) + self.assertEqual (ar2.shape, (w, h2)) + self.assertEqual (ar2.strides, (bpp, 2 * pitch)) + ar2 = ar[1] + self.assertEqual (ar2.ndim, 1) + self.assertEqual (ar2.shape, (h,)) + self.assertEqual (ar2.strides, (pitch,)) + ar2 = ar[:,1] + self.assertEqual (ar2.ndim, 1) + self.assertEqual (ar2.shape, (w,)) + self.assertEqual (ar2.strides, (bpp,)) + + def test_self_assign(self): + # This differs from NumPy arrays. + w = 10 + max_x = w - 1 + h = 20 + max_y = h - 1 + for bpp in [1, 2, 3, 4]: + sf = pygame.Surface ((w, h), 0, bpp * 8) + ar = pygame.PixelArray (sf) + for i in range (w * h): + ar[i % w, i // w] = i + ar[:,:] = ar[::-1,:] + for i in range (w * h): + self.assertEqual (ar[max_x - i % w, i // w], i) + ar = pygame.PixelArray (sf) + for i in range (w * h): + ar[i % w, i // w] = i + ar[:,:] = ar[:,::-1] + for i in range (w * h): + self.assertEqual (ar[i % w, max_y - i // w ], i) + ar = pygame.PixelArray (sf) + for i in range(w * h): + ar[i % w, i // w] = i + ar[:,:] = ar[::-1,::-1] + for i in range (w * h): + self.assertEqual (ar[max_x - i % w, max_y - i // w], i) + + def test_color_value (self): + # Confirm that a PixelArray slice assignment distinguishes between + # pygame.Color and tuple objects as single (r, g, b[, a]) colors + # and other sequences as sequences of colors to be treated as + # slices. + sf = pygame.Surface ((5, 5), 0, 32) + ar = pygame.PixelArray (sf) + index = slice(None, None, 1) + ar.__setitem__ (index, (1, 2, 3)) + self.assertEqual (ar[0, 0], sf.map_rgb ((1, 2, 3))) + ar.__setitem__ (index, pygame.Color (10, 11, 12)) + self.assertEqual (ar[0, 0], sf.map_rgb ((10, 11, 12))) + self.assertRaises (ValueError, ar.__setitem__, index, (1, 2, 3, 4, 5)) + self.assertRaises (ValueError, ar.__setitem__, (index, index), + (1, 2, 3, 4, 5)) + self.assertRaises (ValueError, ar.__setitem__, index, [1, 2, 3]) + self.assertRaises (ValueError, ar.__setitem__, (index, index), + [1, 2, 3]) + sf = pygame.Surface ((3, 3), 0, 32) + ar = pygame.PixelArray (sf) + ar[:] = (20, 30, 40) + self.assertEqual (ar[0, 0], sf.map_rgb ((20, 30, 40))) + ar[:] = [20, 30, 40] + self.assertEqual (ar[0, 0], 20) + self.assertEqual (ar[1, 0], 30) + self.assertEqual (ar[2, 0], 40) + + def test_transpose (self): + # PixelArray.transpose(): swap axis on a 2D array, add a length + # 1 x axis to a 1D array. + sf = pygame.Surface ((3, 7), 0, 32) + ar = pygame.PixelArray (sf) + w, h = ar.shape + dx, dy = ar.strides + for i in range (w * h): + x = i % w + y = i // w + ar[x, y] = i + ar_t = ar.transpose() + self.assertEqual (ar_t.shape, (h, w)) + self.assertEqual (ar_t.strides, (dy, dx)) + for i in range (w * h): + x = i % w + y = i // w + self.assertEqual (ar_t[y, x], ar[x, y]) + ar1D = ar[0] + ar2D = ar1D.transpose() + self.assertEqual (ar2D.shape, (1, h)) + for y in range (h): + self.assertEqual (ar1D[y], ar2D[0, y]) + ar1D = ar[:,0] + ar2D = ar1D.transpose() + self.assertEqual (ar2D.shape, (1, w)) + for x in range (2): + self.assertEqual (ar1D[x], ar2D[0, x]) + + def test_length_1_dimension_broadcast (self): + w = 5 + sf = pygame.Surface ((w, w), 0, 32) + ar = pygame.PixelArray (sf) + # y-axis broadcast. + sf_x = pygame.Surface ((w, 1), 0, 32) + ar_x = pygame.PixelArray (sf_x) + for i in range (w): + ar_x[i, 0] = (w + 1) * 10 + ar[...] = ar_x + for y in range (w): + for x in range (w): + self.assertEqual (ar[x, y], ar_x[x, 0]) + # x-axis broadcast. + ar[...] = 0 + sf_y = pygame.Surface ((1, w), 0, 32) + ar_y = pygame.PixelArray (sf_y) + for i in range (w): + ar_y[0, i] = (w + 1) * 10 + ar[...] = ar_y + for x in range (w): + for y in range (w): + self.assertEqual (ar[x, y], ar_y[0, y]) + # (1, 1) array broadcast. + ar[...] = 0 + sf_1px = pygame.Surface ((1, 1), 0, 32) + ar_1px = pygame.PixelArray (sf_1px) + ar_1px[0, 0] = 42 # Well it had to show up somewhere. + ar[...] = ar_1px + for y in range (w): + for x in range (w): + self.assertEqual (ar[x, y], 42) + + def test_assign_size_mismatch (self): + sf = pygame.Surface ((7, 11), 0, 32) + ar = pygame.PixelArray (sf) + self.assertRaises (ValueError, ar.__setitem__, Ellipsis, ar[:, 0:2]) + self.assertRaises (ValueError, ar.__setitem__, Ellipsis, ar[0:2, :]) + + def test_repr (self): + # Python 3.x bug: the tp_repr slot function returned NULL instead + # of a Unicode string, triggering an exception. + sf = pygame.Surface ((3, 1), pygame.SRCALPHA, 16) + ar = pygame.PixelArray(sf) + ar[...] = 42 + pixel = sf.get_at_mapped ((0, 0)) + self.assertEqual(repr (ar), + type (ar).__name__ + "([\n [42, 42, 42]]\n)") + + +class PixelArrayArrayInterfaceTest(unittest.TestCase, TestMixin): + + @unittest.skipIf(IS_PYPY, 'skipping for PyPy (why?)') + def test_basic (self): + # Check unchanging fields. + sf = pygame.Surface ((2, 2), 0, 32) + ar = pygame.PixelArray (sf) + + ai = arrinter.ArrayInterface (ar) + self.assertEqual (ai.two, 2) + self.assertEqual (ai.typekind, 'u') + self.assertEqual (ai.nd, 2) + self.assertEqual (ai.data, ar._pixels_address) + + @unittest.skipIf(IS_PYPY, 'skipping for PyPy (why?)') + def test_shape(self): + + for shape in [[4, 16], [5, 13]]: + w, h = shape + sf = pygame.Surface (shape, 0, 32) + ar = pygame.PixelArray (sf) + ai = arrinter.ArrayInterface (ar) + ai_shape = [ai.shape[i] for i in range(ai.nd)] + self.assertEqual (ai_shape, shape) + ar2 = ar[::2,:] + ai2 = arrinter.ArrayInterface (ar2) + w2 = len(([0] * w)[::2]) + ai_shape = [ai2.shape[i] for i in range(ai2.nd)] + self.assertEqual (ai_shape, [w2, h]) + ar2 = ar[:,::2] + ai2 = arrinter.ArrayInterface (ar2) + h2 = len(([0] * h)[::2]) + ai_shape = [ai2.shape[i] for i in range(ai2.nd)] + self.assertEqual (ai_shape, [w, h2]) + + @unittest.skipIf(IS_PYPY, 'skipping for PyPy (why?)') + def test_itemsize (self): + for bytes_per_pixel in range(1, 5): + bits_per_pixel = 8 * bytes_per_pixel + sf = pygame.Surface ((2, 2), 0, bits_per_pixel) + ar = pygame.PixelArray (sf) + ai = arrinter.ArrayInterface (ar) + self.assertEqual (ai.itemsize, bytes_per_pixel) + + @unittest.skipIf(IS_PYPY, 'skipping for PyPy (why?)') + def test_flags (self): + aim = arrinter + common_flags = (aim.PAI_NOTSWAPPED | aim.PAI_WRITEABLE | + aim.PAI_ALIGNED) + s = pygame.Surface ((10, 2), 0, 32) + ar = pygame.PixelArray (s) + ai = aim.ArrayInterface (ar) + self.assertEqual (ai.flags, common_flags | aim.PAI_FORTRAN) + + ar2 = ar[::2,:] + ai = aim.ArrayInterface (ar2) + self.assertEqual (ai.flags, common_flags) + + s = pygame.Surface ((8, 2), 0, 24) + ar = pygame.PixelArray (s) + ai = aim.ArrayInterface (ar) + self.assertEqual (ai.flags, common_flags | aim.PAI_FORTRAN) + + s = pygame.Surface ((7, 2), 0, 24) + ar = pygame.PixelArray (s) + ai = aim.ArrayInterface (ar) + self.assertEqual (ai.flags, common_flags) + + def test_slicing (self): + # This will implicitly test data and strides fields. + # + # Need an 8 bit test surfaces because pixelcopy.make_surface + # returns an 8 bit surface for a 2d array. + + factors = [7, 3, 11] + + w = reduce (operator.mul, factors, 1) + h = 13 + sf = pygame.Surface ((w, h), 0, 8) + color = sf.map_rgb ((1, 17, 128)) + ar = pygame.PixelArray (sf) + for f in factors[:-1]: + w = w // f + sf.fill ((0, 0, 0)) + ar = ar[f:f + w,:] + ar[0][0] = color + ar[-1][-2] = color + ar[0][-3] = color + sf2 = ar.make_surface () + sf3 = pygame.pixelcopy.make_surface (ar) + self.assert_surfaces_equal (sf3, sf2) + + h = reduce (operator.mul, factors, 1) + w = 13 + sf = pygame.Surface ((w, h), 0, 8) + color = sf.map_rgb ((1, 17, 128)) + ar = pygame.PixelArray (sf) + for f in factors[:-1]: + h = h // f + sf.fill ((0, 0, 0)) + ar = ar[:,f:f + h] + ar[0][0] = color + ar[-1][-2] = color + ar[0][-3] = color + sf2 = ar.make_surface () + sf3 = pygame.pixelcopy.make_surface (ar) + self.assert_surfaces_equal (sf3, sf2) + + w = 20 + h = 10 + sf = pygame.Surface ((w, h), 0, 8) + color = sf.map_rgb ((1, 17, 128)) + ar = pygame.PixelArray (sf) + for slices in [(slice (w), slice (h)), + (slice (0, w, 2), slice (h)), + (slice (0, w, 3), slice (h)), + (slice (w), slice (0, h, 2)), + (slice (w), slice (0, h, 3)), + (slice (0, w, 2), slice (0, h, 2)), + (slice (0, w, 3), slice (0, h, 3)), + ]: + sf.fill ((0, 0, 0)) + ar2 = ar[slices] + ar2[0][0] = color + ar2[-1][-2] = color + ar2[0][-3] = color + sf2 = ar2.make_surface () + sf3 = pygame.pixelcopy.make_surface (ar2) + self.assert_surfaces_equal (sf3, sf2) + + +@unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') +class PixelArrayNewBufferTest(unittest.TestCase, TestMixin): + + if pygame.HAVE_NEWBUF: + from pygame.tests.test_utils import buftools + + bitsize_to_format = {8: 'B', 16: '=H', 24: '3x', 32: '=I'} + + def test_newbuf_2D (self): + buftools = self.buftools + Importer = buftools.Importer + + for bit_size in [8, 16, 24, 32]: + s = pygame.Surface ((10, 2), 0, bit_size) + ar = pygame.PixelArray (s) + format = self.bitsize_to_format[bit_size] + itemsize = ar.itemsize + shape = ar.shape + w, h = shape + strides = ar.strides + length = w * h * itemsize + imp = Importer (ar, buftools.PyBUF_FULL) + self.assertTrue (imp.obj, ar) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 2) + self.assertEqual (imp.itemsize, itemsize) + self.assertEqual (imp.format, format) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertTrue (imp.suboffsets is None) + self.assertEqual (imp.buf, s._pixels_address) + + s = pygame.Surface ((8, 16), 0, 32) + ar = pygame.PixelArray (s) + format = self.bitsize_to_format[s.get_bitsize ()] + itemsize = ar.itemsize + shape = ar.shape + w, h = shape + strides = ar.strides + length = w * h * itemsize + imp = Importer (ar, buftools.PyBUF_SIMPLE) + self.assertTrue (imp.obj, ar) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 0) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertTrue (imp.shape is None) + self.assertTrue (imp.strides is None) + self.assertTrue (imp.suboffsets is None) + self.assertEqual (imp.buf, s._pixels_address) + imp = Importer (ar, buftools.PyBUF_FORMAT) + self.assertEqual (imp.ndim, 0) + self.assertEqual (imp.format, format) + imp = Importer (ar, buftools.PyBUF_WRITABLE) + self.assertEqual (imp.ndim, 0) + self.assertTrue (imp.format is None) + imp = Importer (ar, buftools.PyBUF_F_CONTIGUOUS) + self.assertEqual (imp.ndim, 2) + self.assertTrue (imp.format is None) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + imp = Importer (ar, buftools.PyBUF_ANY_CONTIGUOUS) + self.assertEqual (imp.ndim, 2) + self.assertTrue (imp.format is None) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar, buftools.PyBUF_ND) + + ar_sliced = ar[:,::2] + format = self.bitsize_to_format[s.get_bitsize ()] + itemsize = ar_sliced.itemsize + shape = ar_sliced.shape + w, h = shape + strides = ar_sliced.strides + length = w * h * itemsize + imp = Importer (ar_sliced, buftools.PyBUF_STRIDED) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 2) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertEqual (imp.buf, s._pixels_address) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_SIMPLE) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_ND) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_ANY_CONTIGUOUS) + + ar_sliced = ar[::2,:] + format = self.bitsize_to_format[s.get_bitsize ()] + itemsize = ar_sliced.itemsize + shape = ar_sliced.shape + w, h = shape + strides = ar_sliced.strides + length = w * h * itemsize + imp = Importer (ar_sliced, buftools.PyBUF_STRIDED) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 2) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertEqual (imp.buf, s._pixels_address) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_SIMPLE) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_ND) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar_sliced, + buftools.PyBUF_ANY_CONTIGUOUS) + + s2 = s.subsurface ((2, 3, 5, 7)) + ar = pygame.PixelArray (s2) + format = self.bitsize_to_format[s.get_bitsize ()] + itemsize = ar.itemsize + shape = ar.shape + w, h = shape + strides = ar.strides + length = w * h * itemsize + imp = Importer (ar, buftools.PyBUF_STRIDES) + self.assertTrue (imp.obj, ar) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 2) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertTrue (imp.suboffsets is None) + self.assertEqual (imp.buf, s2._pixels_address) + self.assertRaises (BufferError, Importer, ar, buftools.PyBUF_SIMPLE) + self.assertRaises (BufferError, Importer, ar, buftools.PyBUF_FORMAT) + self.assertRaises (BufferError, Importer, ar, buftools.PyBUF_WRITABLE) + self.assertRaises (BufferError, Importer, ar, buftools.PyBUF_ND) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_ANY_CONTIGUOUS) + + def test_newbuf_1D(self): + buftools = self.buftools + Importer = buftools.Importer + + s = pygame.Surface ((2, 16), 0, 32) + ar_2D = pygame.PixelArray (s) + x = 0 + ar = ar_2D[x] + format = self.bitsize_to_format[s.get_bitsize ()] + itemsize = ar.itemsize + shape = ar.shape + h = shape[0] + strides = ar.strides + length = h * itemsize + buf = s._pixels_address + x * itemsize + imp = Importer (ar, buftools.PyBUF_STRIDES) + self.assertTrue (imp.obj, ar) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 1) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertTrue (imp.suboffsets is None) + self.assertEqual (imp.buf, buf) + imp = Importer (ar, buftools.PyBUF_FULL) + self.assertEqual (imp.ndim, 1) + self.assertEqual (imp.format, format) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_SIMPLE) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_FORMAT) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_WRITABLE) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_ND) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises (BufferError, Importer, ar, + buftools.PyBUF_ANY_CONTIGUOUS) + y = 10 + ar = ar_2D[:,y] + shape = ar.shape + w = shape[0] + strides = ar.strides + length = w * itemsize + buf = s._pixels_address + y * s.get_pitch() + imp = Importer (ar, buftools.PyBUF_FULL) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 1) + self.assertEqual (imp.itemsize, itemsize) + self.assertEqual (imp.format, format) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertEqual (imp.strides, strides) + self.assertEqual (imp.buf, buf) + self.assertTrue (imp.suboffsets is None) + imp = Importer (ar, buftools.PyBUF_SIMPLE) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 0) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertTrue (imp.shape is None) + self.assertTrue (imp.strides is None) + imp = Importer (ar, buftools.PyBUF_ND) + self.assertEqual (imp.len, length) + self.assertEqual (imp.ndim, 1) + self.assertEqual (imp.itemsize, itemsize) + self.assertTrue (imp.format is None) + self.assertFalse (imp.readonly) + self.assertEqual (imp.shape, shape) + self.assertTrue (imp.strides is None) + imp = Importer (ar, buftools.PyBUF_C_CONTIGUOUS) + self.assertEqual (imp.ndim, 1) + imp = Importer (ar, buftools.PyBUF_F_CONTIGUOUS) + self.assertEqual (imp.ndim, 1) + imp = Importer (ar, buftools.PyBUF_ANY_CONTIGUOUS) + self.assertEqual (imp.ndim, 1) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/pixelcopy_test.py b/venv/Lib/site-packages/pygame/tests/pixelcopy_test.py new file mode 100644 index 0000000..8cf89eb --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/pixelcopy_test.py @@ -0,0 +1,653 @@ +import ctypes +import platform +import unittest + +try: + from pygame.tests.test_utils import arrinter +except NameError: + pass +import pygame +from pygame.locals import * +from pygame.pixelcopy import ( + surface_to_array, map_array, array_to_surface, + make_surface +) + +IS_PYPY = 'PyPy' == platform.python_implementation() + + +def unsigned32(i): + """cast signed 32 bit integer to an unsigned integer""" + return i & 0xFFFFFFFF + +class PixelcopyModuleTest (unittest.TestCase): + + bitsizes = [8, 16, 32] + + test_palette = [(0, 0, 0, 255), + (10, 30, 60, 255), + (25, 75, 100, 255), + (100, 150, 200, 255), + (0, 100, 200, 255)] + + surf_size = (10, 12) + test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2), + ((5, 5), 2), ((0, 11), 3), ((4, 6), 3), + ((9, 11), 4), ((5, 6), 4)] + + def __init__(self, *args, **kwds): + pygame.display.init() + try: + unittest.TestCase.__init__(self, *args, **kwds) + self.sources = [self._make_src_surface(8), + self._make_src_surface(16), + self._make_src_surface(16, srcalpha=True), + self._make_src_surface(24), + self._make_src_surface(32), + self._make_src_surface(32, srcalpha=True)] + finally: + pygame.display.quit() + + def _make_surface(self, bitsize, srcalpha=False, palette=None): + if palette is None: + palette = self.test_palette + flags = 0 + if srcalpha: + flags |= SRCALPHA + surf = pygame.Surface(self.surf_size, flags, bitsize) + if bitsize == 8: + surf.set_palette([c[:3] for c in palette]) + return surf + + def _fill_surface(self, surf, palette=None): + if palette is None: + palette = self.test_palette + surf.fill(palette[1], (0, 0, 5, 6)) + surf.fill(palette[2], (5, 0, 5, 6)) + surf.fill(palette[3], (0, 6, 5, 6)) + surf.fill(palette[4], (5, 6, 5, 6)) + + def _make_src_surface(self, bitsize, srcalpha=False, palette=None): + surf = self._make_surface(bitsize, srcalpha, palette) + self._fill_surface(surf, palette) + return surf + + def setUp(self): + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + def test_surface_to_array_2d(self): + alpha_color = (0, 0, 0, 128) + + for surf in self.sources: + src_bitsize = surf.get_bitsize() + for dst_bitsize in self.bitsizes: + # dst in a surface standing in for a 2 dimensional array + # of unsigned integers. The byte order is system dependent. + dst = pygame.Surface(surf.get_size(), 0, dst_bitsize) + dst.fill((0, 0, 0, 0)) + view = dst.get_view('2') + self.assertFalse(surf.get_locked()) + if dst_bitsize < src_bitsize: + self.assertRaises(ValueError, surface_to_array, view, surf) + self.assertFalse(surf.get_locked()) + continue + surface_to_array(view, surf) + self.assertFalse(surf.get_locked()) + for posn, i in self.test_points: + sp = surf.get_at_mapped(posn) + dp = dst.get_at_mapped(posn) + self.assertEqual(dp, sp, + "%s != %s: flags: %i" + ", bpp: %i, posn: %s" % + (dp, sp, + surf.get_flags(), surf.get_bitsize(), + posn)) + del view + + if surf.get_masks()[3]: + dst.fill((0, 0, 0, 0)) + view = dst.get_view('2') + posn = (2, 1) + surf.set_at(posn, alpha_color) + self.assertFalse(surf.get_locked()) + surface_to_array(view, surf) + self.assertFalse(surf.get_locked()) + sp = surf.get_at_mapped(posn) + dp = dst.get_at_mapped(posn) + self.assertEqual(dp, sp, + "%s != %s: bpp: %i" % + (dp, sp, surf.get_bitsize())) + + if IS_PYPY: + return + # Swapped endian destination array + pai_flags = arrinter.PAI_ALIGNED | arrinter.PAI_WRITEABLE + for surf in self.sources: + for itemsize in [1, 2, 4, 8]: + if itemsize < surf.get_bytesize(): + continue + a = arrinter.Array(surf.get_size(), 'u', itemsize, + flags=pai_flags) + surface_to_array(a, surf) + for posn, i in self.test_points: + sp = unsigned32(surf.get_at_mapped(posn)) + dp = a[posn] + self.assertEqual(dp, sp, + "%s != %s: itemsize: %i, flags: %i" + ", bpp: %i, posn: %s" % + (dp, sp, itemsize, + surf.get_flags(), surf.get_bitsize(), + posn)) + + def test_surface_to_array_3d(self): + self.iter_surface_to_array_3d((0xff, 0xff00, 0xff0000, 0)) + self.iter_surface_to_array_3d((0xff0000, 0xff00, 0xff, 0)) + + def iter_surface_to_array_3d(self, rgba_masks): + dst = pygame.Surface(self.surf_size, 0, 24, masks=rgba_masks) + + for surf in self.sources: + dst.fill((0, 0, 0, 0)) + src_bitsize = surf.get_bitsize() + view = dst.get_view('3') + self.assertFalse(surf.get_locked()) + surface_to_array(view, surf) + self.assertFalse(surf.get_locked()) + for posn, i in self.test_points: + sc = surf.get_at(posn)[0:3] + dc = dst.get_at(posn)[0:3] + self.assertEqual(dc, sc, + "%s != %s: flags: %i" + ", bpp: %i, posn: %s" % + (dc, sc, + surf.get_flags(), surf.get_bitsize(), + posn)) + view = None + + def test_map_array(self): + targets = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True), + ] + source = pygame.Surface(self.surf_size, 0, 24, + masks=[0xff, 0xff00, 0xff0000, 0]) + self._fill_surface(source) + source_view = source.get_view('3') # (w, h, 3) + for t in targets: + map_array(t.get_view('2'), source_view, t) + for posn, i in self.test_points: + sc = t.map_rgb(source.get_at(posn)) + dc = t.get_at_mapped(posn) + self.assertEqual(dc, sc, + "%s != %s: flags: %i" + ", bpp: %i, posn: %s" % + (dc, sc, + t.get_flags(), t.get_bitsize(), + posn)) + + color = pygame.Color("salmon") + color.set_length(3) + for t in targets: + map_array(t.get_view('2'), color, t) + sc = t.map_rgb(color) + for posn, i in self.test_points: + dc = t.get_at_mapped(posn) + self.assertEqual(dc, sc, + "%s != %s: flags: %i" + ", bpp: %i, posn: %s" % + (dc, sc, + t.get_flags(), t.get_bitsize(), + posn)) + + # mismatched shapes + w, h = source.get_size() + target = pygame.Surface((w, h + 1), 0, 32) + self.assertRaises(ValueError, map_array, target, source, target) + target = pygame.Surface((w - 1, h), 0, 32) + self.assertRaises(ValueError, map_array, target, source, target) + + def test_array_to_surface_broadcasting(self): + # target surfaces + targets = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True), + ] + + w, h = self.surf_size + + # broadcast column + column = pygame.Surface((1, h), 0, 32) + for target in targets: + source = pygame.Surface((1, h), 0, target) + for y in range(h): + source.set_at((0, y), + pygame.Color(y + 1, y + h + 1, y + 2 * h + 1)) + pygame.pixelcopy.surface_to_array(column.get_view('2'), source) + pygame.pixelcopy.array_to_surface(target, column.get_view('2')) + for x in range(w): + for y in range(h): + self.assertEqual(target.get_at_mapped((x, y)), + column.get_at_mapped((0, y))) + + # broadcast row + row = pygame.Surface((w, 1), 0, 32) + for target in targets: + source = pygame.Surface((w, 1), 0, target) + for x in range(w): + source.set_at((x, 0), + pygame.Color(x + 1, x + w + 1, x + 2 * w + 1)) + pygame.pixelcopy.surface_to_array(row.get_view('2'), source) + pygame.pixelcopy.array_to_surface(target, row.get_view('2')) + for x in range(w): + for y in range(h): + self.assertEqual(target.get_at_mapped((x, y)), + row.get_at_mapped((x, 0))) + + # broadcast pixel + pixel = pygame.Surface((1, 1), 0, 32) + for target in targets: + source = pygame.Surface((1, 1), 0, target) + source.set_at((0, 0), pygame.Color(13, 47, 101)) + pygame.pixelcopy.surface_to_array(pixel.get_view('2'), source) + pygame.pixelcopy.array_to_surface(target, pixel.get_view('2')) + p = pixel.get_at_mapped((0, 0)) + for x in range(w): + for y in range(h): + self.assertEqual(target.get_at_mapped((x, y)), p) + + +class PixelCopyTestWithArray(unittest.TestCase): + try: + import numpy + except ImportError: + __tags__ = ['ignore', 'subprocess_ignore'] + else: + pygame.surfarray.use_arraytype('numpy') + + bitsizes = [8, 16, 32] + + test_palette = [(0, 0, 0, 255), + (10, 30, 60, 255), + (25, 75, 100, 255), + (100, 150, 200, 255), + (0, 100, 200, 255)] + + surf_size = (10, 12) + test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2), + ((5, 5), 2), ((0, 11), 3), ((4, 6), 3), + ((9, 11), 4), ((5, 6), 4)] + + pixels2d = set([8, 16, 32]) + pixels3d = set([24, 32]) + array2d = set([8, 16, 24, 32]) + array3d = set([24, 32]) + + def __init__(self, *args, **kwds): + import numpy + + self.dst_types = [numpy.uint8, numpy.uint16, numpy.uint32] + try: + self.dst_types.append(numpy.uint64) + except AttributeError: + pass + pygame.display.init() + try: + unittest.TestCase.__init__(self, *args, **kwds) + self.sources = [self._make_src_surface(8), + self._make_src_surface(16), + self._make_src_surface(16, srcalpha=True), + self._make_src_surface(24), + self._make_src_surface(32), + self._make_src_surface(32, srcalpha=True)] + finally: + pygame.display.quit() + + def _make_surface(self, bitsize, srcalpha=False, palette=None): + if palette is None: + palette = self.test_palette + flags = 0 + if srcalpha: + flags |= SRCALPHA + surf = pygame.Surface(self.surf_size, flags, bitsize) + if bitsize == 8: + surf.set_palette([c[:3] for c in palette]) + return surf + + def _fill_surface(self, surf, palette=None): + if palette is None: + palette = self.test_palette + surf.fill(palette[1], (0, 0, 5, 6)) + surf.fill(palette[2], (5, 0, 5, 6)) + surf.fill(palette[3], (0, 6, 5, 6)) + surf.fill(palette[4], (5, 6, 5, 6)) + + def _make_src_surface(self, bitsize, srcalpha=False, palette=None): + surf = self._make_surface(bitsize, srcalpha, palette) + self._fill_surface(surf, palette) + return surf + + def setUp(self): + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + def test_surface_to_array_2d(self): + try: + from numpy import empty, dtype + except ImportError: + return + + palette = self.test_palette + alpha_color = (0, 0, 0, 128) + + dst_dims = self.surf_size + destinations = [empty(dst_dims, t) for t in self.dst_types] + if (pygame.get_sdl_byteorder() == pygame.LIL_ENDIAN): + swapped_dst = empty(dst_dims, dtype('>u4')) + else: + swapped_dst = empty(dst_dims, dtype('u4')) + else: + swapped_dst = empty(dst_dims, dtype('i', + '!i', '1i', '=1i', '@q', 'q', '4x', '8x']: + surface.fill((255, 254, 253)) + exp = Exporter(shape, format=format) + exp._buf[:] = [42] * exp.buflen + array_to_surface(surface, exp) + for x in range(w): + for y in range(h): + self.assertEqual(surface.get_at((x, y)), (42, 42, 42, 255)) + # Some unsupported formats for array_to_surface and a 32 bit surface + for format in ['f', 'd', '?', 'x', + '1x', '2x', '3x', '5x', '6x', '7x', '9x']: + exp = Exporter(shape, format=format) + self.assertRaises(ValueError, array_to_surface, surface, exp) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/rect_test.py b/venv/Lib/site-packages/pygame/tests/rect_test.py new file mode 100644 index 0000000..d034667 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/rect_test.py @@ -0,0 +1,784 @@ +import unittest +from pygame import Rect + +class RectTypeTest(unittest.TestCase): + def testConstructionXYWidthHeight(self): + r = Rect(1, 2, 3, 4) + self.assertEqual(1, r.left) + self.assertEqual(2, r.top) + self.assertEqual(3, r.width) + self.assertEqual(4, r.height) + + def testConstructionTopLeftSize(self): + r = Rect((1, 2), (3, 4)) + self.assertEqual(1, r.left) + self.assertEqual(2, r.top) + self.assertEqual(3, r.width) + self.assertEqual(4, r.height) + + def testCalculatedAttributes(self): + r = Rect(1, 2, 3, 4) + + self.assertEqual(r.left + r.width, r.right) + self.assertEqual(r.top + r.height, r.bottom) + self.assertEqual((r.width, r.height), r.size) + self.assertEqual((r.left, r.top), r.topleft) + self.assertEqual((r.right, r.top), r.topright) + self.assertEqual((r.left, r.bottom), r.bottomleft) + self.assertEqual((r.right, r.bottom), r.bottomright) + + midx = r.left + r.width // 2 + midy = r.top + r.height // 2 + + self.assertEqual(midx, r.centerx) + self.assertEqual(midy, r.centery) + self.assertEqual((r.centerx, r.centery), r.center) + self.assertEqual((r.centerx, r.top), r.midtop) + self.assertEqual((r.centerx, r.bottom), r.midbottom) + self.assertEqual((r.left, r.centery), r.midleft) + self.assertEqual((r.right, r.centery), r.midright) + + def test_normalize(self): + r = Rect(1, 2, -3, -6) + r2 = Rect(r) + r2.normalize() + self.assertTrue(r2.width >= 0) + self.assertTrue(r2.height >= 0) + self.assertEqual((abs(r.width), abs(r.height)), r2.size) + self.assertEqual((-2, -4), r2.topleft) + + def test_left(self): + """Changing the left attribute moves the rect and does not change + the rect's width + """ + r = Rect(1, 2, 3, 4) + new_left = 10 + + r.left = new_left + self.assertEqual(new_left, r.left) + self.assertEqual(Rect(new_left, 2, 3, 4), r) + + def test_right(self): + """Changing the right attribute moves the rect and does not change + the rect's width + """ + r = Rect(1, 2, 3, 4) + new_right = r.right + 20 + expected_left = r.left + 20 + old_width = r.width + + r.right = new_right + self.assertEqual(new_right, r.right) + self.assertEqual(expected_left, r.left) + self.assertEqual(old_width, r.width) + + def test_top(self): + """Changing the top attribute moves the rect and does not change + the rect's width + """ + r = Rect(1, 2, 3, 4) + new_top = 10 + + r.top = new_top + self.assertEqual(Rect(1, new_top, 3, 4), r) + self.assertEqual(new_top, r.top) + + def test_bottom(self): + """Changing the bottom attribute moves the rect and does not change + the rect's height + """ + r = Rect(1, 2, 3, 4) + new_bottom = r.bottom + 20 + expected_top = r.top + 20 + old_height = r.height + + r.bottom = new_bottom + self.assertEqual(new_bottom, r.bottom) + self.assertEqual(expected_top, r.top) + self.assertEqual(old_height, r.height) + + def test_centerx(self): + """Changing the centerx attribute moves the rect and does not change + the rect's width + """ + r = Rect(1, 2, 3, 4) + new_centerx = r.centerx + 20 + expected_left = r.left + 20 + old_width = r.width + + r.centerx = new_centerx + self.assertEqual(new_centerx, r.centerx) + self.assertEqual(expected_left, r.left) + self.assertEqual(old_width, r.width) + + def test_centery(self): + """Changing the centerx attribute moves the rect and does not change + the rect's width + """ + r = Rect(1, 2, 3, 4) + new_centery = r.centery + 20 + expected_top = r.top + 20 + old_height = r.height + + r.centery = new_centery + self.assertEqual(new_centery, r.centery) + self.assertEqual(expected_top, r.top) + self.assertEqual(old_height, r.height) + + def test_topleft(self): + """Changing the topleft attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.topleft = new_topleft + self.assertEqual(new_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_bottomleft(self): + """Changing the bottomleft attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_bottomleft = (r.left + 20, r.bottom + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.bottomleft = new_bottomleft + self.assertEqual(new_bottomleft, r.bottomleft) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_topright(self): + """Changing the bottomleft attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_topright = (r.right + 20, r.top + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.topright = new_topright + self.assertEqual(new_topright, r.topright) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_bottomright(self): + """Changing the bottomright attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_bottomright = (r.right + 20, r.bottom + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.bottomright = new_bottomright + self.assertEqual(new_bottomright, r.bottomright) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_center(self): + """Changing the center attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_center = (r.centerx + 20, r.centery + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.center = new_center + self.assertEqual(new_center, r.center) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_midleft(self): + """Changing the midleft attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_midleft = (r.left + 20, r.centery + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.midleft = new_midleft + self.assertEqual(new_midleft, r.midleft) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_midright(self): + """Changing the midright attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_midright= (r.right + 20, r.centery + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.midright = new_midright + self.assertEqual(new_midright, r.midright) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_midtop(self): + """Changing the midtop attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_midtop= (r.centerx + 20, r.top + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.midtop = new_midtop + self.assertEqual(new_midtop, r.midtop) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_midbottom(self): + """Changing the midbottom attribute moves the rect and does not change + the rect's size + """ + r = Rect(1, 2, 3, 4) + new_midbottom = (r.centerx + 20, r.bottom + 30) + expected_topleft = (r.left + 20, r.top + 30) + old_size = r.size + + r.midbottom = new_midbottom + self.assertEqual(new_midbottom, r.midbottom) + self.assertEqual(expected_topleft, r.topleft) + self.assertEqual(old_size, r.size) + + def test_width(self): + """Changing the width resizes the rect from the top-left corner + """ + r = Rect(1, 2, 3, 4) + new_width = 10 + old_topleft = r.topleft + old_height = r.height + + r.width = new_width + self.assertEqual(new_width, r.width) + self.assertEqual(old_height, r.height) + self.assertEqual(old_topleft, r.topleft) + + def test_height(self): + """Changing the height resizes the rect from the top-left corner + """ + r = Rect(1, 2, 3, 4) + new_height = 10 + old_topleft = r.topleft + old_width = r.width + + r.height = new_height + self.assertEqual(new_height, r.height) + self.assertEqual(old_width, r.width) + self.assertEqual(old_topleft, r.topleft) + + def test_size(self): + """Changing the size resizes the rect from the top-left corner + """ + r = Rect(1, 2, 3, 4) + new_size = (10, 20) + old_topleft = r.topleft + + r.size = new_size + self.assertEqual(new_size, r.size) + self.assertEqual(old_topleft, r.topleft) + + def test_contains(self): + r = Rect(1, 2, 3, 4) + + self.assertTrue(r.contains(Rect(2, 3, 1, 1)), + "r does not contain Rect(2, 3, 1, 1)") + self.assertTrue(r.contains(Rect(r)), + "r does not contain the same rect as itself") + self.assertTrue(r.contains(Rect(2, 3, 0, 0)), + "r does not contain an empty rect within its bounds") + self.assertFalse(r.contains(Rect(0, 0, 1, 2)), + "r contains Rect(0, 0, 1, 2)") + self.assertFalse(r.contains(Rect(4, 6, 1, 1)), + "r contains Rect(4, 6, 1, 1)") + self.assertFalse(r.contains(Rect(4, 6, 0, 0)), + "r contains Rect(4, 6, 0, 0)") + + def test_collidepoint(self): + r = Rect(1, 2, 3, 4) + + self.assertTrue(r.collidepoint(r.left, r.top), + "r does not collide with point (left, top)") + self.assertFalse(r.collidepoint(r.left - 1, r.top), + "r collides with point (left - 1, top)") + self.assertFalse(r.collidepoint(r.left, r.top - 1), + "r collides with point (left, top - 1)") + self.assertFalse(r.collidepoint(r.left - 1, r.top - 1), + "r collides with point (left - 1, top - 1)") + + self.assertTrue(r.collidepoint(r.right - 1, r.bottom - 1), + "r does not collide with point (right - 1, bottom - 1)") + self.assertFalse(r.collidepoint(r.right, r.bottom), + "r collides with point (right, bottom)") + self.assertFalse(r.collidepoint(r.right - 1, r.bottom), + "r collides with point (right - 1, bottom)") + self.assertFalse(r.collidepoint(r.right, r.bottom - 1), + "r collides with point (right, bottom - 1)") + + def test_inflate__larger(self): + """The inflate method inflates around the center of the rectangle + """ + r = Rect(2, 4, 6, 8) + r2 = r.inflate(4, 6) + + self.assertEqual(r.center, r2.center) + self.assertEqual(r.left - 2, r2.left) + self.assertEqual(r.top - 3, r2.top) + self.assertEqual(r.right + 2, r2.right) + self.assertEqual(r.bottom + 3, r2.bottom) + self.assertEqual(r.width + 4, r2.width) + self.assertEqual(r.height + 6, r2.height) + + def test_inflate__smaller(self): + """The inflate method inflates around the center of the rectangle + """ + r = Rect(2, 4, 6, 8) + r2 = r.inflate(-4, -6) + + self.assertEqual(r.center, r2.center) + self.assertEqual(r.left + 2, r2.left) + self.assertEqual(r.top + 3, r2.top) + self.assertEqual(r.right - 2, r2.right) + self.assertEqual(r.bottom - 3, r2.bottom) + self.assertEqual(r.width - 4, r2.width) + self.assertEqual(r.height - 6, r2.height) + + def test_inflate_ip__larger(self): + """The inflate_ip method inflates around the center of the rectangle + """ + r = Rect(2, 4, 6, 8) + r2 = Rect(r) + r2.inflate_ip(-4, -6) + + self.assertEqual(r.center, r2.center) + self.assertEqual(r.left + 2, r2.left) + self.assertEqual(r.top + 3, r2.top) + self.assertEqual(r.right - 2, r2.right) + self.assertEqual(r.bottom - 3, r2.bottom) + self.assertEqual(r.width - 4, r2.width) + self.assertEqual(r.height - 6, r2.height) + + def test_inflate_ip__smaller(self): + """The inflate method inflates around the center of the rectangle + """ + r = Rect(2, 4, 6, 8) + r2 = Rect(r) + r2.inflate_ip(-4, -6) + + self.assertEqual(r.center, r2.center) + self.assertEqual(r.left + 2, r2.left) + self.assertEqual(r.top + 3, r2.top) + self.assertEqual(r.right - 2, r2.right) + self.assertEqual(r.bottom - 3, r2.bottom) + self.assertEqual(r.width - 4, r2.width) + self.assertEqual(r.height - 6, r2.height) + + def test_clamp(self): + r = Rect(10, 10, 10, 10) + c = Rect(19, 12, 5, 5).clamp(r) + self.assertEqual(c.right, r.right) + self.assertEqual(c.top, 12) + c = Rect(1, 2, 3, 4).clamp(r) + self.assertEqual(c.topleft, r.topleft) + c = Rect(5, 500, 22, 33).clamp(r) + self.assertEqual(c.center, r.center) + + def test_clamp_ip(self): + r = Rect(10, 10, 10, 10) + c = Rect(19, 12, 5, 5) + c.clamp_ip(r) + self.assertEqual(c.right, r.right) + self.assertEqual(c.top, 12) + c = Rect(1, 2, 3, 4) + c.clamp_ip(r) + self.assertEqual(c.topleft, r.topleft) + c = Rect(5, 500, 22, 33) + c.clamp_ip(r) + self.assertEqual(c.center, r.center) + + def test_clip(self): + r1 = Rect(1, 2, 3, 4) + self.assertEqual(Rect(1, 2, 2, 2), r1.clip( Rect(0, 0, 3, 4))) + self.assertEqual(Rect(2, 2, 2, 4), r1.clip( Rect(2, 2, 10, 20))) + self.assertEqual(Rect(2, 3, 1, 2), r1.clip(Rect(2, 3, 1, 2))) + self.assertEqual((0, 0), r1.clip(20, 30, 5, 6).size) + self.assertEqual(r1, r1.clip(Rect(r1)), + "r1 does not clip an identical rect to itself") + + def test_move(self): + r = Rect(1, 2, 3, 4) + move_x = 10 + move_y = 20 + r2 = r.move(move_x, move_y) + expected_r2 = Rect(r.left + move_x, r.top + move_y, r.width, r.height) + self.assertEqual(expected_r2, r2) + + def test_move_ip(self): + r = Rect(1, 2, 3, 4) + r2 = Rect(r) + move_x = 10 + move_y = 20 + r2.move_ip(move_x, move_y) + expected_r2 = Rect(r.left + move_x, r.top + move_y, r.width, r.height) + self.assertEqual(expected_r2, r2) + + def test_union(self): + r1 = Rect(1, 1, 1, 2) + r2 = Rect(-2, -2, 1, 2) + self.assertEqual(Rect(-2, -2, 4, 5), r1.union(r2)) + + def test_union__with_identical_Rect(self): + r1 = Rect(1, 2, 3, 4) + self.assertEqual(r1, r1.union(Rect(r1))) + + def test_union_ip(self): + r1 = Rect(1, 1, 1, 2) + r2 = Rect(-2, -2, 1, 2) + r1.union_ip(r2) + self.assertEqual(Rect(-2, -2, 4, 5), r1) + + def test_unionall(self): + r1 = Rect(0, 0, 1, 1) + r2 = Rect(-2, -2, 1, 1) + r3 = Rect(2, 2, 1, 1) + + r4 = r1.unionall([r2, r3]) + self.assertEqual(Rect(-2, -2, 5, 5), r4) + + def test_unionall_ip(self): + r1 = Rect(0, 0, 1, 1) + r2 = Rect(-2, -2, 1, 1) + r3 = Rect(2, 2, 1, 1) + + r1.unionall_ip([r2, r3]) + self.assertEqual(Rect(-2, -2, 5, 5), r1) + + # Bug for an empty list. Would return a Rect instead of None. + self.assertTrue(r1.unionall_ip([]) is None) + + def test_colliderect(self): + r1 = Rect(1, 2, 3, 4) + self.assertTrue(r1.colliderect(Rect(0, 0, 2, 3)), + "r1 does not collide with Rect(0, 0, 2, 3)") + self.assertFalse(r1.colliderect(Rect(0, 0, 1, 2)), + "r1 collides with Rect(0, 0, 1, 2)") + self.assertFalse(r1.colliderect(Rect(r1.right, r1.bottom, 2, 2)), + "r1 collides with Rect(r1.right, r1.bottom, 2, 2)") + self.assertTrue(r1.colliderect(Rect(r1.left + 1, r1.top + 1, + r1.width - 2, r1.height - 2)), + "r1 does not collide with Rect(r1.left + 1, r1.top + 1, "+ + "r1.width - 2, r1.height - 2)") + self.assertTrue(r1.colliderect(Rect(r1.left - 1, r1.top - 1, + r1.width + 2, r1.height + 2)), + "r1 does not collide with Rect(r1.left - 1, r1.top - 1, "+ + "r1.width + 2, r1.height + 2)") + self.assertTrue(r1.colliderect(Rect(r1)), + "r1 does not collide with an identical rect") + self.assertFalse(r1.colliderect(Rect(r1.right, r1.bottom, 0, 0)), + "r1 collides with Rect(r1.right, r1.bottom, 0, 0)") + self.assertFalse(r1.colliderect(Rect(r1.right, r1.bottom, 1, 1)), + "r1 collides with Rect(r1.right, r1.bottom, 1, 1)") + + def testEquals(self): + """ check to see how the rect uses __eq__ + """ + r1 = Rect(1, 2, 3, 4) + r2 = Rect(10, 20, 30, 40) + r3 = (10, 20, 30, 40) + r4 = Rect(10, 20, 30, 40) + + class foo (Rect): + def __eq__(self, other): + return id(self) == id(other) + def __ne__(self, other): + return id(self) != id(other) + + class foo2 (Rect): + pass + + r5 = foo(10, 20, 30, 40) + r6 = foo2(10, 20, 30, 40) + + self.assertNotEqual(r5, r2) + + # because we define equality differently for this subclass. + self.assertEqual(r6, r2) + + + rect_list = [r1, r2, r3, r4, r6] + + # see if we can remove 4 of these. + rect_list.remove(r2) + rect_list.remove(r2) + rect_list.remove(r2) + rect_list.remove(r2) + self.assertRaises(ValueError, rect_list.remove, r2) + + def test_collidedict(self): + + # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidedict: + + # Rect.collidedict(dict): return (key, value) + # test if one rectangle in a dictionary intersects + # + # Returns the key and value of the first dictionary value that + # collides with the Rect. If no collisions are found, None is + # returned. + # + # Rect objects are not hashable and cannot be used as keys in a + # dictionary, only as values. + + r = Rect(1, 1, 10, 10) + r1 = Rect(1, 1, 10, 10) + r2 = Rect(50, 50, 10, 10) + r3 = Rect(70, 70, 10, 10) + r4 = Rect(61, 61, 10, 10) + + d = {1: r1, 2: r2, 3: r3} + + rects_values = 1 + val = r.collidedict(d, rects_values) + self.assertTrue(val) + self.assertEqual(len(val), 2) + self.assertEqual(val[0], 1) + self.assertEqual(val[1], r1) + + none_d = {2: r2, 3: r3} + none_val = r.collidedict(none_d, rects_values) + self.assertFalse(none_val) + + barely_d = {1: r1, 2: r2, 3: r3} + k3, v3 = r4.collidedict(barely_d, rects_values) + self.assertEqual(k3, 3) + self.assertEqual(v3, r3) + + + def test_collidedictall(self): + + # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidedictall: + + # Rect.collidedictall(dict): return [(key, value), ...] + # test if all rectangles in a dictionary intersect + # + # Returns a list of all the key and value pairs that intersect with + # the Rect. If no collisions are found an empty dictionary is + # returned. + # + # Rect objects are not hashable and cannot be used as keys in a + # dictionary, only as values. + + r = Rect(1, 1, 10, 10) + + r2 = Rect(1, 1, 10, 10) + r3 = Rect(5, 5, 10, 10) + r4 = Rect(10, 10, 10, 10) + r5 = Rect(50, 50, 10, 10) + + rects_values = 1 + d = {2: r2} + l = r.collidedictall(d, rects_values) + self.assertEqual(l, [(2, r2)]) + + d2 = {2: r2, 3: r3, 4: r4, 5: r5} + l2 = r.collidedictall(d2, rects_values) + self.assertEqual(l2, [(2, r2), (3, r3), (4, r4)]) + + def test_collidelist(self): + + # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidelist: + + # Rect.collidelist(list): return index + # test if one rectangle in a list intersects + # + # Test whether the rectangle collides with any in a sequence of + # rectangles. The index of the first collision found is returned. If + # no collisions are found an index of -1 is returned. + + r = Rect(1, 1, 10, 10) + l = [Rect(50, 50, 1, 1), Rect(5, 5, 10, 10), Rect(15, 15, 1, 1)] + + self.assertEqual(r.collidelist(l), 1) + + f = [Rect(50, 50, 1, 1), (100, 100, 4, 4)] + self.assertEqual(r.collidelist(f), -1) + + + def test_collidelistall(self): + + # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidelistall: + + # Rect.collidelistall(list): return indices + # test if all rectangles in a list intersect + # + # Returns a list of all the indices that contain rectangles that + # collide with the Rect. If no intersecting rectangles are found, an + # empty list is returned. + + r = Rect(1, 1, 10, 10) + + l = [ + Rect(1, 1, 10, 10), + Rect(5, 5, 10, 10), + Rect(15, 15, 1, 1), + Rect(2, 2, 1, 1), + ] + self.assertEqual(r.collidelistall(l), [0, 1, 3]) + + f = [Rect(50, 50, 1, 1), Rect(20, 20, 5, 5)] + self.assertFalse(r.collidelistall(f)) + + + def test_fit(self): + + # __doc__ (as of 2008-08-02) for pygame.rect.Rect.fit: + + # Rect.fit(Rect): return Rect + # resize and move a rectangle with aspect ratio + # + # Returns a new rectangle that is moved and resized to fit another. + # The aspect ratio of the original Rect is preserved, so the new + # rectangle may be smaller than the target in either width or height. + + r = Rect(10, 10, 30, 30) + + r2 = Rect(30, 30, 15, 10) + + f = r.fit(r2) + self.assertTrue(r2.contains(f)) + + f2 = r2.fit(r) + self.assertTrue(r.contains(f2)) + + + + def test_copy(self): + r = Rect(1, 2, 10, 20) + c = r.copy() + self.assertEqual(c, r) + + + def test_subscript(self): + r = Rect(1, 2, 3, 4) + self.assertEqual(r[0], 1) + self.assertEqual(r[1], 2) + self.assertEqual(r[2], 3) + self.assertEqual(r[3], 4) + self.assertEqual(r[-1], 4) + self.assertEqual(r[-2], 3) + self.assertEqual(r[-4], 1) + self.assertRaises(IndexError, r.__getitem__, 5) + self.assertRaises(IndexError, r.__getitem__, -5) + self.assertEqual(r[0:2], [1, 2]) + self.assertEqual(r[0:4], [1, 2, 3, 4]) + self.assertEqual(r[0:-1], [1, 2, 3]) + self.assertEqual(r[:], [1, 2, 3, 4]) + self.assertEqual(r[...], [1, 2, 3, 4]) + self.assertEqual(r[0:4:2], [1, 3]) + self.assertEqual(r[0:4:3], [1, 4]) + self.assertEqual(r[3::-1], [4, 3, 2, 1]) + self.assertRaises(TypeError, r.__getitem__, None) + + def test_ass_subscript(self): + r = Rect(0, 0, 0, 0) + r[...] = 1, 2, 3, 4 + self.assertEqual(r, [1, 2, 3, 4]) + self.assertRaises(TypeError, r.__setitem__, None, 0) + self.assertEqual(r, [1, 2, 3, 4]) + self.assertRaises(TypeError, r.__setitem__, 0, '') + self.assertEqual(r, [1, 2, 3, 4]) + self.assertRaises(IndexError, r.__setitem__, 4, 0) + self.assertEqual(r, [1, 2, 3, 4]) + self.assertRaises(IndexError, r.__setitem__, -5, 0) + self.assertEqual(r, [1, 2, 3, 4]) + r[0] = 10 + self.assertEqual(r, [10, 2, 3, 4]) + r[3] = 40 + self.assertEqual(r, [10, 2, 3, 40]) + r[-1] = 400 + self.assertEqual(r, [10, 2, 3, 400]) + r[-4] = 100 + self.assertEqual(r, [100, 2, 3, 400]) + r[1:3] = 0 + self.assertEqual(r, [100, 0, 0, 400]) + r[...] = 0 + self.assertEqual(r, [0, 0, 0, 0]) + r[:] = 9 + self.assertEqual(r, [9, 9, 9, 9]) + r[:] = 11, 12, 13, 14 + self.assertEqual(r, [11, 12, 13, 14]) + r[::-1] = r + self.assertEqual(r, [14, 13, 12, 11]) + + +class SubclassTest(unittest.TestCase): + class MyRect(Rect): + def __init__(self, *args, **kwds): + super(SubclassTest.MyRect, self).__init__(*args, **kwds) + self.an_attribute = True + + def test_copy(self): + mr1 = self.MyRect(1, 2, 10, 20) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.copy() + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_move(self): + mr1 = self.MyRect(1, 2, 10, 20) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.move(1, 2) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_inflate(self): + mr1 = self.MyRect(1, 2, 10, 20) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.inflate(2, 4) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_clamp(self): + mr1 = self.MyRect(19, 12, 5, 5) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.clamp(Rect(10, 10, 10, 10)) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_clip(self): + mr1 = self.MyRect(1, 2, 3, 4) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.clip(Rect(0, 0, 3, 4)) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_union(self): + mr1 = self.MyRect(1, 1, 1, 2) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.union(Rect(-2, -2, 1, 2)) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_unionall(self): + mr1 = self.MyRect(0, 0, 1, 1) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.unionall([Rect(-2, -2, 1, 1), Rect(2, 2, 1, 1)]) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + + def test_fit(self): + mr1 = self.MyRect(10, 10, 30, 30) + self.assertTrue(mr1.an_attribute) + mr2 = mr1.fit(Rect(30, 30, 15, 10)) + self.assertTrue(isinstance(mr2, self.MyRect)) + self.assertRaises(AttributeError, getattr, mr2, "an_attribute") + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f0819691552a037ea33c0e9ba982cba224d05be GIT binary patch literal 188 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j)!8a0v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct vN>YnUierjO^Wwp*cnB2}AD@|*SrQ+wS5SG2!zMRBr8Fni4rKjjAZ7pn_e(WS literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/run_tests__test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/run_tests__test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d2099452c5b074ac9a5185905ba49019a21d961 GIT binary patch literal 3351 zcmb_eOLG&;6`t-HjpXqIV~ntQ*n_VP79bf2l@RLY-V0bza_71?GbE%OtyNGiV|i&QF$-ez_G!d>N@8QTz&$|_^`<8=4*oX2;*qer8o zjseg8H-CKdr*XshCkiLeFigIKCLdA5U-=8+T@nrpM(ogVlHaegK;+nl2V~heBHnp6&d!29c{ah$ z!FYj9vhy%b!JX4A&n`4g?;^j*rr30oUNF2%FrRJ`m|ce1MRtizv&&5j1`_KI9N7DWapYPvbvjdW>{f*DT+TZy?x;CIk;7`2aBY8XZ$^eht?B8Nv zCEm~RD~U}-HqVQ@_D3qmROvnWOv8oaZ(rjxe2JewB5d}8(V(dNeM}w#lM1kV9Fpk>=3L7))e&jAz+0BBhxKz>&Qn6aXHQCMMe)Z0$&CSy0 z=B9)C^!jGC)P7f(>kg$m)jM-_f(pQ6LbIVgh9>VrcW_r3 z5X&1?dPokbB0a*$5fyVi(u0^B8gFey`zA=VXADe~Ul~0EY@*$JQ7l@17<9SIf<}W2 z9@V+L<;qTd+x4ZZf>sbU-7T*6Igi}9quL#%bG2IC55romVCmtN)%6z-pFi`;>lK~d z_NA|s&{S}3%Fb57)VAQV6DrR+{glwdg11Az&RaZEe=r1Q@sHu-2i2F73t4>??W8aTj(h?@GK*Y{x)++d$ey2 z4Dm<-i}Z|CIzf}Ndvqt;&kZ0Z?;#fH9HL;YY=9qasTjC78MzSJtnV{D(TRdRaETw* zBEBC65trS}f^-*TVMsgR-?oS$UQ%b);x>=8wf1bStnJFi^6JYCZSDJk(wVjhBBh7Q z2X)?7K^%!uus~aa`wYTk)?3V@b*3%6D+xu~A%W_lB+j^V8ALe-ok1)zLUJ@mCdn8T zmtdt!iydft(6+mFvAE5{w!a5>bsn$2SbMl$uDGDj+RF`h^@&?~w(|6O+5J_;t-O4+ zw!ZqfT&cJ(R+r1Tx&Cscwo$HZR7z{VcAVngEmy_Is7nAUUA~7nj1Zw{xl`=?=b5Z4hiD8j~FI>Q&~NN z6-dCSGP_wEe@EY1l{7yKwx+QJl=x~}X9CFrp{<=bh;**y2T=`W``J@qgK~jtTDq;t z!53)y(fK+IqylT(-~1f3kjP@TK}nv7d6?Es=||sIh#pcC7$@WcsX$xEFkcv`&!#um;^>%Kr%~|1rqm6Fq-+nk8e|PZ{m%A-s94x#X%0a>HUN~mDMkfs4 zfr|uGWM6S6ZlYon&VpPzQBJyT0AP2-DQ>%sSh&c;1+r4OEzZJOffNo^`JEIPT%A4E zU0lUY%(AW-58-jb2+5UNbp-;ziT!o|fL zl5Zl;g6It?h{J9|5m{sa;0o^y=1(p0I&R1$F9bqOVCb~N4|u(!{H>7d+?FqS4GNW* z#_O`+ER?(v^imDnlt?xj&!x5z7~r1-K8tvl1usBaxBRv@ikg8vX?VQkX8?+DAjx)Z zp@N>B##3jH!wJO}%}gqAT0b-U0yx1N!e4(0029<|Gvv`{NX1_jBB`XguOY6Tkbi^e zE;pfD%vhFX=NxC$A!B6Hu!!xhKiB8df0qyC2J^%m! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..192a02b86d3b5e5beca565932d228cbdbc49ec25 GIT binary patch literal 195 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j$Jr_-v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fn3EHqpB)n)pP83g5+AQuPXNh6|6@jHUBN(N=MAMFdy{T^*1T=VtL`!(5NO&?hUj69MwK>;s zGMIK}2qQsWpt2{TvAVNr)~ zvg1O=;p04i$_pO8$Ob$K`*M_r`DAd!)#zT%2QeQ;=@2|7_l2>khiaTMJ7Sdyd6KX! z4i9-O*?sHV&L?Hp#IT_(*kLvpYbmZ8>P9MrPqzNb(rQ`{{lBzT6ZY(3)dFLat-$=G zW$=f^C=>b`xE2&{TtdObE${qu6>=rvboxf)DHv1}>OJ3ZqF}QU>_UDoNRaG!@Fjo3dAMBlkafh*Y zW1dti%G5};VxVInFkr5yS~Fm7UJcA2sTu(5(6xEN!=AHv>`L#7>Vm&?^hB2=)1{m9 z;;3xsJc)|3#ouZ>hk|t&B|wd~@_5KZq)I>MN~VP!d&X%P(jd~Ty2K28Wiv`mfhc`l za8>B{QE^1QaT*myDC+eA_c%ltlBH{EVvWAd#@;G#r;_85DNFhe03-rW(>`0c3*!y! N;x6%tN7gqy{2N`jecu28 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_3_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_3_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3231b02feea7e3ea46f59d8702e8e456ece6b4c4 GIT binary patch literal 1615 zcmb_cL2uJA6tXNh6|6@jHUBN(N=MAMFdy{T^*1T=VtL`!(5NO&?hUj69MwK>;s zGMIK}2qQsWpt2{TvAVNr)~ zvg1O=;p04i$_pO8$Ob$K`*M_r`DAd!)#zT%2QeQ;=@2|7_l2>khiaTMJ7Sdyd6KX! z4i9-O*?sHV&L?Hp#IT_(*kLvpYbmZ8>P9MrPqzNb(rQ`{{lBzT6ZY(3)dFLat-$=G zW$=f^C=>b`xE2&{TtdObE${qu6>=rvboxf)DHv1}>OJ3ZqF}QU>_UDoNRaG!@Fjo3dAMBlkafh*Y zW1dti%G5};VxVInFkr5yS~Fm7UJcA2sTu(5(6xEN!=AHv>`L#7>Vm&?^hB2=)1{m9 z;;3xsJc)|3#ouZ>hk|t&B|wd~@_5KZq)I>MN~VP!d&X%P(jd~Ty2K28Wiv`mfhc`l za8>B{QE^1QaT*myDC+eA_c%ltlBH{EVvWAd#@;G#r;_85DNFhe03-rW(>`0c3*!y! N;x6%tN7gqy{2O7XNh6|6@jHUBN(N=MAMFdy{T^*1T=VtL`!(5NO&?hUj69MwK>;s zGMIK}2qQsWpt2{TvAVNr)~ zvg1O=;p04i$_pO8$Ob$K`*M_r`DAd!)#zT%2QeQ;=@2|7_l2>khiaTMJ7Sdyd6KX! z4i9-O*?sHV&L?Hp#IT_(*kLvpYbmZ8>P9MrPqzNb(rQ`{{lBzT6ZY(3)dFLat-$=G zW$=f^C=>b`xE2&{TtdObE${qu6>=rvboxf)DHv1}>OJ3ZqF}QU>_UDoNRaG!@Fjo3dAMBlkafh*Y zW1dti%G5};VxVInFkr5yS~Fm7UJcA2sTu(5(6xEN!=AHv>`L#7>Vm&?^hB2=)1{m9 z;;3xsJc)|3#ouZ>hk|t&B|wd~@_5KZq)I>MN~VP!d&X%P(jd~Ty2K28Wiv`mfhc`l za8>B{QE^1QaT*myDC+eA_c%ltlBH{EVvWAd#@;G#r;_85DNFhe03-rW(>`0c3*!y! N;x6%tN7gqy{2OKGec=EA literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_5_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_5_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0965ba5bf4d576199cf2b09a52bc392db4c430ea GIT binary patch literal 1615 zcmb_cL2uJA6tAyztZ0_0y)H|d1UnV##El&| z^9$M|KLLpYKY~-Poc0$u@$9rLi0yz>NB*Au{9=FaOZ=V$fsdd)IQV+-!$Ih$nJiix z2D{MpcL0e5ii!FpupkMh*jhq~B*)Iw{RbPeIm0uE+C+7vt$Ac?hC@O<+LmqM#3WO5 zzX#FoCK8R9P+$7`v&69fionvF5sXq_qG?CK-qg1Y0vbF+q9wdjBs>`$uYPps+MMe* z8BDt~gpnYxP_JEjjE#7dGIj>}p#8E@NL}bN3=`VSCqq7xCqZSm?b7zZ1TGqZ!7g;Y z10WGdfG9B}P7!s4BV4eqXox1*Mn#D>MO*kVZ;2Jr0qcnXsH~R3b2)jLiE$$Pz+qr0 zm}V?|1+)iUuL68PQzSq~$N|BNWWV3TrO&mNs_3h+gqf>la`*))55j+Cdk@3cu&Bc~ z*>NG`@Nu3$gP0GabO;`k`@-1NLp4sB9kI%UJV{s< zhlf0t?7sDF=aaH)V%Sg?>@XXQwG>wkbt4tRCtH7IX*I2f{$JXv348XiYJsuIR$zY8 zGWf${lnH$eTnh>}E}>xJmUsTS3b~T-al~eg!euJVLzl;*ZB4;WQ%*Ur93{YBjJ&R?^6n|+ncB`@yQ7~Hxb`}4^Cswx;c7%P3K5B5&NxWm}H zF;A)$Woo2aG0-s(7%C(-4 zaa1;RoxVCX%J~vU1A2lvKghOK$N~N zxGMDfs5qkDIE@M;6!rRmdmJJR$_QQe70oiW*JVkQV5dTzxUmCg zenETWCm?a)M{vrO)BXY{o}HEju^o`=$ltS{U+nLFiQkhT@Da2J2VW0Can4j_?0F;Slc79_zGTT3XBPugLmKgS55mG*AH0=o3oBEbPK!ayUw1jtxgeQaJ)sGHcn{)jp zgK2k$FcRby>a|Ocu@R3_#?Bxgv|ly~sSACEVM3evWXMPIB&h7RUD_U)z(pf4*oCfl z03-ql5G97hDWZ;WgbUUc4bcSKs3_5(UV9cF{Emg1_RZlpr^Wb3ait)}(R|4UmnVb2~`Eig9O3d~Ph z27g$LGNG@5YeC`0B@|5D^3Fe3Ay*PUj@YbGxJ-q4=<-;!tqLi8%A2+0uV0{miCNyc zmHHa~0i){e+SwPWzldAj`D-?Bv#*l5^Y0auJo>`F8E7FPjpE#UAj3h zj>?A4lc*?L{H?ZgC|HM40@P?LkB3Y|s`PWNWLnsu zSA~8b6-U$?r%_>qqFx_xk3)nZS-Pes*67=8?5*;4DmfmRvZU_-KqBxo?X!iuFy6o} N?h>DPWPQWKzX5I+ed7QC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/no_assertions__ret_code_of_1__test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/no_assertions__ret_code_of_1__test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..585ef47ed94e2a48282b130549c2c3087315c1e8 GIT binary patch literal 1553 zcmbtUL2uJA6tAmvtZ0_0-8O5Q1UnV#u1ttC zzhFJ`6OcIYJACD|zrcy-q}__>#G$tQJ^T5q-}_!_KMTVEL3?!c{b=YR^vf+~tqGGo z80IH{LJ|##{vxp?31+yogb_uKy)*wGtf~40Pk^5aQ=$KicSbdX`s+qOTyVKC^HCI_yWm>q^C$y6&|mC^4Qum*B>f8 zYflhHlDt9NO-nf+ia6!`9Q2?ATPu_)%sGYytLNjM7^;)7vODG0PR9{vjlg6NhS>#B z2ugq$aY>va=1EWbV0~GWb+EN6C03VB8Nj+BS7Zw;l_8|EYQvXm{5q4PL>)p79hZV@ z&bqM=!}tIa0UaNF1F*hPNmtjwTf*{*h@R&8b5V%sRn`$nbf|`T zl#e@op@$E0(HV$doc6%ubk0mEGt#4!mor|ONF)i*22q-EVIV>gXQ|;_tAckjsd(1q z4=d_UKDKT5Q{IEkZq^wYB{y95u38A6Z2cv)EbBb=zsgIg+gLYdva146SlaL+@Gz6+ z2DoNXZ(R}9@sBOd8=UF;{3x%B-M^~Z<%&a zonCR!au7OLb#QU1F8^J+1{>=zjN?*Fy;(1Jwy)_m@LSJ}jU}0}elCi>t(iQD3)>Ly zO}U0AryD1b8f)Z(9+$DUK`yjPi*in#(`CrQ*zoFVa`4%DoVt5w15*fHn2&MMXLOXt zg)0=Jhk*M67%oZcyH{LZH{nzJ=Q`zm9#}CIO*jeS_jZrGs)S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/zero_tests_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/zero_tests_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05903f85c935a8fef6edac43f8ce2db469690c9a GIT binary patch literal 747 zcmZWny^a$x5VpPfah5EE6U{YLgy&l&7K6chdNUU*b)B_x5<`<&NIa~NcLK)_0ThA}AVwsH(!^)4 z)aFei*Oi(=&5LmoE~}v+=RSpNV+iyi=T~b{wUKYggb_#hZO@+O@2oO5f8Q*fD)UpV zUkWGk*Ud~+`BbfRt~axVFssK}%t|pY>N$7<>w}1-bF;2_)Oag$QB}Mt^J`_AeISG< zdSkk9{ZVKMo*q#g?eTrn1Is6NV?AlC?`Yu`zH4<=INui^Y_y@jk3|LjvA!g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFdB3z}YG$v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fT9#T=S&{)#A0MBYmst`YuUAlci^C>2KczG$)ehv6&p^xo E0E$#O`Tzg` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca3269100f2f7fd2e46a2b3a3dfcf30be2c84742 GIT binary patch literal 1619 zcmb_cPjAyO6t|tUO|xbzV**Y56}KMPffGU#8Vrd8unR>M}E(K{>A>iU*h*T2z&zV{^8fd9}Xcuak6Z6 z80+ez__n`^I1{Ye@#;5%^4+$ugI(+VQ=nR1_2MA5?Pbp36Y)(j@Caqd}G1& zn+j&lIiW`bgJ){`Vk{>^)dmh7 zq<{@QdN8KxRaOj*tU^7ui9(MRQ*mqjc8R69qHZsA2aD(H_8mnf(XhD_At) z>+w;h2H~SLeIhauJ|B0)Fl?()8m7}uU+B@@RCETS7biW4VD3w2QxEkdiR>sUT&UhD zJ4-UN0Sg^&ABd zv$}H&^$q+3sOqiK+2^Uh#I5f94VyRat5vE*cBjPP#yQ!aArFemfO14p?n8~R_Y%g9 zD0({)!(v5aoz!b+8fXGEct!OF8oYfagMXy1fZ2p@@CA>0&hoJCv#t9aQ z+&7ufnRy>)eeO+?I76Yh*9N;U0D&ZP7wck)zRkwoDsQ)t;~|zNa~ljK0#DUGH)#{b PThygZ<};6NZh7=KEM0%L literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/incomplete_todo_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/incomplete_todo_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3675ea0db5b6b41c97f4c50392011035384422 GIT binary patch literal 1648 zcmb_cO>fgM7`B~$q*=3-F+dYACOGxL&InCtFeDDZE)*eI(V|d$ZPqjiwhQXC8#{33 z7qmxy0ul#)M-E&#?JscRecg2nMI4ak$j|GKC(iRej{U^_FAu0VEM*z|QspE2uG8ZhqihHMCDz%q3< z?gG2APDFLUxFT-JI3e5-j;KJah^nYTtj;9ynrH|Q`gO4+nh;&#gOugMe=f%_GcihJ2Q+k1 z0v3$03uG6nUIsWO6C%Jz$brC%Y_HR%g%@cpmFcLFgkD9<-D(!=w)0 zWQRr$g2#FOG%``}BI`y;(2>JD$j9A&q=xtNs5^*yaoU3s%zYkg>VX=ip>2h;5XkpZ zjZGic_NJrO(rr+*viL63ttF((u4Fs`Df^MLl|}Z69v5gE#?cyq*twp@>!C<&l!9 zv27OzQ6cwZ9nMa92xCPpPVojQJZ&On^oQ8=xjRZ@gGO<;1GpOj14R}UyfjPlZ8r9# jx!W^49^t*EHvu3Kcxv|9pe<;x(F$!bkGX7h&85EqL-veL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/magic_tag_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/magic_tag_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c8677e887e5eb0c55718bae5e4916545653e187 GIT binary patch literal 1500 zcmb_cKW`H;6t{hs%iZNq)2axnN|j*CKqm%-5GoXj0q8;yl69(OVmG-axg7STkcy4Y z%#6v1#1~*?;6r$2>Q`Xm*_S{N?SNEU{=H}Wo!@&uKi{K9BSz5f9)3Oi;vw|IPL?eK zWeo?h)t_F(8c01{Cw5U>H6o+0W9Pxv5xQ4s;iil~YZWFR6DgRF`gL{c}6r*isy zEG9$Q0pDHg+BPfUD$qU*-2`}#W=H^ykOG1a$w8-$P0Y2Hs_3YRgqg49@aQvA_R4;q z?B7dX!lq7MjgJdCNFL_-V_xv&*|^JxNk@+IB%gNsT#at$ygL9svL3A1oR`9-oTy30 zoW@F#$P=liMc>*x8d<@6ZfiH6nwB+XJz21$ad)DnxMnl3Od))_^H;Kt(pA&{%U)IC z%r;gb2$ypSwv)y z?yR`KegOm4=IZ>G>}#k2%j(S)-xsmJv^!{r_CeZE7&9?EP4_H7uQT>$!iVLKs=;}x zZlPhpJ`S~J!Pfl>*g{YNz$OfBXCV%~vb**61_ggmyqYo9f_>xZsWxP+ji2+PZz?(; zriH2U*V@g&`Y0VjbhMfedQ7Cs#5q?oE1VwMMH?h-q?(maiNTr)(#$?n6YGMjLcdLm zJ`E>XTG;!cVFz%ZgM|&&`1X&ql7`F56?J&OWaNSUIp|ve0fCgD2d?kn7U-MU$1M_* JkZi1n_!p+aYd`=1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/sleep_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/sleep_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24c8099175f7d818b1fdf1548757e967e999d71a GIT binary patch literal 1000 zcmZWn&2AGh5VpOW#Mx#;sESY#>H#679Ow}tgixVK9DrU3s${LOOzbAxY&Kil0aBF{ zJ#gj;vPT|)I|rV@S5AEePK=#a3SunJpT{%fZ~QDx69n||-H&&-BZPi?JaYh(rZPk|1gv|7%pF(uJ zjbvj&SfUd1O<~BtA+e%0!Kh3WT6QGlW=ZHEWoeLI)_s9wOVV>BsY;KpeTi7_vge;F zU0$ydMv}Zi{kEf=PeopGegW@72d-h2vE~AU!J5@#B&O;#UCG^Wv^(^HS42SBgKf5e zDFjd;Mtl?Jh($7j60u8Ps>SP>oEK^UxraWrCw~=CM*FbM17H>{QH>bVylaj83|T=nO51jJze0FK{q|%RqPcbPQt9k6di?sd5cdC{?jU7^Acu=(*|> z7aLU^v9__ZiuJJeV}P?Na_d^+y$LqdJ<1EH%UacB#AU8sQVFd}8+7WOzC25F z!&g9Y@VRDQ`gyp-SfQ=?nA!2fP3P literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/fake_2_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/fake_2_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/fake_2_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/incomplete_todo_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/incomplete_todo_test.py new file mode 100644 index 0000000..1b76918 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/incomplete_todo_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def todo_test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def todo_test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/magic_tag_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/magic_tag_test.py new file mode 100644 index 0000000..34d32c6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/magic_tag_test.py @@ -0,0 +1,38 @@ +__tags__ = ['magic'] + +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/sleep_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/sleep_test.py new file mode 100644 index 0000000..cc830bb --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/sleep_test.py @@ -0,0 +1,29 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +import time + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + stop_time = time.time() + 10.0 + while time.time() < stop_time: + time.sleep(1) + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0e4bf5d272e421ba5460aad5555d601ccc79c87 GIT binary patch literal 196 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j*V!s2v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fT9KSnnvxn5AD@|*SrQ+wS5SG2!zMRBr8Fni4&;o_K+FID D&M`Qg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27b8c274f7299c33a3fd565ef635f6769b73f972 GIT binary patch literal 1616 zcmb_cPjAyO6t|tUb+cwGV**Y56}KMPffGU#8Vrd8unR>=k{o$c{~xT$`V7w?Y73%*-ViII1(u2ssH~dsnVh^BiE%2sz@cX; z*k&z!1+)uYuL68PQzSq~$N|BNWUt%7Cg562Rdm%@!pzq)J@|qYh45eb?t|zREb8d> z=%|o`=uw_O;RTPLk9s_fx^kFD`J{Kq)$nf4djsB2vOaih?hE5mkJLDe-6$?iB;WVa zv5?ULAISKgb8h7m)3!lzUl#Gfs5jP9T(;b;RtO*8{3}f-YBlu#@>X@&vx8LwjLWtJ z`VEg&R}rvu1fKal&LGf?iHhx$D literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/invisible_tag_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/invisible_tag_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..134d51a6cb71282448ede3ce416d0d88cef5b25a GIT binary patch literal 1652 zcmb_cO>fgM7`B}>P12?-(-2G(lR#X0U}uCTG#C;GU>AyztZ0_0y)J8-20LZz#EqRf zb8L_N1g;$T5xH{Og&)9)*KWHNu^o`=$nWcqC-(C^iTyN+LImaE{_F8&APCgO6iF;_kEqXr2qz_!*z8b8I!Erf@=x?+b%G~Ykae^esXs&d6C4v7&`^fL z?UBLBY&-yTWgQ8xM`%sf^cP8B{kkABm=KJzP~veUU~O8n3>viY90^|pXGjFHakTQu zq0JfB@3JwzF+ms!=QV1DG)S@!iB8_7vh*42^CV;J90a1hvQkK0=yMDm>gA&@@5|F@ znz!uKR>uJ6g+OBms@{em5yb+5BcS#SQAaq!h3txo@E})2RrruS5r`0SRn$ZsvM(ZF z)hMGEa`b8-hN)}=hmN6OiplU<&@NQnfbbEGkpN3U4uTiSUb}_MkZUbf(N;qVJy*;0 z;44x-z<(d_K8oMKq>kSXjtbd}pXB*7Uhw$kpu^L+E&F+#k2;53^&jNC)8pMF>%xf9 zK2KJ9tcDr0EjCTDJn5uEA>#`_S;4z@ZYv*^O@n1!S+IjaXQ-vPX(SlS5I)`fORe>G z5&D1fl?Q9Ku&P3`qNl<9y=8R4qCXJ&HVn-vY+OUZ;Fh=lr3<-|@R7vE0)^{bm_e7v zBCsxG@JTlpw!d|S0|v9aeW&hg_y>%ucNg})%KbTRdHb(e-DX`SbIFVQ3k>dDq5cxN z*9y$-VC-P54B?)zXA|0W#@-KkI-ODG@>Dew>Lx@cm}9C|OfV;KA(%f>RUoWE)#e2s z`_BBaGp$t$+rl~0jHxCdN=J`$Nd~%fb6y;l6`iL^QC9goZTo;eNKzn4t9h@>M54+t z=SpUUZTn`>aHUbA+4NX57%RObGgn3#>Vm66A1B2j^@mwf7|W>NhPcZCVd$2wxg{5b oSY7sf`P)-t9-E6w--F;05CxBCpH19^_8N9^lZ3=4t7|^~12Mac2LJ#7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/magic_tag_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/magic_tag_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..848dcafcc36c04e1faacecb77f4ea7dacd3f54dc GIT binary patch literal 1497 zcmb_cF>ezw6t;br%iSfHrd1JCl`6rOfldqvAyg<51JH#aB93_7&)1aY4S=ZFWQbF%i{ zq1^@7uc9+spCgR8^8)ok-54cdT3MnX5#8^a)9GWIxpY zz4#?8s`%CTq!PpUVOc&-sw93kPLn+Di%}Vu)ATrzquXVY4ndD%03K8G(%6z?IVqSO zvD(DqG|eYm#8yLAB?If}Z@$l;GD4eIpaXXFGpXYV}+V{lC&>6ZY(3 z>4UKa*I@3kj()Kijk&r3t|f)-e^4-SSC{{{3Z)cqKzw_J!oO5lgkBwsz^YKdaqg_7 zzkZ1VCg$q$*6J&`14h-GE4eRIe;Ies^UZ5CR2b7Cyi5BgVBBWx%_Pa|71@IQWZOVw zz`P8(X24wf6)+b;dH|cym6`e2ck0jjdm9w;!R1wq$u6vGM@^L`W2N0Psg89+m3da_ zX7XCuIYb|2Ik2P6ayVc-lR7LDDT>ODed9DFX_P5ezas`d?PY~|qdHVoA}jSatB$EZ zDYD9(5B2+i`w2uCvf4F&M=NF6s_doq@7IbvF#ind7Jx^fB=|i0?cgqqH?fPmBqToB HSoiTy`q^pX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/fake_2_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/fake_2_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/fake_2_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/invisible_tag_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/invisible_tag_test.py new file mode 100644 index 0000000..063cbc4 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/invisible_tag_test.py @@ -0,0 +1,41 @@ +__tags__ = ['invisible'] + +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/magic_tag_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/magic_tag_test.py new file mode 100644 index 0000000..34d32c6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/magic_tag_test.py @@ -0,0 +1,38 @@ +__tags__ = ['magic'] + +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fac09023d575d8b78950e91b3e68879c7e8e5670 GIT binary patch literal 198 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j-`OfAv^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fmYA7ST9jIB7!x0#nU`4-AFo$Xd5gm)H$SB`C)Ez*kk3HO F002SsIY0ma literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6289c7d105c78575736c1eb48366826dee64d29d GIT binary patch literal 1618 zcmb_cL2uJA6tT^7Ys7+Kw)>uR~<~SmZvZiWEZ%D>^ z;inMoZz5S65*Dbyd{!9tUy)eRIl(9m6q>ap?9BqlAY|cFBpZ?*BS}?wxcbp!YYVR5 zR5)wT5k``{M4e_qIUk8Q<@^NlLHk85S0*6JzyQS@(4O}(?gI(xm z2S6c^05M`o93$pQPx@eeS(A0JwUQF6%ccxq-jFM@1(wPXsH_&@Gc|oNmXkzvfkV$y zu+3Wd3TO|ySq1ojW=MjLkOP7j$$qzki$EBobl%ky1vB5Mr2hqJ3gN%>-h=2BESl)` z_%K()=uwtE5xIz-k9#7Cx@wd~*|c{c^yp3|dP6aY(*byF?n~oRkMtzvZp2Fy^+lXa zv@&;LG*tYab8lzUqHV+YK;^tY?oEu6mo0m%7Q#ncexvYaYpv1k^5y~uySx-1W+Q}wS;kt z^LG=Glq=enNxfpBWg)a+Z>V0gU@u<<>>sIX0PE0=eSu=?Eg!eixuo0RFFZ3f1sR*d z&qRJu)J&GddC?GWjhjQw>cNPqT81o)4KMF82VYT-Q(Gg7 zz~n;b=6#$WFgi)&+zQ2L7jRENge6({wk%fYyKLO8qC2G=4{c>Kw*Vj!c~HYX|PkFPTbgm zGryoc@)M9a@FO_o%4vUr6VFb|g4hm7bL8*Y&oB1(zQpfw7zPO1{Wo9V{O}O^X(!9p zguyO!^Bq7TiH1afl30=iGwdv3M3F;p=Kq5=RiEQIL~Wufvc@8^F~<>Mlr>dTdP6eS z3qOTue-p{tkgz}n=Ci`E|BA$l&Iv|opwO%(VQ&^V1|bWdBH57i7)h$a!_|)-TU&7b zrovf!jxdtsCF(Q_%K1pdDd#7U585wkxiYyq!7yRk53GZe5f z7k6%{zJY(hs(Q0>_F3vL<1X&}HJ7*DSF22k{C0)GjWe=8jodE_gO!8xB7hR%t|g3H zoWGlhq+HRqOzIU2EeoLqdqee_1$+4_VE;&616YS{>u z1SS_cH}B*8fYC`B=T<02yMTKFA}q>xwI}`pC*JcUOQJ4YAw2SX&-NS7_db8)U*k9;(0+OL?pZS= ztTN{GA(Ct59G*M*8%xgsz8&N^MXM$;V9Gryzu?^jv(>Y{qlT|BPi_F%XCQNYA z)@>CGSz#9Q9J0f0q8dXcA|2T`n!^4YifTS*l;n{nCz}fP7Li8~i}*L9T8h6SitG5e z^LHS&7Fgfw_@p~0lqmL;?6e(E)3MC*H2nbekbT#vw5{w13IowBrvo|Gv$*!VerdOl ziOa?yxC`Ch2BQg3Km zYBJJ2z|cns*w6>i_n_Mjn3v>)DBuxlAn+pF@9j_*No%#KdS;?w6k0txd`k?6^p9rm zR`Lfd+T_pTxYEPqURmCkl}sKNeK|^cdR!*uw0|Vc_{UQAhjNhR1DL_um(G`-m`R@c zD6L&`D6`STX!{dHL!JKYr+3S#>tb3u&{cX^^e0xUONbuXB6N0btx!+vYUpU&S`o{0s z!GSiJJpw4_Ao|Qp3A6z(+bf{H#LFUe4cGrF;ye^>&r1&H`~Ax2ubjaN=B#}e)##PD z34x-PSL81cz1QJGP+sSr*I`!V4~!|yxd&rG9!U80QxL)ItbxUbQr zmetKu1a$Vp88m#(+^_Ep}tL z)Sy^R1I$I}7GL0$2aBiSS9UI#3o!2jJGG7#)`g|4j$Ff*qpWf*d0_n*uCv2z1kgmQ z91c>I85fn(=)CeV$4Nve;>@P?FP_4jYi2oKA1<<$G?jgkRY!tP@~lFl1n+^}laPTR pU5Gd4Sv5F*yQbp~%EaCP1BJlT^v^Zgh4?!f(k_b_XBRJX`U%rXiaG!Q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_2_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_2_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_2_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_3_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_3_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_3_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_4_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_4_test.py new file mode 100644 index 0000000..b540a3c --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_4_test.py @@ -0,0 +1,41 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(False, "Some Jibberish") + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + if 1: + if 1: + assert False + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dcbb305b0c9d091e1e96de7c0230ff2046e2365 GIT binary patch literal 199 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFdB3z}YG$v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fnU|cOTac4lk{S~qpP83g5+AQuP@N03C>1w) z;LH;wM;-x*17{v#ublb{oS1Q%HVL!{;gx5`<5~Ng&-Og_JeNSbzxQSDdx4N2IGDC7 z7(39-HxP@FHQ>z(giX9Y2#ouH}mB(}pQ5$4d^2$kMWlVj>9bQ#cS?IAu zpZFb!E^ZK6>M`yr*L+eG)?boTIb%ji>?$&p|vZ0NtGuFJ4ygX#(> zoA5;7Ma{ia6#Yb+E8vloDPZ^j7&%yYw^jB>9xUN>I64~t;7&jJRAPHxY%}Jp^R)QdRp=8)+3U)0B z-VQ`GnbBA_^%4pX1wK~2f})NBALER`3#v;X)}R|?(4kIY`q`Prs$Kk$)r)30-J!n#*Mo?V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/fake_3_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/fake_3_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b43d7a2d02c25a426495e7a87c617a8339628bad GIT binary patch literal 1619 zcmb_cL2uJA6tdtKHx33e*fi5oj` z<`=X_egYB)egr39IqffS;@N3g5ZeK%j{H6Q`NjU;m-syi!vH~haPaluhlkKlJ6W_Q z40fUG?*I}BG$87ez=8}h!_E>$Bsun`{y$ig^%3%*-ViII1(u2ssH~dsxtzSr#CRyXz@cX; z*k&z!1+)iUuL68PQzSq~$N|BNWWU?NCg562Rdm%@!pzrlc=!b=3gN%>-oxlMEb8b@ zc3j9o^f=F-@`6V%vK}8sT{+65e9}AOYIHB>y#enhX&*c`_l0q(M{1nLZWNa$O4437 z%7?O$(IFqm_`dUR=M&SmadBT3@nO~*YbmZ;`c^K4PqzNb)ahCc{lC;z9ro;C)d1rX zF2Vk&Cj7%}E}>xKmUsTS3b~T-fy8Eo!euJVLzl;*=~PJJbKa~RfBgal zY|Qe`E!EfX4_H-iSI)jj{YBjJ&R=tR+kKVHB`@w)7~Hxb`}4^CvNBjX;@AXGBiy}& zaVw7Bjrp)#QMOL16$>p3p#^(I)tUu+`zm1nNL2$^hpz1l6jN{UxRuTo)ds)u^h6ty zY2)X-I5IVz50k<)_*?DfP_zz{Ay8wDe9(_YqD+u;CDX! zNSHtuTow9#QXDZlPLsk4#b_6Bk3)ndX?$B3EA(A9?pD#AQjSNqH0e74kO(|=_iW)d Qj5n~4+aw^AtZz{K8`)idq5uE@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_2_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_2_test.py new file mode 100644 index 0000000..1c68eaa --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_2_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def todo_test_get_pressed(self): + self.fail() + + def test_name(self): + self.assertTrue(True) + + def todo_test_set_mods(self): + self.fail() + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_3_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_3_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_3_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7795ff5d3b5710914cdbbbd0a25ae266926a4927 GIT binary patch literal 204 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFdB3)Y&Q~v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fnU|cOTac4lk{Vx?ciO|0PAWKVg(4fhOa+g1vd*7=%20LR3}xM@0ELJXrqV@s$&< zUv)TcOb8{4y&%n6;R`X4aU#Sq#6xzAa;|M|k0}gzB^!0+Kp%!vyXlrT+vqqe3_9D; z>=u9~AOYbFNgNUGDNmKamQ-0)z?P?!ctzDz0OP7!QgyJt3W3UU5kA$U=cyX@bqhGO zkpdR9a0+Axnq3BXPsT)njt~QZ57}<3NsB;Qt4-cALk**n)&0(AVtjD_`EKWa^b!_r z^eR2bbuW6DWshYpqi1Pb_M?^_WKlM1?@KedlgV~ZcH^WAGZ_2KxX>drOoZ!+sfpsG zoer|T&b7!>l|~)e)8ejM+{{Kr1D!=z=c1FghgPeL7z1iX=;6k1;W}~WUH>nBQ-M93 z)KtN^sHcFpwFpmH3{qt;!_@FdBFvo6kI9Nt0QWUI(=xv`N8|be z4bE1iTgl}SF>JMsMr)iCXG&V z*Y|M}8S*f;V*0`b%oUY5!R%24HkT&1Z{vKQ`@KK%s@Pl_!7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_3_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_3_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6096f286d8eace7f556c215de54febd76e0847e7 GIT binary patch literal 1624 zcmb_cJ#P~+7`AR({uwJ)KEXa}VD3&n-w-RJ1vU^7P+2w6GdX#YiSbZ&fkV$y zu*F(91+)uQuL68PQzSq~hylTmWUt%7CgfU6Rdm%@LeJN7c<=?O0Nj7Q-+d6jf=L~} z&W;K>h#%$o6JGH6dDi2@xGP6_oKJd(T#fGLyf@(eB<;h9jeTKU=&>57%(Yl);w0^5 zqkJd}$%;&5@c|!5cF#?2$ALlOZ7F}0juh*%HHRxzwle${%bC7yRMSC0m!RRdUus_hQ}4!p(ZW;&Nt8^(>N zC)$uq8$aj8p{eP7m=vbL-)Pr|%yp0qff{Y(gFX|9GGWe@Obgcz?4V^xqeQdvH8U79 z^(3{K!i2ius?hI};*bX8G%2i5H0T2Ea`3Pujc=1|h1Oi{( UeK&C%+8fx%Z4#1ztZxMPH&YpbyZ`_I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py new file mode 100644 index 0000000..1b76918 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def todo_test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def todo_test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9c6472a497ba836352ef2be13cb21e2a34e39b3 GIT binary patch literal 202 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFdB3*x4#3v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB4fnU|KCmsye;pOc?o5ECB{;>5@66;$5hu*uC&Da}c>13Bh1 H5HkP(Li;-> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_1_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_1_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4bc2c93d53b745a8b62fb812be63169eeb048eb GIT binary patch literal 1617 zcmb_c&2AGh5VoC7;%vKZ_!pp7NSu105;uep0*b@|$b}#zYgNm{PP$F9yVx5b6*qd| z%o8L>9s!91&#@di^%XcV<82`oMZMH3&y4L^&o`eveiTI^fp%y6>-LWtAwO|&)LLLX zfbPD7Fhr9fv!688Y(xe1nh9puZfzF)BkQIyr*rVSN*1MP9(p$CG-iT}mTBqQkY)C8 zo`ZLAmFW7AiO_`Zv!Ss6lBR~w86|0G$ZT1|-Xin}A`v|yx~cg-(cDD4D<5lO^$_bf z6V2LlLWyQC$VRK=QjS%UN_hbJkWN`Ij4Rv$g@I_~(}5bBy{OWgerdCZjz^7w@c_EJ z2f`4bfCz>l_KB$Jnhrn*x~?0b>lGx?&@COpxT%-)GH9+NfU;6XPtEjsrY9rQ1q?le zfDJXA0@;G@RzQ3pGopb<$brC*tkd0~WvHApw&>c4fl=VhsQ-mn4(`9+ZrzPv!lH{` zWxItL#t-xSu_{#jEbFOJ+%@Ao&ZoT{WyiO2)f=iok`7=7b3al(_1I2Q=`C5QI7$0S zniNKkvMi7LYG~wbzqFZ8%Qm{ofhlA^>rI@|7cc{4jL^OHW664I7hR8Kj|}+i@mjtQ z-mq6y=CtDz+@Q7z3*N2-UeYr96Mmd&cNwN!0D@3P_pbjZI(i-peJb&`0bBkD!CwM$ zYv6eFH3V@A0f(+5#Gv;f3&33HGv-ZzgI~tysK{b_vBYiUe@Gi(L1s({p r4DeN4fbX;Mb;a*hblk_X^ydnRz}N8KI&Fh}kp{HQLdMzoOPu}&lFfgU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37dd5a27068dff490ebd11f41c97f070b5084c1d GIT binary patch literal 1622 zcmb_cJ#P~+7`AR({uwJ)KEXa}VFOcLlSg^7!dqO_PQNh1i~1l^RAvK==nyC`d^Ty;Qs5~?t|zROq%F* zdYG$W^eD@oh+IU^)1DYbT{X_4Y}z{zdVDt%y`dPy$pA)d>`UW9kMtzruEk3e#YsO- z;#~1jnr2a73>ClUrna(a(YCI9pmN?%dlRGNWgCH24B?}je+BELt-AhS^tujfcCc=M zaWR)*?`jeLVKGjnxdKB=3fIn|VEry`|5Ft*t>BF0W`)9eDlA+tjz!a{kidyvuWWzy z3ERTaYpo~o_l3-uySx-1dt}& z(}Z@5^S2W*DrdA!m3qZO%R*?uzEZtr!9KtW*c+*90P9eV{efcYEk8HYxun}LUU+6| z3X+<_&qRJu)J!&t^P(Z%7}tlq)sII&jWx32fXi4HK_;|Ha@VGI&@yCUYg`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFdB3$k{3;v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB3!P?VWh5?@@Bl3G+06Ca2KczG$)ehvA I&p^xo00=lb*8l(j literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9f9b75b9eca4c471961a49ddf06d7d89e71a0c7 GIT binary patch literal 1621 zcmb_cKW`H;6t{i(<6LuXC>5vz3S!GZ2PT9nR45Vy(1jo*>r~6cZhB2}IqZv2DmFSW z^9hoXkATF$hhVyusb7JK_wEvUh;~4VPyRjsd1wFL&-Qx~1U`ZC;Na`Q508+a*jbbY zG>idj8LN4E7ERcT*{$}Vkyrc9H^Fip0F~7&cy1;yM|wOk9pKPK z3Ruv>DUdy=ZWZ7InGy{;LJS0cWc!^q&3xsYv1!MS4fHC`3=Y2#%fbEEc<*8O8YW%% zW^|mIe)u>^o~l%ZFGgK82s>t&gvq3Pr0nosqPl(6i{c)PVC)N%haTE-Ec2EuOqkdx zPNhq=u{JzZeIxJZGuz1|YoVv?nN%K*x?^YbRSWbff38Ae4IGi)EK#^jg}LkUSTu4KVmQ#7rR}d@ zpaA+TZ{I?F2X_EfyLke5QTHwqQK-+{9&U z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_3_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_3_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d26308b19a0bd77966112fdb0d8c8f0485664fec GIT binary patch literal 1684 zcmb_cO^*{d7`8o=#F@=30a~gpA6luW9J&`S2q6UBsvKzd(jX*j#K;?algZ~`J3?7; zg9GROg5=nrP^pLh4qrL(7dY|0o&-{nMMA4s70d)HxfFg>Hi6ELPHe%*Ym@~mN8%E3cGpy(Vzr>(Q^C@hP5x#-J@K2Ixo6t<3f_{*j- z7(9S(?*V8cz&ODaxZ^buk&09dGFCNJ2U)8qiMnd41m+F3r&=JnN`cD0Pao^WA2T%{ z>n?EUAq8wGBk0G_?LNRuvIO=k3N{eN!$JN1{P=G6 z1U7B@Y9c8S zvqMb-L@>DmOjVzLWHFg3dkvO06s})D0rkG!{hz#08Vw;*2U`>_^1@nmH;W(P07r&& z33-M|0O=4Z_Awozlk@At;`CIT!VV56c&9yd0|==-oR`UOo!CcqVST-dnyE5<-gG|Evw zSB3FODUF85jAM?A$WWw(&8td~!-#Ru}&IiUleX2_=C_bPYX$J!R+3WmT}58o}?hVgearfrrm&aQmV=?4mGlp+8C literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_4_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_4_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1191a8ce14a27d4c2bdf697c5e9113f40f25f0fd GIT binary patch literal 1648 zcmbtU&2Aev5GJ`RiCTMQB`s1IZPOfj@gY9t5EMa?)J+2P$Cs!mKrBMgA}y~a?QY2x z3JE>6IrN+-u#S0z06FwIc}DK)e6^_49U2 z$e%b^w=M(^p}Rl87^2CT+21wQY(fPMo(X2yd2|u~!?sL&NtckdPd2UStTH=GnlZse z*K~C>W~E)tbI6YOiEfRVNKE2h8VcXv(bVuIqoha-x!Be4ZIJ{7sYss^-O>C7(cGlx zz273Sx5E0yq!;}qp+vK1z z^=x7WfMJLbu%VBjA3=9LFu#xsqJc-KfxwIGcyK^{qMS3f9@v?IQS8j*^cArj(*K$r zeUbeDi!S@IJg?0-dsJ0lt6F8>l|wbj24-4i)qHrS?DTG>hGR9#ixJFV?Q0iG&+M#_ zA(D;DDw`LzbhS3tW~XXwa&W`mfO#Lex$~@aKCV=K=3B0s_{{}bhi_ri8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_2_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_2_test.py new file mode 100644 index 0000000..398aef5 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_2_test.py @@ -0,0 +1,39 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_3_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_3_test.py new file mode 100644 index 0000000..7362aa4 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_3_test.py @@ -0,0 +1,40 @@ +import sys +if __name__ == '__main__': + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(True) + + def test_name(self): + sys.stderr.write("jibberish messes things up\n") + self.assertTrue(False) + + def test_set_mods(self): + self.assertTrue(True) + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_4_test.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_4_test.py new file mode 100644 index 0000000..b540a3c --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_4_test.py @@ -0,0 +1,41 @@ +if __name__ == '__main__': + import sys + import os + pkg_dir = (os.path.split( + os.path.split( + os.path.split( + os.path.abspath(__file__))[0])[0])[0]) + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest + +class KeyModuleTest(unittest.TestCase): + def test_get_focused(self): + self.assertTrue(True) + + def test_get_mods(self): + self.assertTrue(True) + + def test_get_pressed(self): + self.assertTrue(False, "Some Jibberish") + + def test_name(self): + self.assertTrue(True) + + def test_set_mods(self): + if 1: + if 1: + assert False + + def test_set_repeat(self): + self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__init__.py b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__init__.py new file mode 100644 index 0000000..1bb8bf6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..baad5ae4ef19b832e9d1e79ca836b22027a814c6 GIT binary patch literal 201 zcmZ?b<>g`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFdB3$k{3;v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB3!P?VWh5?@@Bl3!X96Ca2KczG$)ehvA I&p^xo017WU<^TWy literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..817631b004795e021fe6509d68969e32f3710c9a GIT binary patch literal 1621 zcmb_cPjAyO6t|uJNwa1vV**XUK-_v@2Tll0XfPxWz%CRaSJ^~U4J_M&+IqfTO;=QD0L2L)4I`Z%N&x`$gKilt#?|THwgM+UJKO91SVrNlW z(Ab4)zXNEZ$dH*&iYhjuoEDaGrrEJGt^I>_-I&oCcx{p@^5)#LIimsNE^q0Ua)vB6 z^KlovYnw#Xhm3pLv!6AE^;Z#4S>J)_X!jbt*AV}0V6cDtC`?xW+PFlg*T zwL1WsfCPjyBymc(qa0NOTT^w_09!99@rG(C5Bg2DqS|0xe1mBVq9?lmF+zYUc;mf z-o(eL9tMw-64@WhK^P5S1Y=*ABJ{vyktkZCG(lp* zC>1tUah3*$a;U}qVrDy;{8PN zQ-oXsUe(&9h~PkPR<^%> zfdc5WynRdcE!+WA^>$_Ni_~BEEpPv|B5qvQ=tRr(ZiT_E3!*>w+%Izj${|GVL6#_9 zCbZi^yvyXMoH3Xw%?d&r!AHPHYSs|&{Z#;Oq^Sd}L$&yWOI>I26*Ju{rUT=-V<$Fe zvCV6VOpo%qO-5mwH|1Mf^dW5>h9jWHo5^q>RA_Q9kw(L7#I}or$dLP?73EVFFqSvM z2-8IF*;Ja;z7NwQ?q*S#qEOuJ0q#lgK$3Y4Gh>B*5l!)`+?`U6N0^-K9RLUfzDDtF S(GIjXXpMH5$6U6);nLq2E`Xu{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_3_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_3_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3a44d1cd60a01e9676724a46651c0c4e60e3625 GIT binary patch literal 1743 zcmb_cPmdcl6t_K-WHOuCO$#boN~<9Ck^_6;QlSbJwt@q&7lM$iQAghRC7Jx2sqJZ% z6*qd|%qK{Wd;}y8e2%$t>Q~^zdoxKli0n!rZ29;6=h^)?rs=I=HIe@`wd#bF3KQD7AjpPN!f5^B^3V7O6S4Enqbm9=2pz!ZQZ-@<(K3o`+#|5==W z5`Tw_HvT@FI+(?u<@qz^RQz=|RP%TMi#*O(!-+DBk8(Afsd2g-;|$rp6P4+)DV9mq zOKK74CSAJ3I-M0R9;q25A6F}9`Ks)aW-2LBB%=ki!_idiXb6E6?t${yXDM z6VL2((?U_1TmwDTGJ4Bmk!gDmr*;(X-#~%%4&VPi?sja-*BD`PKL*0n;%y+ji>v$7 z^zsr+Y9~EYq)Xd_mtaLKRQD(-O>$$9FV3ECqo`%a}+#4E|hl9RvI(WZ{2Zm#2Q@%2$WKcw5YPw!CNcY6Qd{U?>>bgqFMlzX(t;K2dwuQf0F zZOTXF4$Ma(W~M49V84?jFA6oUR}AH7b3|}L&?UG-aF>97{vOa@FbxD+v=qRA2Od@* zt5>b`@6>^%Z(54XmVU0>q-@xHp1QK7E^ReNYNK?H)MP84jT4=kGR&0$%mdU9Xp$Jp zD78tQL=v1UoA@0tL6xC($~gNfbrTsB%hZvhWH3NHSExZGOP{jw9{tLi>OTihYIl4} dY0>r&&=9Q6sy^gh?7z!>-W8z;#NB%V{|n~oqs;&S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_4_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_4_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d63c7b3768daecbf7abbf009cd47ee05d20d355 GIT binary patch literal 1648 zcmbtU&2Aev5GJ`RiCTMQB`s1IZPOfj@gY9t5EMa?)J+2P$Cs!mKrBMgA}y~a?QY2x z3JE>6IrN+-u#S0z06FwIc}DK)e6^_49U2 z$e%b^w=M(^p}Rl87^2CT+21wQY(fPMo(X2yd2|u~!?sL&NtckdPd2UStTH=GnlZse z*K~C>W~E)tbI6YOiEfRVNKE2h8VcXv(bVuIqoha-x!Be4ZIJ{7sYss^-O>C7(cGlx zz273Sx5E0yq!;}qp+vK1z z^=x7WfMJLbu%VBjA3=9LFu#xsqJc-KfxwIGcyK^{qMS3f9@v?IQS8j*^cArj(*K$r zeUbeDi!S@IJg?0-dsJ0lt6F8>l|wbj24-4i)qHrS?DTG>hGR9#ixJFV?Q0iG&+M#_ zA(D;DDw`LzbhR#Lb#|)8M&1i6ht=HoF;k9AEl<7Jh)h3j8MaUF_o;H7{q{$%6#A6>x-=4|~J z1sTM+3xTGN*W_2weURc45MS?6kYZjIkF723wHxC=9!U6Smms3WRU5O;+XC{x2-ph* z;CHR5jH*AsL_imxUO~gV%;V)`+=i^G%XTIgCNnZPoI&onPH`-}F z0cfIAjYm@F)+d#+1`aC5948T>NOLEfQ!Zi7xAOvT5TCeO+1mY_*Jpyyio8am1RsDs tQjmcleTg`k0*knvaU4MUF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j*V!s2v^ce> zI3_$lt0Xl$#<8HlC9xzi#wR~HF()P@HMbz9pfWilu_#x!ATc>RF+DRc9Vn8Xn41ct zN>YnUierjO^Wwp*cnB3!l9`*DUs@6qAD@|*SrQ+wS5SG2!zMRBr8Fni4&;o_K+FID D(fByI literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/fake_2_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/fake_2_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b19970ecc3d753728a361da2d661b15ade108e45 GIT binary patch literal 1616 zcmb_cL2uJA6tUKxMUvp3BM0OpJ%J3mkfu zf^F8qS3rBv^(w#zG(`e*gd7mONcOuOT!dU}sZ3XmCCq#+hlgK~3LyMfzV|SG4U0N{ zlN}p5h#%+qQ*L!4b6*&jdaTANb0b!o*d!yF zjZJ*W2a?@)&h30sv~3XUOT!Mc-dIa<)pEC5A$+p+SDH@LYUuyvt?IC62df4cmu(65 zFD;@!EJm5o*TA))aN`mRHg0+6pR157313HSRw!Ji!aQ_&ESgS*6u#xn%JJ7PP{774 z@7z*-4gY{u^>*d#i_~AlE${p_m$%(l$y{=Cx5D7o1=*iR?w4i3%E4F>LV<9X62>jY z-i`UNTv4`2suc?@3y}qTKh>HAd-W<{|43B>Sck6d3jq$i#p6~wS5zDPg{LRFAek=w zoSUPfrt@K9iUxnH-5e^`VKM}2w2=?`OeCrZbFO4++&HjK%aBHiX5}qr;4A7$YAZw$ zYQvS$?-O%GgK?S|D-;d7fO{MwEXl&RMX^HPW#evDuv5zM$kru&2LKX*r|zCD+=lT6 O_HmnpBp~Y>0sakD?|yXv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/sleep_test.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/sleep_test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d864beec4ca315458c7fb33759fd45bcda9843dd GIT binary patch literal 997 zcmZWn&2AGh5VpOW#Mx#;sESaL=m8<59Ow}tgixVK9DrU3s${Kdnb=J?+3ap@N06$V z=z%j&kQ{jg?i_dqUpe&^I5BowDTuK=e;&__zwwJSO%TxIqaR0iBZPi?ngIf#2I0fwN+b26H@6bKZWRc z8_C9mutX*1o5GNPLt;gj1fw!hXwi|7n$klIV;ovau0oKPyQ;PjP_xhN5Cvvpe2&{Hu{V|-C0@Z zc!Kl;&>`g#V|3a*MCWKhWaKT0e1U@zTn4(or(+Od%G9-(Uy0Lt{N zF7A@Eoqv!E_^)3$0B~V`C3L{KOJI@#WzajEpUywSk^^uT}ym0!G^lWc>#4l43`)yv^5`dd&20f%&kX5H=#1415oz`g!%ql?EmLl=YCq+x9{lF)q|h; cFJ= width: + x, y = margin, y + line_spacing + if x + bounds.width + bounds.x >= width: + raise ValueError("word too wide for the surface") + if y + bounds.height - bounds.y >= height: + raise ValueError("text to long for the surface") + font.render_to(surf, (x, y), None, color) + x += bounds.width + space.width + return x, y + +def iwords(text): + # r"\n|[^ ]+" + # + head = 0 + tail = head + end = len(text) + while head < end: + if text[head] == ' ': + head += 1 + tail = head + 1 + elif text[head] == '\n': + head += 1 + yield '\n' + tail = head + 1 + elif tail == end: + yield text[head:] + head = end + elif text[tail] == '\n': + yield text[head:tail] + head = tail + elif text[tail] == ' ': + yield text[head:tail] + head = tail + else: + tail += 1 + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/sndarray_tags.py b/venv/Lib/site-packages/pygame/tests/sndarray_tags.py new file mode 100644 index 0000000..6493eb2 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/sndarray_tags.py @@ -0,0 +1,12 @@ +__tags__ = ['array'] + +exclude = False + +try: + import pygame.mixer + import numpy +except ImportError: + exclude = True + +if exclude: + __tags__.extend(('ignore', 'subprocess_ignore')) diff --git a/venv/Lib/site-packages/pygame/tests/sndarray_test.py b/venv/Lib/site-packages/pygame/tests/sndarray_test.py new file mode 100644 index 0000000..67b110b --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/sndarray_test.py @@ -0,0 +1,174 @@ +import unittest + +from numpy import int8, int16, uint8, uint16, float32, array, alltrue + +import pygame +from pygame.compat import as_bytes +import pygame.sndarray + + +SDL2 = pygame.get_sdl_version()[0] >= 2 + + +class SndarrayTest (unittest.TestCase): + array_dtypes = {8: uint8, -8: int8, 16: uint16, -16: int16, 32: float32} + + def _assert_compatible(self, arr, size): + dtype = self.array_dtypes[size] + self.assertEqual(arr.dtype, dtype) + + def test_array(self): + + def check_array(size, channels, test_data): + try: + pygame.mixer.init(22050, size, channels, allowedchanges=0) + except pygame.error: + # Not all sizes are supported on all systems. + return + try: + __, sz, __ = pygame.mixer.get_init() + if sz == size: + srcarr = array(test_data, self.array_dtypes[size]) + snd = pygame.sndarray.make_sound(srcarr) + arr = pygame.sndarray.array(snd) + self._assert_compatible(arr, size) + self.assertTrue(alltrue(arr == srcarr), + "size: %i\n%s\n%s" % ( + size, arr, test_data)) + finally: + pygame.mixer.quit() + + check_array(8, 1, [0, 0x0f, 0xf0, 0xff]) + check_array(8, 2, + [[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]]) + check_array(16, 1, [0, 0x00ff, 0xff00, 0xffff]) + check_array(16, 2, [[0, 0xffff], [0xffff, 0], + [0x00ff, 0xff00], [0x0f0f, 0xf0f0]]) + check_array(-8, 1, [0, -0x80, 0x7f, 0x64]) + check_array(-8, 2, + [[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]]) + check_array(-16, 1, [0, 0x7fff, -0x7fff, -1]) + check_array(-16, 2, [[0, -0x7fff], [-0x7fff, 0], + [0x7fff, 0], [0, 0x7fff]]) + + def test_get_arraytype(self): + array_type = pygame.sndarray.get_arraytype() + + self.assertEqual(array_type, 'numpy', + "unknown array type %s" % array_type) + + def test_get_arraytypes(self): + arraytypes = pygame.sndarray.get_arraytypes() + self.assertIn('numpy', arraytypes) + + for atype in arraytypes: + self.assertEqual(atype, 'numpy', "unknown array type %s" % atype) + + def test_make_sound(self): + + def check_sound(size, channels, test_data): + try: + pygame.mixer.init(22050, size, channels, allowedchanges=0) + except pygame.error: + # Not all sizes are supported on all systems. + return + try: + __, sz, __ = pygame.mixer.get_init() + if sz == size: + srcarr = array(test_data, self.array_dtypes[size]) + snd = pygame.sndarray.make_sound(srcarr) + arr = pygame.sndarray.samples(snd) + self.assertTrue(alltrue(arr == srcarr), + "size: %i\n%s\n%s" % ( + size, arr, test_data)) + finally: + pygame.mixer.quit() + + check_sound(8, 1, [0, 0x0f, 0xf0, 0xff]) + check_sound(8, 2, + [[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]]) + check_sound(16, 1, [0, 0x00ff, 0xff00, 0xffff]) + check_sound(16, 2, [[0, 0xffff], [0xffff, 0], + [0x00ff, 0xff00], [0x0f0f, 0xf0f0]]) + check_sound(-8, 1, [0, -0x80, 0x7f, 0x64]) + check_sound(-8, 2, + [[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]]) + check_sound(-16, 1, [0, 0x7fff, -0x7fff, -1]) + check_sound(-16, 2, [[0, -0x7fff], [-0x7fff, 0], + [0x7fff, 0], [0, 0x7fff]]) + + if SDL2: + check_sound(32, 2, [[0.0, -1.0], [-1.0, 0], [1.0, 0], [0, 1.0]]) + + def test_samples(self): + + null_byte = as_bytes('\x00') + def check_sample(size, channels, test_data): + try: + pygame.mixer.init(22050, size, channels, allowedchanges=0) + except pygame.error: + # Not all sizes are supported on all systems. + return + try: + __, sz, __ = pygame.mixer.get_init() + if sz == size: + zeroed = null_byte * ((abs(size) // 8) * + len(test_data) * + channels) + snd = pygame.mixer.Sound(buffer=zeroed) + samples = pygame.sndarray.samples(snd) + self._assert_compatible(samples, size) + ##print ('X %s' % (samples.shape,)) + ##print ('Y %s' % (test_data,)) + samples[...] = test_data + arr = pygame.sndarray.array(snd) + self.assertTrue(alltrue(samples == arr), + "size: %i\n%s\n%s" % ( + size, arr, test_data)) + finally: + pygame.mixer.quit() + + check_sample(8, 1, [0, 0x0f, 0xf0, 0xff]) + check_sample(8, 2, + [[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]]) + check_sample(16, 1, [0, 0x00ff, 0xff00, 0xffff]) + check_sample(16, 2, [[0, 0xffff], [0xffff, 0], + [0x00ff, 0xff00], [0x0f0f, 0xf0f0]]) + check_sample(-8, 1, [0, -0x80, 0x7f, 0x64]) + check_sample(-8, 2, + [[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]]) + check_sample(-16, 1, [0, 0x7fff, -0x7fff, -1]) + check_sample(-16, 2, [[0, -0x7fff], [-0x7fff, 0], + [0x7fff, 0], [0, 0x7fff]]) + + if SDL2: + check_sample(32, 2, [[0.0, -1.0], [-1.0, 0], [1.0, 0], [0, 1.0]]) + + def test_use_arraytype(self): + + def do_use_arraytype(atype): + pygame.sndarray.use_arraytype(atype) + + pygame.sndarray.use_arraytype('numpy') + self.assertEqual(pygame.sndarray.get_arraytype(), 'numpy') + + self.assertRaises(ValueError, do_use_arraytype, 'not an option') + + + @unittest.skipIf(not SDL2, 'requires SDL2') + def test_float32(self): + """ sized arrays work with Sounds and 32bit float arrays. + """ + try: + pygame.mixer.init(22050, 32, 2, allowedchanges=0) + except pygame.error: + # Not all sizes are supported on all systems. + self.skipTest("unsupported mixer configuration") + + arr = array([[0.0, -1.0], [-1.0, 0], [1.0, 0], [0, 1.0]], float32) + newsound = pygame.mixer.Sound(array=arr) + pygame.mixer.quit() + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/sprite_test.py b/venv/Lib/site-packages/pygame/tests/sprite_test.py new file mode 100644 index 0000000..86a7a1d --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/sprite_test.py @@ -0,0 +1,1248 @@ +#################################### IMPORTS ################################### +# -*- encoding: utf-8 -*- + + +import unittest + +import pygame +from pygame import sprite + + +################################# MODULE LEVEL ################################# + +class SpriteModuleTest( unittest.TestCase ): + pass + +######################### SPRITECOLLIDE FUNCTIONS TEST ######################### + +class SpriteCollideTest( unittest.TestCase ): + + def setUp(self): + self.ag = sprite.AbstractGroup() + self.ag2 = sprite.AbstractGroup() + self.s1 = sprite.Sprite(self.ag) + self.s2 = sprite.Sprite(self.ag2) + self.s3 = sprite.Sprite(self.ag2) + + self.s1.image = pygame.Surface((50,10), pygame.SRCALPHA, 32) + self.s2.image = pygame.Surface((10,10), pygame.SRCALPHA, 32) + self.s3.image = pygame.Surface((10,10), pygame.SRCALPHA, 32) + + self.s1.rect = self.s1.image.get_rect() + self.s2.rect = self.s2.image.get_rect() + self.s3.rect = self.s3.image.get_rect() + self.s2.rect.move_ip(40, 0) + self.s3.rect.move_ip(100, 100) + + def test_spritecollide__works_if_collided_cb_is_None(self): + # Test that sprites collide without collided function. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, collided = None + ), + [self.s2] + ) + + def test_spritecollide__works_if_collided_cb_not_passed(self): + # Should also work when collided function isn't passed at all. + self.assertEqual(sprite.spritecollide ( + self.s1, self.ag2, dokill = False), + [self.s2] + ) + + def test_spritecollide__collided_must_be_a_callable(self): + # Need to pass a callable. + self.assertRaises ( + TypeError, + sprite.spritecollide, self.s1, self.ag2, dokill = False, collided = 1 + ) + + def test_spritecollide__collided_defaults_to_collide_rect(self): + # collide_rect should behave the same as default. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, collided = sprite.collide_rect + ), + [self.s2] + ) + + def test_collide_rect_ratio__ratio_of_one_like_default(self): + # collide_rect_ratio should behave the same as default at a 1.0 ratio. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, + collided = sprite.collide_rect_ratio(1.0) + ), + [self.s2] + ) + + def test_collide_rect_ratio__collides_all_at_ratio_of_twenty(self): + # collide_rect_ratio should collide all at a 20.0 ratio. + collided_func = sprite.collide_rect_ratio(20.0) + expected_sprites = sorted(self.ag2.sprites(), key=id) + + collided_sprites = sorted(sprite.spritecollide( + self.s1, self.ag2, dokill=False, collided=collided_func), key=id) + + self.assertListEqual(collided_sprites, expected_sprites) + + def test_collide_circle__no_radius_set(self): + # collide_circle with no radius set. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, collided = sprite.collide_circle + ), + [self.s2] + ) + + def test_collide_circle_ratio__no_radius_and_ratio_of_one(self): + # collide_circle_ratio with no radius set, at a 1.0 ratio. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, + collided = sprite.collide_circle_ratio(1.0) + ), + [self.s2] + ) + + def test_collide_circle_ratio__no_radius_and_ratio_of_twenty(self): + # collide_circle_ratio with no radius set, at a 20.0 ratio. + collided_func = sprite.collide_circle_ratio(20.0) + expected_sprites = sorted(self.ag2.sprites(), key=id) + + collided_sprites = sorted(sprite.spritecollide( + self.s1, self.ag2, dokill=False, collided=collided_func), key=id) + + self.assertListEqual(expected_sprites, collided_sprites) + + def test_collide_circle__with_radii_set(self): + # collide_circle with a radius set. + self.s1.radius = 50 + self.s2.radius = 10 + self.s3.radius = 400 + collided_func = sprite.collide_circle + expected_sprites = sorted(self.ag2.sprites(), key=id) + + collided_sprites = sorted( + sprite.spritecollide(self.s1, self.ag2, dokill=False, + collided=collided_func), key=id) + + self.assertListEqual(expected_sprites, collided_sprites) + + def test_collide_circle_ratio__with_radii_set(self): + # collide_circle_ratio with a radius set. + self.s1.radius = 50 + self.s2.radius = 10 + self.s3.radius = 400 + collided_func = sprite.collide_circle_ratio(0.5) + expected_sprites = sorted(self.ag2.sprites(), key=id) + + collided_sprites = sorted(sprite.spritecollide( + self.s1, self.ag2, dokill=False, collided=collided_func), key=id) + + self.assertListEqual(expected_sprites, collided_sprites) + + def test_collide_mask__opaque(self): + # make some fully opaque sprites that will collide with masks. + self.s1.image.fill((255,255,255,255)) + self.s2.image.fill((255,255,255,255)) + self.s3.image.fill((255,255,255,255)) + + # masks should be autogenerated from image if they don't exist. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, + collided = sprite.collide_mask + ), + [self.s2] + ) + + self.s1.mask = pygame.mask.from_surface(self.s1.image) + self.s2.mask = pygame.mask.from_surface(self.s2.image) + self.s3.mask = pygame.mask.from_surface(self.s3.image) + + # with set masks. + self.assertEqual ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, + collided = sprite.collide_mask + ), + [self.s2] + ) + + def test_collide_mask__transparent(self): + # make some sprites that are fully transparent, so they won't collide. + self.s1.image.fill((255,255,255,0)) + self.s2.image.fill((255,255,255,0)) + self.s3.image.fill((255,255,255,0)) + + self.s1.mask = pygame.mask.from_surface(self.s1.image, 255) + self.s2.mask = pygame.mask.from_surface(self.s2.image, 255) + self.s3.mask = pygame.mask.from_surface(self.s3.image, 255) + + self.assertFalse ( + sprite.spritecollide ( + self.s1, self.ag2, dokill = False, collided = sprite.collide_mask + ) + ) + + def test_spritecollideany__without_collided_callback(self): + + # pygame.sprite.spritecollideany(sprite, group) -> sprite + # finds any sprites that collide + + # if collided is not passed, all + # sprites must have a "rect" value, which is a + # rectangle of the sprite area, which will be used + # to calculate the collision. + + # s2 in, s3 out + expected_sprite = self.s2 + collided_sprite = sprite.spritecollideany(self.s1, self.ag2) + + self.assertEqual(collided_sprite, expected_sprite) + + # s2 and s3 out + self.s2.rect.move_ip(0, 10) + collided_sprite = sprite.spritecollideany(self.s1, self.ag2) + + self.assertIsNone(collided_sprite) + + # s2 out, s3 in + self.s3.rect.move_ip(-105, -105) + expected_sprite = self.s3 + collided_sprite = sprite.spritecollideany(self.s1, self.ag2) + + self.assertEqual(collided_sprite, expected_sprite) + + # s2 and s3 in + self.s2.rect.move_ip(0, -10) + expected_sprite_choices = self.ag2.sprites() + collided_sprite = sprite.spritecollideany(self.s1, self.ag2) + + self.assertIn(collided_sprite, expected_sprite_choices) + + def test_spritecollideany__with_collided_callback(self): + + # pygame.sprite.spritecollideany(sprite, group) -> sprite + # finds any sprites that collide + + # collided is a callback function used to calculate if + # two sprites are colliding. it should take two sprites + # as values, and return a bool value indicating if + # they are colliding. + + # This collision test can be faster than pygame.sprite.spritecollide() + # since it has less work to do. + + arg_dict_a = {} + arg_dict_b = {} + return_container = [True] + + # This function is configurable using the mutable default arguments! + def collided_callback(spr_a, spr_b, + arg_dict_a=arg_dict_a, arg_dict_b=arg_dict_b, + return_container=return_container): + + count = arg_dict_a.get(spr_a, 0) + arg_dict_a[spr_a] = 1 + count + + count = arg_dict_b.get(spr_b, 0) + arg_dict_b[spr_b] = 1 + count + + return return_container[0] + + # This should return a sprite from self.ag2 because the callback + # function (collided_callback()) currently returns True. + expected_sprite_choices = self.ag2.sprites() + collided_sprite = sprite.spritecollideany(self.s1, self.ag2, + collided_callback) + + self.assertIn(collided_sprite, expected_sprite_choices) + + # The callback function should have been called only once, so self.s1 + # should have only been passed as an argument once + self.assertEqual(len(arg_dict_a), 1) + self.assertEqual(arg_dict_a[self.s1], 1) + + # The callback function should have been called only once, so self.s2 + # exclusive-or self.s3 should have only been passed as an argument + # once + self.assertEqual(len(arg_dict_b), 1) + self.assertEqual(list(arg_dict_b.values())[0], 1) + self.assertTrue(self.s2 in arg_dict_b or self.s3 in arg_dict_b) + + arg_dict_a.clear() + arg_dict_b.clear() + return_container[0] = False + + # This should return None because the callback function + # (collided_callback()) currently returns False. + collided_sprite = sprite.spritecollideany(self.s1, self.ag2, + collided_callback) + + self.assertIsNone(collided_sprite) + + # The callback function should have been called as many times as + # there are sprites in self.ag2 + self.assertEqual(len(arg_dict_a), 1) + self.assertEqual(arg_dict_a[self.s1], len(self.ag2)) + self.assertEqual(len(arg_dict_b), len(self.ag2)) + + # Each sprite in self.ag2 should be called once. + for s in self.ag2: + self.assertEqual(arg_dict_b[s], 1) + + def test_groupcollide__without_collided_callback(self): + + # pygame.sprite.groupcollide(groupa, groupb, dokilla, dokillb) -> dict + # collision detection between group and group + + # test no kill + expected_dict = {self.s1: [self.s2]} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False) + + self.assertDictEqual(expected_dict, crashed) + + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False) + + self.assertDictEqual(expected_dict, crashed) + + # Test dokill2=True (kill colliding sprites in second group). + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, True) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False) + + self.assertDictEqual(expected_dict, crashed) + + # Test dokill1=True (kill colliding sprites in first group). + self.s3.rect.move_ip(-100, -100) + expected_dict = {self.s1: [self.s3]} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, True, False) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False) + + self.assertDictEqual(expected_dict, crashed) + + def test_groupcollide__with_collided_callback(self): + + collided_callback_true = lambda spr_a, spr_b: True + collided_callback_false = lambda spr_a, spr_b: False + + # test no kill + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False, + collided_callback_false) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {self.s1: sorted(self.ag2.sprites(), key=id)} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False, + collided_callback_true) + for value in crashed.values(): + value.sort(key=id) + + self.assertDictEqual(expected_dict, crashed) + + # expected_dict is the same again for this collide + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, False, + collided_callback_true) + for value in crashed.values(): + value.sort(key=id) + + self.assertDictEqual(expected_dict, crashed) + + # Test dokill2=True (kill colliding sprites in second group). + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, True, + collided_callback_false) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {self.s1: sorted(self.ag2.sprites(), key=id)} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, True, + collided_callback_true) + for value in crashed.values(): + value.sort(key=id) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, False, True, + collided_callback_true) + + self.assertDictEqual(expected_dict, crashed) + + # Test dokill1=True (kill colliding sprites in first group). + self.ag.add(self.s2) + self.ag2.add(self.s3) + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, True, False, + collided_callback_false) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {self.s1: [self.s3], self.s2: [self.s3]} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, True, False, + collided_callback_true) + + self.assertDictEqual(expected_dict, crashed) + + expected_dict = {} + crashed = pygame.sprite.groupcollide(self.ag, self.ag2, True, False, + collided_callback_true) + + self.assertDictEqual(expected_dict, crashed) + + def test_collide_rect(self): + # Test colliding - some edges touching + self.assertTrue(pygame.sprite.collide_rect(self.s1, self.s2)) + self.assertTrue(pygame.sprite.collide_rect(self.s2, self.s1)) + + # Test colliding - all edges touching + self.s2.rect.center = self.s3.rect.center + + self.assertTrue(pygame.sprite.collide_rect(self.s2, self.s3)) + self.assertTrue(pygame.sprite.collide_rect(self.s3, self.s2)) + + # Test colliding - no edges touching + self.s2.rect.inflate_ip(10, 10) + + self.assertTrue(pygame.sprite.collide_rect(self.s2, self.s3)) + self.assertTrue(pygame.sprite.collide_rect(self.s3, self.s2)) + + # Test colliding - some edges intersecting + self.s2.rect.center = (self.s1.rect.right, self.s1.rect.bottom) + + self.assertTrue(pygame.sprite.collide_rect(self.s1, self.s2)) + self.assertTrue(pygame.sprite.collide_rect(self.s2, self.s1)) + + # Test not colliding + self.assertFalse(pygame.sprite.collide_rect(self.s1, self.s3)) + self.assertFalse(pygame.sprite.collide_rect(self.s3, self.s1)) + + +################################################################################ + +class AbstractGroupTypeTest( unittest.TestCase ): + def setUp(self): + self.ag = sprite.AbstractGroup() + self.ag2 = sprite.AbstractGroup() + self.s1 = sprite.Sprite(self.ag) + self.s2 = sprite.Sprite(self.ag) + self.s3 = sprite.Sprite(self.ag2) + self.s4 = sprite.Sprite(self.ag2) + + self.s1.image = pygame.Surface((10, 10)) + self.s1.image.fill(pygame.Color('red')) + self.s1.rect = self.s1.image.get_rect() + + self.s2.image = pygame.Surface((10, 10)) + self.s2.image.fill(pygame.Color('green')) + self.s2.rect = self.s2.image.get_rect() + self.s2.rect.left = 10 + + self.s3.image = pygame.Surface((10, 10)) + self.s3.image.fill(pygame.Color('blue')) + self.s3.rect = self.s3.image.get_rect() + self.s3.rect.top = 10 + + self.s4.image = pygame.Surface((10, 10)) + self.s4.image.fill(pygame.Color('white')) + self.s4.rect = self.s4.image.get_rect() + self.s4.rect.left = 10 + self.s4.rect.top = 10 + + self.bg = pygame.Surface((20, 20)) + self.scr = pygame.Surface((20, 20)) + self.scr.fill(pygame.Color('grey')) + + def test_has( self ): + " See if AbstractGroup.has() works as expected. " + + self.assertEqual(True, self.s1 in self.ag) + + self.assertEqual(True, self.ag.has(self.s1)) + + self.assertEqual(True, self.ag.has([self.s1, self.s2])) + + # see if one of them not being in there. + self.assertNotEqual(True, self.ag.has([self.s1, self.s2, self.s3])) + self.assertNotEqual(True, self.ag.has(self.s1, self.s2, self.s3)) + self.assertNotEqual(True, self.ag.has(self.s1, + sprite.Group(self.s2, self.s3))) + self.assertNotEqual(True, self.ag.has(self.s1, [self.s2, self.s3])) + + # test empty list processing + self.assertFalse(self.ag.has(*[])) + self.assertFalse(self.ag.has([])) + self.assertFalse(self.ag.has([[]])) + + # see if a second AbstractGroup works. + self.assertEqual(True, self.ag2.has(self.s3)) + + def test_add(self): + ag3 = sprite.AbstractGroup() + sprites = (self.s1, self.s2, self.s3, self.s4) + + for s in sprites: + self.assertNotIn(s, ag3) + + ag3.add(self.s1, [self.s2], self.ag2) + + for s in sprites: + self.assertIn(s, ag3) + + def test_add_internal(self): + self.assertNotIn(self.s1, self.ag2) + + self.ag2.add_internal(self.s1) + + self.assertIn(self.s1, self.ag2) + + def test_clear(self): + + self.ag.draw(self.scr) + self.ag.clear(self.scr, self.bg) + self.assertEqual((0, 0, 0, 255), + self.scr.get_at((5, 5))) + self.assertEqual((0, 0, 0, 255), + self.scr.get_at((15, 5))) + + def test_draw(self): + + self.ag.draw(self.scr) + self.assertEqual((255, 0, 0, 255), + self.scr.get_at((5, 5))) + self.assertEqual((0, 255, 0, 255), + self.scr.get_at((15, 5))) + + def test_empty(self): + + self.ag.empty() + self.assertFalse(self.s1 in self.ag) + self.assertFalse(self.s2 in self.ag) + + def test_has_internal(self): + self.assertTrue(self.ag.has_internal(self.s1)) + self.assertFalse(self.ag.has_internal(self.s3)) + + def test_remove(self): + + # Test removal of 1 sprite + self.ag.remove(self.s1) + self.assertFalse(self.ag in self.s1.groups()) + self.assertFalse(self.ag.has(self.s1)) + + # Test removal of 2 sprites as 2 arguments + self.ag2.remove(self.s3, self.s4) + self.assertFalse(self.ag2 in self.s3.groups()) + self.assertFalse(self.ag2 in self.s4.groups()) + self.assertFalse(self.ag2.has(self.s3, self.s4)) + + # Test removal of 4 sprites as a list containing a sprite and a group + # containing a sprite and another group containing 2 sprites. + self.ag.add(self.s1, self.s3, self.s4) + self.ag2.add(self.s3, self.s4) + g = sprite.Group(self.s2) + self.ag.remove([self.s1, g], self.ag2) + self.assertFalse(self.ag in self.s1.groups()) + self.assertFalse(self.ag in self.s2.groups()) + self.assertFalse(self.ag in self.s3.groups()) + self.assertFalse(self.ag in self.s4.groups()) + self.assertFalse(self.ag.has(self.s1, self.s2, self.s3, self.s4)) + + def test_remove_internal(self): + + self.ag.remove_internal(self.s1) + self.assertFalse(self.ag.has_internal(self.s1)) + + def test_sprites(self): + expected_sprites = sorted((self.s1, self.s2), key=id) + sprite_list = sorted(self.ag.sprites(), key=id) + + self.assertListEqual(sprite_list, expected_sprites) + + def test_update(self): + + class test_sprite(pygame.sprite.Sprite): + sink = [] + def __init__(self, *groups): + pygame.sprite.Sprite.__init__(self, *groups) + def update(self, *args): + self.sink += args + + s = test_sprite(self.ag) + self.ag.update(1, 2, 3) + + self.assertEqual(test_sprite.sink, [1, 2, 3]) + + +################################################################################ + +# A base class to share tests between similar classes + +class LayeredGroupBase: + def test_get_layer_of_sprite(self): + expected_layer = 666 + spr = self.sprite() + self.LG.add(spr, layer=expected_layer) + layer = self.LG.get_layer_of_sprite(spr) + + self.assertEqual(len(self.LG._spritelist), 1) + self.assertEqual(layer, self.LG.get_layer_of_sprite(spr)) + self.assertEqual(layer, expected_layer) + self.assertEqual(layer, self.LG._spritelayers[spr]) + + def test_add(self): + expected_layer = self.LG._default_layer + spr = self.sprite() + self.LG.add(spr) + layer = self.LG.get_layer_of_sprite(spr) + + self.assertEqual(len(self.LG._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__sprite_with_layer_attribute(self): + expected_layer = 100 + spr = self.sprite() + spr._layer = expected_layer + self.LG.add(spr) + layer = self.LG.get_layer_of_sprite(spr) + + self.assertEqual(len(self.LG._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__passing_layer_keyword(self): + expected_layer = 100 + spr = self.sprite() + self.LG.add(spr, layer=expected_layer) + layer = self.LG.get_layer_of_sprite(spr) + + self.assertEqual(len(self.LG._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__overriding_sprite_layer_attr(self): + expected_layer = 200 + spr = self.sprite() + spr._layer = 100 + self.LG.add(spr, layer=expected_layer) + layer = self.LG.get_layer_of_sprite(spr) + + self.assertEqual(len(self.LG._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__adding_sprite_on_init(self): + spr = self.sprite() + lrg2 = sprite.LayeredUpdates(spr) + expected_layer = lrg2._default_layer + layer = lrg2._spritelayers[spr] + + self.assertEqual(len(lrg2._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__sprite_init_layer_attr(self): + expected_layer = 20 + spr = self.sprite() + spr._layer = expected_layer + lrg2 = sprite.LayeredUpdates(spr) + layer = lrg2._spritelayers[spr] + + self.assertEqual(len(lrg2._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__sprite_init_passing_layer(self): + expected_layer = 33 + spr = self.sprite() + lrg2 = sprite.LayeredUpdates(spr, layer=expected_layer) + layer = lrg2._spritelayers[spr] + + self.assertEqual(len(lrg2._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__sprite_init_overiding_layer(self): + expected_layer = 33 + spr = self.sprite() + spr._layer = 55 + lrg2 = sprite.LayeredUpdates(spr, layer=expected_layer) + layer = lrg2._spritelayers[spr] + + self.assertEqual(len(lrg2._spritelist), 1) + self.assertEqual(layer, expected_layer) + + def test_add__spritelist(self): + expected_layer = self.LG._default_layer + sprite_count = 10 + sprites = [self.sprite() for _ in range(sprite_count)] + + self.LG.add(sprites) + + self.assertEqual(len(self.LG._spritelist), sprite_count) + + for i in range(sprite_count): + layer = self.LG.get_layer_of_sprite(sprites[i]) + + self.assertEqual(layer, expected_layer) + + def test_add__spritelist_with_layer_attr(self): + sprites = [] + sprite_and_layer_count = 10 + for i in range(sprite_and_layer_count): + sprites.append(self.sprite()) + sprites[-1]._layer = i + + self.LG.add(sprites) + + self.assertEqual(len(self.LG._spritelist), sprite_and_layer_count) + + for i in range(sprite_and_layer_count): + layer = self.LG.get_layer_of_sprite(sprites[i]) + + self.assertEqual(layer, i) + + def test_add__spritelist_passing_layer(self): + expected_layer = 33 + sprite_count = 10 + sprites = [self.sprite() for _ in range(sprite_count)] + + self.LG.add(sprites, layer=expected_layer) + + self.assertEqual(len(self.LG._spritelist), sprite_count) + + for i in range(sprite_count): + layer = self.LG.get_layer_of_sprite(sprites[i]) + + self.assertEqual(layer, expected_layer) + + def test_add__spritelist_overriding_layer(self): + expected_layer = 33 + sprites = [] + sprite_and_layer_count = 10 + for i in range(sprite_and_layer_count): + sprites.append(self.sprite()) + sprites[-1].layer = i + + self.LG.add(sprites, layer=expected_layer) + + self.assertEqual(len(self.LG._spritelist), sprite_and_layer_count) + + for i in range(sprite_and_layer_count): + layer = self.LG.get_layer_of_sprite(sprites[i]) + + self.assertEqual(layer, expected_layer) + + def test_add__spritelist_init(self): + sprite_count = 10 + sprites = [self.sprite() for _ in range(sprite_count)] + + lrg2 = sprite.LayeredUpdates(sprites) + expected_layer = lrg2._default_layer + + self.assertEqual(len(lrg2._spritelist), sprite_count) + + for i in range(sprite_count): + layer = lrg2.get_layer_of_sprite(sprites[i]) + + self.assertEqual(layer, expected_layer) + + def test_remove__sprite(self): + sprites = [] + sprite_count = 10 + for i in range(sprite_count): + sprites.append(self.sprite()) + sprites[-1].rect = 0 + + self.LG.add(sprites) + + self.assertEqual(len(self.LG._spritelist), sprite_count) + + for i in range(sprite_count): + self.LG.remove(sprites[i]) + + self.assertEqual(len(self.LG._spritelist), 0) + + def test_sprites(self): + sprites = [] + sprite_and_layer_count = 10 + for i in range(sprite_and_layer_count, 0, -1): + sprites.append(self.sprite()) + sprites[-1]._layer = i + + self.LG.add(sprites) + + self.assertEqual(len(self.LG._spritelist), sprite_and_layer_count) + + # Sprites should be ordered based on their layer (bottom to top), + # which is the reverse order of the sprites list. + expected_sprites = list(reversed(sprites)) + actual_sprites = self.LG.sprites() + + self.assertListEqual(actual_sprites, expected_sprites) + + def test_layers(self): + sprites = [] + expected_layers = [] + layer_count = 10 + for i in range(layer_count): + expected_layers.append(i) + for j in range(5): + sprites.append(self.sprite()) + sprites[-1]._layer = i + self.LG.add(sprites) + + layers = self.LG.layers() + + self.assertListEqual(layers, expected_layers) + + def test_add__layers_are_correct(self): + layers = [1, 4, 6, 8, 3, 6, 2, 6, 4, 5, 6, 1, 0, 9, 7, 6, 54, 8, 2, + 43, 6, 1] + for lay in layers: + self.LG.add(self.sprite(), layer=lay) + layers.sort() + + for idx, spr in enumerate(self.LG.sprites()): + layer = self.LG.get_layer_of_sprite(spr) + + self.assertEqual(layer, layers[idx]) + + def test_change_layer(self): + expected_layer = 99 + spr = self.sprite() + self.LG.add(spr, layer=expected_layer) + + self.assertEqual(self.LG._spritelayers[spr], expected_layer) + + expected_layer = 44 + self.LG.change_layer(spr, expected_layer) + + self.assertEqual(self.LG._spritelayers[spr], expected_layer) + + expected_layer = 77 + spr2 = self.sprite() + spr2.layer = 55 + self.LG.add(spr2) + self.LG.change_layer(spr2, expected_layer) + + self.assertEqual(spr2.layer, expected_layer) + + def test_get_top_layer(self): + layers = [1, 5, 2, 8, 4, 5, 3, 88, 23, 0] + for i in layers: + self.LG.add(self.sprite(), layer=i) + top_layer = self.LG.get_top_layer() + + self.assertEqual(top_layer, self.LG.get_top_layer()) + self.assertEqual(top_layer, max(layers)) + self.assertEqual(top_layer, max(self.LG._spritelayers.values())) + self.assertEqual(top_layer, + self.LG._spritelayers[self.LG._spritelist[-1]]) + + def test_get_bottom_layer(self): + layers = [1, 5, 2, 8, 4, 5, 3, 88, 23, 0] + for i in layers: + self.LG.add(self.sprite(), layer=i) + bottom_layer = self.LG.get_bottom_layer() + + self.assertEqual(bottom_layer, self.LG.get_bottom_layer()) + self.assertEqual(bottom_layer, min(layers)) + self.assertEqual(bottom_layer, min(self.LG._spritelayers.values())) + self.assertEqual(bottom_layer, + self.LG._spritelayers[self.LG._spritelist[0]]) + + def test_move_to_front(self): + layers = [1, 5, 2, 8, 4, 5, 3, 88, 23, 0] + for i in layers: + self.LG.add(self.sprite(), layer=i) + spr = self.sprite() + self.LG.add(spr, layer=3) + + self.assertNotEqual(spr, self.LG._spritelist[-1]) + + self.LG.move_to_front(spr) + + self.assertEqual(spr, self.LG._spritelist[-1]) + + def test_move_to_back(self): + layers = [1, 5, 2, 8, 4, 5, 3, 88, 23, 0] + for i in layers: + self.LG.add(self.sprite(), layer=i) + spr = self.sprite() + self.LG.add(spr, layer=55) + + self.assertNotEqual(spr, self.LG._spritelist[0]) + + self.LG.move_to_back(spr) + + self.assertEqual(spr, self.LG._spritelist[0]) + + def test_get_top_sprite(self): + layers = [1, 5, 2, 8, 4, 5, 3, 88, 23, 0] + for i in layers: + self.LG.add(self.sprite(), layer=i) + expected_layer = self.LG.get_top_layer() + layer = self.LG.get_layer_of_sprite(self.LG.get_top_sprite()) + + self.assertEqual(layer, expected_layer) + + def test_get_sprites_from_layer(self): + sprites = {} + layers = [1, 4, 5, 6, 3, 7, 8, 2, 1, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 0, 1, 6, 5, 4, 3, 2] + for lay in layers: + spr = self.sprite() + spr._layer = lay + self.LG.add(spr) + if lay not in sprites: + sprites[lay] = [] + sprites[lay].append(spr) + + for lay in self.LG.layers(): + for spr in self.LG.get_sprites_from_layer(lay): + self.assertIn(spr, sprites[lay]) + + sprites[lay].remove(spr) + if len(sprites[lay]) == 0: + del sprites[lay] + + self.assertEqual(len(sprites.values()), 0) + + def test_switch_layer(self): + sprites1 = [] + sprites2 = [] + layers = [3, 2, 3, 2, 3, 3, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2, 2, + 3, 2, 3] + for lay in layers: + spr = self.sprite() + spr._layer = lay + self.LG.add(spr) + if lay==2: + sprites1.append(spr) + else: + sprites2.append(spr) + + sprites1.sort(key=id) + sprites2.sort(key=id) + layer2_sprites = sorted(self.LG.get_sprites_from_layer(2), key=id) + layer3_sprites = sorted(self.LG.get_sprites_from_layer(3), key=id) + + self.assertListEqual(sprites1, layer2_sprites) + self.assertListEqual(sprites2, layer3_sprites) + self.assertEqual(len(self.LG), len(sprites1) + len(sprites2)) + + self.LG.switch_layer(2, 3) + layer2_sprites = sorted(self.LG.get_sprites_from_layer(2), key=id) + layer3_sprites = sorted(self.LG.get_sprites_from_layer(3), key=id) + + self.assertListEqual(sprites1, layer3_sprites) + self.assertListEqual(sprites2, layer2_sprites) + self.assertEqual(len(self.LG), len(sprites1) + len(sprites2)) + + def test_copy(self): + self.LG.add(self.sprite()) + spr = self.LG.sprites()[0] + lg_copy = self.LG.copy() + + self.assertIsInstance(lg_copy, type(self.LG)) + self.assertIn(spr, lg_copy) + self.assertIn(lg_copy, spr.groups()) + + +########################## LAYERED RENDER GROUP TESTS ########################## + +class LayeredUpdatesTypeTest__SpriteTest(LayeredGroupBase, unittest.TestCase): + sprite = sprite.Sprite + + def setUp(self): + self.LG = sprite.LayeredUpdates() + +class LayeredUpdatesTypeTest__DirtySprite(LayeredGroupBase, unittest.TestCase): + sprite = sprite.DirtySprite + + def setUp(self): + self.LG = sprite.LayeredUpdates() + +class LayeredDirtyTypeTest__DirtySprite(LayeredGroupBase, unittest.TestCase): + sprite = sprite.DirtySprite + + def setUp(self): + self.LG = sprite.LayeredDirty() + + def test_repaint_rect(self): + group = self.LG + surface = pygame.Surface((100, 100)) + + group.repaint_rect(pygame.Rect(0, 0, 100, 100)) + group.draw(surface) + + def test_repaint_rect_with_clip(self): + group = self.LG + surface = pygame.Surface((100, 100)) + + group.set_clip(pygame.Rect(0, 0, 100, 100)) + group.repaint_rect(pygame.Rect(0, 0, 100, 100)) + group.draw(surface) + + def _nondirty_intersections_redrawn(self, use_source_rect=False): + # Helper method to ensure non-dirty sprites are redrawn correctly. + # + # Parameters: + # use_source_rect - allows non-dirty sprites to be tested + # with (True) and without (False) a source_rect + # + # This test was written to reproduce the behavior seen in issue #898. + # A non-dirty sprite (using source_rect) was being redrawn incorrectly + # after a dirty sprite intersected with it. + # + # This test does the following. + # 1. Creates a surface filled with white. Also creates an image_source + # with a default fill color of yellow and adds 2 images to it + # (red and blue rectangles). + # 2. Creates 2 DirtySprites (red_sprite and blue_sprite) using the + # image_source and adds them to a LayeredDirty group. + # 3. Moves the red_sprite and calls LayeredDirty.draw(surface) a few + # times. + # 4. Checks to make sure the sprites were redrawn correctly. + RED = pygame.Color('red') + BLUE = pygame.Color('blue') + WHITE = pygame.Color('white') + YELLOW = pygame.Color('yellow') + + surface = pygame.Surface((60, 80)) + surface.fill(WHITE) + start_pos = (10, 10) + + # These rects define each sprite's image area in the image_source. + red_sprite_source = pygame.Rect((45, 0), (5, 4)) + blue_sprite_source = pygame.Rect((0, 40), (20, 10)) + + # Create a source image/surface. + image_source = pygame.Surface((50, 50)) + image_source.fill(YELLOW) + image_source.fill(RED, red_sprite_source) + image_source.fill(BLUE, blue_sprite_source) + + # The blue_sprite is stationary and will not reset its dirty flag. It + # will be the non-dirty sprite in this test. Its values are dependent + # on the use_source_rect flag. + blue_sprite = pygame.sprite.DirtySprite(self.LG) + + if use_source_rect: + blue_sprite.image = image_source + # The rect is a bit smaller than the source_rect to make sure + # LayeredDirty.draw() is using the correct dimensions. + blue_sprite.rect = pygame.Rect(start_pos, + (blue_sprite_source.w - 7, blue_sprite_source.h - 7)) + blue_sprite.source_rect = blue_sprite_source + start_x, start_y = blue_sprite.rect.topleft + end_x = start_x + blue_sprite.source_rect.w + end_y = start_y + blue_sprite.source_rect.h + else: + blue_sprite.image = image_source.subsurface(blue_sprite_source) + blue_sprite.rect = pygame.Rect(start_pos, blue_sprite_source.size) + start_x, start_y = blue_sprite.rect.topleft + end_x, end_y = blue_sprite.rect.bottomright + + # The red_sprite is moving and will always be dirty. + red_sprite = pygame.sprite.DirtySprite(self.LG) + red_sprite.image = image_source + red_sprite.rect = pygame.Rect(start_pos, red_sprite_source.size) + red_sprite.source_rect = red_sprite_source + red_sprite.dirty = 2 + + # Draw the red_sprite as it moves a few steps. + for _ in range(4): + red_sprite.rect.move_ip(2, 1) + + # This is the method being tested. + self.LG.draw(surface) + + # Check colors where the blue_sprite is drawn. We expect red where the + # red_sprite is drawn over the blue_sprite, but the rest should be + # blue. + surface.lock() # Lock surface for possible speed up. + try: + for y in range(start_y, end_y): + for x in range(start_x, end_x): + if red_sprite.rect.collidepoint(x, y): + expected_color = RED + else: + expected_color = BLUE + + color = surface.get_at((x, y)) + + self.assertEqual(color, expected_color, + 'pos=({}, {})'.format(x, y)) + finally: + surface.unlock() + + def test_nondirty_intersections_redrawn(self): + """Ensure non-dirty sprites are correctly redrawn + when dirty sprites intersect with them. + """ + self._nondirty_intersections_redrawn() + + def test_nondirty_intersections_redrawn__with_source_rect(self): + """Ensure non-dirty sprites using source_rects are correctly redrawn + when dirty sprites intersect with them. + + Related to issue #898. + """ + self._nondirty_intersections_redrawn(True) + + +############################### SPRITE BASE CLASS ############################## +# +# tests common between sprite classes + +class SpriteBase: + def setUp(self): + self.groups = [] + for Group in self.Groups: + self.groups.append(Group()) + + self.sprite = self.Sprite() + + def test_add_internal(self): + + for g in self.groups: + self.sprite.add_internal(g) + + for g in self.groups: + self.assertIn(g, self.sprite.groups()) + + def test_remove_internal(self): + + for g in self.groups: + self.sprite.add_internal(g) + + for g in self.groups: + self.sprite.remove_internal(g) + + for g in self.groups: + self.assertFalse(g in self.sprite.groups()) + + def test_update(self): + + class test_sprite(pygame.sprite.Sprite): + sink = [] + def __init__(self, *groups): + pygame.sprite.Sprite.__init__(self, *groups) + def update(self, *args): + self.sink += args + + s = test_sprite() + s.update(1, 2, 3) + + self.assertEqual(test_sprite.sink, [1, 2, 3]) + + def test___init____added_to_groups_passed(self): + expected_groups = sorted(self.groups, key=id) + sprite = self.Sprite(self.groups) + groups = sorted(sprite.groups(), key=id) + + self.assertListEqual(groups, expected_groups) + + def test_add(self): + expected_groups = sorted(self.groups, key=id) + self.sprite.add(self.groups) + groups = sorted(self.sprite.groups(), key=id) + + self.assertListEqual(groups, expected_groups) + + def test_alive(self): + self.assertFalse(self.sprite.alive(), + "Sprite should not be alive if in no groups") + + self.sprite.add(self.groups) + + self.assertTrue(self.sprite.alive()) + + def test_groups(self): + for i, g in enumerate(self.groups): + expected_groups = sorted(self.groups[:i+1], key=id) + self.sprite.add(g) + groups = sorted(self.sprite.groups(), key=id) + + self.assertListEqual(groups, expected_groups) + + def test_kill(self): + self.sprite.add(self.groups) + + self.assertTrue(self.sprite.alive()) + + self.sprite.kill() + + self.assertListEqual(self.sprite.groups(), []) + self.assertFalse(self.sprite.alive()) + + def test_remove(self): + self.sprite.add(self.groups) + self.sprite.remove(self.groups) + + self.assertListEqual(self.sprite.groups(), []) + + +############################## SPRITE CLASS TESTS ############################## + +class SpriteTypeTest(SpriteBase, unittest.TestCase): + Sprite = sprite.Sprite + + Groups = [ sprite.Group, + sprite.LayeredUpdates, + sprite.RenderUpdates, + sprite.OrderedUpdates, ] + +class DirtySpriteTypeTest(SpriteBase, unittest.TestCase): + Sprite = sprite.DirtySprite + + Groups = [ sprite.Group, + sprite.LayeredUpdates, + sprite.RenderUpdates, + sprite.OrderedUpdates, + sprite.LayeredDirty, ] + +############################## BUG TESTS ####################################### + +class SingleGroupBugsTest(unittest.TestCase): + def test_memoryleak_bug(self): + # For memoryleak bug posted to mailing list by Tobias Steinrücken on 16/11/10. + # Fixed in revision 2953. + + import weakref + import gc + + class MySprite(sprite.Sprite): + def __init__(self, *args, **kwargs): + sprite.Sprite.__init__(self, *args, **kwargs) + self.image = pygame.Surface( (2, 4), 0, 24 ) + self.rect = self.image.get_rect() + + g = sprite.GroupSingle() + screen = pygame.Surface((4, 8), 0, 24) + s = MySprite() + r = weakref.ref(s) + g.sprite = s + del s + gc.collect() + + self.assertIsNotNone(r()) + + g.update() + g.draw(screen) + g.sprite = MySprite() + gc.collect() + + self.assertIsNone(r()) + + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/surface_test.py b/venv/Lib/site-packages/pygame/tests/surface_test.py new file mode 100644 index 0000000..6d5a917 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/surface_test.py @@ -0,0 +1,2538 @@ +import os + +import unittest +from pygame.tests import test_utils +from pygame.tests.test_utils import ( + example_path, AssertRaisesRegexMixin, SurfaceSubclass) +try: + from pygame.tests.test_utils.arrinter import * +except (ImportError, NameError): + pass + +import pygame +from pygame.locals import * +from pygame.compat import xrange_, as_bytes, as_unicode +from pygame.bufferproxy import BufferProxy + +import platform +import gc +import weakref +import ctypes + +IS_PYPY = 'PyPy' == platform.python_implementation() + +def intify(i): + """If i is a long, cast to an int while preserving the bits""" + if 0x80000000 & i: + return int((0xFFFFFFFF & i)) + return i + +def longify(i): + """If i is an int, cast to a long while preserving the bits""" + if i < 0: + return 0xFFFFFFFF & i + return long(i) + + +class SurfaceTypeTest(AssertRaisesRegexMixin, unittest.TestCase): + def test_surface__pixel_format_as_surface_subclass(self): + """Ensure a subclassed surface can be used for pixel format + when creating a new surface.""" + expected_depth = 16 + expected_flags = SRCALPHA + expected_size = (13, 37) + depth_surface = SurfaceSubclass((11, 21), expected_flags, + expected_depth) + + surface = pygame.Surface(expected_size, 0, depth_surface) + + self.assertIsNot(surface, depth_surface) + self.assertIsInstance(surface, pygame.Surface) + self.assertNotIsInstance(surface, SurfaceSubclass) + self.assertEqual(surface.get_size(), expected_size) + self.assertEqual(surface.get_flags(), expected_flags) + self.assertEqual(surface.get_bitsize(), expected_depth) + + def test_set_clip( self ): + """ see if surface.set_clip(None) works correctly. + """ + s = pygame.Surface((800, 600)) + r = pygame.Rect(10, 10, 10, 10) + s.set_clip(r) + r.move_ip(10, 0) + s.set_clip(None) + res = s.get_clip() + # this was garbled before. + self.assertEqual(res[0], 0) + self.assertEqual(res[2], 800) + + def test_print(self): + surf = pygame.Surface((70,70), 0, 32) + self.assertEqual(repr(surf), '') + + def test_keyword_arguments(self): + surf = pygame.Surface((70,70), flags=SRCALPHA, depth=32) + self.assertEqual(surf.get_flags() & SRCALPHA, SRCALPHA) + self.assertEqual(surf.get_bitsize(), 32) + + # sanity check to make sure the check below is valid + surf_16 = pygame.Surface((70,70), 0, 16) + self.assertEqual(surf_16.get_bytesize(), 2) + + # try again with an argument list + surf_16 = pygame.Surface((70,70), depth=16) + self.assertEqual(surf_16.get_bytesize(), 2) + + def test_set_at(self): + + #24bit surfaces + s = pygame.Surface( (100, 100), 0, 24) + s.fill((0,0,0)) + + # set it with a tuple. + s.set_at((0,0), (10,10,10, 255)) + r = s.get_at((0,0)) + self.assertIsInstance(r, pygame.Color) + self.assertEqual(r, (10,10,10, 255)) + + # try setting a color with a single integer. + s.fill((0,0,0,255)) + s.set_at ((10, 1), 0x0000FF) + r = s.get_at((10,1)) + self.assertEqual(r, (0,0,255, 255)) + + + def test_SRCALPHA(self): + # has the flag been passed in ok? + surf = pygame.Surface((70,70), SRCALPHA, 32) + self.assertEqual(surf.get_flags() & SRCALPHA, SRCALPHA) + + #24bit surfaces can not have SRCALPHA. + self.assertRaises(ValueError, pygame.Surface, (100, 100), pygame.SRCALPHA, 24) + + # if we have a 32 bit surface, the SRCALPHA should have worked too. + surf2 = pygame.Surface((70,70), SRCALPHA) + if surf2.get_bitsize() == 32: + self.assertEqual(surf2.get_flags() & SRCALPHA, SRCALPHA) + + def test_masks(self): + def make_surf(bpp, flags, masks): + pygame.Surface((10, 10), flags, bpp, masks) + # With some masks SDL_CreateRGBSurface does not work properly. + masks = (0xFF000000, 0xFF0000, 0xFF00, 0) + self.assertEqual(make_surf(32, 0, masks), None) + # For 24 and 32 bit surfaces Pygame assumes no losses. + masks = (0x7F0000, 0xFF00, 0xFF, 0) + self.assertRaises(ValueError, make_surf, 24, 0, masks) + self.assertRaises(ValueError, make_surf, 32, 0, masks) + # What contiguous bits in a mask. + masks = (0x6F0000, 0xFF00, 0xFF, 0) + self.assertRaises(ValueError, make_surf, 32, 0, masks) + + def test_get_bounding_rect (self): + surf = pygame.Surface ((70, 70), SRCALPHA, 32) + surf.fill((0,0,0,0)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.width, 0) + self.assertEqual(bound_rect.height, 0) + surf.set_at((30,30),(255,255,255,1)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.left, 30) + self.assertEqual(bound_rect.top, 30) + self.assertEqual(bound_rect.width, 1) + self.assertEqual(bound_rect.height, 1) + surf.set_at((29,29),(255,255,255,1)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.left, 29) + self.assertEqual(bound_rect.top, 29) + self.assertEqual(bound_rect.width, 2) + self.assertEqual(bound_rect.height, 2) + + surf = pygame.Surface ((70, 70), 0, 24) + surf.fill((0,0,0)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.width, surf.get_width()) + self.assertEqual(bound_rect.height, surf.get_height()) + + surf.set_colorkey((0,0,0)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.width, 0) + self.assertEqual(bound_rect.height, 0) + surf.set_at((30,30),(255,255,255)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.left, 30) + self.assertEqual(bound_rect.top, 30) + self.assertEqual(bound_rect.width, 1) + self.assertEqual(bound_rect.height, 1) + surf.set_at((60,60),(255,255,255)) + bound_rect = surf.get_bounding_rect() + self.assertEqual(bound_rect.left, 30) + self.assertEqual(bound_rect.top, 30) + self.assertEqual(bound_rect.width, 31) + self.assertEqual(bound_rect.height, 31) + + # Issue #180 + pygame.display.init() + try: + surf = pygame.Surface((4, 1), 0, 8) + surf.fill((255, 255, 255)) + surf.get_bounding_rect() # Segfault. + finally: + pygame.display.quit() + + def test_copy(self): + """Ensure a surface can be copied.""" + color = (25, 25, 25, 25) + s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) + s1.fill(color) + + s2 = s1.copy() + + s1rect = s1.get_rect() + s2rect = s2.get_rect() + + self.assertEqual(s1rect.size, s2rect.size) + self.assertEqual(s2.get_at((10,10)), color) + + def test_fill(self): + """Ensure a surface can be filled.""" + color = (25, 25, 25, 25) + fill_rect = pygame.Rect(0, 0, 16, 16) + s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) + s1.fill(color, fill_rect) + + for pt in test_utils.rect_area_pts(fill_rect): + self.assertEqual(s1.get_at(pt), color) + + for pt in test_utils.rect_outer_bounds(fill_rect): + self.assertNotEqual(s1.get_at(pt), color) + + def test_fill_negative_coordinates(self): + + # negative coordinates should be clipped by fill, and not draw outside the surface. + color = (25, 25, 25, 25) + color2 = (20, 20, 20, 25) + fill_rect = pygame.Rect(-10, -10, 16, 16) + + s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) + r1 = s1.fill(color, fill_rect) + c = s1.get_at((0,0)) + self.assertEqual(c, color) + + # make subsurface in the middle to test it doesn't over write. + s2 = s1.subsurface((5, 5, 5, 5)) + r2 = s2.fill(color2, (-3, -3, 5, 5)) + c2 = s1.get_at((4,4)) + self.assertEqual(c, color) + + # rect returns the area we actually fill. + r3 = s2.fill(color2, (-30, -30, 5, 5)) + # since we are using negative coords, it should be an zero sized rect. + self.assertEqual(tuple(r3), (0, 0, 0, 0)) + + def test_fill_keyword_args(self): + """Ensure fill() accepts keyword arguments.""" + color = (1, 2, 3, 255) + area = (1, 1, 2, 2) + s1 = pygame.Surface((4, 4), 0, 32) + s1.fill(special_flags=pygame.BLEND_ADD, color=color, rect=area) + + self.assertEqual(s1.get_at((0, 0)), (0, 0, 0, 255)) + self.assertEqual(s1.get_at((1, 1)), color) + + ######################################################################## + + def test_get_alpha(self): + """Ensure a surface's alpha value can be retrieved.""" + s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) + + self.assertEqual(s1.get_alpha(), 255) + + for alpha in (0, 32, 127, 255): + s1.set_alpha(alpha) + for t in range(4): + s1.set_alpha(s1.get_alpha()) + + self.assertEqual(s1.get_alpha(), alpha) + + ######################################################################## + + def test_get_bytesize(self): + """Ensure a surface's bit and byte sizes can be retrieved.""" + depth = 32 + depth_bytes = 4 + s1 = pygame.Surface((32, 32), pygame.SRCALPHA, depth) + + self.assertEqual(s1.get_bytesize(), depth_bytes) + self.assertEqual(s1.get_bitsize(), depth) + + ######################################################################## + + def test_get_flags(self): + """Ensure a surface's flags can be retrieved.""" + s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) + + self.assertEqual(s1.get_flags(), pygame.SRCALPHA) + + ######################################################################## + + def test_get_parent(self): + """Ensure a surface's parent can be retrieved.""" + parent = pygame.Surface((16, 16)) + child = parent.subsurface((0,0,5,5)) + + self.assertIs(child.get_parent(), parent) + + ######################################################################## + + def test_get_rect(self): + """Ensure a surface's rect can be retrieved.""" + size = (16, 16) + surf = pygame.Surface(size) + rect = surf.get_rect() + + self.assertEqual(rect.size, size) + + ######################################################################## + + def test_get_width__size_and_height(self): + """Ensure a surface's size, width and height can be retrieved.""" + for w in xrange_(0, 255, 32): + for h in xrange_(0, 127, 15): + s = pygame.Surface((w, h)) + self.assertEqual(s.get_width(), w) + self.assertEqual(s.get_height(), h) + self.assertEqual(s.get_size(), (w, h)) + + def test_get_view(self): + """Ensure a buffer view of the surface's pixels can be retrieved.""" + # Check that BufferProxys are returned when array depth is supported, + # ValueErrors returned otherwise. + Error = ValueError + s = pygame.Surface((5, 7), 0, 8) + v2 = s.get_view('2') + + self.assertRaises(Error, s.get_view, '0') + self.assertRaises(Error, s.get_view, '1') + self.assertIsInstance(v2, BufferProxy) + self.assertRaises(Error, s.get_view, '3') + + s = pygame.Surface((8, 7), 0, 8) + length = s.get_bytesize() * s.get_width() * s.get_height() + v0 = s.get_view('0') + v1 = s.get_view('1') + + self.assertIsInstance(v0, BufferProxy) + self.assertEqual(v0.length, length) + self.assertIsInstance(v1, BufferProxy) + self.assertEqual(v1.length, length) + + s = pygame.Surface((5, 7), 0, 16) + v2 = s.get_view('2') + + self.assertRaises(Error, s.get_view, '0') + self.assertRaises(Error, s.get_view, '1') + self.assertIsInstance(v2, BufferProxy) + self.assertRaises(Error, s.get_view, '3') + + s = pygame.Surface((8, 7), 0, 16) + length = s.get_bytesize() * s.get_width() * s.get_height() + v0 = s.get_view('0') + v1 = s.get_view('1') + + self.assertIsInstance(v0, BufferProxy) + self.assertEqual(v0.length, length) + self.assertIsInstance(v1, BufferProxy) + self.assertEqual(v1.length, length) + + s = pygame.Surface((5, 7), pygame.SRCALPHA, 16) + v2 = s.get_view('2') + + self.assertIsInstance(v2, BufferProxy) + self.assertRaises(Error, s.get_view, '3') + + s = pygame.Surface((5, 7), 0, 24) + v2 = s.get_view('2') + v3 = s.get_view('3') + + self.assertRaises(Error, s.get_view, '0') + self.assertRaises(Error, s.get_view, '1') + self.assertIsInstance(v2, BufferProxy) + self.assertIsInstance(v3, BufferProxy) + + s = pygame.Surface((8, 7), 0, 24) + length = s.get_bytesize() * s.get_width() * s.get_height() + v0 = s.get_view('0') + v1 = s.get_view('1') + + self.assertIsInstance(v0, BufferProxy) + self.assertEqual(v0.length, length) + self.assertIsInstance(v1, BufferProxy) + self.assertEqual(v1.length, length) + + s = pygame.Surface((5, 7), 0, 32) + length = s.get_bytesize() * s.get_width() * s.get_height() + v0 = s.get_view('0') + v1 = s.get_view('1') + v2 = s.get_view('2') + v3 = s.get_view('3') + + self.assertIsInstance(v0, BufferProxy) + self.assertEqual(v0.length, length) + self.assertIsInstance(v1, BufferProxy) + self.assertEqual(v1.length, length) + self.assertIsInstance(v2, BufferProxy) + self.assertIsInstance(v3, BufferProxy) + + s2 = s.subsurface((0, 0, 4, 7)) + + self.assertRaises(Error, s2.get_view, '0') + self.assertRaises(Error, s2.get_view, '1') + + s2 = None + s = pygame.Surface((5, 7), pygame.SRCALPHA, 32) + + for kind in ('2', '3', 'a', 'A', 'r', 'R', 'g', 'G', 'b', 'B'): + self.assertIsInstance(s.get_view(kind), BufferProxy) + + # Check default argument value: '2' + s = pygame.Surface((2, 4), 0, 32) + v = s.get_view() + if not IS_PYPY: + ai = ArrayInterface(v) + self.assertEqual(ai.nd, 2) + + # Check locking. + s = pygame.Surface((2, 4), 0, 32) + + self.assertFalse(s.get_locked()) + + v = s.get_view('2') + + self.assertFalse(s.get_locked()) + + c = v.__array_interface__ + + self.assertTrue(s.get_locked()) + + c = None + gc.collect() + + self.assertTrue(s.get_locked()) + + v = None + gc.collect() + + self.assertFalse(s.get_locked()) + + # Check invalid view kind values. + s = pygame.Surface((2, 4), pygame.SRCALPHA, 32) + self.assertRaises(TypeError, s.get_view, '') + self.assertRaises(TypeError, s.get_view, '9') + self.assertRaises(TypeError, s.get_view, 'RGBA') + self.assertRaises(TypeError, s.get_view, 2) + + # Both unicode and bytes strings are allowed for kind. + s = pygame.Surface((2, 4), 0, 32) + s.get_view(as_unicode('2')) + s.get_view(as_bytes('2')) + + # Garbage collection + s = pygame.Surface((2, 4), 0, 32) + weak_s = weakref.ref(s) + v = s.get_view('3') + weak_v = weakref.ref(v) + gc.collect() + self.assertTrue(weak_s() is s) + self.assertTrue(weak_v() is v) + del v + gc.collect() + self.assertTrue(weak_s() is s) + self.assertTrue(weak_v() is None) + del s + gc.collect() + self.assertTrue(weak_s() is None) + + def test_get_buffer(self): + # Check that get_buffer works for all pixel sizes and for a subsurface. + + # Check for all pixel sizes + for bitsize in [8, 16, 24, 32]: + s = pygame.Surface((5, 7), 0, bitsize) + length = s.get_pitch() * s.get_height() + v = s.get_buffer() + + self.assertIsInstance(v, BufferProxy) + self.assertEqual(v.length, length) + self.assertEqual(repr(v), "") + + # Check for a subsurface (not contiguous) + s = pygame.Surface((7, 10), 0, 32) + s2 = s.subsurface((1, 2, 5, 7)) + length = s2.get_pitch() * s2.get_height() + v = s2.get_buffer() + + self.assertIsInstance(v, BufferProxy) + self.assertEqual(v.length, length) + + # Check locking. + s = pygame.Surface((2, 4), 0, 32) + v = s.get_buffer() + self.assertTrue(s.get_locked()) + v = None + gc.collect() + self.assertFalse(s.get_locked()) + + OLDBUF = hasattr(pygame.bufferproxy, 'get_segcount') + + @unittest.skipIf(not OLDBUF, 'old buffer not available') + def test_get_buffer_oldbuf(self): + from pygame.bufferproxy import get_segcount, get_write_buffer + + s = pygame.Surface((2, 4), pygame.SRCALPHA, 32) + v = s.get_buffer() + segcount, buflen = get_segcount(v) + self.assertEqual(segcount, 1) + self.assertEqual(buflen, s.get_pitch() * s.get_height()) + seglen, segaddr = get_write_buffer(v, 0) + self.assertEqual(segaddr, s._pixels_address) + self.assertEqual(seglen, buflen) + + @unittest.skipIf(not OLDBUF, 'old buffer not available') + def test_get_view_oldbuf(self): + from pygame.bufferproxy import get_segcount, get_write_buffer + + s = pygame.Surface((2, 4), pygame.SRCALPHA, 32) + v = s.get_view('1') + segcount, buflen = get_segcount(v) + self.assertEqual(segcount, 8) + self.assertEqual(buflen, s.get_pitch() * s.get_height()) + seglen, segaddr = get_write_buffer(v, 7) + self.assertEqual(segaddr, s._pixels_address + s.get_bytesize() * 7) + self.assertEqual(seglen, s.get_bytesize()) + + def test_set_colorkey(self): + + # __doc__ (as of 2008-06-25) for pygame.surface.Surface.set_colorkey: + + # Surface.set_colorkey(Color, flags=0): return None + # Surface.set_colorkey(None): return None + # Set the transparent colorkey + + s = pygame.Surface((16,16), pygame.SRCALPHA, 32) + + colorkeys = ((20,189,20, 255),(128,50,50,255), (23, 21, 255,255)) + + for colorkey in colorkeys: + s.set_colorkey(colorkey) + + for t in range(4): + s.set_colorkey(s.get_colorkey()) + + self.assertEqual(s.get_colorkey(), colorkey) + + def test_set_masks(self): + s = pygame.Surface((32,32)) + r,g,b,a = s.get_masks() + s.set_masks((b,g,r,a)) + r2,g2,b2,a2 = s.get_masks() + self.assertEqual((r,g,b,a), (b2,g2,r2,a2)) + + + def test_set_shifts(self): + s = pygame.Surface((32,32)) + r,g,b,a = s.get_shifts() + s.set_shifts((b,g,r,a)) + r2,g2,b2,a2 = s.get_shifts() + self.assertEqual((r,g,b,a), (b2,g2,r2,a2)) + + def test_blit_keyword_args(self): + color = (1, 2, 3, 255) + s1 = pygame.Surface((4, 4), 0, 32) + s2 = pygame.Surface((2, 2), 0, 32) + s2.fill((1, 2, 3)) + s1.blit(special_flags=BLEND_ADD, source=s2, + dest=(1, 1), area=s2.get_rect()) + self.assertEqual(s1.get_at((0, 0)), (0, 0, 0, 255)) + self.assertEqual(s1.get_at((1, 1)), color) + + def todo_test_blit(self): + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.blit: + + # Surface.blit(source, dest, area=None, special_flags = 0): return Rect + # draw one image onto another + # + # Draws a source Surface onto this Surface. The draw can be positioned + # with the dest argument. Dest can either be pair of coordinates + # representing the upper left corner of the source. A Rect can also be + # passed as the destination and the topleft corner of the rectangle + # will be used as the position for the blit. The size of the + # destination rectangle does not effect the blit. + # + # An optional area rectangle can be passed as well. This represents a + # smaller portion of the source Surface to draw. + # + # An optional special flags is for passing in new in 1.8.0: BLEND_ADD, + # BLEND_SUB, BLEND_MULT, BLEND_MIN, BLEND_MAX new in 1.8.1: + # BLEND_RGBA_ADD, BLEND_RGBA_SUB, BLEND_RGBA_MULT, BLEND_RGBA_MIN, + # BLEND_RGBA_MAX BLEND_RGB_ADD, BLEND_RGB_SUB, BLEND_RGB_MULT, + # BLEND_RGB_MIN, BLEND_RGB_MAX With other special blitting flags + # perhaps added in the future. + # + # The return rectangle is the area of the affected pixels, excluding + # any pixels outside the destination Surface, or outside the clipping + # area. + # + # Pixel alphas will be ignored when blitting to an 8 bit Surface. + # special_flags new in pygame 1.8. + + self.fail() + + def test_blit__SRCALPHA_opaque_source(self): + src = pygame.Surface( (256,256), SRCALPHA ,32) + dst = src.copy() + + for i, j in test_utils.rect_area_pts(src.get_rect()): + dst.set_at( (i,j), (i,0,0,j) ) + src.set_at( (i,j), (0,i,0,255) ) + + dst.blit(src, (0,0)) + + for pt in test_utils.rect_area_pts(src.get_rect()): + self.assertEqual(dst.get_at(pt)[1], src.get_at(pt)[1]) + + def todo_test_blit__blit_to_self(self): #TODO + src = pygame.Surface( (256,256), SRCALPHA, 32) + rect = src.get_rect() + + for pt, color in test_utils.gradient(rect.width, rect.height): + src.set_at(pt, color) + + src.blit(src, (0, 0)) + + def todo_test_blit__SRCALPHA_to_SRCALPHA_non_zero(self): #TODO + # " There is no unit test for blitting a SRCALPHA source with non-zero + # alpha to a SRCALPHA destination with non-zero alpha " LL + + w,h = size = 32,32 + + s = pygame.Surface(size, pygame.SRCALPHA, 32) + s2 = s.copy() + + s.fill((32,32,32,111)) + s2.fill((32,32,32,31)) + + s.blit(s2, (0,0)) + + # TODO: + # what is the correct behaviour ?? should it blend? what algorithm? + + self.assertEqual(s.get_at((0,0)), (32,32,32,31)) + + def test_blit__SRCALPHA32_to_8(self): + # Bug: fatal + # SDL_DisplayConvert segfaults when video is uninitialized. + target = pygame.Surface((11, 8), 0, 8) + color = target.get_palette_at(2) + source = pygame.Surface((1, 1), pygame.SRCALPHA, 32) + source.set_at((0, 0), color) + target.blit(source, (0, 0)) + + @unittest.skipIf(os.environ.get('SDL_VIDEODRIVER') == 'dummy', + 'requires a non-"dummy" SDL_VIDEODRIVER') + def test_image_convert_bug_131(self): + # Bitbucket bug #131: Unable to Surface.convert(32) some 1-bit images. + # https://bitbucket.org/pygame/pygame/issue/131/unable-to-surfaceconvert-32-some-1-bit + + pygame.display.init() + try: + pygame.display.set_mode((640,480)) + + im = pygame.image.load(example_path( + os.path.join("data", "city.png"))) + im2 = pygame.image.load(example_path( + os.path.join("data", "brick.png"))) + + self.assertEqual(im.get_palette(), + ((0, 0, 0, 255), (255, 255, 255, 255))) + self.assertEqual(im2.get_palette(), + ((0, 0, 0, 255), (0, 0, 0, 255))) + + self.assertEqual(repr(im.convert(32)), '') + self.assertEqual(repr(im2.convert(32)), '') + + # Ensure a palette format to palette format works. + im3 = im.convert(8) + self.assertEqual(repr(im3), '') + self.assertEqual(im3.get_palette(), im.get_palette()) + + finally: + pygame.display.quit() + + def test_convert_init(self): + """ Ensure initialization exceptions are raised + for surf.convert().""" + pygame.display.quit() + surf = pygame.Surface((1, 1)) + + self.assertRaisesRegex(pygame.error, 'display initialized', + surf.convert) + + pygame.display.init() + try: + if os.environ.get('SDL_VIDEODRIVER') != 'dummy': + try: + surf.convert(32) + surf.convert(pygame.Surface((1, 1))) + except pygame.error: + self.fail("convert() should not raise an exception here.") + + self.assertRaisesRegex(pygame.error, 'No video mode', + surf.convert) + + pygame.display.set_mode((640,480)) + try: + surf.convert() + except pygame.error: + self.fail("convert() should not raise an exception here.") + finally: + pygame.display.quit() + + def test_convert_alpha_init(self): + """ Ensure initialization exceptions are raised + for surf.convert_alpha().""" + pygame.display.quit() + surf = pygame.Surface((1, 1)) + + self.assertRaisesRegex(pygame.error, 'display initialized', + surf.convert_alpha) + + pygame.display.init() + try: + self.assertRaisesRegex(pygame.error, 'No video mode', + surf.convert_alpha) + + pygame.display.set_mode((640,480)) + try: + surf.convert_alpha() + except pygame.error: + self.fail("convert_alpha() should not raise an exception here.") + finally: + pygame.display.quit() + + def todo_test_convert(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.convert: + + # Surface.convert(Surface): return Surface + # Surface.convert(depth, flags=0): return Surface + # Surface.convert(masks, flags=0): return Surface + # Surface.convert(): return Surface + # change the pixel format of an image + # + # Creates a new copy of the Surface with the pixel format changed. The + # new pixel format can be determined from another existing Surface. + # Otherwise depth, flags, and masks arguments can be used, similar to + # the pygame.Surface() call. + # + # If no arguments are passed the new Surface will have the same pixel + # format as the display Surface. This is always the fastest format for + # blitting. It is a good idea to convert all Surfaces before they are + # blitted many times. + # + # The converted Surface will have no pixel alphas. They will be + # stripped if the original had them. See Surface.convert_alpha() for + # preserving or creating per-pixel alphas. + # + + self.fail() + + def test_convert__pixel_format_as_surface_subclass(self): + """Ensure convert accepts a Surface subclass argument.""" + expected_size = (23, 17) + convert_surface = SurfaceSubclass(expected_size, 0, 32) + depth_surface = SurfaceSubclass((31, 61), 0, 32) + + pygame.display.init() + try: + surface = convert_surface.convert(depth_surface) + + self.assertIsNot(surface, depth_surface) + self.assertIsNot(surface, convert_surface) + self.assertIsInstance(surface, pygame.Surface) + self.assertIsInstance(surface, SurfaceSubclass) + self.assertEqual(surface.get_size(), expected_size) + finally: + pygame.display.quit() + + def todo_test_convert_alpha(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.convert_alpha: + + # Surface.convert_alpha(Surface): return Surface + # Surface.convert_alpha(): return Surface + # change the pixel format of an image including per pixel alphas + # + # Creates a new copy of the surface with the desired pixel format. The + # new surface will be in a format suited for quick blitting to the + # given format with per pixel alpha. If no surface is given, the new + # surface will be optimized for blitting to the current display. + # + # Unlike the Surface.convert() method, the pixel format for the new + # image will not be exactly the same as the requested source, but it + # will be optimized for fast alpha blitting to the destination. + # + + self.fail() + + def test_convert_alpha__pixel_format_as_surface_subclass(self): + """Ensure convert_alpha accepts a Surface subclass argument.""" + expected_size = (23, 17) + convert_surface = SurfaceSubclass(expected_size, SRCALPHA, 32) + depth_surface = SurfaceSubclass((31, 57), SRCALPHA, 32) + + pygame.display.init() + try: + pygame.display.set_mode((60, 60)) + + # This is accepted as an argument, but its values are ignored. + # See issue #599. + surface = convert_surface.convert_alpha(depth_surface) + + self.assertIsNot(surface, depth_surface) + self.assertIsNot(surface, convert_surface) + self.assertIsInstance(surface, pygame.Surface) + self.assertIsInstance(surface, SurfaceSubclass) + self.assertEqual(surface.get_size(), expected_size) + finally: + pygame.display.quit() + + def todo_test_get_abs_offset(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_abs_offset: + + # Surface.get_abs_offset(): return (x, y) + # find the absolute position of a child subsurface inside its top level parent + # + # Get the offset position of a child subsurface inside of its top + # level parent Surface. If the Surface is not a subsurface this will + # return (0, 0). + # + + self.fail() + + def todo_test_get_abs_parent(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_abs_parent: + + # Surface.get_abs_parent(): return Surface + # find the top level parent of a subsurface + # + # Returns the parent Surface of a subsurface. If this is not a + # subsurface then this surface will be returned. + # + + self.fail() + + def test_get_at(self): + surf = pygame.Surface((2, 2), 0, 24) + c00 = pygame.Color(1, 2, 3) + c01 = pygame.Color(5, 10, 15) + c10 = pygame.Color(100, 50, 0) + c11 = pygame.Color(4, 5, 6) + surf.set_at((0, 0), c00) + surf.set_at((0, 1), c01) + surf.set_at((1, 0), c10) + surf.set_at((1, 1), c11) + c = surf.get_at((0, 0)) + self.assertIsInstance(c, pygame.Color) + self.assertEqual(c, c00) + self.assertEqual(surf.get_at((0, 1)), c01) + self.assertEqual(surf.get_at((1, 0)), c10) + self.assertEqual(surf.get_at((1, 1)), c11) + for p in [(-1, 0), (0, -1), (2, 0), (0, 2)]: + self.assertRaises(IndexError, surf.get_at, p) + + def test_get_at_mapped(self): + color = pygame.Color(10, 20, 30) + for bitsize in [8, 16, 24, 32]: + surf = pygame.Surface((2, 2), 0, bitsize) + surf.fill(color) + pixel = surf.get_at_mapped((0, 0)) + self.assertEqual(pixel, surf.map_rgb(color), + "%i != %i, bitsize: %i" % + (pixel, surf.map_rgb(color), bitsize)) + + def todo_test_get_bitsize(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_bitsize: + + # Surface.get_bitsize(): return int + # get the bit depth of the Surface pixel format + # + # Returns the number of bits used to represent each pixel. This value + # may not exactly fill the number of bytes used per pixel. For example + # a 15 bit Surface still requires a full 2 bytes. + # + + self.fail() + + def todo_test_get_clip(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_clip: + + # Surface.get_clip(): return Rect + # get the current clipping area of the Surface + # + # Return a rectangle of the current clipping area. The Surface will + # always return a valid rectangle that will never be outside the + # bounds of the image. If the Surface has had None set for the + # clipping area, the Surface will return a rectangle with the full + # area of the Surface. + # + + self.fail() + + def todo_test_get_colorkey(self): + surf = pygame.surface((2, 2), 0, 24) + self.assertIsNone(surf.get_colorykey()) + colorkey = pygame.Color(20, 40, 60) + surf.set_colorkey(colorkey) + ck = surf.get_colorkey() + self.assertIsInstance(ck, pygame.Color) + self.assertEqual(ck, colorkey) + + def todo_test_get_height(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_height: + + # Surface.get_height(): return height + # get the height of the Surface + # + # Return the height of the Surface in pixels. + + self.fail() + + def todo_test_get_locked(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_locked: + + # Surface.get_locked(): return bool + # test if the Surface is current locked + # + # Returns True when the Surface is locked. It doesn't matter how many + # times the Surface is locked. + # + + self.fail() + + def todo_test_get_locks(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_locks: + + # Surface.get_locks(): return tuple + # Gets the locks for the Surface + # + # Returns the currently existing locks for the Surface. + + self.fail() + + def todo_test_get_losses(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_losses: + + # Surface.get_losses(): return (R, G, B, A) + # the significant bits used to convert between a color and a mapped integer + # + # Return the least significant number of bits stripped from each color + # in a mapped integer. + # + # This value is not needed for normal Pygame usage. + + self.fail() + + def todo_test_get_masks(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_masks: + + # Surface.get_masks(): return (R, G, B, A) + # the bitmasks needed to convert between a color and a mapped integer + # + # Returns the bitmasks used to isolate each color in a mapped integer. + # This value is not needed for normal Pygame usage. + + self.fail() + + def todo_test_get_offset(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_offset: + + # Surface.get_offset(): return (x, y) + # find the position of a child subsurface inside a parent + # + # Get the offset position of a child subsurface inside of a parent. If + # the Surface is not a subsurface this will return (0, 0). + # + + self.fail() + + def test_get_palette(self): + pygame.display.init() + try: + palette = [Color(i, i, i) for i in range(256)] + pygame.display.set_mode((100, 50)) + surf = pygame.Surface((2, 2), 0, 8) + surf.set_palette(palette) + palette2 = surf.get_palette() + r,g,b = palette2[0] + + self.assertEqual(len(palette2), len(palette)) + for c2, c in zip(palette2, palette): + self.assertEqual(c2, c) + for c in palette2: + self.assertIsInstance(c, pygame.Color) + finally: + pygame.display.quit() + + def test_get_palette_at(self): + # See also test_get_palette + pygame.display.init() + try: + pygame.display.set_mode((100, 50)) + surf = pygame.Surface((2, 2), 0, 8) + color = pygame.Color(1, 2, 3, 255) + surf.set_palette_at(0, color) + color2 = surf.get_palette_at(0) + self.assertIsInstance(color2, pygame.Color) + self.assertEqual(color2, color) + self.assertRaises(IndexError, surf.get_palette_at, -1) + self.assertRaises(IndexError, surf.get_palette_at, 256) + finally: + pygame.display.quit() + + def todo_test_get_pitch(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_pitch: + + # Surface.get_pitch(): return int + # get the number of bytes used per Surface row + # + # Return the number of bytes separating each row in the Surface. + # Surfaces in video memory are not always linearly packed. Subsurfaces + # will also have a larger pitch than their real width. + # + # This value is not needed for normal Pygame usage. + + self.fail() + + def todo_test_get_shifts(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_shifts: + + # Surface.get_shifts(): return (R, G, B, A) + # the bit shifts needed to convert between a color and a mapped integer + # + # Returns the pixel shifts need to convert between each color and a + # mapped integer. + # + # This value is not needed for normal Pygame usage. + + self.fail() + + def todo_test_get_size(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_size: + + # Surface.get_size(): return (width, height) + # get the dimensions of the Surface + # + # Return the width and height of the Surface in pixels. + + self.fail() + + def todo_test_lock(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.lock: + + # Surface.lock(): return None + # lock the Surface memory for pixel access + # + # Lock the pixel data of a Surface for access. On accelerated + # Surfaces, the pixel data may be stored in volatile video memory or + # nonlinear compressed forms. When a Surface is locked the pixel + # memory becomes available to access by regular software. Code that + # reads or writes pixel values will need the Surface to be locked. + # + # Surfaces should not remain locked for more than necessary. A locked + # Surface can often not be displayed or managed by Pygame. + # + # Not all Surfaces require locking. The Surface.mustlock() method can + # determine if it is actually required. There is no performance + # penalty for locking and unlocking a Surface that does not need it. + # + # All pygame functions will automatically lock and unlock the Surface + # data as needed. If a section of code is going to make calls that + # will repeatedly lock and unlock the Surface many times, it can be + # helpful to wrap the block inside a lock and unlock pair. + # + # It is safe to nest locking and unlocking calls. The surface will + # only be unlocked after the final lock is released. + # + + self.fail() + + def test_map_rgb(self): + color = Color(0, 128, 255, 64) + surf = pygame.Surface((5, 5), SRCALPHA, 32) + c = surf.map_rgb(color) + self.assertEqual(surf.unmap_rgb(c), color) + + self.assertEqual(surf.get_at((0, 0)), (0, 0, 0, 0)) + surf.fill(c) + self.assertEqual(surf.get_at((0, 0)), color) + + surf.fill((0, 0, 0, 0)) + self.assertEqual(surf.get_at((0, 0)), (0, 0, 0, 0)) + surf.set_at((0, 0), c) + self.assertEqual(surf.get_at((0, 0)), color) + + def todo_test_mustlock(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.mustlock: + + # Surface.mustlock(): return bool + # test if the Surface requires locking + # + # Returns True if the Surface is required to be locked to access pixel + # data. Usually pure software Surfaces do not require locking. This + # method is rarely needed, since it is safe and quickest to just lock + # all Surfaces as needed. + # + # All pygame functions will automatically lock and unlock the Surface + # data as needed. If a section of code is going to make calls that + # will repeatedly lock and unlock the Surface many times, it can be + # helpful to wrap the block inside a lock and unlock pair. + # + + self.fail() + + def test_set_alpha_none(self): + """surf.set_alpha(None) disables blending""" + s = pygame.Surface((1,1), SRCALPHA, 32) + s.fill((0, 255, 0, 128)) + s.set_alpha(None) + self.assertEqual(None, s.get_alpha()) + + s2 = pygame.Surface((1,1), SRCALPHA, 32) + s2.fill((255, 0, 0, 255)) + s2.blit(s, (0, 0)) + self.assertEqual(s2.get_at((0, 0))[0], 0, "the red component should be 0") + + def test_set_alpha_value(self): + """surf.set_alpha(x), where x != None, enables blending""" + s = pygame.Surface((1,1), SRCALPHA, 32) + s.fill((0, 255, 0, 128)) + s.set_alpha(255) + + s2 = pygame.Surface((1,1), SRCALPHA, 32) + s2.fill((255, 0, 0, 255)) + s2.blit(s, (0, 0)) + self.assertGreater(s2.get_at((0, 0))[0], 0, "the red component should be above 0") + + def test_palette_colorkey(self): + """ test bug discovered by robertpfeiffer + https://github.com/pygame/pygame/issues/721 + """ + surf = pygame.image.load(example_path(os.path.join("data", "alien2.png"))) + key = surf.get_colorkey() + self.assertEqual(surf.get_palette()[surf.map_rgb(key)], key) + + def test_palette_colorkey_set_px(self): + surf = pygame.image.load(example_path(os.path.join("data", "alien2.png"))) + key = surf.get_colorkey() + surf.set_at((0, 0), key) + self.assertEqual(surf.get_at((0, 0)), key) + + def test_palette_colorkey_fill(self): + surf = pygame.image.load(example_path(os.path.join("data", "alien2.png"))) + key = surf.get_colorkey() + surf.fill(key) + self.assertEqual(surf.get_at((0, 0)), key) + + def test_set_palette(self): + palette = [pygame.Color(i, i, i) for i in range(256)] + palette[10] = tuple(palette[10]) # 4 element tuple + palette[11] = tuple(palette[11])[0:3] # 3 element tuple + + surf = pygame.Surface((2, 2), 0, 8) + pygame.display.init() + try: + pygame.display.set_mode((100, 50)) + surf.set_palette(palette) + for i in range(256): + self.assertEqual(surf.map_rgb(palette[i]), i, + "palette color %i" % (i,)) + c = palette[i] + surf.fill(c) + self.assertEqual(surf.get_at((0, 0)), c, + "palette color %i" % (i,)) + for i in range(10): + palette[i] = pygame.Color(255 - i, 0, 0) + surf.set_palette(palette[0:10]) + for i in range(256): + self.assertEqual(surf.map_rgb(palette[i]), i, + "palette color %i" % (i,)) + c = palette[i] + surf.fill(c) + self.assertEqual(surf.get_at((0, 0)), c, + "palette color %i" % (i,)) + self.assertRaises(ValueError, surf.set_palette, + [Color(1, 2, 3, 254)]) + self.assertRaises(ValueError, surf.set_palette, + (1, 2, 3, 254)) + finally: + pygame.display.quit() + + def test_set_palette__fail(self): + pygame.init() + palette = 256 * [(10, 20, 30)] + surf = pygame.Surface((2, 2), 0, 32) + self.assertRaises(pygame.error, surf.set_palette, palette) + pygame.quit() + + def test_set_palette_at(self): + pygame.display.init() + try: + pygame.display.set_mode((100, 50)) + surf = pygame.Surface((2, 2), 0, 8) + original = surf.get_palette_at(10) + replacement = Color(1, 1, 1, 255) + if replacement == original: + replacement = Color(2, 2, 2, 255) + surf.set_palette_at(10, replacement) + self.assertEqual(surf.get_palette_at(10), replacement) + next = tuple(original) + surf.set_palette_at(10, next) + self.assertEqual(surf.get_palette_at(10), next) + next = tuple(original)[0:3] + surf.set_palette_at(10, next) + self.assertEqual(surf.get_palette_at(10), next) + self.assertRaises(IndexError, + surf.set_palette_at, + 256, replacement) + self.assertRaises(IndexError, + surf.set_palette_at, + -1, replacement) + finally: + pygame.display.quit() + + def test_subsurface(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.subsurface: + + # Surface.subsurface(Rect): return Surface + # create a new surface that references its parent + # + # Returns a new Surface that shares its pixels with its new parent. + # The new Surface is considered a child of the original. Modifications + # to either Surface pixels will effect each other. Surface information + # like clipping area and color keys are unique to each Surface. + # + # The new Surface will inherit the palette, color key, and alpha + # settings from its parent. + # + # It is possible to have any number of subsurfaces and subsubsurfaces + # on the parent. It is also possible to subsurface the display Surface + # if the display mode is not hardware accelerated. + # + # See the Surface.get_offset(), Surface.get_parent() to learn more + # about the state of a subsurface. + # + + surf = pygame.Surface((16, 16)) + s = surf.subsurface(0,0,1,1) + s = surf.subsurface((0,0,1,1)) + + #s = surf.subsurface((0,0,1,1), 1) + # This form is not acceptable. + #s = surf.subsurface(0,0,10,10, 1) + + self.assertRaises(ValueError, surf.subsurface, (0,0,1,1,666)) + + + self.assertEqual(s.get_shifts(), surf.get_shifts()) + self.assertEqual(s.get_masks(), surf.get_masks()) + self.assertEqual(s.get_losses(), surf.get_losses()) + + # Issue 2 at Bitbucket.org/pygame/pygame + surf = pygame.Surface.__new__(pygame.Surface) + self.assertRaises(pygame.error, surf.subsurface, (0, 0, 0, 0)) + + def todo_test_unlock(self): + + # __doc__ (as of 2008-08-02) for pygame.surface.Surface.unlock: + + # Surface.unlock(): return None + # unlock the Surface memory from pixel access + # + # Unlock the Surface pixel data after it has been locked. The unlocked + # Surface can once again be drawn and managed by Pygame. See the + # Surface.lock() documentation for more details. + # + # All pygame functions will automatically lock and unlock the Surface + # data as needed. If a section of code is going to make calls that + # will repeatedly lock and unlock the Surface many times, it can be + # helpful to wrap the block inside a lock and unlock pair. + # + # It is safe to nest locking and unlocking calls. The surface will + # only be unlocked after the final lock is released. + # + + self.fail() + + def test_unmap_rgb(self): + # Special case, 8 bit-per-pixel surface (has a palette). + surf = pygame.Surface((2, 2), 0, 8) + c = (1, 1, 1) # Unlikely to be in a default palette. + i = 67 + pygame.display.init() + try: + pygame.display.set_mode((100, 50)) + surf.set_palette_at(i, c) + unmapped_c = surf.unmap_rgb(i) + self.assertEqual(unmapped_c, c) + # Confirm it is a Color instance + self.assertIsInstance(unmapped_c, pygame.Color) + finally: + pygame.display.quit() + + # Remaining, non-pallete, cases. + c = (128, 64, 12, 255) + formats = [(0, 16), (0, 24), (0, 32), + (SRCALPHA, 16), (SRCALPHA, 32)] + for flags, bitsize in formats: + surf = pygame.Surface((2, 2), flags, bitsize) + unmapped_c = surf.unmap_rgb(surf.map_rgb(c)) + surf.fill(c) + comparison_c = surf.get_at((0, 0)) + self.assertEqual(unmapped_c, comparison_c, + "%s != %s, flags: %i, bitsize: %i" % + (unmapped_c, comparison_c, flags, bitsize)) + # Confirm it is a Color instance + self.assertIsInstance(unmapped_c, pygame.Color) + + def test_scroll(self): + scrolls = [(8, 2, 3), + (16, 2, 3), + (24, 2, 3), + (32, 2, 3), + (32, -1, -3), + (32, 0, 0), + (32, 11, 0), + (32, 0, 11), + (32, -11, 0), + (32, 0, -11), + (32, -11, 2), + (32, 2, -11)] + for bitsize, dx, dy in scrolls: + surf = pygame.Surface((10, 10), 0, bitsize) + surf.fill((255, 0, 0)) + surf.fill((0, 255, 0), (2, 2, 2, 2,)) + comp = surf.copy() + comp.blit(surf, (dx, dy)) + surf.scroll(dx, dy) + w, h = surf.get_size() + for x in range(w): + for y in range(h): + self.assertEqual(surf.get_at((x, y)), + comp.get_at((x, y)), + "%s != %s, bpp:, %i, x: %i, y: %i" % + (surf.get_at((x, y)), + comp.get_at((x, y)), + bitsize, dx, dy)) + # Confirm clip rect containment + surf = pygame.Surface((20, 13), 0, 32) + surf.fill((255, 0, 0)) + surf.fill((0, 255, 0), (7, 1, 6, 6)) + comp = surf.copy() + clip = Rect(3, 1, 8, 14) + surf.set_clip(clip) + comp.set_clip(clip) + comp.blit(surf, (clip.x + 2, clip.y + 3), surf.get_clip()) + surf.scroll(2, 3) + w, h = surf.get_size() + for x in range(w): + for y in range(h): + self.assertEqual(surf.get_at((x, y)), + comp.get_at((x, y))) + # Confirm keyword arguments and per-pixel alpha + spot_color = (0, 255, 0, 128) + surf = pygame.Surface((4, 4), pygame.SRCALPHA, 32) + surf.fill((255, 0, 0, 255)) + surf.set_at((1, 1), spot_color) + surf.scroll(dx=1) + self.assertEqual(surf.get_at((2, 1)), spot_color) + surf.scroll(dy=1) + self.assertEqual(surf.get_at((2, 2)), spot_color) + surf.scroll(dy=1, dx=1) + self.assertEqual(surf.get_at((3, 3)), spot_color) + surf.scroll(dx=-3, dy=-3) + self.assertEqual(surf.get_at((0, 0)), spot_color) + + +class SurfaceSubtypeTest(unittest.TestCase): + """Issue #280: Methods that return a new Surface preserve subclasses""" + + def setUp(self): + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + def test_copy(self): + """Ensure method copy() preserves the surface's class + + When Surface is subclassed, the inherited copy() method will return + instances of the subclass. Non Surface fields are uncopied, however. + This includes instance attributes. + """ + expected_size = (32, 32) + ms1 = SurfaceSubclass(expected_size, SRCALPHA, 32) + ms2 = ms1.copy() + + self.assertIsNot(ms1, ms2) + self.assertIsInstance(ms1, pygame.Surface) + self.assertIsInstance(ms2, pygame.Surface) + self.assertIsInstance(ms1, SurfaceSubclass) + self.assertIsInstance(ms2, SurfaceSubclass) + self.assertTrue(ms1.test_attribute) + self.assertRaises(AttributeError, getattr, ms2, "test_attribute") + self.assertEqual(ms2.get_size(), expected_size) + + def test_convert(self): + """Ensure method convert() preserves the surface's class + + When Surface is subclassed, the inherited convert() method will return + instances of the subclass. Non Surface fields are omitted, however. + This includes instance attributes. + """ + expected_size = (32, 32) + ms1 = SurfaceSubclass(expected_size, 0, 24) + ms2 = ms1.convert(24) + + self.assertIsNot(ms1, ms2) + self.assertIsInstance(ms1, pygame.Surface) + self.assertIsInstance(ms2, pygame.Surface) + self.assertIsInstance(ms1, SurfaceSubclass) + self.assertIsInstance(ms2, SurfaceSubclass) + self.assertTrue(ms1.test_attribute) + self.assertRaises(AttributeError, getattr, ms2, "test_attribute") + self.assertEqual(ms2.get_size(), expected_size) + + def test_convert_alpha(self): + """Ensure method convert_alpha() preserves the surface's class + + When Surface is subclassed, the inherited convert_alpha() method will + return instances of the subclass. Non Surface fields are omitted, + however. This includes instance attributes. + """ + pygame.display.set_mode((40, 40)) + expected_size = (32, 32) + s = pygame.Surface(expected_size, SRCALPHA, 16) + ms1 = SurfaceSubclass(expected_size, SRCALPHA, 32) + ms2 = ms1.convert_alpha(s) + + self.assertIsNot(ms1, ms2) + self.assertIsInstance(ms1, pygame.Surface) + self.assertIsInstance(ms2, pygame.Surface) + self.assertIsInstance(ms1, SurfaceSubclass) + self.assertIsInstance(ms2, SurfaceSubclass) + self.assertTrue(ms1.test_attribute) + self.assertRaises(AttributeError, getattr, ms2, "test_attribute") + self.assertEqual(ms2.get_size(), expected_size) + + def test_subsurface(self): + """Ensure method subsurface() preserves the surface's class + + When Surface is subclassed, the inherited subsurface() method will + return instances of the subclass. Non Surface fields are uncopied, + however. This includes instance attributes. + """ + expected_size = (10, 12) + ms1 = SurfaceSubclass((32, 32), SRCALPHA, 32) + ms2 = ms1.subsurface((4, 5), expected_size) + + self.assertIsNot(ms1, ms2) + self.assertIsInstance(ms1, pygame.Surface) + self.assertIsInstance(ms2, pygame.Surface) + self.assertIsInstance(ms1, SurfaceSubclass) + self.assertIsInstance(ms2, SurfaceSubclass) + self.assertTrue(ms1.test_attribute) + self.assertRaises(AttributeError, getattr, ms2, "test_attribute") + self.assertEqual(ms2.get_size(), expected_size) + + +class SurfaceGetBufferTest(unittest.TestCase): + + # These tests requires ctypes. They are disabled if ctypes + # is not installed. + # + try: + ArrayInterface + except NameError: + __tags__ = ('ignore', 'subprocess_ignore') + + lilendian = pygame.get_sdl_byteorder() == pygame.LIL_ENDIAN + + def _check_interface_2D(self, s): + s_w, s_h = s.get_size() + s_bytesize = s.get_bytesize(); + s_pitch = s.get_pitch() + s_pixels = s._pixels_address + + # check the array interface structure fields. + v = s.get_view('2') + if not IS_PYPY: + flags = PAI_ALIGNED | PAI_NOTSWAPPED | PAI_WRITEABLE + if (s.get_pitch() == s_w * s_bytesize): + flags |= PAI_FORTRAN + + inter = ArrayInterface(v) + + self.assertEqual(inter.two, 2) + self.assertEqual(inter.nd, 2) + self.assertEqual(inter.typekind, 'u') + self.assertEqual(inter.itemsize, s_bytesize) + self.assertEqual(inter.shape[0], s_w) + self.assertEqual(inter.shape[1], s_h) + self.assertEqual(inter.strides[0], s_bytesize) + self.assertEqual(inter.strides[1], s_pitch) + self.assertEqual(inter.flags, flags) + self.assertEqual(inter.data, s_pixels); + + def _check_interface_3D(self, s): + s_w, s_h = s.get_size() + s_bytesize = s.get_bytesize(); + s_pitch = s.get_pitch() + s_pixels = s._pixels_address + s_shifts = list(s.get_shifts()) + + # Check for RGB or BGR surface. + if s_shifts[0:3] == [0, 8, 16]: + if self.lilendian: + # RGB + offset = 0 + step = 1 + else: + # BGR + offset = s_bytesize - 1 + step = -1 + elif s_shifts[0:3] == [8, 16, 24]: + if self.lilendian: + # xRGB + offset = 1 + step = 1 + else: + # BGRx + offset = s_bytesize - 2 + step = -1 + elif s_shifts[0:3] == [16, 8, 0]: + if self.lilendian: + # BGR + offset = 2 + step = -1 + else: + # RGB + offset = s_bytesize - 3 + step = 1 + elif s_shifts[0:3] == [24, 16, 8]: + if self.lilendian: + # BGRx + offset = 2 + step = -1 + else: + # RGBx + offset = s_bytesize - 4 + step = -1 + else: + return + + # check the array interface structure fields. + v = s.get_view('3') + if not IS_PYPY: + inter = ArrayInterface(v) + flags = PAI_ALIGNED | PAI_NOTSWAPPED | PAI_WRITEABLE + self.assertEqual(inter.two, 2) + self.assertEqual(inter.nd, 3) + self.assertEqual(inter.typekind, 'u') + self.assertEqual(inter.itemsize, 1) + self.assertEqual(inter.shape[0], s_w) + self.assertEqual(inter.shape[1], s_h) + self.assertEqual(inter.shape[2], 3) + self.assertEqual(inter.strides[0], s_bytesize) + self.assertEqual(inter.strides[1], s_pitch) + self.assertEqual(inter.strides[2], step) + self.assertEqual(inter.flags, flags) + self.assertEqual(inter.data, s_pixels + offset); + + def _check_interface_rgba(self, s, plane): + s_w, s_h = s.get_size() + s_bytesize = s.get_bytesize(); + s_pitch = s.get_pitch() + s_pixels = s._pixels_address + s_shifts = s.get_shifts() + s_masks = s.get_masks() + + # Find the color plane position within the pixel. + if not s_masks[plane]: + return + alpha_shift = s_shifts[plane] + offset = alpha_shift // 8 + if not self.lilendian: + offset = s_bytesize - offset - 1 + + # check the array interface structure fields. + v = s.get_view('rgba'[plane]) + if not IS_PYPY: + inter = ArrayInterface(v) + flags = PAI_ALIGNED | PAI_NOTSWAPPED | PAI_WRITEABLE + self.assertEqual(inter.two, 2) + self.assertEqual(inter.nd, 2) + self.assertEqual(inter.typekind, 'u') + self.assertEqual(inter.itemsize, 1) + self.assertEqual(inter.shape[0], s_w) + self.assertEqual(inter.shape[1], s_h) + self.assertEqual(inter.strides[0], s_bytesize) + self.assertEqual(inter.strides[1], s_pitch) + self.assertEqual(inter.flags, flags) + self.assertEqual(inter.data, s_pixels + offset); + + def test_array_interface(self): + self._check_interface_2D(pygame.Surface((5, 7), 0, 8)) + self._check_interface_2D(pygame.Surface((5, 7), 0, 16)) + self._check_interface_2D(pygame.Surface((5, 7), pygame.SRCALPHA, 16)) + self._check_interface_3D(pygame.Surface((5, 7), 0, 24)) + self._check_interface_3D(pygame.Surface((8, 4), 0, 24)) # No gaps + self._check_interface_2D(pygame.Surface((5, 7), 0, 32)) + self._check_interface_3D(pygame.Surface((5, 7), 0, 32)) + self._check_interface_2D(pygame.Surface((5, 7), pygame.SRCALPHA, 32)) + self._check_interface_3D(pygame.Surface((5, 7), pygame.SRCALPHA, 32)) + + def test_array_interface_masks(self): + """Test non-default color byte orders on 3D views""" + + sz = (5, 7) + # Reversed RGB byte order + s = pygame.Surface(sz, 0, 32) + s_masks = list(s.get_masks()) + masks = [0xff, 0xff00, 0xff0000] + if s_masks[0:3] == masks or s_masks[0:3] == masks[::-1]: + masks = s_masks[2::-1] + s_masks[3:4] + self._check_interface_3D(pygame.Surface(sz, 0, 32, masks)) + s = pygame.Surface(sz, 0, 24) + s_masks = list(s.get_masks()) + masks = [0xff, 0xff00, 0xff0000] + if s_masks[0:3] == masks or s_masks[0:3] == masks[::-1]: + masks = s_masks[2::-1] + s_masks[3:4] + self._check_interface_3D(pygame.Surface(sz, 0, 24, masks)) + + masks = [0xff00, 0xff0000, 0xff000000, 0] + self._check_interface_3D(pygame.Surface(sz, 0, 32, masks)) + + # Unsupported RGB byte orders + if pygame.get_sdl_version()[0] == 1: + # Invalid mask values with SDL2 + masks = [0xff00, 0xff, 0xff0000, 0] + self.assertRaises(ValueError, + pygame.Surface(sz, 0, 24, masks).get_view, '3') + + def test_array_interface_alpha(self): + for shifts in [[0, 8, 16, 24], [8, 16, 24, 0], + [24, 16, 8, 0], [16, 8, 0, 24]]: + masks = [0xff << s for s in shifts] + s = pygame.Surface((4, 2), pygame.SRCALPHA, 32, masks) + self._check_interface_rgba(s, 3) + + def test_array_interface_rgb(self): + for shifts in [[0, 8, 16, 24], [8, 16, 24, 0], + [24, 16, 8, 0], [16, 8, 0, 24]]: + masks = [0xff << s for s in shifts] + masks[3] = 0 + for plane in range(3): + s = pygame.Surface((4, 2), 0, 24) + self._check_interface_rgba(s, plane) + s = pygame.Surface((4, 2), 0, 32) + self._check_interface_rgba(s, plane) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf_PyBUF_flags_bytes(self): + from pygame.tests.test_utils import buftools + Importer = buftools.Importer + s = pygame.Surface((10, 6), 0, 32) + a = s.get_buffer() + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 1) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + b = Importer(a, buftools.PyBUF_WRITABLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertFalse(b.readonly) + b = Importer(a, buftools.PyBUF_FORMAT) + self.assertEqual(b.ndim, 0) + self.assertEqual(b.format, 'B') + b = Importer(a, buftools.PyBUF_ND) + self.assertEqual(b.ndim, 1) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 1) + self.assertEqual(b.shape, (a.length,)) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + b = Importer(a, buftools.PyBUF_STRIDES) + self.assertEqual(b.ndim, 1) + self.assertTrue(b.format is None) + self.assertEqual(b.strides, (1,)) + s2 = s.subsurface((1, 1, 7, 4)) # Not contiguous + a = s2.get_buffer() + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 1) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s2._pixels_address) + b = Importer(a, buftools.PyBUF_C_CONTIGUOUS) + self.assertEqual(b.ndim, 1) + self.assertEqual(b.strides, (1,)) + b = Importer(a, buftools.PyBUF_F_CONTIGUOUS) + self.assertEqual(b.ndim, 1) + self.assertEqual(b.strides, (1,)) + b = Importer(a, buftools.PyBUF_ANY_CONTIGUOUS) + self.assertEqual(b.ndim, 1) + self.assertEqual(b.strides, (1,)) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf_PyBUF_flags_0D(self): + # This is the same handler as used by get_buffer(), so just + # confirm that it succeeds for one case. + from pygame.tests.test_utils import buftools + Importer = buftools.Importer + s = pygame.Surface((10, 6), 0, 32) + a = s.get_view('0') + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 1) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf_PyBUF_flags_1D(self): + from pygame.tests.test_utils import buftools + Importer = buftools.Importer + s = pygame.Surface((10, 6), 0, 32) + a = s.get_view('1') + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, s.get_bytesize()) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + b = Importer(a, buftools.PyBUF_WRITABLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertFalse(b.readonly) + b = Importer(a, buftools.PyBUF_FORMAT) + self.assertEqual(b.ndim, 0) + self.assertEqual(b.format, '=I') + b = Importer(a, buftools.PyBUF_ND) + self.assertEqual(b.ndim, 1) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, s.get_bytesize()) + self.assertEqual(b.shape, (s.get_width() * s.get_height(),)) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + b = Importer(a, buftools.PyBUF_STRIDES) + self.assertEqual(b.ndim, 1) + self.assertTrue(b.format is None) + self.assertEqual(b.strides, (s.get_bytesize(),)) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf_PyBUF_flags_2D(self): + from pygame.tests.test_utils import buftools + Importer = buftools.Importer + s = pygame.Surface((10, 6), 0, 32) + a = s.get_view('2') + # Non dimensional requests, no PyDEF_ND, are handled by the + # 1D surface buffer code, so only need to confirm a success. + b = Importer(a, buftools.PyBUF_SIMPLE) + self.assertEqual(b.ndim, 0) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, s.get_bytesize()) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + # Uniquely 2D + b = Importer(a, buftools.PyBUF_STRIDES) + self.assertEqual(b.ndim, 2) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, s.get_bytesize()) + self.assertEqual(b.shape, s.get_size()) + self.assertEqual(b.strides, (s.get_bytesize(), s.get_pitch())) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address) + b = Importer(a, buftools.PyBUF_RECORDS_RO) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, '=I') + self.assertEqual(b.strides, (s.get_bytesize(), s.get_pitch())) + b = Importer(a, buftools.PyBUF_RECORDS) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, '=I') + self.assertEqual(b.strides, (s.get_bytesize(), s.get_pitch())) + b = Importer(a, buftools.PyBUF_F_CONTIGUOUS) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, None) + self.assertEqual(b.strides, (s.get_bytesize(), s.get_pitch())) + b = Importer(a, buftools.PyBUF_ANY_CONTIGUOUS) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, None) + self.assertEqual(b.strides, (s.get_bytesize(), s.get_pitch())) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + s2 = s.subsurface((1, 1, 7, 4)) # Not contiguous + a = s2.get_view('2') + b = Importer(a, buftools.PyBUF_STRIDES) + self.assertEqual(b.ndim, 2) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, s2.get_bytesize()) + self.assertEqual(b.shape, s2.get_size()) + self.assertEqual(b.strides, (s2.get_bytesize(), s.get_pitch())) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s2._pixels_address) + b = Importer(a, buftools.PyBUF_RECORDS) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, '=I') + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_FORMAT) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_WRITABLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf_PyBUF_flags_3D(self): + from pygame.tests.test_utils import buftools + Importer = buftools.Importer + s = pygame.Surface((12, 6), 0, 24) + rmask, gmask, bmask, amask = s.get_masks() + if self.lilendian: + if rmask == 0x0000ff: + color_step = 1 + addr_offset = 0 + else: + color_step = -1 + addr_offset = 2 + else: + if (rmask == 0xff0000): + color_step = 1 + addr_offset = 0 + else: + color_step = -1 + addr_offset = 2 + a = s.get_view('3') + b = Importer(a, buftools.PyBUF_STRIDES) + w, h = s.get_size() + shape = w, h, 3 + strides = 3, s.get_pitch(), color_step + self.assertEqual(b.ndim, 3) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 1) + self.assertEqual(b.shape, shape) + self.assertEqual(b.strides, strides) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address + addr_offset) + b = Importer(a, buftools.PyBUF_RECORDS_RO) + self.assertEqual(b.ndim, 3) + self.assertEqual(b.format, 'B') + self.assertEqual(b.strides, strides) + b = Importer(a, buftools.PyBUF_RECORDS) + self.assertEqual(b.ndim, 3) + self.assertEqual(b.format, 'B') + self.assertEqual(b.strides, strides) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_FORMAT) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_WRITABLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + + @unittest.skipIf(not pygame.HAVE_NEWBUF, 'newbuf not implemented') + def test_newbuf_PyBUF_flags_rgba(self): + # All color plane views are handled by the same routine, + # so only one plane need be checked. + from pygame.tests.test_utils import buftools + Importer = buftools.Importer + s = pygame.Surface((12, 6), 0, 24) + rmask, gmask, bmask, amask = s.get_masks() + if self.lilendian: + if rmask == 0x0000ff: + addr_offset = 0 + else: + addr_offset = 2 + else: + if rmask == 0xff0000: + addr_offset = 0 + else: + addr_offset = 2 + a = s.get_view('R') + b = Importer(a, buftools.PyBUF_STRIDES) + w, h = s.get_size() + shape = w, h + strides = s.get_bytesize(), s.get_pitch() + self.assertEqual(b.ndim, 2) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.length) + self.assertEqual(b.itemsize, 1) + self.assertEqual(b.shape, shape) + self.assertEqual(b.strides, strides) + self.assertTrue(b.suboffsets is None) + self.assertFalse(b.readonly) + self.assertEqual(b.buf, s._pixels_address + addr_offset) + b = Importer(a, buftools.PyBUF_RECORDS_RO) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, 'B') + self.assertEqual(b.strides, strides) + b = Importer(a, buftools.PyBUF_RECORDS) + self.assertEqual(b.ndim, 2) + self.assertEqual(b.format, 'B') + self.assertEqual(b.strides, strides) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_FORMAT) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_WRITABLE) + self.assertRaises(BufferError, Importer, a, buftools.PyBUF_ND) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, + buftools.PyBUF_ANY_CONTIGUOUS) + + +class SurfaceBlendTest(unittest.TestCase): + + def setUp(self): + # Needed for 8 bits-per-pixel color palette surface tests. + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + _test_palette = [(0, 0, 0, 255), + (10, 30, 60, 0), + (25, 75, 100, 128), + (200, 150, 100, 200), + (0, 100, 200, 255)] + surf_size = (10, 12) + _test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2), + ((5, 5), 2), ((0, 11), 3), ((4, 6), 3), + ((9, 11), 4), ((5, 6), 4)] + + def _make_surface(self, bitsize, srcalpha=False, palette=None): + if palette is None: + palette = self._test_palette + flags = 0 + if srcalpha: + flags |= SRCALPHA + surf = pygame.Surface(self.surf_size, flags, bitsize) + if bitsize == 8: + surf.set_palette([c[:3] for c in palette]) + return surf + + def _fill_surface(self, surf, palette=None): + if palette is None: + palette = self._test_palette + surf.fill(palette[1], (0, 0, 5, 6)) + surf.fill(palette[2], (5, 0, 5, 6)) + surf.fill(palette[3], (0, 6, 5, 6)) + surf.fill(palette[4], (5, 6, 5, 6)) + + def _make_src_surface(self, bitsize, srcalpha=False, palette=None): + surf = self._make_surface(bitsize, srcalpha, palette) + self._fill_surface(surf, palette) + return surf + + def _assert_surface(self, surf, palette=None, msg=""): + if palette is None: + palette = self._test_palette + if surf.get_bitsize() == 16: + palette = [surf.unmap_rgb(surf.map_rgb(c)) for c in palette] + for posn, i in self._test_points: + self.assertEqual(surf.get_at(posn), palette[i], + "%s != %s: flags: %i, bpp: %i, posn: %s%s" % + (surf.get_at(posn), + palette[i], surf.get_flags(), + surf.get_bitsize(), posn, msg)) + + def test_blit_blend(self): + sources = [self._make_src_surface(8), + self._make_src_surface(16), + self._make_src_surface(16, srcalpha=True), + self._make_src_surface(24), + self._make_src_surface(32), + self._make_src_surface(32, srcalpha=True)] + destinations = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True)] + blend = [('BLEND_ADD', (0, 25, 100, 255), + lambda a, b: min(a + b, 255)), + ('BLEND_SUB', (100, 25, 0, 100), + lambda a, b: max(a - b, 0)), + ('BLEND_MULT', (100, 200, 0, 0), + lambda a, b: (a * b) // 256), + ('BLEND_MIN', (255, 0, 0, 255), min), + ('BLEND_MAX', (0, 255, 0, 255), max)] + + for src in sources: + src_palette = [src.unmap_rgb(src.map_rgb(c)) + for c in self._test_palette] + for dst in destinations: + for blend_name, dst_color, op in blend: + dc = dst.unmap_rgb(dst.map_rgb(dst_color)) + p = [] + for sc in src_palette: + c = [op(dc[i], sc[i]) for i in range(3)] + if dst.get_masks()[3]: + c.append(dc[3]) + else: + c.append(255) + c = dst.unmap_rgb(dst.map_rgb(c)) + p.append(c) + dst.fill(dst_color) + dst.blit(src, + (0, 0), + special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, + (", op: %s, src bpp: %i" + ", src flags: %i" % + (blend_name, + src.get_bitsize(), + src.get_flags()))) + + src = self._make_src_surface(32) + masks = src.get_masks() + dst = pygame.Surface(src.get_size(), 0, 32, + [masks[2], masks[1], masks[0], masks[3]]) + for blend_name, dst_color, op in blend: + p = [] + for src_color in self._test_palette: + c = [op(dst_color[i], src_color[i]) for i in range(3)] + c.append(255) + p.append(tuple(c)) + dst.fill(dst_color) + dst.blit(src, + (0, 0), + special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, ", %s" % blend_name) + + # Blend blits are special cased for 32 to 32 bit surfaces. + # + # Confirm that it works when the rgb bytes are not the + # least significant bytes. + pat = self._make_src_surface(32) + masks = pat.get_masks() + if min(masks) == intify(0xFF000000): + masks = [longify(m) >> 8 for m in masks] + else: + masks = [intify(m << 8) for m in masks] + src = pygame.Surface(pat.get_size(), 0, 32, masks) + self._fill_surface(src) + dst = pygame.Surface(src.get_size(), 0, 32, masks) + for blend_name, dst_color, op in blend: + p = [] + for src_color in self._test_palette: + c = [op(dst_color[i], src_color[i]) for i in range(3)] + c.append(255) + p.append(tuple(c)) + dst.fill(dst_color) + dst.blit(src, + (0, 0), + special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, ", %s" % blend_name) + + def test_blit_blend_rgba(self): + sources = [self._make_src_surface(8), + self._make_src_surface(16), + self._make_src_surface(16, srcalpha=True), + self._make_src_surface(24), + self._make_src_surface(32), + self._make_src_surface(32, srcalpha=True)] + destinations = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True)] + blend = [('BLEND_RGBA_ADD', (0, 25, 100, 255), + lambda a, b: min(a + b, 255)), + ('BLEND_RGBA_SUB', (0, 25, 100, 255), + lambda a, b: max(a - b, 0)), + ('BLEND_RGBA_MULT', (0, 7, 100, 255), + lambda a, b: (a * b) // 256), + ('BLEND_RGBA_MIN', (0, 255, 0, 255), min), + ('BLEND_RGBA_MAX', (0, 255, 0, 255), max)] + + for src in sources: + src_palette = [src.unmap_rgb(src.map_rgb(c)) + for c in self._test_palette] + for dst in destinations: + for blend_name, dst_color, op in blend: + dc = dst.unmap_rgb(dst.map_rgb(dst_color)) + p = [] + for sc in src_palette: + c = [op(dc[i], sc[i]) for i in range(4)] + if not dst.get_masks()[3]: + c[3] = 255 + c = dst.unmap_rgb(dst.map_rgb(c)) + p.append(c) + dst.fill(dst_color) + dst.blit(src, + (0, 0), + special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, + (", op: %s, src bpp: %i" + ", src flags: %i" % + (blend_name, + src.get_bitsize(), + src.get_flags()))) + + # Blend blits are special cased for 32 to 32 bit surfaces + # with per-pixel alpha. + # + # Confirm the general case is used instead when the formats differ. + src = self._make_src_surface(32, srcalpha=True) + masks = src.get_masks() + dst = pygame.Surface(src.get_size(), SRCALPHA, 32, + (masks[2], masks[1], masks[0], masks[3])) + for blend_name, dst_color, op in blend: + p = [tuple([op(dst_color[i], src_color[i]) for i in range(4)]) + for src_color in self._test_palette] + dst.fill(dst_color) + dst.blit(src, + (0, 0), + special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, ", %s" % blend_name) + + # Confirm this special case handles subsurfaces. + src = pygame.Surface((8, 10), SRCALPHA, 32) + dst = pygame.Surface((8, 10), SRCALPHA, 32) + tst = pygame.Surface((8, 10), SRCALPHA, 32) + src.fill((1, 2, 3, 4)) + dst.fill((40, 30, 20, 10)) + subsrc = src.subsurface((2, 3, 4, 4)) + subdst = dst.subsurface((2, 3, 4, 4)) + subdst.blit(subsrc, (0, 0), special_flags=BLEND_RGBA_ADD) + tst.fill((40, 30, 20, 10)) + tst.fill((41, 32, 23, 14), (2, 3, 4, 4)) + for x in range(8): + for y in range(10): + self.assertEqual(dst.get_at((x, y)), tst.get_at((x, y)), + "%s != %s at (%i, %i)" % + (dst.get_at((x, y)), tst.get_at((x, y)), + x, y)) + + def test_blit_blend_big_rect(self): + """ test that an oversized rect works ok. + """ + color = (1, 2, 3, 255) + area = (1, 1, 30, 30) + s1 = pygame.Surface((4, 4), 0, 32) + r = s1.fill(special_flags=pygame.BLEND_ADD, color=color, rect=area) + + self.assertEqual(pygame.Rect((1, 1, 3, 3)), r) + self.assertEqual(s1.get_at((0, 0)), (0, 0, 0, 255)) + self.assertEqual(s1.get_at((1, 1)), color) + + black = pygame.Color("black") + red = pygame.Color("red") + self.assertNotEqual(black, red) + + surf = pygame.Surface((10, 10), 0, 32) + surf.fill(black) + subsurf = surf.subsurface(pygame.Rect(0, 1, 10, 8)) + self.assertEqual(surf.get_at((0, 0)), black) + self.assertEqual(surf.get_at((0, 9)), black) + + subsurf.fill(red, (0, -1, 10, 1), pygame.BLEND_RGB_ADD) + self.assertEqual(surf.get_at((0, 0)), black) + self.assertEqual(surf.get_at((0, 9)), black) + + subsurf.fill(red, (0, 8, 10, 1), pygame.BLEND_RGB_ADD) + self.assertEqual(surf.get_at((0, 0)), black) + self.assertEqual(surf.get_at((0, 9)), black) + + def test_GET_PIXELVALS(self): + # surface.h GET_PIXELVALS bug regarding whether of not + # a surface has per-pixel alpha. Looking at the Amask + # is not enough. The surface's SRCALPHA flag must also + # be considered. Fix rev. 1923. + src = self._make_surface(32, srcalpha=True) + src.fill((0, 0, 0, 128)) + src.set_alpha(None) # Clear SRCALPHA flag. + dst = self._make_surface(32, srcalpha=True) + dst.blit(src, (0, 0), special_flags=BLEND_RGBA_ADD) + self.assertEqual(dst.get_at((0, 0)), (0, 0, 0, 255)) + + def test_fill_blend(self): + destinations = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True)] + blend = [('BLEND_ADD', (0, 25, 100, 255), + lambda a, b: min(a + b, 255)), + ('BLEND_SUB', (0, 25, 100, 255), + lambda a, b: max(a - b, 0)), + ('BLEND_MULT', (0, 7, 100, 255), + lambda a, b: (a * b) // 256), + ('BLEND_MIN', (0, 255, 0, 255), min), + ('BLEND_MAX', (0, 255, 0, 255), max)] + + for dst in destinations: + dst_palette = [dst.unmap_rgb(dst.map_rgb(c)) + for c in self._test_palette] + for blend_name, fill_color, op in blend: + fc = dst.unmap_rgb(dst.map_rgb(fill_color)) + self._fill_surface(dst) + p = [] + for dc in dst_palette: + c = [op(dc[i], fc[i]) for i in range(3)] + if dst.get_masks()[3]: + c.append(dc[3]) + else: + c.append(255) + c = dst.unmap_rgb(dst.map_rgb(c)) + p.append(c) + dst.fill(fill_color, special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, ", %s" % blend_name) + + def test_fill_blend_rgba(self): + destinations = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True)] + blend = [('BLEND_RGBA_ADD', (0, 25, 100, 255), + lambda a, b: min(a + b, 255)), + ('BLEND_RGBA_SUB', (0, 25, 100, 255), + lambda a, b: max(a - b, 0)), + ('BLEND_RGBA_MULT', (0, 7, 100, 255), + lambda a, b: (a * b) // 256), + ('BLEND_RGBA_MIN', (0, 255, 0, 255), min), + ('BLEND_RGBA_MAX', (0, 255, 0, 255), max)] + + for dst in destinations: + dst_palette = [dst.unmap_rgb(dst.map_rgb(c)) + for c in self._test_palette] + for blend_name, fill_color, op in blend: + fc = dst.unmap_rgb(dst.map_rgb(fill_color)) + self._fill_surface(dst) + p = [] + for dc in dst_palette: + c = [op(dc[i], fc[i]) for i in range(4)] + if not dst.get_masks()[3]: + c[3] = 255 + c = dst.unmap_rgb(dst.map_rgb(c)) + p.append(c) + dst.fill(fill_color, special_flags=getattr(pygame, blend_name)) + self._assert_surface(dst, p, ", %s" % blend_name) + + +class SurfaceSelfBlitTest(unittest.TestCase): + """Blit to self tests. + + This test case is in response to MotherHamster Bugzilla Bug 19. + """ + + def setUp(self): + # Needed for 8 bits-per-pixel color palette surface tests. + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + _test_palette = [(0, 0, 0, 255), + (255, 0, 0, 0), + (0, 255, 0, 255)] + surf_size = (9, 6) + + def _fill_surface(self, surf, palette=None): + if palette is None: + palette = self._test_palette + surf.fill(palette[1]) + surf.fill(palette[2], (1, 2, 1, 2)) + + def _make_surface(self, bitsize, srcalpha=False, palette=None): + if palette is None: + palette = self._test_palette + flags = 0 + if srcalpha: + flags |= SRCALPHA + surf = pygame.Surface(self.surf_size, flags, bitsize) + if bitsize == 8: + surf.set_palette([c[:3] for c in palette]) + self._fill_surface(surf, palette) + return surf + + def _assert_same(self, a, b): + w, h = a.get_size() + for x in range(w): + for y in range(h): + self.assertEqual(a.get_at((x, y)), b.get_at((x, y)), + ("%s != %s, bpp: %i" % + (a.get_at((x, y)), b.get_at((x, y)), + a.get_bitsize()))) + + def test_overlap_check(self): + # Ensure overlapping blits are properly detected. There are two + # places where this is done, within SoftBlitPyGame() in alphablit.c + # and PySurface_Blit() in surface.c. SoftBlitPyGame should catch the + # per-pixel alpha surface, PySurface_Blit the colorkey and blanket + # alpha surface. per-pixel alpha and blanket alpha self blits are + # not properly handled by SDL 1.2.13, so Pygame does them. + bgc = (0, 0, 0, 255) + rectc_left = (128, 64, 32, 255) + rectc_right = (255, 255, 255, 255) + colors = [(255, 255, 255, 255), (128, 64, 32, 255)] + overlaps = [(0, 0, 1, 0, (50, 0)), + (0, 0, 49, 1, (98, 2)), + (0, 0, 49, 49, (98, 98)), + (49, 0, 0, 1, (0, 2)), + (49, 0, 0, 49, (0, 98))] + surfs = [pygame.Surface((100, 100), SRCALPHA, 32)] + surf = pygame.Surface((100, 100), 0, 32) + surf.set_alpha(255) + surfs.append(surf) + surf = pygame.Surface((100, 100), 0, 32) + surf.set_colorkey((0, 1, 0)) + surfs.append(surf) + for surf in surfs: + for s_x, s_y, d_x, d_y, test_posn in overlaps: + surf.fill(bgc) + surf.fill(rectc_right, (25, 0, 25, 50)) + surf.fill(rectc_left, (0, 0, 25, 50)) + surf.blit(surf, (d_x, d_y), (s_x, s_y, 50, 50)) + self.assertEqual(surf.get_at(test_posn), rectc_right) + + # https://github.com/pygame/pygame/issues/370#issuecomment-364625291 + @unittest.skipIf('ppc64le' in platform.uname(), 'known ppc64le issue') + def test_colorkey(self): + # Check a workaround for an SDL 1.2.13 surface self-blit problem + # (MotherHamster Bugzilla bug 19). + pygame.display.set_mode((100, 50)) # Needed for 8bit surface + bitsizes = [8, 16, 24, 32] + for bitsize in bitsizes: + surf = self._make_surface(bitsize) + surf.set_colorkey(self._test_palette[1]) + surf.blit(surf, (3, 0)) + p = [] + for c in self._test_palette: + c = surf.unmap_rgb(surf.map_rgb(c)) + p.append(c) + p[1] = (p[1][0], p[1][1], p[1][2], 0) + tmp = self._make_surface(32, srcalpha=True, palette=p) + tmp.blit(tmp, (3, 0)) + tmp.set_alpha(None) + comp = self._make_surface(bitsize) + comp.blit(tmp, (0, 0)) + self._assert_same(surf, comp) + + # https://github.com/pygame/pygame/issues/370#issuecomment-364625291 + @unittest.skipIf('ppc64le' in platform.uname(), 'known ppc64le issue') + def test_blanket_alpha(self): + # Check a workaround for an SDL 1.2.13 surface self-blit problem + # (MotherHamster Bugzilla bug 19). + pygame.display.set_mode((100, 50)) # Needed for 8bit surface + bitsizes = [8, 16, 24, 32] + for bitsize in bitsizes: + surf = self._make_surface(bitsize) + surf.set_alpha(128) + surf.blit(surf, (3, 0)) + p = [] + for c in self._test_palette: + c = surf.unmap_rgb(surf.map_rgb(c)) + p.append((c[0], c[1], c[2], 128)) + tmp = self._make_surface(32, srcalpha=True, palette=p) + tmp.blit(tmp, (3, 0)) + tmp.set_alpha(None) + comp = self._make_surface(bitsize) + comp.blit(tmp, (0, 0)) + self._assert_same(surf, comp) + + def test_pixel_alpha(self): + bitsizes = [16, 32] + for bitsize in bitsizes: + surf = self._make_surface(bitsize, srcalpha=True) + comp = self._make_surface(bitsize, srcalpha=True) + comp.blit(surf, (3, 0)) + surf.blit(surf, (3, 0)) + self._assert_same(surf, comp) + + def test_blend(self): + bitsizes = [8, 16, 24, 32] + blends = ['BLEND_ADD', + 'BLEND_SUB', + 'BLEND_MULT', + 'BLEND_MIN', + 'BLEND_MAX'] + for bitsize in bitsizes: + surf = self._make_surface(bitsize) + comp = self._make_surface(bitsize) + for blend in blends: + self._fill_surface(surf) + self._fill_surface(comp) + comp.blit(surf, (3, 0), + special_flags=getattr(pygame, blend)) + surf.blit(surf, (3, 0), + special_flags=getattr(pygame, blend)) + self._assert_same(surf, comp) + + def test_blend_rgba(self): + bitsizes = [16, 32] + blends = ['BLEND_RGBA_ADD', + 'BLEND_RGBA_SUB', + 'BLEND_RGBA_MULT', + 'BLEND_RGBA_MIN', + 'BLEND_RGBA_MAX'] + for bitsize in bitsizes: + surf = self._make_surface(bitsize, srcalpha=True) + comp = self._make_surface(bitsize, srcalpha=True) + for blend in blends: + self._fill_surface(surf) + self._fill_surface(comp) + comp.blit(surf, (3, 0), + special_flags=getattr(pygame, blend)) + surf.blit(surf, (3, 0), + special_flags=getattr(pygame, blend)) + self._assert_same(surf, comp) + + def test_subsurface(self): + # Blitting a surface to its subsurface is allowed. + surf = self._make_surface(32, srcalpha=True) + comp = surf.copy() + comp.blit(surf, (3, 0)) + sub = surf.subsurface((3, 0, 6, 6)) + sub.blit(surf, (0, 0)) + del sub + self._assert_same(surf, comp) + # Blitting a subsurface to its owner is forbidden because of + # lock conficts. This limitation allows the overlap check + # in PySurface_Blit of alphablit.c to be simplified. + def do_blit(d, s): + d.blit(s, (0, 0)) + sub = surf.subsurface((1, 1, 2, 2)) + self.assertRaises(pygame.error, do_blit, surf, sub) + + def test_copy_alpha(self): + """issue 581: alpha of surface copy with SRCALPHA is set to 0.""" + surf = pygame.Surface((16, 16), pygame.SRCALPHA, 32) + self.assertEqual(surf.get_alpha(), 255) + surf2 = surf.copy() + self.assertEqual(surf2.get_alpha(), 255) + + +class SurfaceFillTest(unittest.TestCase): + + def setUp(self): + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + def test_fill(self): + screen = pygame.display.set_mode((640, 480)) + + # Green and blue test pattern + screen.fill((0, 255, 0), (0, 0, 320, 240)) + screen.fill((0, 255, 0), (320, 240, 320, 240)) + screen.fill((0, 0, 255), (320, 0, 320, 240)) + screen.fill((0, 0, 255), (0, 240, 320, 240)) + + # Now apply a clip rect, such that only the left side of the + # screen should be effected by blit opperations. + screen.set_clip((0, 0, 320, 480)) + + # Test fills with each special flag, and additionaly without any. + screen.fill((255, 0, 0, 127), (160, 0, 320, 30), 0) + screen.fill((255, 0, 0, 127), (160, 30, 320, 30), pygame.BLEND_ADD) + screen.fill((0, 127, 127, 127), (160, 60, 320, 30), pygame.BLEND_SUB) + screen.fill((0, 63, 63, 127), (160, 90, 320, 30), pygame.BLEND_MULT) + screen.fill((0, 127, 127, 127), (160, 120, 320, 30), pygame.BLEND_MIN) + screen.fill((127, 0, 0, 127), (160, 150, 320, 30), pygame.BLEND_MAX) + screen.fill((255, 0, 0, 127), (160, 180, 320, 30), pygame.BLEND_RGBA_ADD) + screen.fill((0, 127, 127, 127), (160, 210, 320, 30), pygame.BLEND_RGBA_SUB) + screen.fill((0, 63, 63, 127), (160, 240, 320, 30), pygame.BLEND_RGBA_MULT) + screen.fill((0, 127, 127, 127), (160, 270, 320, 30), pygame.BLEND_RGBA_MIN) + screen.fill((127, 0, 0, 127), (160, 300, 320, 30), pygame.BLEND_RGBA_MAX) + screen.fill((255, 0, 0, 127), (160, 330, 320, 30), pygame.BLEND_RGB_ADD) + screen.fill((0, 127, 127, 127), (160, 360, 320, 30), pygame.BLEND_RGB_SUB) + screen.fill((0, 63, 63, 127), (160, 390, 320, 30), pygame.BLEND_RGB_MULT) + screen.fill((0, 127, 127, 127), (160, 420, 320, 30), pygame.BLEND_RGB_MIN) + screen.fill((255, 0, 0, 127), (160, 450, 320, 30), pygame.BLEND_RGB_MAX) + + # Update the display so we can see the results + pygame.display.flip() + + # Compare colors on both sides of window + for y in range(5, 480, 10): + self.assertEqual(screen.get_at((10, y)), screen.get_at((330, 480 - y))) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/surfarray_tags.py b/venv/Lib/site-packages/pygame/tests/surfarray_tags.py new file mode 100644 index 0000000..132d559 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/surfarray_tags.py @@ -0,0 +1,16 @@ +__tags__ = ['array'] + +exclude = False + +try: + import numpy +except ImportError: + exclude = True +else: + try: + import pygame.pixelcopy + except ImportError: + exclude = True + +if exclude: + __tags__.extend(('ignore', 'subprocess_ignore')) diff --git a/venv/Lib/site-packages/pygame/tests/surfarray_test.py b/venv/Lib/site-packages/pygame/tests/surfarray_test.py new file mode 100644 index 0000000..4f43fce --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/surfarray_test.py @@ -0,0 +1,667 @@ + +import unittest +import platform + +from numpy import \ + uint8, uint16, uint32, uint64, zeros, \ + float32, float64, alltrue, rint, arange + +import pygame +from pygame.locals import * + +import pygame.surfarray +arraytype = 'numpy' + + +IS_PYPY = 'PyPy' == platform.python_implementation() + + +@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO +class SurfarrayModuleTest (unittest.TestCase): + pixels2d = {8: True, 16: True, 24: False, 32: True} + pixels3d = {8: False, 16: False, 24: True, 32: True} + array2d = {8: True, 16: True, 24: True, 32: True} + array3d = {8: False, 16: False, 24: True, 32: True} + + test_palette = [(0, 0, 0, 255), + (10, 30, 60, 255), + (25, 75, 100, 255), + (100, 150, 200, 255), + (0, 100, 200, 255)] + surf_size = (10, 12) + test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2), + ((5, 5), 2), ((0, 11), 3), ((4, 6), 3), + ((9, 11), 4), ((5, 6), 4)] + + @classmethod + def setUpClass(cls): + # Needed for 8 bits-per-pixel color palette surface tests. + pygame.init() + + @classmethod + def tearDownClass(cls): + pygame.quit() + + def setUp(cls): + # This makes sure pygame is always initialized before each test (in + # case a test calls pygame.quit()). + if not pygame.get_init(): + pygame.init() + + # Makes sure the same array package is used each time. + pygame.surfarray.use_arraytype(arraytype) + + def _make_surface(self, bitsize, srcalpha=False, palette=None): + if palette is None: + palette = self.test_palette + flags = 0 + if srcalpha: + flags |= SRCALPHA + surf = pygame.Surface(self.surf_size, flags, bitsize) + if bitsize == 8: + surf.set_palette([c[:3] for c in palette]) + return surf + + def _fill_surface(self, surf, palette=None): + if palette is None: + palette = self.test_palette + surf.fill(palette[1], (0, 0, 5, 6)) + surf.fill(palette[2], (5, 0, 5, 6)) + surf.fill(palette[3], (0, 6, 5, 6)) + surf.fill(palette[4], (5, 6, 5, 6)) + + def _make_src_surface(self, bitsize, srcalpha=False, palette=None): + surf = self._make_surface(bitsize, srcalpha, palette) + self._fill_surface(surf, palette) + return surf + + def _assert_surface(self, surf, palette=None, msg=""): + if palette is None: + palette = self.test_palette + if surf.get_bitsize() == 16: + palette = [surf.unmap_rgb(surf.map_rgb(c)) for c in palette] + for posn, i in self.test_points: + self.assertEqual(surf.get_at(posn), palette[i], + "%s != %s: flags: %i, bpp: %i, posn: %s%s" % + (surf.get_at(posn), + palette[i], surf.get_flags(), + surf.get_bitsize(), posn, msg)) + + def _make_array3d(self, dtype): + return zeros((self.surf_size[0], self.surf_size[1], 3), dtype) + + def _fill_array2d(self, arr, surf): + palette = self.test_palette + arr[:5,:6] = surf.map_rgb(palette[1]) + arr[5:,:6] = surf.map_rgb(palette[2]) + arr[:5,6:] = surf.map_rgb(palette[3]) + arr[5:,6:] = surf.map_rgb(palette[4]) + + def _fill_array3d(self, arr): + palette = self.test_palette + arr[:5,:6] = palette[1][:3] + arr[5:,:6] = palette[2][:3] + arr[:5,6:] = palette[3][:3] + arr[5:,6:] = palette[4][:3] + + def _make_src_array3d(self, dtype): + arr = self._make_array3d(dtype) + self._fill_array3d(arr) + return arr + + def _make_array2d(self, dtype): + return zeros(self.surf_size, dtype) + + def test_array2d(self): + + sources = [self._make_src_surface(8), + self._make_src_surface(16), + self._make_src_surface(16, srcalpha=True), + self._make_src_surface(24), + self._make_src_surface(32), + self._make_src_surface(32, srcalpha=True)] + palette = self.test_palette + alpha_color = (0, 0, 0, 128) + + for surf in sources: + arr = pygame.surfarray.array2d(surf) + for posn, i in self.test_points: + self.assertEqual(arr[posn], surf.get_at_mapped(posn), + "%s != %s: flags: %i, bpp: %i, posn: %s" % + (arr[posn], + surf.get_at_mapped(posn), + surf.get_flags(), surf.get_bitsize(), + posn)) + + if surf.get_masks()[3]: + surf.fill(alpha_color) + arr = pygame.surfarray.array2d(surf) + posn = (0, 0) + self.assertEqual(arr[posn], surf.get_at_mapped(posn), + "%s != %s: bpp: %i" % + (arr[posn], + surf.get_at_mapped(posn), + surf.get_bitsize())) + + def test_array3d(self): + + sources = [self._make_src_surface(16), + self._make_src_surface(16, srcalpha=True), + self._make_src_surface(24), + self._make_src_surface(32), + self._make_src_surface(32, srcalpha=True)] + palette = self.test_palette + + for surf in sources: + arr = pygame.surfarray.array3d(surf) + def same_color(ac, sc): + return (ac[0] == sc[0] and + ac[1] == sc[1] and + ac[2] == sc[2]) + for posn, i in self.test_points: + self.assertTrue(same_color(arr[posn], surf.get_at(posn)), + "%s != %s: flags: %i, bpp: %i, posn: %s" % ( + tuple(arr[posn]), surf.get_at(posn), + surf.get_flags(), surf.get_bitsize(), + posn)) + + def test_array_alpha(self): + + palette = [(0, 0, 0, 0), + (10, 50, 100, 255), + (60, 120, 240, 130), + (64, 128, 255, 0), + (255, 128, 0, 65)] + targets = [self._make_src_surface(8, palette=palette), + self._make_src_surface(16, palette=palette), + self._make_src_surface(16, palette=palette, srcalpha=True), + self._make_src_surface(24, palette=palette), + self._make_src_surface(32, palette=palette), + self._make_src_surface(32, palette=palette, srcalpha=True)] + + for surf in targets: + p = palette + if surf.get_bitsize() == 16: + p = [surf.unmap_rgb(surf.map_rgb(c)) for c in p] + arr = pygame.surfarray.array_alpha(surf) + if surf.get_masks()[3]: + for (x, y), i in self.test_points: + self.assertEqual(arr[x, y], p[i][3], + ("%i != %i, posn: (%i, %i), " + "bitsize: %i" % + (arr[x, y], p[i][3], + x, y, + surf.get_bitsize()))) + else: + self.assertTrue(alltrue(arr == 255)) + + # No per-pixel alpha when blanket alpha is None. + for surf in targets: + blanket_alpha = surf.get_alpha() + surf.set_alpha(None) + arr = pygame.surfarray.array_alpha(surf) + self.assertTrue(alltrue(arr == 255), + "All alpha values should be 255 when" + " surf.set_alpha(None) has been set." + " bitsize: %i, flags: %i" % ( + surf.get_bitsize(), surf.get_flags())) + surf.set_alpha(blanket_alpha) + + # Bug for per-pixel alpha surface when blanket alpha 0. + for surf in targets: + blanket_alpha = surf.get_alpha() + surf.set_alpha(0) + arr = pygame.surfarray.array_alpha(surf) + if surf.get_masks()[3]: + self.assertFalse(alltrue(arr == 255), + "bitsize: %i, flags: %i" % + (surf.get_bitsize(), surf.get_flags())) + else: + self.assertTrue(alltrue(arr == 255), + "bitsize: %i, flags: %i" % ( + surf.get_bitsize(), surf.get_flags())) + surf.set_alpha(blanket_alpha) + + def test_array_colorkey(self): + + palette = [(0, 0, 0, 0), + (10, 50, 100, 255), + (60, 120, 240, 130), + (64, 128, 255, 0), + (255, 128, 0, 65)] + targets = [self._make_src_surface(8, palette=palette), + self._make_src_surface(16, palette=palette), + self._make_src_surface(16, palette=palette, srcalpha=True), + self._make_src_surface(24, palette=palette), + self._make_src_surface(32, palette=palette), + self._make_src_surface(32, palette=palette, srcalpha=True)] + + for surf in targets: + p = palette + if surf.get_bitsize() == 16: + p = [surf.unmap_rgb(surf.map_rgb(c)) for c in p] + surf.set_colorkey(None) + arr = pygame.surfarray.array_colorkey(surf) + self.assertTrue(alltrue(arr == 255)) + + for i in range(1, len(palette)): + surf.set_colorkey(p[i]) + alphas = [255] * len(p) + alphas[i] = 0 + arr = pygame.surfarray.array_colorkey(surf) + for (x, y), j in self.test_points: + self.assertEqual(arr[x, y], alphas[j], + ("%i != %i, posn: (%i, %i), " + "bitsize: %i" % + (arr[x, y], alphas[j], + x, y, + surf.get_bitsize()))) + + def test_blit_array(self): + + # bug 24 at http://pygame.motherhamster.org/bugzilla/ + if 'numpy' in pygame.surfarray.get_arraytypes(): + prev = pygame.surfarray.get_arraytype() + # This would raise exception: + # File "[...]\pygame\_numpysurfarray.py", line 381, in blit_array + # (array[:,:,1::3] >> losses[1] << shifts[1]) | \ + # TypeError: unsupported operand type(s) for >>: 'float' and 'int' + pygame.surfarray.use_arraytype('numpy') + s = pygame.Surface((10,10), 0, 24) + a = pygame.surfarray.array3d(s) + pygame.surfarray.blit_array(s, a) + prev = pygame.surfarray.use_arraytype(prev) + + # target surfaces + targets = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True), + ] + + # source arrays + arrays3d = [] + dtypes = [(8, uint8), (16, uint16), (32, uint32)] + try: + dtypes.append((64, uint64)) + except NameError: + pass + arrays3d = [(self._make_src_array3d(dtype), None) + for __, dtype in dtypes] + for bitsize in [8, 16, 24, 32]: + palette = None + if bitsize == 16: + s = pygame.Surface((1,1), 0, 16) + palette = [s.unmap_rgb(s.map_rgb(c)) + for c in self.test_palette] + if self.pixels3d[bitsize]: + surf = self._make_src_surface(bitsize) + arr = pygame.surfarray.pixels3d(surf) + arrays3d.append((arr, palette)) + if self.array3d[bitsize]: + surf = self._make_src_surface(bitsize) + arr = pygame.surfarray.array3d(surf) + arrays3d.append((arr, palette)) + for sz, dtype in dtypes: + arrays3d.append((arr.astype(dtype), palette)) + + # tests on arrays + def do_blit(surf, arr): + pygame.surfarray.blit_array(surf, arr) + + for surf in targets: + bitsize = surf.get_bitsize() + for arr, palette in arrays3d: + surf.fill((0, 0, 0, 0)) + if bitsize == 8: + self.assertRaises(ValueError, do_blit, surf, arr) + else: + pygame.surfarray.blit_array(surf, arr) + self._assert_surface(surf, palette) + + if self.pixels2d[bitsize]: + surf.fill((0, 0, 0, 0)) + s = self._make_src_surface(bitsize, surf.get_flags() & SRCALPHA) + arr = pygame.surfarray.pixels2d(s) + pygame.surfarray.blit_array(surf, arr) + self._assert_surface(surf) + + if self.array2d[bitsize]: + s = self._make_src_surface(bitsize, surf.get_flags() & SRCALPHA) + arr = pygame.surfarray.array2d(s) + for sz, dtype in dtypes: + surf.fill((0, 0, 0, 0)) + if sz >= bitsize: + pygame.surfarray.blit_array(surf, arr.astype(dtype)) + self._assert_surface(surf) + else: + self.assertRaises(ValueError, do_blit, + surf, self._make_array2d(dtype)) + + # Check alpha for 2D arrays + surf = self._make_surface(16, srcalpha=True) + arr = zeros(surf.get_size(), uint16) + arr[...] = surf.map_rgb((0, 128, 255, 64)) + color = surf.unmap_rgb(arr[0, 0]) + pygame.surfarray.blit_array(surf, arr) + self.assertEqual(surf.get_at((5, 5)), color) + + surf = self._make_surface(32, srcalpha=True) + arr = zeros(surf.get_size(), uint32) + color = (0, 111, 255, 63) + arr[...] = surf.map_rgb(color) + pygame.surfarray.blit_array(surf, arr) + self.assertEqual(surf.get_at((5, 5)), color) + + # Check shifts + arr3d = self._make_src_array3d(uint8) + + shift_tests = [(16, + [12, 0, 8, 4], + [0xf000, 0xf, 0xf00, 0xf0]), + (24, + [16, 0, 8, 0], + [0xff0000, 0xff, 0xff00, 0]), + (32, + [0, 16, 24, 8], + [0xff, 0xff0000, 0xff000000, 0xff00])] + + for bitsize, shifts, masks in shift_tests: + surf = self._make_surface(bitsize, srcalpha=(shifts[3] != 0)) + palette = None + if bitsize == 16: + palette = [surf.unmap_rgb(surf.map_rgb(c)) + for c in self.test_palette] + surf.set_shifts(shifts) + surf.set_masks(masks) + pygame.surfarray.blit_array(surf, arr3d) + self._assert_surface(surf, palette) + + # Invalid arrays + surf = pygame.Surface((1,1), 0, 32) + t = 'abcd' + self.assertRaises(ValueError, do_blit, surf, t) + + surf_size = self.surf_size + surf = pygame.Surface(surf_size, 0, 32) + arr = zeros([surf_size[0], surf_size[1] + 1, 3], uint32) + self.assertRaises(ValueError, do_blit, surf, arr) + arr = zeros([surf_size[0] + 1, surf_size[1], 3], uint32) + self.assertRaises(ValueError, do_blit, surf, arr) + + surf = pygame.Surface((1, 4), 0, 32) + arr = zeros((4,), uint32) + self.assertRaises(ValueError, do_blit, surf, arr) + arr.shape = (1, 1, 1, 4) + self.assertRaises(ValueError, do_blit, surf, arr) + + # Issue #81: round from float to int + try: + rint + except NameError: + pass + else: + surf = pygame.Surface((10, 10), pygame.SRCALPHA, 32) + w, h = surf.get_size() + length = w * h + for dtype in [float32, float64]: + surf.fill((255, 255, 255, 0)) + farr = arange(0, length, dtype=dtype) + farr.shape = w, h + pygame.surfarray.blit_array(surf, farr) + for x in range(w): + for y in range(h): + self.assertEqual(surf.get_at_mapped((x, y)), + int(rint(farr[x, y]))) + + def test_get_arraytype(self): + array_type = pygame.surfarray.get_arraytype() + + self.assertEqual(array_type, 'numpy', + "unknown array type %s" % array_type) + + def test_get_arraytypes(self): + + arraytypes = pygame.surfarray.get_arraytypes() + self.assertIn('numpy', arraytypes) + + for atype in arraytypes: + self.assertEqual(atype, 'numpy', "unknown array type %s" % atype) + + def test_make_surface(self): + + # How does one properly test this with 2d arrays. It makes no sense + # since the pixel format is not entirely dependent on element size. + # Just make sure the surface pixel size is at least as large as the + # array element size I guess. + # + for bitsize, dtype in [(8, uint8), (16, uint16), (24, uint32)]: +## Even this simple assertion fails for 2d arrays. Where's the problem? +## surf = pygame.surfarray.make_surface(self._make_array2d(dtype)) +## self.assertGreaterEqual(surf.get_bitsize(), bitsize, +## "not %i >= %i)" % (surf.get_bitsize(), bitsize)) +## + surf = pygame.surfarray.make_surface(self._make_src_array3d(dtype)) + self._assert_surface(surf) + + # Issue #81: round from float to int + try: + rint + except NameError: + pass + else: + w = 9 + h = 11 + length = w * h + for dtype in [float32, float64]: + farr = arange(0, length, dtype=dtype) + farr.shape = w, h + surf = pygame.surfarray.make_surface(farr) + for x in range(w): + for y in range(h): + self.assertEqual(surf.get_at_mapped((x, y)), + int(rint(farr[x, y]))) + + def test_map_array(self): + + arr3d = self._make_src_array3d(uint8) + targets = [self._make_surface(8), + self._make_surface(16), + self._make_surface(16, srcalpha=True), + self._make_surface(24), + self._make_surface(32), + self._make_surface(32, srcalpha=True)] + palette = self.test_palette + + for surf in targets: + arr2d = pygame.surfarray.map_array(surf, arr3d) + for posn, i in self.test_points: + self.assertEqual(arr2d[posn], surf.map_rgb(palette[i]), + "%i != %i, bitsize: %i, flags: %i" % + (arr2d[posn], surf.map_rgb(palette[i]), + surf.get_bitsize(), surf.get_flags())) + + # Exception checks + self.assertRaises(ValueError, pygame.surfarray.map_array, + self._make_surface(32), + self._make_array2d(uint8)) + + def test_pixels2d(self): + + sources = [self._make_surface(8), + self._make_surface(16, srcalpha=True), + self._make_surface(32, srcalpha=True)] + + for surf in sources: + self.assertFalse(surf.get_locked()) + arr = pygame.surfarray.pixels2d(surf) + self.assertTrue(surf.get_locked()) + self._fill_array2d(arr, surf) + surf.unlock() + self.assertTrue(surf.get_locked()) + del arr + self.assertFalse(surf.get_locked()) + self.assertEqual(surf.get_locks(), ()) + self._assert_surface(surf) + + # Error checks + self.assertRaises(ValueError, + pygame.surfarray.pixels2d, + self._make_surface(24)) + + def test_pixels3d(self): + + sources = [self._make_surface(24), + self._make_surface(32)] + + for surf in sources: + self.assertFalse(surf.get_locked()) + arr = pygame.surfarray.pixels3d(surf) + self.assertTrue(surf.get_locked()) + self._fill_array3d(arr) + surf.unlock() + self.assertTrue(surf.get_locked()) + del arr + self.assertFalse(surf.get_locked()) + self.assertEqual(surf.get_locks(), ()) + self._assert_surface(surf) + + # Alpha check + color = (1, 2, 3, 0) + surf = self._make_surface(32, srcalpha=True) + arr = pygame.surfarray.pixels3d(surf) + arr[0,0] = color[:3] + self.assertEqual(surf.get_at((0, 0)), color) + + # Error checks + def do_pixels3d(surf): + pygame.surfarray.pixels3d(surf) + + self.assertRaises(ValueError, + do_pixels3d, + self._make_surface(8)) + self.assertRaises(ValueError, + do_pixels3d, + self._make_surface(16)) + + def test_pixels_alpha(self): + + palette = [(0, 0, 0, 0), + (127, 127, 127, 0), + (127, 127, 127, 85), + (127, 127, 127, 170), + (127, 127, 127, 255)] + alphas = [0, 45, 86, 99, 180] + + surf = self._make_src_surface(32, srcalpha=True, palette=palette) + + self.assertFalse(surf.get_locked()) + arr = pygame.surfarray.pixels_alpha(surf) + self.assertTrue(surf.get_locked()) + surf.unlock() + self.assertTrue(surf.get_locked()) + + for (x, y), i in self.test_points: + self.assertEqual(arr[x, y], palette[i][3]) + + for (x, y), i in self.test_points: + alpha = alphas[i] + arr[x, y] = alpha + color = (127, 127, 127, alpha) + self.assertEqual(surf.get_at((x, y)), color, + "posn: (%i, %i)" % (x, y)) + + del arr + self.assertFalse(surf.get_locked()) + self.assertEqual(surf.get_locks(), ()) + + # Check exceptions. + def do_pixels_alpha(surf): + pygame.surfarray.pixels_alpha(surf) + + targets = [(8, False), + (16, False), + (16, True), + (24, False), + (32, False)] + + for bitsize, srcalpha in targets: + self.assertRaises(ValueError, do_pixels_alpha, + self._make_surface(bitsize, srcalpha)) + + def test_pixels_red(self): + self._test_pixels_rgb('red', 0) + + def test_pixels_green(self): + self._test_pixels_rgb('green', 1) + + def test_pixels_blue(self): + self._test_pixels_rgb('blue', 2) + + def _test_pixels_rgb(self, operation, mask_posn): + method_name = "pixels_" + operation + + pixels_rgb = getattr(pygame.surfarray, method_name) + palette = [(0, 0, 0, 255), + (5, 13, 23, 255), + (29, 31, 37, 255), + (131, 157, 167, 255), + (179, 191, 251, 255)] + plane = [c[mask_posn] for c in palette] + + surf24 = self._make_src_surface(24, srcalpha=False, palette=palette) + surf32 = self._make_src_surface(32, srcalpha=False, palette=palette) + surf32a = self._make_src_surface(32, srcalpha=True, palette=palette) + + for surf in [surf24, surf32, surf32a]: + self.assertFalse(surf.get_locked()) + arr = pixels_rgb(surf) + self.assertTrue(surf.get_locked()) + surf.unlock() + self.assertTrue(surf.get_locked()) + + for (x, y), i in self.test_points: + self.assertEqual(arr[x, y], plane[i]) + + del arr + self.assertFalse(surf.get_locked()) + self.assertEqual(surf.get_locks(), ()) + + # Check exceptions. + targets = [(8, False), + (16, False), + (16, True)] + + for bitsize, srcalpha in targets: + self.assertRaises(ValueError, pixels_rgb, + self._make_surface(bitsize, srcalpha)) + + def test_use_arraytype(self): + + def do_use_arraytype(atype): + pygame.surfarray.use_arraytype(atype) + + pygame.surfarray.use_arraytype('numpy') + self.assertEqual(pygame.surfarray.get_arraytype(), 'numpy') + self.assertRaises(ValueError, do_use_arraytype, 'not an option') + + def test_surf_lock (self): + sf = pygame.Surface ((5, 5), 0, 32) + for atype in pygame.surfarray.get_arraytypes (): + pygame.surfarray.use_arraytype (atype) + + ar = pygame.surfarray.pixels2d (sf) + self.assertTrue(sf.get_locked()) + + sf.unlock () + self.assertTrue(sf.get_locked()) + + del ar + self.assertFalse(sf.get_locked()) + self.assertEqual(sf.get_locks(), ()) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/surflock_test.py b/venv/Lib/site-packages/pygame/tests/surflock_test.py new file mode 100644 index 0000000..931e965 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/surflock_test.py @@ -0,0 +1,143 @@ +import unittest +import sys +import platform + +import pygame + +IS_PYPY = 'PyPy' == platform.python_implementation() + +@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO +class SurfaceLockTest(unittest.TestCase): + + def test_lock(self): + sf = pygame.Surface((5, 5)) + + sf.lock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (sf,)) + + sf.lock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (sf, sf)) + + sf.unlock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (sf,)) + + sf.unlock() + self.assertEqual(sf.get_locked(), False) + self.assertEqual(sf.get_locks(), ()) + + def test_subsurface_lock(self): + sf = pygame.Surface((5, 5)) + subsf = sf.subsurface((1, 1, 2, 2)) + sf2 = pygame.Surface((5, 5)) + + # Simple blits, nothing should happen here. + sf2.blit(subsf, (0, 0)) + sf2.blit(sf, (0, 0)) + + # Test blitting on self: + self.assertRaises(pygame.error, sf.blit, subsf, (0, 0)) + #self.assertRaises(pygame.error, subsf.blit, sf, (0, 0)) + # ^ Fails although it should not in my opinion. If I cannot + # blit the subsurface to the surface, it should not be allowed + # the other way around as well. + + # Test additional locks. + sf.lock() + sf2.blit(subsf, (0, 0)) + self.assertRaises(pygame.error, sf2.blit, sf, (0, 0)) + + subsf.lock() + self.assertRaises(pygame.error, sf2.blit, subsf, (0, 0)) + self.assertRaises(pygame.error, sf2.blit, sf, (0, 0)) + + # sf and subsf are now explicitly locked. Unlock sf, so we can + # (assume) to blit it. + # It will fail though as the subsurface still has a lock around, + # which is okay and correct behaviour. + sf.unlock() + self.assertRaises(pygame.error, sf2.blit, subsf, (0, 0)) + self.assertRaises(pygame.error, sf2.blit, sf, (0, 0)) + + # Run a second unlock on the surface. This should ideally have + # no effect as the subsurface is the locking reason! + sf.unlock() + self.assertRaises(pygame.error, sf2.blit, sf, (0, 0)) + self.assertRaises(pygame.error, sf2.blit, subsf, (0, 0)) + subsf.unlock() + + sf.lock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (sf,)) + self.assertEqual(subsf.get_locked(), False) + self.assertEqual(subsf.get_locks(), ()) + + subsf.lock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (sf, subsf)) + self.assertEqual(subsf.get_locked(), True) + self.assertEqual(subsf.get_locks(), (subsf,)) + + sf.unlock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (subsf,)) + self.assertEqual(subsf.get_locked(), True) + self.assertEqual(subsf.get_locks(), (subsf,)) + + subsf.unlock() + self.assertEqual(sf.get_locked(), False) + self.assertEqual(sf.get_locks(), ()) + self.assertEqual(subsf.get_locked(), False) + self.assertEqual(subsf.get_locks(), ()) + + subsf.lock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (subsf,)) + self.assertEqual(subsf.get_locked(), True) + self.assertEqual(subsf.get_locks(), (subsf,)) + + subsf.lock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (subsf, subsf)) + self.assertEqual(subsf.get_locked(), True) + self.assertEqual(subsf.get_locks(), (subsf, subsf)) + + def test_pxarray_ref(self): + sf = pygame.Surface((5, 5)) + ar = pygame.PixelArray(sf) + ar2 = pygame.PixelArray(sf) + + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (ar, ar2)) + + del ar + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (ar2,)) + + ar = ar2[:] + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (ar2,)) + + del ar + self.assertEqual(sf.get_locked(), True) + self.assertEqual(len(sf.get_locks()), 1) + + def test_buffer(self): + sf = pygame.Surface((5, 5)) + buf = sf.get_buffer() + + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (buf,)) + + sf.unlock() + self.assertEqual(sf.get_locked(), True) + self.assertEqual(sf.get_locks(), (buf,)) + + del buf + self.assertEqual(sf.get_locked(), False) + self.assertEqual(sf.get_locks(), ()) + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/sysfont_test.py b/venv/Lib/site-packages/pygame/tests/sysfont_test.py new file mode 100644 index 0000000..9bfe623 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/sysfont_test.py @@ -0,0 +1,30 @@ +import unittest +import platform + +class SysfontModuleTest(unittest.TestCase): + def todo_test_create_aliases(self): + self.fail() + + def todo_test_initsysfonts(self): + self.fail() + + @unittest.skipIf('Darwin' not in platform.platform(), 'Not mac we skip.') + def test_initsysfonts_darwin(self): + import pygame.sysfont + self.assertTrue(len(pygame.sysfont.get_fonts()) > 10) + + def test_sysfont(self): + import pygame.font + pygame.font.init() + arial = pygame.font.SysFont('Arial', 40) + + def todo_test_initsysfonts_unix(self): + self.fail() + + def todo_test_initsysfonts_win32(self): + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/test_test_.py b/venv/Lib/site-packages/pygame/tests/test_test_.py new file mode 100644 index 0000000..5708909 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_test_.py @@ -0,0 +1,3 @@ +while True: + pass + \ No newline at end of file diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/__init__.py b/venv/Lib/site-packages/pygame/tests/test_utils/__init__.py new file mode 100644 index 0000000..17d0cba --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/__init__.py @@ -0,0 +1,209 @@ +#################################### IMPORTS ################################### + +is_pygame_pkg = __name__.startswith('pygame.tests.') + +import tempfile, sys, pygame, time, os + +################################################################################ +# Python 3.x compatibility +try: + xrange_ = xrange +except NameError: + xrange_ = range + +try: + raw_input_ = raw_input +except NameError: + raw_input_ = input + +def geterror(): + return sys.exc_info()[1] + + +class AssertRaisesRegexMixin(object): + """Provides a way to prevent DeprecationWarnings in python >= 3.2. + + For this mixin to override correctly it needs to be before the + unittest.TestCase in the multiple inheritance hierarchy. + e.g. class TestClass(AssertRaisesRegexMixin, unittest.TestCase) + + This class/mixin and its usage can be removed when pygame no longer + supports python < 3.2. + """ + def assertRaisesRegex(self, *args, **kwargs): + try: + return super(AssertRaisesRegexMixin, self).assertRaisesRegex( + *args, **kwargs) + except AttributeError: + try: + return super(AssertRaisesRegexMixin, self).assertRaisesRegexp( + *args, **kwargs) + except AttributeError: + self.skipTest( + 'No assertRaisesRegex/assertRaisesRegexp method') + + +################################################################################ + +this_dir = os.path.dirname(os.path.abspath(__file__)) +trunk_dir = os.path.split(os.path.split(this_dir)[0])[0] +if is_pygame_pkg: + test_module = 'tests' +else: + test_module = 'test' + +def trunk_relative_path(relative): + return os.path.normpath(os.path.join(trunk_dir, relative)) + +def fixture_path(path): + return trunk_relative_path(os.path.join(test_module, 'fixtures', path)) + +def example_path(path): + return trunk_relative_path(os.path.join('examples', path)) + +sys.path.insert(0, trunk_relative_path('.')) + + +################################## TEMP FILES ################################## + +def get_tmp_dir(): + return tempfile.mkdtemp() + +################################################################################ + +def question(q): + return raw_input_('\n%s (y/n): ' % q.rstrip(' ')).lower().strip() == 'y' + +def prompt(p): + return raw_input_('\n%s (press enter to continue): ' % p.rstrip(' ')) + +#################################### HELPERS ################################### + +def rgba_between(value, minimum=0, maximum=255): + if value < minimum: return minimum + elif value > maximum: return maximum + else: return value + +def combinations(seqs): + """ + + Recipe 496807 from ActiveState Python CookBook + + Non recursive technique for getting all possible combinations of a sequence + of sequences. + + """ + + r=[[]] + for x in seqs: + r = [ i + [y] for y in x for i in r ] + return r + +def gradient(width, height): + """ + + Yields a pt and corresponding RGBA tuple, for every (width, height) combo. + Useful for generating gradients. + + Actual gradient may be changed, no tests rely on specific values. + + Used in transform.rotate lossless tests to generate a fixture. + + """ + + for l in xrange_(width): + for t in xrange_(height): + yield (l,t), tuple(map(rgba_between, (l, t, l, l+t))) + + +def rect_area_pts(rect): + for l in xrange_(rect.left, rect.right): + for t in xrange_(rect.top, rect.bottom): + yield l, t + +def rect_perimeter_pts(rect): + """ + + Returns pts ((L, T) tuples) encompassing the perimeter of a rect. + + The order is clockwise: + + topleft to topright + topright to bottomright + bottomright to bottomleft + bottomleft to topleft + + Duplicate pts are not returned + + """ + clock_wise_from_top_left = ( + [(l, rect.top) for l in xrange_(rect.left, rect.right) ], + [(rect.right -1, t) for t in xrange_(rect.top + 1, rect.bottom) ], + [(l, rect.bottom -1) for l in xrange_(rect.right -2, rect.left -1, -1)], + [(rect.left, t) for t in xrange_(rect.bottom -2, rect.top, -1)] + ) + + for line in clock_wise_from_top_left: + for pt in line: yield pt + +def rect_outer_bounds(rect): + """ + + Returns topleft outerbound if possible and then the other pts, that are + "exclusive" bounds of the rect + + ?------O + |RECT| ?|0)uterbound + |----| + O O + + """ + return ( + (rect.left is not 0 and [(rect.left-1, rect.top)] or []) + + [ rect.topright, + rect.bottomleft, + rect.bottomright] + ) + +def import_submodule(module): + m = __import__(module) + for n in module.split('.')[1:]: + m = getattr(m, n) + return m + + +class SurfaceSubclass(pygame.Surface): + """A subclassed Surface to test inheritance.""" + def __init__(self, *args, **kwargs): + super(SurfaceSubclass, self).__init__(*args, **kwargs) + self.test_attribute = True + + +def test(): + """ + + Lightweight test for helpers + + """ + + r = pygame.Rect(0, 0, 10, 10) + assert ( + rect_outer_bounds ( r ) == [(10, 0), # tr + ( 0, 10), # bl + (10, 10)] # br + ) + + assert len(list(rect_area_pts(r))) == 100 + + + r = pygame.Rect(0, 0, 3, 3) + assert list(rect_perimeter_pts(r)) == [ + (0, 0), (1, 0), (2, 0), # tl -> tr + (2, 1), (2, 2), # tr -> br + (1, 2), (0, 2), # br -> bl + (0, 1) # bl -> tl + ] + + print ('Tests: OK') + +################################################################################ diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf46b87d65b666d14691b354780ec20435bcd565 GIT binary patch literal 6650 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 A>i_@% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/buftools.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/buftools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d6791abfa577f243fb98c2e258ec0104129343b GIT binary patch literal 17275 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

      4HeQ2r^ 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 ZM(s~T4%?aJ)Aq34k93+!OXaqV{{t>W#9aUY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/run_tests.cpython-37.pyc b/venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/run_tests.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..334e505ef27515dc6c101812b363c7d63cb538b1 GIT binary patch literal 8913 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

      =j7%+ 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 JeuSmJ{|EnH-6;S7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/arrinter.py b/venv/Lib/site-packages/pygame/tests/test_utils/arrinter.py new file mode 100644 index 0000000..b5808f9 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/arrinter.py @@ -0,0 +1,398 @@ +import sys +import ctypes +from ctypes import * +import unittest + +__all__ = ['PAI_CONTIGUOUS', 'PAI_FORTRAN', 'PAI_ALIGNED', + 'PAI_NOTSWAPPED', 'PAI_WRITEABLE', 'PAI_ARR_HAS_DESCR', + 'ArrayInterface',] + +try: + c_ssize_t # Undefined in early Python versions +except NameError: + if sizeof(c_uint) == sizeof(c_void_p): + c_size_t = c_uint + c_ssize_t = c_int + elif sizeof(c_ulong) == sizeof(c_void_p): + c_size_t = c_ulong + c_ssize_t = c_long + elif sizeof(c_ulonglong) == sizeof(c_void_p): + c_size_t = c_ulonglong + c_ssize_t = c_longlong + + +SIZEOF_VOID_P = sizeof(c_void_p) +if SIZEOF_VOID_P <= sizeof(c_int): + Py_intptr_t = c_int +elif SIZEOF_VOID_P <= sizeof(c_long): + Py_intptr_t = c_long +elif 'c_longlong' in globals() and SIZEOF_VOID_P <= sizeof(c_longlong): + Py_intptr_t = c_longlong +else: + raise RuntimeError("Unrecognized pointer size %i" % (pointer_size,)) + +class PyArrayInterface(Structure): + _fields_ = [('two', c_int), ('nd', c_int), ('typekind', c_char), + ('itemsize', c_int), ('flags', c_int), + ('shape', POINTER(Py_intptr_t)), + ('strides', POINTER(Py_intptr_t)), + ('data', c_void_p), ('descr', py_object)] + +PAI_Ptr = POINTER(PyArrayInterface) +try: + PyCObject_AsVoidPtr = pythonapi.PyCObject_AsVoidPtr +except AttributeError: + def PyCObject_AsVoidPtr(o): + raise TypeError("Not available") +else: + PyCObject_AsVoidPtr.restype = c_void_p + PyCObject_AsVoidPtr.argtypes = [py_object] + PyCObject_GetDesc = pythonapi.PyCObject_GetDesc + PyCObject_GetDesc.restype = c_void_p + PyCObject_GetDesc.argtypes = [py_object] +try: + PyCapsule_IsValid = pythonapi.PyCapsule_IsValid +except AttributeError: + def PyCapsule_IsValid(capsule, name): + return 0 +else: + PyCapsule_IsValid.restype = c_int + PyCapsule_IsValid.argtypes = [py_object, c_char_p] + PyCapsule_GetPointer = pythonapi.PyCapsule_GetPointer + PyCapsule_GetPointer.restype = c_void_p + PyCapsule_GetPointer.argtypes = [py_object, c_char_p] + PyCapsule_GetContext = pythonapi.PyCapsule_GetContext + PyCapsule_GetContext.restype = c_void_p + PyCapsule_GetContext.argtypes = [py_object] + +if sys.version_info >= (3,): # Python3 + PyCapsule_Destructor = CFUNCTYPE(None, py_object) + PyCapsule_New = pythonapi.PyCapsule_New + PyCapsule_New.restype = py_object + PyCapsule_New.argtypes = [c_void_p, c_char_p, POINTER(PyCapsule_Destructor)] + def capsule_new(p): + return PyCapsule_New(addressof(p), None, None) +else: + PyCObject_Destructor = CFUNCTYPE(None, c_void_p) + PyCObject_FromVoidPtr = pythonapi.PyCObject_FromVoidPtr + PyCObject_FromVoidPtr.restype = py_object + PyCObject_FromVoidPtr.argtypes = [c_void_p, POINTER(PyCObject_Destructor)] + def capsule_new(p): + return PyCObject_FromVoidPtr(addressof(p), None) + +PAI_CONTIGUOUS = 0x01 +PAI_FORTRAN = 0x02 +PAI_ALIGNED = 0x100 +PAI_NOTSWAPPED = 0x200 +PAI_WRITEABLE = 0x400 +PAI_ARR_HAS_DESCR = 0x800 + +class ArrayInterface(object): + def __init__(self, arr): + try: + self._cobj = arr.__array_struct__ + except AttributeError: + raise TypeError("The array object lacks an array structure") + if not self._cobj: + raise TypeError("The array object has a NULL array structure value") + try: + vp = PyCObject_AsVoidPtr(self._cobj) + except TypeError: + if PyCapsule_IsValid(self._cobj, None): + vp = PyCapsule_GetPointer(self._cobj, None) + else: + raise TypeError("The array object has an invalid array structure") + self.desc = PyCapsule_GetContext(self._cobj) + else: + self.desc = PyCObject_GetDesc(self._cobj) + self._inter = cast(vp, PAI_Ptr)[0] + + def __getattr__(self, name): + if (name == 'typekind'): + return self._inter.typekind.decode('latin-1') + return getattr(self._inter, name) + + def __str__(self): + if isinstance(self.desc, tuple): + ver = self.desc[0] + else: + ver = "N/A" + return ("nd: %i\n" + "typekind: %s\n" + "itemsize: %i\n" + "flags: %s\n" + "shape: %s\n" + "strides: %s\n" + "ver: %s\n" % + (self.nd, self.typekind, self.itemsize, + format_flags(self.flags), + format_shape(self.nd, self.shape), + format_strides(self.nd, self.strides), ver)) + +def format_flags(flags): + names = [] + for flag, name in [(PAI_CONTIGUOUS, 'CONTIGUOUS'), + (PAI_FORTRAN, 'FORTRAN'), + (PAI_ALIGNED, 'ALIGNED'), + (PAI_NOTSWAPPED, 'NOTSWAPPED'), + (PAI_WRITEABLE, 'WRITEABLE'), + (PAI_ARR_HAS_DESCR, 'ARR_HAS_DESCR')]: + if flag & flags: + names.append(name) + return ', '.join(names) + +def format_shape(nd, shape): + return ', '.join([str(shape[i]) for i in range(nd)]) + +def format_strides(nd, strides): + return ', '.join([str(strides[i]) for i in range(nd)]) + +class Exporter(object): + def __init__(self, shape, + typekind=None, itemsize=None, strides=None, + descr=None, flags=None): + if typekind is None: + typekind = 'u' + if itemsize is None: + itemsize = 1 + if flags is None: + flags = PAI_WRITEABLE | PAI_ALIGNED | PAI_NOTSWAPPED + if descr is not None: + flags |= PAI_ARR_HAS_DESCR + if len(typekind) != 1: + raise ValueError("Argument 'typekind' must be length 1 string") + nd = len(shape) + self.typekind = typekind + self.itemsize = itemsize + self.nd = nd + self.shape = tuple(shape) + self._shape = (c_ssize_t * self.nd)(*self.shape) + if strides is None: + self._strides = (c_ssize_t * self.nd)() + self._strides[self.nd - 1] = self.itemsize + for i in range(self.nd - 1, 0, -1): + self._strides[i - 1] = self.shape[i] * self._strides[i] + strides = tuple(self._strides) + self.strides = strides + elif len(strides) == nd: + self.strides = tuple(strides) + self._strides = (c_ssize_t * self.nd)(*self.strides) + else: + raise ValueError("Mismatch in length of strides and shape") + self.descr = descr + if self.is_contiguous('C'): + flags |= PAI_CONTIGUOUS + if self.is_contiguous('F'): + flags |= PAI_FORTRAN + self.flags = flags + sz = max(shape[i] * strides[i] for i in range(nd)) + self._data = (c_ubyte * sz)() + self.data = addressof(self._data) + self._inter = PyArrayInterface(2, nd, typekind.encode('latin_1'), + itemsize, flags, self._shape, + self._strides, self.data, descr) + self.len = itemsize + for i in range(nd): + self.len *= self.shape[i] + + __array_struct__ = property(lambda self: capsule_new(self._inter)) + + def is_contiguous(self, fortran): + if fortran in "CA": + if self.strides[-1] == self.itemsize: + for i in range(self.nd - 1, 0, -1): + if self.strides[i - 1] != self.shape[i] * self.strides[i]: + break + else: + return True + if fortran in "FA": + if self.strides[0] == self.itemsize: + for i in range(0, self.nd - 1): + if self.strides[i + 1] != self.shape[i] * self.strides[i]: + break + else: + return True + return False + +class Array(Exporter): + _ctypes = {('u', 1): c_uint8, + ('u', 2): c_uint16, + ('u', 4): c_uint32, + ('u', 8): c_uint64, + ('i', 1): c_int8, + ('i', 2): c_int16, + ('i', 4): c_int32, + ('i', 8): c_int64} + + def __init__(self, *args, **kwds): + super(Array, self).__init__(*args, **kwds) + try: + if self.flags & PAI_NOTSWAPPED: + ct = self._ctypes[self.typekind, self.itemsize] + elif c_int.__ctype_le__ is c_int: + ct = self._ctypes[self.typekind, self.itemsize].__ctype_be__ + else: + ct = self._ctypes[self.typekind, self.itemsize].__ctype_le__ + except KeyError: + ct = c_uint8 * self.itemsize + self._ctype = ct + self._ctype_p = POINTER(ct) + def __getitem__(self, key): + return cast(self._addr_at(key), self._ctype_p)[0] + def __setitem__(self, key, value): + cast(self._addr_at(key), self._ctype_p)[0] = value + def _addr_at(self, key): + if not isinstance(key, tuple): + key = key, + if len(key) != self.nd: + raise ValueError("wrong number of indexes") + for i in range(self.nd): + if not (0 <= key[i] < self.shape[i]): + raise IndexError("index {} out of range".format(i)) + return self.data + sum(i * s for i, s in zip(key, self.strides)) + +class ExporterTest(unittest.TestCase): + def test_strides(self): + self.check_args(0, (10,), 'u', (2,), 20, 20, 2) + self.check_args(0, (5, 3), 'u', (6, 2), 30, 30, 2) + self.check_args(0, (7, 3, 5), 'u', (30, 10, 2), 210, 210, 2) + self.check_args(0, (13, 5, 11, 3), 'u', (330, 66, 6, 2), 4290, 4290, 2) + self.check_args(3, (7, 3, 5), 'i', (2, 14, 42), 210, 210, 2) + self.check_args(3, (7, 3, 5), 'x', (2, 16, 48), 210, 240, 2) + self.check_args(3, (13, 5, 11, 3), '%', (440, 88, 8, 2), 4290, 5720, 2) + self.check_args(3, (7, 5), '-', (15, 3), 105, 105, 3) + self.check_args(3, (7, 5), '*', (3, 21), 105, 105, 3) + self.check_args(3, (7, 5), ' ', (3, 24), 105, 120, 3) + + def test_is_contiguous(self): + a = Exporter((10,), itemsize=2) + self.assertTrue(a.is_contiguous('C')) + self.assertTrue(a.is_contiguous('F')) + self.assertTrue(a.is_contiguous('A')) + a = Exporter((10, 4), itemsize=2) + self.assertTrue(a.is_contiguous('C')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('F')) + a = Exporter((13, 5, 11, 3), itemsize=2, strides=(330, 66, 6, 2)) + self.assertTrue(a.is_contiguous('C')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('F')) + a = Exporter((10, 4), itemsize=2, strides=(2, 20)) + self.assertTrue(a.is_contiguous('F')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('C')) + a = Exporter((13, 5, 11, 3), itemsize=2, strides=(2, 26, 130, 1430)) + self.assertTrue(a.is_contiguous('F')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('C')) + a = Exporter((2, 11, 6, 4), itemsize=2, strides=(576, 48, 8, 2)) + self.assertFalse(a.is_contiguous('A')) + a = Exporter((2, 11, 6, 4), itemsize=2, strides=(2, 4, 48, 288)) + self.assertFalse(a.is_contiguous('A')) + a = Exporter((3, 2, 2), itemsize=2, strides=(16, 8, 4)) + self.assertFalse(a.is_contiguous('A')) + a = Exporter((3, 2, 2), itemsize=2, strides=(4, 12, 24)) + self.assertFalse(a.is_contiguous('A')) + + def check_args(self, call_flags, + shape, typekind, strides, length, bufsize, itemsize, + offset=0): + if call_flags & 1: + typekind_arg = typekind + else: + typekind_arg = None + if call_flags & 2: + strides_arg = strides + else: + strides_arg = None + a = Exporter(shape, itemsize=itemsize, strides=strides_arg) + self.assertEqual(sizeof(a._data), bufsize) + self.assertEqual(a.data, ctypes.addressof(a._data) + offset) + m = ArrayInterface(a) + self.assertEqual(m.data, a.data) + self.assertEqual(m.itemsize, itemsize) + self.assertEqual(tuple(m.shape[0:m.nd]), shape) + self.assertEqual(tuple(m.strides[0:m.nd]), strides) + +class ArrayTest(unittest.TestCase): + + def __init__(self, *args, **kwds): + unittest.TestCase.__init__(self, *args, **kwds) + self.a = Array((20, 15), 'i', 4) + + def setUp(self): + # Every test starts with a zeroed array. + memset(self.a.data, 0, sizeof(self.a._data)) + + def test__addr_at(self): + a = self.a + self.assertEqual(a._addr_at((0, 0)), a.data) + self.assertEqual(a._addr_at((0, 1)), a.data + 4) + self.assertEqual(a._addr_at((1, 0)), a.data + 60) + self.assertEqual(a._addr_at((1, 1)), a.data + 64) + + def test_indices(self): + a = self.a + self.assertEqual(a[0, 0], 0) + self.assertEqual(a[19, 0], 0) + self.assertEqual(a[0, 14], 0) + self.assertEqual(a[19, 14], 0) + self.assertEqual(a[5, 8], 0) + a[0, 0] = 12 + a[5, 8] = 99 + self.assertEqual(a[0, 0], 12) + self.assertEqual(a[5, 8], 99) + self.assertRaises(IndexError, a.__getitem__, (-1, 0)) + self.assertRaises(IndexError, a.__getitem__, (0, -1)) + self.assertRaises(IndexError, a.__getitem__, (20, 0)) + self.assertRaises(IndexError, a.__getitem__, (0, 15)) + self.assertRaises(ValueError, a.__getitem__, 0) + self.assertRaises(ValueError, a.__getitem__, (0, 0, 0)) + a = Array((3,), 'i', 4) + a[1] = 333 + self.assertEqual(a[1], 333) + + def test_typekind(self): + a = Array((1,), 'i', 4) + self.assertTrue(a._ctype is c_int32) + self.assertTrue(a._ctype_p is POINTER(c_int32)) + a = Array((1,), 'u', 4) + self.assertTrue(a._ctype is c_uint32) + self.assertTrue(a._ctype_p is POINTER(c_uint32)) + a = Array((1,), 'f', 4) # float types unsupported: size system dependent + ct = a._ctype + self.assertTrue(issubclass(ct, ctypes.Array)) + self.assertEqual(sizeof(ct), 4) + + def test_itemsize(self): + for size in [1, 2, 4, 8]: + a = Array((1,), 'i', size) + ct = a._ctype + self.assertTrue(issubclass(ct, ctypes._SimpleCData)) + self.assertEqual(sizeof(ct), size) + + def test_oddball_itemsize(self): + for size in [3, 5, 6, 7, 9]: + a = Array((1,), 'i', size) + ct = a._ctype + self.assertTrue(issubclass(ct, ctypes.Array)) + self.assertEqual(sizeof(ct), size) + + def test_byteswapped(self): + a = Array((1,), 'u', 4, flags=(PAI_ALIGNED | PAI_WRITEABLE)) + ct = a._ctype + self.assertTrue(ct is not c_uint32) + if sys.byteorder == 'little': + self.assertTrue(ct is c_uint32.__ctype_be__) + else: + self.assertTrue(ct is c_uint32.__ctype_le__) + i = 0xa0b0c0d + n = c_uint32(i) + a[0] = i + self.assertEqual(a[0], i) + self.assertEqual(a._data[0:4], + cast(addressof(n), POINTER(c_uint8))[3:-1:-1]) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/async_sub.py b/venv/Lib/site-packages/pygame/tests/test_utils/async_sub.py new file mode 100644 index 0000000..53d6483 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/async_sub.py @@ -0,0 +1,272 @@ +################################################################################ +""" + +Modification of http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554 + +""" + +#################################### IMPORTS ################################### + +import os +import platform +import subprocess +import errno +import time +import sys +import unittest +import tempfile + +def geterror (): + return sys.exc_info()[1] + +if sys.version_info >= (3,): + null_byte = '\x00'.encode('ascii') +else: + null_byte = '\x00' + +if platform.system() == 'Windows': + if sys.version_info >= (3,): + # Test date should be in ascii. + def encode(s): + return s.encode('ascii') + + def decode(b): + return b.decode('ascii') + else: + # Strings only; do nothing + def encode(s): + return s + + def decode(b): + return b + + try: + import ctypes + from ctypes.wintypes import DWORD + kernel32 = ctypes.windll.kernel32 + TerminateProcess = ctypes.windll.kernel32.TerminateProcess + def WriteFile(handle, data, ol = None): + c_written = DWORD() + success = ctypes.windll.kernel32.WriteFile(handle, ctypes.create_string_buffer(encode(data)), len(data), ctypes.byref(c_written), ol) + return ctypes.windll.kernel32.GetLastError(), c_written.value + def ReadFile(handle, desired_bytes, ol = None): + c_read = DWORD() + buffer = ctypes.create_string_buffer(desired_bytes+1) + success = ctypes.windll.kernel32.ReadFile(handle, buffer, desired_bytes, ctypes.byref(c_read), ol) + buffer[c_read.value] = null_byte + return ctypes.windll.kernel32.GetLastError(), decode(buffer.value) + def PeekNamedPipe(handle, desired_bytes): + c_avail = DWORD() + c_message = DWORD() + if desired_bytes > 0: + c_read = DWORD() + buffer = ctypes.create_string_buffer(desired_bytes+1) + success = ctypes.windll.kernel32.PeekNamedPipe(handle, buffer, desired_bytes, ctypes.byref(c_read), ctypes.byref(c_avail), ctypes.byref(c_message)) + buffer[c_read.value] = null_byte + return decode(buffer.value), c_avail.value, c_message.value + else: + success = ctypes.windll.kernel32.PeekNamedPipe(handle, None, desired_bytes, None, ctypes.byref(c_avail), ctypes.byref(c_message)) + return "", c_avail.value, c_message.value + + except ImportError: + from win32file import ReadFile, WriteFile + from win32pipe import PeekNamedPipe + from win32api import TerminateProcess + import msvcrt + +else: + from signal import SIGINT, SIGTERM, SIGKILL + import select + import fcntl + +################################### CONSTANTS ################################## + +PIPE = subprocess.PIPE + +################################################################################ + +class Popen(subprocess.Popen): + def recv(self, maxsize=None): + return self._recv('stdout', maxsize) + + def recv_err(self, maxsize=None): + return self._recv('stderr', maxsize) + + def send_recv(self, input='', maxsize=None): + return self.send(input), self.recv(maxsize), self.recv_err(maxsize) + + def read_async(self, wait=.1, e=1, tr=5, stderr=0): + if tr < 1: + tr = 1 + x = time.time()+ wait + y = [] + r = '' + pr = self.recv + if stderr: + pr = self.recv_err + while time.time() < x or r: + r = pr() + if r is None: + if e: + raise Exception("Other end disconnected!") + else: + break + elif r: + y.append(r) + else: + time.sleep(max((x-time.time())/tr, 0)) + return ''.join(y) + + def send_all(self, data): + while len(data): + sent = self.send(data) + if sent is None: + raise Exception("Other end disconnected!") + data = buffer(data, sent) + + def get_conn_maxsize(self, which, maxsize): + if maxsize is None: + maxsize = 1024 + elif maxsize < 1: + maxsize = 1 + return getattr(self, which), maxsize + + def _close(self, which): + getattr(self, which).close() + setattr(self, which, None) + + if platform.system() == 'Windows': + def kill(self): + # Recipes + #http://me.in-berlin.de/doc/python/faq/windows.html#how-do-i-emulate-os-kill-in-windows + #http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/347462 + + """kill function for Win32""" + TerminateProcess(int(self._handle), 0) # returns None + + def send(self, input): + if not self.stdin: + return None + + try: + x = msvcrt.get_osfhandle(self.stdin.fileno()) + (errCode, written) = WriteFile(x, input) + except ValueError: + return self._close('stdin') + except (subprocess.pywintypes.error, Exception): + if geterror()[0] in (109, errno.ESHUTDOWN): + return self._close('stdin') + raise + + return written + + def _recv(self, which, maxsize): + conn, maxsize = self.get_conn_maxsize(which, maxsize) + if conn is None: + return None + + try: + x = msvcrt.get_osfhandle(conn.fileno()) + (read, nAvail, nMessage) = PeekNamedPipe(x, 0) + if maxsize < nAvail: + nAvail = maxsize + if nAvail > 0: + (errCode, read) = ReadFile(x, nAvail, None) + except ValueError: + return self._close(which) + except (subprocess.pywintypes.error, Exception): + if geterror()[0] in (109, errno.ESHUTDOWN): + return self._close(which) + raise + + if self.universal_newlines: + # Translate newlines. For Python 3.x assume read is text. + # If bytes then another solution is needed. + read = read.replace("\r\n", "\n").replace("\r", "\n") + return read + + else: + def kill(self): + for i, sig in enumerate([SIGTERM, SIGKILL] * 2): + if i % 2 == 0: os.kill(self.pid, sig) + time.sleep((i * (i % 2) / 5.0) + 0.01) + + killed_pid, stat = os.waitpid(self.pid, os.WNOHANG) + if killed_pid != 0: return + + def send(self, input): + if not self.stdin: + return None + + if not select.select([], [self.stdin], [], 0)[1]: + return 0 + + try: + written = os.write(self.stdin.fileno(), input) + except OSError: + if geterror()[0] == errno.EPIPE: #broken pipe + return self._close('stdin') + raise + + return written + + def _recv(self, which, maxsize): + conn, maxsize = self.get_conn_maxsize(which, maxsize) + if conn is None: + return None + + if not select.select([conn], [], [], 0)[0]: + return '' + + r = conn.read(maxsize) + if not r: + return self._close(which) + + if self.universal_newlines: + r = r.replace("\r\n", "\n").replace("\r", "\n") + return r + + +################################################################################ + +def proc_in_time_or_kill(cmd, time_out, wd = None, env = None): + proc = Popen ( + cmd, cwd = wd, env = env, + stdin = subprocess.PIPE, stdout = subprocess.PIPE, + stderr = subprocess.STDOUT, universal_newlines = 1 + ) + + ret_code = None + response = [] + + t = time.time() + while ret_code is None and ((time.time() -t) < time_out): + ret_code = proc.poll() + response += [proc.read_async(wait=0.1, e=0)] + + if ret_code is None: + ret_code = '"Process timed out (time_out = %s secs) ' % time_out + try: + proc.kill() + ret_code += 'and was successfully terminated"' + except Exception: + ret_code += ('and termination failed (exception: %s)"' % + (geterror(),)) + + return ret_code, ''.join(response) + +################################################################################ + +class AsyncTest(unittest.TestCase): + def test_proc_in_time_or_kill(self): + ret_code, response = proc_in_time_or_kill( + [sys.executable, '-c', 'while 1: pass'], time_out = 1 + ) + + self.assertIn('rocess timed out', ret_code) + self.assertIn('successfully terminated', ret_code) + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/buftools.py b/venv/Lib/site-packages/pygame/tests/test_utils/buftools.py new file mode 100644 index 0000000..1e2ab93 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/buftools.py @@ -0,0 +1,555 @@ +"""Module pygame.tests.test_utils.array + +Export the Exporter and Importer classes. + +Class Exporter has configurable shape and strides. Exporter objects +provide a convient target for unit tests on Pygame objects and functions that +import a new buffer interface. + +Class Importer imports a buffer interface with the given PyBUF_* flags. +It returns NULL Py_buffer fields as None. The shape, strides, and suboffsets +arrays are returned as tuples of ints. All Py_buffer field properties are +read-only. This class is useful in comparing exported buffer interfaces +with the actual request. The simular Python builtin memoryview currently +does not support configurable PyBUF_* flags. + +This module contains its own unit tests. When Pygame is installed, these tests +can be run with the following command line statement: + +python -m pygame.tests.test_utils.array + +""" +import pygame +if not pygame.HAVE_NEWBUF: + emsg = "This Pygame build does not support the new buffer protocol" + raise ImportError(emsg) +import pygame.newbuffer +from pygame.newbuffer import (PyBUF_SIMPLE, PyBUF_FORMAT, PyBUF_ND, + PyBUF_WRITABLE, PyBUF_STRIDES, PyBUF_C_CONTIGUOUS, + PyBUF_F_CONTIGUOUS, PyBUF_ANY_CONTIGUOUS, + PyBUF_INDIRECT, PyBUF_STRIDED, PyBUF_STRIDED_RO, + PyBUF_RECORDS, PyBUF_RECORDS_RO, PyBUF_FULL, + PyBUF_FULL_RO, PyBUF_CONTIG, PyBUF_CONTIG_RO) + +import unittest +import sys +import ctypes +import operator +try: + reduce +except NameError: + from functools import reduce + +__all__ = ["Exporter", "Importer"] + +try: + ctypes.c_ssize_t +except AttributeError: + void_p_sz = ctypes.sizeof(ctypes.c_void_p) + if ctypes.sizeof(ctypes.c_short) == void_p_sz: + ctypes.c_ssize_t = ctypes.c_short + elif ctypes.sizeof(ctypes.c_int) == void_p_sz: + ctypes.c_ssize_t = ctypes.c_int + elif ctypes.sizeof(ctypes.c_long) == void_p_sz: + ctypes.c_ssize_t = ctypes.c_long + elif ctypes.sizeof(ctypes.c_longlong) == void_p_sz: + ctypes.c_ssize_t = ctypes.c_longlong + else: + raise RuntimeError("Cannot set c_ssize_t: sizeof(void *) is %i" % + void_p_sz) + +def _prop_get(fn): + return property(fn) + +class Exporter(pygame.newbuffer.BufferMixin): + """An object that exports a multi-dimension new buffer interface + + The only array operation this type supports is to export a buffer. + """ + prefixes = {'@': '', '=': '=', '<': '=', '>': '=', '!': '=', + '2': '2', '3': '3', '4': '4', '5': '5', + '6': '6', '7': '7', '8': '8', '9': '9'} + types = {'c': ctypes.c_char, 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, + '=c': ctypes.c_int8, '=b': ctypes.c_int8, '=B': ctypes.c_uint8, + '?': ctypes.c_bool, '=?': ctypes.c_int8, + 'h': ctypes.c_short, 'H': ctypes.c_ushort, + '=h': ctypes.c_int16, '=H': ctypes.c_uint16, + 'i': ctypes.c_int, 'I': ctypes.c_uint, + '=i': ctypes.c_int32, '=I': ctypes.c_uint32, + 'l': ctypes.c_long, 'L': ctypes.c_ulong, + '=l': ctypes.c_int32, '=L': ctypes.c_uint32, + 'q': ctypes.c_longlong, 'Q': ctypes.c_ulonglong, + '=q': ctypes.c_int64, '=Q': ctypes.c_uint64, + 'f': ctypes.c_float, 'd': ctypes.c_double, + 'P': ctypes.c_void_p, + 'x': ctypes.c_ubyte * 1, + '2x': ctypes.c_ubyte * 2, + '3x': ctypes.c_ubyte * 3, + '4x': ctypes.c_ubyte * 4, + '5x': ctypes.c_ubyte * 5, + '6x': ctypes.c_ubyte * 6, + '7x': ctypes.c_ubyte * 7, + '8x': ctypes.c_ubyte * 8, + '9x': ctypes.c_ubyte * 9} + + def __init__(self, + shape, + format=None, + strides=None, + readonly=None, + itemsize=None): + if format is None: + format = 'B' + if readonly is None: + readonly = False + prefix = '' + typecode = '' + i = 0 + if i < len(format): + try: + prefix = self.prefixes[format[i]] + i += 1 + except LookupError: + pass + if i < len(format) and format[i] == '1': + i += 1 + if i == len(format) - 1: + typecode = format[i] + if itemsize is None: + try: + itemsize = ctypes.sizeof(self.types[prefix + typecode]) + except KeyError: + raise ValueError("Unknown item format '" + format + "'") + self.readonly = bool(readonly) + self.format = format + self._format = ctypes.create_string_buffer(format.encode('latin_1')) + self.ndim = len(shape) + self.itemsize = itemsize + self.len = reduce(operator.mul, shape, 1) * self.itemsize + self.shape = tuple(shape) + self._shape = (ctypes.c_ssize_t * self.ndim)(*self.shape) + if strides is None: + self._strides = (ctypes.c_ssize_t * self.ndim)() + self._strides[self.ndim - 1] = itemsize + for i in range(self.ndim - 1, 0, -1): + self._strides[i - 1] = self.shape[i] * self._strides[i] + self.strides = tuple(self._strides) + elif len(strides) == self.ndim: + self.strides = tuple(strides) + self._strides = (ctypes.c_ssize_t * self.ndim)(*self.strides) + else: + raise ValueError("Mismatch in length of strides and shape") + buflen = max(d * abs(s) for d, s in zip(self.shape, self.strides)) + self.buflen = buflen + self._buf = (ctypes.c_ubyte * buflen)() + offset = sum((d - 1) * abs(s) + for d, s in zip(self.shape, self.strides) if s < 0) + self.buf = ctypes.addressof(self._buf) + offset + + def buffer_info(self): + return (addressof(self.buffer), self.shape[0]) + + def tobytes(self): + return cast(self.buffer, POINTER(c_char))[0:self._len] + + def __len__(self): + return self.shape[0] + + def _get_buffer(self, view, flags): + from ctypes import addressof + if (flags & PyBUF_WRITABLE) == PyBUF_WRITABLE and self.readonly: + raise BufferError("buffer is read-only") + if ((flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS and + not self.is_contiguous('C')): + raise BufferError("data is not C contiguous") + if ((flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS and + not self.is_contiguous('F')): + raise BufferError("data is not F contiguous") + if ((flags & PyBUF_ANY_CONTIGUOUS) == PyBUF_ANY_CONTIGUOUS and + not self.is_contiguous('A')): + raise BufferError("data is not contiguous") + view.buf = self.buf + view.readonly = self.readonly + view.len = self.len + if flags | PyBUF_WRITABLE == PyBUF_WRITABLE: + view.ndim = 0 + else: + view.ndim = self.ndim + view.itemsize = self.itemsize + if (flags & PyBUF_FORMAT) == PyBUF_FORMAT: + view.format = addressof(self._format) + else: + view.format = None + if (flags & PyBUF_ND) == PyBUF_ND: + view.shape = addressof(self._shape) + elif self.is_contiguous('C'): + view.shape = None + else: + raise BufferError( + "shape required for {} dimensional data".format(self.ndim)) + if (flags & PyBUF_STRIDES) == PyBUF_STRIDES: + view.strides = ctypes.addressof(self._strides) + elif view.shape is None or self.is_contiguous('C'): + view.strides = None + else: + raise BufferError("strides required for none C contiguous data") + view.suboffsets = None + view.internal = None + view.obj = self + + def is_contiguous(self, fortran): + if fortran in "CA": + if self.strides[-1] == self.itemsize: + for i in range(self.ndim - 1, 0, -1): + if self.strides[i - 1] != self.shape[i] * self.strides[i]: + break + else: + return True + if fortran in "FA": + if self.strides[0] == self.itemsize: + for i in range(0, self.ndim - 1): + if self.strides[i + 1] != self.shape[i] * self.strides[i]: + break + else: + return True + return False + + +class Importer(object): + """An object that imports a new buffer interface + + The fields of the Py_buffer C struct are exposed by identically + named Importer read-only properties. + """ + def __init__(self, obj, flags): + self._view = pygame.newbuffer.Py_buffer() + self._view.get_buffer(obj, flags) + @property + def obj(self): + """return object or None for NULL field""" + return self._view.obj + @property + def buf(self): + """return int or None for NULL field""" + return self._view.buf + @property + def len(self): + """return int""" + return self._view.len + @property + def readonly(self): + """return bool""" + return self._view.readonly + @property + def format(self): + """return bytes or None for NULL field""" + format_addr = self._view.format + if format_addr is None: + return None + return ctypes.cast(format_addr, ctypes.c_char_p).value.decode('ascii') + @property + def itemsize(self): + """return int""" + return self._view.itemsize + @property + def ndim(self): + """return int""" + return self._view.ndim + @property + def shape(self): + """return int tuple or None for NULL field""" + return self._to_ssize_tuple(self._view.shape) + @property + def strides(self): + """return int tuple or None for NULL field""" + return self._to_ssize_tuple(self._view.strides) + @property + def suboffsets(self): + """return int tuple or None for NULL field""" + return self._to_ssize_tuple(self._view.suboffsets) + @property + def internal(self): + """return int or None for NULL field""" + return self._view.internal + + def _to_ssize_tuple(self, addr): + from ctypes import cast, POINTER, c_ssize_t + + if addr is None: + return None + return tuple(cast(addr, POINTER(c_ssize_t))[0:self._view.ndim]) + + +class ExporterTest(unittest.TestCase): + """Class Exporter unit tests""" + def test_formats(self): + char_sz = ctypes.sizeof(ctypes.c_char) + short_sz = ctypes.sizeof(ctypes.c_short) + int_sz = ctypes.sizeof(ctypes.c_int) + long_sz = ctypes.sizeof(ctypes.c_long) + longlong_sz = ctypes.sizeof(ctypes.c_longlong) + float_sz = ctypes.sizeof(ctypes.c_float) + double_sz = ctypes.sizeof(ctypes.c_double) + voidp_sz = ctypes.sizeof(ctypes.c_void_p) + bool_sz = ctypes.sizeof(ctypes.c_bool) + + self.check_args(0, (1,), 'B', (1,), 1, 1, 1) + self.check_args(1, (1,), 'b', (1,), 1, 1, 1) + self.check_args(1, (1,), 'B', (1,), 1, 1, 1) + self.check_args(1, (1,), 'c', (char_sz,), char_sz, char_sz, char_sz) + self.check_args(1, (1,), 'h', (short_sz,), short_sz, short_sz, short_sz) + self.check_args(1, (1,), 'H', (short_sz,), short_sz, short_sz, short_sz) + self.check_args(1, (1,), 'i', (int_sz,), int_sz, int_sz, int_sz) + self.check_args(1, (1,), 'I', (int_sz,), int_sz, int_sz, int_sz) + self.check_args(1, (1,), 'l', (long_sz,), long_sz, long_sz, long_sz) + self.check_args(1, (1,), 'L', (long_sz,), long_sz, long_sz, long_sz) + self.check_args(1, (1,), 'q', (longlong_sz,), + longlong_sz, longlong_sz, longlong_sz) + self.check_args(1, (1,), 'Q', (longlong_sz,), + longlong_sz, longlong_sz, longlong_sz) + self.check_args(1, (1,), 'f', (float_sz,), float_sz, float_sz, float_sz) + self.check_args(1, (1,), 'd', (double_sz,), + double_sz, double_sz, double_sz) + self.check_args(1, (1,), 'x', (1,), 1, 1, 1) + self.check_args(1, (1,), 'P', (voidp_sz,), voidp_sz, voidp_sz, voidp_sz) + self.check_args(1, (1,), '?', (bool_sz,), bool_sz, bool_sz, bool_sz) + self.check_args(1, (1,), '@b', (1,), 1, 1, 1) + self.check_args(1, (1,), '@B', (1,), 1, 1, 1) + self.check_args(1, (1,), '@c', (char_sz,), char_sz, char_sz, char_sz) + self.check_args(1, (1,), '@h', (short_sz,), + short_sz, short_sz, short_sz) + self.check_args(1, (1,), '@H', (short_sz,), + short_sz, short_sz, short_sz) + self.check_args(1, (1,), '@i', (int_sz,), int_sz, int_sz, int_sz) + self.check_args(1, (1,), '@I', (int_sz,), int_sz, int_sz, int_sz) + self.check_args(1, (1,), '@l', (long_sz,), long_sz, long_sz, long_sz) + self.check_args(1, (1,), '@L', (long_sz,), long_sz, long_sz, long_sz) + self.check_args(1, (1,), '@q', + (longlong_sz,), longlong_sz, longlong_sz, longlong_sz) + self.check_args(1, (1,), '@Q', (longlong_sz,), + longlong_sz, longlong_sz, longlong_sz) + self.check_args(1, (1,), '@f', (float_sz,), + float_sz, float_sz, float_sz) + self.check_args(1, (1,), '@d', (double_sz,), + double_sz, double_sz, double_sz) + self.check_args(1, (1,), '@?', (bool_sz,), bool_sz, bool_sz, bool_sz) + self.check_args(1, (1,), '=b', (1,), 1, 1, 1) + self.check_args(1, (1,), '=B', (1,), 1, 1, 1) + self.check_args(1, (1,), '=c', (1,), 1, 1, 1) + self.check_args(1, (1,), '=h', (2,), 2, 2, 2) + self.check_args(1, (1,), '=H', (2,), 2, 2, 2) + self.check_args(1, (1,), '=i', (4,), 4, 4, 4) + self.check_args(1, (1,), '=I', (4,), 4, 4, 4) + self.check_args(1, (1,), '=l', (4,), 4, 4, 4) + self.check_args(1, (1,), '=L', (4,), 4, 4, 4) + self.check_args(1, (1,), '=q', (8,), 8, 8, 8) + self.check_args(1, (1,), '=Q', (8,), 8, 8, 8) + self.check_args(1, (1,), '=?', (1,), 1, 1, 1) + self.check_args(1, (1,), 'h', (2,), 2, 2, 2) + self.check_args(1, (1,), '!h', (2,), 2, 2, 2) + self.check_args(1, (1,), 'q', (8,), 8, 8, 8) + self.check_args(1, (1,), '!q', (8,), 8, 8, 8) + self.check_args(1, (1,), '1x', (1,), 1, 1, 1) + self.check_args(1, (1,), '2x', (2,), 2, 2, 2) + self.check_args(1, (1,), '3x', (3,), 3, 3, 3) + self.check_args(1, (1,), '4x', (4,), 4, 4, 4) + self.check_args(1, (1,), '5x', (5,), 5, 5, 5) + self.check_args(1, (1,), '6x', (6,), 6, 6, 6) + self.check_args(1, (1,), '7x', (7,), 7, 7, 7) + self.check_args(1, (1,), '8x', (8,), 8, 8, 8) + self.check_args(1, (1,), '9x', (9,), 9, 9, 9) + self.check_args(1, (1,), '1h', (2,), 2, 2, 2) + self.check_args(1, (1,), '=1h', (2,), 2, 2, 2) + self.assertRaises(ValueError, Exporter, (2, 1), '') + self.assertRaises(ValueError, Exporter, (2, 1), 'W') + self.assertRaises(ValueError, Exporter, (2, 1), '^Q') + self.assertRaises(ValueError, Exporter, (2, 1), '=W') + self.assertRaises(ValueError, Exporter, (2, 1), '=f') + self.assertRaises(ValueError, Exporter, (2, 1), '=d') + self.assertRaises(ValueError, Exporter, (2, 1), 'f') + self.assertRaises(ValueError, Exporter, (2, 1), '>d') + self.assertRaises(ValueError, Exporter, (2, 1), '!f') + self.assertRaises(ValueError, Exporter, (2, 1), '!d') + self.assertRaises(ValueError, Exporter, (2, 1), '0x') + self.assertRaises(ValueError, Exporter, (2, 1), '11x') + self.assertRaises(ValueError, Exporter, (2, 1), 'BB') + + def test_strides(self): + self.check_args(1, (10,), '=h', (2,), 20, 20, 2) + self.check_args(1, (5, 3), '=h', (6, 2), 30, 30, 2) + self.check_args(1, (7, 3, 5), '=h', (30, 10, 2), 210, 210, 2) + self.check_args(1, (13, 5, 11, 3), '=h', (330, 66, 6, 2), 4290, 4290, 2) + self.check_args(3, (7, 3, 5), '=h', (2, 14, 42), 210, 210, 2) + self.check_args(3, (7, 3, 5), '=h', (2, 16, 48), 210, 240, 2) + self.check_args(3, (13, 5, 11, 3), '=h', (440, 88, 8, 2), 4290, 5720, 2) + self.check_args(3, (7, 5), '3x', (15, 3), 105, 105, 3) + self.check_args(3, (7, 5), '3x', (3, 21), 105, 105, 3) + self.check_args(3, (7, 5), '3x', (3, 24), 105, 120, 3) + + def test_readonly(self): + a = Exporter((2,), 'h', readonly=True) + self.assertTrue(a.readonly) + b = Importer(a, PyBUF_STRIDED_RO) + self.assertRaises(BufferError, Importer, a, PyBUF_STRIDED) + b = Importer(a, PyBUF_STRIDED_RO) + + def test_is_contiguous(self): + a = Exporter((10,), '=h') + self.assertTrue(a.is_contiguous('C')) + self.assertTrue(a.is_contiguous('F')) + self.assertTrue(a.is_contiguous('A')) + a = Exporter((10, 4), '=h') + self.assertTrue(a.is_contiguous('C')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('F')) + a = Exporter((13, 5, 11, 3), '=h', (330, 66, 6, 2)) + self.assertTrue(a.is_contiguous('C')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('F')) + a = Exporter((10, 4), '=h', (2, 20)) + self.assertTrue(a.is_contiguous('F')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('C')) + a = Exporter((13, 5, 11, 3), '=h', (2, 26, 130, 1430)) + self.assertTrue(a.is_contiguous('F')) + self.assertTrue(a.is_contiguous('A')) + self.assertFalse(a.is_contiguous('C')) + a = Exporter((2, 11, 6, 4), '=h', (576, 48, 8, 2)) + self.assertFalse(a.is_contiguous('A')) + a = Exporter((2, 11, 6, 4), '=h', (2, 4, 48, 288)) + self.assertFalse(a.is_contiguous('A')) + a = Exporter((3, 2, 2), '=h', (16, 8, 4)) + self.assertFalse(a.is_contiguous('A')) + a = Exporter((3, 2, 2), '=h', (4, 12, 24)) + self.assertFalse(a.is_contiguous('A')) + + def test_PyBUF_flags(self): + a = Exporter((10, 2), 'd') + b = Importer(a, PyBUF_SIMPLE) + self.assertTrue(b.obj is a) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.len) + self.assertEqual(b.itemsize, a.itemsize) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.internal is None) + self.assertFalse(b.readonly) + b = Importer(a, PyBUF_WRITABLE) + self.assertTrue(b.obj is a) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.len) + self.assertEqual(b.itemsize, a.itemsize) + self.assertTrue(b.shape is None) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.internal is None) + self.assertFalse(b.readonly) + b = Importer(a, PyBUF_ND) + self.assertTrue(b.obj is a) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.len) + self.assertEqual(b.itemsize, a.itemsize) + self.assertEqual(b.shape, a.shape) + self.assertTrue(b.strides is None) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.internal is None) + self.assertFalse(b.readonly) + a = Exporter((5, 10), '=h', (24, 2)) + b = Importer(a, PyBUF_STRIDES) + self.assertTrue(b.obj is a) + self.assertTrue(b.format is None) + self.assertEqual(b.len, a.len) + self.assertEqual(b.itemsize, a.itemsize) + self.assertEqual(b.shape, a.shape) + self.assertEqual(b.strides, a.strides) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.internal is None) + self.assertFalse(b.readonly) + b = Importer(a, PyBUF_FULL) + self.assertTrue(b.obj is a) + self.assertEqual(b.format, '=h') + self.assertEqual(b.len, a.len) + self.assertEqual(b.itemsize, a.itemsize) + self.assertEqual(b.shape, a.shape) + self.assertEqual(b.strides, a.strides) + self.assertTrue(b.suboffsets is None) + self.assertTrue(b.internal is None) + self.assertFalse(b.readonly) + self.assertRaises(BufferError, Importer, a, PyBUF_SIMPLE) + self.assertRaises(BufferError, Importer, a, PyBUF_WRITABLE) + self.assertRaises(BufferError, Importer, a, PyBUF_ND) + self.assertRaises(BufferError, Importer, a, PyBUF_C_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, PyBUF_F_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, PyBUF_ANY_CONTIGUOUS) + self.assertRaises(BufferError, Importer, a, PyBUF_CONTIG) + + def test_negative_strides(self): + self.check_args(3, (3, 5, 4), 'B', (20, 4, -1), 60, 60, 1, 3) + self.check_args(3, (3, 5, 3), 'B', (20, 4, -1), 45, 60, 1, 2) + self.check_args(3, (3, 5, 4), 'B', (20, -4, 1), 60, 60, 1, 16) + self.check_args(3, (3, 5, 4), 'B', (-20, -4, -1), 60, 60, 1, 59) + self.check_args(3, (3, 5, 3), 'B', (-20, -4, -1), 45, 60, 1, 58) + + def test_attributes(self): + a = Exporter((13, 5, 11, 3), '=h', (440, 88, 8, 2)) + self.assertEqual(a.ndim, 4) + self.assertEqual(a.itemsize, 2) + self.assertFalse(a.readonly) + self.assertEqual(a.shape, (13, 5, 11, 3)) + self.assertEqual(a.format, '=h') + self.assertEqual(a.strides, (440, 88, 8, 2)) + self.assertEqual(a.len, 4290) + self.assertEqual(a.buflen, 5720) + self.assertEqual(a.buf, ctypes.addressof(a._buf)) + a = Exporter((8,)) + self.assertEqual(a.ndim, 1) + self.assertEqual(a.itemsize, 1) + self.assertFalse(a.readonly) + self.assertEqual(a.shape, (8,)) + self.assertEqual(a.format, 'B') + self.assertTrue(isinstance(a.strides, tuple)) + self.assertEqual(a.strides, (1,)) + self.assertEqual(a.len, 8) + self.assertEqual(a.buflen, 8) + a = Exporter([13, 5, 11, 3], '=h', [440, 88, 8, 2]) + self.assertTrue(isinstance(a.shape, tuple)) + self.assertTrue(isinstance(a.strides, tuple)) + self.assertEqual(a.shape, (13, 5, 11, 3)) + self.assertEqual(a.strides, (440, 88, 8, 2)) + + def test_itemsize(self): + exp = Exporter((4, 5), format='B', itemsize=8) + imp = Importer(exp, PyBUF_RECORDS) + self.assertEqual(imp.itemsize, 8) + self.assertEqual(imp.format, 'B') + self.assertEqual(imp.strides, (40, 8)) + exp = Exporter((4, 5), format='weird', itemsize=5) + imp = Importer(exp, PyBUF_RECORDS) + self.assertEqual(imp.itemsize, 5) + self.assertEqual(imp.format, 'weird') + self.assertEqual(imp.strides, (25, 5)) + + def check_args(self, call_flags, + shape, format, strides, length, bufsize, itemsize, + offset=0): + format_arg = format if call_flags & 1 else None + strides_arg = strides if call_flags & 2 else None + a = Exporter(shape, format_arg, strides_arg) + self.assertEqual(a.buflen, bufsize) + self.assertEqual(a.buf, ctypes.addressof(a._buf) + offset) + m = Importer(a, PyBUF_RECORDS_RO) + self.assertEqual(m.buf, a.buf) + self.assertEqual(m.len, length) + self.assertEqual(m.format, format) + self.assertEqual(m.itemsize, itemsize) + self.assertEqual(m.shape, shape) + self.assertEqual(m.strides, strides) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/endian.py b/venv/Lib/site-packages/pygame/tests/test_utils/endian.py new file mode 100644 index 0000000..ae8fc19 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/endian.py @@ -0,0 +1,18 @@ +# Module pygame.tests.test_utils.endian +# +# Machine independent conversion to little-endian and big-endian Python +# integer values. + +import struct + +def little_endian_uint32(i): + """Return the 32 bit unsigned integer little-endian representation of i""" + + s = struct.pack('I', i) + return struct.unpack('=I', s)[0] diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/png.py b/venv/Lib/site-packages/pygame/tests/test_utils/png.py new file mode 100644 index 0000000..9ca9539 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/png.py @@ -0,0 +1,3671 @@ +#!/usr/bin/env python + +# $URL: http://pypng.googlecode.com/svn/trunk/code/png.py $ +# $Rev: 228 $ + +# png.py - PNG encoder/decoder in pure Python +# +# Modified for Pygame in Oct., 2012 to work with Python 3.x. +# +# Copyright (C) 2006 Johann C. Rocholl +# Portions Copyright (C) 2009 David Jones +# And probably portions Copyright (C) 2006 Nicko van Someren +# +# Original concept by Johann C. Rocholl. +# +# LICENSE (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. +# +# Changelog (recent first): +# 2009-03-11 David: interlaced bit depth < 8 (writing). +# 2009-03-10 David: interlaced bit depth < 8 (reading). +# 2009-03-04 David: Flat and Boxed pixel formats. +# 2009-02-26 David: Palette support (writing). +# 2009-02-23 David: Bit-depths < 8; better PNM support. +# 2006-06-17 Nicko: Reworked into a class, faster interlacing. +# 2006-06-17 Johann: Very simple prototype PNG decoder. +# 2006-06-17 Nicko: Test suite with various image generators. +# 2006-06-17 Nicko: Alpha-channel, grey-scale, 16-bit/plane support. +# 2006-06-15 Johann: Scanline iterator interface for large input files. +# 2006-06-09 Johann: Very simple prototype PNG encoder. + +# Incorporated into Bangai-O Development Tools by drj on 2009-02-11 from +# http://trac.browsershots.org/browser/trunk/pypng/lib/png.py?rev=2885 + +# Incorporated into pypng by drj on 2009-03-12 from +# //depot/prj/bangaio/master/code/png.py#67 + + +""" +Pure Python PNG Reader/Writer + +This Python module implements support for PNG images (see PNG +specification at http://www.w3.org/TR/2003/REC-PNG-20031110/ ). It reads +and writes PNG files with all allowable bit depths (1/2/4/8/16/24/32/48/64 +bits per pixel) and colour combinations: greyscale (1/2/4/8/16 bit); RGB, +RGBA, LA (greyscale with alpha) with 8/16 bits per channel; colour mapped +images (1/2/4/8 bit). Adam7 interlacing is supported for reading and +writing. A number of optional chunks can be specified (when writing) +and understood (when reading): ``tRNS``, ``bKGD``, ``gAMA``. + +For help, type ``import png; help(png)`` in your python interpreter. + +A good place to start is the :class:`Reader` and :class:`Writer` classes. + +This file can also be used as a command-line utility to convert +`Netpbm `_ PNM files to PNG, and the reverse conversion from PNG to +PNM. The interface is similar to that of the ``pnmtopng`` program from +Netpbm. Type ``python png.py --help`` at the shell prompt +for usage and a list of options. + +A note on spelling and terminology +---------------------------------- + +Generally British English spelling is used in the documentation. So +that's "greyscale" and "colour". This not only matches the author's +native language, it's also used by the PNG specification. + +The major colour models supported by PNG (and hence by PyPNG) are: +greyscale, RGB, greyscale--alpha, RGB--alpha. These are sometimes +referred to using the abbreviations: L, RGB, LA, RGBA. In this case +each letter abbreviates a single channel: *L* is for Luminance or Luma or +Lightness which is the channel used in greyscale images; *R*, *G*, *B* stand +for Red, Green, Blue, the components of a colour image; *A* stands for +Alpha, the opacity channel (used for transparency effects, but higher +values are more opaque, so it makes sense to call it opacity). + +A note on formats +----------------- + +When getting pixel data out of this module (reading) and presenting +data to this module (writing) there are a number of ways the data could +be represented as a Python value. Generally this module uses one of +three formats called "flat row flat pixel", "boxed row flat pixel", and +"boxed row boxed pixel". Basically the concern is whether each pixel +and each row comes in its own little tuple (box), or not. + +Consider an image that is 3 pixels wide by 2 pixels high, and each pixel +has RGB components: + +Boxed row flat pixel:: + + list([R,G,B, R,G,B, R,G,B], + [R,G,B, R,G,B, R,G,B]) + +Each row appears as its own list, but the pixels are flattened so that +three values for one pixel simply follow the three values for the previous +pixel. This is the most common format used, because it provides a good +compromise between space and convenience. PyPNG regards itself as +at liberty to replace any sequence type with any sufficiently compatible +other sequence type; in practice each row is an array (from the array +module), and the outer list is sometimes an iterator rather than an +explicit list (so that streaming is possible). + +Flat row flat pixel:: + + [R,G,B, R,G,B, R,G,B, + R,G,B, R,G,B, R,G,B] + +The entire image is one single giant sequence of colour values. +Generally an array will be used (to save space), not a list. + +Boxed row boxed pixel:: + + list([ (R,G,B), (R,G,B), (R,G,B) ], + [ (R,G,B), (R,G,B), (R,G,B) ]) + +Each row appears in its own list, but each pixel also appears in its own +tuple. A serious memory burn in Python. + +In all cases the top row comes first, and for each row the pixels are +ordered from left-to-right. Within a pixel the values appear in the +order, R-G-B-A (or L-A for greyscale--alpha). + +There is a fourth format, mentioned because it is used internally, +is close to what lies inside a PNG file itself, and has some support +from the public API. This format is called packed. When packed, +each row is a sequence of bytes (integers from 0 to 255), just as +it is before PNG scanline filtering is applied. When the bit depth +is 8 this is essentially the same as boxed row flat pixel; when the +bit depth is less than 8, several pixels are packed into each byte; +when the bit depth is 16 (the only value more than 8 that is supported +by the PNG image format) each pixel value is decomposed into 2 bytes +(and `packed` is a misnomer). This format is used by the +:meth:`Writer.write_packed` method. It isn't usually a convenient +format, but may be just right if the source data for the PNG image +comes from something that uses a similar format (for example, 1-bit +BMPs, or another PNG file). + +And now, my famous members +-------------------------- +""" + +__version__ = "$URL: http://pypng.googlecode.com/svn/trunk/code/png.py $ $Rev: 228 $" + +from pygame.compat import geterror, imap_ +from array import array +import itertools +import math +import operator +import struct +import sys +import zlib +import warnings + + +__all__ = ['Image', 'Reader', 'Writer', 'write_chunks', 'from_array'] + + +# The PNG signature. +# http://www.w3.org/TR/PNG/#5PNG-file-signature +_signature = struct.pack('8B', 137, 80, 78, 71, 13, 10, 26, 10) + +_adam7 = ((0, 0, 8, 8), + (4, 0, 8, 8), + (0, 4, 4, 8), + (2, 0, 4, 4), + (0, 2, 2, 4), + (1, 0, 2, 2), + (0, 1, 1, 2)) + +def group(s, n): + # See + # http://www.python.org/doc/2.6/library/functions.html#zip + return zip(*[iter(s)]*n) + +def isarray(x): + """Same as ``isinstance(x, array)``. + """ + return isinstance(x, array) + + +def tostring(row): + """Convert row of bytes to string. Expects `row` to be an + ``array``. + """ + return row.tostring() + +# Conditionally convert to bytes. Works on Python 2 and Python 3. +try: + bytes('', 'ascii') + def strtobytes(x): return bytes(x, 'iso8859-1') + def bytestostr(x): return str(x, 'iso8859-1') +except: + strtobytes = str + bytestostr = str + +def interleave_planes(ipixels, apixels, ipsize, apsize): + """ + Interleave (colour) planes, e.g. RGB + A = RGBA. + + Return an array of pixels consisting of the `ipsize` elements of data + from each pixel in `ipixels` followed by the `apsize` elements of data + from each pixel in `apixels`. Conventionally `ipixels` and + `apixels` are byte arrays so the sizes are bytes, but it actually + works with any arrays of the same type. The returned array is the + same type as the input arrays which should be the same type as each other. + """ + + itotal = len(ipixels) + atotal = len(apixels) + newtotal = itotal + atotal + newpsize = ipsize + apsize + # Set up the output buffer + # See http://www.python.org/doc/2.4.4/lib/module-array.html#l2h-1356 + out = array(ipixels.typecode) + # It's annoying that there is no cheap way to set the array size :-( + out.extend(ipixels) + out.extend(apixels) + # Interleave in the pixel data + for i in range(ipsize): + out[i:newtotal:newpsize] = ipixels[i:itotal:ipsize] + for i in range(apsize): + out[i+ipsize:newtotal:newpsize] = apixels[i:atotal:apsize] + return out + +def check_palette(palette): + """Check a palette argument (to the :class:`Writer` class) for validity. + Returns the palette as a list if okay; raises an exception otherwise. + """ + + # None is the default and is allowed. + if palette is None: + return None + + p = list(palette) + if not (0 < len(p) <= 256): + raise ValueError("a palette must have between 1 and 256 entries") + seen_triple = False + for i,t in enumerate(p): + if len(t) not in (3,4): + raise ValueError( + "palette entry %d: entries must be 3- or 4-tuples." % i) + if len(t) == 3: + seen_triple = True + if seen_triple and len(t) == 4: + raise ValueError( + "palette entry %d: all 4-tuples must precede all 3-tuples" % i) + for x in t: + if int(x) != x or not(0 <= x <= 255): + raise ValueError( + "palette entry %d: values must be integer: 0 <= x <= 255" % i) + return p + +class Error(Exception): + prefix = 'Error' + def __str__(self): + return self.prefix + ': ' + ' '.join(self.args) + +class FormatError(Error): + """Problem with input file format. In other words, PNG file does + not conform to the specification in some way and is invalid. + """ + + prefix = 'FormatError' + +class ChunkError(FormatError): + prefix = 'ChunkError' + + +class Writer: + """ + PNG encoder in pure Python. + """ + + def __init__(self, width=None, height=None, + size=None, + greyscale=False, + alpha=False, + bitdepth=8, + palette=None, + transparent=None, + background=None, + gamma=None, + compression=None, + interlace=False, + bytes_per_sample=None, # deprecated + planes=None, + colormap=None, + maxval=None, + chunk_limit=2**20): + """ + Create a PNG encoder object. + + Arguments: + + width, height + Image size in pixels, as two separate arguments. + size + Image size (w,h) in pixels, as single argument. + greyscale + Input data is greyscale, not RGB. + alpha + Input data has alpha channel (RGBA or LA). + bitdepth + Bit depth: from 1 to 16. + palette + Create a palette for a colour mapped image (colour type 3). + transparent + Specify a transparent colour (create a ``tRNS`` chunk). + background + Specify a default background colour (create a ``bKGD`` chunk). + gamma + Specify a gamma value (create a ``gAMA`` chunk). + compression + zlib compression level (1-9). + interlace + Create an interlaced image. + chunk_limit + Write multiple ``IDAT`` chunks to save memory. + + The image size (in pixels) can be specified either by using the + `width` and `height` arguments, or with the single `size` + argument. If `size` is used it should be a pair (*width*, + *height*). + + `greyscale` and `alpha` are booleans that specify whether + an image is greyscale (or colour), and whether it has an + alpha channel (or not). + + `bitdepth` specifies the bit depth of the source pixel values. + Each source pixel value must be an integer between 0 and + ``2**bitdepth-1``. For example, 8-bit images have values + between 0 and 255. PNG only stores images with bit depths of + 1,2,4,8, or 16. When `bitdepth` is not one of these values, + the next highest valid bit depth is selected, and an ``sBIT`` + (significant bits) chunk is generated that specifies the original + precision of the source image. In this case the supplied pixel + values will be rescaled to fit the range of the selected bit depth. + + The details of which bit depth / colour model combinations the + PNG file format supports directly, are somewhat arcane + (refer to the PNG specification for full details). Briefly: + "small" bit depths (1,2,4) are only allowed with greyscale and + colour mapped images; colour mapped images cannot have bit depth + 16. + + For colour mapped images (in other words, when the `palette` + argument is specified) the `bitdepth` argument must match one of + the valid PNG bit depths: 1, 2, 4, or 8. (It is valid to have a + PNG image with a palette and an ``sBIT`` chunk, but the meaning + is slightly different; it would be awkward to press the + `bitdepth` argument into service for this.) + + The `palette` option, when specified, causes a colour mapped image + to be created: the PNG colour type is set to 3; greyscale + must not be set; alpha must not be set; transparent must + not be set; the bit depth must be 1,2,4, or 8. When a colour + mapped image is created, the pixel values are palette indexes + and the `bitdepth` argument specifies the size of these indexes + (not the size of the colour values in the palette). + + The palette argument value should be a sequence of 3- or + 4-tuples. 3-tuples specify RGB palette entries; 4-tuples + specify RGBA palette entries. If both 4-tuples and 3-tuples + appear in the sequence then all the 4-tuples must come + before all the 3-tuples. A ``PLTE`` chunk is created; if there + are 4-tuples then a ``tRNS`` chunk is created as well. The + ``PLTE`` chunk will contain all the RGB triples in the same + sequence; the ``tRNS`` chunk will contain the alpha channel for + all the 4-tuples, in the same sequence. Palette entries + are always 8-bit. + + If specified, the `transparent` and `background` parameters must + be a tuple with three integer values for red, green, blue, or + a simple integer (or singleton tuple) for a greyscale image. + + If specified, the `gamma` parameter must be a positive number + (generally, a float). A ``gAMA`` chunk will be created. Note that + this will not change the values of the pixels as they appear in + the PNG file, they are assumed to have already been converted + appropriately for the gamma specified. + + The `compression` argument specifies the compression level + to be used by the ``zlib`` module. Higher values are likely + to compress better, but will be slower to compress. The + default for this argument is ``None``; this does not mean + no compression, rather it means that the default from the + ``zlib`` module is used (which is generally acceptable). + + If `interlace` is true then an interlaced image is created + (using PNG's so far only interace method, *Adam7*). This does not + affect how the pixels should be presented to the encoder, rather + it changes how they are arranged into the PNG file. On slow + connexions interlaced images can be partially decoded by the + browser to give a rough view of the image that is successively + refined as more image data appears. + + .. note :: + + Enabling the `interlace` option requires the entire image + to be processed in working memory. + + `chunk_limit` is used to limit the amount of memory used whilst + compressing the image. In order to avoid using large amounts of + memory, multiple ``IDAT`` chunks may be created. + """ + + # At the moment the `planes` argument is ignored; + # its purpose is to act as a dummy so that + # ``Writer(x, y, **info)`` works, where `info` is a dictionary + # returned by Reader.read and friends. + # Ditto for `colormap`. + + # A couple of helper functions come first. Best skipped if you + # are reading through. + + def isinteger(x): + try: + return int(x) == x + except: + return False + + def check_color(c, which): + """Checks that a colour argument for transparent or + background options is the right form. Also "corrects" bare + integers to 1-tuples. + """ + + if c is None: + return c + if greyscale: + try: + l = len(c) + except TypeError: + c = (c,) + if len(c) != 1: + raise ValueError("%s for greyscale must be 1-tuple" % + which) + if not isinteger(c[0]): + raise ValueError( + "%s colour for greyscale must be integer" % + which) + else: + if not (len(c) == 3 and + isinteger(c[0]) and + isinteger(c[1]) and + isinteger(c[2])): + raise ValueError( + "%s colour must be a triple of integers" % + which) + return c + + if size: + if len(size) != 2: + raise ValueError( + "size argument should be a pair (width, height)") + if width is not None and width != size[0]: + raise ValueError( + "size[0] (%r) and width (%r) should match when both are used." + % (size[0], width)) + if height is not None and height != size[1]: + raise ValueError( + "size[1] (%r) and height (%r) should match when both are used." + % (size[1], height)) + width,height = size + del size + + if width <= 0 or height <= 0: + raise ValueError("width and height must be greater than zero") + if not isinteger(width) or not isinteger(height): + raise ValueError("width and height must be integers") + # http://www.w3.org/TR/PNG/#7Integers-and-byte-order + if width > 2**32-1 or height > 2**32-1: + raise ValueError("width and height cannot exceed 2**32-1") + + if alpha and transparent is not None: + raise ValueError( + "transparent colour not allowed with alpha channel") + + if bytes_per_sample is not None: + warnings.warn('please use bitdepth instead of bytes_per_sample', + DeprecationWarning) + if bytes_per_sample not in (0.125, 0.25, 0.5, 1, 2): + raise ValueError( + "bytes per sample must be .125, .25, .5, 1, or 2") + bitdepth = int(8*bytes_per_sample) + del bytes_per_sample + if not isinteger(bitdepth) or bitdepth < 1 or 16 < bitdepth: + raise ValueError("bitdepth (%r) must be a postive integer <= 16" % + bitdepth) + + self.rescale = None + if palette: + if bitdepth not in (1,2,4,8): + raise ValueError("with palette, bitdepth must be 1, 2, 4, or 8") + if transparent is not None: + raise ValueError("transparent and palette not compatible") + if alpha: + raise ValueError("alpha and palette not compatible") + if greyscale: + raise ValueError("greyscale and palette not compatible") + else: + # No palette, check for sBIT chunk generation. + if alpha or not greyscale: + if bitdepth not in (8,16): + targetbitdepth = (8,16)[bitdepth > 8] + self.rescale = (bitdepth, targetbitdepth) + bitdepth = targetbitdepth + del targetbitdepth + else: + assert greyscale + assert not alpha + if bitdepth not in (1,2,4,8,16): + if bitdepth > 8: + targetbitdepth = 16 + elif bitdepth == 3: + targetbitdepth = 4 + else: + assert bitdepth in (5,6,7) + targetbitdepth = 8 + self.rescale = (bitdepth, targetbitdepth) + bitdepth = targetbitdepth + del targetbitdepth + + if bitdepth < 8 and (alpha or not greyscale and not palette): + raise ValueError( + "bitdepth < 8 only permitted with greyscale or palette") + if bitdepth > 8 and palette: + raise ValueError( + "bit depth must be 8 or less for images with palette") + + transparent = check_color(transparent, 'transparent') + background = check_color(background, 'background') + + # It's important that the true boolean values (greyscale, alpha, + # colormap, interlace) are converted to bool because Iverson's + # convention is relied upon later on. + self.width = width + self.height = height + self.transparent = transparent + self.background = background + self.gamma = gamma + self.greyscale = bool(greyscale) + self.alpha = bool(alpha) + self.colormap = bool(palette) + self.bitdepth = int(bitdepth) + self.compression = compression + self.chunk_limit = chunk_limit + self.interlace = bool(interlace) + self.palette = check_palette(palette) + + self.color_type = 4*self.alpha + 2*(not greyscale) + 1*self.colormap + assert self.color_type in (0,2,3,4,6) + + self.color_planes = (3,1)[self.greyscale or self.colormap] + self.planes = self.color_planes + self.alpha + # :todo: fix for bitdepth < 8 + self.psize = (self.bitdepth/8) * self.planes + + def make_palette(self): + """Create the byte sequences for a ``PLTE`` and if necessary a + ``tRNS`` chunk. Returned as a pair (*p*, *t*). *t* will be + ``None`` if no ``tRNS`` chunk is necessary. + """ + + p = array('B') + t = array('B') + + for x in self.palette: + p.extend(x[0:3]) + if len(x) > 3: + t.append(x[3]) + p = tostring(p) + t = tostring(t) + if t: + return p,t + return p,None + + def write(self, outfile, rows): + """Write a PNG image to the output file. `rows` should be + an iterable that yields each row in boxed row flat pixel format. + The rows should be the rows of the original image, so there + should be ``self.height`` rows of ``self.width * self.planes`` values. + If `interlace` is specified (when creating the instance), then + an interlaced PNG file will be written. Supply the rows in the + normal image order; the interlacing is carried out internally. + + .. note :: + + Interlacing will require the entire image to be in working memory. + """ + + if self.interlace: + fmt = 'BH'[self.bitdepth > 8] + a = array(fmt, itertools.chain(*rows)) + return self.write_array(outfile, a) + else: + nrows = self.write_passes(outfile, rows) + if nrows != self.height: + raise ValueError( + "rows supplied (%d) does not match height (%d)" % + (nrows, self.height)) + + def write_passes(self, outfile, rows, packed=False): + """ + Write a PNG image to the output file. + + Most users are expected to find the :meth:`write` or + :meth:`write_array` method more convenient. + + The rows should be given to this method in the order that + they appear in the output file. For straightlaced images, + this is the usual top to bottom ordering, but for interlaced + images the rows should have already been interlaced before + passing them to this function. + + `rows` should be an iterable that yields each row. When + `packed` is ``False`` the rows should be in boxed row flat pixel + format; when `packed` is ``True`` each row should be a packed + sequence of bytes. + + """ + + # http://www.w3.org/TR/PNG/#5PNG-file-signature + outfile.write(_signature) + + # http://www.w3.org/TR/PNG/#11IHDR + write_chunk(outfile, 'IHDR', + struct.pack("!2I5B", self.width, self.height, + self.bitdepth, self.color_type, + 0, 0, self.interlace)) + + # See :chunk:order + # http://www.w3.org/TR/PNG/#11gAMA + if self.gamma is not None: + write_chunk(outfile, 'gAMA', + struct.pack("!L", int(round(self.gamma*1e5)))) + + # See :chunk:order + # http://www.w3.org/TR/PNG/#11sBIT + if self.rescale: + write_chunk(outfile, 'sBIT', + struct.pack('%dB' % self.planes, + *[self.rescale[0]]*self.planes)) + + # :chunk:order: Without a palette (PLTE chunk), ordering is + # relatively relaxed. With one, gAMA chunk must precede PLTE + # chunk which must precede tRNS and bKGD. + # See http://www.w3.org/TR/PNG/#5ChunkOrdering + if self.palette: + p,t = self.make_palette() + write_chunk(outfile, 'PLTE', p) + if t: + # tRNS chunk is optional. Only needed if palette entries + # have alpha. + write_chunk(outfile, 'tRNS', t) + + # http://www.w3.org/TR/PNG/#11tRNS + if self.transparent is not None: + if self.greyscale: + write_chunk(outfile, 'tRNS', + struct.pack("!1H", *self.transparent)) + else: + write_chunk(outfile, 'tRNS', + struct.pack("!3H", *self.transparent)) + + # http://www.w3.org/TR/PNG/#11bKGD + if self.background is not None: + if self.greyscale: + write_chunk(outfile, 'bKGD', + struct.pack("!1H", *self.background)) + else: + write_chunk(outfile, 'bKGD', + struct.pack("!3H", *self.background)) + + # http://www.w3.org/TR/PNG/#11IDAT + if self.compression is not None: + compressor = zlib.compressobj(self.compression) + else: + compressor = zlib.compressobj() + + # Choose an extend function based on the bitdepth. The extend + # function packs/decomposes the pixel values into bytes and + # stuffs them onto the data array. + data = array('B') + if self.bitdepth == 8 or packed: + extend = data.extend + elif self.bitdepth == 16: + # Decompose into bytes + def extend(sl): + fmt = '!%dH' % len(sl) + data.extend(array('B', struct.pack(fmt, *sl))) + else: + # Pack into bytes + assert self.bitdepth < 8 + # samples per byte + spb = int(8/self.bitdepth) + def extend(sl): + a = array('B', sl) + # Adding padding bytes so we can group into a whole + # number of spb-tuples. + l = float(len(a)) + extra = math.ceil(l / float(spb))*spb - l + a.extend([0]*int(extra)) + # Pack into bytes + l = group(a, spb) + l = map(lambda e: reduce(lambda x,y: + (x << self.bitdepth) + y, e), l) + data.extend(l) + if self.rescale: + oldextend = extend + factor = \ + float(2**self.rescale[1]-1) / float(2**self.rescale[0]-1) + def extend(sl): + oldextend(map(lambda x: int(round(factor*x)), sl)) + + # Build the first row, testing mostly to see if we need to + # changed the extend function to cope with NumPy integer types + # (they cause our ordinary definition of extend to fail, so we + # wrap it). See + # http://code.google.com/p/pypng/issues/detail?id=44 + enumrows = enumerate(rows) + del rows + + # First row's filter type. + data.append(0) + # :todo: Certain exceptions in the call to ``.next()`` or the + # following try would indicate no row data supplied. + # Should catch. + i, row = next(enumrows) + try: + # If this fails... + extend(row) + except: + # ... try a version that converts the values to int first. + # Not only does this work for the (slightly broken) NumPy + # types, there are probably lots of other, unknown, "nearly" + # int types it works for. + def wrapmapint(f): + return lambda sl: f(map(int, sl)) + extend = wrapmapint(extend) + del wrapmapint + extend(row) + + for i,row in enumrows: + # Add "None" filter type. Currently, it's essential that + # this filter type be used for every scanline as we do not + # mark the first row of a reduced pass image; that means we + # could accidentally compute the wrong filtered scanline if + # we used "up", "average", or "paeth" on such a line. + data.append(0) + extend(row) + if len(data) > self.chunk_limit: + compressed = compressor.compress(tostring(data)) + if len(compressed): + # print >> sys.stderr, len(data), len(compressed) + write_chunk(outfile, 'IDAT', compressed) + # Because of our very witty definition of ``extend``, + # above, we must re-use the same ``data`` object. Hence + # we use ``del`` to empty this one, rather than create a + # fresh one (which would be my natural FP instinct). + del data[:] + if len(data): + compressed = compressor.compress(tostring(data)) + else: + compressed = '' + flushed = compressor.flush() + if len(compressed) or len(flushed): + # print >> sys.stderr, len(data), len(compressed), len(flushed) + write_chunk(outfile, 'IDAT', compressed + flushed) + # http://www.w3.org/TR/PNG/#11IEND + write_chunk(outfile, 'IEND') + return i+1 + + def write_array(self, outfile, pixels): + """ + Write an array in flat row flat pixel format as a PNG file on + the output file. See also :meth:`write` method. + """ + + if self.interlace: + self.write_passes(outfile, self.array_scanlines_interlace(pixels)) + else: + self.write_passes(outfile, self.array_scanlines(pixels)) + + def write_packed(self, outfile, rows): + """ + Write PNG file to `outfile`. The pixel data comes from `rows` + which should be in boxed row packed format. Each row should be + a sequence of packed bytes. + + Technically, this method does work for interlaced images but it + is best avoided. For interlaced images, the rows should be + presented in the order that they appear in the file. + + This method should not be used when the source image bit depth + is not one naturally supported by PNG; the bit depth should be + 1, 2, 4, 8, or 16. + """ + + if self.rescale: + raise Error("write_packed method not suitable for bit depth %d" % + self.rescale[0]) + return self.write_passes(outfile, rows, packed=True) + + def convert_pnm(self, infile, outfile): + """ + Convert a PNM file containing raw pixel data into a PNG file + with the parameters set in the writer object. Works for + (binary) PGM, PPM, and PAM formats. + """ + + if self.interlace: + pixels = array('B') + pixels.fromfile(infile, + (self.bitdepth/8) * self.color_planes * + self.width * self.height) + self.write_passes(outfile, self.array_scanlines_interlace(pixels)) + else: + self.write_passes(outfile, self.file_scanlines(infile)) + + def convert_ppm_and_pgm(self, ppmfile, pgmfile, outfile): + """ + Convert a PPM and PGM file containing raw pixel data into a + PNG outfile with the parameters set in the writer object. + """ + pixels = array('B') + pixels.fromfile(ppmfile, + (self.bitdepth/8) * self.color_planes * + self.width * self.height) + apixels = array('B') + apixels.fromfile(pgmfile, + (self.bitdepth/8) * + self.width * self.height) + pixels = interleave_planes(pixels, apixels, + (self.bitdepth/8) * self.color_planes, + (self.bitdepth/8)) + if self.interlace: + self.write_passes(outfile, self.array_scanlines_interlace(pixels)) + else: + self.write_passes(outfile, self.array_scanlines(pixels)) + + def file_scanlines(self, infile): + """ + Generates boxed rows in flat pixel format, from the input file + `infile`. It assumes that the input file is in a "Netpbm-like" + binary format, and is positioned at the beginning of the first + pixel. The number of pixels to read is taken from the image + dimensions (`width`, `height`, `planes`) and the number of bytes + per value is implied by the image `bitdepth`. + """ + + # Values per row + vpr = self.width * self.planes + row_bytes = vpr + if self.bitdepth > 8: + assert self.bitdepth == 16 + row_bytes *= 2 + fmt = '>%dH' % vpr + def line(): + return array('H', struct.unpack(fmt, infile.read(row_bytes))) + else: + def line(): + scanline = array('B', infile.read(row_bytes)) + return scanline + for y in range(self.height): + yield line() + + def array_scanlines(self, pixels): + """ + Generates boxed rows (flat pixels) from flat rows (flat pixels) + in an array. + """ + + # Values per row + vpr = self.width * self.planes + stop = 0 + for y in range(self.height): + start = stop + stop = start + vpr + yield pixels[start:stop] + + def array_scanlines_interlace(self, pixels): + """ + Generator for interlaced scanlines from an array. `pixels` is + the full source image in flat row flat pixel format. The + generator yields each scanline of the reduced passes in turn, in + boxed row flat pixel format. + """ + + # http://www.w3.org/TR/PNG/#8InterlaceMethods + # Array type. + fmt = 'BH'[self.bitdepth > 8] + # Value per row + vpr = self.width * self.planes + for xstart, ystart, xstep, ystep in _adam7: + if xstart >= self.width: + continue + # Pixels per row (of reduced image) + ppr = int(math.ceil((self.width-xstart)/float(xstep))) + # number of values in reduced image row. + row_len = ppr*self.planes + for y in range(ystart, self.height, ystep): + if xstep == 1: + offset = y * vpr + yield pixels[offset:offset+vpr] + else: + row = array(fmt) + # There's no easier way to set the length of an array + row.extend(pixels[0:row_len]) + offset = y * vpr + xstart * self.planes + end_offset = (y+1) * vpr + skip = self.planes * xstep + for i in range(self.planes): + row[i::self.planes] = \ + pixels[offset+i:end_offset:skip] + yield row + +def write_chunk(outfile, tag, data=strtobytes('')): + """ + Write a PNG chunk to the output file, including length and + checksum. + """ + + # http://www.w3.org/TR/PNG/#5Chunk-layout + outfile.write(struct.pack("!I", len(data))) + tag = strtobytes(tag) + outfile.write(tag) + outfile.write(data) + checksum = zlib.crc32(tag) + checksum = zlib.crc32(data, checksum) + checksum &= 2**32-1 + outfile.write(struct.pack("!I", checksum)) + +def write_chunks(out, chunks): + """Create a PNG file by writing out the chunks.""" + + out.write(_signature) + for chunk in chunks: + write_chunk(out, *chunk) + +def filter_scanline(type, line, fo, prev=None): + """Apply a scanline filter to a scanline. `type` specifies the + filter type (0 to 4); `line` specifies the current (unfiltered) + scanline as a sequence of bytes; `prev` specifies the previous + (unfiltered) scanline as a sequence of bytes. `fo` specifies the + filter offset; normally this is size of a pixel in bytes (the number + of bytes per sample times the number of channels), but when this is + < 1 (for bit depths < 8) then the filter offset is 1. + """ + + assert 0 <= type < 5 + + # The output array. Which, pathetically, we extend one-byte at a + # time (fortunately this is linear). + out = array('B', [type]) + + def sub(): + ai = -fo + for x in line: + if ai >= 0: + x = (x - line[ai]) & 0xff + out.append(x) + ai += 1 + def up(): + for i,x in enumerate(line): + x = (x - prev[i]) & 0xff + out.append(x) + def average(): + ai = -fo + for i,x in enumerate(line): + if ai >= 0: + x = (x - ((line[ai] + prev[i]) >> 1)) & 0xff + else: + x = (x - (prev[i] >> 1)) & 0xff + out.append(x) + ai += 1 + def paeth(): + # http://www.w3.org/TR/PNG/#9Filter-type-4-Paeth + ai = -fo # also used for ci + for i,x in enumerate(line): + a = 0 + b = prev[i] + c = 0 + + if ai >= 0: + a = line[ai] + c = prev[ai] + p = a + b - c + pa = abs(p - a) + pb = abs(p - b) + pc = abs(p - c) + if pa <= pb and pa <= pc: Pr = a + elif pb <= pc: Pr = b + else: Pr = c + + x = (x - Pr) & 0xff + out.append(x) + ai += 1 + + if not prev: + # We're on the first line. Some of the filters can be reduced + # to simpler cases which makes handling the line "off the top" + # of the image simpler. "up" becomes "none"; "paeth" becomes + # "left" (non-trivial, but true). "average" needs to be handled + # specially. + if type == 2: # "up" + return line # type = 0 + elif type == 3: + prev = [0]*len(line) + elif type == 4: # "paeth" + type = 1 + if type == 0: + out.extend(line) + elif type == 1: + sub() + elif type == 2: + up() + elif type == 3: + average() + else: # type == 4 + paeth() + return out + + +def from_array(a, mode=None, info={}): + """Create a PNG :class:`Image` object from a 2- or 3-dimensional array. + One application of this function is easy PIL-style saving: + ``png.from_array(pixels, 'L').save('foo.png')``. + + .. note : + + The use of the term *3-dimensional* is for marketing purposes + only. It doesn't actually work. Please bear with us. Meanwhile + enjoy the complimentary snacks (on request) and please use a + 2-dimensional array. + + Unless they are specified using the *info* parameter, the PNG's + height and width are taken from the array size. For a 3 dimensional + array the first axis is the height; the second axis is the width; + and the third axis is the channel number. Thus an RGB image that is + 16 pixels high and 8 wide will use an array that is 16x8x3. For 2 + dimensional arrays the first axis is the height, but the second axis + is ``width*channels``, so an RGB image that is 16 pixels high and 8 + wide will use a 2-dimensional array that is 16x24 (each row will be + 8*3==24 sample values). + + *mode* is a string that specifies the image colour format in a + PIL-style mode. It can be: + + ``'L'`` + greyscale (1 channel) + ``'LA'`` + greyscale with alpha (2 channel) + ``'RGB'`` + colour image (3 channel) + ``'RGBA'`` + colour image with alpha (4 channel) + + The mode string can also specify the bit depth (overriding how this + function normally derives the bit depth, see below). Appending + ``';16'`` to the mode will cause the PNG to be 16 bits per channel; + any decimal from 1 to 16 can be used to specify the bit depth. + + When a 2-dimensional array is used *mode* determines how many + channels the image has, and so allows the width to be derived from + the second array dimension. + + The array is expected to be a ``numpy`` array, but it can be any + suitable Python sequence. For example, a list of lists can be used: + ``png.from_array([[0, 255, 0], [255, 0, 255]], 'L')``. The exact + rules are: ``len(a)`` gives the first dimension, height; + ``len(a[0])`` gives the second dimension; ``len(a[0][0])`` gives the + third dimension, unless an exception is raised in which case a + 2-dimensional array is assumed. It's slightly more complicated than + that because an iterator of rows can be used, and it all still + works. Using an iterator allows data to be streamed efficiently. + + The bit depth of the PNG is normally taken from the array element's + datatype (but if *mode* specifies a bitdepth then that is used + instead). The array element's datatype is determined in a way which + is supposed to work both for ``numpy`` arrays and for Python + ``array.array`` objects. A 1 byte datatype will give a bit depth of + 8, a 2 byte datatype will give a bit depth of 16. If the datatype + does not have an implicit size, for example it is a plain Python + list of lists, as above, then a default of 8 is used. + + The *info* parameter is a dictionary that can be used to specify + metadata (in the same style as the arguments to the + :class:``png.Writer`` class). For this function the keys that are + useful are: + + height + overrides the height derived from the array dimensions and allows + *a* to be an iterable. + width + overrides the width derived from the array dimensions. + bitdepth + overrides the bit depth derived from the element datatype (but + must match *mode* if that also specifies a bit depth). + + Generally anything specified in the + *info* dictionary will override any implicit choices that this + function would otherwise make, but must match any explicit ones. + For example, if the *info* dictionary has a ``greyscale`` key then + this must be true when mode is ``'L'`` or ``'LA'`` and false when + mode is ``'RGB'`` or ``'RGBA'``. + """ + + # We abuse the *info* parameter by modifying it. Take a copy here. + # (Also typechecks *info* to some extent). + info = dict(info) + + # Syntax check mode string. + bitdepth = None + try: + mode = mode.split(';') + if len(mode) not in (1,2): + raise Error() + if mode[0] not in ('L', 'LA', 'RGB', 'RGBA'): + raise Error() + if len(mode) == 2: + try: + bitdepth = int(mode[1]) + except: + raise Error() + except Error: + raise Error("mode string should be 'RGB' or 'L;16' or similar.") + mode = mode[0] + + # Get bitdepth from *mode* if possible. + if bitdepth: + if info.get('bitdepth') and bitdepth != info['bitdepth']: + raise Error("mode bitdepth (%d) should match info bitdepth (%d)." % + (bitdepth, info['bitdepth'])) + info['bitdepth'] = bitdepth + + # Fill in and/or check entries in *info*. + # Dimensions. + if 'size' in info: + # Check width, height, size all match where used. + for dimension,axis in [('width', 0), ('height', 1)]: + if dimension in info: + if info[dimension] != info['size'][axis]: + raise Error( + "info[%r] shhould match info['size'][%r]." % + (dimension, axis)) + info['width'],info['height'] = info['size'] + if 'height' not in info: + try: + l = len(a) + except: + raise Error( + "len(a) does not work, supply info['height'] instead.") + info['height'] = l + # Colour format. + if 'greyscale' in info: + if bool(info['greyscale']) != ('L' in mode): + raise Error("info['greyscale'] should match mode.") + info['greyscale'] = 'L' in mode + if 'alpha' in info: + if bool(info['alpha']) != ('A' in mode): + raise Error("info['alpha'] should match mode.") + info['alpha'] = 'A' in mode + + planes = len(mode) + if 'planes' in info: + if info['planes'] != planes: + raise Error("info['planes'] should match mode.") + + # In order to work out whether we the array is 2D or 3D we need its + # first row, which requires that we take a copy of its iterator. + # We may also need the first row to derive width and bitdepth. + a,t = itertools.tee(a) + row = next(t) + del t + try: + row[0][0] + threed = True + testelement = row[0] + except: + threed = False + testelement = row + if 'width' not in info: + if threed: + width = len(row) + else: + width = len(row) // planes + info['width'] = width + + # Not implemented yet + assert not threed + + if 'bitdepth' not in info: + try: + dtype = testelement.dtype + # goto the "else:" clause. Sorry. + except: + try: + # Try a Python array.array. + bitdepth = 8 * testelement.itemsize + except: + # We can't determine it from the array element's + # datatype, use a default of 8. + bitdepth = 8 + else: + # If we got here without exception, we now assume that + # the array is a numpy array. + if dtype.kind == 'b': + bitdepth = 1 + else: + bitdepth = 8 * dtype.itemsize + info['bitdepth'] = bitdepth + + for thing in 'width height bitdepth greyscale alpha'.split(): + assert thing in info + return Image(a, info) + +# So that refugee's from PIL feel more at home. Not documented. +fromarray = from_array + +class Image: + """A PNG image. + You can create an :class:`Image` object from an array of pixels by calling + :meth:`png.from_array`. It can be saved to disk with the + :meth:`save` method.""" + def __init__(self, rows, info): + """ + .. note :: + + The constructor is not public. Please do not call it. + """ + + self.rows = rows + self.info = info + + def save(self, file): + """Save the image to *file*. If *file* looks like an open file + descriptor then it is used, otherwise it is treated as a + filename and a fresh file is opened. + + In general, you can only call this method once; after it has + been called the first time and the PNG image has been saved, the + source data will have been streamed, and cannot be streamed + again. + """ + + w = Writer(**self.info) + + try: + file.write + def close(): pass + except: + file = open(file, 'wb') + def close(): file.close() + + try: + w.write(file, self.rows) + finally: + close() + +class _readable: + """ + A simple file-like interface for strings and arrays. + """ + + def __init__(self, buf): + self.buf = buf + self.offset = 0 + + def read(self, n): + r = self.buf[self.offset:self.offset+n] + if isarray(r): + r = r.tostring() + self.offset += n + return r + + +class Reader: + """ + PNG decoder in pure Python. + """ + + def __init__(self, _guess=None, **kw): + """ + Create a PNG decoder object. + + The constructor expects exactly one keyword argument. If you + supply a positional argument instead, it will guess the input + type. You can choose among the following keyword arguments: + + filename + Name of input file (a PNG file). + file + A file-like object (object with a read() method). + bytes + ``array`` or ``string`` with PNG data. + + """ + if ((_guess is not None and len(kw) != 0) or + (_guess is None and len(kw) != 1)): + raise TypeError("Reader() takes exactly 1 argument") + + # Will be the first 8 bytes, later on. See validate_signature. + self.signature = None + self.transparent = None + # A pair of (len,type) if a chunk has been read but its data and + # checksum have not (in other words the file position is just + # past the 4 bytes that specify the chunk type). See preamble + # method for how this is used. + self.atchunk = None + + if _guess is not None: + if isarray(_guess): + kw["bytes"] = _guess + elif isinstance(_guess, str): + kw["filename"] = _guess + elif isinstance(_guess, file): + kw["file"] = _guess + + if "filename" in kw: + self.file = open(kw["filename"], "rb") + elif "file" in kw: + self.file = kw["file"] + elif "bytes" in kw: + self.file = _readable(kw["bytes"]) + else: + raise TypeError("expecting filename, file or bytes array") + + def chunk(self, seek=None): + """ + Read the next PNG chunk from the input file; returns a + (*type*,*data*) tuple. *type* is the chunk's type as a string + (all PNG chunk types are 4 characters long). *data* is the + chunk's data content, as a string. + + If the optional `seek` argument is + specified then it will keep reading chunks until it either runs + out of file or finds the type specified by the argument. Note + that in general the order of chunks in PNGs is unspecified, so + using `seek` can cause you to miss chunks. + """ + + self.validate_signature() + + while True: + # http://www.w3.org/TR/PNG/#5Chunk-layout + if not self.atchunk: + self.atchunk = self.chunklentype() + length,type = self.atchunk + self.atchunk = None + data = self.file.read(length) + if len(data) != length: + raise ChunkError('Chunk %s too short for required %i octets.' + % (type, length)) + checksum = self.file.read(4) + if len(checksum) != 4: + raise ValueError('Chunk %s too short for checksum.', tag) + if seek and type != seek: + continue + verify = zlib.crc32(strtobytes(type)) + verify = zlib.crc32(data, verify) + # Whether the output from zlib.crc32 is signed or not varies + # according to hideous implementation details, see + # http://bugs.python.org/issue1202 . + # We coerce it to be positive here (in a way which works on + # Python 2.3 and older). + verify &= 2**32 - 1 + verify = struct.pack('!I', verify) + if checksum != verify: + # print repr(checksum) + (a, ) = struct.unpack('!I', checksum) + (b, ) = struct.unpack('!I', verify) + raise ChunkError( + "Checksum error in %s chunk: 0x%08X != 0x%08X." % + (type, a, b)) + return type, data + + def chunks(self): + """Return an iterator that will yield each chunk as a + (*chunktype*, *content*) pair. + """ + + while True: + t,v = self.chunk() + yield t,v + if t == 'IEND': + break + + def undo_filter(self, filter_type, scanline, previous): + """Undo the filter for a scanline. `scanline` is a sequence of + bytes that does not include the initial filter type byte. + `previous` is decoded previous scanline (for straightlaced + images this is the previous pixel row, but for interlaced + images, it is the previous scanline in the reduced image, which + in general is not the previous pixel row in the final image). + When there is no previous scanline (the first row of a + straightlaced image, or the first row in one of the passes in an + interlaced image), then this argument should be ``None``. + + The scanline will have the effects of filtering removed, and the + result will be returned as a fresh sequence of bytes. + """ + + # :todo: Would it be better to update scanline in place? + + # Create the result byte array. It seems that the best way to + # create the array to be the right size is to copy from an + # existing sequence. *sigh* + # If we fill the result with scanline, then this allows a + # micro-optimisation in the "null" and "sub" cases. + result = array('B', scanline) + + if filter_type == 0: + # And here, we _rely_ on filling the result with scanline, + # above. + return result + + if filter_type not in (1,2,3,4): + raise FormatError('Invalid PNG Filter Type.' + ' See http://www.w3.org/TR/2003/REC-PNG-20031110/#9Filters .') + + # Filter unit. The stride from one pixel to the corresponding + # byte from the previous previous. Normally this is the pixel + # size in bytes, but when this is smaller than 1, the previous + # byte is used instead. + fu = max(1, self.psize) + + # For the first line of a pass, synthesize a dummy previous + # line. An alternative approach would be to observe that on the + # first line 'up' is the same as 'null', 'paeth' is the same + # as 'sub', with only 'average' requiring any special case. + if not previous: + previous = array('B', [0]*len(scanline)) + + def sub(): + """Undo sub filter.""" + + ai = 0 + # Loops starts at index fu. Observe that the initial part + # of the result is already filled in correctly with + # scanline. + for i in range(fu, len(result)): + x = scanline[i] + a = result[ai] + result[i] = (x + a) & 0xff + ai += 1 + + def up(): + """Undo up filter.""" + + for i in range(len(result)): + x = scanline[i] + b = previous[i] + result[i] = (x + b) & 0xff + + def average(): + """Undo average filter.""" + + ai = -fu + for i in range(len(result)): + x = scanline[i] + if ai < 0: + a = 0 + else: + a = result[ai] + b = previous[i] + result[i] = (x + ((a + b) >> 1)) & 0xff + ai += 1 + + def paeth(): + """Undo Paeth filter.""" + + # Also used for ci. + ai = -fu + for i in range(len(result)): + x = scanline[i] + if ai < 0: + a = c = 0 + else: + a = result[ai] + c = previous[ai] + b = previous[i] + p = a + b - c + pa = abs(p - a) + pb = abs(p - b) + pc = abs(p - c) + if pa <= pb and pa <= pc: + pr = a + elif pb <= pc: + pr = b + else: + pr = c + result[i] = (x + pr) & 0xff + ai += 1 + + # Call appropriate filter algorithm. Note that 0 has already + # been dealt with. + (None, sub, up, average, paeth)[filter_type]() + return result + + def deinterlace(self, raw): + """ + Read raw pixel data, undo filters, deinterlace, and flatten. + Return in flat row flat pixel format. + """ + + # print >> sys.stderr, ("Reading interlaced, w=%s, r=%s, planes=%s," + + # " bpp=%s") % (self.width, self.height, self.planes, self.bps) + # Values per row (of the target image) + vpr = self.width * self.planes + + # Make a result array, and make it big enough. Interleaving + # writes to the output array randomly (well, not quite), so the + # entire output array must be in memory. + fmt = 'BH'[self.bitdepth > 8] + a = array(fmt, [0]*vpr*self.height) + source_offset = 0 + + for xstart, ystart, xstep, ystep in _adam7: + # print >> sys.stderr, "Adam7: start=%s,%s step=%s,%s" % ( + # xstart, ystart, xstep, ystep) + if xstart >= self.width: + continue + # The previous (reconstructed) scanline. None at the + # beginning of a pass to indicate that there is no previous + # line. + recon = None + # Pixels per row (reduced pass image) + ppr = int(math.ceil((self.width-xstart)/float(xstep))) + # Row size in bytes for this pass. + row_size = int(math.ceil(self.psize * ppr)) + for y in range(ystart, self.height, ystep): + filter_type = raw[source_offset] + source_offset += 1 + scanline = raw[source_offset:source_offset+row_size] + source_offset += row_size + recon = self.undo_filter(filter_type, scanline, recon) + # Convert so that there is one element per pixel value + flat = self.serialtoflat(recon, ppr) + if xstep == 1: + assert xstart == 0 + offset = y * vpr + a[offset:offset+vpr] = flat + else: + offset = y * vpr + xstart * self.planes + end_offset = (y+1) * vpr + skip = self.planes * xstep + for i in range(self.planes): + a[offset+i:end_offset:skip] = \ + flat[i::self.planes] + return a + + def iterboxed(self, rows): + """Iterator that yields each scanline in boxed row flat pixel + format. `rows` should be an iterator that yields the bytes of + each row in turn. + """ + + def asvalues(raw): + """Convert a row of raw bytes into a flat row. Result may + or may not share with argument""" + + if self.bitdepth == 8: + return raw + if self.bitdepth == 16: + raw = tostring(raw) + return array('H', struct.unpack('!%dH' % (len(raw)//2), raw)) + assert self.bitdepth < 8 + width = self.width + # Samples per byte + spb = 8//self.bitdepth + out = array('B') + mask = 2**self.bitdepth - 1 + shifts = map(self.bitdepth.__mul__, reversed(range(spb))) + for o in raw: + out.extend(map(lambda i: mask&(o>>i), shifts)) + return out[:width] + + return imap_(asvalues, rows) + + def serialtoflat(self, bytes, width=None): + """Convert serial format (byte stream) pixel data to flat row + flat pixel. + """ + + if self.bitdepth == 8: + return bytes + if self.bitdepth == 16: + bytes = tostring(bytes) + return array('H', + struct.unpack('!%dH' % (len(bytes)//2), bytes)) + assert self.bitdepth < 8 + if width is None: + width = self.width + # Samples per byte + spb = 8//self.bitdepth + out = array('B') + mask = 2**self.bitdepth - 1 + shifts = map(self.bitdepth.__mul__, reversed(range(spb))) + l = width + for o in bytes: + out.extend([(mask&(o>>s)) for s in shifts][:l]) + l -= spb + if l <= 0: + l = width + return out + + def iterstraight(self, raw): + """Iterator that undoes the effect of filtering, and yields each + row in serialised format (as a sequence of bytes). Assumes input + is straightlaced. `raw` should be an iterable that yields the + raw bytes in chunks of arbitrary size.""" + + # length of row, in bytes + rb = self.row_bytes + a = array('B') + # The previous (reconstructed) scanline. None indicates first + # line of image. + recon = None + for some in raw: + a.extend(some) + while len(a) >= rb + 1: + filter_type = a[0] + scanline = a[1:rb+1] + del a[:rb+1] + recon = self.undo_filter(filter_type, scanline, recon) + yield recon + if len(a) != 0: + # :file:format We get here with a file format error: when the + # available bytes (after decompressing) do not pack into exact + # rows. + raise FormatError( + 'Wrong size for decompressed IDAT chunk.') + assert len(a) == 0 + + def validate_signature(self): + """If signature (header) has not been read then read and + validate it; otherwise do nothing. + """ + + if self.signature: + return + self.signature = self.file.read(8) + if self.signature != _signature: + raise FormatError("PNG file has invalid signature.") + + def preamble(self): + """ + Extract the image metadata by reading the initial part of the PNG + file up to the start of the ``IDAT`` chunk. All the chunks that + precede the ``IDAT`` chunk are read and either processed for + metadata or discarded. + """ + + self.validate_signature() + + while True: + if not self.atchunk: + self.atchunk = self.chunklentype() + if self.atchunk is None: + raise FormatError( + 'This PNG file has no IDAT chunks.') + if self.atchunk[1] == 'IDAT': + return + self.process_chunk() + + def chunklentype(self): + """Reads just enough of the input to determine the next + chunk's length and type, returned as a (*length*, *type*) pair + where *type* is a string. If there are no more chunks, ``None`` + is returned. + """ + + x = self.file.read(8) + if not x: + return None + if len(x) != 8: + raise FormatError( + 'End of file whilst reading chunk length and type.') + length,type = struct.unpack('!I4s', x) + type = bytestostr(type) + if length > 2**31-1: + raise FormatError('Chunk %s is too large: %d.' % (type,length)) + return length,type + + def process_chunk(self): + """Process the next chunk and its data. This only processes the + following chunk types, all others are ignored: ``IHDR``, + ``PLTE``, ``bKGD``, ``tRNS``, ``gAMA``, ``sBIT``. + """ + + type, data = self.chunk() + if type == 'IHDR': + # http://www.w3.org/TR/PNG/#11IHDR + if len(data) != 13: + raise FormatError('IHDR chunk has incorrect length.') + (self.width, self.height, self.bitdepth, self.color_type, + self.compression, self.filter, + self.interlace) = struct.unpack("!2I5B", data) + + # Check that the header specifies only valid combinations. + if self.bitdepth not in (1,2,4,8,16): + raise Error("invalid bit depth %d" % self.bitdepth) + if self.color_type not in (0,2,3,4,6): + raise Error("invalid colour type %d" % self.color_type) + # Check indexed (palettized) images have 8 or fewer bits + # per pixel; check only indexed or greyscale images have + # fewer than 8 bits per pixel. + if ((self.color_type & 1 and self.bitdepth > 8) or + (self.bitdepth < 8 and self.color_type not in (0,3))): + raise FormatError("Illegal combination of bit depth (%d)" + " and colour type (%d)." + " See http://www.w3.org/TR/2003/REC-PNG-20031110/#table111 ." + % (self.bitdepth, self.color_type)) + if self.compression != 0: + raise Error("unknown compression method %d" % self.compression) + if self.filter != 0: + raise FormatError("Unknown filter method %d," + " see http://www.w3.org/TR/2003/REC-PNG-20031110/#9Filters ." + % self.filter) + if self.interlace not in (0,1): + raise FormatError("Unknown interlace method %d," + " see http://www.w3.org/TR/2003/REC-PNG-20031110/#8InterlaceMethods ." + % self.interlace) + + # Derived values + # http://www.w3.org/TR/PNG/#6Colour-values + colormap = bool(self.color_type & 1) + greyscale = not (self.color_type & 2) + alpha = bool(self.color_type & 4) + color_planes = (3,1)[greyscale or colormap] + planes = color_planes + alpha + + self.colormap = colormap + self.greyscale = greyscale + self.alpha = alpha + self.color_planes = color_planes + self.planes = planes + self.psize = float(self.bitdepth)/float(8) * planes + if int(self.psize) == self.psize: + self.psize = int(self.psize) + self.row_bytes = int(math.ceil(self.width * self.psize)) + # Stores PLTE chunk if present, and is used to check + # chunk ordering constraints. + self.plte = None + # Stores tRNS chunk if present, and is used to check chunk + # ordering constraints. + self.trns = None + # Stores sbit chunk if present. + self.sbit = None + elif type == 'PLTE': + # http://www.w3.org/TR/PNG/#11PLTE + if self.plte: + warnings.warn("Multiple PLTE chunks present.") + self.plte = data + if len(data) % 3 != 0: + raise FormatError( + "PLTE chunk's length should be a multiple of 3.") + if len(data) > (2**self.bitdepth)*3: + raise FormatError("PLTE chunk is too long.") + if len(data) == 0: + raise FormatError("Empty PLTE is not allowed.") + elif type == 'bKGD': + try: + if self.colormap: + if not self.plte: + warnings.warn( + "PLTE chunk is required before bKGD chunk.") + self.background = struct.unpack('B', data) + else: + self.background = struct.unpack("!%dH" % self.color_planes, + data) + except struct.error: + raise FormatError("bKGD chunk has incorrect length.") + elif type == 'tRNS': + # http://www.w3.org/TR/PNG/#11tRNS + self.trns = data + if self.colormap: + if not self.plte: + warnings.warn("PLTE chunk is required before tRNS chunk.") + else: + if len(data) > len(self.plte)/3: + # Was warning, but promoted to Error as it + # would otherwise cause pain later on. + raise FormatError("tRNS chunk is too long.") + else: + if self.alpha: + raise FormatError( + "tRNS chunk is not valid with colour type %d." % + self.color_type) + try: + self.transparent = \ + struct.unpack("!%dH" % self.color_planes, data) + except struct.error: + raise FormatError("tRNS chunk has incorrect length.") + elif type == 'gAMA': + try: + self.gamma = struct.unpack("!L", data)[0] / 100000.0 + except struct.error: + raise FormatError("gAMA chunk has incorrect length.") + elif type == 'sBIT': + self.sbit = data + if (self.colormap and len(data) != 3 or + not self.colormap and len(data) != self.planes): + raise FormatError("sBIT chunk has incorrect length.") + + def read(self): + """ + Read the PNG file and decode it. Returns (`width`, `height`, + `pixels`, `metadata`). + + May use excessive memory. + + `pixels` are returned in boxed row flat pixel format. + """ + + def iteridat(): + """Iterator that yields all the ``IDAT`` chunks as strings.""" + while True: + try: + type, data = self.chunk() + except ValueError: + e = geterror() + raise ChunkError(e.args[0]) + if type == 'IEND': + # http://www.w3.org/TR/PNG/#11IEND + break + if type != 'IDAT': + continue + # type == 'IDAT' + # http://www.w3.org/TR/PNG/#11IDAT + if self.colormap and not self.plte: + warnings.warn("PLTE chunk is required before IDAT chunk") + yield data + + def iterdecomp(idat): + """Iterator that yields decompressed strings. `idat` should + be an iterator that yields the ``IDAT`` chunk data. + """ + + # Currently, with no max_length paramter to decompress, this + # routine will do one yield per IDAT chunk. So not very + # incremental. + d = zlib.decompressobj() + # Each IDAT chunk is passed to the decompressor, then any + # remaining state is decompressed out. + for data in idat: + # :todo: add a max_length argument here to limit output + # size. + yield array('B', d.decompress(data)) + yield array('B', d.flush()) + + self.preamble() + raw = iterdecomp(iteridat()) + + if self.interlace: + raw = array('B', itertools.chain(*raw)) + arraycode = 'BH'[self.bitdepth>8] + # Like :meth:`group` but producing an array.array object for + # each row. + pixels = imap_(lambda *row: array(arraycode, row), + *[iter(self.deinterlace(raw))]*self.width*self.planes) + else: + pixels = self.iterboxed(self.iterstraight(raw)) + meta = dict() + for attr in 'greyscale alpha planes bitdepth interlace'.split(): + meta[attr] = getattr(self, attr) + meta['size'] = (self.width, self.height) + for attr in 'gamma transparent background'.split(): + a = getattr(self, attr, None) + if a is not None: + meta[attr] = a + return self.width, self.height, pixels, meta + + + def read_flat(self): + """ + Read a PNG file and decode it into flat row flat pixel format. + Returns (*width*, *height*, *pixels*, *metadata*). + + May use excessive memory. + + `pixels` are returned in flat row flat pixel format. + + See also the :meth:`read` method which returns pixels in the + more stream-friendly boxed row flat pixel format. + """ + + x, y, pixel, meta = self.read() + arraycode = 'BH'[meta['bitdepth']>8] + pixel = array(arraycode, itertools.chain(*pixel)) + return x, y, pixel, meta + + def palette(self, alpha='natural'): + """Returns a palette that is a sequence of 3-tuples or 4-tuples, + synthesizing it from the ``PLTE`` and ``tRNS`` chunks. These + chunks should have already been processed (for example, by + calling the :meth:`preamble` method). All the tuples are the + same size: 3-tuples if there is no ``tRNS`` chunk, 4-tuples when + there is a ``tRNS`` chunk. Assumes that the image is colour type + 3 and therefore a ``PLTE`` chunk is required. + + If the `alpha` argument is ``'force'`` then an alpha channel is + always added, forcing the result to be a sequence of 4-tuples. + """ + + if not self.plte: + raise FormatError( + "Required PLTE chunk is missing in colour type 3 image.") + plte = group(array('B', self.plte), 3) + if self.trns or alpha == 'force': + trns = array('B', self.trns or '') + trns.extend([255]*(len(plte)-len(trns))) + plte = map(operator.add, plte, group(trns, 1)) + return plte + + def asDirect(self): + """Returns the image data as a direct representation of an + ``x * y * planes`` array. This method is intended to remove the + need for callers to deal with palettes and transparency + themselves. Images with a palette (colour type 3) + are converted to RGB or RGBA; images with transparency (a + ``tRNS`` chunk) are converted to LA or RGBA as appropriate. + When returned in this format the pixel values represent the + colour value directly without needing to refer to palettes or + transparency information. + + Like the :meth:`read` method this method returns a 4-tuple: + + (*width*, *height*, *pixels*, *meta*) + + This method normally returns pixel values with the bit depth + they have in the source image, but when the source PNG has an + ``sBIT`` chunk it is inspected and can reduce the bit depth of + the result pixels; pixel values will be reduced according to + the bit depth specified in the ``sBIT`` chunk (PNG nerds should + note a single result bit depth is used for all channels; the + maximum of the ones specified in the ``sBIT`` chunk. An RGB565 + image will be rescaled to 6-bit RGB666). + + The *meta* dictionary that is returned reflects the `direct` + format and not the original source image. For example, an RGB + source image with a ``tRNS`` chunk to represent a transparent + colour, will have ``planes=3`` and ``alpha=False`` for the + source image, but the *meta* dictionary returned by this method + will have ``planes=4`` and ``alpha=True`` because an alpha + channel is synthesized and added. + + *pixels* is the pixel data in boxed row flat pixel format (just + like the :meth:`read` method). + + All the other aspects of the image data are not changed. + """ + + self.preamble() + + # Simple case, no conversion necessary. + if not self.colormap and not self.trns and not self.sbit: + return self.read() + + x,y,pixels,meta = self.read() + + if self.colormap: + meta['colormap'] = False + meta['alpha'] = bool(self.trns) + meta['bitdepth'] = 8 + meta['planes'] = 3 + bool(self.trns) + plte = self.palette() + def iterpal(pixels): + for row in pixels: + row = map(plte.__getitem__, row) + yield array('B', itertools.chain(*row)) + pixels = iterpal(pixels) + elif self.trns: + # It would be nice if there was some reasonable way of doing + # this without generating a whole load of intermediate tuples. + # But tuples does seem like the easiest way, with no other way + # clearly much simpler or much faster. (Actually, the L to LA + # conversion could perhaps go faster (all those 1-tuples!), but + # I still wonder whether the code proliferation is worth it) + it = self.transparent + maxval = 2**meta['bitdepth']-1 + planes = meta['planes'] + meta['alpha'] = True + meta['planes'] += 1 + typecode = 'BH'[meta['bitdepth']>8] + def itertrns(pixels): + for row in pixels: + # For each row we group it into pixels, then form a + # characterisation vector that says whether each pixel + # is opaque or not. Then we convert True/False to + # 0/maxval (by multiplication), and add it as the extra + # channel. + row = group(row, planes) + opa = map(it.__ne__, row) + opa = map(maxval.__mul__, opa) + opa = zip(opa) # convert to 1-tuples + yield array(typecode, + itertools.chain(*map(operator.add, row, opa))) + pixels = itertrns(pixels) + targetbitdepth = None + if self.sbit: + sbit = struct.unpack('%dB' % len(self.sbit), self.sbit) + targetbitdepth = max(sbit) + if targetbitdepth > meta['bitdepth']: + raise Error('sBIT chunk %r exceeds bitdepth %d' % + (sbit,self.bitdepth)) + if min(sbit) <= 0: + raise Error('sBIT chunk %r has a 0-entry' % sbit) + if targetbitdepth == meta['bitdepth']: + targetbitdepth = None + if targetbitdepth: + shift = meta['bitdepth'] - targetbitdepth + meta['bitdepth'] = targetbitdepth + def itershift(pixels): + for row in pixels: + yield map(shift.__rrshift__, row) + pixels = itershift(pixels) + return x,y,pixels,meta + + def asFloat(self, maxval=1.0): + """Return image pixels as per :meth:`asDirect` method, but scale + all pixel values to be floating point values between 0.0 and + *maxval*. + """ + + x,y,pixels,info = self.asDirect() + sourcemaxval = 2**info['bitdepth']-1 + del info['bitdepth'] + info['maxval'] = float(maxval) + factor = float(maxval)/float(sourcemaxval) + def iterfloat(): + for row in pixels: + yield map(factor.__mul__, row) + return x,y,iterfloat(),info + + def _as_rescale(self, get, targetbitdepth): + """Helper used by :meth:`asRGB8` and :meth:`asRGBA8`.""" + + width,height,pixels,meta = get() + maxval = 2**meta['bitdepth'] - 1 + targetmaxval = 2**targetbitdepth - 1 + factor = float(targetmaxval) / float(maxval) + meta['bitdepth'] = targetbitdepth + def iterscale(): + for row in pixels: + yield map(lambda x: int(round(x*factor)), row) + return width, height, iterscale(), meta + + def asRGB8(self): + """Return the image data as an RGB pixels with 8-bits per + sample. This is like the :meth:`asRGB` method except that + this method additionally rescales the values so that they + are all between 0 and 255 (8-bit). In the case where the + source image has a bit depth < 8 the transformation preserves + all the information; where the source image has bit depth + > 8, then rescaling to 8-bit values loses precision. No + dithering is performed. Like :meth:`asRGB`, an alpha channel + in the source image will raise an exception. + + This function returns a 4-tuple: + (*width*, *height*, *pixels*, *metadata*). + *width*, *height*, *metadata* are as per the :meth:`read` method. + + *pixels* is the pixel data in boxed row flat pixel format. + """ + + return self._as_rescale(self.asRGB, 8) + + def asRGBA8(self): + """Return the image data as RGBA pixels with 8-bits per + sample. This method is similar to :meth:`asRGB8` and + :meth:`asRGBA`: The result pixels have an alpha channel, *and* + values are rescaled to the range 0 to 255. The alpha channel is + synthesized if necessary (with a small speed penalty). + """ + + return self._as_rescale(self.asRGBA, 8) + + def asRGB(self): + """Return image as RGB pixels. RGB colour images are passed + through unchanged; greyscales are expanded into RGB + triplets (there is a small speed overhead for doing this). + + An alpha channel in the source image will raise an + exception. + + The return values are as for the :meth:`read` method + except that the *metadata* reflect the returned pixels, not the + source image. In particular, for this method + ``metadata['greyscale']`` will be ``False``. + """ + + width,height,pixels,meta = self.asDirect() + if meta['alpha']: + raise Error("will not convert image with alpha channel to RGB") + if not meta['greyscale']: + return width,height,pixels,meta + meta['greyscale'] = False + typecode = 'BH'[meta['bitdepth'] > 8] + def iterrgb(): + for row in pixels: + a = array(typecode, [0]) * 3 * width + for i in range(3): + a[i::3] = row + yield a + return width,height,iterrgb(),meta + + def asRGBA(self): + """Return image as RGBA pixels. Greyscales are expanded into + RGB triplets; an alpha channel is synthesized if necessary. + The return values are as for the :meth:`read` method + except that the *metadata* reflect the returned pixels, not the + source image. In particular, for this method + ``metadata['greyscale']`` will be ``False``, and + ``metadata['alpha']`` will be ``True``. + """ + + width,height,pixels,meta = self.asDirect() + if meta['alpha'] and not meta['greyscale']: + return width,height,pixels,meta + typecode = 'BH'[meta['bitdepth'] > 8] + maxval = 2**meta['bitdepth'] - 1 + def newarray(): + return array(typecode, [0]) * 4 * width + if meta['alpha'] and meta['greyscale']: + # LA to RGBA + def convert(): + for row in pixels: + # Create a fresh target row, then copy L channel + # into first three target channels, and A channel + # into fourth channel. + a = newarray() + for i in range(3): + a[i::4] = row[0::2] + a[3::4] = row[1::2] + yield a + elif meta['greyscale']: + # L to RGBA + def convert(): + for row in pixels: + a = newarray() + for i in range(3): + a[i::4] = row + a[3::4] = array(typecode, [maxval]) * width + yield a + else: + assert not meta['alpha'] and not meta['greyscale'] + # RGB to RGBA + def convert(): + for row in pixels: + a = newarray() + for i in range(3): + a[i::4] = row[i::3] + a[3::4] = array(typecode, [maxval]) * width + yield a + meta['alpha'] = True + meta['greyscale'] = False + return width,height,convert(),meta + + +# === Internal Test Support === + +# This section comprises the tests that are internally validated (as +# opposed to tests which produce output files that are externally +# validated). Primarily they are unittests. + +# Note that it is difficult to internally validate the results of +# writing a PNG file. The only thing we can do is read it back in +# again, which merely checks consistency, not that the PNG file we +# produce is valid. + +# Run the tests from the command line: +# python -c 'import png;png.test()' + +# (For an in-memory binary file IO object) We use BytesIO where +# available, otherwise we use StringIO, but name it BytesIO. +try: + from io import BytesIO +except: + from StringIO import StringIO as BytesIO +import tempfile +import unittest + + +def test(): + unittest.main(__name__) + +def topngbytes(name, rows, x, y, **k): + """Convenience function for creating a PNG file "in memory" as a + string. Creates a :class:`Writer` instance using the keyword arguments, + then passes `rows` to its :meth:`Writer.write` method. The resulting + PNG file is returned as a string. `name` is used to identify the file for + debugging. + """ + + import os + + print (name) + f = BytesIO() + w = Writer(x, y, **k) + w.write(f, rows) + if os.environ.get('PYPNG_TEST_TMP'): + w = open(name, 'wb') + w.write(f.getvalue()) + w.close() + return f.getvalue() + +def testWithIO(inp, out, f): + """Calls the function `f` with ``sys.stdin`` changed to `inp` + and ``sys.stdout`` changed to `out`. They are restored when `f` + returns. This function returns whatever `f` returns. + """ + + import os + + try: + oldin,sys.stdin = sys.stdin,inp + oldout,sys.stdout = sys.stdout,out + x = f() + finally: + sys.stdin = oldin + sys.stdout = oldout + if os.environ.get('PYPNG_TEST_TMP') and hasattr(out,'getvalue'): + name = mycallersname() + if name: + w = open(name+'.png', 'wb') + w.write(out.getvalue()) + w.close() + return x + +def mycallersname(): + """Returns the name of the caller of the caller of this function + (hence the name of the caller of the function in which + "mycallersname()" textually appears). Returns None if this cannot + be determined.""" + + # http://docs.python.org/library/inspect.html#the-interpreter-stack + import inspect + + frame = inspect.currentframe() + if not frame: + return None + frame_,filename_,lineno_,funname,linelist_,listi_ = ( + inspect.getouterframes(frame)[2]) + return funname + +def seqtobytes(s): + """Convert a sequence of integers to a *bytes* instance. Good for + plastering over Python 2 / Python 3 cracks. + """ + + return strtobytes(''.join(chr(x) for x in s)) + +class Test(unittest.TestCase): + # This member is used by the superclass. If we don't define a new + # class here then when we use self.assertRaises() and the PyPNG code + # raises an assertion then we get no proper traceback. I can't work + # out why, but defining a new class here means we get a proper + # traceback. + class failureException(Exception): + pass + + def helperLN(self, n): + mask = (1 << n) - 1 + # Use small chunk_limit so that multiple chunk writing is + # tested. Making it a test for Issue 20. + w = Writer(15, 17, greyscale=True, bitdepth=n, chunk_limit=99) + f = BytesIO() + w.write_array(f, array('B', map(mask.__and__, range(1, 256)))) + r = Reader(bytes=f.getvalue()) + x,y,pixels,meta = r.read() + self.assertEqual(x, 15) + self.assertEqual(y, 17) + self.assertEqual(list(itertools.chain(*pixels)), + map(mask.__and__, range(1,256))) + def testL8(self): + return self.helperLN(8) + def testL4(self): + return self.helperLN(4) + def testL2(self): + "Also tests asRGB8." + w = Writer(1, 4, greyscale=True, bitdepth=2) + f = BytesIO() + w.write_array(f, array('B', range(4))) + r = Reader(bytes=f.getvalue()) + x,y,pixels,meta = r.asRGB8() + self.assertEqual(x, 1) + self.assertEqual(y, 4) + for i,row in enumerate(pixels): + self.assertEqual(len(row), 3) + self.assertEqual(list(row), [0x55*i]*3) + def testP2(self): + "2-bit palette." + a = (255,255,255) + b = (200,120,120) + c = (50,99,50) + w = Writer(1, 4, bitdepth=2, palette=[a,b,c]) + f = BytesIO() + w.write_array(f, array('B', (0,1,1,2))) + r = Reader(bytes=f.getvalue()) + x,y,pixels,meta = r.asRGB8() + self.assertEqual(x, 1) + self.assertEqual(y, 4) + self.assertEqual(list(pixels), map(list, [a, b, b, c])) + def testPtrns(self): + "Test colour type 3 and tRNS chunk (and 4-bit palette)." + a = (50,99,50,50) + b = (200,120,120,80) + c = (255,255,255) + d = (200,120,120) + e = (50,99,50) + w = Writer(3, 3, bitdepth=4, palette=[a,b,c,d,e]) + f = BytesIO() + w.write_array(f, array('B', (4, 3, 2, 3, 2, 0, 2, 0, 1))) + r = Reader(bytes=f.getvalue()) + x,y,pixels,meta = r.asRGBA8() + self.assertEqual(x, 3) + self.assertEqual(y, 3) + c = c+(255,) + d = d+(255,) + e = e+(255,) + boxed = [(e,d,c),(d,c,a),(c,a,b)] + flat = map(lambda row: itertools.chain(*row), boxed) + self.assertEqual(map(list, pixels), map(list, flat)) + def testRGBtoRGBA(self): + "asRGBA8() on colour type 2 source.""" + # Test for Issue 26 + r = Reader(bytes=_pngsuite['basn2c08']) + x,y,pixels,meta = r.asRGBA8() + # Test the pixels at row 9 columns 0 and 1. + row9 = list(pixels)[9] + self.assertEqual(row9[0:8], + [0xff, 0xdf, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff]) + def testLtoRGBA(self): + "asRGBA() on grey source.""" + # Test for Issue 60 + r = Reader(bytes=_pngsuite['basi0g08']) + x,y,pixels,meta = r.asRGBA() + row9 = list(list(pixels)[9]) + self.assertEqual(row9[0:8], + [222, 222, 222, 255, 221, 221, 221, 255]) + def testCtrns(self): + "Test colour type 2 and tRNS chunk." + # Test for Issue 25 + r = Reader(bytes=_pngsuite['tbrn2c08']) + x,y,pixels,meta = r.asRGBA8() + # I just happen to know that the first pixel is transparent. + # In particular it should be #7f7f7f00 + row0 = list(pixels)[0] + self.assertEqual(tuple(row0[0:4]), (0x7f, 0x7f, 0x7f, 0x00)) + def testAdam7read(self): + """Adam7 interlace reading. + Specifically, test that for images in the PngSuite that + have both an interlaced and straightlaced pair that both + images from the pair produce the same array of pixels.""" + for candidate in _pngsuite: + if not candidate.startswith('basn'): + continue + candi = candidate.replace('n', 'i') + if candi not in _pngsuite: + continue + print ('adam7 read %s' % (candidate,)) + straight = Reader(bytes=_pngsuite[candidate]) + adam7 = Reader(bytes=_pngsuite[candi]) + # Just compare the pixels. Ignore x,y (because they're + # likely to be correct?); metadata is ignored because the + # "interlace" member differs. Lame. + straight = straight.read()[2] + adam7 = adam7.read()[2] + self.assertEqual(map(list, straight), map(list, adam7)) + def testAdam7write(self): + """Adam7 interlace writing. + For each test image in the PngSuite, write an interlaced + and a straightlaced version. Decode both, and compare results. + """ + # Not such a great test, because the only way we can check what + # we have written is to read it back again. + + for name,bytes in _pngsuite.items(): + # Only certain colour types supported for this test. + if name[3:5] not in ['n0', 'n2', 'n4', 'n6']: + continue + it = Reader(bytes=bytes) + x,y,pixels,meta = it.read() + pngi = topngbytes('adam7wn'+name+'.png', pixels, + x=x, y=y, bitdepth=it.bitdepth, + greyscale=it.greyscale, alpha=it.alpha, + transparent=it.transparent, + interlace=False) + x,y,ps,meta = Reader(bytes=pngi).read() + it = Reader(bytes=bytes) + x,y,pixels,meta = it.read() + pngs = topngbytes('adam7wi'+name+'.png', pixels, + x=x, y=y, bitdepth=it.bitdepth, + greyscale=it.greyscale, alpha=it.alpha, + transparent=it.transparent, + interlace=True) + x,y,pi,meta = Reader(bytes=pngs).read() + self.assertEqual(map(list, ps), map(list, pi)) + def testPGMin(self): + """Test that the command line tool can read PGM files.""" + def do(): + return _main(['testPGMin']) + s = BytesIO() + s.write(strtobytes('P5 2 2 3\n')) + s.write(strtobytes('\x00\x01\x02\x03')) + s.flush() + s.seek(0) + o = BytesIO() + testWithIO(s, o, do) + r = Reader(bytes=o.getvalue()) + x,y,pixels,meta = r.read() + self.assertTrue(r.greyscale) + self.assertEqual(r.bitdepth, 2) + def testPAMin(self): + """Test that the command line tool can read PAM file.""" + def do(): + return _main(['testPAMin']) + s = BytesIO() + s.write(strtobytes('P7\nWIDTH 3\nHEIGHT 1\nDEPTH 4\nMAXVAL 255\n' + 'TUPLTYPE RGB_ALPHA\nENDHDR\n')) + # The pixels in flat row flat pixel format + flat = [255,0,0,255, 0,255,0,120, 0,0,255,30] + asbytes = seqtobytes(flat) + s.write(asbytes) + s.flush() + s.seek(0) + o = BytesIO() + testWithIO(s, o, do) + r = Reader(bytes=o.getvalue()) + x,y,pixels,meta = r.read() + self.assertTrue(r.alpha) + self.assertTrue(not r.greyscale) + self.assertEqual(list(itertools.chain(*pixels)), flat) + def testLA4(self): + """Create an LA image with bitdepth 4.""" + bytes = topngbytes('la4.png', [[5, 12]], 1, 1, + greyscale=True, alpha=True, bitdepth=4) + sbit = Reader(bytes=bytes).chunk('sBIT')[1] + self.assertEqual(sbit, strtobytes('\x04\x04')) + def testPNMsbit(self): + """Test that PNM files can generates sBIT chunk.""" + def do(): + return _main(['testPNMsbit']) + s = BytesIO() + s.write(strtobytes('P6 8 1 1\n')) + for pixel in range(8): + s.write(struct.pack(' 255: + a = array('H') + else: + a = array('B') + fw = float(width) + fh = float(height) + pfun = test_patterns[pattern] + for y in range(height): + fy = float(y)/fh + for x in range(width): + a.append(int(round(pfun(float(x)/fw, fy) * maxval))) + return a + + def test_rgba(size=256, bitdepth=8, + red="GTB", green="GLR", blue="RTL", alpha=None): + """ + Create a test image. Each channel is generated from the + specified pattern; any channel apart from red can be set to + None, which will cause it not to be in the image. It + is possible to create all PNG channel types (L, RGB, LA, RGBA), + as well as non PNG channel types (RGA, and so on). + """ + + i = test_pattern(size, size, bitdepth, red) + psize = 1 + for channel in (green, blue, alpha): + if channel: + c = test_pattern(size, size, bitdepth, channel) + i = interleave_planes(i, c, psize, 1) + psize += 1 + return i + + def pngsuite_image(name): + """ + Create a test image by reading an internal copy of the files + from the PngSuite. Returned in flat row flat pixel format. + """ + + if name not in _pngsuite: + raise NotImplementedError("cannot find PngSuite file %s (use -L for a list)" % name) + r = Reader(bytes=_pngsuite[name]) + w,h,pixels,meta = r.asDirect() + assert w == h + # LAn for n < 8 is a special case for which we need to rescale + # the data. + if meta['greyscale'] and meta['alpha'] and meta['bitdepth'] < 8: + factor = 255 // (2**meta['bitdepth']-1) + def rescale(data): + for row in data: + yield map(factor.__mul__, row) + pixels = rescale(pixels) + meta['bitdepth'] = 8 + arraycode = 'BH'[meta['bitdepth']>8] + return w, array(arraycode, itertools.chain(*pixels)), meta + + # The body of test_suite() + size = 256 + if options.test_size: + size = options.test_size + options.bitdepth = options.test_depth + options.greyscale=bool(options.test_black) + + kwargs = {} + if options.test_red: + kwargs["red"] = options.test_red + if options.test_green: + kwargs["green"] = options.test_green + if options.test_blue: + kwargs["blue"] = options.test_blue + if options.test_alpha: + kwargs["alpha"] = options.test_alpha + if options.greyscale: + if options.test_red or options.test_green or options.test_blue: + raise ValueError("cannot specify colours (R, G, B) when greyscale image (black channel, K) is specified") + kwargs["red"] = options.test_black + kwargs["green"] = None + kwargs["blue"] = None + options.alpha = bool(options.test_alpha) + if not args: + pixels = test_rgba(size, options.bitdepth, **kwargs) + else: + size,pixels,meta = pngsuite_image(args[0]) + for k in ['bitdepth', 'alpha', 'greyscale']: + setattr(options, k, meta[k]) + + writer = Writer(size, size, + bitdepth=options.bitdepth, + transparent=options.transparent, + background=options.background, + gamma=options.gamma, + greyscale=options.greyscale, + alpha=options.alpha, + compression=options.compression, + interlace=options.interlace) + writer.write_array(sys.stdout, pixels) + +def read_pam_header(infile): + """ + Read (the rest of a) PAM header. `infile` should be positioned + immediately after the initial 'P7' line (at the beginning of the + second line). Returns are as for `read_pnm_header`. + """ + + # Unlike PBM, PGM, and PPM, we can read the header a line at a time. + header = dict() + while True: + l = infile.readline().strip() + if l == strtobytes('ENDHDR'): + break + if not l: + raise EOFError('PAM ended prematurely') + if l[0] == strtobytes('#'): + continue + l = l.split(None, 1) + if l[0] not in header: + header[l[0]] = l[1] + else: + header[l[0]] += strtobytes(' ') + l[1] + + required = ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL'] + required = [strtobytes(x) for x in required] + WIDTH,HEIGHT,DEPTH,MAXVAL = required + present = [x for x in required if x in header] + if len(present) != len(required): + raise Error('PAM file must specify WIDTH, HEIGHT, DEPTH, and MAXVAL') + width = int(header[WIDTH]) + height = int(header[HEIGHT]) + depth = int(header[DEPTH]) + maxval = int(header[MAXVAL]) + if (width <= 0 or + height <= 0 or + depth <= 0 or + maxval <= 0): + raise Error( + 'WIDTH, HEIGHT, DEPTH, MAXVAL must all be positive integers') + return 'P7', width, height, depth, maxval + +def read_pnm_header(infile, supported=('P5','P6')): + """ + Read a PNM header, returning (format,width,height,depth,maxval). + `width` and `height` are in pixels. `depth` is the number of + channels in the image; for PBM and PGM it is synthesized as 1, for + PPM as 3; for PAM images it is read from the header. `maxval` is + synthesized (as 1) for PBM images. + """ + + # Generally, see http://netpbm.sourceforge.net/doc/ppm.html + # and http://netpbm.sourceforge.net/doc/pam.html + + supported = [strtobytes(x) for x in supported] + + # Technically 'P7' must be followed by a newline, so by using + # rstrip() we are being liberal in what we accept. I think this + # is acceptable. + type = infile.read(3).rstrip() + if type not in supported: + raise NotImplementedError('file format %s not supported' % type) + if type == strtobytes('P7'): + # PAM header parsing is completely different. + return read_pam_header(infile) + # Expected number of tokens in header (3 for P4, 4 for P6) + expected = 4 + pbm = ('P1', 'P4') + if type in pbm: + expected = 3 + header = [type] + + # We have to read the rest of the header byte by byte because the + # final whitespace character (immediately following the MAXVAL in + # the case of P6) may not be a newline. Of course all PNM files in + # the wild use a newline at this point, so it's tempting to use + # readline; but it would be wrong. + def getc(): + c = infile.read(1) + if not c: + raise Error('premature EOF reading PNM header') + return c + + c = getc() + while True: + # Skip whitespace that precedes a token. + while c.isspace(): + c = getc() + # Skip comments. + while c == '#': + while c not in '\n\r': + c = getc() + if not c.isdigit(): + raise Error('unexpected character %s found in header' % c) + # According to the specification it is legal to have comments + # that appear in the middle of a token. + # This is bonkers; I've never seen it; and it's a bit awkward to + # code good lexers in Python (no goto). So we break on such + # cases. + token = strtobytes('') + while c.isdigit(): + token += c + c = getc() + # Slight hack. All "tokens" are decimal integers, so convert + # them here. + header.append(int(token)) + if len(header) == expected: + break + # Skip comments (again) + while c == '#': + while c not in '\n\r': + c = getc() + if not c.isspace(): + raise Error('expected header to end with whitespace, not %s' % c) + + if type in pbm: + # synthesize a MAXVAL + header.append(1) + depth = (1,3)[type == strtobytes('P6')] + return header[0], header[1], header[2], depth, header[3] + +def write_pnm(file, width, height, pixels, meta): + """Write a Netpbm PNM/PAM file.""" + + bitdepth = meta['bitdepth'] + maxval = 2**bitdepth - 1 + # Rudely, the number of image planes can be used to determine + # whether we are L (PGM), LA (PAM), RGB (PPM), or RGBA (PAM). + planes = meta['planes'] + # Can be an assert as long as we assume that pixels and meta came + # from a PNG file. + assert planes in (1,2,3,4) + if planes in (1,3): + if 1 == planes: + # PGM + # Could generate PBM if maxval is 1, but we don't (for one + # thing, we'd have to convert the data, not just blat it + # out). + fmt = 'P5' + else: + # PPM + fmt = 'P6' + file.write('%s %d %d %d\n' % (fmt, width, height, maxval)) + if planes in (2,4): + # PAM + # See http://netpbm.sourceforge.net/doc/pam.html + if 2 == planes: + tupltype = 'GRAYSCALE_ALPHA' + else: + tupltype = 'RGB_ALPHA' + file.write('P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\n' + 'TUPLTYPE %s\nENDHDR\n' % + (width, height, planes, maxval, tupltype)) + # Values per row + vpr = planes * width + # struct format + fmt = '>%d' % vpr + if maxval > 0xff: + fmt = fmt + 'H' + else: + fmt = fmt + 'B' + for row in pixels: + file.write(struct.pack(fmt, *row)) + file.flush() + +def color_triple(color): + """ + Convert a command line colour value to a RGB triple of integers. + FIXME: Somewhere we need support for greyscale backgrounds etc. + """ + if color.startswith('#') and len(color) == 4: + return (int(color[1], 16), + int(color[2], 16), + int(color[3], 16)) + if color.startswith('#') and len(color) == 7: + return (int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16)) + elif color.startswith('#') and len(color) == 13: + return (int(color[1:5], 16), + int(color[5:9], 16), + int(color[9:13], 16)) + + +def _main(argv): + """ + Run the PNG encoder with options from the command line. + """ + + # Parse command line arguments + from optparse import OptionParser + import re + version = '%prog ' + re.sub(r'( ?\$|URL: |Rev:)', '', __version__) + parser = OptionParser(version=version) + parser.set_usage("%prog [options] [imagefile]") + parser.add_option('-r', '--read-png', default=False, + action='store_true', + help='Read PNG, write PNM') + parser.add_option("-i", "--interlace", + default=False, action="store_true", + help="create an interlaced PNG file (Adam7)") + parser.add_option("-t", "--transparent", + action="store", type="string", metavar="color", + help="mark the specified colour (#RRGGBB) as transparent") + parser.add_option("-b", "--background", + action="store", type="string", metavar="color", + help="save the specified background colour") + parser.add_option("-a", "--alpha", + action="store", type="string", metavar="pgmfile", + help="alpha channel transparency (RGBA)") + parser.add_option("-g", "--gamma", + action="store", type="float", metavar="value", + help="save the specified gamma value") + parser.add_option("-c", "--compression", + action="store", type="int", metavar="level", + help="zlib compression level (0-9)") + parser.add_option("-T", "--test", + default=False, action="store_true", + help="create a test image (a named PngSuite image if an argument is supplied)") + parser.add_option('-L', '--list', + default=False, action='store_true', + help="print list of named test images") + parser.add_option("-R", "--test-red", + action="store", type="string", metavar="pattern", + help="test pattern for the red image layer") + parser.add_option("-G", "--test-green", + action="store", type="string", metavar="pattern", + help="test pattern for the green image layer") + parser.add_option("-B", "--test-blue", + action="store", type="string", metavar="pattern", + help="test pattern for the blue image layer") + parser.add_option("-A", "--test-alpha", + action="store", type="string", metavar="pattern", + help="test pattern for the alpha image layer") + parser.add_option("-K", "--test-black", + action="store", type="string", metavar="pattern", + help="test pattern for greyscale image") + parser.add_option("-d", "--test-depth", + default=8, action="store", type="int", + metavar='NBITS', + help="create test PNGs that are NBITS bits per channel") + parser.add_option("-S", "--test-size", + action="store", type="int", metavar="size", + help="width and height of the test image") + (options, args) = parser.parse_args(args=argv[1:]) + + # Convert options + if options.transparent is not None: + options.transparent = color_triple(options.transparent) + if options.background is not None: + options.background = color_triple(options.background) + + if options.list: + names = list(_pngsuite) + names.sort() + for name in names: + print (name) + return + + # Run regression tests + if options.test: + return test_suite(options, args) + + # Prepare input and output files + if len(args) == 0: + infilename = '-' + infile = sys.stdin + elif len(args) == 1: + infilename = args[0] + infile = open(infilename, 'rb') + else: + parser.error("more than one input file") + outfile = sys.stdout + + if options.read_png: + # Encode PNG to PPM + png = Reader(file=infile) + width,height,pixels,meta = png.asDirect() + write_pnm(outfile, width, height, pixels, meta) + else: + # Encode PNM to PNG + format, width, height, depth, maxval = \ + read_pnm_header(infile, ('P5','P6','P7')) + # When it comes to the variety of input formats, we do something + # rather rude. Observe that L, LA, RGB, RGBA are the 4 colour + # types supported by PNG and that they correspond to 1, 2, 3, 4 + # channels respectively. So we use the number of channels in + # the source image to determine which one we have. We do not + # care about TUPLTYPE. + greyscale = depth <= 2 + pamalpha = depth in (2,4) + supported = map(lambda x: 2**x-1, range(1,17)) + try: + mi = supported.index(maxval) + except ValueError: + raise NotImplementedError( + 'your maxval (%s) not in supported list %s' % + (maxval, str(supported))) + bitdepth = mi+1 + writer = Writer(width, height, + greyscale=greyscale, + bitdepth=bitdepth, + interlace=options.interlace, + transparent=options.transparent, + background=options.background, + alpha=bool(pamalpha or options.alpha), + gamma=options.gamma, + compression=options.compression) + if options.alpha: + pgmfile = open(options.alpha, 'rb') + format, awidth, aheight, adepth, amaxval = \ + read_pnm_header(pgmfile, 'P5') + if amaxval != '255': + raise NotImplementedError( + 'maxval %s not supported for alpha channel' % amaxval) + if (awidth, aheight) != (width, height): + raise ValueError("alpha channel image size mismatch" + " (%s has %sx%s but %s has %sx%s)" + % (infilename, width, height, + options.alpha, awidth, aheight)) + writer.convert_ppm_and_pgm(infile, pgmfile, outfile) + else: + writer.convert_pnm(infile, outfile) + + +if __name__ == '__main__': + try: + _main(sys.argv) + except Error: + e = geterror() + sys.stderr.write("%s\n" % (e,)) diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/run_tests.py b/venv/Lib/site-packages/pygame/tests/test_utils/run_tests.py new file mode 100644 index 0000000..a1261cf --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/run_tests.py @@ -0,0 +1,344 @@ +import sys + +if __name__ == '__main__': + sys.exit("This module is for import only") + +test_pkg_name = '.'.join(__name__.split('.')[0:-2]) +is_pygame_pkg = test_pkg_name == 'pygame.tests' +test_runner_mod = test_pkg_name + '.test_utils.test_runner' + +if is_pygame_pkg: + from pygame.tests.test_utils import import_submodule + from pygame.tests.test_utils.test_runner \ + import prepare_test_env, run_test, combine_results, \ + get_test_results, TEST_RESULTS_START +else: + from test.test_utils import import_submodule + from test.test_utils.test_runner \ + import prepare_test_env, run_test, combine_results, \ + get_test_results, TEST_RESULTS_START +import pygame +import pygame.threads + +import os +import re +import shutil +import tempfile +import time +import random +from pprint import pformat + +was_run = False + +def run(*args, **kwds): + """Run the Pygame unit test suite and return (total tests run, fails dict) + + Positional arguments (optional): + The names of tests to include. If omitted then all tests are run. Test + names need not include the trailing '_test'. + + Keyword arguments: + incomplete - fail incomplete tests (default False) + usesubprocess - run all test suites in the current process + (default False, use separate subprocesses) + dump - dump failures/errors as dict ready to eval (default False) + file - if provided, the name of a file into which to dump failures/errors + timings - if provided, the number of times to run each individual test to + get an average run time (default is run each test once) + exclude - A list of TAG names to exclude from the run. The items may be + comma or space separated. + show_output - show silenced stderr/stdout on errors (default False) + all - dump all results, not just errors (default False) + randomize - randomize order of tests (default False) + seed - if provided, a seed randomizer integer + multi_thread - if provided, the number of THREADS in which to run + subprocessed tests + time_out - if subprocess is True then the time limit in seconds before + killing a test (default 30) + fake - if provided, the name of the fake tests package in the + run_tests__tests subpackage to run instead of the normal + Pygame tests + python - the path to a python executable to run subprocessed tests + (default sys.executable) + interative - allow tests tagged 'interative'. + + Return value: + A tuple of total number of tests run, dictionary of error information. The + dictionary is empty if no errors were recorded. + + By default individual test modules are run in separate subprocesses. This + recreates normal Pygame usage where pygame.init() and pygame.quit() are + called only once per program execution, and avoids unfortunate + interactions between test modules. Also, a time limit is placed on test + execution, so frozen tests are killed when there time allotment expired. + Use the single process option if threading is not working properly or if + tests are taking too long. It is not guaranteed that all tests will pass + in single process mode. + + Tests are run in a randomized order if the randomize argument is True or a + seed argument is provided. If no seed integer is provided then the system + time is used. + + Individual test modules may have a corresponding *_tags.py module, + defining a __tags__ attribute, a list of tag strings used to selectively + omit modules from a run. By default only the 'interactive', 'ignore', and + 'subprocess_ignore' tags are ignored. 'interactive' is for modules that + take user input, like cdrom_test.py. 'ignore' and 'subprocess_ignore' for + for disabling modules for foreground and subprocess modes respectively. + These are for disabling tests on optional modules or for experimental + modules with known problems. These modules can be run from the console as + a Python program. + + This function can only be called once per Python session. It is not + reentrant. + + """ + + global was_run + + if was_run: + raise RuntimeError("run() was already called this session") + was_run = True + + options = kwds.copy() + option_usesubprocess = options.get('usesubprocess', False) + option_dump = options.pop('dump', False) + option_file = options.pop('file', None) + option_randomize = options.get('randomize', False) + option_seed = options.get('seed', None) + option_multi_thread = options.pop('multi_thread', 1) + option_time_out = options.pop('time_out', 120) + option_fake = options.pop('fake', None) + option_python = options.pop('python', sys.executable) + option_exclude = options.pop('exclude', ()) + option_interactive = options.pop('interactive', False) + + if not option_interactive and 'interactive' not in option_exclude: + option_exclude += ('interactive',) + if option_usesubprocess and 'subprocess_ignore' not in option_exclude: + option_exclude += ('subprocess_ignore',) + elif 'ignore' not in option_exclude: + option_exclude += ('ignore',) + if sys.version_info < (3, 0, 0): + option_exclude += ('python2_ignore',) + else: + option_exclude += ('python3_ignore',) + + if pygame.get_sdl_version() < (2, 0, 0): + option_exclude += ('SDL1_ignore',) + else: + option_exclude += ('SDL2_ignore',) + main_dir, test_subdir, fake_test_subdir = prepare_test_env() + + ########################################################################### + # Compile a list of test modules. If fake, then compile list of fake + # xxxx_test.py from run_tests__tests + + TEST_MODULE_RE = re.compile('^(.+_test)\.py$') + + test_mods_pkg_name = test_pkg_name + + working_dir_temp = tempfile.mkdtemp() + + if option_fake is not None: + test_mods_pkg_name = '.'.join([test_mods_pkg_name, + 'run_tests__tests', + option_fake]) + test_subdir = os.path.join(fake_test_subdir, option_fake) + working_dir = test_subdir + else: + working_dir = working_dir_temp + + + # Added in because some machines will need os.environ else there will be + # false failures in subprocess mode. Same issue as python2.6. Needs some + # env vars. + + test_env = os.environ + + fmt1 = '%s.%%s' % test_mods_pkg_name + fmt2 = '%s.%%s_test' % test_mods_pkg_name + if args: + test_modules = [ + m.endswith('_test') and (fmt1 % m) or (fmt2 % m) for m in args + ] + else: + test_modules = [] + for f in sorted(os.listdir(test_subdir)): + for match in TEST_MODULE_RE.findall(f): + test_modules.append(fmt1 % (match,)) + + ########################################################################### + # Remove modules to be excluded. + + tmp = test_modules + test_modules = [] + for name in tmp: + tag_module_name = "%s_tags" % (name[0:-5],) + try: + tag_module = import_submodule(tag_module_name) + except ImportError: + test_modules.append(name) + else: + try: + tags = tag_module.__tags__ + except AttributeError: + print ("%s has no tags: ignoring" % (tag_module_name,)) + test_modules.append(name) + else: + for tag in tags: + if tag in option_exclude: + print ("skipping %s (tag '%s')" % (name, tag)) + break + else: + test_modules.append(name) + del tmp, tag_module_name, name + + ########################################################################### + # Meta results + + results = {} + meta_results = {'__meta__' : {}} + meta = meta_results['__meta__'] + + ########################################################################### + # Randomization + + if option_randomize or option_seed is not None: + if option_seed is None: + option_seed = time.time() + meta['random_seed'] = option_seed + print ("\nRANDOM SEED USED: %s\n" % option_seed) + random.seed(option_seed) + random.shuffle(test_modules) + + ########################################################################### + # Single process mode + + if not option_usesubprocess: + options['exclude'] = option_exclude + t = time.time() + for module in test_modules: + results.update(run_test(module, **options)) + t = time.time() - t + + ########################################################################### + # Subprocess mode + # + + else: + if is_pygame_pkg: + from pygame.tests.test_utils.async_sub import proc_in_time_or_kill + else: + from test.test_utils.async_sub import proc_in_time_or_kill + + pass_on_args = ['--exclude', ','.join(option_exclude)] + for field in ['randomize', 'incomplete', 'unbuffered']: + if kwds.get(field, False): + pass_on_args.append('--'+field) + + def sub_test(module): + print ('loading %s' % module) + + cmd = [option_python, '-m', test_runner_mod, + module] + pass_on_args + + return (module, + (cmd, test_env, working_dir), + proc_in_time_or_kill(cmd, option_time_out, env=test_env, + wd=working_dir)) + + if option_multi_thread > 1: + def tmap(f, args): + return pygame.threads.tmap ( + f, args, stop_on_error = False, + num_workers = option_multi_thread + ) + else: + tmap = map + + t = time.time() + + for module, cmd, (return_code, raw_return) in tmap(sub_test, + test_modules): + test_file = '%s.py' % os.path.join(test_subdir, module) + cmd, test_env, working_dir = cmd + + test_results = get_test_results(raw_return) + if test_results: + results.update(test_results) + else: + results[module] = {} + + results[module].update(dict( + return_code=return_code, + raw_return=raw_return, + cmd=cmd, + test_file=test_file, + test_env=test_env, + working_dir=working_dir, + module=module, + )) + + t = time.time() - t + + ########################################################################### + # Output Results + # + + untrusty_total, combined = combine_results(results, t) + total, n_errors, n_failures = count_results(results) + + meta['total_tests'] = total + meta['combined'] = combined + meta['total_errors'] = n_errors + meta['total_failures'] = n_failures + results.update(meta_results) + + if not option_usesubprocess and total != untrusty_total: + raise AssertionError('Something went wrong in the Test Machinery:\n' + 'total: %d != untrusty_total: %d' % (total, untrusty_total)) + + if not option_dump: + print (combined) + else: + print (TEST_RESULTS_START) + print (pformat(results)) + + if option_file is not None: + results_file = open(option_file, 'w') + try: + results_file.write(pformat(results)) + finally: + results_file.close() + + shutil.rmtree(working_dir_temp) + + return total, n_errors + n_failures + + +def count_results(results): + total = errors = failures = 0 + for result in results.values(): + if result.get('return_code', 0): + total += 1 + errors += 1 + else: + total += result['num_tests'] + errors += result['num_errors'] + failures += result['num_failures'] + + return total, errors, failures + + +def run_and_exit(*args, **kwargs): + """Run the tests, and if there are failures, exit with a return code of 1. + + This is needed for various buildbots to recognise that the tests have + failed. + """ + total, fails = run(*args, **kwargs) + if fails: + sys.exit(1) + sys.exit(0) + diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/test_machinery.py b/venv/Lib/site-packages/pygame/tests/test_utils/test_machinery.py new file mode 100644 index 0000000..2222b49 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/test_machinery.py @@ -0,0 +1,80 @@ +import inspect +import random +import re +import unittest + +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + +from . import import_submodule + +class PygameTestLoader(unittest.TestLoader): + def __init__(self, randomize_tests=False, include_incomplete=False, + exclude=('interactive',)): + super(PygameTestLoader, self).__init__() + self.randomize_tests = randomize_tests + + if exclude is None: + self.exclude = set() + else: + self.exclude = set(exclude) + + if include_incomplete: + self.testMethodPrefix = ('test', 'todo_') + + def getTestCaseNames(self, testCaseClass): + res = [] + for name in super(PygameTestLoader, self).getTestCaseNames(testCaseClass): + tags = get_tags(testCaseClass, getattr(testCaseClass, name)) + if self.exclude.isdisjoint(tags): + res.append(name) + + if self.randomize_tests: + random.shuffle(res) + + return res + + +# Exclude by tags: + +TAGS_RE = re.compile(r"\|[tT]ags:(-?[ a-zA-Z,0-9_\n]+)\|", re.M) + +class TestTags: + def __init__(self): + self.memoized = {} + self.parent_modules = {} + + def get_parent_module(self, class_): + if class_ not in self.parent_modules: + self.parent_modules[class_] = import_submodule(class_.__module__) + return self.parent_modules[class_] + + def __call__(self, parent_class, meth): + key = (parent_class, meth.__name__) + if key not in self.memoized: + parent_module = self.get_parent_module(parent_class) + + module_tags = getattr(parent_module, '__tags__', []) + class_tags = getattr(parent_class, '__tags__', []) + + tags = TAGS_RE.search(inspect.getdoc(meth) or '') + if tags: test_tags = [t.strip() for t in tags.group(1).split(',')] + else: test_tags = [] + + combined = set() + for tags in (module_tags, class_tags, test_tags): + if not tags: continue + + add = set([t for t in tags if not t.startswith('-')]) + remove = set([t[1:] for t in tags if t not in add]) + + if add: combined.update(add) + if remove: combined.difference_update(remove) + + self.memoized[key] = combined + + return self.memoized[key] + +get_tags = TestTags() diff --git a/venv/Lib/site-packages/pygame/tests/test_utils/test_runner.py b/venv/Lib/site-packages/pygame/tests/test_utils/test_runner.py new file mode 100644 index 0000000..8ee322f --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/test_utils/test_runner.py @@ -0,0 +1,234 @@ +import sys +import os + +if __name__ == '__main__': + pkg_dir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0] + parent_dir, pkg_name = os.path.split(pkg_dir) + is_pygame_pkg = (pkg_name == 'tests' and + os.path.split(parent_dir)[1] == 'pygame') + if not is_pygame_pkg: + sys.path.insert(0, parent_dir) +else: + is_pygame_pkg = __name__.startswith('pygame.tests.') + +import unittest +from .test_machinery import PygameTestLoader + +import re +try: + import StringIO +except ImportError: + import io as StringIO + +import optparse +from pprint import pformat + + +def prepare_test_env(): + test_subdir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0] + main_dir = os.path.split(test_subdir)[0] + sys.path.insert(0, test_subdir) + fake_test_subdir = os.path.join(test_subdir, 'run_tests__tests') + return main_dir, test_subdir, fake_test_subdir + +main_dir, test_subdir, fake_test_subdir = prepare_test_env() + +################################################################################ +# Set the command line options +# +# options are shared with run_tests.py so make sure not to conflict +# in time more will be added here + +TAG_PAT = r'-?[a-zA-Z0-9_]+' +TAG_RE = re.compile(TAG_PAT) +EXCLUDE_RE = re.compile("(%s,?\s*)+$" % (TAG_PAT,)) + +def exclude_callback(option, opt, value, parser): + if EXCLUDE_RE.match(value) is None: + raise optparse.OptionValueError("%s argument has invalid value" % + (opt,)) + parser.values.exclude = TAG_RE.findall(value) + +opt_parser = optparse.OptionParser() + +opt_parser.add_option ( + "-i", "--incomplete", action = 'store_true', + help = "fail incomplete tests" ) + +opt_parser.add_option ( + "-s", "--usesubprocess", action = "store_true", + help = "run everything in a single process " + " (default: use no subprocesses)" ) + +opt_parser.add_option ( + "-e", "--exclude", + action = 'callback', + type = 'string', + help = "exclude tests containing any of TAGS", + callback = exclude_callback) + +opt_parser.add_option ( + "-v", "--unbuffered", action = 'store_true', + help = "Show stdout/stderr as tests run, rather than storing it and showing on failures" ) + +opt_parser.add_option ( + "-r", "--randomize", action = 'store_true', + help = "randomize order of tests" ) + +################################################################################ +# If an xxxx_test.py takes longer than TIME_OUT seconds it will be killed +# This is only the default, can be over-ridden on command line + +TIME_OUT = 30 + +# DEFAULTS + +################################################################################ +# Human readable output +# + +COMPLETE_FAILURE_TEMPLATE = """ +====================================================================== +ERROR: all_tests_for (%(module)s.AllTestCases) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "test/%(module)s.py", line 1, in all_tests_for +subprocess completely failed with return code of %(return_code)s +cmd: %(cmd)s +test_env: %(test_env)s +working_dir: %(working_dir)s +return (first 10 and last 10 lines): +%(raw_return)s + +""" # Leave that last empty line else build page regex won't match + # Text also needs to be vertically compressed + + +RAN_TESTS_DIV = (70 * "-") + "\nRan" + +DOTS = re.compile("^([FE.sux]*)$", re.MULTILINE) + +def combine_results(all_results, t): + """ + + Return pieced together results in a form fit for human consumption. Don't + rely on results if piecing together subprocessed results (single process + mode is fine). Was originally meant for that purpose but was found to be + unreliable. See the dump option for reliable results. + + """ + + all_dots = '' + failures = [] + + for module, results in sorted(all_results.items()): + output, return_code, raw_return = map ( + results.get, ('output','return_code', 'raw_return') + ) + + if not output or (return_code and RAN_TESTS_DIV not in output): + # would this effect the original dict? TODO + output_lines = raw_return.splitlines() + if len(output_lines) > 20: + results['raw_return'] = '\n'.join(output_lines[:10] + + ['...'] + + output_lines[-10:] + ) + failures.append( COMPLETE_FAILURE_TEMPLATE % results ) + all_dots += 'E' + continue + + dots = DOTS.search(output).group(1) + all_dots += dots + + if 'E' in dots or 'F' in dots: + failures.append( output[len(dots)+1:].split(RAN_TESTS_DIV)[0] ) + + total_fails, total_errors = map(all_dots.count, 'FE') + total_tests = len(all_dots) + + combined = [all_dots] + if failures: + combined += [''.join(failures).lstrip('\n')[:-1]] + combined += ["%s %s tests in %.3fs\n" % (RAN_TESTS_DIV, total_tests, t)] + + if failures: + infos = ((["failures=%s" % total_fails] if total_fails else []) + + (["errors=%s" % total_errors] if total_errors else [])) + combined += ['FAILED (%s)\n' % ', '.join(infos)] + else: + combined += ['OK\n'] + + return total_tests, '\n'.join(combined) + +################################################################################ + +TEST_RESULTS_START = "<--!! TEST RESULTS START HERE !!-->" +TEST_RESULTS_END = "<--!! TEST RESULTS END HERE !!-->" +_test_re_str = '%s\n(.*)%s' % (TEST_RESULTS_START, TEST_RESULTS_END) +TEST_RESULTS_RE = re.compile(_test_re_str, re.DOTALL | re.M) + +def get_test_results(raw_return): + test_results = TEST_RESULTS_RE.search(raw_return) + if test_results: + try: + return eval(test_results.group(1)) + except: + print ("BUGGY TEST RESULTS EVAL:\n %s" % test_results.group(1)) + raise + + +################################################################################ + +def run_test(module, incomplete=False, usesubprocess=True, randomize=False, + exclude=('interactive',), buffer=True): + """Run a unit test module + """ + suite = unittest.TestSuite() + + print ('loading %s' % module) + + loader = PygameTestLoader(randomize_tests=randomize, + include_incomplete=incomplete, + exclude=exclude) + suite.addTest(loader.loadTestsFromName(module)) + + output = StringIO.StringIO() + runner = unittest.TextTestRunner(stream=output, buffer=buffer) + results = runner.run(suite) + + results = {module: { + 'output': output.getvalue(), + 'num_tests': results.testsRun, + 'num_errors': len(results.errors), + 'num_failures': len(results.failures), + }} + + if usesubprocess: + print (TEST_RESULTS_START) + print (pformat(results)) + print (TEST_RESULTS_END) + else: + return results + +################################################################################ + +if __name__ == '__main__': + options, args = opt_parser.parse_args() + if not args: + + if is_pygame_pkg: + run_from = 'pygame.tests.go' + else: + run_from = os.path.join(main_dir, 'run_tests.py') + sys.exit('No test module provided; consider using %s instead' % run_from) + run_test(args[0], + incomplete=options.incomplete, + usesubprocess=options.usesubprocess, + randomize=options.randomize, + exclude=options.exclude, + buffer=(not options.unbuffered), + ) + +################################################################################ + diff --git a/venv/Lib/site-packages/pygame/tests/threads_test.py b/venv/Lib/site-packages/pygame/tests/threads_test.py new file mode 100644 index 0000000..ce492bc --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/threads_test.py @@ -0,0 +1,176 @@ +import unittest +from pygame.threads import FuncResult, tmap, WorkerQueue, Empty, STOP +from pygame import threads +from pygame.compat import xrange_ + +import time + + +class WorkerQueueTypeTest(unittest.TestCase): + def test_usage_with_different_functions(self): + def f(x): + return x+1 + + def f2(x): + return x+2 + + wq = WorkerQueue() + fr = FuncResult(f) + fr2 = FuncResult(f2) + wq.do(fr, 1) + wq.do(fr2, 1) + wq.wait() + wq.stop() + + self.assertEqual(fr.result, 2) + self.assertEqual(fr2.result, 3) + + def todo_test_do(self): + + # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.do: + + # puts a function on a queue for running later. + # + + self.fail() + + def test_stop(self): + """Ensure stop() stops the worker queue""" + wq = WorkerQueue() + + self.assertGreater(len(wq.pool), 0) + + for t in wq.pool: + self.assertTrue(t.isAlive()) + + for i in xrange_(200): + wq.do(lambda x: x+1, i) + + wq.stop() + + for t in wq.pool: + self.assertFalse(t.isAlive()) + + self.assertIs(wq.queue.get(), STOP) + + def todo_test_threadloop(self): + + # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.threadloop: + + # Loops until all of the tasks are finished. + + self.fail() + + def test_wait(self): + + # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.wait: + + # waits until all tasks are complete. + + wq = WorkerQueue() + + for i in xrange_(2000): wq.do(lambda x: x+1, i) + wq.wait() + + self.assertRaises(Empty, wq.queue.get_nowait) + + wq.stop() + + +class ThreadsModuleTest(unittest.TestCase): + def todo_test_benchmark_workers(self): + "tags:long_running" + + # __doc__ (as of 2008-06-28) for pygame.threads.benchmark_workers: + + # does a little test to see if workers are at all faster. + # Returns the number of workers which works best. + # Takes a little bit of time to run, so you should only really call + # it once. + # You can pass in benchmark data, and functions if you want. + # a_bench_func - f(data) + # the_data - data to work on. + + self.fail() + + def test_init(self): + """Ensure init() sets up the worker queue""" + threads.init(8) + + self.assertIsInstance(threads._wq, WorkerQueue) + + threads.quit() + + def test_quit(self): + """Ensure quit() cleans up the worker queue""" + threads.init(8) + threads.quit() + + self.assertIsNone(threads._wq) + + def test_tmap(self): + # __doc__ (as of 2008-06-28) for pygame.threads.tmap: + + # like map, but uses a thread pool to execute. + # num_workers - the number of worker threads that will be used. If pool + # is passed in, then the num_workers arg is ignored. + # worker_queue - you can optionally pass in an existing WorkerQueue. + # wait - True means that the results are returned when everything is finished. + # False means that we return the [worker_queue, results] right away instead. + # results, is returned as a list of FuncResult instances. + # stop_on_error - + + func, data = lambda x:x+1, xrange_(100) + + tmapped = list(tmap(func, data)) + mapped = list(map(func, data)) + + self.assertEqual(tmapped, mapped) + + def todo_test_tmap__None_func_and_multiple_sequences(self): + """Using a None as func and multiple sequences""" + self.fail() + + res = tmap(None, [1,2,3,4]) + res2 = tmap(None, [1,2,3,4], [22, 33, 44, 55]) + res3 = tmap(None, [1,2,3,4], [22, 33, 44, 55, 66]) + res4 = tmap(None, [1,2,3,4,5], [22, 33, 44, 55]) + + self.assertEqual([1, 2, 3, 4], res) + self.assertEqual([(1, 22), (2, 33), (3, 44), (4, 55)], res2) + self.assertEqual([(1, 22), (2, 33), (3, 44), (4, 55), (None, 66)], res3) + self.assertEqual([(1, 22), (2, 33), (3, 44), (4, 55), (5,None)], res4) + + def test_tmap__wait(self): + r = range(1000) + wq, results = tmap(lambda x:x, r, num_workers = 5, wait=False) + wq.wait() + r2 = map(lambda x:x.result, results) + self.assertEqual(list(r), list(r2)) + + def test_FuncResult(self): + """Ensure FuncResult sets its result and exception attributes""" + # Results are stored in result attribute + fr = FuncResult(lambda x:x+1) + fr(2) + + self.assertEqual(fr.result, 3) + + # Exceptions are store in exception attribute + self.assertIsNone(fr.exception, "no exception should be raised") + + exception = ValueError('rast') + + def x(sdf): + raise exception + + fr = FuncResult(x) + fr(None) + + self.assertIs(fr.exception, exception) + + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/time_test.py b/venv/Lib/site-packages/pygame/tests/time_test.py new file mode 100644 index 0000000..7a84458 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/time_test.py @@ -0,0 +1,204 @@ +import unittest +import pygame + +Clock = pygame.time.Clock + + +class ClockTypeTest(unittest.TestCase): + def test_construction(self): + """Ensure a Clock object can be created""" + c = Clock() + + self.assertTrue(c, "Clock cannot be constructed") + + def todo_test_get_fps(self): + + # __doc__ (as of 2008-08-02) for pygame.time.Clock.get_fps: + + # Clock.get_fps(): return float + # compute the clock framerate + # + # Compute your game's framerate (in frames per second). It is computed + # by averaging the last few calls to Clock.tick(). + # + + self.fail() + + # delay_per_frame = 1 / 100.0 + # + # c = Clock() + # + # for f in range(100): + # c.tick() + # time.sleep(delay_per_frame) + # + # self.assertTrue(99.0 < c.get_fps() < 101.0) + + def todo_test_get_rawtime(self): + + # __doc__ (as of 2008-08-02) for pygame.time.Clock.get_rawtime: + + # Clock.get_rawtime(): return milliseconds + # actual time used in the previous tick + # + # Similar to Clock.get_time(), but this does not include any time used + # while Clock.tick() was delaying to limit the framerate. + # + + self.fail() + + def todo_test_get_time(self): + + # __doc__ (as of 2008-08-02) for pygame.time.Clock.get_time: + + # Clock.get_time(): return milliseconds + # time used in the previous tick + # + # Returns the parameter passed to the last call to Clock.tick(). It is + # the number of milliseconds passed between the previous two calls to + # Pygame.tick(). + # + + self.fail() + + # c = Clock() + # c.tick() #between here + # time.sleep(0.02) + # #get_time() + # c.tick() # here + # + # time.sleep(0.02) + # + # self.assertTrue(20 <= c.get_time() <= 30) + + + def todo_test_tick(self): + + # __doc__ (as of 2008-08-02) for pygame.time.Clock.tick: + + # Clock.tick(framerate=0): return milliseconds + # control timer events + # update the clock + # + # This method should be called once per frame. It will compute how + # many milliseconds have passed since the previous call. + # + # If you pass the optional framerate argument the function will delay + # to keep the game running slower than the given ticks per second. + # This can be used to help limit the runtime speed of a game. By + # calling Clock.tick(40) once per frame, the program will never run at + # more than 40 frames per second. + # + # Note that this function uses SDL_Delay function which is not + # accurate on every platform, but does not use much cpu. Use + # tick_busy_loop if you want an accurate timer, and don't mind chewing + # cpu. + # + + self.fail() + + # collection = [] + # c = Clock() + # + # c.tick() + # for i in range(100): + # time.sleep(0.005) + # collection.append(c.tick()) + # + # for outlier in [min(collection), max(collection)]: + # if outlier != 5: collection.remove(outlier) + # + # self.assertEqual(sum(collection) / len(collection), 5) + + def todo_test_tick_busy_loop(self): + + # __doc__ (as of 2008-08-02) for pygame.time.Clock.tick_busy_loop: + + # Clock.tick_busy_loop(framerate=0): return milliseconds + # control timer events + # update the clock + # + # This method should be called once per frame. It will compute how + # many milliseconds have passed since the previous call. + # + # If you pass the optional framerate argument the function will delay + # to keep the game running slower than the given ticks per second. + # This can be used to help limit the runtime speed of a game. By + # calling Clock.tick(40) once per frame, the program will never run at + # more than 40 frames per second. + # + # Note that this function uses pygame.time.delay, which uses lots of + # cpu in a busy loop to make sure that timing is more acurate. + # + # New in pygame 1.8.0. + + self.fail() + +class TimeModuleTest(unittest.TestCase): + def todo_test_delay(self): + + # __doc__ (as of 2008-08-02) for pygame.time.delay: + + # pygame.time.delay(milliseconds): return time + # pause the program for an amount of time + # + # Will pause for a given number of milliseconds. This function will + # use the processor (rather than sleeping) in order to make the delay + # more accurate than pygame.time.wait(). + # + # This returns the actual number of milliseconds used. + + self.fail() + + def todo_test_get_ticks(self): + + # __doc__ (as of 2008-08-02) for pygame.time.get_ticks: + + # pygame.time.get_ticks(): return milliseconds + # get the time in milliseconds + # + # Return the number of millisconds since pygame.init() was called. + # Before pygame is initialized this will always be 0. + # + + self.fail() + + def todo_test_set_timer(self): + + # __doc__ (as of 2008-08-02) for pygame.time.set_timer: + + # pygame.time.set_timer(eventid, milliseconds): return None + # repeatedly create an event on the event queue + # + # Set an event type to appear on the event queue every given number of + # milliseconds. The first event will not appear until the amount of + # time has passed. + # + # Every event type can have a separate timer attached to it. It is + # best to use the value between pygame.USEREVENT and pygame.NUMEVENTS. + # + # To disable the timer for an event, set the milliseconds argument to 0. + + self.fail() + + def todo_test_wait(self): + + # __doc__ (as of 2008-08-02) for pygame.time.wait: + + # pygame.time.wait(milliseconds): return time + # pause the program for an amount of time + # + # Will pause for a given number of milliseconds. This function sleeps + # the process to share the processor with other programs. A program + # that waits for even a few milliseconds will consume very little + # processor time. It is slightly less accurate than the + # pygame.time.delay() function. + # + # This returns the actual number of milliseconds used. + + self.fail() + +################################################################################ + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/touch_tags.py b/venv/Lib/site-packages/pygame/tests/touch_tags.py new file mode 100644 index 0000000..9f64857 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/touch_tags.py @@ -0,0 +1,2 @@ +__tags__ = ['SDL1_ignore'] + diff --git a/venv/Lib/site-packages/pygame/tests/touch_test.py b/venv/Lib/site-packages/pygame/tests/touch_test.py new file mode 100644 index 0000000..7cb4652 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/touch_test.py @@ -0,0 +1,44 @@ +import unittest +import pygame +from pygame._sdl2 import touch + + +has_touchdevice = touch.get_num_devices() > 0 + + +class TouchTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + pygame.display.init() + + @classmethod + def tearDownClass(cls): + pygame.display.quit() + + def test_num_devices(self): + touch.get_num_devices() + + @unittest.skipIf(not has_touchdevice, 'no touch devices found') + def test_get_device(self): + touch.get_device(0) + + def test_num_fingers__invalid(self): + self.assertRaises(pygame.error, touch.get_device, -1234) + self.assertRaises(TypeError, touch.get_device, 'test') + + @unittest.skipIf(not has_touchdevice, 'no touch devices found') + def test_num_fingers(self): + touch.get_num_fingers(touch.get_device(0)) + + def test_num_fingers__invalid(self): + self.assertRaises(TypeError, touch.get_num_fingers, 'test') + self.assertRaises(pygame.error, touch.get_num_fingers, -1234) + + @unittest.skipIf(not has_touchdevice, 'no touch devices found') + def todo_test_get_finger(self): + """ask for touch input and check the dict""" + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/transform_test.py b/venv/Lib/site-packages/pygame/tests/transform_test.py new file mode 100644 index 0000000..5fa116c --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/transform_test.py @@ -0,0 +1,1096 @@ +import unittest +import platform + +from pygame.tests import test_utils +import pygame +import pygame.transform +from pygame.locals import * + + +def show_image(s, images = []): + #pygame.display.init() + size = s.get_rect()[2:] + screen = pygame.display.set_mode(size) + screen.blit(s, (0,0)) + pygame.display.flip() + pygame.event.pump() + going = True + idx = 0 + while going: + events = pygame.event.get() + for e in events: + if e.type == QUIT: + going = False + if e.type == KEYDOWN: + if e.key in [K_s, K_a]: + if e.key == K_s: idx += 1 + if e.key == K_a: idx -= 1 + s = images[idx] + screen.blit(s, (0,0)) + pygame.display.flip() + pygame.event.pump() + elif e.key in [K_ESCAPE]: + going = False + pygame.display.quit() + pygame.display.init() + +def threshold(return_surf, surf, color, threshold = (0,0,0), diff_color = (0,0,0), change_return = True ): + """ given the color it makes return_surf only have areas with the given colour. + """ + + width, height =surf.get_width(), surf.get_height() + + if change_return: + return_surf.fill(diff_color) + + try: + r, g, b = color + except ValueError: + r, g, b, a = color + + + try: + tr, tg, tb = color + except ValueError: + tr, tg, tb, ta = color + + + + similar = 0 + for y in xrange(height): + for x in xrange(width): + c1 = surf.get_at((x,y)) + + if ( (abs(c1[0] - r) < tr) & + (abs(c1[1] - g) < tg) & + (abs(c1[2] - b) < tb) ): + # this pixel is within the threshold. + if change_return: + return_surf.set_at((x,y), c1) + similar += 1 + #else: + # print c1, c2 + + + return similar + + +class TransformModuleTest( unittest.TestCase ): + + def test_scale__alpha( self ): + """ see if set_alpha information is kept. + """ + + s = pygame.Surface((32,32)) + s.set_alpha(55) + self.assertEqual(s.get_alpha(),55) + + s = pygame.Surface((32,32)) + s.set_alpha(55) + s2 = pygame.transform.scale(s, (64,64)) + s3 = s.copy() + self.assertEqual(s.get_alpha(),s3.get_alpha()) + self.assertEqual(s.get_alpha(),s2.get_alpha()) + + def test_scale__destination( self ): + """ see if the destination surface can be passed in to use. + """ + + s = pygame.Surface((32,32)) + s2 = pygame.transform.scale(s, (64,64)) + s3 = s2.copy() + + s3 = pygame.transform.scale(s, (64,64), s3) + pygame.transform.scale(s, (64,64), s2) + + # the wrong size surface is past in. Should raise an error. + self.assertRaises(ValueError, pygame.transform.scale, s, (33,64), s3) + + s = pygame.Surface((32,32)) + s2 = pygame.transform.smoothscale(s, (64,64)) + s3 = s2.copy() + + s3 = pygame.transform.smoothscale(s, (64,64), s3) + pygame.transform.smoothscale(s, (64,64), s2) + + # the wrong size surface is past in. Should raise an error. + self.assertRaises(ValueError, pygame.transform.smoothscale, s, (33,64), s3) + + def test_scale__zero_surface_transform(self): + tmp_surface = pygame.transform.scale(pygame.Surface((128, 128)), (0, 0)) + self.assertEqual(tmp_surface.get_size(), (0, 0)) + tmp_surface = pygame.transform.scale(tmp_surface, (128, 128)) + self.assertEqual(tmp_surface.get_size(), (128, 128)) + + def test_threshold__honors_third_surface(self): + # __doc__ for threshold as of Tue 07/15/2008 + + # pygame.transform.threshold(DestSurface, Surface, color, threshold = + # (0,0,0,0), diff_color = (0,0,0,0), change_return = True, Surface = + # None): return num_threshold_pixels + + # When given the optional third + # surface, it would use the colors in that rather than the "color" + # specified in the function to check against. + + # New in pygame 1.8 + + ################################################################ + # Sizes + (w, h) = size = (32, 32) + + # the original_color is within the threshold of the threshold_color + threshold = (20, 20, 20, 20) + + original_color = (25,25,25,25) + threshold_color = (10, 10, 10, 10) + + # Surfaces + original_surface = pygame.Surface(size, pygame.SRCALPHA, 32) + dest_surface = pygame.Surface(size, pygame.SRCALPHA, 32) + + # Third surface is used in lieu of 3rd position arg color + third_surface = pygame.Surface(size, pygame.SRCALPHA, 32) + + # Color filling + original_surface.fill(original_color) + third_surface.fill(threshold_color) + + ################################################################ + # All pixels for color should be within threshold + # + pixels_within_threshold = pygame.transform.threshold ( + dest_surf=None, + surf=original_surface, + search_color=threshold_color, + threshold=threshold, + set_color=None, + set_behavior=0 + ) + + self.assertEqual(w*h, pixels_within_threshold) + + ################################################################ + # This should respect third_surface colors in place of 3rd arg + # color Should be the same as: surface.fill(threshold_color) + # all within threshold + + pixels_within_threshold = pygame.transform.threshold ( + dest_surf=None, + surf=original_surface, + search_color=None, + threshold=threshold, + set_color=None, + set_behavior=0, + search_surf=third_surface, + ) + self.assertEqual(w*h, pixels_within_threshold) + + def test_threshold_dest_surf_not_change(self): + """ the pixels within the threshold. + + All pixels not within threshold are changed to set_color. + So there should be none changed in this test. + """ + (w, h) = size = (32, 32) + threshold = (20, 20, 20, 20) + original_color = (25, 25, 25, 25) + original_dest_color = (65, 65, 65, 55) + threshold_color = (10, 10, 10, 10) + set_color = (255, 10, 10, 10) + + surf = pygame.Surface(size, pygame.SRCALPHA, 32) + dest_surf = pygame.Surface(size, pygame.SRCALPHA, 32) + search_surf = pygame.Surface(size, pygame.SRCALPHA, 32) + + surf.fill(original_color) + search_surf.fill(threshold_color) + dest_surf.fill(original_dest_color) + + # set_behavior=1, set dest_surface from set_color. + # all within threshold of third_surface, so no color is set. + + THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR = 1 + pixels_within_threshold = pygame.transform.threshold( + dest_surf=dest_surf, + surf=surf, + search_color=None, + threshold=threshold, + set_color=set_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR, + search_surf=search_surf, + ) + + # # Return, of pixels within threshold is correct + self.assertEqual(w*h, pixels_within_threshold) + + # # Size of dest surface is correct + dest_rect = dest_surf.get_rect() + dest_size = dest_rect.size + self.assertEqual(size, dest_size) + + # The color is not the change_color specified for every pixel As all + # pixels are within threshold + + for pt in test_utils.rect_area_pts(dest_rect): + self.assertNotEqual(dest_surf.get_at(pt), set_color) + self.assertEqual(dest_surf.get_at(pt), original_dest_color) + + def test_threshold_dest_surf_all_changed(self): + """ Lowering the threshold, expecting changed surface + """ + + (w, h) = size = (32, 32) + threshold = (20, 20, 20, 20) + original_color = (25, 25, 25, 25) + original_dest_color = (65, 65, 65, 55) + threshold_color = (10, 10, 10, 10) + set_color = (255, 10, 10, 10) + + surf = pygame.Surface(size, pygame.SRCALPHA, 32) + dest_surf = pygame.Surface(size, pygame.SRCALPHA, 32) + search_surf = pygame.Surface(size, pygame.SRCALPHA, 32) + + surf.fill(original_color) + search_surf.fill(threshold_color) + dest_surf.fill(original_dest_color) + + THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR = 1 + pixels_within_threshold = pygame.transform.threshold ( + dest_surf, + surf, + search_color=None, + set_color=set_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR, + search_surf=search_surf, + ) + + self.assertEqual(0, pixels_within_threshold) + + dest_rect = dest_surf.get_rect() + dest_size = dest_rect.size + self.assertEqual(size, dest_size) + + # The color is the set_color specified for every pixel As all + # pixels are not within threshold + for pt in test_utils.rect_area_pts(dest_rect): + self.assertEqual(dest_surf.get_at(pt), set_color) + + def test_threshold_count(self): + """ counts the colors, and not changes them. + """ + surf_size = (32, 32) + surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + search_surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + search_color = (55, 55, 55, 255) + original_color = (10, 10, 10, 255) + + surf.fill(original_color) + # set 2 pixels to the color we are searching for. + surf.set_at((0, 0), search_color) + surf.set_at((12, 5), search_color) + + # There is no destination surface, but we ask to change it. + # This should be an error. + self.assertRaises(TypeError, pygame.transform.threshold, + None, + surf, + search_color) + # from pygame.transform import THRESHOLD_BEHAVIOR_COUNT + THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF = 2 + self.assertRaises(TypeError, pygame.transform.threshold, + None, + surf, + search_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF) + + THRESHOLD_BEHAVIOR_COUNT = 0 + num_threshold_pixels = pygame.transform.threshold( + dest_surf=None, + surf=surf, + search_color=search_color, + set_behavior=THRESHOLD_BEHAVIOR_COUNT) + self.assertEqual(num_threshold_pixels, 2) + + def test_threshold_search_surf(self): + surf_size = (32, 32) + surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + search_surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + dest_surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + + original_color = (10, 10, 10, 255) + search_color = (55, 55, 55, 255) + + surf.fill(original_color) + dest_surf.fill(original_color) + # set 2 pixels to the color we are searching for. + surf.set_at((0, 0), search_color) + surf.set_at((12, 5), search_color) + + search_surf.fill(search_color) + + # We look in the other surface for matching colors. + # Change it in dest_surf + THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF = 2 + + # TypeError: if search_surf is used, search_color should be None + self.assertRaises(TypeError, pygame.transform.threshold, + dest_surf, + surf, + search_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF, + search_surf=search_surf) + + # surf, dest_surf, and search_surf should all be the same size. + # Check surface sizes are the same size. + different_sized_surf = pygame.Surface((22, 33), pygame.SRCALPHA, 32) + self.assertRaises(TypeError, pygame.transform.threshold, + different_sized_surf, + surf, + search_color=None, + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF, + search_surf=search_surf) + + self.assertRaises(TypeError, pygame.transform.threshold, + dest_surf, + surf, + search_color=None, + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF, + search_surf=different_sized_surf) + + # We look to see if colors in search_surf are in surf. + num_threshold_pixels = pygame.transform.threshold( + dest_surf=dest_surf, + surf=surf, + search_color=None, + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF, + search_surf=search_surf) + + num_pixels_within = 2 + self.assertEqual(num_threshold_pixels, num_pixels_within) + + dest_surf.fill(original_color) + num_threshold_pixels = pygame.transform.threshold( + dest_surf, + surf, + search_color=None, + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF, + search_surf=search_surf, + inverse_set=True) + + self.assertEqual(num_threshold_pixels, 2) + + def test_threshold_inverse_set(self): + """ changes the pixels within the threshold, and not outside. + """ + surf_size = (32, 32) + _dest_surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + _surf = pygame.Surface(surf_size, pygame.SRCALPHA, 32) + + dest_surf = _dest_surf # surface we are changing. + surf = _surf # surface we are looking at + search_color = (55, 55, 55, 255) # color we are searching for. + threshold = (0, 0, 0, 0) # within this distance from search_color. + set_color = (245, 245, 245, 255) # color we set. + inverse_set = 1 # pixels within threshold are changed to 'set_color' + + + original_color = (10, 10, 10, 255) + surf.fill(original_color) + # set 2 pixels to the color we are searching for. + surf.set_at((0, 0), search_color) + surf.set_at((12, 5), search_color) + + dest_surf.fill(original_color) + # set 2 pixels to the color we are searching for. + dest_surf.set_at((0, 0), search_color) + dest_surf.set_at((12, 5), search_color) + + + THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR = 1 + num_threshold_pixels = pygame.transform.threshold( + dest_surf, + surf, + search_color=search_color, + threshold=threshold, + set_color=set_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR, + inverse_set=1) + + self.assertEqual(num_threshold_pixels, 2) + # only two pixels changed to diff_color. + self.assertEqual(dest_surf.get_at((0, 0)), set_color) + self.assertEqual(dest_surf.get_at((12, 5)), set_color) + + + # other pixels should be the same as they were before. + # We just check one other pixel, not all of them. + self.assertEqual(dest_surf.get_at((2, 2)), original_color) + +#XXX + def test_threshold_non_src_alpha(self): + + result = pygame.Surface((10,10)) + s1 = pygame.Surface((10,10)) + s2 = pygame.Surface((10,10)) + s3 = pygame.Surface((10,10)) + s4 = pygame.Surface((10,10)) + + x = s1.fill((0, 0, 0)) + s1.set_at((0,0), (32, 20, 0 )) + + x = s2.fill((0,20,0)) + x = s3.fill((0,0,0)) + x = s4.fill((0,0,0)) + s2.set_at((0,0), (33, 21, 0 )) + s2.set_at((3,0), (63, 61, 0 )) + s3.set_at((0,0), (112, 31, 0 )) + s4.set_at((0,0), (11, 31, 0 )) + s4.set_at((1,1), (12, 31, 0 )) + + self.assertEqual(s1.get_at((0,0)), (32, 20, 0, 255)) + self.assertEqual(s2.get_at((0,0)), (33, 21, 0, 255)) + self.assertEqual((0, 0), (s1.get_flags(), s2.get_flags())) + + + + similar_color = (255, 255, 255, 255) + diff_color = (222, 0, 0, 255) + threshold_color = (20, 20, 20, 255) + + THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR = 1 + num_threshold_pixels = pygame.transform.threshold( + dest_surf=result, + surf=s1, + search_color=similar_color, + threshold=threshold_color, + set_color=diff_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR) + self.assertEqual(num_threshold_pixels, 0) + + num_threshold_pixels = pygame.transform.threshold( + dest_surf=result, + surf=s1, + search_color=(40, 40, 0), + threshold=threshold_color, + set_color=diff_color, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR) + self.assertEqual(num_threshold_pixels, 1) + + + self.assertEqual(result.get_at((0,0)), diff_color) + + + def test_threshold__uneven_colors(self): + (w,h) = size = (16, 16) + + original_surface = pygame.Surface(size, pygame.SRCALPHA, 32) + dest_surface = pygame.Surface(size, pygame.SRCALPHA, 32) + + original_surface.fill(0) + + threshold_color_template = [5, 5, 5, 5] + threshold_template = [6, 6, 6, 6] + + ################################################################ + + for pos in range(len('rgb')): + threshold_color = threshold_color_template[:] + threshold = threshold_template[:] + + threshold_color[pos] = 45 + threshold[pos] = 50 + + pixels_within_threshold = pygame.transform.threshold ( + None, + original_surface, + threshold_color, + threshold, + set_color=None, + set_behavior=0 + ) + + self.assertEqual(w*h, pixels_within_threshold) + + ################################################################ + + def test_threshold_set_behavior2(self): + """ raises an error when set_behavior=2 and set_color is not None. + """ + from pygame.transform import threshold + s1 = pygame.Surface((32,32), SRCALPHA, 32) + s2 = pygame.Surface((32,32), SRCALPHA, 32) + THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF = 2 + self.assertRaises(TypeError, threshold, + dest_surf=s2, + surf=s1, + search_color=(30, 30, 30), + threshold=(11, 11, 11), + set_color=(255, 0, 0), + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF) + + def test_threshold_set_behavior0(self): + """ raises an error when set_behavior=1 + and set_color is not None, + and dest_surf is not None. + """ + from pygame.transform import threshold + s1 = pygame.Surface((32,32), SRCALPHA, 32) + s2 = pygame.Surface((32,32), SRCALPHA, 32) + THRESHOLD_BEHAVIOR_COUNT = 0 + + self.assertRaises(TypeError, threshold, + dest_surf=None, + surf=s2, + search_color=(30, 30, 30), + threshold=(11, 11, 11), + set_color=(0, 0, 0), + set_behavior=THRESHOLD_BEHAVIOR_COUNT) + + self.assertRaises(TypeError, threshold, + dest_surf=s1, + surf=s2, + search_color=(30, 30, 30), + threshold=(11, 11, 11), + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_COUNT) + + threshold( + dest_surf=None, + surf=s2, + search_color=(30, 30, 30), + threshold=(11, 11, 11), + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_COUNT) + + + def test_threshold_from_surface(self): + """ Set similar pixels in 'dest_surf' to color in the 'surf'. + """ + from pygame.transform import threshold + + surf = pygame.Surface((32,32), SRCALPHA, 32) + dest_surf = pygame.Surface((32,32), SRCALPHA, 32) + surf_color = (40, 40, 40, 255) + dest_color = (255, 255, 255) + surf.fill(surf_color) + dest_surf.fill(dest_color) + THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF = 2 + + num_threshold_pixels = threshold( + dest_surf=dest_surf, + surf=surf, + search_color=(30, 30, 30), + threshold=(11, 11, 11), + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF, + inverse_set=1) + + self.assertEqual(num_threshold_pixels, dest_surf.get_height() * dest_surf.get_width()) + self.assertEqual(dest_surf.get_at((0, 0)), surf_color) + + + def test_threshold__surface(self): + """ + """ + from pygame.transform import threshold + + s1 = pygame.Surface((32,32), SRCALPHA, 32) + s2 = pygame.Surface((32,32), SRCALPHA, 32) + s3 = pygame.Surface((1,1), SRCALPHA, 32) + THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF = 2 + + # # only one pixel should not be changed. + # s1.fill((40,40,40)) + # s2.fill((255,255,255)) + # s1.set_at( (0,0), (170, 170, 170) ) + # # set the similar pixels in destination surface to the color + # # in the first surface. + # num_threshold_pixels = threshold( + # dest_surf=s2, + # surf=s1, + # search_color=(30,30,30), + # threshold=(11,11,11), + # set_color=None, + # set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_SURF) + + # #num_threshold_pixels = threshold(s2, s1, (30,30,30)) + # self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) + # self.assertEqual(s2.get_at((0,0)), (0,0,0, 255)) + # self.assertEqual(s2.get_at((0,1)), (40, 40, 40, 255)) + # self.assertEqual(s2.get_at((17,1)), (40, 40, 40, 255)) + + + # # abs(40 - 255) < 100 + # #(abs(c1[0] - r) < tr) + + # s1.fill((160,160,160)) + # s2.fill((255,255,255)) + # num_threshold_pixels = threshold(s2, s1, (255,255,255), (100,100,100), (0,0,0), True) + + # self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width())) + + + # only one pixel should not be changed. + s1.fill((40, 40, 40)) + s1.set_at((0, 0), (170, 170, 170)) + THRESHOLD_BEHAVIOR_COUNT = 0 + + num_threshold_pixels = threshold( + dest_surf=None, + surf=s1, + search_color=(30, 30, 30), + threshold=(11, 11, 11), + set_color=None, + set_behavior=THRESHOLD_BEHAVIOR_COUNT) + + #num_threshold_pixels = threshold(s2, s1, (30,30,30)) + self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) + + + # test end markers. 0, and 255 + + # the pixels are different by 1. + s1.fill((254,254,254)) + s2.fill((255,255,255)) + s3.fill((255,255,255)) + s1.set_at( (0,0), (170, 170, 170) ) + num_threshold_pixels = threshold(None, s1, (254,254,254), (1,1,1), + None, THRESHOLD_BEHAVIOR_COUNT) + self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) + + + # compare the two surfaces. Should be all but one matching. + num_threshold_pixels = threshold(None, s1, None, (1,1,1), + None, THRESHOLD_BEHAVIOR_COUNT, s2) + self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) + + + # within (0,0,0) threshold? Should match no pixels. + num_threshold_pixels = threshold(None, s1, (253,253,253), (0,0,0), + None, THRESHOLD_BEHAVIOR_COUNT) + self.assertEqual(num_threshold_pixels, 0) + + + # other surface within (0,0,0) threshold? Should match no pixels. + num_threshold_pixels = threshold(None, s1, None, (0,0,0), + None, THRESHOLD_BEHAVIOR_COUNT, s2) + self.assertEqual(num_threshold_pixels, 0) + + def test_threshold__subclassed_surface(self): + """Ensure threshold accepts subclassed surfaces.""" + expected_size = (13, 11) + expected_flags = 0 + expected_depth = 32 + expected_color = (90, 80, 70, 255) + expected_count = 0 + surface = test_utils.SurfaceSubclass(expected_size, expected_flags, + expected_depth) + dest_surface = test_utils.SurfaceSubclass(expected_size, + expected_flags, + expected_depth) + search_surface = test_utils.SurfaceSubclass(expected_size, + expected_flags, + expected_depth) + surface.fill((10, 10, 10)) + dest_surface.fill((255, 255, 255)) + search_surface.fill((20, 20, 20)) + + count = pygame.transform.threshold( + dest_surf=dest_surface, surf=surface, threshold=(1, 1, 1), + set_color=expected_color, search_color=None, + search_surf=search_surface) + + self.assertIsInstance(dest_surface, pygame.Surface) + self.assertIsInstance(dest_surface, test_utils.SurfaceSubclass) + self.assertEqual(count, expected_count) + self.assertEqual(dest_surface.get_at((0,0)), expected_color) + self.assertEqual(dest_surface.get_bitsize(), expected_depth) + self.assertEqual(dest_surface.get_size(), expected_size) + self.assertEqual(dest_surface.get_flags(), expected_flags) + + def test_laplacian(self): + """ + """ + + SIZE = 32 + s1 = pygame.Surface((SIZE, SIZE)) + s2 = pygame.Surface((SIZE, SIZE)) + s1.fill((10,10,70)) + pygame.draw.line(s1, (255,0,0), (3,10), (20,20)) + + # a line at the last row of the image. + pygame.draw.line(s1, (255,0,0), (0,31), (31,31)) + + + pygame.transform.laplacian(s1,s2) + + #show_image(s1) + #show_image(s2) + + self.assertEqual(s2.get_at((0,0)), (0, 0, 0, 255)) + self.assertEqual(s2.get_at((3,10)), (255,0,0,255)) + self.assertEqual(s2.get_at((0,31)), (255,0,0,255)) + self.assertEqual(s2.get_at((31,31)), (255,0,0,255)) + + + # here we create the return surface. + s2 = pygame.transform.laplacian(s1) + + self.assertEqual(s2.get_at((0,0)), (0, 0, 0, 255)) + self.assertEqual(s2.get_at((3,10)), (255,0,0,255)) + self.assertEqual(s2.get_at((0,31)), (255,0,0,255)) + self.assertEqual(s2.get_at((31,31)), (255,0,0,255)) + + def test_average_surfaces(self): + """ + """ + + SIZE = 32 + s1 = pygame.Surface((SIZE, SIZE)) + s2 = pygame.Surface((SIZE, SIZE)) + s3 = pygame.Surface((SIZE, SIZE)) + s1.fill((10,10,70)) + s2.fill((10,20,70)) + s3.fill((10,130,10)) + + surfaces = [s1, s2, s3] + surfaces = [s1, s2] + sr = pygame.transform.average_surfaces(surfaces) + + self.assertEqual(sr.get_at((0,0)), (10,15,70,255)) + + + self.assertRaises(TypeError, pygame.transform.average_surfaces, 1) + self.assertRaises(TypeError, pygame.transform.average_surfaces, []) + + self.assertRaises(TypeError, pygame.transform.average_surfaces, [1]) + self.assertRaises(TypeError, pygame.transform.average_surfaces, [s1, 1]) + self.assertRaises(TypeError, pygame.transform.average_surfaces, [1, s1]) + self.assertRaises(TypeError, pygame.transform.average_surfaces, [s1, s2, 1]) + + self.assertRaises(TypeError, pygame.transform.average_surfaces, (s for s in [s1, s2,s3] )) + + + + def test_average_surfaces__24(self): + + SIZE = 32 + depth = 24 + s1 = pygame.Surface((SIZE, SIZE), 0, depth) + s2 = pygame.Surface((SIZE, SIZE), 0, depth) + s3 = pygame.Surface((SIZE, SIZE), 0, depth) + s1.fill((10,10,70, 255)) + s2.fill((10,20,70, 255)) + s3.fill((10,130,10, 255)) + + surfaces = [s1, s2, s3] + sr = pygame.transform.average_surfaces(surfaces) + self.assertEqual( sr.get_masks(), s1.get_masks() ) + self.assertEqual( sr.get_flags(), s1.get_flags() ) + self.assertEqual( sr.get_losses(), s1.get_losses() ) + + if 0: + print ( sr, s1 ) + print ( sr.get_masks(), s1.get_masks() ) + print ( sr.get_flags(), s1.get_flags() ) + print ( sr.get_losses(), s1.get_losses() ) + print ( sr.get_shifts(), s1.get_shifts() ) + + self.assertEqual(sr.get_at((0,0)), (10,53,50,255)) + + def test_average_surfaces__subclassed_surfaces(self): + """Ensure average_surfaces accepts subclassed surfaces.""" + expected_size = (23, 17) + expected_flags = 0 + expected_depth = 32 + expected_color = (50, 50, 50, 255) + surfaces = [] + + for color in ((40, 60, 40), (60, 40, 60)): + s = test_utils.SurfaceSubclass(expected_size, expected_flags, + expected_depth) + s.fill(color) + surfaces.append(s) + + surface = pygame.transform.average_surfaces(surfaces) + + self.assertIsInstance(surface, pygame.Surface) + self.assertNotIsInstance(surface, test_utils.SurfaceSubclass) + self.assertEqual(surface.get_at((0,0)), expected_color) + self.assertEqual(surface.get_bitsize(), expected_depth) + self.assertEqual(surface.get_size(), expected_size) + self.assertEqual(surface.get_flags(), expected_flags) + + def test_average_surfaces__subclassed_destination_surface(self): + """Ensure average_surfaces accepts a destination subclassed surface.""" + expected_size = (13, 27) + expected_flags = 0 + expected_depth = 32 + expected_color = (15, 15, 15, 255) + surfaces = [] + + for color in ((10, 10, 20), (20, 20, 10), (30, 30, 30)): + s = test_utils.SurfaceSubclass(expected_size, expected_flags, + expected_depth) + s.fill(color) + surfaces.append(s) + expected_dest_surface = surfaces.pop() + + dest_surface = pygame.transform.average_surfaces(surfaces, + expected_dest_surface) + + self.assertIsInstance(dest_surface, pygame.Surface) + self.assertIsInstance(dest_surface, test_utils.SurfaceSubclass) + self.assertIs(dest_surface, expected_dest_surface) + self.assertEqual(dest_surface.get_at((0,0)), expected_color) + self.assertEqual(dest_surface.get_bitsize(), expected_depth) + self.assertEqual(dest_surface.get_size(), expected_size) + self.assertEqual(dest_surface.get_flags(), expected_flags) + + def test_average_color(self): + """ + """ + + a = [24, 32] + for i in a: + s = pygame.Surface((32,32), 0, i) + s.fill((0,100,200)) + s.fill((10,50,100), (0,0,16,32)) + + self.assertEqual(pygame.transform.average_color(s),(5,75,150,0)) + self.assertEqual(pygame.transform.average_color(s, (16,0,16,32)), (0,100,200,0)) + + def todo_test_rotate(self): + + # __doc__ (as of 2008-06-25) for pygame.transform.rotate: + + # pygame.transform.rotate(Surface, angle): return Surface + # rotate an image + + # color = (128, 128, 128, 255) + # s = pygame.Surface((3, 3)) + + # s.set_at((2, 0), color) + + # self.assertNotEqual(s.get_at((0, 0)), color) + # s = pygame.transform.rotate(s, 90) + # self.assertEqual(s.get_at((0, 0)), color) + + self.fail() + + def test_rotate__lossless_at_90_degrees(self): + w, h = 32, 32 + s = pygame.Surface((w, h), pygame.SRCALPHA) + + gradient = list(test_utils.gradient(w, h)) + + for pt, color in gradient: s.set_at(pt, color) + + for rotation in (90, -90): + s = pygame.transform.rotate(s,rotation) + + for pt, color in gradient: + self.assertTrue(s.get_at(pt) == color) + + def test_scale2x(self): + + # __doc__ (as of 2008-06-25) for pygame.transform.scale2x: + + # pygame.transform.scale2x(Surface, DestSurface = None): Surface + # specialized image doubler + + w, h = 32, 32 + s = pygame.Surface((w, h), pygame.SRCALPHA, 32) + + # s.set_at((0,0), (20, 20, 20, 255)) + + s2 = pygame.transform.scale2x(s) + self.assertEqual(s2.get_rect().size, (64, 64)) + + def test_get_smoothscale_backend(self): + filter_type = pygame.transform.get_smoothscale_backend() + self.assertTrue(filter_type in ['GENERIC', 'MMX', 'SSE']) + # It would be nice to test if a non-generic type corresponds to an x86 + # processor. But there is no simple test for this. platform.machine() + # returns process version specific information, like 'i686'. + + def test_set_smoothscale_backend(self): + # All machines should allow 'GENERIC'. + original_type = pygame.transform.get_smoothscale_backend() + pygame.transform.set_smoothscale_backend('GENERIC') + filter_type = pygame.transform.get_smoothscale_backend() + self.assertEqual(filter_type, 'GENERIC') + # All machines should allow returning to original value. + # Also check that keyword argument works. + pygame.transform.set_smoothscale_backend(type=original_type) + # Something invalid. + def change(): + pygame.transform.set_smoothscale_backend('mmx') + self.assertRaises(ValueError, change) + # Invalid argument keyword. + def change(): + pygame.transform.set_smoothscale_backend(t='GENERIC') + self.assertRaises(TypeError, change) + # Invalid argument type. + def change(): + pygame.transform.set_smoothscale_backend(1) + self.assertRaises(TypeError, change) + # Unsupported type, if possible. + if original_type != 'SSE': + def change(): + pygame.transform.set_smoothscale_backend('SSE') + self.assertRaises(ValueError, change) + # Should be back where we started. + filter_type = pygame.transform.get_smoothscale_backend() + self.assertEqual(filter_type, original_type) + + def todo_test_chop(self): + + # __doc__ (as of 2008-08-02) for pygame.transform.chop: + + # pygame.transform.chop(Surface, rect): return Surface + # gets a copy of an image with an interior area removed + # + # Extracts a portion of an image. All vertical and horizontal pixels + # surrounding the given rectangle area are removed. The corner areas + # (diagonal to the rect) are then brought together. (The original + # image is not altered by this operation.) + # + # NOTE: If you want a "crop" that returns the part of an image within + # a rect, you can blit with a rect to a new surface or copy a + # subsurface. + + self.fail() + + def todo_test_rotozoom(self): + + # __doc__ (as of 2008-08-02) for pygame.transform.rotozoom: + + # pygame.transform.rotozoom(Surface, angle, scale): return Surface + # filtered scale and rotation + # + # This is a combined scale and rotation transform. The resulting + # Surface will be a filtered 32-bit Surface. The scale argument is a + # floating point value that will be multiplied by the current + # resolution. The angle argument is a floating point value that + # represents the counterclockwise degrees to rotate. A negative + # rotation angle will rotate clockwise. + + self.fail() + + def todo_test_smoothscale(self): + # __doc__ (as of 2008-08-02) for pygame.transform.smoothscale: + + # pygame.transform.smoothscale(Surface, (width, height), DestSurface = + # None): return Surface + # + # scale a surface to an arbitrary size smoothly + # + # Uses one of two different algorithms for scaling each dimension of + # the input surface as required. For shrinkage, the output pixels are + # area averages of the colors they cover. For expansion, a bilinear + # filter is used. For the amd64 and i686 architectures, optimized MMX + # routines are included and will run much faster than other machine + # types. The size is a 2 number sequence for (width, height). This + # function only works for 24-bit or 32-bit surfaces. An exception + # will be thrown if the input surface bit depth is less than 24. + # + # New in pygame 1.8 + + self.fail() + + +class TransformDisplayModuleTest(unittest.TestCase): + + def setUp(self): + pygame.display.init() + + def tearDown(self): + pygame.display.quit() + + def test_flip(self): + """ honors the set_color key on the returned surface from flip. + """ + from pygame.tests.test_utils import example_path + + pygame.display.set_mode((320, 200)) + + fullname = example_path('data/chimp.bmp') + image_loaded = pygame.image.load(fullname) + + image = pygame.Surface(image_loaded.get_size(), 0, 32) + image.blit(image_loaded, (0, 0)) + + image_converted = image_loaded.convert() + + self.assertFalse(image.get_flags() & pygame.SRCALPHA) + self.assertFalse(image_converted.get_flags() & pygame.SRCALPHA) + + surf = pygame.Surface(image.get_size(), 0, 32) + surf2 = pygame.Surface(image.get_size(), 0, 32) + + surf.fill((255, 255, 255)) + surf2.fill((255, 255, 255)) + + colorkey = image.get_at((0,0)) + image.set_colorkey(colorkey, RLEACCEL) + timage = pygame.transform.flip(image, 1, 0) + + colorkey = image_converted.get_at((0,0)) + image_converted.set_colorkey(colorkey, RLEACCEL) + timage_converted = pygame.transform.flip(image_converted, 1, 0) + + # blit the flipped surface, and non flipped surface. + surf.blit(timage, (0, 0)) + surf2.blit(image, (0, 0)) + + # the results should be the same. + self.assertEqual(surf.get_at((0, 0)), surf2.get_at((0, 0))) + self.assertEqual(surf2.get_at((0, 0)), (255, 255, 255, 255)) + + # now we test the convert() ed image also works. + surf.fill((255, 255, 255)) + surf2.fill((255, 255, 255)) + surf.blit(timage_converted, (0, 0)) + surf2.blit(image_converted, (0, 0)) + self.assertEqual(surf.get_at((0, 0)), surf2.get_at((0, 0))) + + def test_flip_alpha(self): + """ returns a surface with the same properties as the input. + """ + from pygame.tests.test_utils import example_path + + pygame.display.set_mode((320, 200)) + + fullname = example_path('data/chimp.bmp') + image_loaded = pygame.image.load(fullname) + + image_alpha = pygame.Surface(image_loaded.get_size(), pygame.SRCALPHA, 32) + image_alpha.blit(image_loaded, (0, 0)) + + surf = pygame.Surface(image_loaded.get_size(), 0, 32) + surf2 = pygame.Surface(image_loaded.get_size(), 0, 32) + + colorkey = image_alpha.get_at((0,0)) + image_alpha.set_colorkey(colorkey, RLEACCEL) + timage_alpha = pygame.transform.flip(image_alpha, 1, 0) + + self.assertTrue(image_alpha.get_flags() & pygame.SRCALPHA) + self.assertTrue(timage_alpha.get_flags() & pygame.SRCALPHA) + + # now we test the alpha image works. + surf.fill((255, 255, 255)) + surf2.fill((255, 255, 255)) + surf.blit(timage_alpha, (0, 0)) + surf2.blit(image_alpha, (0, 0)) + self.assertEqual(surf.get_at((0, 0)), surf2.get_at((0, 0))) + self.assertEqual(surf2.get_at((0, 0)), (255, 0, 0, 255)) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/tests/version_test.py b/venv/Lib/site-packages/pygame/tests/version_test.py new file mode 100644 index 0000000..93051c7 --- /dev/null +++ b/venv/Lib/site-packages/pygame/tests/version_test.py @@ -0,0 +1,36 @@ +import os +import unittest + + +pg_header = os.path.join('src_c', '_pygame.h') + + +class VersionTest(unittest.TestCase): + @unittest.skipIf(not os.path.isfile(pg_header), + "Skipping because we cannot find _pygame.h") + def test_pg_version_consistency(self): + from pygame import version + pgh_major = -1 + pgh_minor = -1 + pgh_patch = -1 + import re + major_exp_search = re.compile('define\s+PG_MAJOR_VERSION\s+([0-9]+)').search + minor_exp_search = re.compile('define\s+PG_MINOR_VERSION\s+([0-9]+)').search + patch_exp_search = re.compile('define\s+PG_PATCH_VERSION\s+([0-9]+)').search + with open(pg_header) as f: + for line in f: + if pgh_major == -1: + m = major_exp_search(line) + if m: pgh_major = int(m.group(1)) + if pgh_minor == -1: + m = minor_exp_search(line) + if m: pgh_minor = int(m.group(1)) + if pgh_patch == -1: + m = patch_exp_search(line) + if m: pgh_patch = int(m.group(1)) + self.assertEqual(pgh_major, version.vernum[0]) + self.assertEqual(pgh_minor, version.vernum[1]) + self.assertEqual(pgh_patch, version.vernum[2]) + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pygame/threads/Py25Queue.py b/venv/Lib/site-packages/pygame/threads/Py25Queue.py new file mode 100644 index 0000000..603c1bd --- /dev/null +++ b/venv/Lib/site-packages/pygame/threads/Py25Queue.py @@ -0,0 +1,216 @@ +"""A multi-producer, multi-consumer queue.""" + +from time import time as _time + +from collections import deque + +__all__ = ['Empty', 'Full', 'Queue'] + +class Empty(Exception): + "Exception raised by Queue.get(block=0)/get_nowait()." + pass + +class Full(Exception): + "Exception raised by Queue.put(block=0)/put_nowait()." + pass + +class Queue: + """Create a queue object with a given maximum size. + + If maxsize is <= 0, the queue size is infinite. + """ + def __init__(self, maxsize=0): + try: + import threading + except ImportError: + import dummy_threading as threading + self._init(maxsize) + # mutex must be held whenever the queue is mutating. All methods + # that acquire mutex must release it before returning. mutex + # is shared between the three conditions, so acquiring and + # releasing the conditions also acquires and releases mutex. + self.mutex = threading.Lock() + # Notify not_empty whenever an item is added to the queue; a + # thread waiting to get is notified then. + self.not_empty = threading.Condition(self.mutex) + # Notify not_full whenever an item is removed from the queue; + # a thread waiting to put is notified then. + self.not_full = threading.Condition(self.mutex) + # Notify all_tasks_done whenever the number of unfinished tasks + # drops to zero; thread waiting to join() is notified to resume + self.all_tasks_done = threading.Condition(self.mutex) + self.unfinished_tasks = 0 + + def task_done(self): + """Indicate that a formerly enqueued task is complete. + + Used by Queue consumer threads. For each get() used to fetch a task, + a subsequent call to task_done() tells the queue that the processing + on the task is complete. + + If a join() is currently blocking, it will resume when all items + have been processed (meaning that a task_done() call was received + for every item that had been put() into the queue). + + Raises a ValueError if called more times than there were items + placed in the queue. + """ + self.all_tasks_done.acquire() + try: + unfinished = self.unfinished_tasks - 1 + if unfinished <= 0: + if unfinished < 0: + raise ValueError('task_done() called too many times') + self.all_tasks_done.notifyAll() + self.unfinished_tasks = unfinished + finally: + self.all_tasks_done.release() + + def join(self): + """Blocks until all items in the Queue have been gotten and processed. + + The count of unfinished tasks goes up whenever an item is added to the + queue. The count goes down whenever a consumer thread calls task_done() + to indicate the item was retrieved and all work on it is complete. + + When the count of unfinished tasks drops to zero, join() unblocks. + """ + self.all_tasks_done.acquire() + try: + while self.unfinished_tasks: + self.all_tasks_done.wait() + finally: + self.all_tasks_done.release() + + def qsize(self): + """Return the approximate size of the queue (not reliable!).""" + self.mutex.acquire() + n = self._qsize() + self.mutex.release() + return n + + def empty(self): + """Return True if the queue is empty, False otherwise (not reliable!).""" + self.mutex.acquire() + n = self._empty() + self.mutex.release() + return n + + def full(self): + """Return True if the queue is full, False otherwise (not reliable!).""" + self.mutex.acquire() + n = self._full() + self.mutex.release() + return n + + def put(self, item, block=True, timeout=None): + """Put an item into the queue. + + If optional args 'block' is true and 'timeout' is None (the default), + block if necessary until a free slot is available. If 'timeout' is + a positive number, it blocks at most 'timeout' seconds and raises + the Full exception if no free slot was available within that time. + Otherwise ('block' is false), put an item on the queue if a free slot + is immediately available, else raise the Full exception ('timeout' + is ignored in that case). + """ + self.not_full.acquire() + try: + if not block: + if self._full(): + raise Full + elif timeout is None: + while self._full(): + self.not_full.wait() + else: + if timeout < 0: + raise ValueError("'timeout' must be a positive number") + endtime = _time() + timeout + while self._full(): + remaining = endtime - _time() + if remaining <= 0.0: + raise Full + self.not_full.wait(remaining) + self._put(item) + self.unfinished_tasks += 1 + self.not_empty.notify() + finally: + self.not_full.release() + + def put_nowait(self, item): + """Put an item into the queue without blocking. + + Only enqueue the item if a free slot is immediately available. + Otherwise raise the Full exception. + """ + return self.put(item, False) + + def get(self, block=True, timeout=None): + """Remove and return an item from the queue. + + If optional args 'block' is true and 'timeout' is None (the default), + block if necessary until an item is available. If 'timeout' is + a positive number, it blocks at most 'timeout' seconds and raises + the Empty exception if no item was available within that time. + Otherwise ('block' is false), return an item if one is immediately + available, else raise the Empty exception ('timeout' is ignored + in that case). + """ + self.not_empty.acquire() + try: + if not block: + if self._empty(): + raise Empty + elif timeout is None: + while self._empty(): + self.not_empty.wait() + else: + if timeout < 0: + raise ValueError("'timeout' must be a positive number") + endtime = _time() + timeout + while self._empty(): + remaining = endtime - _time() + if remaining <= 0.0: + raise Empty + self.not_empty.wait(remaining) + item = self._get() + self.not_full.notify() + return item + finally: + self.not_empty.release() + + def get_nowait(self): + """Remove and return an item from the queue without blocking. + + Only get an item if one is immediately available. Otherwise + raise the Empty exception. + """ + return self.get(False) + + # Override these methods to implement other queue organizations + # (e.g. stack or priority queue). + # These will only be called with appropriate locks held + + # Initialize the queue representation + def _init(self, maxsize): + self.maxsize = maxsize + self.queue = deque() + + def _qsize(self): + return len(self.queue) + + # Check whether the queue is empty + def _empty(self): + return not self.queue + + # Check whether the queue is full + def _full(self): + return self.maxsize > 0 and len(self.queue) == self.maxsize + + # Put a new item in the queue + def _put(self, item): + self.queue.append(item) + + # Get an item from the queue + def _get(self): + return self.queue.popleft() diff --git a/venv/Lib/site-packages/pygame/threads/__init__.py b/venv/Lib/site-packages/pygame/threads/__init__.py new file mode 100644 index 0000000..cc4f9cf --- /dev/null +++ b/venv/Lib/site-packages/pygame/threads/__init__.py @@ -0,0 +1,310 @@ +""" +* Experimental * + +Like the map function, but can use a pool of threads. + +Really easy to use threads. eg. tmap(f, alist) + +If you know how to use the map function, you can use threads. +""" + +__author__ = "Rene Dudfield" +__version__ = "0.3.0" +__license__ = 'Python license' + +import traceback, sys + +from pygame.compat import geterror + +if sys.version_info[0] == 3: + from queue import Queue + from queue import Empty +elif (sys.version_info[0] == 2 and sys.version_info[1] < 5): + from Py25Queue import Queue + from Py25Queue import Empty +else: + # use up to date version + from Queue import Queue + from Queue import Empty + +import threading +Thread = threading.Thread + +STOP = object() +FINISH = object() + +# DONE_ONE = object() +# DONE_TWO = object() + +# a default worker queue. +_wq = None + +# if we are using threads or not. This is the number of workers. +_use_workers = 0 + +# Set this to the maximum for the amount of Cores/CPUs +# Note, that the tests early out. +# So it should only test the best number of workers +2 +MAX_WORKERS_TO_TEST = 64 + + + +def init(number_of_workers = 0): + """ Does a little test to see if threading is worth it. + Sets up a global worker queue if it's worth it. + + Calling init() is not required, but is generally better to do. + """ + global _wq, _use_workers + + if number_of_workers: + _use_workers = number_of_workers + else: + _use_workers = benchmark_workers() + + # if it is best to use zero workers, then use that. + _wq = WorkerQueue(_use_workers) + + + + +def quit(): + """ cleans up everything. + """ + global _wq, _use_workers + _wq.stop() + _wq = None + _use_workers = False + + +def benchmark_workers(a_bench_func = None, the_data = None): + """ does a little test to see if workers are at all faster. + Returns the number of workers which works best. + Takes a little bit of time to run, so you should only really call + it once. + You can pass in benchmark data, and functions if you want. + a_bench_func - f(data) + the_data - data to work on. + """ + global _use_workers + + #TODO: try and make this scale better with slower/faster cpus. + # first find some variables so that using 0 workers takes about 1.0 seconds. + # then go from there. + + + # note, this will only work with pygame 1.8rc3+ + # replace the doit() and the_data with something that releases the GIL + + + import pygame + import pygame.transform + import time + + if not a_bench_func: + def doit(x): + return pygame.transform.scale(x, (544, 576)) + else: + doit = a_bench_func + + if not the_data: + thedata = [] + for x in range(10): + thedata.append(pygame.Surface((155,155), 0, 32)) + else: + thedata = the_data + + best = time.time() + 100000000 + best_number = 0 + last_best = -1 + + for num_workers in range(0, MAX_WORKERS_TO_TEST): + + wq = WorkerQueue(num_workers) + t1 = time.time() + for xx in range(20): + print ("active count:%s" % threading.activeCount()) + results = tmap(doit, thedata, worker_queue = wq) + t2 = time.time() + + wq.stop() + + + total_time = t2 - t1 + print ("total time num_workers:%s: time:%s:" % (num_workers, total_time)) + + if total_time < best: + last_best = best_number + best_number =num_workers + best = total_time + + if num_workers - best_number > 1: + # We tried to add more, but it didn't like it. + # so we stop with testing at this number. + break + + + return best_number + + + + +class WorkerQueue(object): + + def __init__(self, num_workers = 20): + self.queue = Queue() + self.pool = [] + self._setup_workers(num_workers) + + def _setup_workers(self, num_workers): + """ Sets up the worker threads + NOTE: undefined behaviour if you call this again. + """ + self.pool = [] + + for _ in range(num_workers): + self.pool.append(Thread(target=self.threadloop)) + + for a_thread in self.pool: + a_thread.setDaemon(True) + a_thread.start() + + + def do(self, f, *args, **kwArgs): + """ puts a function on a queue for running later. + """ + self.queue.put((f, args, kwArgs)) + + + def stop(self): + """ Stops the WorkerQueue, waits for all of the threads to finish up. + """ + self.queue.put(STOP) + for thread in self.pool: + thread.join() + + + def threadloop(self): #, finish = False): + """ Loops until all of the tasks are finished. + """ + while True: + args = self.queue.get() + if args is STOP: + self.queue.put(STOP) + self.queue.task_done() + break + else: + try: + args[0](*args[1], **args[2]) + finally: + # clean up the queue, raise the exception. + self.queue.task_done() + #raise + + + def wait(self): + """ waits until all tasks are complete. + """ + self.queue.join() + +class FuncResult: + """ Used for wrapping up a function call so that the results are stored + inside the instances result attribute. + """ + def __init__(self, f, callback = None, errback = None): + """ f - is the function we that we call + callback(result) - this is called when the function(f) returns + errback(exception) - this is called when the function(f) raises + an exception. + """ + self.f = f + self.exception = None + self.callback = callback + self.errback = errback + + def __call__(self, *args, **kwargs): + + #we try to call the function here. If it fails we store the exception. + try: + self.result = self.f(*args, **kwargs) + if self.callback: + self.callback(self.result) + except Exception: + self.exception = geterror() + if self.errback: + self.errback(self.exception) + + +def tmap(f, seq_args, num_workers = 20, worker_queue = None, wait = True, stop_on_error = True): + """ like map, but uses a thread pool to execute. + num_workers - the number of worker threads that will be used. If pool + is passed in, then the num_workers arg is ignored. + worker_queue - you can optionally pass in an existing WorkerQueue. + wait - True means that the results are returned when everything is finished. + False means that we return the [worker_queue, results] right away instead. + results, is returned as a list of FuncResult instances. + stop_on_error - + """ + + if worker_queue: + wq = worker_queue + else: + # see if we have a global queue to work with. + if _wq: + wq = _wq + else: + if num_workers == 0: + return map(f, seq_args) + + wq = WorkerQueue(num_workers) + + # we short cut it here if the number of workers is 0. + # normal map should be faster in this case. + if len(wq.pool) == 0: + return map(f, seq_args) + + #print ("queue size:%s" % wq.queue.qsize()) + + + #TODO: divide the data (seq_args) into even chunks and + # then pass each thread a map(f, equal_part(seq_args)) + # That way there should be less locking, and overhead. + + + + results = [] + for sa in seq_args: + results.append(FuncResult(f)) + wq.do(results[-1], sa) + + + #wq.stop() + + if wait: + #print ("wait") + wq.wait() + #print ("after wait") + #print ("queue size:%s" % wq.queue.qsize()) + if wq.queue.qsize(): + raise Exception("buggy threadmap") + # if we created a worker queue, we need to stop it. + if not worker_queue and not _wq: + #print ("stoping") + wq.stop() + if wq.queue.qsize(): + um = wq.queue.get() + if not um is STOP: + raise Exception("buggy threadmap") + + + # see if there were any errors. If so raise the first one. This matches map behaviour. + # TODO: the traceback doesn't show up nicely. + # NOTE: TODO: we might want to return the results anyway? This should be an option. + if stop_on_error: + error_ones = list(filter(lambda x:x.exception, results)) + if error_ones: + raise error_ones[0].exception + + return map(lambda x:x.result, results) + else: + return [wq, results] diff --git a/venv/Lib/site-packages/pygame/threads/__pycache__/Py25Queue.cpython-37.pyc b/venv/Lib/site-packages/pygame/threads/__pycache__/Py25Queue.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..132e4add85f6e5faaa51ece99ac5e082e2dfd6f1 GIT binary patch literal 6875 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/threads/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/pygame/threads/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c045fc920ad7cc63568b7d003840936572d1e0fd GIT binary patch literal 6735 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/time.cp37-win32.pyd b/venv/Lib/site-packages/pygame/time.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..5e85d3a3b4054d539b3becff5573fe024a8f079e GIT binary patch literal 13824 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 Fe*@^tFw6h| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/transform.cp37-win32.pyd b/venv/Lib/site-packages/pygame/transform.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..944cb1a321c62e194add4f5bcb3edce27a3ae8f2 GIT binary patch literal 43520 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 a& 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 Da&8>6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/version.py b/venv/Lib/site-packages/pygame/version.py new file mode 100644 index 0000000..7b1862d --- /dev/null +++ b/venv/Lib/site-packages/pygame/version.py @@ -0,0 +1,45 @@ +## pygame - Python Game Library +## Copyright (C) 2000-2003 Pete Shinners +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Library General Public +## License as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Library General Public License for more details. +## +## You should have received a copy of the GNU Library General Public +## License along with this library; if not, write to the Free +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## +## Pete Shinners +## pete@shinners.org + +"""Simply the current installed pygame version. The version information is +stored in the regular pygame module as 'pygame.ver'. Keeping the version +information also available in a separate module allows you to test the +pygame version without importing the main pygame module. + +The python version information should always compare greater than any previous +releases. (hmm, until we get to versions > 10) +""" + +class PygameVersion(tuple): + __slots__ = () + fields = 'major', 'minor', 'patch' + def __new__(cls, major, minor, patch): + return tuple.__new__(cls, (major, minor, patch)) + def __repr__(self): + fields = ('{}={}'.format(fld, val) for fld, val in zip(self.fields, self)) + return '{}({})'.format(str(self.__class__.__name__), ', '.join(fields)) + def __str__(self): + return '{}.{}.{}'.format(*self) + major = property(lambda self: self[0]) + minor = property(lambda self: self[1]) + patch = property(lambda self: self[2]) +ver = "1.9.6" +vernum = PygameVersion(1, 9, 6) +rev = "" diff --git a/venv/Lib/site-packages/pygame/zlib1.dll b/venv/Lib/site-packages/pygame/zlib1.dll new file mode 100644 index 0000000000000000000000000000000000000000..877eed6347376fdb97713dc9c6ab4b19eb0260c4 GIT binary patch literal 99328 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�=mmt#ne3#N&Tyh#u}{8y+lJ}zAQcCou#|M-;g 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/setuptools-40.8.0-py3.7.egg b/venv/Lib/site-packages/setuptools-40.8.0-py3.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..97236dde5f99134adb8667093bdea56caf0bbca5 GIT binary patch literal 571910 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

      XiAduOF!v-GW$uA`@AV`rH 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
      aWI zfsh#V;nI8v;f3CNN51*qMI+yaUK_6IvF{eND+)%EQhIaYyXEqY@;oq~^l>IzK7zlc_ok8W{N9dyD-F8`sUZ|Z=5mXB54rV0ra~#3 zBie#Ud9~6k5<Wg{Ar~bxa5C>nOWs(JmXF2={RaIi}Cos#k9LnzuA}ONTsZ+n+QBFG>&d~Gy@MKF` z>hnE}&tG8USOqbiY^-qoviBtj4l)5TANp4e;_ASdaZ$EvpoDk5nkJOC52gH-X3x1_!vHS z?igvWn;t?Hx%Vwx%a5%SpBiEV{t+$`#~u;4zsBOfE&gZ$s#>u}r5`AiHFh)zzddu#3Ndy7dI z2iutN*aazD77<35+dAqDs1eS}1a4+z3*r_fIE<4;?_?nL3+sK)%!FL!v z<2-~r485oe!k}4@q3^|#JNbb~zLcx?%s>QG9`W_X@hFeX^BgELi{lt+d=50JQ=>pr z9q(?Pw3&BwtRFXcMmfa|zCYTy1T*Xaig=&If$&e1o7xn2xV?reu-fF^R=_bM&{@nd;kB|0%4WUHlE0^r*^Nc`Z-gLDEC-qbq{0Ihj8DSywzf#FL^b_yM#SE4D+4Qg?F!kc$3rVcuVdt zWJGu}7M;rk){bigRy6JImSRpyMcA)(SiK_U0P+&__)26GhQ)5Dblb16x1@A^sBVhp z?lvR?h0)C2DbhGSkgpFP_8MWccH#5g?1`~D8JOis8dL5I`{`Hx*g2S+tCjae^Ax7NX+U;t1l$Qs z-T<)LgyOb2iK~RT<|iPY=uhB^@`95lXnXL33aBK!#NuiRn{eBVt!!3C7Z4J9n)MA5 zb=!&F523w(N0ZeBBB_oy)Z5-%LEn#RT37pyiG@yX(hW{-G5oy*e_z309RBXQ(aEiY zH2(vQ%h4)*1Z1ZTt*?;l7YVC0VMO_z{(Ml3A2Xp5;ph|txbwFQwOh4l2RuWqIG;r4 zcQ|=Y5ws3xYKFQ==x`Qr9nLu!9nR|@Slr=UfcuCf3-fJ@U=By5>DU^3^IKvd1F6k* z0?S5&jTDEL^C8}$x_S;Wz~Rj)WVqAS&G>Nz;zOgU37gGJs=GsGrfjPQB^43M5A9$W z-8cp#WtG6StSV?pqNJ=U=8`y#GrsFM)O1P%W3&|WZ+<>%BJ4|fq?-$BTfR$NJwyOK zLGmh>hNYS|BXGdIy9GJ3M$2*POIRgD?j{|$PxQ%*$R{S_0)1NyGIFX32D6fHd;!do zP^H;T12^i(ivjds(<%k1x?FMf@b>2J%|ErBBNwrRB36J2&5KMlFH9{<`Icx?M*~%$D6QH<;5S#^PM#SYuIn=?u&?oX5W;6g&@K=xuPZ zhjD2fnS3te*!gTyG^@dRBT`KbF+=hhrY}7I_LUKPhglnIwm%bNuh0eddj1G|1rM{= zOJVlt-^pq+fMiVAqajql$lY;WtLkJ(P2#z5CqouV7ep|8X*tVr z#fKwjw44XfHG?4z!{^q$SIjWDf|zFt~{ zoknlWP3+CoY2A=L8?)E-{w}%T0i6rxC;#Rd=uT-unR4l-rmsR(pDUNfZOry(Er&km z-#kAaJ3qAonLfMLab#+Ec0>sab?x+p$!zJ!wBKnhYNYbeC*hw0piYKT`b;UxizSXEn0fklftyZ(}v$mn3eg*lsu4dF5?AWoyMnJBP8W;pZ^y5(b?78ZkH#MO3vVw2Z2r zI9XxFU4!Zi%FwXX5W1TS@hixZC#|81CoQV04>;Zx3wB9X@*WM`%5hMsAsF85+`5>! zV&n|eD!pV8B#J#s-+`pwJT1B0=Ccjps^}c7DpniR zIJ4*=P2nBmno8$wUw9)m-VG=gX#eYjxt2I*`VS<#0=aQT<*gt=0&B-}Cohs$ce zrmRFsD|DO?sd;vnS^5V{i+rOrOQOIzwo%leM9V)~;sL!xzqxS}&d8_H+?IvlfFvuW z0T@N2T<+)TWInM;;H7uiaIMkRgD!hsH(idwk#+V=w$9$e$#(!w(G19$YQ)uaFLYs% zbOVaICLnM`Ea-`)$qwQSFr4-ruD*<&@ zJ8-j)EG&${EI!ZY_R@zgLFsP#X$9NRaCFKd{I*z^p}et4D1<4~?n7#(?sL`vTn#=A0vj6sUxCM2LUcUM$roI@AlznEYql zQ?Q-7OI;RE^ySN>$~+KJq+9IE1bLjB-h-H7r%#7Yk50BX3$k?}l7i!LOCm`&rn}BV ztrTs#%4om_^wymih?l{>WtFri2VguSD8T@OAQ_44Jl%L%ABq3s*w&nZ&cJeUdj;6x z_2sxQUh?%4EAER-5Ak1D!IxUh^bKvk(wR$}XC@R5bEPs|u=x~d6Akt4N&$mJ{o*U4 zdB`-R4(~yXgOLQqW`eSXH%M7N?X-`c0Af(C1LEoswhcGtfbMplK{l{m!E}U_jc)Dq zX!pZNZ-qIO&=LjMt50^WY^Mo5e6VwsZDr$SQI!eFdgF|8$y?o7~oMe}ugQ z6cJj$5VlX3c+wgDo}j@I}yXf3BRkA1p4k9CHRO8I(6 z$di0@nC+X8kzBxW(M)w=G|fjp8XB{WmSl&&#c&WZ=-fo#Cp52+-ZW()Cr@zGSvr-1 zUNMeV{1tb2ZXfZMf>r}vaddTzP1`ojaeTwg{_f?rQ-fbQT;{1^r#yoW4JPsN;XkSj zqLyW~g?ryYi~cv&X7ZIP3ywkAXd9?xazYvI-uP%zaNVnPh{`8@s*L;5j?{G!x$zDV zNlOqhpgaY++rG<1f-UNcMTC=^Rt-9Dk7?^7@6O5L=B((HV$bVlQoh z7|G_PKbgUFAu-s*_Ju5HS-7=i6M9{^77w&;1`JT6t8ItuSqx4x=`f_7J_~JZXLk^(LG27+B%gU!BzF^KM0Y!tHRQ|eEUDoe-LmFTBMva@UM+F7!4TrVRRpiD_LeS9w|I=zn`n2TUc2* z6bW>I2J(>xRt-P`Of74~xsgs+53{#s<7OO3xKfyK!%{}+G<+Ft;r4{`uRPMjjqJen z&~HHzNk@!aTi64NyXxu(JUzcyPL34exg7WNzj(0lq%@=Ed0SZgH%zUg>aq)Jbsuv# zhp1(cC$?hH6^9@%Wz&@!TU<+pDp8KE=xV3WLDVkva|29t*9$fa*v|PJ7o}8toq1zE zb%CMmpIFO0K!834dW>1$R?@+oLt(&y+S{ecZQPyh(gc4>gT2`-K8ZW)t)|Kj)18&1 z+Damhqmr|DvQz@L3iQ@8GYE#bCg|Y)5m%kG5;F@{ck=2h7tFoX4l`g%o=#WFioD$_SVM(VGtEP zZ_txww#$OO8f3%j{Cgfaex7Z+gMP#MT{yDGuY(QQ}9b0cnV$l4z-Vg}z;hTX20 zXTf}s^=o|Q?8fJ`7x7v20zONB0nattbB?fA)@$rF?OFCpeVV=I>|n2(w!`ZePo;)u zp}EcNdWF6DUHjo30*mr6hJ)QOQFNwq@Qo(hPE6eO%FHsZGj%sS)6q^#{q;;tO_-c2 zGvIax*ys5XyKPr&Ci*DT-vIm9qALfQaE)&>=N2^Jlu`uXpi2ytAWUQWwH91g`%N!G z`=wb5<)ujq&63PjjG^}Pc&KInc=qH4e2(LpIqmh4zD9!qS7<_&c|JECdIuy}SloAn zMAR)j?kR6EM?SPaj(&FWaGrbh|?W7+#$@A((1ZEP(BzHgmL=Ix%gL5Q`B721Jb7a_M&v`pXZfv`sIi0N${fd= z4&mAz8uv5Kpm7gE*@;5=Xdg_5&t{-av6Fe_EnX*0Q?{<OTO7qemUPP@Mfz-u~gh4|# z09`w}5J>TuX!J)!?tu#S4~*y=AaFb|JScIb_rP?RcB}xXZ+KXq-kFM@*l$|SCMc-5 zE-tweq9t0Q3}2DQj|GtcBzjI6j-#tzA93=diP6KDHw_GEw$#}%D(v#V=}zEdz6UU^ z4yet7V_43H*?b?`FX7(j@l*$%BCzj&b^vuiioY`YSN#}k2CF1IzZ4IAHhsEHqgQZ~ zVx0k9-g?>hYTV}9*9i=~ne`mlx_BPMMS%brUtp9C&zT^vh062L8ao9Qp1KRyq8{hf z^=A7rDn1#5Dq5PqfFh6M5`_F^TXvvJ44~JsxVI9RrK|VY~)Jr-6wa#+1lsNir&@TNZwcH#kw}jMRKsgVtA-9&TQRkOAo%hHW$wm4e z?)UBkQfOIXoW?sHkqrY-_7>bQSb!TJ<%}9I0$9)p^8CAMQhCwZ73qN|7tH_XaB0rHH}LaFZ()Iny8p|BOD? zSybvzvR^sB>pZlNlncAM+1tFUrvSAU&~%kpYO`exSyFCUqnceOAlezFETt3)pgF5; zNp4M|&^H&A81L zoe#)<{x@Xh=p3{N^S2G@xja7Sj>P-Vg^JY%xC?orck%xog#e-07t;Aotpa5x*(u z$RZ>;A8@lzdzbtWn~VCI8w2~t23{E(2#*Fr4I^khuA`MsjEOYm@i^`zmGjAPJHrDC zzy_yckq|qI4x$m%!~iZ(AZkc;|JTr}UqLz>>e_>vbO)a6^OE_FL20f}Ev6BqN|^Dc zdZ~*!w{f*NI+}Sc!cR!ot))TdNwG)sakQO|m5xxGP^pTVECf%v!OfOw{N?(V{ZCw4)SkG#K zc~*mL1fv0seUAQcbfMt?Th;OZq3ZUN$*On!zg4Z}1R$Or5=hjmrez(_E-FW}%l z@u{X=gFcV}kLbfNfvD=NT)Csy$>G}17Av%%K<`X44O^t0R-eS)XRXv=E`>05iMnN7 z$CGGEm3KUOFS<;0RyLvt1;P5gFA_Atrj)Uo)Iyvl%(VIoeffj9%xdLYT%g&Blmp+| zhP7;^b7Z|I2L(|ow4fc(16-l_A`}uxd-Fa|uDj_=xLOf*3W?DlW7ZR_hnF_uwk=pC zzood=TZ@cwr&ov6imceBxQ$iIMmyKfdFh{!eQLFwr?ESi@|tRjrh92U(0i?I0BYI+ z@pvYm`BQI2g{zP8hJ}83obg6|yI*KLf;}&Ml32L!$^vv{0ObY?BbD>?kWmjU z&_iES7Anz0pXwo}9y+UsD)i7%JyfNK4(Oqkr8txr@oS8L?&`jfoRhaSg0z_88>0tn z`lRQhTj`iS_vxeb?-%qq=Gd@hE##f;qZcout21MC$+}HrLdC2s;$$d9i;XE{I)}bO z*JHWV^|7WQ2e9GW5M`qV-)8EMCP(m_1p4q>Y&8)DZawZo6(Kb?hCgC5xA7Hx?=sIp zPHo)H0v0{+0t;AKKq*BC$cqfM3mHh7sFWfgCuJ$6R`!7hHVbwlPqHF*A|G|8V#cTM zbAn-xP%N*`%DWOgCkAj9)fw20QbY{=5sCGg6S!fF+3AEK{6qkTDK)Y%E03`~cBanP z3}5=uWj5im%IL3q+2YS5jjc6E+N^-mAx5gZl47AMN!_PE9-;09S5tS!P?EZ*B6WW{ zbS-t`;!+y@$q?EJNsAcw5Ya8Un$qXqfRgKkP`QEWU>il^qWbA2aUZ`tDywxuq*)Nq zC;)-S_S@a`-zOxNxW~7-1b<4aE7n?fsl#;{&#c#W*39?yi< zgj_Lq2;;=D$TXKpO7cf1%E|l4wsJEHpdaI_ZDc%Zl{z*C$pqkI7fX1*4%D`G*PYRcU#23 z50UJb3QG5|nypr1VM_Ox%8?ZK1_-q-{wwAVKaZ|$PdLv@X1c09={TQ-t44xFKa2q6 zJl%;~B9&&eI()i!C>}Ul7^*U;*<@*MVeD?lkh+xLGR=pl-e`$__5{qkXti=AA8N&| zmd8l7867gFqC>_+5>dKmkdu+iy6g2bSDnV@^Chc4#p9`=Z6J1M9|FQcl9>awwp9zQ zLUbZXRA0y?uu`IP$KvqA*Cu^+83O z)bs^BL}ep1({H5jJJ}YPK@2R=Bf6Y=j{x^=ACIO(U@97%LuiDEfij$E)`0-~qZPCc z&+GX>!9Kd9IC*_RmVT!E?GM;`Cc81^pnVRW1LrzYORpg1Kc};{#Ag;gK3Q_1?kO@}P)u zwgDZDYQ2bPify3L4R9VGU3dF6sNSH%5LaAV@Tcw2Q2=!BwLpBLJ(hd}*EknS^3mdj z`bojt{QU_JmottJqyl9~lV(*}fXgSZ~~eYo2y1;~X9k=1Mi!NQi33q@44{m{<4|aR#_1mhbV=hF6rVsv zn0!$9mryyc#Q3I-K3cSho$W8@YaOxmRr{G6Q*3<-=`?maI-5iwwK!e>Vd5;=#L!|3 z#5!4QT_RSxH8PX}jeC~9^EJfmLL}G`(64cKR_Wlq^fi{iP;v>ixQ3fp1@`)RP*FR( z5koJ1M)!|nB`|21rc?d7%j?^f>o`1-kC!aqH2n~CKizRe-vhw9V#B&_bnT{7GXS>J z?;lAn^&{*)06<@)!85g0XeW60clSHFgZS`~n4@F8NYWA~^*VXSaMM>z#(MWtgrffo zl+UJx_Br#|D0lQTZ_rxk1Z{2;1%PA8Gx&)UR0fI1({-e*#2DFD%uY{zX*-oTKUI}0 zK7EKBs{4k&2yTZ|l^BnR`^u~yuek3ACfg}rs6xmM4s4i8n$4uj?6}mFPL>PCvyP#r zjJuTZT*tdjl=b>m#p&hwhZ`+}zBl=M)gY6XCzhO-uNyW1o{v=S+yu2vWJGZyns&9*7ac4Co>>d9?Tw`?Alvo0lDG?HMtf3D zdg-dKb@fnRi6P#VJEgobX3ml~Ja)U3P0oDhoLPyOjqf{-HhuA(u-SOXab&$x~c**fzbHR7I%w)?-Wwl*^1eQDvlkYPA1rTza-uzcm7bl?ktuFl$bfKKy zS-Bb+K3ZS8BN^U?;iaWNPKE;*URe6mWSCuraC2!W8GZu8(@UR9hM&Z6cIi(roCe`G z)TlPB_6yqST6N3nXc{)MMmtShv0Alq70gI08j|x6y3G|scke2}hZ7$abIZouYC*EF zv%PjVFNx%>`j*g}a&~#(9Q16JWPsQXEWE-sr%b@Rn#jK0`MmG{e<@+Q4 z3TI%}Q-(6PE|GFbyFaD2Fe1%@KLP$$7e?d?y8a?AzOv(}GP{Z8A)KBN#hv(wuF^KH zB&TT|GZ~Z)ftaEXl6HlPQi(!MQehPs+iho)%TCF8%5qkpWd8dgqPG(t(TNAK%{%cC z%{Yjy-ieRI)}@8liasjtv=DYc=dKhX@Y#SPEBg{d6LBlDhGqcH|*8t znflNi^jjL&;ov@cCMojG?Bw$c zFnNO1kKU5l`h_mEb(KzH@*_eb$o<=zyD<#Li=bPA*K7l?xC)t7qqS>A7@(WK)E5mz zwn$K$*xapaXL379x7@a3=H+&yvdLnU3y9NNnxFd9$x=?~OnhaR&cat(Dd&6+kKUFu z)gA94Xgt{9Ozh3EwMd*l>}FO)D_&3QA_l>9#Jg zx1h0?#Jyply^nNk4V9JA(*T-Q*=7oa<*%9fn_LJ@rM;hNnwJ#eX<4WcuW~`^e*wn1 zq*O92_R;`)E#n1ZEc<7EezA|vJd4~?TdS7l;_YjibW|_F6TQnzJ?Q0jro3fgX{~gt z-{7Ga&#(n+oFkWdJ#N~3^EVW_*WYH00#l^%A};*Ds}rF03gy>1|408J2gyv?CXLrd{2m~Q%_ zS+=n495e%O?{mdZ_6ED8@prSzQ&!#u4eFA=!nVK|O3N6I0-$hjNxHN+cup!64~E?U zJe$7Xtv52O%>>QU8>gj>wltbW_a#7#kN`=`%$2=f^mRBTrFEom*khQ%(woiLN~m9f zuu49s8AkTM%Clb9{G#3UJZ#jXs73a!E zRgRNoanz(eo=|f?%|Mr77y2)jLamF|-$SbV!PHuR7l}naO$qU$Bhqxcn-;vw^k2tC z>4rphcg*S$h|K zrzCS{DnjT^DEh*d65Awa_*0he!h~q5UIG|ZL7acl-Ad2O^aH#SmUOPM&ycd6&NcR2 z`I7$n8!37jit>0og`J+0F{j(-@u;qT?OoLsgI>ACP49V!X}x$O%}fuN|1r?Z`vD5q zHc&#wY3;iR0a`&_+^6OI8m*G{=t?D)BJt3GC$ya1Y+=)JQ4F95Qt@;t1N}FK@G(%> z;dDb?^rN>K;{&>8ua@&7DcD=<%47M(N>L%zJecl??&zBVNgAsPCR6(0TiQqo! zQawWcl3j+J@b60A2WeneNF^?iQX+}#qbMnhL(ba*JyOB1*acD(euavgloEY2RHk7q zg^~79+3?8Mm65M_;%j6F9an5@=RhU4I4;Uo$Iu3genU-)nhVs-EKC+QDuRa2Hrmz= zQ|ZGe(8FouZlVjv6aGz6FCGM}?xP>=WA57aQ8MY+n>raoGnhGJU?$`KakaU|v$~(nH4fx?R91` zSg)Tga2%BmsD|jPNvZHpVh|54Aiv=;6~~bHWCOghStozTn$>$>(iQz0*QCwtQV{DX zvn1{=`j5TLcS^X*Q)&(#BK^A#Qp{X_HE|EoF)v=Xni-bo!XR7V+l#09v;gmTocvOJhhwAk~ zU5J?#uOwY|zq_WU@#RNH&SfNT7KP$gt8*9!R20ky^9!Ko*(Q^9W@UI7?9T@Z7ATj8 zLFoN$!_A=u8$v68Zy}j#m05Y5=j3C|i-D92H04%~W4EkgzzTur%d4MaY^EH}Z9s=y z?c@sPz5f~cibVVd+Atpl5TtfNx~6@? zHeG#qi%g@>@8oLe&uTc1+4;-J+5+MJ8qgE1^p(VgGlvAcsB#DD($n5VUAhO?_#H*e z&vllcr>oyi>^*qtLz!2*xhB_CZg>+n5_#HidUSsd3Q>l;#UJA8fyYNmS2GVY6!qwm zJQMe}rql07lPgyT_9Ff5MBxv!qMRKZka&;<=+)bkyUy zo*5Z0W5@8v*!nq?o{j6QQxT2cV@M$~-g;>EP$O;|_3p#NVY=I}82qV0Kb6?Sx}go1 zPI)@%w7zTRp|>-)c~>|3_x>xY0D6z#jhb<8T2eDkMIY)SFa0!K?|GQ@t|#U3DlmXk zNC#f~)kE(DIq#vL;C`N~8*-ad7;)l_M^!MhnQQ}Q?D%4s(z-#TUpuu#wF(Tum*S-$9a=p5)YXmr&{Mi$LIV3!16NA+9x zcAn>@FaC{y5xIZ>~sm~ zjGjs?+o1;QIJ#l3zuR_dIXazN*5^?bz!F!tVbOG4S90br6Ms`}0Ri?EUYVH5ZVSVc zi{uPmz(+$@baM&}DXZgy^_IemK-|W^c<7N|>rT&|qkarvz5}`JTnmrybXko@qT|Ri zq0nvKb{T&GpebDmTS3>2j@YCyJD?|ZnFZ%+9~mxu3@9QV`BEguAMN7t`iAX>3M3(z zGqUeitK(o^h{4m4;0fj3N+zhw`iVELE{l<6{V=@^95TpKRV({IW65zYU z$jdVksavB{LicvF_*ZmnF^S>(1D=&4kh^)jqL7tH?iSRg0(5fJhz4eJKbTmK_Y<2% z)qNrJNm2{Y0`5Nn^ip^V@N_H{e>^P2OPLdO8Y~rcY+y ztamH+SET1gZ(u+c=+-e%wLFCXz`~z}0u1kT(8}VfNv)V42enEQ#Nb7oFE=yoTVG%z zS)1|TZqaMFO^e5YA|HyzD)S#vcktAJg~HNVmPFaZ&N2(TFkUT16xsUY&Q0(I<{M`6f$`QSFHpjk z?}V*xtqAk^#!3@MC%aT@lah+LEPAe8jQIwvMh4$_xC}4CyGpiJ;;D>IKi|mZv&C@> zUQc+2rQrFk@!AH9Z)|I$KUbCtnz~Tk!fUBm1*x=v%1kjEM!%xPM>)qcdtW zhRcKD=1Zjg(JA+Rj&xV*8Pyis^O(rXSawv;JVF->W`fajk=JL2$CE%5#lq^C39he0>r z*+St11F2Zg-SSbetwBdlMbDGaeP*?aSIdOZJ@6r@WxTTbUn`iq%4`3M^wL&Y-gaa- z5(wi7fu-fLF?|!yNDNr=v%ym{-2!PJdrrWtOEWY*EI!=fc(1SqB-*6NXCisy8j03V z?u)}Tb+_ZI&}Ms_%uuT>U;v9hS_Y{D?I7mxP`B|csNhdI*jd?li7ZYg}rP#wnw8SzIiAtN@&@yL$G-xpePYh2NoxN9JF{h_=ewax+p67$zt)LKEk zmq&?muK-U+tswi_mZX6cnSfFxjaRh%^?5DL6HtmAA1g&d6+0@(@n}9vvxM%uMtB4m z(h!~Ga|>JBiiaw0i>rdV#1IGhwhULE)Vtzp#ci?P64ZCXy~XHn9KyYMkmWZ($x99D zz46dWTO39zGR!Z9*#jb!Vb-Mj0aqLbfC)!Aj>*Xc=p4s=BNNInPAG4I$dgRT{>~nq zP?oX@#q@VO8zvO!?~P2@ZWN$Yl((|QD92SDpOFfy`$Oih$Ya=*==KbG?}ew3nAxCP zO-bQw;t`>|gm8ZAb=E~+V$a!Gx4wnl%4G7=?lFmvjdbhMG2QC2s7AFSH_na_juN
      @zFW_;4Gb+=VaXl*?)d+egJ6d?JMKzFei&CsfAFIl!luoB zOCFyn7z*|0H-OyiS{&>Gxd|W-T;fSaA?Q6{CCCBTeG5{AV^9n*JMbRfagQLc1YTm) z*nAy1j*JoyZ7v3yQ|m6wUfEiq!r!nc+eq~VnD}RAM&|+d=wRE~l&C|`oIET-4mlGy zOsX%;yq8ZX3NffhApgXxkMU3;`6m<%Vj#rSh9qU)Bd7pSg8*uckie^6r_9XZ2v8*w zXY=fq=1fk`WTXdN^JThY43WmuH@8-x(f}Y?qXe4%IO<%X*IE+<%9NthU!>mwf-Kl2 zWvUtKl5xoNAPeO_<4NReh`J5fx}Ri+9y6#5gI)3z$26R0p}RrXV)}rbrp&=8{T}$x zUHmAKGaqZ1dzGUa*eQ9m=AfprGn$FJHqIVkdUIxb^sa$Qvm)K$rAH3oHpLlwcrLnx z-1izDRE}PsxC5s-6-okPuFQjJHv`o52-*%?^3*M6HhHkaf+x_RvmHd2{2tsx#(TnH zpq~lDgglMDbs)KSrymye>L}oLf*G$_l+0Kdn7p?`3GH5*`GRiGdD*V_SlgH#IC+O% z)mi((h*`Y9X9_f|_{OnEm59siwGF7j1s~(>9>wfAAD(vE!nmi`1lD1Pd_Ao=zzo+L z4~#4<-7JvKNGvs!xX8t%|Gt5-vu$}n%DEFm>Ylk!eCzYq!?R^5 z1$QV6@_d+t22bLq!gcfapYMF8 zTXliwffALAWov}CUS>nE|qjeF%9LnJ!YZ}8|qVA_v?3Gwfp_E`KuCkQ{Wt`) zAeOJOa@jg>i9zB^QskN9KAWv;jWP^f9VstY7&0m99&DdJ%n88zH5Nzb%mFiaje~WP z7;MCPSfMEiJf$1_S9LzZCP(8&y+BX@Yy!LtmSfsY|-)S;If?h(6(9c!17}7Brd~X zld4n3HmQO&spRi9sggXyQuVPE_l++rTcbd;CMv91DgLY#Yt&q)Q(@JoBwlM&i_^J{ z(abQmZ_hv8zHb@6*}ex2NzxwEzD3wR{LMwypv?&K&4wVKR$bDxdTdLH-WF(tVGn*7 z-(pS4*4tq0Ffe}6pU?thhu(tSAoiMGN7uo|W%!eGp}r{aYbb=}7Dm`zlx`AndmHiS zU4n7XI6e>qKT9wfYc6Ro>~MzyMVR^TF|cGd?mPgDspPX=dNW~& z6fz=eSi$ays;6h3XD8?^jeR&>2llcpWZZR|N*C&R>Fg17lEy1copHL@uONl;*cKe=)9*ebnc~4ExAMw|2I+M-wHN4Dn-Jqb#eCi%O&r~O zxjCla)#d7mPNdI{R6$?ZgO#FgaqS{G59qL8KvD|WogYMUe_Z{rfXW#aPhlgpxhT$FTNl&8?8*TB51!$ec- zx+aA`&c^mTFVKtslGyJQ(lrd8;!^+CoKBf$- zUA96QE;Bh^SZ&4g>U`^rDBrr$q!ri2@Gw9>Zl3zx%h_+0?ny|0W914C`)#l-D|g_CcBCi2ugrssYQLgx(=|oI87L zEm!^GjSHPs$17CWR{ZBba~vLb%mp$Z{lOONm?PX?+ynp0J}rP2P_f5@zWI%-KXd9o zZ0ON)`Vyzh)KUbA=8W+S=}g5aJZA?Zw`CUI-r=&`U7RZkPRCJsK3K z!Ku2eI|IytBt;DT8VR#q47`XWf*vKfGsS+EDPI<)qSi#^y zPU8Q>ybU!uUw1zd15ZK3mU4YRV-U)3x+7GvNGQdhDBd`M{s>r`9Coxzd7a#`W1u;V zb5nB<9w%y-(mOfqBPA@Tu6~ps{r0+kF|ZI1OK5VxzIBbic9E~2wD}0-Mo}MgXwd7-M{*2jc|7=QR=md( zHR*^Tpa&br=6%%_^Xf;mAus)n?p9RWTg!%~U#;synaD=Rs=9=$h6<%pem>jpyMX7K z(FUA}W9-To1Lv6NM=t~DOdL15FrRJrL7zhl-X=wqbtv?e=Em)Y;^mt zu93G5MCU-~gj~>yT(=K9N4`KqGw_V6D)#}_gC9&Cm<`!!2oDTKrzE>_)XPE3q0IgP zT9VSSFQ5G_E+e`605h}Qm5WZWK^D~!dZZiuz)^#sKYM26lF89aWq$k&`Y6qXPfadh z*j!Z`or_m;9nSxIUJ^Amql~_@6&=d3dp~mT!Me`XWSY8<^oZqF`~#F<==c9Tnpo0^CyXG)4cS_->}orp+_!^4F9t~{X4_|lb_=77qH>~#@J6}{t$V8Z|uE^ z^Pk&ruHL}YiNC>%UId!W-eziIZwnp%Z+u(n0DI@sFYtXk{gegs>0j8pfWF7xbLnyR zo<}>`dp>=gy%*4Z?43t{!`{X8-`Tr_{_?*OL#MXENuOp>6?8j$SJ41_FQJ>++f60* zet@oJ@8xtgd#|J`*?SdzfW24KCG6cuE7*H2En)9*ozDH zG#g|0;sPu+vQNCF;{R#yTL7ZEu0_v$fDs30jHsxnV?<+uF(jw~Mw&qw#Kh4-1mr5} z2!k;4%W#gLRCI74WjL8e&8H?!lbBy^lcwoy;wNbm5DWh5Cz^yrn_$9C4jr0cC4dRx zytVc|Gt8h^?`!VuefM>6xzE|(wLfR?wf0_nEur@}_=s}m!e7ZFPRhb(hF zk$hy-CsH4jFZq1^3h~kDg9;^|KNFt~QTjQ>5;n(Q@xunF4I&VW0_R2qJ&-bxkj4XD(mUwSL`zL#=7#%F5vXUXFkLiQrf z8wy13e5ltXsF!D)?^U(LkLH!vMnIK$La%Co{Ir>o7psuPkaa8=JCBC8+S~oKhx^0mo@er zA`)j2b#mw{$mUDvAV_qf=MWN->zM2;=a(Ai7aD#4s@0ro)#}{#nd5yXO-DDh z%blMooL5x#+b+K-Mm^TH)4=TDo8QDxXS>p_cD5=MN5rU_-W>);jBY~sa%Ypm*-Uaj;maMyr7tdtC37~(oy~HL_0j+iG!6`0 z#IRY0p|$>boCoI!Ks~?#fY$)_0z3<_dna0f|7n{m<>5AP1#ks$JHYJ#w-ek>aJ#_m z0=F03UU2)s?Q<)UzhM-eie9NOUc^fG0jPEvn8;lyhYam_v~dSw=>JS>FZtki>E9yI z9NxHY_Rc;$+Lk&YYM>LszQ6opAC&8O1k3ID2wFPk5mH}opIo7R5{-RQy^Hh-M&9u# zJRbmP1*l6^Og&S(K;is~wBFaG_5R&2Ys5{8GtgIGK}^yMwSF;o_{D=r1AX?D!ud6# ztl5sY2m(bW8uL4l$!yeamSB<-lFzHLCo zM%QJcVguRia2Z}FTyy~Hq>O4q|K~9q@dKcAsOM?o`KaW1GxdC(cWbJ z4IE__zSvI#fj#IW;o=;urf^d7*ZT1f5W(-pIVA${`o_sElbl!NTh-1h3NCyPn#J_Y zAdV}Hyi5>YeJ1cgbnY|WvsWrEY{swR{b$JSy0*IX#-7bT*G*UO(B%ji6Wh!;hW1O;`6(oAeMxMteY7o*Lx{_u)P0WfgH-MXB-H!j|7F8E!1Sw~+FCm9UVJ9#9vxXFsAX zU6z+FF2vU7^W?p1vl4OOw0ydnU#gBzS8+k4YK zZeE^~o3rAOk`Yh)<}2JQQ{is*v}$q`i#LPtu9n;tqwnEn3MEek%6NS9bMhHDDtj5f z9oY63+(oYphXt@QT)yQf{2#TgkvDZ@)J;M=KU-zagVZqhSls>9>}#~C%mP}%gE-VU z_fB&0WnZIazjD5_6(`@Iy2%SX&5rMG=YpN42)QT7@m(~h08ic+4in`=_euMw)$_?i zl;+`h8L<;`o8!9}c38799Bs0BX4i$x+r);=TTZ-C{k&%iJfL|nPpGq3%Z-BQ+z1j& zId3_qT!2OV4$;B+P>g-AhYQ#2JFeNUUfkWFWL27Xjyv09JQI2v6i^;}XWel}yTx&3 z9QbckINNp3hNF5@c*QtCS`}~Xv){rg^~W|$fmbClMm&`_Ml9K@;&enmvI3YGTr4~* z_}o6tZ*#*HAGvb-uJvR0@R8e?8upXB;?SQ}^yKyhbRci+^F(;##0=`&f!qH; z2KgrC_#iZt&V>|ing9b%W)@!lUb@_LBJlSE@GD!whUQlueR>FfW$!NtZT!O1lwX;F z?g8*?15iDEgZv8S{`dJ6g2Ryfij)Tr&L)6zfI@&Z0LuZ)0BKMEQ2YuO#*0|#R{#zG zoOt@bgI|ex*2k~3J~Jf0GW!|QCm4B03OpAA?0Dwy@GBVm#`qPI?|+J4k@9W>96A8H z0Qvxw;H?G-2e{?gABtb0ZDfG|(*TwO6hHd|@hiT~vFt42ZKY%Z#k_}b1pPprbvtm^ zPsR;*_RG1*ZbOQU9RsArE|gD_@x6jeNe!;Cky%2ek{&UuE|MeWP|9)8ql7HsBb3g$ zis8s<0x}&H3aGOM%j0*JK=81cCO0s2p`<~W$g3B&Nk zV}T4q>0>u66cD8hYQbHssL={A1TUB=3Jr;ulD>3^X*Ks^05lC+$_S<8f>G z_q#>0szBXC)I#LAg3%Ors&dt!d(nhw1Hv_a&TF`zxWt*rPD*0>xgg;)SgQ8m3pqf7 zbq5xw@+`Nh6UEF-s&wd&aM~a1oQarN&V4*^OmWIZGR(@d1))3`N`kBzMWQ5= z$hCx#+^>l2b6M`p&ZTCIm@bZ1lU!MM0V=_uvK;CyxEJ3Xgjtds@t+U6IIO?Sj*idO zvf8*ws689++6KiQEpVw~>ybhytZS!m?#JHiz}#dSDWpKNZv;g1SFeql@Q&dPZ_U17 zv+((0={UF&m2%g4tyckf34&$FF7M<&%y3}{1NZXV}E3D3?>j&MWiHL?o^PqO%_<1rUoN< z-t-A3cp1}k{gPnMLHSbWN3TEMKmzRo%3KE&yf_1p)zuAl2c$%&flNk-D>4{XbI%yziCsQ^dCxAdV2{th6y0FeAJ59(vO*t5aLC{r@Qc6X zo<{{#LnOn4P2C3gpyr@#c#K!a*~IAMtac%*S~vt2PIWM}uV=I{Y5Q2ZKj5DaN7CFPUHs910GPyfuD(f_I9qWsyju7X(h`-5rwZ|HJF`} z$h3%NpN0!{KcjbX$<-kg)dRoy-IRBARkk=qgT{?lLipKlW43sHhIbxtpGZl3f{0?d zPK^_V!;f`IRSLr%yajV}Bu-(aztU5$0b*N(OAp4!pdIKc#{JG)FAXjA@ z9Sf(N7biDd^mbTNib^TV7Mi}N&8ocC;?eLh-m@Mq^gJdG7%)%|ECtj$Y@t$%!VxOe z)hUkdqmo_3$X6%^3v18>8a*bxe}msK>1=#;qGG2hek`3K& zI^n8pbyc3z8`YZX)nv~J?FhI{LOQC*o=7J(c9pYIka5dVsVGioxZQIf@iOwvTKlqN|F7u17x@H zxhM3WvJzEcDnr9j8_{sowsJQ)CH9(+ zdY*?e{VYgDx+=Q>4Wfxg%{M;5A3-yp$D)rxP0$H6EybT1{vmfS4~z0i=f!O6fM!f|90|R2VdC<5iY-grlvCVr?@#i zA2}PeE>oMgCE6g&q*8zfq|R)EZy?&(W?q_3EPc@uJmY=M#-9O3;PQ(+;Hw~+qNY8p zVi(yZB1?HFy&0jo6ewb-rD~6IwVLYpi5wH5Z@TQFh(bZLgoS*d5agLUuW}L}Wq~^h z+uEPNc>&KX+2e$_kLR=-W(c8!lJB}YIp5@2BhgY5f!xR@VyOypGXbNecXn_JvTNIYiTdc7bTpvMQkBl=@EgPtl!_`$7NRRYIW>_C7wIQ*o1p z!n(j+)J_+{kW|WZOFXA$FH}`(@onSTRk`i$P)ybURkV*%MXOLsluo7 z%-N(wLx0>^%GL0&>c+`DUBKP6;BvbYn#2|&e7S?DEO&8zWJ6j132rAhK@(2H@G+}h zaa8;4tF@#BVSa1hj;m}eZ&d4>aQ6jhPa-V@Z^xhwg>X^YRc>OJn}t_V$4>788>~E& zis=Tb0`ea#{IS-n89{in76sIC{=5w)t8BAyxRn~SYx3&8RsBR#kW0&qb8%Ox2nlxK z(iI}id)RO3ioj`AjT)+Z%7}&yV%tgoNyRewQoTET;kbgJ{|~R+v6l8%{yC4 zv01f9qI07HS*iB72!V-n(i;y3PAZ8H4lyUyk|b*OPg!J2(x2QgUf47!F+&r3?%|DH zDDE5%sH96@H_(MRr+DTeqE=kr$Y}>nX&PsJ|B%Ao-r3`O zFHhxFgblM(HlK)}H)@j$fe~z_t2z#Cn`q9;63^mcX%o8)wVK~vOPBLL@JNO*uGef6 z#k(;UjGVb{V93qFMajf_<;Zxhk0pB7E@C<;!P%_DLbyHB42g7EH%6$(2%b)IRIn&Y zJNyXlwsXVaUDHrP;el>25O4D9HJ zG~cQ-)1SP5TC_O6 zyq$y0^rtlsm&j4Oqjsy(rtq{=+B4E?=ZdXEG;akWRBmrYQ&w){SL}y%W?A)n?CHAU z2`alX;n;@X84S>foZxvozA|EK9L7fLPlooJb;OHD(xYI{Q^?5k@N_77lYT2@GFP_s?vu| z&3X36Tj%?gKUXS$jPMdFJ?^U!*?$WV37&El3UnV2BHoEI+$4K%x$Ics%7SLqE6)-8HI^m3L@9}q+0IBEQryz zsCeS6HY2Io&+KEWxb_1n--h#lcgoeBNqoBo>5$m~SHX740+be<5~?t*j@b$s9z$qQ z=(=%pac^Pj53$2kea!u=s^NCGn{-i9HF&TTd2gF3R74r{dryn_sJSRitB9$+)9{yw6 z*HkR^ReBT;@wX?Foj0q^EX?vzdX!NKXuM2{B`i4=2bY=0??d_OA!cx(leuhW8-=^+e~FP@L3%sN2vkK; z7UHQdD-a6;_O{PqGS(&HuJ6djJt@xT+s`TtVh|Lr?J5PeC=YN;mm6ovn=YzfQ(}-+ zIuKqp`2F?Tk2!14s{xj^Kyzqa`hIKRDK_2OVlXf|XOW9&N(gT!Q#j)JZ$0*Wi*q(v ze|z<$H9l0SUPjFpUD>VhcCMu_6lUjm1D$Gm->9JgCO?_kIznSW9khA-y5bT5Y1<#h z$l7Pq5_5iQy%W4LA3jne2&f;)c|3q|Hj)cVGFM?MH&ioE_^yaaRMQy{v z>!z;Ev~7jwWh@oSQocrAUK^3Qr!5LdND=`qtfjN)+_RfQj{n)ky!n2coO)D+ir3T5 zk+lXEe}v9u?pG{_n!NDfkpST)NTDW#<^ZZ7ggl>0L~RcAW+VKN+&)*t@~9V;HJeGx z-zqmPR8k`BHR)Nyz!NhVDxvD+7w>ajf)#cvyi90|a6GjbWOn^2w&G;AwJcR7ALJUE z3?JJkz!eGQH3P-=k%T{n*f#s^d|5P6r?X6l7*j&+L6)n5$GVWt7gmXWE%s+V7SZ(v z%EwMKXnz(mJ>QN`$wKOj*aqev=7WoP%}Vej!%}`D2Y6RFWONGaIv1p{O`+9rnj~+v z^W|n#$`dyAdP}Z+&)7pz-a+djD=IbWnsziz9K0p*Pj;wn`rNQ;E5q`m*(o{=F7hC=e#{P;Rje@x z2bktT4M6L|S%9Grit95Pb!#7o_X*YZ6uG6n#Ny43Ucc=}iq%Fgep2Kko%}vU! z9jAF5S+32y6i^_0W%H`|B+H})+wcx*HN1_4&NgcdYQ4_6DbQ2x^t}w>sX0^CaL`AT z5j`neCq2YBoD*3}9ubuynv|Q(Cpc78(8o9L!qsYa1GzZO-bk4npA0BJx(u9L(k|It zrctzSjKzZ0Lhqu&=$`Pz)oRK(M%37FMBjvV&S$OzV>SY!4mFafA zXgz_$#uS6ykAKeDtp@h+ZT3|oO}ma8BnQ<@z6f9&$&ixDdI@;LBf%e&lXa%amc{QZ zW}ngY4%P_-p?nxRYDYLkCA*ar%$()Jb0dDJK-w%z$hk5_V9MT_4+I@UZ88LtY|c^T zLW|9qv_c{4N=~_`-ePMIfAEJwD|%Gp!cwJcgdnqNdPJ5aCreQbBxL01xiQK^W~&f! zk-?Bj>@$JAu&6-~Ea8adzDYhGi{aQgniI|_^uwe)zrG~Qba#e&8|*-MXsv($Gz0zY z>ka?l-Vo_=lodXO`gS{8^&!dS6rG6Kr9&w&Wh+`(DaMnyKs&#ClmOBv8}>j(C-zmI zZmdAj69sO|&D$1z>M&AFt!CNe@?WcYHpMt3jZu#Ew!6$zz(!M0Li~BD6v=U8$}V1b)nyj@#5vARaU9 z>9DzV?7CP-Ir$tI`xES<7@bu>d2t!oWrPg`H_YowY+WB`C3{D1%?>)@!Fa*gWtgfc!0nVfbsMlP^Q#DeNf){0 zO;I?gy@c2NT0>~*?J4c+9{2V8!>Df=V&EKK@{Ap$$`{5G!iFo^>YM^jqz3hEL?SWP~9Vywe+!ET0QA-I{ash+;FW6K>G$4obO zO{Z=x9;dM6EtnQdMm4r{5^b$tqA?!`kD;MgQMODQwlharSPN3p#+ zL4`{;AAq)sG9Tm4r6HGWP!GMZs$p^Iyk`x{DUL@7^+5$>d$Xe?Xm@j9nnK;U!d%lS zI9x$s2Ilx(u@;_61na)}ZxVaZMze|8iM`JT02#1Jw!iNxqV|$B*|*dzktN4VOscV0 zoVFU%J*ES>r<|S8$n?A*sLdkZj-ceS^=u78{m1M)Yi&HD4H9^Y?yrO~0l7>JAXeMj zsvuJ*FkbR211_EfCo(dklWNi!NKm7gpM+9T0i^LGwryxTLTR6=D-3=KkR#Tqt`dlJ z5FtXK!!y=uR)w_A?cXXUK^K$g#ee0WsF8Sekp?L`UM}1ADdaf!q~~?I>y;+LWwomA z-$aaH%hZkspjlfRb7b6b=@8+9ra(Mul0&#Y*+*sHE(sU**m8qY;MvafvF-2?oR$gH zfSyQKBujF!HsY2!do7vFEfQFH{uqjJKJ$udskJ7 zgr>^k*z)Y=#A)}xF^^iNoj2rJcs9x?fBZ7MWYm55m(hytd1nWO0H`x0S=>YSko<*} zLh4VT8uc+1|FZyaMhDR*!)QR?hXjK zL0h@xYvgEUYn5Alib-R|zbU)Ko&}_*;Q^#x(%xIsPsD_o5zEgyhAOAJ`MBwfAtFEk zhUkjY+ZP-G0IpVyT6xkeWpff7l-7(hOh;rTmbF=CucM6M=vvi6#subIAI!?`89&QP zBy@F7hGDNCU!{MD9GT0@5q0oOnWwgBe_@~?(;K?6T*q=geZuy*OQu{)H z$pIVjx@TGOk^~P~8W{5qCL_Zdu?RT1ACwhgUFSUrK>)xu#Nidh!U|e;caLl2SCw8; zo(uOI7nWJP%YqGBkB@tg+7d@TF(6?yltVy0bt`P`1a{X3%G0%s%eurrtg0G6J=s2h ztMfNP5E*C`1VQbhDjT4x$6t)U=TU3|IYO-$ZC8qNbv!grH3rV zZ?{dkr-Vy`nYaBK>BL5cxe+c@YV(vt5B`-c@ zTEvS9QPb5!1QU;2|5WDWTXLUxkx0qEg1O}R9tbWLe}I~bvZk+-MHDSi?r%%n1UyCU zyiG=19vH^rU?eJb?a2qI6kIAgrN3gMHVl=8hXpKEHs)%odolK3t+h_;HC42)Up7%* zfs`*nq@7_gF^YwY52(+Q2l9x5ETA)#*qkfzVX5mX)9~=I=-pS2v&QD{L4EkSS{qm9>%@Lr3UIfw9p$p{@-Kke4@efL@D!H3!@BRYH$_us2NsLN+qNa3n4uE0v3Saw|vvr8iLn@1m8vmQzA{`M}x(sq!6L%7X z78AN=C`ZFGlT2%u?%q&0HrlPq(4MfP()9%-t4pqyV0tnl4Ff{I@TJUzKJQ(nYjmJ9tlIjeGBc zJiMt6g%#cBG_sB5Aa%-C{N124&h9xU0F3)OKuzy;BH?+C+4oe-*d!h7Fk!dExH;9eFzqvkKz%D=#a}S?ZoEGZR2_eXjrvs79;Q&rm&)qtr0%LJhrU8TDomT~QOB5vEIV&^ zU=0ex;;nxnA5oXWhxm5)0!^X%lPL{`)Erb1^jA7j9AwSKP!YGP3?Dew~Ves&{%@AGs$iE^ySKtFP&V=x`fqx%qfqmsGx&l3{zvJ9o zc|IC^QY@9B&xl7Klm*~e>sLDe$-r@Y7A%rwTU=n}G1YvPlx!?@Mog*(FkLd)S5d&V z5GOQ{nYuw}Z|2KN2D%6ZMz>5FTO90vL#MA`?k~n`imE2&AXq*biEqg3{eBv8* zHFlZs7B6c@l|EfU9#MWkatX~NOxg2|qsccd{=B4O6jQglS@Gz)rJA1uE^hw%vR?>k zODk|87d67k%UrXOImnId5*sxzXP<02!7_%9A}^)KD4%(8glBw3ixY2ND6Auw-r=d2 z;)O_O}@ z8$!IQC^+jjHOhhDh=kn;hVZ zen5h5l=B4)IHsTXh^HoBcCx#H$HaLugD3jy-UdgvjYtVlM(ke}kBql8JD%!OCE{^5 zMT2wE4%?{YMo(OKC1t{H2k1zc=cCwj2fe1))FliQ#iXqiD!L)X#KNQD$x?I;Ph!{hBx*HcAy~6E;Ex4BF$STA|4Z{18aE(!fu@sjN3p?OIys4eDrMu zbf(Ib?s8(OBQ6hV2o2HOS+M(Gg`&8P=xUx2D+l4Avo?QtPg!1*Losu>Npt(nbR(+bj3&-cGRstBo;lD?@{q zI({hn^Z;|!Auq6iUMM=fBAmh#@Q19c7+#U^k@3CYEV)Dz?ao1z7RLQud{)4boJHy& z+&P_K8`GR0RLgysI*NIcSG%*NPzO88<>V;aobPd5DGJXGw*54&q2zmEXpODqiLuGd zA^o(rpLnR0oETuu!^VI}!^c4RMuQy<;DiJt6M1v~$*1VFKoNzPj=TkhddHAe;HGSL zO=O{Qh8aianufzt1L;vdZqejJSK`?9>Q?&9{R^V9iE%YhE9BGr20ZD$tq{2isWL z|J`+s*Vj1M_~JO|-6dE9M-JZrQ4-CwHwZ9hkIN$5tS7UVS?hhLB2B1&%Kb1%xE>Oo zbfDlTTRoHjHORKE9T**6b0KE^fU|ghaxLBDRT!6*tiaB&PsOcXd!d~;W*x;|+BA1d z3^&yu+;{rmfqGPEllGB>G;1GO0@S38@mb-le_W)(%9DC(=ci0E_T>gK4UjuJc?6`Y z%)rqrD?pHOfn<~rsv~PDONg5H6K{%lYz!W+1l~AEtE{nvr@Ci^O*BO{f3^@wO3hx% z)tJj6$}0=TsvmbTDo_-hTh2X#MOQ(%=nmW)y&X#JZ2}-dIh|~FW&QM99N7gD^=LDr zdh zGCssssJl@mHxw{u8}Q*s#W7f^)`5MJx;G-*wELm#wN)(#wjnnzTW|6_`ut|ES_2Jz zU>~qI+wNM+2Zgl~?wj|Cb`S@E19A>*4weBZe2Bu|JWCyg<%15bfTfU3jk z1Fr(e!`@Q#)dFsVaDdGL-J<*R`BM-S8v(!oNR1!c@759z^m(Tm>)+onGki@3VCWj% zhHSlH13yGLgjOz~s7FRtzj3ulx6VwQS7k-2>*#9qsHo}FQ_rVtOx{TOrrpYQW{XD^OQu_GpoL44IeTO z-;Odcrz?gM&$cFZ%upOfMx7Dkfq)nxTVjebAk(Z+#fTXpd>;=nm?CMQo9W^e8eYdn zjI)Iakh-+>FjugKSnZB7WKFR5%YibcBZw6PiG%vRPF&_Bg5+e2OeBn>PUP<*EY;2J zo!22^U5#alg~Z`8vl(u_LM9-S%Ph;ZdszN!I%}P3duln&Xr1jKKA!0`G@H%va?|z> z^wr&uyJjSrmXl>Hp_9;ZzwwEZj!H{kOf#jKoSM+heXyfeJ+9I09%*2s-_fkAsT*tQ zY5Ut$_37&cI%%`oX7K>bzpdErg1xrPnrfJqIT`s!qY`%%$SC-(5#w8LXo$&8Fsit3 zktonEl9j>M(m}Lh%TknmaKcn0lJmZ+?}oFyt&IkLalKu!rEI98asA4~6?ZUL@PtmQ ziG(=leV00^-u@1#SB=ahg3@AdA26@j$;i+wEQBoOoaX3gSkwcp1tL_spjb%FFu=e9 z&@Z()HMx-kC2Ep}fdsm`!#Jn)a=)mR8Dc>fM!FBdm~+5BYH~BVv3L|b`^`Nf(4?MF(sX+zcGFX%)uagAcY2Du`O*Y z+_p>BBu6KIO`|ik2CfJ#Wu<;W%|&%Qx9X^E^={;z6Xo2IMr2eygE{5U*>hJzqT~J9 zOdE0Ss&8eDKlL=R&7a#Q7y=c|{`GbqG%ENX3H?6~_2Y^n7qL%0&=)d%Hw#R*It4X_ zn~7$m)1bh8ia2xn-&Zat`Oo)DTYtFi&Y0G>tqBQqR5Q(TTn?`GhH1ej`?3*w1Ay*} zZ#(xHvZ+ZMWeK1{RHZnF(GIqJa=2`1sIdRp0iPYiWz+;t_sVu~rq^T#t=myFG-emO z=Lgl1ONvCZdyRdnrKRjQ`GB*a%xoJQJ{|d)dFywNdq?`{fZe<;!-{(NIux@t*iwbv zfQiAhME|r#I$YzSl!AonAZkHa3Gu}SJ_Q}XZ_z0hdP7?UoEkJug8MzXUVLRY13?cY zG$_B16%a9Sr=XSG#SG?9A5ql-vTOSG$>E(NAoCmJRu#`#nG};QE20@1ZMG2} zXkK1$M62&jrg_VOGDOtB_NN|XUkF1t_MOGV>W4C-9<5DMO+cyZs3Mk|I661g@}kX4 z!XJbPU1~I%GCt`0=$eI9q-YWVsde-;SsR_j(sn@^yg zU}b3uP>_xhwx$4Gc@eF(KeYy@ZfBstmUVX?V;fqu3|Nk#o(c^Otx^#$b996~ISIUc z;P)lpy1Cnn+0$D&So19f{O8QmZ)xQfI$GiAg}k$$|L1Yz>-&)X^+cxf!;Jms$A4$Z zNAq=u7swdckNq7Q1F#{0{|)vVHrn6s@#ba;|7T!t_Gg;^GPIIriTn0T?1EeVrk{^# zfPt%`g}c%U?^Ck6GS+YGYcb62a`S1dD315LaZ8Tp?V;57?vZ)++T;2SUDx|8&CBoU zB2DjYy0X{j%I)X-V`XQx^{20&edm2}(2H4zO<5)_U+n!k#(KBO}*p0^5WC`3ePMe z%*?|+gz(jP@iR;J)0<6*%k}9e@=;n$nw(6sTLUC+4`>UC&s=p>wZa^sHL6kv<3z6}ecy&|ZsMFYaV6SD zZqTs$aQp6C;ZmKGWZvRMTYQK((f`S)H--E#;LQLp(Te%d_n3~h$bgBK+IXTRfmi-a zbl+4J->4?xySDtPSozoxT_ji1ptzsVFIf{Z+>{P?V8jz0v_+?E0aIgT@0W*O$L9xKsAu^#fVX)zR$EDEd$F8F({S(VzkVhG6Q5mNi z<+Qo!{$Lk)$vSr5pcBCW?umni{1{m3yI1SIwl2a*^8@j$1bNANj@*WQ?xW5yG7LMx ztPC3^^D%rr=HEsI4amVj>E)T%sW`#wCrDE;|+{=Ro(3lD?8nODp2`t?|{wE}Oq z;pFqF)`fz>_xh3DkQRDC|B@C;IN5%C{&aWB>-^>U{h1!1;W4a+!VJbI@G9!^D~9{Nsa+_&{^ z=nkiyXhbnnAO9v8bRI|7pvA6Id-LOtho0uZKIS$Nt4B4D%sN`A$W6|(Bj*4g|AbeX zV6<`6kc1@BR#t`@o*hJ~d)&~d!9o8ZDM79;4uu`OquNJbnij?WTnh&+$c!t&b64BS`bQf>TyuQL(q!HU?K-cNlNjbjPJ)E zLs$K)zT$YXtZ`*pM(4Vf#uOn&sHM-4d1&#g5}b$nxx}-N0!F0$L(wXx-xPY`y#CnP z%by{|9|(oqT6P$MOQVs zRTnFTUXM35-+^gNo%C?0f#|h|YK$X<{8(~Wv4x}2nOMGjsuluFs=A3=)q^qKvozC} z^zkDk*Jtwvmyf5<6>%<8ZRFymWivBPvQ6|+#=(1f}F_2|v#A*)ye4qC>L2_s!(g4VUNwnZa=&))@l|8(U? z1I-H&Pnm@A1v8C~jSi@Xpcf;(L~&RVW5t+(`DT&jO$zGt!}$#$?N^mEwzywN>gDG& zW1Ce;bi8~%S8notD&u7D+nM|lz^;}Y?sVsu6yXE*?(q>?{l30me$f03+%Mb?wq@R+ zZ&x^6Bl&^fu>g*EaSMK4-u5{}F>(01(RSG!+c^29y~(}9qkiYb@GHOmZ0EU-;lr-LzI~Jyeg%Dn@;T@43EM^fINf~{ z`u+6A0iM15yvkGHz&fXEmwN)DRk3cc+vO3x^*&O%ymU!yRhZeQfwv`9!|h*(yu!}< zeRkP~dsn`fTg7j(+cNkj9$p8%mgZV{+44N#&qB^tV{rXcdyOHVTmJcRUmE2yeHv|v z`-L*U*HYy)YZ<0;v@9m}dlz^+jVV8SEw8s3`Od(7(iqhaBA*Modxhcx&OX=slJ%Gv zniC|auJ4rVDLYnI3LgiXo7EWNn;${i+D!SO>1y_T$a>0%pK)?tRA($F?# z!g<=S(&?ASCw28dR`YM%^w=2UfPOEK z5cz2NSbczXkoh?I2){mCOafSaJOP|OYkv&?3;$(l=sg9tsg$?Bwvd} zmrRYI5%`uQy3+)QDTLns&y=F$dPi=mY<*a@>0McC;$Ke5CFkYVzS0> zzFBdA0079q00960)XBuz#opP@&f1CI+Q7xu$ehmJLq)Mac7p(+`vJA+QD4iE_6dv9 zPyW~J#)e4bo}EAJuaC3z^$r*Btf9vcT-Y`2BDa%ix-D!a5@zET`lM}faWyr%Q?Sgmw>IX|c#=U#*@WOHVCHjph4V@h zg7E;z!RgB$rBAOV$Wk~7P`=}vN!GF9E_xHNjzSabz@{5eUn*Af(kOTA8;lA1dJwPWqr7{oS_@F@0;dah%VfcgYEZyo`erG4LL@ zp5B#`UFX1AlO;F#+~8O6{}wPz;iAwN2moLU8~_00e+p<}$mDFttY_l>Tf`h?nYb(l zgzgWu=u-oOEXUPt)d`D@6i;)NX0J-B!#;sc4D2=2q^sJS^jm|m(VEC)g4?VU_6NM! z!f@WELliRypx(Pd@}5kpeKS@iB5y ziGZ{&F4_r(2L|Q+i6^maSAhKQW=LOuo3#Z)=%|MQW2U_gmT$dBsg0}X>rU545dXcT zO4-tSW4Y?Y4@aFG<^t+~rs}GN_PnhY(x}OASc0~0DyQ1EcKX0Sp$je&I|Gqgk0=*4 z|Gf*g>L*ezr%ys@v#4C5h|R|o=MSEbaAzVlUu~kgP>sV*79wiq8Z!PGD<0Obb-P7I zbcVEz%Bd8yHXlMk+;VQEZSNIS-i|{x56s~GwVcu(bL*kX%cOcxcBRnas)<7CDqvkF zw4ia<3yiC*_a|96EF9AdCyRy9;H|j0pmMAu@V*nOAoP2^i=N@rDsL{4kB46;o2-?f zHgJS8DP>Q^$`QDanP}sf9B!ear=ykXu11oYJJC?*3pA@1Re{6p8FiC761OhlN4U?vi++V!3oyQG; z1w)-|;PZEfe@kmvHyF#@?aHIxg&(_$^v8P6^ym*2=`=w_lspZR|GK5WcVV`in70=rbEw z#@9h7!-%8;;3lz*w;~NFAT$eY=#tA4l96v#ZemeL7aSU{2Z2aZhdU3p22XU;gMxzA znk{c$Q=O+&t>$aOH4`;4Hna$3IJp5LGR(P(X&JSU@yH{JlP$U)BdpUb#A$O zD{DR5n4~0{w*0Fg{H{ic+Ov4gkE!q)4@xwb8Kvfa;0oR7abo-Pt>11NRD%egR9ZA= zEk>D?sOTv8{dzdizHZ;$Os8rfQ92x|p_?eRq^TM(Xaz^Vl!ueY86=QuT`*=myy+O&-@#Tbkqkj|FX6as z#Nx`FcpvsLh>z}c@z5f75w`S=H#i9>=tmsFUXIT_c+1k!jRk<;_2Hv^!_@C0qB%LH zzq3Y>C=P8Uz_SRTJyuK6>YfbTn-T;mpV!>@C%v`l5J`cTrP`0_Z#T5;%k~Q7rrD-+ z{L4h9gY_GjaOe1d;e5KkBDe?axmr!E()bsh|H%2K(d=u27j}Jcn{XAiHkx4CAESzv z6jhDk2~yI77X^QBP(^#%e5_cXxxxp$El~tvCsWHwhS1n&T__+auBncu8Kl5o(*#@d zw}sa&gpJK4s+Lmv-ANX%467;oIKHA#M#%>SV1@CF$IP1-m6X8! zU``m=3r|rA+eyV{cj&f6XD8|~(5@*SP5UDD;k;&5T?i;K$cFQ@vyG6N5TR+c*w{Ty za|SAjl=MFIN)nipv&42AcGG9BEe0B4yvXDm+!<8sjxxp+K`Ih&!SPdFo*L}{-oszw zU6Dj9IAo0@G6oFcbk}VvbD*|A4hx$Z8N8_nR09mcAX`Id12qYC*c=EmZD z!tvn!C@Bp@Xh>A>@O=_pU&@mH6=vJ1hd<=Qp~cVpW?!VMc9YTSj%oL4bjp(0#5^jz zen?3gW6o|rD;X$+Oj2gc<0t=An|*q&XYng@H#=D5h^xYQ(7+>CNWJER9FG147I3-v zK-pv+e~Q?tw-qVTlwEqX4Hv#Q*|(lGc3hkIHhTR4{;R$M*O6z81ONb`c>n-N|NUaL zadI{K)!r*!E2jgt#GNndw%mKgKP=I_2kvAwF1EZ4-5Hr`GmhEaSTgnIkPRNG5+Q#- z%PK!^R<_&`2mmAhajeNKl~ZA6h_GYDi1p6-x3splZqub|c#f9n_Gr>AR^6If9Q%Zm zYh;!-4s=F8sIa_*?)YBFEDST{HqyYiv}}`}`49;LsCRR3dR~88Ys`NmT;kb!+}8Kt zLJf&5&&CbQWV+J_s_EYBJ@xlRp)Ce|`GUT$aAcIcw6k-0oZy0Z6`l?DfA>Wd9Us>Q zZh1QW?t$ub>5x%Q&BZNy#@4tsMV&3(7R{V-x*5LSe&JfD&{7^HCJ-OC#43fjtpF1E zseI@Uu5>;hs)r?NLZz2*T+sHN#9vxD;-S*NM!Uah)7J*F|yXA)$k8eD0NiJFAX79u$FPaOzDuOF?u$Ibch&2ZU=FT|#^H!dk! z2U!AdT74{$`vyWCqc4pkD1d<=x<~|XQM))v3-CmA{2wxHH_uZf_A%|kndMBEWU{-O zv@>upF$oKm?S2=I|A3Sp*#pHasOdJTudk=uyWSps(c%Ll!ZV{x`kU$NX$E zFBnIV>+z_2PDnq4+OD2GChcn)+ZEtT|&0JQbgS#dN(PCI7@LCQi3#o>Vfu7;~4d<0!ZMePU z*)L0F7}nC#QerzGhA|^(+1om#o47aUyNM88Vi&zOqx;%!2@3BUYPdozZ=Jv#H`4Ww z7jxpgh`gp&q|M~J(Se&?i2j*}?_w4>)akbrH?}|<%mnXt9=0v)%xtHXfTt}w++u#-Wc#>mvy)Awz1CLS=w$e(!Ms0` zi}kTIeMH!fO|D4j$z#S>tN*n0c?LAzP`Q2r36@j5iaGMt4PtW^#-bf3)Gk)MZJF5* z#Aj0+6Z__{V)hQQlRM&OWZgT?%{8byLvFXsD-Ihck z3q&wIs2m6sED%c0J~2gP&U&Y=N|}H6L0T;dhy=(p7!@VIp*QN7dKs7sY`dio0=C6t z#W14VD6UCXiU}r@Lud5CBZMw}dW?J3&lfex0pvg-(GtP*WU%(^tN(iv9exZRlS?RH@%&`vs*~1az)X+Iz zv=5_PFQDXdlOuLX8tVt2Aj{9d+d#Z$+hj0Lg*b#0c!TCHF<-$r@DeugJql*tc+D1K zqZ&$8ULS;OMUV^>|M2FrojRS?hhcp8mhNk_h7nKXClvtm}SH`+(u-9JI_w1E9Wz39u6Hn!#r+!F?BqGx&9q8L;%Sd#5hbmV4hoV8Gw~m6oR3sAA{VD#_|R6_7!(cA9)K{ zM+0X6d29jU3VXvwqAkgvp->_{i3y|nA%U6J%!;1`53uO%AM|EbGVjekHH-;Bq8flF zA?3%OH`ClevKg;0$8mZ``%dKBjMCMEuP>jv_--%)zn$^corpKsLhrX*{JTeUv-68e z0n^a9*eMCoF0u9mn8GQQS@G8G8!vv(*_Wx~Y!|b#e9>KI0TjD9_~(?_fDE#c5^FC1 zy{OAXBywa#2~|?va@NGlcQp0guONepY;RP%4a^5?d{19wyqH?i}J0W~KiyJ$Vn=XK{PTOh($XD8&%!Ej|_v9&E!3MRX1TL}Fm zO_8x0>EBIFagB%QnOn6#wPb9ux!w;p@NV%1?@Ai?!MVeG+H?!T3Ry73kgzq4LplNdBzj_T3O#mu0F z!w#5g^|=vZTg;^k5or#@J>&L3z%f|Fsk5g~lT=xK0SmPA+wVT$EQ%*=@~9~b3~~p= z(C+MMGa_kfa(sNSR~S#mN28HG*6g}mctU`}l7BIWS33d0q?3{2OHzWsLXPEmzSDQg zxIU^o!EkVbfI+LczH1eRQ4a`(@npd!txf1*m>oz_hkKqZV68ds`jQZ2+x{;AHnB7I zAMu4G-zviN+8lj4zJ1D1U3A_8-Yc7fIS1#BAuO>Z^0l4OB#Ag7SsQT&HD&^O>K z5MZEZW==j)e`6qFETNrwv%jUti02FIkbhtkljG!FnuV)fKXQ$?sj;n4yYQ< zC#%W)q)ihp_~6VpzjkWyMcM12p-;X*GX+hZqng0NqScf+wsPUdOe-PqL}tq38B$B( zU{6KKq%Te5gS2ePo+Cxxto^=g0?RnFqe;n@*>(m}zRf2E$4kg2+9BcqO4=GaI-{m9`J&Osu3=xhhz zxl4WKF6*zu+7(kUfeC|736bNsz8EQs35D>mYV^k~zRuX-@*-!sUZHBnfYx$lGoqhBtb7X0q!$lI6Pg zFwEygB}%%@`De8?Rv}m1A1dz5Cmt<{${^x-4wbhxU*? zlR{E&ew;6w+rb4^UdOj9I9@FNxNiDl^-x$gd2c<hrZ4+)vAblSTO?rBo@kj<6%qKOD|Megp1uF zE>x$VJoWsc3vWD6wWG{InKoE)Ldz--ZRSFz*^)A`3eV{EE5uj|)R-jOy%_ClqON)3 zD#x=^xyn7*Hhn#{k&;+6o*>k`VfE1IQOYXosUP-ale$&eTol>a>}QLOOrbfx_>_dvfAPK@(Ya-yxS8GdW$p(@*9&qZ%Kv(!Iqv zDyyH;;4oOQWc1bb7QxlOGPu2&OPmSFP9dZmE9$B%KkuD-qZ^Paa4?@89q0!X$ zoOHROgfh?zDyrZ;sEry6>J5hdDykKEN#(*TFz$7K9v-?K10sjt*fJWxrM{RZ?P)O=S8>8>2MR}kg|00vJS!7NP?{b^DWvm#WpV>_OmvHntLO}DJhN3PXk7srB) zTSVWZCV~Xexb=bQswaw@g1S&GxQpuQqT+ZUCas{6u2hXCSQ{3rgxNtyK_PJVU&ECvZBvA&G9W7bE+}jIZuzr*F0Qh3o(Gi%GMg7KZQHhO+qP}nwr!i0w#`%PzU}YM9}zRgh}L@xjF<4Egp;6=NU7ji z$YP4_!HFP$Ag-m@XNAO9Sus}Qoa;trjZ$^;B^|%}saX*MqT+iYdL??pK)F-a=WZOn zM@6Q}Zl#IAtD#K}M1DXm7APjn#U$5oWG`i1bRhznl!l&Z7X)##E6ODl37F?VAA&s{ zB&TbV14$^9bDc=KM9l^3&Juq_m;~qUX2}b2qC~ywaPRc7DBWnK(H_;o1h=abvb4?G z>_ly3(lj`nX%0wPBH;qUIc^~9(?ex|v%*tM6sPdJcs*}Ux(HtcNK}!da0#TMt;lMQ z=L{l5L{1f}unz+3Q)NCQ>~mFp*MP$68Og2W8 zTCIsOu@qx(_G?1rb5Lxh{vZQJ#83)Z#E2sC*-EU0ZtR5uN7B+mPF=Wwnp;+|Sw2R9 z0YvS9v_rA-DiS$&S+>SjEg}lGUn%(IpvO5?Q#9e6z-oilG`S22XmDk&KcR(X_Uj^) zF{$Zf$WknG&Q?CZ5nRS7Qw}-FHuagrvYEv&T`+LX?l{bxQBb;=e?KQF$01Os^~Ynu-#CtF!%En&CRkbAz8EOVD=9zw{8d5MntRI$AT`MnbSWnh zAzC~fq5T}Mu=Wg-(F!K)k0hl8(fi}u{uC#liRaWD@@EMvYLw1Me9N;E zjp|BuP4!7i>#8}2+%*=KbY-g_7*5CG3ImItj)E4$w12xZ4LQr0l%O{<4rnaB`r;sF zlx@|CrgNGp+TqOJGq$>d+l+GP&_qGmeU+=>nQ@fCwN zUgEvAPtV=nW8JNO`z<6_yH4A;bMk>~wUF_ahO0+{FS>De9_#(rzGclQk4eg{AtR%{ zcxZ<>qgwEsr53~$|BnhGtgwd!10}IPwWj7DUJdxE8%gzkutH-cqHk_TMnqLlxV~Mi zO>fmgJ7&)$P);NgRKn(~8F5K&WzKL|OBsAZW;-;HN_Uq{2+4xSQhT4{kxk$ZsVX7G z?Dj)-t-@d|ZNZXgZ|2eF2FP7{q#wCU zeegycQ5bk^Tx8&nDX?FdE9om%OcTz#Oh;iNs?aH&d z^W}FuhCaJA=@0^{#k6pD44sV34QHW;-F;-Pm=7&OT&b0k0&?PCKicnZkb zgmUoiwvS%D6<&T_rL2IMx_^8#)r0S?kV*)D>BsvoL-aX?=z8>64fwKkHu&L27j(OJ zRlnRCb3sgig!6}<@XhyiB}&b7wxq2V#E*-WXi}L?)@zEMmLw5uWv!jQ#ExIOBHaqCzo>OG(HD; zyAR7Spoc)nQ5P<~=q3wN~lz%vLfBI~t<);tRG+BP%Oxy7p1 z{F8X|H*YGWmIS1^JBMxN>s$NNVKFME#JbP|Qz&~rv~>zAg34yf<@~gw4FU28sB9%p zMqn^wLfE{&L0U81VqFKB20xD;d%HZwXfTD#1+eY^N zCg2)w%~_&8HK84Uw())A9qB$Y`qyd>dBjPa`&4$QApQvm_syGUO2iZL3jf@p7A@R? zW#yazf_DKIGWafQxw5_qy|#4QxvgI3QP!USoEHBfSue%0Rpc^*9_`Hmmit1bcv*G4 zThL+S+Kg<+g0617+V!(g_Hfk7!JHPRUgg4v4TES$hl9+1?em`oU;9q8T_{b}^2;%J zPoUOC+A-H-2B>puaYtsp?o7Tlv&nf969M<$$f%Z(RXGhzTb?sZiby>z@OAai05Hx4mM@wx& zF@bGZ3~)vE?QVt}Taz{o&ajxqNEBkE3c5=A9lBq3<2t`bdun>E_Eg<4&|MG{hpj={u;h<1=wXX`F}1PBve+vio%VW!W3{C~e6T{S zaxAXwgsE!KVwkPqib~6D7qw5kJTv@I$qw`OC;0U6|5V77-B`K7p5wzV4gAR7v|%a0 zYT1NGuIGrxR5}Ud5!+z6J1pv1QljQ+%J#Grx6+KXTE_QsIH+*Vi)hC@lQP5oaE1~dSkgb(Ypj7#Jf7|-)=q-r~c$|MO&A<{^Cq+%aov~ za6i|b`aV{-Ir!ZHD=it8UcC~LtMBRY)sb9tdH5omL^s~ygp90>#v%K*tmB}?nWJI3 z2mR?eJ#Va&r%v{C8X<0KZFH`Emxt0ldT{U13W{E7yh6IuVmQr&vU$q2T8Y9UbgDEk zH{s@8cJeulvsN)qpy;*{R=KTW-CNh|(yy7^&_nuj0Zc^*kzd$Ckf$m9PhlW;$pBKf=zOUI(6 z>hkT+WVzcB1!!ywlH;<8^kuCl&hh->F(*cv>vH!)jNFGOYQQ|8T2l4dpsv6g9!7}Lx{NXrtacOiaFfHKa*yP9RrdKV8v<`D8$G^r$z>=8wpl=z7fi8YF(j)!8lTMbCJ@@mM ziLO`;_NN0XmP2f7jq#;i#}>|e$e3rAeCSZyPlOzkuUbExW*5)C7m{m5=YiP#RuUvaUv>E2hRwcpm< zn9t(vor~j^;||N&dj>uiHF~2ZKj6 z7=UmU68n~&;DL%W(+O>+g?5sr1@7vN@dn1$?HLQ>>;^Fg#4Q+=-L8((whzu)8(6H}2paT~Gyg!_WYk)h15niRg<02ey$5j84b zf)Q`qk%j=I26s>uQ~foTEpF%aldgzjOlqbu5sP`JHLj%{fM9cORhxUr=!$dBsAuD| zHj%qUu@6M@*>_3aiF`(x^OAzf$C*v(!UqL?e_s;}Yuc|4=owcAOukk%l)GTXVJo2@QQ}pXHeF1@H>2v1<_gTtq|_?3s2X^#@pR%OL4kq(>_%7H?@ z#vk+v@Ej7=GBEM58 z&C)~%P=8%2xpVd!DlW@EtnpAm>&pfeR|I*+V1qEWF??_A9f5~n;+GNd2_<@je@ZIWGJXQ zriW~Q;_-=1CFII>k12s~JKCy^uBMbyi0co~|CF5*uLZtJ>UnoaZshOjRQ(jjItZ~u zE5HD)&&7LiqngUt&u;*{e3){$@+U2 z{PX;|AOCxX>t)wn;I;?>!Jl-99NwkB^LPm;t-dvmkZf8!Z;Fi{y5KBH=db-%8HM$o zE+uPLd71Vcv2cKfhJJ>b+j@qWOOJv@4nLImnF<6a!7ry@b(?lC<8|LjU|$nY{8{bh z0Ub25$K~`A4xH8p8u-LPdz+lRxB2=e-T4duzkq=e^xRd^+8WrHIN2K* znK=E2_^Ha+9kTw1q$22o5MrnCYoUO)+RqCu6ovss8QN|5>r+pf3MGI@klgp(!cZtA z=Ipq_Kaa4!pFGaMh`sKH2y1UU4?GvIFu+P=i92`D-?U@;T@(vC&JN2Ah^Bz$!MA&c za7`8Y9`|^us&uCL0-F;lDW+bTp?=vXZaOX#-O2M}fsO|yFeLI>OD|%e?%J_}@UniC z6#-!97re9n{v(|-9k(iD&j<;suT-8M{>eZmov(aEqdEDp;5*nWi5WSe`gtda`ZYu@ zV%5{+^;1XX{OyBk#Bx}nX0F8@rbTW{IPcG3L7p3>>*Wl!dC}y{|%# z!caP%bT?9E4Vwt_!>qPAI&qUquM@V1uVcFdR?yNnh$vP#s3J|ew+yDOo1}$9TmDiH z>aT6Mixqn$oQm^<&!?eCkf})Xi{=K{*g%RS#cM-imD6WBT-7|SHlgRp4hyV1&pJOQ zVu>0P?`&qo_JN3du5zB&wlJ*w)y4j1O*fR1wp^elBA9XZshcy6_)(bG(jmZH01GY` z%3ETk&gu#4!JzFy7ly~QBzW5WA!|NpGjbbavd@{tqj1|_gkhf`|A32vrT@|hDbGR0 z0PP@p3d4O*p!w^Y@X(jj`V2B;T~q>Do`iW|L1 z4cwE)kwBH_82^t?pT$;XKi3=OgI>K(%8p!zolAdZK`sxyE2_Jk_SBB(JUBn-EsfIr@X0h`B4HFmsp z1(H)JlbgfB_~;maWe zCU^kMn+@K|X9}FaY6p?nTJ<}Y96K!k4&!^US_-ETe2o%GsUMIzw zP7rgC9zi*4PwjxyJy(V%@BJ_ETVhlu<@RTwFAlx0?%x&5^XV#ZBCX;>PqEV;pr!bf zqk{-~DM|T0em@eQGt^}ft}udpNs!!X53 z($Kq1nRC#iJ3BfHU>xPxr-N>r;y>f?QHuPK=5CpFm>ai`eV?MN^_c+fUqBgQ8fQir z%UOs9JtGZoC!Tq)_~kMx{Fjqde}P(;6-BGnD!hk#9_MkFWWTAdj7Q(G$ZPsWgMZUJ zkdng$!iL~1RL6{RN3Sm1U{FFn{5HRU|Mvs~jp})Br3C;;%mo0z{$E7u-{ECtU}mCc zVQc*VxcU_zE4MAt#51>VD3}&Je^yA1#-t1tX)@n&a6c!X=W{GHie?a~T z=fv-8tvFvGSjma$9Vfau32DTgm4Dy!#l@gLy?c|-BcpgEvv`x_bf$jJG;LA{#NtEe z_!RL>XJroL?I?{B3FWY?JogVcS6& zEH!(Or|-kiMAe!dF&3HMdlZh-I%!_1b&lNS3|5~L@-T3kZrk{j$fX2zWo5N<(CNi1 z@|Om!Q-fsYh9ZkaWpVjqF=CF2wq4v0GnE=Y>53~srbXiEQi-@?dUM%W5V&oe48es) z;|)-sE>uF5s^1Xb%S-7}ig}_&?((xUmUN&gH12D>BHb?U`;;5mUSAkK72+WR|6w`Q zF9BMVgfpiv<4>LO*Za>KU)g;RU-l06j~M&*=gaj(l&aUd(Ujyg->Mtg-JS(I`zI&o zw-~!S4nMv-``{{Fn3vtp&&lyq*Qs9nj)hOvodVLI_z8ecxR-`Qqqi4`UT#itJU?pQ z)mL88dGe2s_K8ewX)p-LwgZ1WI3dXJg6yBe%O)@UK3-YVaor?O4P804b96sx)yuj? zYk~_fQV1rg(Z{Ade4KBnp#dW-s6Vi;yxl%5KHyisI}uSf5XK$oOe(X!yjb6y+;GQV zhKBwJ^vu5t_{0^Ygoi==x#XGdEl5{o?t~KUKy37@+!9v`TY8AT zQTT#xr%1(t^y3f#0z?0t0i(zi)XGa$3+M|_1zLUQ85lc(Ax9C`)HRu6hOo=CGao&&1X%E}Te2w&NhQn1jfK6= zWtSnP#CL{$B#b{}uviz5Vw!aC4whoz`)*)Gl$DKQ{hqsj-C3hk>iwuHZ=c5|seBv{ zX-U5u+_J+Qs4kt9I$nsq{VWmU!*$B6QN)<|?QK7Mdc+O=ebBW$Bm0Al2 z#~07T!VmsEf4j3Tf6EesCZ#uG4FmWM35Q+?Ha2C{cCUn)zGH`Y3BvdLVtD&Bb?sOq zytp3aV>}G|G>B)=iNn>O<-P|8HNaQ>wqMslS<$8ymvZ@&Ge8Pb^+zVtSddUyD!b2& zP|g8TVU!*dXiFJ-GRiNoK?i&WDcvZACRHCFI-VapU!E|8ND`0kL3cI3lzh-0r`SKn zPIndwCoRF$AIc?at1Xz-Re4#tD3jH?Kn7^*#h?baVpK>geSyeLXhYporMimtZfICk z{=Sfs?efgt+!R0>wl+#!gaH|OY}<9exz)vLa7ScSSV=G4(VFkK3OX)+F`t@Qyk(Q0 z@j0o81Pz+m-P)o&Q^Ga%;Pfx1Eg6mj>^8}`bSI!advOkC?DOn^sA;}WKhqvq@f7Rb z8KIW-q>RmKZ21x^zO0QLnJCexD++Gzwcx8~#$GV()-5vY4$SbMg+* z@`pl{$g=dT>+H<2Doaa5Zc!C%B@(9py7wUYI$uXjNeST=$85GnR@z845;^snimIvx zFmwnI#%fEfme8e4p?3GauD$vGb*Z-$dJt!pYYKX1MYSj=Yla&EO7fp73k7>NkG1_& z$3gnkfjJ~(B&D%SRr9V!!?=jg-c8P}b{Kkp`F+l1fnYByVO|J~#u@6=o@VmU*73s8 zEQjfC+Ju6hvCZ=v2m6DH>y2xQ7N@a|&fDZ8F$0<8<63bZLd6keLS*%I3XB$yZ!KbD zB=R#!QAy>VLCvJ$m{M~X0lQ=uX|&+N;BV=IzA^27rQU#d*9BDu+-oCO@M@p+h`V{- z6c~w_R~X1&LMR227>Gn1BX#{X25( z2B>LC+bJ0U-e0g)8!%fI0d_t&LLG;w@u5d2?FN_{%ygjfVh}W(Zmzcy3ITi*YwbWN z@G`kC0U4Q_RzHhSn1hORl6_vGpcMHA>2!j8!zWcmBF6P|{#t3=cp7qpaCb!TAYvLz zd&qGyzG(Qv&maYQg#Bc*ywNH-qj@YUg_%ZT{JWF1oV}DkUc&YAN{Eo@Qkl0FjDmBd z;nV8l6s!73*)d@06-e;QemWowf#uGl`WWE(SpFOIo=i!RCVA3KY;uqX>+|0p~&M<}WI#l(geV8x+&*(5EiwsaX@q-}SCST$q$mmq`nHAQvslGaz~*bP z(XeuB^%Rj{tB5X4)eBGzbZk*1F$4t@=cgohjx7{GxGZCOGIvTy_6m#Yz|jM6;R}|~ zsV5vJ#Z(h%%1tDW+-~8PjR_NGgLXsibN4^ZAMv)+?903emWo8K5Fqi4mBGx*RrWpK z>Aul?rN4l^bDE*N2>3w0p3dH^%`<%KJ;bEy1!eU>L|DM7;R!f#fH~Cg`dV$$B|J4S zkiID>(1^IPK*|Qp>j*aSvG9&fJ|>0V!Rj7bP`acgEnvvF4GN>eCIfg9c~!%gp- z7Zt?LW3K!$4fx&t;f!Igfkkg}0-Cdyio{ujz^d6$IMM*1ck4tQ{rzht>zr7RsEH|A z;Dlx7>N4#GelbWb)rtxu16uCE*g&oZwb%!&pvO=|!;-PhVsLr=r{_y$bGbZaegoxr zaroeJfn@_t`yO^=XY^hVIO$-iVL|#kzUwG&O=vMN@qgi$h-J>j`XPHMWkW28tU65b zGi13@k1%~yk%Mf30%rvF!^8i`47k%}f?Q3VJEM?Wwpx?3coQ4I<&;g^Js^&;K6c_` zvV?LClSsps9^eC(No;|h0<}Bu$jAIWu78{!v70k3qKfWaMZ}B6qzd@?)=H^Xs5xxF zlmys~8fT5j5R|v$=T-y(D#55r=2$yn1z9?0*>0lYhr}L#csWve6+TvQ{)ihhbK_f0 z8Sf&aGJ6eua(`Rr)Y~8+*TTkcY9 zR3h3RO}Z?V+(?a#$Z=Rwirzs)K;~F@lWl(9D45HlphVL}J_n&3+!6Ue1-6+`s}*NGBVL)3hST zkx69wE&-ky4oUi>HtNm*c0;-ZLebX~9*oGsVwR!Q6rUZ9fiJ-b6c7*IaIU0h&r(s@ zmgZmG{-)+W`pC?`3g=B+1ZQ`QFE5SP@Qw$T+p(DN>r6;9yZx|76ARGG?Baev{i&ba z15DSrMBukoG4w-0D|)Ii*)+carqtpJ%!I=Dg5|3!mjFQ^fTF(l)bZ3^(Dm&QdM%`g zgm~=^sh&=NqqOPe{G#fFq}f>RZ1==Y-q8FcX2P^ZXG9U9jC7r4iy$=7y}pkS3`BG9 z4n5LvegVI@xIDvtcwZSm93KZ#U#C$+MS7~|=tC0g7j(QeBQPg-Z_Jo;_h;%kYVfcr zWlPoLndi!j8t@U|G22^&%&ieF$o)Egx2y?r4ne2~oQpJJwn{8eqUXnI6<87R`i-5qXwPK4YY7Gok^ z1b$IvI{`G$`A6&2W&2QM8};muc+mUecowcp^bZ`-NIN}N6OGJS0WBQeDdr1SSVDa3 zfQW4E8j9lsGQTBn!yX6=2yx9gaBnH_hzLG2wxz0(?Z{*U4eylNgMw zqsVL5)Ac0KkDjUidY&}2;t4C>ibfROn}~a!O)b+l*<^qsyI?}47OT(q0|TC2vj>fu zILnyQ@;LsYI;k#7a)o!c?3Ns6O~#%L6pPy9`Is0X8{S+sm)?PnsMLZ+7>x+@#?7R- zZ6JXwRV_{|gY`fspFR5a^boRf8{TPsnhN(p^H76GIK&17iq>IZ19N?yai@WX6+Uq$ zcgB-Px4hsk^15p^&Y60}MNzI9vl)rQpr~|CmN@J(93sLD3Zwgd6`)8MzRqgP^Skeu zGm2D*FmZ~BRP&LWF7?==o&pp%RxU(C>U=SwuAyNcU_e5IYp&P&w8vORHs)EH^6z3W zuvrPP+-oD3f{92_w|2eVWS+&Mlp`K$j;!m!XfgJsDAV@#Ri72+>>Sm zg0>yZ{3Q@}5K_V%I+aKoKV6l>;WWw(1@r%MSg`2&JK;*&SwvHmrsrY6rMT@l#vW?u z2I8_EJ$8n6b8~w6^T19Muo=g*aHT1nY#`J^SY*V<*Mgh|Wufw)6o#VeW4lCmRF5j{ z7N0<11xDZZG$y5akN1_&{pb#EEO|HaUfUi3JD~v3 zo`uj{)iYq(*m$EI74^u0<_@!>+&)MEhv|55giu5Zf6K@HqA-b>zOTX1Qro%O8R7EM zjS&D*GoXG;e&y5Sql}+;(@iEBf8&z%yHdbN(!9FReFv%8y@H_dK_x+4A(MYSO9Mqj zex?CS{>Q%N(gVomg83|}Lbl$(i5J)ob{O2yFysm-Mgf|@-THDv)|aIYEJ2JW-7x%5 z7*V2UYO3<)P9C2;`_;k1C9co5P&aO+@?+3)XzDSmTqg0YJz(Khqc=>dG_bK?Yw+`l z{6S_TPJ@iOoXoQj)w=rA0v!JLo%NYZB5uuKtr6AShtUApk6haY4&D>7rYbY}I@}qd zcgPt0e}V#D>~?E(4dm0UpdyoJN0qOf9f9>y4PE%dxRL&qMDani!d_+j;pP$}uW5%( zn)&V4Hv9K^^BhAYVzC7eOpbMWn|s=NCR###9Fcz$Y8Qq!$~GJaiCd6uZR?JYuve_C zb5-YK{KuQChSrk8kgDe{#sZ{|E#iG=FQ*8Qs#C8}aYDvweO!EE>Gi z<$-{MQpyz=Vvi2;#yP@oN_D%)9aSWx2r{WOs#3+l2V$J>DkQD0wWjXkB>S+TS}K&P zB3r3sEuGs3>8_pW3Kr*P#^_FLm^d7Ymi#J8jSNksMiYL2sSi<0aVWl~1iJ1nk!$sg}Tr^R&tO{nR8oKV;0=jQ+ z;h-GCrWP@drp86CyU?9H;<-s-hr+Q&! z;%arb6}*a%8f=(|5KpasfXm&sPM?f$$nqN=5m3R278P+4#1BUARLpNVtN+w(l1t!i zL${o5PG;?goT<7N^#Ie|0hUB9*+}3IL?Q}ycf;6o{T`DolRgjf0C6mI=+`;bxN?6+ zRZ<=G3(ZamVWAy(QVbHea1y(MHUz`#d$m!*o~+ zgiYz=AtzbrsX}Gh&^s`c{vgw6H`80YR>jy}B8gtMz1$-#fL0%+3dBSJxbvOL(lF8U zO9Dv6Ct(DDh>;E;YovID1$mnYOHGZJLU3EtdmJ*vaCn+xde)YNzR{2Bqf9v^bk%5M zbp{;cn4L`*iwAYddEMGa}bt_d3K8hXwnUe{oCFBTl=p^kJ9)EjA zg5bb;st=xOpxLp){VqUIFgi10^Ql^Q|HN3wiElm%pOoiZS0*pdD#5 zcIOd5+#ybXn@_w`*#SNtVmQO`@fl;jr1@0ENb#dXo*1MFHusp0fzlf9xCRE2kf2aE_X4cSV#lU{1fe--@Em za<5Zo1=3aD4J%le*i0-Vm3zep-96~ag9bC*!ioD}6Koi?x9Z^(WSz)~ zrcqV*L|QA=NvdH0LD?_oe8M#?{CrjC+`!Z^Jb1Lsm%N$Df+SZ00&NJl7H?N>YJq@P zQY3B;0^qG|y#e7mJ9<4XwAwvcFqr$nahK2=fcmKNWdoY|h?}7N_Bz*E&1i}-k`R0=xnYNdY#MZz0rTKdJTo+^c@cp#YB0$(k4Mw(3C($0x zM3|4OFQ*VrC&dDWiDc0e0)>@~$|PtBy}?K3csYsw3ydjh@5v1HlNX*e{Kv&T<4@M^ z%=uzEknhtCd7R~7h-QK54t;o<3~o4SH4k_~D`p%;@CFSvNHdh-u_UT@7&tHWQzLcs zXcB-Wz+7ZkI9~BEJg2&+M4ycT$^7KQG54gO`5S%#qQCDQDi&aL2#cWeh|tKRoi>O^4-MAs& zSM$KnO1%VQa|&?kYo~K_6OUrbV@MnTF&n4B6A&4CK}0jdpjGv!7@DMSCXqU+sJm*w zW60VU!~jQicbr@A93z#0VNTsA7UZoKlGFI3QaM`yba6!?S^GP!oKm3JosIzts(?QY z8a(Os+Wd@3U&-e>T*&^N1}dW6z#Imujmk8)`xE8v9BfL4LdaqEir6x{){J9^;8o>0 z-HDa!t{AT~@##>v{p%@_S3~X@%Od$u4NgO&egErP!K0QN};Y z_qIRab$eQMV1F!xLoEI^&nsz822R2HSbmXUvlpK=(ANgUbx5 zhlt=Xv=gPTtHqUYVR8`YF)!fHIL+&X8%la{6z0wBe~U||MQ*mi5K-mulTxXN^lLNb zJw1GpznzxaI?n{$oCiLfTSHDAe!?(WmtKmxUnaNYh@{XO9%#;5XdPAmC5K2^m$x8s zt#mJQ8cVV2sDp70#xf)wPd?ZVNa#+d{dMdw){i|p_SDp^Y;CsNu(b60tsl@$nv;5I zCRwlwR+a%f4y%}|G621eHQe4=M( zb+IM4$D4NQ<_Hm0W=d3piji+aiGM0yhe<7iM*QRux@N6sN!DlO)Lmk2cYYV?|8%*pZ zYNc?_SYBoxCLK@!ZtD(G^cROx&6Xt{*xXdPIENRdgR_T&4O=+QvH=DxrX8>WIc5x% zs(vwsF~dK(1%kDufW<^U-czx0NO1OvG z>5CBnYk+EbjU#g>l}j zdq9;W2RaZ|E6~_JF5*g`2qyFb&0F?YsxOtOjJR92CI`b^OB|i% zOANkn+;Ip#*R&0Gr|6c49e;Ds^Tz@W(2Heda?L3AuG1YsjExTFFeAZ-l=-v23(UU@ zJ6IpLMM&WXcuxTJznpGND2MZ23)ru$;48907%`@|-bH>G_i^x!vyN(7D-($dA@+MU zm3*OdzKG(QV-LPxN3{oiKLJ>fL0ezXW=(j<$7+(-1k^Q!Bvx;!g>WugM`-IhHMrur zqES+=&01r(Pnls`Q=Qk9$%Be-QO?)b(actoncQw3_b-%Pro`63A*MPSwy4ws04k&= zBc0@-(}4wTy%<*cVxUGYix%c$d`lg96Y0pL&^WdG_W+cm`e>$!^W>vGmFRrum_)n% z(S)yIAvj9*eHMqK)KiBN8}(dy5p^|eb5ng@5#*+9E<0C-pbT|0J>Vhad8^L$5p5m>O< zjeC0Dl+?-!76n6L(tRaHt(K6Y&!)&%12=ZH9(AH8SBh<+uNNRczqGe0%m&XxM@yi; zQd~!WUAO=J>Q<2|xSzgQ$T{iyXo;6xYD=b1`9TK(7;~-AWP52-CoKoPxtESfOqnRD zFPIOVYrh^Z+RmZq#c)=fWZG_pXeT#?@7UlI37+jr(h}FoMm_v!4&J|L)bL^1>)du^ z`H7hwpz>!?xu`_@L6VBoQ?p94mX9r??Z2EjZDtBW?&nm)_5<}drp`hWt3xk~Vlgs~ z84tr8NG_De+-8HKZsxL7!4gZv7=J1`MrkX49%1pK)C&M`5eVnM?!qb~74JQ9^;F@u zR#IPNf#kBDS%s9Ur6kSMm4E?ES2!8LITU`^nFdp22y%7yX5gm^@JDy~xk~Gua?Tj_ z!uA~3QBSfwMUQZ-r3$ivJow+oaZ3OEn5!uuE4>1Vt4K##7KHgo{s(K?9a+_{F+c+7c$VlBIYh@-xI8g2F5f5Tvr z%0omVB;)o4$f}b~fccPy+*D#+%GPQ+A+>iEW;pahzk9pn@*B4)h(B z0WGWuv`kwPon_y{2oZ+$=IwhGHE|_A5%kbg%ZNACY6Bbda<*$7-Fi@-UqaxtoUqGy{8Ddnb3J8)0V0;!VqrHeOqfD=0q({I;%p<2L7;wFesXHU#OmJ<>g8%J@%`dfEB&QTaB{9Y?=*#vqge6+`E$i+;MV3^eA$QDhJ?J2t zsPMH}3#QYyj&wa#1jGq>mkIF|8MOb4b!dzLqxMddIWEQP2)G++s*rfAhuY7NhdYFWL{~0DA-@Gj3ktdy3 z7~yv5QaYI}Gz##MG?9o*Y3+bTI&O&XmUeNH4#Dp^bHr zZH*-CO47aB;wv%^LA3hA2UMY|<7S(MOR~wfC4C(V**SIX2~W;??*aI&h=c5b$5+7GU@w4Y=iTWpw|x~FV~Re(RkkHODc$q z7MNr!>zpWfJC_OtHPtxg=b3yjg6)Sijiq+n?#@&9`NuS)PX2W0ZNWX-+pd(#RD;ls zT5(qp=yEF?7gab8&aF`aS|J6-18~|di8PER(x4;86X8FQQ;9O32iF=_4hP%X54*ih zQWF@{)B($wR&9?q+ykqd%qDxA>69{~0iQO{8J_Kc`jb;VlWdO+qH{Z9Y;eburh(QA z1<=3i3BcsQ*7(ysT*ILC&~okxbX(B0qw~4UzAq-2I=#($cC^zr;wk&v=Sc;B>!3na z{}OrfQ1o^?<7DqZj}F{jwjEFsk>f9Uy>-efZn14gzQ*n(*@Xcr?Hyx2cbp^1Se4k) z%`b;>GpS5b-78K-9nlVdi4KMdrd52ue7n^tPj+~}ZvSatt86=vHF{N5y0u9yiQWCa z>tO&ewh^6l8ga|l7xm!80LAYw{KS4`Dz_^~BI_`CvHFm`P1>vi=|%L{MJTKR>nwH( zp-^;jv?w7^Asnf}=QMFgsHfGuxhOY!4s5U!^k^7M>y0ca!n*r<@}Q-uHG(>N5aN@O#Va#cMac}r%i^k$0TKQ zztV&#^jPYlpSJ6qeV0CeWhVqJMYp7@Hx$1vU*LWvrr@(o2^V;eL2yR^qWUf5_S;## z7y*SU`PN6qd4LPb24Z+|O_FB!uTG;?K16iWddLMf-Krb+8P2}lLW!QwVFp3XuJVmh zG?iwf4Eg?S{uFLUQ!T(OPZ%g-utRnMpf%_wcKK%_assJglb_S0vv%?Wtf#|zwK9mO zCv#=mcS%xP=GvTPbwE!}K>c4`{LY8=ZjO1+%CZpOKfUjAfULNhD_+wPPb#}Q(H3I_ zg>h9#EN5nhhRWX>@#NhYT#8mR#EVMY)v=zZnB9k+16!hvh^a1#`Mo>1MtPsaH4@zQ zX?n~8C(i9LeHgk;2_1T`P_OHjU3x*$+SUsi;G!qAeOe z{T2=IL$d*lAb~$aziDW>Q-EiIBs-cU9v$&4z*n1uoqZ|=C2d?S_b;TMkDME1eH@6I0#GNX@Vhv@&F{Q9zeyJO?V?yjrq z2B<=8FH&-pg)Arc+mn-vho2L5Wo^mGcg#{3=}Zos10b|2Ukx-}DzF}B6;othvUBUL z1cXdUsSFZyAm6}pj#7fg;_$cj&)V2yEg}S;PyE?=l%@ zkNT2^=!i=ss#~!%>;NyV7JtEL6LCE%H4DX$<6i{Ttd#gQH)gi0ZAPN8=B} zS92o6Bz6)BU#igBLRl$-xS#zg;%wOEaxXvKN2TmLo(&?KWPvKtz$@kR&6`uzqo(_L z`8&0tr|X@|BVK1(^~(h5@ltp9oEi+Kx3famTzoSwD7r?Zw@;RrClL^za^-v60|nsYcukPQkWDglnLidpF{h!rC=7I z*NoSn|B{wlV&hJ>xF7cNkSiegOHy z+XmV(%bzDDLU-XEGcxp-H~gN5b7gu zQKH3a6JXo6ZQHiHPusR_Tc>T?wr%6IZQGu{^Dt}O`_Dt(cfMq2r7B-lY5l|0J%gQ1 zGefDaza8S*KK>_& z##+gzjOeUmLql9`{-WCXZz^Sp2VwA8^!EHFKi~<<%2{!x>8z$&eqBhro3B+?wVL8z z8jAzU$RnU7>vF*u+jGMv%~t77nB6J;eQukEmzb{C$P9Gq)R{J_5l>qGz2XLGAYtIQ z{lO$!t&0jOJ8TuOkV;}J8e^OEqI!b28zX(;MN<(5mRgTCt`hWymRX~YbeWPcdL5-6 z-Rgmt)T^_qa@887QcBs5u!PsXRgu~i^>J~k<3fQJ>^p2Rg~E8jApJKq7`j?jS`ycV z%)&F?es}L9u`M`IrYYWX!(6331=Np4)Qi_Kkmo12@m~}~_ZmNu5k(!pOS>9XU1iW9 zpU>ww;&87H8(-`HFfYYGF(Jh1>3+)Cmnu1Pq5pHrSIZvy18H`#yCcb9B=UKt`v?1z zQQ|tl*w?8n+K!QQ6bzJ?lj9ix=SzN}X&~uh8yJAykPepHiBTLEo}1Cna5nsBy-uvHN8huHj7Oc{7p`GD^DrYq2_{+^! ztdIUo*~J8+DI8-zB|^Ips_|#et(*LZjCjyuIt{uFc4q0ydsYuC_t?c%SaE{M7h#NDTn(tJ*s=_;#tJu)& z>(z*Q{Rr<%G?iJ6ygrBNF91tfWLAAeHb{=<+ z%H3La7DVXd9SiFY#K%b_VxOo=mI)_0!A^~VsiakhqJr{3e7yfR-v!i~s)qV3Pk_>@xmHha4EyEDx-}ow$ZNolxlYkjy!CUm_x1 z-VrPF#hN(I&-Q^c0R8N>3q7CuYZ3e4{m8ruIlV*U5w-Da0Ra@XwL|v|YExgC zOtUI95?I`>JrO*57fO5YJk6Aj8{4v4LDRVJZe~U~slp0B;M|>P!_)&@>vrtGwd2vw zp)LdWM(F2)(H#zV5|$`Q(S}ef(&WaH-o*h$PETH|dwGrGAyH|{L@5f#ePv98_q9N|7!YhZINdqm?H*KUILOPx72@c(Z#1XMOg|JR65$MjpFAXxpn}L36jw$8A zo+YDrcrf~8&l1eO4tW>iDIoxDYttdkAng-YdFa3 zFs|P>6C8r7ZpXmG8oi3*MDweP?0rX7mo&0LMBm8+&J$K=hEH9P-ai>{(rXg+Kf!gw zhO`L@#E&$4R)T0j)Q5r9?){U$S$T4~ocha|YuRJaX;5q(61cU3BpU>@ee2^);t_bj zpz4?y9}tlVCnf=C7hJioxcIt177t^du0VE!>RiIV+5s!V(Cx7I?ojFOI)FiOl$uyI zaAH^i;6z=BOy_8Q>;B}TKbkSTz}5*V(?WGoF%uGsef5Y#>%$I#^5rs{th1X1Q(tHw z&9>UJ57q(G!GQ7AtU7CmzFs4)G>7b~dahcRQ6N$k2t zZ;Tqxo#oxbl1h-Qx_*aCm7$10|*^i@EuTHOKsiw$dJ|>@8KjUE2ZkkwS_5msd0FR@=;Y&zW-$ z_8=B{z&A(uDm5BejQbq5!jeh2%MtC~T-NH*d=wGI2LEND`;*z1=eY_VV)4Syqg+sp z&;)KH6TZkmw}cVt+IC?b5ry!6aBw#*-&x|9m8yf8a&wD-gg^7NbG+T(J^G&Shn^HocdouET%f9r0-az@ccM@H;yq+f zk$htCa`#~2=CZFc&QApp;|UY3w$9h71F<1vxu8loCPLfA!G@0r+O_#bL(=G%CyR|y zFZlgN+CAN`S0@i{YK@hPdfQogdkG)OFluCQo5CebwZ<^Ldg~C=QwW-KP_g zs76^r3&32DEUm_J9ZU5MKpBZB4IJ7MA|R?L1V7)ck26#Adb#pL2~AR-fS5?KDb9yS z+JLGYrg#KeO56rUpk5d;?+V%U`Cy5S+JElLApMLR+16;Ff1p&<+3++l;_d`QAnL0= zK1IK7(wa)pG)%Of77t5CWT1P7`FuYi9+%Iu>!{WxjEN#dkZhaE(N&^V4iZhDroj;i z7*PaSHl}(3(`Z|INA;)Dv{FhZvue{T)$({9U7ZD-wux+RFtCxU)QeT3(eO5oDUfev z9b`U$K!vqeMi2+zxhRzpW5A$>ox;(K&xDK$LF2{C{5FKkFxPSY&8>2*&99Bo&aXj~ z_cVuST>)XJMtt_6Fiinw*~Xd%4`2K!`92bzM@!`*aZwqW>ATYIG7CG6fckQz z=YX+JUNEoQcN^IE6)U7GiVAbx%j;r((iPdO*q2fXnl`v(B~gb#B6t=}CWO+Dhy)ng zC5f(tp!I9aGG4p2rqo$HCSPX zVvmf>s0}Sb=kVQUci3G`GN zjtf}7;*o($8{!5U96^tl$x#-;ZhUf>d_(A4drN>4j>sImEGV(*tdX0W$xO~%lD&?v01^{i%(*W4Qr{_~b zdaA}L7-p(u&=Z4A#UM1*_uW`$X zTUqDt{4*Sw#d+3&7X_?c2oyQQV)MoRhgNI(wvo}yXBOGB@xHoCkx)R_dY@;J$b#oE zePf-Fwv{I!x31k)HAfY!>&l_EMo*MmGD=Yyrwo_~)7DZzLQgY!rExF2?eA@b_L*aL zu7htZv8yBiekuTPjIM++o0A*h35%yEnISu6@kTr4oUiT~fMfamIyb@|o9!0?&Uk}Zwdx_i?is_q3x{^{`_qG2iz zauGW-6m`o3uW8N*Wz6wRTj_}9+|FSEXVtOW&_7i!mjRHutCLoCt&djYAM zwirM=)|sGfHA-CaWhP+LiLgzXN0NN1?GUnA!jtRX8F@Fz9AIN}%jj3zpgMHTFeR=3 z_ueloP*?+{{%j2uUrZbSrq8@=mOX$*Wr{c3G}pwSV6gP$2_oe(S(D*3dw8kw=jDWE z{maF*d&@^WED{a{Eka?f{oELkqekvFr&037aZq=f67{s1G#ubgxZ7KLPTZU|3(HB+ zBey?2cu7~Q!gX-VyCvz)-}MxoMgfpiu6*g_`@v2gP?%Dtb5v6+?>XVz@QQl6#b82q zB>|1g`N_15Bj?<1b;GUrg2~cjfq83rnQx}{W3x0>=~!{2t7k^Fw-PAZAWzMAc|S7= z(pGxGWLRLvwn1oE7XOD!856Wa?j&cF!|;|0??|Pi`Cttx|7XsoKadrna<|0ugDf>b zL?U7yX`m}v7NtE0XUEwG=qkt!dcj$Vft&fxjDPha$13XD%*-#)a&yO}=P@AdByi_> zud;qC>=BL=;i76YFN%F;?vmGCrWfp|4r-(<&_NzFcJK#zyJal+L{Xpuvp5gLc)Ez@ z*!J6Ty*`V)4Vxj_x)64d3DN|WN}`E#umxnVRd|puQ|%SGjh`BF98SZD87ymk%||<~ zsXIm`>37bb&}T`(5Xl`j^LPP9|6b3kU+a!gySdyS2;cWpiH_!P+e&vK87B?P@aWUh z5T2L9Ty4%+0>8pq(x5TjpOUFnX}9t`9^ZdEpx4gXVPhd;pgp1(C_`OWFFuwM^eQ4cwRf$;*f4bmt|RWc%efiu?8he+i-22o;KwTR>TpFp*6N%@>sIR&w zMmAyj-8``Yh?!}<3I&fbL$mljgmI&Z({U1IL`N~2zcY^DD7}Y#BYxqlX_Ve>4Ez+! zez3kbY%IkScvLGSSL7v)a+r>AvN%R+T{b-2dLPuTdeN``CKAjyG4}_YSSo~~WRI&Cg{K9v@Qd32{eJ>mRAH|1Fn|At%3n{F|GQqy|KEDKDCyX35TN*+sO5F7 zUNco%B=d+&7RfX(OImTst~HfMBGlI+lfgiYrF?$q*e7z}9{~csWI4@()|f}PVd2NihjY{L9aE#T#Ixb}?$Riz?46iH0QQF)9bvc(Ld+wqc33 zPZMvKgo&qvm-aaNC4qErS^+fXNtQ}t$r^&O=xC~&i~A;7m%wP?zsnW=B%L4OSA~-q zB<2BdmeJ0)3~t^%-E)+VBUSQX3`U49g2SC+VInDef;tOe+9A4l8ShP&K~aqy(C*;H z|11j$4f#Q=9~hCq*dXBA^bi<3V4=8#`(*{krt!=9p;^CwJ;at8vhgcH7Rq|Z72KTa z2PnPl+6vm8ZrKM<*6cu+hv&?FOp;U=N?w$`veKKv4-4C~_V|YqHfz@3{>*8-HVJvC z?=^-Izuf!QwM}q!PBQG^6fex%yYo-fFiBT;DPVK3!Y%X{_p0)^?qff}%bB>|>5cF~ z`Y}TUgRQlKMON3{bhT3I!m%yz`R`m+`2g7z_9bsRTjWQ@x5g6GF0Q;Ce4bsjw#hVl z$BvKvPx@Z8QijniJOIEDI{*Ocf16u48Q2;d+WjXkavIypZbR(8(|0&W2d7+l?1){#=vt5}E|K58rF zC>6FQWXcU|ygpe=7qE5!`T?8dnF;Jsnl;Ev_G@LC1sWssKqmjb8gZHKy zYIQc-DdE*(MB95iE6!04!-@zs6v=Z@d+6NxK2rsgnxv?DQI(R!ZeU==a0(>e4w(_M zgWCXO=}FBng4_R+(~9!ap?r5!Q{;5ZN^GD|;A$L*JS=XIsbH}ohJd#JIjShHP=uQ+U{Q%))h2r4iD!6eY@p(pxpc~dyhP@g% z2W^B%)CUa52|*k85b6EXO2TTV7o1+O?JwNF;wk=FCWDq2j{HCn!0*AcgjUa>+#nP$ z)uD3y9dQ(fXPg1Y!egvylv5uQ4sjOC^6O{lFf2f(gs=mjZANVl;ylmNAJrAN z{@OLnOh&aNb;|`&l;>ivf||F1-k!j!2iaG)kAQ6`aj`TWVhx%WN#DfB_TtQ%EQY6X#O&)iw>3*OsEO3*sz*9U+D6(|@xAytF&p>PH= zd{WF&hyW8$>Z-;oo2x3bDo(+yfGh!{GTtANBE;01z$zW{RtMTK*MB@vG|&~L;(Ql0 zV4qSA3c@MNBSmi4f0(f)mKWG)F&a)9GDd0lDhEg?3tgVLNQ9to&6dF=0#I}mPHa%i zpleEVpmMm#?DWdOT=)lVsZCp;N|AM(f;NEb)~Ia39En60QFu|q9e<S{BWjJCq_8 z)7%f z$wHS136^~xZJ5B8Fc%rgC>{gwQ{~-OQI$uHX-^W*bN*{mAVnlEu15K0t2V=LzjKts zGEG2OrU@XXY$rt7IE}tG6s{%m^hn5IvJkX#wtb$6&|nb7R7S?Xc+Rfl(AQ?#796Sk zlG2I}o2*}fu7S_V3P=mt?D_Oe5%fe`{>^a5zd;uZ{Z`-oxi;RcD>CpJL;26qJbr7w zF{CPxA`umO=ABb)?Lh*fB$=fL9Lq%IYecM%3)HZQ$0`*TSRF8Mu%0?W$4iEG`3J6!kV8(fcv)vjI(f+(7(R zLyNDehY##ZK|BA@ozyX~|IIZCs;!nUgpLFNhj8(&Xoy9I#37^*MhPrDHeEW#)>w6x zh1(+ppJPwubj;VbxRijC-A>Ky5j59WEiu4>Ds=~}H{AW@H$a~RvX8LVK<#Zo$Z%1u z0EsJT+ni_H=os6Jur$zG5-J9ue11JUxXH6c$fs}4v>JEXx>p>R^p)zK2f~4_7rdRy z56L$mUdVth%O@2%Dp>dz87j3K%c`}E!csUjkTD~q1a}FPm!8&sKP*N{Z~f3-pl;zesMM6|A5)G$d@}|8ipgTU z$8)?e>OI`ERGx}~TSXL^*N@Z?fj`alE-X>?cNbAZqj(aD7IQ+F-A{O2_ylB`^JFdZ z8M;x7J<6G}Fjt)iAqpaG-C87hlvHolsXF!Kk$q2JN=wRSQ8M;l5?Q6i#J_|ogmr_N zWA4YmP*Z08K-25j;Nj6(Jbp;Z@eQi5o{4C)gI$eMBigNgVTwzrGE~B=K&uxS*p^%- z1LAeQB*-PpI#=;RBobgcY@FRwEV`V~$7c`$wtx6X+v&eFMMKwE#%kpCP+~s}NaQn= zTOo_iLxJPn_K!30Zrqs^tQf#eL^kuOIAfKyaG-#{R+EV+XmwAQw=-)|Mn+N2`OZH_ zSR2Te4(8`_mA@C`G8@~Op4`1Z;RlFQ++>$?$B5I(rSZI>c?qssV;s-_4)m}B$@6Uo;@EJs^DcXddi(g6| zju*8&K;=sd0$lW-%I_lXC@(~aLyntes-BscGcJ$I!L!zU-J>|dH+vN45MZX`OoQ21 z8h;FN)aXlr(*VOcZRQD_j~A3eRP;IIPhtP`Wht!`mCoI?*hd_bGPuJ&VQUVjIykWt z8}Y>Ljwy6_Nc=W`GoptjicfhXZpUD}@fFc$-t;YeIpj$y9vM1Qgi{#mbzi7t1PvG#uo<-jsrmW;0qVi4vMmX+-Co?E^+si>}FXX_caN|3PN$!i6mT|x;w=ec~U;53n-^oAh&%kRgQr0w4|w! z-N2X#d%gL$2l49r1)IIP4F6Gtx%XgRvL^#*)$Or^&4ZSIg?#~v2t99HHPjk zDNf=Z5cLEr;qqS4lh1vD8sKdHC;)@soZKwZ&gPycz{YltU@Wb%;%Ou+C=g$yDQ4G1 zf!5qp!GbtOk<(C!dHr9`VY;IEHn#rE;yh+eN0{LG zg}X^KFLTISJj5P;3#3PGMQ0|r)Ct@MYkhUarFy4ek#Znw_^9(KDXDVV*W97mM(Oq#&}IJi>NCF}W6hA23<4?2pKsBirR>}l3P|<2Bq~XBYvY&MqJA9r=$`;X*x@Iq^a8b?N$#? ze+{W#E$2|=8+jZ`R4hKf$7Z>f*f?+yna8bk0lE(|re_n;5N*Dg;64XHi@<~0dzW9e z9+oB)cNE_`Go*dcaJt)==f1{xUUE|{hqLfVMao4q^36x(QfvvIyGKBi2;MiT(!&2$Uy}*ygs-tfdxO% zhDHQWhrAz-=jX+Z_J*T8%ICh1M%x-Ef-g)OM>9+569QZcY`fGyL6s7%LhSH8W zEPOkUPOG{?0g=kPj=%Rf9!iMo~tq1p+9i z;T({In>u~pO^dNsUx@A9SU88VW251XNAhN02XIud1Y(2g6{_@>@h>ltt|34%DIzPRH#fiV14*Uh)aC+o+y1Bg`kmz)?aF$j?YAgUM#0Yqs&c3W_ zLxkrzdFnCVMNlUd!U0u!80p-FP`FjiK?HQX&Flyk>O9~o&KI}43X?L@pMlPatv+#C zrX1U#4EM!TJ!0;{%V(dOKqkn9Nl8Pv>I}$18r?_%9)S@I{j{5`lM!(NVYW;o$s$Ue zOAhP}2AzR@LzZuHlj}oBfS9eG_IY}b`cHOL-)^N`57+KizgQ?5T6IIt)G4;H^5lV3 zo=SOhHL!(1>&D6%%)KKW#PwwTSRrtJRfmdxt5-<9@iajCkUmEh;rHlVH^pZA`#;7l3$HM18($2x$&wW z1R`Xueb7?bk(G`yZ%*NR_hYz};f%mvl6+=~)O!0Y4);JnA}Pr$H| zbwxGbPcVjrl=S%q5|ZitH-lWp+|*cSay%8@-VB$LH~!#tELKKQ~%{%zajn) zm*-^RY(o3XZX22Z@-M}|-pCsq|M5nK$p|u5MooBB?F%cQh|_K01ff6+C1lvAAft%~ zk|d|5dHyv=mK0SyM1!uPV;g^SznQitiGWpJN@V2Q@m&Mpt+@F6vsD9Tjr0`NAeK6N`e4m9)iU3j&P@USB1Vh>%_&O%q53+q3g^l_rknijof$BP z)O5$(8f=;D?FaF(%JmsC+(e$98B5R&lKiQ7gG=prLL@6Lkt4q<%cirBWnDoK6As-4vXoUQ6r<2$P2s+R`F_(dhZ8E@1|1KDjq{6% zf?w^{odnp8`SBR3IJ^l^AmALeN?*=fKhUszc*-bHc`~Ub3^ADlYbk|%Kxlo z4nFAX-7pE~MbpTW?qP5@Ryk&tTJMC?NDY8p5D-Zxo1`mG7tpI_(f|_sr=tGlmYC$z zwz}Rb*r>8AmERPf{><;Ov#kGz4oOK@t*nh?E`k4SsC+rDz)Yic#GvOfeWHt|9(7_* zd*XADoves?)`JM~-iB~M+L*5>%4fm3zk& z$l^+YaBmq>^Ps1?EV5mKjKsL&oU)|wfniN-XFQ}yku{4SLY;*6RDCahl%$j*kq?&1h+lco4WmL z?n|lbm#HRdSv2*e&!FZg%EGQ<0Zy@lQ3F*m99nZoyfQ>zuACFK7Ebe*GLZ$ni-EYo z@F;vr6i%9_^xhzzqQ<0n!SxCk<}ewtp-ok)06%-;AgLLhw%K+@)l z5=Qf){z2r;Mg;_a#ytO>z?j*=-+V%Ga*60QhrYuK(_%e`~*M~G$5puD4M)Z zOE|uqNAmD{y|*HQ{0XZ)dE|b#o~sf;xEOc89H`til`GbaPBl%AUE&#T9`!vd*TTBQ z%$m{v_x4(jc?UinsVebF0dZ78P^(_!K|RFi0Zw+1&g|FDDy_l8y|gh$33Y0XL@V(lsr$#?|_;(qVeAMh@r}x!WXtfXplb`@0kCNy_pYMr6QO;Bg!B*Fz z=|+lb`@k@ziU0%m+(!a3ERDKF-5`zVFyT~+_n!7Xm;=0C^pteg(^@J$%2|3|cnq{|Uwh;Lxew5aZ~IAOaBq~IEr2}O>eeO^fC`*A zdZLW&ZRVeic+hTqyS}%L8IWUshtXjFUZm$zrpb-p-=DuWQV)-x@hV6NXsQcr6bPb| z6b1oMu>c4HD*%XtbeE;$>3~B`F#!leK%i7$6#}uOK*8qvpcKUq2I5_ong|vjZ#iNj4|MJXVu!R!!NHk;}-L(`c>NW z@=h~I=arBZjrC{IWc7#&E82##wzU zQmIBs^}bBi0jEOuq37EcQPWCbV{D*+(Pus_OaHGbjacv^DCx!1`{C>*9I94&W0J7* z&lL!?$q+EeUJQN%O{0{v1Fn%7EDfx`HVT4-B>6-WXoT|~@>bmTW`{{E6&0bD_KR>+(iP zp;F*beB?%Ll9i9y4e;6{$9NRk&`e?b9YCas8$ex{X%+&&P}bNAGzXnjt;6ig>MZ~C z_}%irJS_%IJ6mX?W3L^f!p-+*pD!f?@kiY;FB92#`Uy z!!IGo#f}JC21SG)z5L(sI1K@_*AawQZzPK^ktXe zNio#FBIe^7###|zIs51b1uUG<1qRt9NjlRDZfcSf()!;-F3o<6ebT9s%qO|k5uAu_r8KI(q6U$UFhg}dI&n?Y)%C6E=Y~f zD9BC^s+gp;!Zmtu3R~43Gz?Tv$ciztHvA5QLtDAxGp{Eu$Ba6S z2JhpJX;Z&x=MAPyVdwQ!dyu>7pNcAvR4F>#+I1eptyd)Wq+Zca4pD69I(@h!Nd) zOtF!b0!W^(XW3y4inN(fZ3ON{ONO8xtoTh;kZHA{+(p^4K$PnxbiK!{RHq?5fOAYO2wWF{tLhP$p!Ms> zW9Rxm>&+0REqVN6YdG2o(UsEuAO%2Q=W6wIj#shQ*)gs1`8iSh4EomS7wJB(U-x8g zns|H&p(8KoO#Hl~@9Uc|2k23#kTppaIj#?Fpg)RwyMdJ#ogatS@3}WSn>xKs@#8%# zk1TTrOF8*Y;4!&)ELdk9vJ2stE8(3Z+ucsvUiuZO$>WC|;oh$qJ-+bd9&Z<0fKKx) zsTnVyD`PYZlefP1+;%Kg-{03kuy6C_qFW37L7i}pf;M=FbWB6@cIw@ zwU%@e<%7FRQ#C+!-1mpft6O``&0qTXx*x(-TZI@!Rqfl1+`2z8YvoC7@G-CQ35i5F z4&mRFm~HBdwzLx^?5l#Wsx<$_Uhlg30RwZf>5VMUp?4|4cX*G#OO!gX7ZkN^jxV-=3Oi#fv z*OS;a;3H((ga@l!uSEZts2oyJi{3$l(@H9YzIOc=v#uEd;XsGVnGT^yUkh8kb+vIT z#tlEkAlJ%6c1!NXozZu55W!d4a@c4 zsb~8oZDjCflW43Xk548H+R;U_t8$O{0Rk6JR{Mjg2v#+%=mF|#dz%=N6fjyL|3p=T zR#tpqdBrV%O=d3}(zGo5>Kzpgf$ZCow7#`0NAfauJ9iWKThl4x0jO_zjvi}-#@o%TgY7M8t34k}t)9YbJ zGa+RWs2Qnjl17^3UI3epzW8PN*ri>G1f!@EuNVS(Csao2Jifp0v5nGW?bp{@z@~uB z5@%51zM~Ho%ilW5O+V-j@vb6Ny1NbRD*`tFVL=gZ(OF-YMtH}_*sXkee_5CglFL(o zBULyvz zj$NIMr^E!N4;4>DzECC(J>H?Y=JVVF7a39_B^@FSH>1g~Wqv`28`!feUtw_cFuJzHF6TD=C5EddWvyDr4!wFEyv zaew*pzoLjKkjh!3CP#oMzI@RmC}`?K3J?9eiC1dP>^E(`)z|eB)@_DL!V(fljlzeJ z*of@2P?pw)x*{&CkwmUjY7$Bbf?5+Pq46SsYD=);@r`(wDy>V~F3)YXLQ*?>SAh70 zl>5@Kr$;q77@3X%Amh^$KST?{9$2kfU!*{ zHH>%vhPnehjyz{V*ig_n|FYIVv67|hywMuPU<{f4_;k{6mY<-cKo*nx2|#qLQC~r9 zpxM5#YNqbR4_AG{3;GQrCqnfP{Q&*<-jb-7F*NzbcyYhuf7)JLO&pyp>}-E`l})rX zls^NE$P1^a+tOcf1Z~e4f2^W1SxH6y*4A+B{xu$qZJAZ1sP?8QilQtN5>SSAO?%RC z?g+4$@R|?JX_-(Zg+vBpYN?}S8ge7urIl%J5H4}4<9G1lSMFy{y7<`BJ+S}&uErGR zgEB|}fE;`P0ObG1pl;?SCf5HUgD}7BHb$P@zEHtU0LN4KinhRDH2zIVCrz0jVA;eO zYO#e9$)g!X8sEgU92xw4Y+ELPqWM{Ny(s3og6l# zzTlmNF4odXiagL$y}aY?MB}oUP`0yb*IQ+-mycTTp=^rlsF6N`JHIY3S8>=W@;ren zvX_S!ZKRc|KNYa6L8esRnvijRl{#%5^>B zeC#Nzk!*!ym#*xfYG|Ut6HzSoa)7~qwC7Os`{{;XiXh71_x=*k)~$rhuG+p?q&nIE z6>?PATq#_WtimU~x6>A_MoCo;8^)7(7o+ii*>r!?we$G3hB8ye znF6!Hpu_MX;k@149xX+QE$51sNM_r;rqUNO^E5xd9UIN`x?>`WVJu|IY9+Pv#_BHo zak78Dge=M|_}K>vlnYmXjNiGM*a<+WM-;z>zrg=~|BAf`zfsD*LW4&69Ibp%y8!w2 z_WE|s*4EbT0#^wncx{`zzs+Ju97-dT9MC_!CD?BVD3my$0_8(B5So=lq8;)f!mnY58Nwcw4v*i{n275J=L7LTa%Z@63S<#k5JZ6eB7hBQaquaO0$- z%v*260tAXno+oy-D#a!UsBh6$z-GKrZ;qOk?~HU+DT0@xP%HGOS-(j+YA&53vS4&F z`^U4LH_33aLeq_7AFoI;{75n&m;92|*rUYCL*E0IPDExvVAwI=`A;#{0$q+E>vDjj zw8P?9O98#Ixit<03uNwY4vS4`2Sq2vhuKqYh{1aWip3J!XRDYo4B^hwy{5)A0vu8{OXK6;vv3@u-Np)o1p>8wxO6B=y4;`Q46|BUw9-uM>Bm+{=*WP z3J9*NdACMiHCUs`6p>jb@IT5r@Uzt=$_8*2E{&%`fH1P8R)T7B;?pgs{R&EG zTri&SeM%e&2dq9x4ro?|9tB7?sj*7f$BA-OIusSX1CF^Ga8tLC?fJ>77StnVPiCtn~*P?ZF4HR-DMq{OQ21x)cn=8VBQ z>A;W=guHs^vI9S9)LRmUQszoV1tWG%O%wHiIrSaEoCB3PBjxhfqW` z4~bNNbI0e-Aw;#$lr4p=&|L6*_D?0Daf1_%mc-Napi*s?QemtV?d>Yw<}Q_AtJ?0vco#ll^I-DFwr$(CZQHhO+qP|Y z*{V z$US0a?C@E^AJEbKWV05i75m*hU7g-{z6P;#+013s@fyp&f?))IyG^+=593-_C6jq& zwo3$nShdg?PH;#=6!<>cI&RUUhHat*h8(kF1&U|&`~P%}3xw2eUer-AFX5(JnUH7PM%Sh)JCRW{FQXdT)M6o$F9v|rQPSE%Vr zCXIt2Qo%4>fRz^l@|tyJm@95(y+OZ{2j`)4HvcUiP8c_(qO_vPg&Qk(dJC~6*^A}e z1?0Kg*}+Hq@DE8|)>*?^gK9lZu;yV2FS3uVfpi4>27ho&hu1IMi_WDW;PHpHsf|Q^ z<6@Xi;cWUPqB)*Rg{uc2R>8GL@;HCJiKgnsPty2I(De|@k-U6Crd%-JK&8vXEBsZ9 z@ar)OEysbF(F1r)k;M*1z|N?>T!8H7(vY<3jX!#Ch6 z#tnDgU!1zNVdx+-Y$NzRo!PhTIhN6*-OvB$8&@2x?bzA9#3nP`Bt}R^FXm`gYvPPgmr$q=2ybXAvX4E;?Tf=ftZ|iT-(2x1>{-p)k;k4D&|&H@s;A1Q>k3=2Z*voE~e;P z?iIaT-2u|TwXPauPZv?LG^7GeNI9#hhC z7ip19?*RV!UP!Ye(4cE9e$C6reI!YZB8c^kDv`pVe+-zVv>MfjK*Z^UI9Bvl8aAh% z6ft|l`cHyzci&Ji_MH$5P&jUAO8Ca@3tnZs}nBx_W0%Xh|+*7zN&zijqPc$fYB~u3P z-I|rDlkHE7W{tR?MCCGXV6Or;9U8NAKsj?``vyJw@}c=vBOTo7P(ruYQN

      Z7HLzWzT+4*XwzT{HNQM%^U<0QV?hfPX^%|2ysA>0tQpondGG z@A#Fkt@kEd)7dMZ{4a3zR$WDil1=$_n_Z6Xn4{J%7d^XM`}U#7^E{GmbDBhI$(4ul zt$p7k7y^Kxq}u|o_f2gVwloO?09f#V0R#POkR@N9e3F41Z*(-%%q&>*r96Kp_%F2E z!@6r?UaqgI5>wR@Vi07(!oMbbX?Yb$$u3z^+z^2YN<>?pkir8yVi99cD8FPZz3X2l zNol8uL73%h{S)0mr=)!Nq?l?UfV|Vu1u|sFAW4G&7W1z7l`t$J3T6?zQVe3X`njjd z-Vy2E%`E!)EQ(fIIzn(TAY;09uRiM$lpzch>fAf zAE3NudIlsjmy>DhCm%7w9EHxzNrcb=jvE;}fV`E|1du4F$7tv)blvBHm*a2UgM-!Q z;QcrJnz65NLF#wAKQ?!ox6K93KLPyQi}uQUhHmx0Jun0!**EFofAPA#@ND|Nyzho~ zrp!a$xAXP;)_FM~^m-s)^tyL;H+|7Sz3JUw{C(P9AO7r7s`$QNFs$u*H@ZVO!0Rh! z1KHZ6U+{`k(7Wwk`M}G!<=s(;S8?e8z@p6$LYe(Ty@AMaXP-q_#vLUx35 z+711>!M*DBhGyChwfb*xuf+!aOZ5hi$T_vw6NHY?t$2#s6If3F z0|UVr?<-E=6<2@)cRCil-6cNf*8U2(1-Qaaoe6Bv;2RR&oz;W$zK!7`IUk?cMJv7%m31+<$fxBpq5Z{s@+|ALV&UK~&9 z24~SD6$OI&joe$CdB@F~Kp{)sTUF0+&oe zSFm{ZNkvf~nA{88tH7WoOJd}`*nyRMC|r!1fq4}c3zgAN)F(5>q1(?PAJsvi$Ct!e zGkXZdE!-o%1yE3xLF~@8+5wQJ2{4qULk#Ze3(K4bi}1QjK7DimfHlwr0k|n2H2c~w z7P$JIf}VVDo=XrScL?VUh7E71-2oHhfaUWsG5a}t$dosoS<4?8G!uz7_o`A4FW&YbiF!F64I}`|CmTRb#-6DtIL1ZOJGUAyx=3VW-|%fEOit?0y1- z&0>y+QWfa>PE3yk)#gzEmgTRKL~>T(z*wz)0D^dblUzW*7;%X=N?inIii8;(8p&(BX(E#dQ>W^k3FfdyoGjpAVC4#V-00@}kV9zlwdipuc8^-mR zEWzjPFE!*pIN+>fVLN-EE%`0IW3LF5ib zm;VLdPAKlC!3XKB=OXe^ClNq~E^uAO5DXfH&*7B2V4fuT(|Y(iB)!0zB(xrqG0!-G z=h^-PMcm*^0#ghc-?Yjnx^U0hfo(LwQD_@Q5qv6?61LKArMm+qo z#Ss00^CyB#P!}0p?ai-)?7gueTq>wP6foh^f8SN%>IV)rS#fi}UE_F66@b{pA!`Df zO%h0#k*)OHmN1n?F*d_zOJE2!NyVeGNxgb0GOX>4q4@$x~L2!iDYH#~a2 zvt5GZgBLdX5WCO31mV>?tUX#f;`x3^qI=LliCIm(5q6Hw^!t$ff#40oE%wP&_s0A- znvK$Tq<$2x-0Pcyf6Vn^%15fXb$A@07XyC* ze6uU-TR55JFA)al-9f#Znac5dT(#mZW_xBE;wM|JZ$k9Xzpsq%MF)xNcvHrBqmw1* z9!-Bz(fG6jTYyXkVvztzA64L;*KLdfF#l-9#R%|&q(5q>Pu4U} z_Ux6BaS7;e!YPL4n6aGO7q-@xSnX`{~lF2e7rOOkHMN1y0~4L`FydWxz_ zlPym+mz4az{vx4Rou!$id^Tl+O-lJQse}oDM|voNhG<(ezJ-a~?8&BN!cfdRJTh7j z_l-V*B8SVON%|Xxyid_+h66BVytL#{iF9JA&!C+ryJf11=IAy`fB6jLAmu%fKq6q> zA~wh)E&k3?X*grfMp(emSsUjFf@;zUBKdF*(&i+jmY7%CpAEM^4=R&9kVi?DX;yyD zz30Hlz8KGh*%-VHT=Z zW5OFE`qB>FT)vddF7?<43pAM|S|Eh}EDdx;JV-oHV)izK*dupOlkbn%@f=A|Gm}c7 zB9dORWM<1jAc%~QXbSk;?q77)LB@z4mOBRi_fqo+WP*R_hX+l5(oiTQPC8UBt*Qkc zr+ynDaUzVLc$s2?{Sru=*?Mq-$bm$l7ezX?VDS(L3<{UY0=YvMqVOV(fsL6neH1r@ zWl6M>Dp^fLC<#-+@}hXrnL#fy%6b-tK2XR3Iz%E?sj;&olvy;?KH;o)S_~Mlf#kr@ ztPk*cLn!6wg`bEnBuQp6Cdl6ZqjJyy^3CX|S6To3PRf-GG$$`(%k*uX0wL#U*}Z!utj zm=zQ!$pdh6NmAs(6T%Qh*Iili3cUd0ta+1mbKzQO0EZ-{!J^M{Z~HO$UR(O8Q>)mL(UU-rw0tU(vf|IIR1ud`Fn==@NYN=N)x5QVwUKGJmg@Z z9}$*N_t5^F1a?=jW1A$k!cK&&qn)#DfH>oR9w7oi6{#?>U7`!6`qcu_p6mBBgxLcH z@4Pkn{b8px6B=%uK}PI$;y2{5RTht~HUc@!y4Q*kd457Y$YgGrNktgZeGt6r0YLe+ z((-})qCH0xp2#4$iz>-`iS&vh-~PzqDB!;_45Y)#-6&;Kj2dSgg+hDAX8F&BE*g6B z@(+-5Mz8YncN28HXsi)^)5IsFdyS; zMF8NaznODG&6*Sc#&I@skXWRPk?Ed#sR$NKee?@)xTw{@yQkEVn2gr+&q@S7os-jy zC{t?(4GZeTEx168MU@B;LZnqZ1I>j!9W2T#xTWyff#$Y8$BOIwyf5eX{eUIV12Oj% z*~16TzAWaN|Cu{XMx1sN$2wKgcDe;By#qv;my8VJUIk|)`Z6mHcQ==M8V2JI)_-7u z77tlRG*aQJir$A~8l?6(G_3`?U5>EIBNG0eArM|5BfkK>+^=xe$+~FK?^gtMmF&`~ zWM^dp7EBAp#;UPfa<&Cik1RZh4gO5-?xJ@GumD#)84yjHw%AoNaCy&RFQ;?^ko;ny zlN2JY;6YdI&4EpCP6{Ntotqtr@&a*94BQA>O`oPK{iBJVoK%0mA z)#7GR8HvWPIcUPK38`J|zC+qy48*`Tux z21zL!t~Ql5SJOA)g*!i85aSV6>+T%`WC!6-%lkV9?Go8td-%p$yW8a(BeC!l&nIxEQ~1M4{OLH>KT68f2A%a!KZS2Tg!gUw=r!^VuhCRK-ACErNpxOH5Mv5HWnU ztA(i0cOE5W&F2B{B(8e!Fav7rHTG=>dMs_6MvH=|d|Q1J1-+z>ZfzpqAB`kak#3Qm z;4ELx2n?M|r#zVIua|X2D5>EOQO2|zu{v2NhilNZ-xf3)6&cZ45{{{0uL>`&`p<1k zJ&K+Q%l~3o^+ajks`r?GfK>qwBN-e>cmH_iy>5wx<7!dHe|%BK&IZ&gmi6gJg-IT zd2pIJ>wY0?VWYtWs~(W*!YxFCTjJo`u{lJFS|n|7t1b@z%d-hnTSc3JM2j*&zbllY zNO2u1IfuKUT+OL|>r#OUu|C~Yb>f(C?&zvrPl&_8{=M?XCJAF6p<->%xC*V zs=A0IZ=1J4Q<$jOjE#%)?iKuitPH!X4#qcrd44sf_t5jCHTaszZc@|+N5OmMY0r%W zIRp5{8Psc8c^tAPe9>k##pPQ%2tAawE@oX4J!&ZNmMyig9=qggB?xpa+J~QD)h;H) z-naMmP${gZo{QLV|2CIeFI@o5_D&FU>5q_#5u5jtHghKNMX?>gW-GKs)M?wt)GkIm zGM*n-^#AS%oJjLT!axhe0Zpf1Br5M<`A}jb}(UVX;;H`W@2v6&ZZ>a>JHB;a1wIFJdt5@8*iMG)ldXskJKy9(qK71ua z(pZ!aoEIwj8#_a{;jIi~e6a0l8OjH@vcVR+H-PrKtBhKXs!etWzv692Zm8b>Whz)~%omX~y!n{mGnfEtm%R#4&nn0akp9FkG z1?696Fk9v@Kx83|FNX*~-(6&a*GiBy4VVrINvm^6I26=bfIGHe(o8vpELq{-NYSlb zic#nqSHSh!fpx~E-F%Qfjg|PBQk%tM25IlyaZzK-2C00qm!e1|Y&e1*q- z>fEDuk!pU`+5|S-uf9Gi2>{QRxsvgTAsN8NICoVgkFMZ&^jC4s<~ogc3*;GpS_F+N zqE0$qEnAJ+Q%6a+8aArpg5oOIw41G{oX%9zQ3|nDTL`v4!$3ay3w1H%01~w=NLF4I ze-3&^m+w45+k(S!NfXGtpf~rb+NQw$8UPl8scc+<`E%t?W0k0xlqhV#t!nmb1`FXu zXhoidkN3C)>aQnU=U5g;;&lXVGad_@4rtZ6dWg#f4E~LNwA_5hh7$hH~}6B zMi$}b^nLr3+=-2#!5E)PGyHLciAJc+Sjrmg+JgghLf49nlTOiXG-gkvYGw$74O~F> zGelfPprc?67uV*#CU?}>d4+ZE0cNMA&aYnZ1ORb)jLv#r-NHUuM={=u#U$pwuC4FD zcD4~>6{b!*Oa#d(?+M3^71N_EA4c#l1RN+>mSrufw7%$`cj6W|t|nNKoW&)ALXP(w!vv$4nRmaXntI5Rk*Q{Y zAlm?|z&KRkK89Ff#NF6yVG*>D8lWVcE6Y?T{^3r@WbDj5jZ;U&%}4kL%|~X!^Hu6K zz%cytLDQ?cv=21+F}v0{pbfpkjt3ggw!+Q3RJOpngr(2VTU1>RdwFAtdF8>wmb)<> zSToblZi0;0cBVard;UAgYUYbKaY zOt=X11)GQw%|;Awuu<3}D_%wO_ol5_Zct>rWs8CecjUpCR*ae!kxQ+ZG_*^t6f@nH zsL%8Tax0v0t4gg)`lJGS8Ew&qzd+9hOkp9nk91jgOq++E=+~W#aEGZPxJLiZFfS#t z+p^^h9N-GH3(6&Q*M*n4WXti6KC@J(&W(Gx%vsAG$1Ou?&H=;XHiN=>6&g-msk!~; z)D-<1k=qYUXp~GdP_72iczj>zadlr@T36 z7j>fJR3TT`A+K&M2G!NxZTC!kg;cGS>yKh$iq^N$F+CiAXLRs}^pc7eFRn z>MC2qE5*_z8*kDID}>e2@j;g1{x$mQkBWIB&93&8om#S4UmL+`RLF6g9zsV4bn9jb zWN4i4mhttT-G&?#%pyu5h8Dv9aiK4AsI*DMpkmes>=`@494?}ezyCZHg4WR{>d{&@ z-&Gg&qE>0S2efw3d}n2Q#TCD|H81`KmEVxqF9Z66Bo(QVw98g1jS0WpXlan%t)gLpY^SK)ClYbZltvZ;XKvZ`Ygxj`hR zMqDz%Xt-m|T`DV9N`5Vx7mTXC9l%k<2GI3=8V{_JZ;0PDmQuT`aW1Hm_0thF9xin( z16(Ms<0Z{}DqQZ!Pvvh#hnbr82b_fgIIyTe6t`nsOkDCx!cLr&fw9i%TB zI4NQw!S)=mzZvQ1$;kP4X2eYCkD?!!Yzh(1ezPH~pwM)`iN~G<(~9~+k6?t?fYvK5 z7F{8ZPQO-5!!lw)C(f!XGhHIcZmUS^#!CiRmYiMjZsnQ^LSivOW`)U?Es3j%f%UGr zNNUo(Q+Hume3sD8zPp|Bnnh^b1Yd_&eD*a%B4Qii*1KeC>95>9DPRGxvf^wHcJ9>h zj{I$y^#etbb*(A?sIhKKrn7`Vkb~DYCm~-KqS3U;a(M%3Q9(a>Q@<~(icgD*Uxg49 z{0hM5f>k|ze$HGZC)M+`N|+{Vjk{y(P~{Su3A-Ww8ivrRqm8=_UW5;zw;Y!M6O(7P z)bXNmf%Q$?UPc4fuD?%}NwU-r1J)b~Lxyh4;>`rzY;%(}e=ZjL>tzdf!py@P-W6pi zxC28PuxzVDo1p?LW!v6Uv}&R$Ba?dWWnFE!=psKtFxJ^$B7;(nVGm2A8Dv~q46vdc zxTwWxY%J)7_RZUg5?wE9h`vh2?Se;4t}M^N9d#pa>`4I8RBqAgfSsE_Os`xKpRf&x z{X(sH$eEcaO>xrINIILgO}x}xur`halI>jHQ^uGj+BgkS0ZzGTTf!E6JOY*w|3}UL zAZY}e#Y;`6R>n+wyKb3#dexL0MgiMn(2`|wE2x1j2^HWackD##BowGe%yz0DO{*n* zr-MLk8R%LuXM93$M}Fz+tTV?M{MEtp|cx%ZMNm#++6+e?BDU}_R}yj2Sb6vNIG`Y)4- z33U55lTmLmKbUDvQDX=jIQ>Hxidl#va}|a(m>8?`zxVXs5pNdDfbTco@c=D1vCS`g zsz=A1-PY)JSmJCB&b9`3Z<{r+D+lfM30i$EQ0Kqgs)x~MW{q~;(pLB3C8v5~2v&=U z`qc~G9!DMWR^?JQPaIG??uH24vI)N_i^u4^9$TV1u{-xOP>1+Y z>8W}^bHm$K_eccFDAsFV%sn3vX!!$A9 z*Thm^LV-ApxY+Al71IuP)HBY=}dDzhhwKMo7!B=wjf6H2lHejVrcNK zzrJ@Dq&4kCvE=9cmsi-*{g)F8*WKt=yD(hwEB8jAmN|KG#?e$-EgCCQdiE}1hf_Wc1NG;s2wj><%6LX#UL{fv;;M}?? z*EXKmeSF$oAfa;v3R;fG&#T)BdqkT!^ z;~y1K^D+JY8s`)vEppo=jxp^5nJue%VuEC7 z1|>~2CNP`1Qebx$+QcUl1eQk3y~o08eL_uEp!bwX4ftob z=&(1Q8DEmY7-&A!ZG_JlHHkM1ECBm@BDfe7xOu?J7@*84)biGs=tSy>mdOG+5kBIP zn`)7a>PBR&o`6^u2Z8WU+iA6^8v@9bsoWjPtoq;SCpMzfi{c_T!>&ht2&w?%% zO&yxA0bS~kPI5l6|NU`dO5*9&YF=tWii z$O!+ak%`8N6Ajc07zgU``1AOqBv-)q0|I){Jp8Wbu5}OI-v8(P$da!&EyLC92S|+# z5McMXXhcWH$$)N17CE^SG|=P2HGCs?4E`E#&89AtmG9|JOjY#JbR`rBL_9MJ4*n6d zx?}1+a^gkAOSPAVIy+rQ45MD}`oWJcYG<(lj1C?87Cknw0wll+z#Iu^rS*VDiBPyqG|vlz1}8 zZaDA@!Yi$5I&94;7oqIYE#~+6ng1=nS}ZWxBNK+RsJ^QHVJ&pqdpl1mCstNU%1-_g zgV~K@f>B6H9D|MEb^J!2|MCefBS%{uq%dl1E!4)iv>s?R<2DsXjRWoi|*q*o&HAp_RB=fAfHD0Kp0(*!(8+YCNU}T zq+24g9vlr@ThVgYgnZ3U*oBrR%!Ki31{Fk3wz*P%EBdG}*;5A{d<(liJTpUWGN)Gu z+Vd)QBX&u9ZNhM-W2v`)dT0`|h%F?v`JNp*?5O!NCm97G+4#VqR{X%+!W+$$w1Lay zDcrdqk!8n&XQ|MQnv2pSC4G$Y^$P^6)6smo^nxPA4DX*xU+_sCq*lV$G!l^{Rw+_G zb_fn;)}3P;q-40zTUN?HbHDtP_S7_cP<8atPg`!9k=PpHz%}|3PXf#(1bqn*LD;k< z%PNN5TVpti_RV#w68fx6xjYq%+-H9n`0`k zt6dxQ^mWDQ*T}jadv1&Fu%E~EyYLkFu3Y%&`RP9gPLIt5(C>+a!?p>|cFIxVi90P= z1s#K-YOz|OFIpkJdiC^}9HmYxwBc9KH%4eUWjSCO9Cbd(%s>sm2)cwU`wL}BX6t0x z%cQ|IX~?aW?g?*|*u?msOAuGk!Sa2g< z5$vkDZ#!GDCtPnfCC3g`*py6t;Pn$hm*G4?bSZOEKfPh4TAAi!|BCTL4C3$Rt1sI; z?hiTgQGw@#c_g5l!{hVjl#q++=;u@}l z$1c*q9h{Ls$u}n(pu`r(wzlfE^tPQuK{ho*KkJqnBkc8RXd6a{qjlA_9aL=kpt;Cr z&BXz55+Dei?#(HtFQ_Z;*q)K?gaCJCeazl)_1Z9(Hbe~XjAUOKzyR7+LY|6@Y#r441D&Jl|Yr$Y&pBRaHhL>-m}DI$_<*=Mp2-&AJ_%9roH7 zGPX6@Vf#X1huKR08l0|$AB(v5Xw^$>>bMkIqL#9Q8|NX63fAKL$6kmqLjHb zGKnA25zpvCZetNZJmD|8jzE$~&2R=O?i!ytCFDX^y0HxmRi5CAadnOI&QzZ$OMTT^ z@0T<>7h-xLxiv%KW#^+zJuJ#h2@A+2>6b>D>6M z*zvrajNJx0YNjw3q7F;-M>g+#bXerCOl9li&;9<(zt7(T5VhI4*|&tLP3H-?f49OL z0a+Y5cF81Dk5$Udh%YuWCsAANtH<~RRhUF6$yx*B&E=TgyZ8Wc?duDrUv{vp;t4y) zOLh*bEgd8B2+S4I@;x;U;8dl53UX2i=nxLnBZFQ+RzWH?vD679nT55)3#C7Oz*l|c zi>12Sy)^^MawD%`>6sCv>#$2wAGx$@aNNzO$@zyL_ES>F<4_;LhQ7cjIOLO(KQcRR z3Flj&uHq<4rz3M&vi$=SW4P(fFH3=!1k z%Xq&O3%m$ak2yEV*_<=eirjdxtpF30uP@+&#RHwqv&a1)d&R&v+ST@2xkzNw(Fqg( za9g<)%|?p-5FE-jvln-D+VEv&&~CBIHwr{k6R%I0%5koR}GK?tN?K5khA$jQOO;{qsj;#5o|ylaZQEU&bXX z&hDSjb9YIUyNn*N9B4$XBQBuQZFWdhTaWk~C<)qJBH;+}s^KdoA_N+^t+_|U*NThv z@+#4p<)GzmEw)EDmtPGUTYVIiM1_ylS(>s$R>@XjQyo%Jh?tLY)dKPqUIlC}DN^r; zJv~$jq)HghrF5@G5LYO|PEfhJ<_!*5Zo3kGs7oJt;zi=W!^?6)ihE2) zXBq^_*s4UQPnSyVl2Ia#;aEKU-IF!~CCHRn@FxRY9tyETMxo&_D8*Cq)GY$7Blxy( zKE!bEx>I~A?Gz%B03dV51A@oY4Pl9>WmT8=k~cRD!;2*!pHR?Rkhz!|zI32~CumAD7 zjqv|0md4d=K(rq7Gf^csbVUNCT_d6>ZMRkv{a974<19ATaKmU(^}33nM6=pRT&YpW zZHXBwGnu~h%1e<*SND+jEPYUQ;tvc9gweu+HR@y%%>oQkWB7|ysJ#J*-_>!{mDmg4 zBSn(xk~IJsE;yY;lc$m)u5eN09J;>!-IM-j$lQA_e`vl}srH%|zD@s!cg^$JhJEeb z@AKIG54d8(XZv>g!0*rf9ztH9N8{(i9f8L)nMYUO_XBtkkZ9fw-cJj3DO}$!tlrI! zkHj3{5;HHHPjhomA3jbmRNn8K6Zx9AX9IZc*OS@j^W`>s;@^DqwWY=Fy%FlS&i2nM z<~Ih6qe5Y%#P)7!w_^3haT+`#qOcqq9CI*ObrujP2K8Spe!l{41IrmLcC}x>^Ie*6 zZc>+lKbk8v$lE`gY*THyPN}v?R?oQzex+-adff1iBvy zlx=^n*|6z<(Y#N)*;^O_T?e(W5_{yMBlY4I;8PGe_{lbv}HJ$Lg|n!AUg5jjhzyyo{2GPaG5*e?>ru~n{MQD8JJoA|8A z8T`ei0LfZS&ag6Q%%>`PDW5Udtx~&6Gwa+wOGu1Lc=QKAVwE#Z(Yc0E2P)&G=iKt` ze>?m+{#m_yhPDas&e_2uF7|9++Pt(S2op%;9+(V&G$h50IXN66`-(1jaT~+RPCN)O zcn%j&E=XQV1;lHww(R(0UHmN~Rmd%Kl0Z>5Txvovb_3k${%`|^v_xt6E~W1FvTNkUC)@4Yn1YoVg%1Yn%D@w z!Msp}kG5JT&|c;K4juPfu{9~l+-a%8i3>&O0s{?e}^AgB->;;TI8CNq*T5nJO zH@1s0nnhpco#^+ePwEvXPo5GC_fxY)h;%>*nGC6{!k-UbW>54g85KlIY8zrnA< zow)JNu~<$E0Ces9xiyyF!F}O}H5Xq;P`04A!y7nHO^=2R-~F)lLhwh;UEJT*WR%_? zVr6wDsJ>U@lW^_rp&C6G6=u9oXICS-K?}v_`8YkkH>eL=-}if@n7;4rf!dgT``a~7 zZxp$NEY;cQly^rDQjFq^dt&|zBdnfZgOcTJ+DMcwKWh=;IyNiHEX=DCp!}MSGu<7KQAaC!2 z7wpXoGhYx8io%O~eOu$#4Jx6WTWgScuKuQ)C*SAzBTFgBl7gj+r-8 z9Sq1scwxhfx+GjMj9wr2#*RtzQpIGzS10ooJ3H%7z0`P`y|o1hIBr&pyE0Hoe$o#4 zY)SxLu@?nyo@C0tK2^hikR<}4M0PDxqG0%sfIjT#qbW*Civ^$ocSvW z<_T0=ciMpfQn7x5iBZxd)wRxD1I&NJnj1D}XSuBQ`Q0V1r!1Dt^s1wrLIq8`VcQ0> zN{jn)^80r#13q^keSG-}HbC*pN6;_+B`}!j{pJ>u6nt)Krd2quKCFux8 zHdAFsG@B3Ki_>?#8eOP|nVOo3lkW*~Es}yteB$Z`Q(P|N-F5Ajmmn13a*_E38y>cL zA^B!FDxl`bk-G0hiz{s_{w2EMrlXFVW5qX?XlWLQnERFm?#9<@Xl-y z!CDw+kzd{w3Q0b@7jW^25+m6LN>tuya zGMU1MIl%5ck>WW?ba(`HAy-z~ufxvX8DS^Sow=)>rs8}=ryM_gTps^zKG;qlHC7UG z`P`M|X%qH!9w$FPxb%K94LSCsM21pIB8n}VM}p>yWwC#Y8h2G$U-vb-(3dckR8b9B zlNt4?&EHXBDGvHQWXjw}nE8;G>g>nU#V>8$C2iYzGa@G%c8`V}JuZ$+9;(7fIVnsJ zn|EAAjCAr~2NX-Tm2mo1q{?UvEMr2&BjqZz$(5Re$Rj4H!zo*~HR8YQmB z1TA46GIz8W&rwd0%bcCQX~((*Eh_*`R~Ntfp0hw(k%v@@db8RIevE*l$9Iv~L*N$M-gt!04~P6s9)2+bT>wFtQW17bj(zt$X#E!f-Wj(9>QM+#T3 zg@HBVkQ@zKg0tdIjVnB~yd1KgRBDYhPHRDpiV6dw+<<$|HlV_e%;NtxW)I8lxi_?80+UEu?qGEm{Pj4+5660kLd<2!BFI|k{k=~jnbQG{Jukc?wD zd8j2t(YtA$paVWcZ~0EmZZSS5>oYRJGDafaF;{rbt*T@?BfUQ?CMJ6qn#4w|PYVVl z8evPdLe;A8u&VPSzp}Fu92zHReQl8Cau9_>c14MrsAhdAx7XRtjRg{;{7_g4iFv(f zHyAVp9LsX(G+Ro0Lo~$M!~02`{jyG_Y$(|*LPY$P&(SQrVNAo;^K}7-0<4;j=?Z?3 zY1C=_j5|}$a&NaF_nYvWA0*cCd^*K7orq>FbVuA?eE|aMB4k=+bH|n*v74m&rJS+y zkrjtXl$y(DN8Kp5V~>{?D;3?jZ{VN_*tXkpU|;E^0rgF_D{epwlZ1{!Nv1W-4!U^` zu@8^y8o0()d5k7NQ5LU!QPr>_+sZFREMj#JlNf{M8vXcAE^0I25F3G>k zi5i;l^h<5C|F7V$vm!rDRmKupwbb#K`A$4KZ);|$x<0TS=G4XgmI{Z%hEcuX9>?ld z=2R|O7!JXO%Y&MZrP!MA@oucM3M{8C=T{X~nv8 z&;fu<`!H{$*u+?d_3B>8gIfG)G%O-*^9`$5$w41pb2+Dkmy5RZR?(p+nYL^(7Es-J zZYr{A#)Tz3vbI%RDAd`k)WVd>Mk3Q*!9QmvZ+;pZKvAO&75yH_?auZQR`QHbF-(iD zHrjlsd_~Ps8gm)Raz_zmLA$Ms&}#D3kUQ_vn&ThkzYY5zy+#y1ZM#~GO2$B+I6K+@ ze+$Zw^A8zX4b6d2@2tK()u{_R>Y=J`UWSGGV#_r^h$MyKmSe^qu|e`y(-^_FmuRRM zk=Vm}XljGB&WWCMCVES~6*1L^ZnqzcoGlfGPTM&^jmQOJajNh1+GDc0pQSUjxO)4i zF|l_AiM93N$2{P!%1)mU&F>vWGE$ygme`cFEM z#&sR0X_fQD`l{!N^>(_}hYN><{3lIa#5{1qmaw9Fpt*Ti0V{o~5c41@R=Za0P?P!C ziY>RLWpal?ge7grJk*07#TmhPi76C3<6S&lg0JyqS8R+av^yIavQ2+|q;_vCh;7o**1S8H}4jrF_uHvA~NK4P(G%Jp9=M4l4|G z29fqrV-f!t3GHVTB?Rvy$^qN!VRViV9$WNn)hYdT%0+c(XuewXqP^Y_$4H?Mnl%*) zbZxE=ym0uc7$-$C#&oVN+nG@H^Yk=tBWQ(di>RTo^q*cj_y982B!H%#M&JD5{*YWRI)SQ> ziV)~NU%s5{p6Mms0%qwl#?R8FjGwzKXI<}>OIp{v!?MjkYV;SY3a$DsVk#9P+4E-n}5h^LRX zdKWhM#~S~bYy4iFdyAJ79)~3?0N&yh$&9mFv)ejZ_Mb?&p$j%9F7o-=c_0xGF3mf2 zx$Z-2^dhc?^?D8N)jn~6C$@Y!xfXYq@oTOS_P*7{=-yxX&jI+PVjk2Z6L5@5fXZu6 zdqWWBF%saLefX=0%PxU2Z17xtv=#+x$2DfCZSgn2)DjvQlWXN`AokrBM#wcmJIHHG ziJ-6GUL|Bd&*;E#f@Uewh-04c9MG9eF2&%Y0xY9JMt+Ks-PG;B%D@(rSx=4l`hdiz zxQ}-;`2F5t6uj6wz(_#o0A9c0Tzz<9=xxRXYcy(*GU3hkV{Xo5%OPh$HM;_PBy1U6 zoBQ27;d4o#04{3sbq`Zn)Ni7%BSczT)V6lXOZC?{lBBUu-RZpn57tz{B8YM>=RpC zb!MsF=rg31-rK61tTw7Z!_aZ7@JnOxcE-U2K% zcl_lj+dL*teH`4U-Fs;Tb4>Jdm-iUk>ZoN%ydSCUNT7m5HRN!T>l+~YCsDbt*{R}A}Xc;ig+vvg!z=ePhl0I4fcdtXuYIV=`>Yv_BQEpfOX7t+7QSP2#a^P02eD z1S%s2{6nacj^m2M!i>=n?u8ydTDFk`ft?WVB!{hl>eXq|vav>!W;&&fE9(bP2H*w+ z3)kkUAGi|+tnAMveJfeJm+A3IY2eTr-OvkQ~V890042~uS!zyWKB_alH_ge%^ zQHN4x;!gfcnG29(1&F`CxS`&oHC%E{NegR2nFZm|2}XwLEub*%1#1#IWN z)!>bC@56%ZXh)z2=y=DoHY(!sT;}B@DRoc?mMh%$DTYtY zFf6F?Da!RcFGMbSYTB1=i)TU*H0HNapa#Eif-Htz{}4-ayQ;HkIGtKp)@u)%o;H~e zkax@F--6ApA@jO72CLa++^U6I^W%=8w*)UNO!yvKf`vB16laRYfrT$;CzE9nV|Hm1 zO8kc2`h0clO3y5-U5nK@=4CE*e$S|MM0j4vodd{X0#cj(Q{bbCkY;& zG3SEiizLhQ3WLK@w|FyV|E6E(X_3@XW1!izu>E`iYz@nDx@U`e-dyOMz4Klnunsa2 z8gWM`;KbNkT4sj`acH;B)3ck6Ve#MetiiDN@{Z+2j4OANj?zlb%_T>LfgK%vmyvCQ$1L**EtCZ0IML zJd8w1$fgZRjjy?X7;|SW?65R_#5Kgn*3Tz5cBBJwoZ~&vbTh7_3n95eyH>=8+HWwj zrzQxDxJQjSt$~_tb&=%CdXB6P0x1G@B5^8@dP=XtUiH*%XStc^a<*na>P*Je9@MNG zckPg3-55V7@c*t6#Th?teCnn34c1AqSr)`80}h}PoV9RQn~$5vzQ%6Ks?a)2sqX^5 ze(i2rD!Q!|Le}0?S9KFfTADHYse-jOoFZlBxAfP6$-WG((NN=<=7^RO$Fy}=^H`Fr z>1uIkxSb&^qZ%qvNZXL&A=WJ1S9ZB0%wjXMccZ2qqfIu=;Pt*+^_8u-P&p{$ zubuy-PZWX#b;uFlMwFP&pcWW;i|0Ttlx_(7)6yM;YM`OjsH19F=9IwY+a#N5{7yy2 z8ot>6dARrT5JU?=(j=ZOlXebp_h@iJS{aU`9Qt4fyRcT3-y8>AQE^;qkWN@V$%N+w z*Fa98p5Un-&xeW9jFYgCi<@-~c;|gR(wZMrQaO;SW`rY(7s6+UZq`*jr}zz&fy6mr z?YtK}Q7}q*>cr+=;zx;A>`sj-<;mO4> zr(gg1o5{s5<>~mFum9Y!D@z`40^w$NqKsxlIfTF{A$Kh^+k0U`=-l?r@HbLvF{cWo8%%LZ&3INNq5uOP*$569BK5ir9a@S1XTF! zymv+bZR^lLN~2=wE8?m`f!hX1N}@_S!o4#iD5|bfU?x+Gh2dveN#i1twP>;Ag;j?D zl5|=Bhld0bE1B;Y`ZcD4I_jd1CW#1?#10_wjz%E88JCuHSs9q2^9+y*ZQhQm*cd!u zyj&o#s^FbM@Li2n)FP2D-Pa4_7)gksL6ugMq~Y)3lY0T6JF*T%m*Zhw(HcQT3M!Ds zX^F~4ROC(LaT1(O@*>UWa9Wv9r)>H}H(=$Q!hl}q#l^tN!tmOgh2bT%w^vf!k)OD| zSEs=%Xzy9w-V1E+JJsF+xA*j#wcH2L9#r`|w%4-maOH1NOat`o zGT4qvvk2qBWJ-Sxby8E9p`%PxMz!c^9^<`y%Rrqnk2GRcAoe!P;}&miUjz$zWqMOZ zrXSTJuR5GQ*cU79%G9>4xebtS)(U{{v`reAaqo`sqbSVTRE$~pw1V5?uFn-Q(X~4mg%l;v8CN3vzu93Q6hBc z7X~UMm4@hhU`L;0BGM736~&D@f@UU@{E9PC|1&9a9h?)Nnnj&pJkZjRTCld!0X2Ze z;PRWGth7TafCGzCI+&ga1)nU~D=1Zr{=J{XWApcSIUIfVIN0MZn(!BRiRjOsKx()7 zH0<#OYnsuOnu^SbRFHsNq^*f0btJBVNn$zFHbP_9148(}+ZwOo7@*kst?yDELc&;4gu}=lG8WqGkQII+9wR%11%9;%;iPkDwPE z|G|De>=#&J)8!TLMlXy@1WKVgP7d&NA6I!Hj=QbQ_`4)asGzcU!jN+a6W5D-$;uqn zxMrY$^QCIb;C2gGEOSSV9Coy_1V1;UqCZ(UP#B{m{6*&Px#4q}X22W2sEl}y! zfY>yV_CW&0Is3^%j^ULz6fL>ZE348h$r0r62ES;~j%V46R?c#LH@a`EVPB(Ge7NB- z9*?!B9LqtiYZK$;5FgV=rUwBU!q9T<>vJ`VPTSe|=4OBqx>F+{Kka%JN34NM%=eNr zIzY+&_mbWBrbJ;v*3E4sn6n}wHz@O54qfgG93Mh|0v`8+X3*MUIX|(d{uVRe*E1hA`KMf~Q;;_dyZgs% z|J!C8XA>qHreQFo@Bs&ae==R7#+}9Apn%&f{{A0}|397_c-(!@;-AhZYU*#h_U{{O zKSr%dNq0OtZ6y?VWTmq-l|fYCL16qrUyI$^`I#JMD6{4?QK>mo*2~1fMqj5FP#~-M z3{(A;aORn?`S;HI_tP|sK%fOyq#>}ObCI0Qv6$g)jki3*0+>z@ zd}rX7&in&t-|Q z)`YXcDLS83>Ia_6sg7|hbuUb~04?D*?j9-uhP%ztHF`&z8_hE)l|(1kcHbZkbxn4> zqjmQd#M49c`o)ox(nM8T(2CiYEjX7i4yRF5f7lYH!hzQom|x)4>Fis;Ex2Yf#EAR4 z$p=fi=$%yyXN{NZ$39ZR&oXlI%&AeRzhwegNg2t@9>aZ*z=Rn{Xj7M+<2vYC+jo}( z(sn;D;cyH8^hEVt!V$XO*3oD(GJdXGiGFnEFx;I#ybpt4Z8y@WUbe65gi(>`C>dx10Vm{T$c) zA7{sZEhNxJ*g|EX<_qeJB%6Z~(SU_|%|7lI#Yvj14;|Dj~SR zB@L|G%#HG*uAxi5?idk-6cioT*Zz_%D_f#*ulPaddfxx(_la7^gGRRWj-pCQI@-Drd!%+1#Chx;RNm61R*WR z9b=wzonB+jB`Q3lvdY!^kJUYyTN-+jt zd{-KT3Kmlv5n`MuwX#aNaj8MNNa>b=%GoV`Sc5t~RfeuJ80RU+q~el+p6yBD_le=% zMh;rq=yaNo=XlY0GUt56Cka_2vngYl16kDr=$B}aPwG(>BeD&_Olnp_*k)$m_MF#s zElL!tJPHt5W&0ew0zO})W0?f8P%|fBWM`dSp~tpE5S6L(*J9*g8=_t$&$#iQ%(APE z-U^?zjOywUtI_IPGYsFw5sY@;ljqe<$;P`eUTz90Dk^Z}g_x$gqOlfRU8(5A^dhOK z2BKUabxf^9DFy8qknD`1`e&?#g=E$0uhoK4jt&q8D+zy+N!?5Zo|Ae@(2_SVciGK+m-q+o`|1g-87r%_VJspnwtT ze*{Ig_n;RvHR~QG{me*XrdAg@B=NII#UE5Zwf%u)z-;&KrkI)NCp(+O6kNPcBs~Ry z@fn8gX|6lH+!nGAGy56^sIR+>3vMW!lya~cLtK`a&Kj%*h+o_Sl#3_>nD%fn!1a6s zT$MShc~ld4I*HGkf&PED={cZ4l-Ot;gpvYJViOT>nZzMkyjn%{Z}@(r$jcHsJwS&o zS43BFowsUH+^7aWeU)HLQ>X#${T4LrxA4*^AyFCoh~e_cjPku z7NCy+=ob#qM)GVOfv~O~V$f_55rQvzQ4nH8pUrhj_`dn2uZzuw{|pU(z1nC1g)5F` zeI0S+YAS9u9;odMX#LS@BU=9w8~^Hq8vnA<_*WL$9oEOS@;txFIH*BPVOPiV5!*1D z0ypy?6&Yiqt0lWTfFRcbJ<2`f0FWD{=2F*DTAocjx`p_{I?8 zBI%&Rrl1_B{0tsrSv(6rQK)^KJqaHpTAoCY0V_{>9YfoL-cE>%0b(ap9%JlFOdCNm zE+bM2>Xf24x=~d*LdG7WGNqAa*KEtJHVC%ShBM10q_G&O62eFqL>MYDVk-3Dd_Ik{ zK3X{v(?e1M7#lnv#VglQimP zs2`((lNpd#7tI=SUvu7c8j)HHq(@0=gU(Nz;r7#=XM@22Ca7)Shxx%R#v5MDm1A1> z|3w@6!u>f|K{``=_G)Lu;SdB>uR_yQ)*y}@EqF3pSdF8cm1asPk`d|Hu5Odh8;mW*3Yd-n?Y!#0Eq<#=LR&`OjU<3rxK|7 zg)<2%ehc!EM@}-Dvl)W(*W@C*Q6>o;m>(`4Ux% zuX2)w%^BzvogS*JPd&%CMrRtWFHXR03VIf-dgA|ZjBh%|4~NOGtqvhxHGqYPmR!!n z1d(Lv3{OmO5ZB^Jxhg%+H&&OOPer8>S1(=oqx?`9WFk%{mvZ7OZm{@}hV4Zh2zCWW&}jB{F=O-Lu0j*1+s zkV8s2Ke09>K4oK&ld)WYOfce`#MUp`uH0UGvmy13vEz@NyQ+Fl7d6IKfxV6yc@_|b zG&_$HT>)YuB^1OEHtyHT$Hmkoi!!;GbL3|ldfTzOMFT)ySmsgQevKECMMb6b!s@KA zS?A>?TT6o_v*c9cuV)aChd&#{X$woOjN8A;9dXgd5T#+8XNQPEgSbnFuC+3It9!2- zQTl~v^XW|9k-9)G4CN8#)&$9i;4TRtvP{;%=paSP&Q`{{z!2kb)WP{rVw1eEOjJXw z6N0g2Mq##u-NXpn|A*EjonYefI=G6jt#ERHAsvp<3|*qvE8cX|+9O(1J-o}(!o#ou zk7G(C&cJz9;Y|Roe=!Jg@bh~wIPcK#C@-3Kt0f>CYRKUYX*Nzroas%6B3IWY%Darl zDm>aSW$o3BmJ9 z_7F-Nggz$#s*WRHxAKOKT{eLhL(yzU3OhaJoXRUsUK?$ac8Id2QJbO=F_Ywlc&ecF zi5=W|Z;psg_O#(fI+~A~7r9V0RuN7Mu@7Vvfz2tprQp%02W{Cq*hg_FTZooHhe&sM zHsIHe9fbODFEMCv4P>A>aJSp_NyhUGH8pZw-%ugr2eu|(MeVB8TCv|!^K_EO5)8K- zVe%?CxQ$RsBKwMFjjsl48_C8aA1I|bUme(b(qG?bJ_hV~!y0u&+tNWoVFaV^9tyre z=Q)wkXPu8T6BtGGy1s<=PQ-utDo)dq6L!Lh4*!nRv$Rsj*6zU5SbxwmHC3K-GEQ%` zM}ze*2J2sb<3*pdG1ChA5R6*28W#r32)8l5BY1M`&eJj~Zc^}3-w)?DH0`D5BYOH^ zfolT(SBUcVvIr|CMIAInD3a_J-NAyKo@P*E zJ_@z#Us!nAB1wZ{0Yfp=W2ZAYM-2-474|sd9*xaT7;d*HqU)kIm2|rmNU$|k$p8w1 zm69UuP~2L$wjV3`%$F>U!#v<%ni@gX7sITSwX*zNADt_?rtjg=MfU+qVl`g~YgK4b z)Mu3R(#(@FwH>Ihg2aCAzRkKE)L9#D!6Y7gk?-OUKmN2P2pSWvP(YZlz(ykc$1@x) zkTf(0)pAXN3`C)eVGZ!G5#oVoOPzXrZqfDZt8Z#%OliSg;tRCLGoOO@G_HUrZv~z3 z`S#)Vey`(@{wxv2>T@huC$1N%qtk>4^%0dspDiBI21@8|YL*N*!=4WhP6f;d1+*|x zm8xEUy~p{a;9nZf?cB2+*bH_lK%-WN_YsVRh^nMnvifYc&m?{{>CIeaJx}wJy8&M} z`@28y?7lwSd-byJFx33$JvNm2>Vw%3jf1q`Q(rBJ73RvfSS4kc<{1?A-R(%th7~Ma z%G~vycZbuOc{xtk5KP#ge!}_14>5vy=)H~5yV~{%3WuYrVJeP_VgeHpo9A0dyvMKd zDF{>A0^Knp)qs`bOzL-=;mZZ;AzvyCjKc9{f?H;teF^{LF>%I8s@EJ#7NAYXHHU7G z*r6nzT*cQV_xDbHq!!&ix(0J}hY8G!3cEM6)A*W|A@tUNyA5UbFv%}n7}mG=^}t`| zWCqeUbjj~R!Vir*OD>b*1BNZ_tvYZi{t<_6l}US?xJMC9jw$b2lyOCK9CUlfNJdr=)FBi14$h}g8L5dxmKO5@ZuAF+Npb7y zE~ux=7gfa251Rg%yuxHK%T^eZ$(9MsS7Kl13^WQZv<;xT6fuaFF8Y|*%~;{6Wvj1O z>SABd3{!B+xl8=`Fak6WnS8T!@?bIc=q#~mUfsu2g0aw|91c~QVn5^Rc0MmV-QaV> zaEbBhPD9OsYGRh)v0^6W%!$MJd|a)S>0^m|!Rw@;bVihze2&B3yhcvDsqk<<&@Hyz3$btbwu=hM4{k()a~Yd4?=7G zY;COvVs}Vt4OOI^9m!fKNe{`H}o z6eng7wj1fFj+lf_R7?yog#+<8jjIG;nb%}793Zp4V%wVLFvD9uo#7pmI3w3V<8Kto zG47?>g*xeJrzgI{wehafhP`8kYyBizLnV0CNn(SeZKwU{^9V4-M|0z>dmv^&iC7I4q(wL9G4F|!~fN>jg?v@ zj3}rHVT&Vzs#);ZbFv5`9a|uRpb|!dZ3*mY6xdRT9eBs~|FCEyrb#Yxon_GjBEWnBE4^Ovr_gm zy4>I{+mH-V>xlna;vMmbGnLgnBNrc%QUtEVl<-EA@W+t&!4P%Z0!S?EbR8-}iSmwC zL@5;7h59yOKH{JNxS>%#M>LA!l#U{?;Kk~ur7%(ERHlxVvY2s55`m%}K^TmA?2Lk! zuMQi9IrszKd}}{lkL*{wu(~Md?7Vo^={eHeXgUtyd9X7budj8qr$0PGKY!zoArtVo za3{~I0y7D4;uh`-Da1X}UGIZcLe6j+nsLvDXu5{o3tn@=+I!ZXc(N*LS*8X z&McC`l#&;tYIl^-Vb;F2?D4TS+uLuY^y+qpcmGK5&hPBit4<>Fx3PLvxd7NoDN)60 z<>c*_i9Yq*ZJFF{eQ2faE!RimK(k=Mv>asGz!^s)rmBxek-v|8_ivEx{(Cf9dNrV< z-r^gs%eY7-u3l#364d_2oZhuVE`J@ZysTAI3`ZFjahSR)nC3velv+70_3eQXMkv^M zU-#`MsK~8()-ciUQ_@i=GAt#aQD56mQS=|#IIZIEUPzl5{;m(J>AkYUUcc#ia-K|e zaaODF$#ay?vx@a`#-zyBZ&*H)k6f%Sk1;eFyDZQauFRs%J)R8EsFoYtsa6@2N)MkP zU)N%Rg%xXzwb?bfS>z>qw$gN%%?ldEK-?JkRiaW~8*PB>a+YRD41JCbC%o-dl07;TffQQM90F?C)IBo}MZy{Cjt5sUmp}!ob^qGRrzNJ6u>?BXhdc1U@3yxO zzx!_6GNpB68r4OArlQQY!=tYC9MdRRn~k8hT?{IlD# z@7B)&8-%p@<};j(bz^dSE1O>4Gx56;b`D#xbJ&KRm5^ihh!~HOvDLERL2ej>yv4k8 z8d_b`(gv+K9WvCP7ZSo3QLs8K__uFk_Z}*yZ+Cv(vwQ22uV`jq!uM$k)k`~VWU5hr{U%`?{eK*o09IM$S$PUKs{?dG6Wi|KGFJDEqc@? zU{IuQkopg(Tmu7*tUFxm@s@7Ekv^R1YyfO8&AoBV#;4|lyQY~gK{O}JwcJ7h*J(2< zhf|cR61p3~s1g56XO~ zDb1YLiBcL>tG^)EjmOx5PVZ(Ayh)}BodzXiCqtgAnAqxcCWZv{G|6EGLtnvU<`S`j z-Jy-M?x7Q)f$asj*Vqq`NITox+v+~EGu|!|d`MBqt|gd>7~+i+l#t}0XHZ{v8`Vja z^}fJ=k}j{`ZrL3u9;Ohbj!`a}_k;koCD=~URE4NfV35c;f+3Vtb-#`p&jGGJ^mUJn2Yh?{7cv?>u|q z_v5=q%%rwrY9pjFGWVBmWQ=@NUJiMemKJO3q)K|P-0DP~RrJ#MOH{{tR}?E7kP5ce z>9o7G7BR!ZFR@ZeZ%KRytJxNP_D@T#aZD)gt+(nU8i*)oHNwpZSAG2&%`lW6*o4>2 zXsO5Qk>2$?e{=Qg6`EshwCdn15Yo}0L;Y?mr_4CiZyQr}2Yj|B`mHpke=jO44eH-3 zgk^Nw@eHc99dlq!CB}ii#U&jEoY2;qxouHObrt((av)+dmKYULHCP zu~f0FDJtbFphh4C{JJVD5~fw)_NG}&HA9-&p!J~o?hLvM|5=wm=5l-BAy!J~jNEN& zoxUT7+gg)IuE^!K);v+^eN?~YX|XLpeUa!J>CVyT^~1k5BOF?TCvSG-h(C~G_WUYcDwWtO)|~4>5z)X9*sE z?J^&I5txhAqoQ9e5_x+#k1dGgl53GI zB1YWG=9uh;F<*3!9`uj@@^<{-?cnYBzNrYp5c_qxE_UrYiHj$1$M3(m>GkpV6h?Ip z58jUd!Vkvrwfr>oS@)pX)6L+#s%D!HACg;5ewh@fll%&$wuisYG0ZZEO%FG|`tzf2 zzIk|_U-id%|2m)dX^#8o_}3@pR-Y7DeNl*&eVo*O+?NUL*Av)Od8rYsYHced;WU+QG@1O8XoK4IOd_T(NPZRDD!l-Cpix6Ko5Yz;po^th&uHbW;}|g5je(sCfwl(1 zxJQp>aeFhkkU~d$TrClPrKE>xt>h&}9lN!U*kb=MkA^~}%i3z@6Vzo0d6-53|GH3a zaqKZ0j117eNIuRP%&h7?EtLgjDZp6*_VRz*d(-YVZe(Hj`#tCWhfaGOHmxQt%61k- zQm!o9iJz<39$UGyPzq0rY)Oo`g-u#kB+YMsYr#@Lqe;q3mU)LWk;!hLP$&R}LZOyC z;F}kqyw*l*BH-TP4*~8a8s{+GR}VLUAC<^JYNje?7&YH?*RVg=ES;-|&kpfnu(BmG zhJxb4p*RWNG?4EX>ex`@^O5MMv$PeM3S+uiu@?_aI;S#yIY2-0g*bEJ9{~jl%cYZR8`oC`N#!*|P@nu*)ms5V}egch$y%13^74CUuHf8DPYAZ1llitCG!v4Q;?(eZdZ$g`0Qlz(xS zlNAPcmh68pe5%b1%;C<<5#MDS^AT0Iq2?DfRPq=o&UBOs1*TVyRPRuC)cfmuPYN9? z*PkCYP>D~>XnO|}G2|S;Mz!l81ltyz5<~{^r!-21eWk{&Co_X5dsnr?8HWGBFC+Xy zCK41l12fMLoYG~ARGyuF!Ts4;-L+UAb2!-GFGaI}W0H1vN@|1R=iW&a>-6r1L~&FM zdOx4kB!|YWc#yyA1e&_Ks-?~tZP#vY%FSB{K{T$eBpxv%a&r?vrTAqKLL){j)H>X* z#Q_3v#TALb94n6XvV-NwE5@fzId*xwT`PgB9UWB`P@P>=M51IcQV5xP3+)rkOincu zRMrWGX3AJWa}RBm;4XEQpT!w&6-%UIQIrxJ@y03#Z{a}<&*(!qmGk1@pfN-PfYVS%d4@nb%?vf~f4mN<0}2@B2$ zEUR&G7MK0gsKW)rf`d~;^mU<}?p2aM%QO;nk_DHaxtvx$3dL5S8VN$d(XT3FBgup~ zKc9y%KtzztPRtkU*K_$j%Ou-oiF+lyO?=y1>R#!}O>et$ z>HF3jnzaOj@u*`a9C&{CasS}?{__`4DG-12$;*S?{r!a}+-dD@k$k(^{^@RUw>YYW zFRGKsyK=Wf96aJLx^9*O1H&E$kmw=u!<$z?R>kRxr&g=4lG9aFZGBbp9F7jB|DGh0 zb{x*SiFQg>91eZfwxgtsTkRSshH z!ZXMJkoi2GquHi4Orl0BT~8aWI)x{%2eQI=CWeZiETig_hzLj58Xa9VwRH7*32I<3 zsRY_AL#4iibXe-$YYwCT$}S9V1Qm$2IBC}XNX0G=^?P>=P*Vp^G4u2UoK7gBn~N`1fpsN zuu43txVpb6I>T%NJ-w>t@Ke+zM4J)*vtXN{d?8e9w4~Sx7du%}Y|6!^RmEZ*q(Na&5yL87aN(ysa8^GQ95~7Ut4%7HR~Pf+ zq?p7vtIU(T6zY3JvG;E8z4uYze}~9O&AZpfv^q z)Oo9fLJJz4YUsGhHSrr)#&1v`{{axS zRkW7SOXXA*bfO9c{4yP17BZwb?@#QWTpcE*cm)b;al`ALZO2!x(D&UT1RtUMA|$zGHuGSBNfwCgOVTB@A{=jCtyswl6X? zSBB0drIi=PSNSh#%zU{rWPW}N^YTB3-LqhU(QhkwNgbS?45)t#89Dnx+Gk|Mi{_<9 zwV*+u4YUhjMZ4h7tYNS>L6^#IDv%294;4b&8+Frfg91_&SBf+HOA~|SPKRh!kUC;n z!LfC9k|Kfa5lOGl|*Y8$RuH-ea*>%H!O*@5Tq?z42f^9C>I~ z$HvckZ!=}dC*m`82?(lZY-IXxWHhQ-c1#XD(|j_9;Vrt;Y|=M592Xvb0rqGdAgo1x z8BqZOUC#p?XYo&Snnc01@2_>tV2ty{E(`4|hEZ2N`ERMussc*&S?&R59E={K)-cTo zJgPs((iEU2@ey__%cWZFB-!j2YFknn$AJ?%%OY|*>W2u?7`m*-F0YToYcWNi8N?ET z&N%6!J5_@dWf03>-uFI zZhm33(KdtX2!sP*SId^|4=PwEPGAaKH8ZiKDMB*`bw18d`=gPvCe6t5RR)@7=QU|X z9Ms{7;mQl_WUW>c=hWTZT~4()=*#Ome9Td@ORxCl@tg;O3OF}?k4av$~|htAIWbVW&~e_EhExu&*6r z)Q%YDQZ^aPo2t6Dj6DVhBAkIN^IEmDvp1A1A30>(g_WpC68P%uS96rYU z78rgAXF?J4<4#8ubo>M69lGozyW?4ZYMfL!ra9$Y080IgnOudQh@>o%>O_dwa$D3z zD}-8f*TZSXK5)AFT-BX1ADb_JyqU5BFRW%-pJ0}3Ene(@0H&fK?5qgjlk+6hQQnp# zQ8e6@MOKP&V)Fs1i(yz>-Mps~DUU=9ZQo>IjM+;}zB;9<6s|`iW^28Pad-0}oMvaa z(!w4d-vB~q+1vh@^3Rl`RcIxyjdRTOFcC&EXt8*4qZ7szCdO~M-waa3Gd|9hLt%kY zZ_#(SQodh!@K$6szW*i)*L*pTyfmnmDiec zEcnQ)Y=xb0oU)h23Xybq~p|U`F-G7t8|fKF8V^v}dJW$O3m*iL9LKVW@SG z0&Tho{AHR=_<~!d0Vu7MY%oX!R@jac;D;s*K2^HV@Cwkl4zo$Jlssz21btK%^*JD$ zE{MS6fYJlvQ<%&@a1Mns+6RW7zxf`H7$)J>H0J|P!0f32TR^101M_u;Hr^sqy5|&O z%`d2lcHgmrQE7=(T}~k3tS(bgXE4%*e7vllKB!t-iV0F;!Wzd8QkV zUmEJbYk$Qqy6&$aF>4B{ht^{nR3MGs%qK*F64SusKm@~yVZHE zwSTho7-M+Ce?5v@q93N+wC5%o$J;9k^To$1%uh1K3`$Bjma#yL=LZ!W@&zR_8S_j_{(XHe)w~=JiEs+$!P?%AHcGsM7tglbhSrZt>?H~D zBX^!eq2$c;L7N$>!Z!ANBB(6QB?W2p6kY&cRqEx(^97+>HTUPj+}F*cXbrXl(R*0- zM->37Hd3dMXQOeg+jE~+R~E(_PG$St_p1sFAuz9h?=cj8-9%2k=8fu~X9TOX*=V5` zH0)oxCl&eZwI#iAD1q-O3C6pFfzteJm(Of$tgw(FyWk0~3%0x~c&>HifP{%a6>j?X z0UTuW?e>wokq*%%)F}c3yhg6Dx0KXOy8yFfF?5!9&tK==`IHXbQQO)6E$$>Y5+!a$ zH5NCW8de-#B#o9WL=-Xku#fwY*J4RU@EY@fO*u8XQpW9Fd6jOIfwN6|XyYZ1r#+a# z49nIiD4^vrhI&&@Td4jMcHdgbSPFQ_p_N&sS6i!r+&|%iy{JM*g+=umqF$;p-IG4A z&|)%%utU|zIa{4+{7YVFp`>Z{EeSt#7T%6tj`Ek&A5dNtNyFS|2dX3vOIra>;(jl# zrv^|G<5zfM-e;%q^T?4RD70Ii6@3sSE~e<=gpqtKVyq8T+;Z%3;-uVT7D``(?DF79k7Ot=P@j(PcRAnjcq;4}W1Lv;W z=&QLkAS48_bFb zrW%IQJVj>H;r5U)6afNGfJ$Ep>m0gpftme4fbU&8@TPe~Yb!-w&jPWe3x@H0ip$Rw zbOK?D+$d@qxMX6SO2&bvhj0X7S`quy`=?lyda{=_5P=EMZfza~Y+!_DE{)tZ6x73s zHeG{Y{Xr#4f8@VG69-*205+^`1Gs(H7|Z z^+{?4Wq(QOB=sMjJ~p~T+Jd&D?<4V2h?SoB$wg^26dvfX?(J8{P+<=%?lUj*i_7Ef zZMB*uguK=&Vk3InUSQ~tfu*0Xrb7duFp096Is~Okq^Z!WX@TLx)nQk7_=+Rtp2erI zJSd%`copBovdJYOF~BfH<{1$cD$gEPA&YHQr%#QMWkG z?@lUW9))hbswI21cYU}xzrviSDl5->MWof|J`-=X`ESd5Yrq>I0ZoK$EsdBs8?aVa z2ZLejphv5?cQVsjLa#^wq>8(>_vY}S99lX{P)L@bPToh|C!c>1Rhra^*QEKC1k z19a@l8y++LNPv})<_(t3M&f3*Y6<=TUuzL_z;iATZxn`{?O5B zbopsbB|cwKqU??b6#56I%gd7_e*N@G^z!xYi|?LB|9HB;|MG9qcdws5eGxt0|M6+` z>c`iw_MgJ{-M#;fC~QFV`1Q-by^v|Ai?eK!cT`Gc1@z5df82fjG}?RqdJn1}ynYVw z;mezY-Ph6gPyfFA-OCrz%e@2qSAtq>YrzfSs=>KTzcwjSnL!}orxN63T#QT|{6ST| zqhS2T^5GpBLe$clG>5nZ@hzb$5*|^{0Hj|8k-jDTz@bk6SAjG9pwgxhd=h&b4kbB; z*%&1}zIsq27-E$bk2YF_+K1VNK6+w)Ir4u(1kp}CBQiFf@+9u1YAR4be!zoX>R5y& zx?^Z3+*Ir!d@hLlxed>2DO8t_4I$i!ss?s*Iv*VXGcOW~&El{z8tO<*DyF%blQg1H zYkfV9S{r`0AFie*A<;g1v~KIe{O0P9*3+-Nx?G4?0@d7DSMbbarn(#J=|it-3H{2O zg7@fGyT+9;G7Q(lZ(J3>QEmJ}0BUr8T3^QpDgFUiPCC7Y)2e*V2n1@&zBN$M2qoNS zmzyrm4Y#9Kv-BZ@BniQlDWEpi$1ji8eY*Vk)FsO!+pn)GiSpyq5KX+QC5k*M6XdH9 zJs5B2h3dacBZZEbjggs-kvktFZ$h>O4XD0Dr48zcC8UPsQfk9?_hAL42y}>4UfmL@ zHp--W7$TL%tV}Eo;g;v-3i~ePyT6-(mv5sLh~I}Oq2xdtSn+XB$tM1s(?&?7giWHw zxmYN>b<*!ahp|s^@CrLk`G!k+Tkz9TA!Ox(MJ9~5g5{g$1F#JSRt2XtOt=@4pH#4c zqcAP#CHW2@_G{E`NW+17{$%l6_41$jbj;?ZrG8rIdTYNm3AO2J7`6+x3SxQ--c zF=$8}z5!RSSG^RhXoPXs=kcHwU07#Av@fDY#ydV`y&fHg<|CcgN3)>7(M*4j z;3G<3rYqfiviKubVh=d7NoOplOYaweWT7US%4-s=5(~qL$K;F{d-W_=X_G9zl0tuF zkSbaTgDwT=Vkr2Jf2gVOsZ^%n3vM;^;mV0uj&*!*$xtQtM5b$1I%rlp*ig-|UyZHj zpWCQXl}nAS1~Y57P^+4&m?weao)->Pkk3Mru?<)NBQzti39E_c^^bgZTr#G9RFe<) zs9DhrDvoJ4l)ez9E2!n6O~S)n6-z|A50yMTS0tDP@TZR>;<8!30bCwSWJNla>GiP! zi`*XVTcCVhjn}5gYqC|9m zzrOMpcibl5Tk^U!;Z_pEG~qslcl@m}zP+pbDpLPSL2<&;+9wK(W0O^{LYfZ^nX^j7 z94(DMQ$aN!Uxw&X62 zI+L8PV}pw5_niMl@9uq$e#7A2=F|R3UmI+azb@yG0a@Qi$ark1k}4c21JdpKSV!65 zBD*XUEun5Snhyqijv!0U#g>G^E{6yFGt%{hXQuI zvO!ytT2!N>uN3j^Hw(|;;N`|$dZ!5(!j?J6Pi8SxWn0QczElKITz8VeB*C@!o%9UB z<0IR^>Nb^u?b1>|bRV?z66hn|%UHI%f_qVQ;LsQ2+3x7J+ydsjPE#$iH)8b2CA@=M z`vdR|*|rnMw~B*cV#d_=zyW}=e>8qe^DE=z=pvJ)*XyOsXNgTu?O(N(40_&wjx)MT z=J%?33&ZCkO5;6_Uc5XYb{d9+(|=T(MHktK+@&Vd@gzH?$j)qQ>8EPEU0%ay6treO zLhxFRlt%HIzx{rKvoIXdN3`NzzyaJfl>FF<0?I4j&W1mlp7mc>ZU8GK{;aA{RWWIP zz>6+e40M&Th_NkD5%OM$CSr4_t7>nk{3E!gXJrMyt2qnI(?JeE(+(ovz6%B zVY=q^RrJguyr@*R?e9ohxd6>h91@c5L_^H~0({-^K}ygNlpTpw3YiNwx#K`JI4R%- zhGNMF-$-b<#9&9l`@Q=6VDGUVA#~!HneZOo2)(~fu6&FG9`oF)G@z{nM+5)!)g7KH zg)hndbYM%ne>*Y=kS?MXP(ie?Nf`Zky2SGvKMSs@4d{|{1%7zEV8>fw$QaTRcN4zn zwc%OJkA=}$h_YN~ZQIr14a`EGyU(X7V%!ER3PO5;kPhKU@)%3tF0COQaMA`_v}G)=(Y+{XrS(N93+D7k7SOBZ^JcTT zx`=M={+4lRZ80Mm6HLip0l;s-ubpQ8{TOys^oM;+g#@f%|H>?~n-w(&OO8pxxHE7< zGL`wC6%}XhO8n4l(TndD1pexXXWOc3q~M9?I9(F@T<1g zTaESg_15D0{SjTJA{_VC*I#}4#iNG%3_4MHSF)@>USB8_#luH6Po4~QC)5?JuAlla zf?W!AC;G|$ezyC3e-pi8OX*rsz@nsq(W82bsV;zPwa9sK^NYH-2&=a+y?cjNe;~4+ z_FV9Gvr{ZTAjQAh_GByR|Nm0%qCt zG@rRv5YuygKPVDwlQMy~c*4#&Ff?GHb_a9Vot*;=ElW7T0OgSvaFDBVYnb8{55CI& z+BwM3xrN)}UZbf@83a3=E2$&HThNV$^5mdP(0bEiN}AW;No&sL-^x29I%R{d0~V9;qvNs(*Sm)9K@)6XH@P+U+<@4udFa;wz4X3PD>* zMCZ87@>2Z~c~9Ooxvb!QM9FBNn`LdLQ@(KX-9bkwg( z;SNrl<0RMJN|sM{jbxyT`OS z(UZLBPWv3%X7T4bik{#_`pZe~1*vJ^XRTpA;_K3nEbHM4at+2j14MCd!Pn;_I@hD- zXBHKg#Vj92-Dy^wg>coMFMJAo{g5K56|mU*T_naN9}JL;6lWh(eC>}5q=>TSLCKu1&6xoyVvjUS6v)bn+y)cOzEB!M!Fqdfn>G&|2{T7PT9 zouD^L-hqLnuqQZzVM!xGk5b!s5*PW~+g3qxtWd|`)`OJ}VqHFp!xm^b0JC#4Ko{L} z!|?G0FI_U>i3#gAd-LIBfz4SB)<1=nPz(USS8@P+`9;l%iD0_0DS1GHX2xbUFOfyf z2w`}QmV5(4uxVJ6MEdK8gtKBV@I7A2Ut)~u@vstk$!j$BOJP>@;_HXyPAF7mC%*g| zJ3-ux)cC9NGKw$pWo1t!e=|K<6?R3BzWln>Bf@)y1F7<~P&+=Kkqi?+K_XQm2K@+} zP8IV=l`t-jr{NsG_JSSw0ROn18djHae6d1)FRD*;7{j*sr&lP`M`I6yYYD?7SY!%A zz?3kyia`t)T_F~wfyrMy^sQmp3vCh1vKjKGPi9pHRGH2K#sNCxeRV8z-xtY!v#LD~ zlcFQ-*>oj-<(RseGo2!3g=vw~f}N!uZC;~Wu&<2ejSW{~C-;(8#LfsqP$nf?o2YkN z+lI7ZjYN zlM>j(NvK?<+Pnup)$u0itscTEbj!2}1FK9AwV?3;Io)4j+=Z!*kDOflYC|Y1(!yyZ zd|g^ptxUtu9SmTqVq5DGLrS7cAE6Y`7cs5Zwj)oOU6~?5i^q71RW`h2&ke`({-B2k7^P?8FcP)|&rv3z z;CF}^b5Px0TQm4g`0vOq%KAfJC8>b~)XCjhp} zpvxAN-b~YrY}#8%5vR(+ehPJ`nYI+j9A?V;6|I#UWMm`4^+}g>LJ78&f1uGP0djM6 z5J0upX?_gz1DC}~{~hu@YDsCU{)PghmoW*rsd-LEXgE&K zNj(Rnk>lE+@TQq_;7TNnx(kF-q#s|BZ#MS$m=t^62$wlqF2TtUDJcUDH>2n|4FPn5 z)P6lm2MII%ay)0aFm8i>w?D(s&S=*}W1vF7zzWEx6y$$Y8oG+EC#LUeRqTyNFbp#_ zNOO)jgH+tMqin3dm{Me-H9G^eC(|)>X=rA_n>>&9ujJZS=0rDab%HaWGgna&|zx+;_H42rY#8vZZsnkVD?fAXny*4b zIAwj;gwDMyUCo`A zbQjpc2z_Nu7DARf$;1O~|1n|u=|Cq#SJZfXsm+X1YpKArLxXxuN`NMZ+U}ilgrCmG z^CAlPXMdxGb(q`A3J|@ zkh#g0W~+Ow`RoO34I4@5AX`1Nm0%zEt6!#ET1DK@YZ9L0~H+8Y>xckXiloz zjg~fC>g)Su-&&>9&2ne8a){5Gbp9gi1-zk~qGcfoM8)m9YV~T?%I|NR$$D$!0WgZy z4f)V#gxlDTV^m?O=~NNXTM@5ftvdUyj(lZ(`WtkoO2$4IIh4&s0#ODEPV+I%8?Y4d zI7;yf`0U8-!xNYH!k(Z}5A9XUyzO;ej5n^nE|XvbS2~uK@ZSFL#U?lOoNsryLYy%N zWv{#LIZXkR0{+5XPhE)VQC0^0mGQYMgk3aaR*^M=_cFvy2Yx^*00z980yOLQrH#6m z4|F*vY_zVsRL2Q2{F6>`f z509H0>M}mGZZJ1;B`?~0`aNE8VNXY3!xcs{c;k<%UaEeL1%G$OUyg2OZBRl7xV0wi2nDUu%_j2=Dnt9Lr4ap?*4D&GHU`;P| zdMPwg(uS5OlW9qAnxDXy4$`&^HN#;EI5bVaq}hfRVE2lEIVj*i+9fy3j_2rErVIv) z?lhZlTpXn#XVBg8U_Kma;gD4Dgm)ipFc@&aH>M^fk z!q-Z6pU=h(zBY;Q6z?4N)zw-MnC(NzskbZxBdo=J!`xlK7!Zpdtc`roBa-6!jbN!x z`enA0C|qnI;RqTv9lI`sfkNm zou;n4!MwL~wrGW31lkEDB(l}yOMd~%cV3Pv`@&n2_LX1sN@2a}(}p^^=@U}-WYhFS z=VHP~ib%>u7jJ-uY)(P!k-{LlS3);*`P0=Q)78{EzSLR}nsTeELIT??&Y<6Im&Ki? zpTaxbopO+$@CGfnB67fKh;m?z&nX|qdO(Lr8jVp&uMT?=%k%B^vNl>=L}9_SKPt5> zfUs(lLDjVdaV4JH+aWs`)5A6bMdzW89Q42SXJ;=@PJpLlgzJ7ud+Na72xT`y^jb%$ z1RCnn>Ub!CWn6-qTx4!jqq@17c$_o=-{d5oaJRr%^ZU332M8TAIA*b+99thwK6+NfE?? zQ-oghN?X6K;|K|ifh!r_fu79JV?ZCOroux=9c6p-sn%jsgcf-7Gb&?QGIunS*=3Xg zJhq5wu)Bp;W5IC(6a8SFAzdOVn<+&_mM}`)-UxKtikT^inbic?s33qT=!qSfNe_5z zzIDyFo>WcBGh^3zo8b0H=bQa2=d5}YR4abiLC*=;pjC#|mmpfxWW!bsE?*+&apNEu z1phY8NJ_wkAU#rwlwx6yiuqJ!FQRO%7)=D#b2y%(?&AHOJ3Gv0XXD-;)G6J0BOuaV z0&f9=3_BV6Y9*pZpaNY`i_39t65r@1i*%6As_wxVM2V-Ej6)KygdqjAr3R7mO}SA= zsq{nUdC2$=8;EuKUhD}}%V(wgykO`5`@gUP-dE-FfOS$D;wO1`%mzR>$i4h{etK$d zt@Lm=l`OAjg+5I?PD*s!f=Hx%_0ltd>D0qVx4o-)X9tfKIWd*zS3H~z6bEnEng02e ziiO+Z1>3==Hz|~*<~pz{$oP#ODNS65HEcKaxOuY($L<*U@(fQk>>U+Gace8SaUy6l z?^k}KykSOU>vXBiUQK9>Qj;{Y3qw}~n7@7bKmHI(WiHMLOv2Xb&C!4igwRfxtZ$ec z6{^!3pRs`-qFq^nQ%XNl_3G{}anZxcZ%?BaWyM1nj{sjTya3&U^WM)zR1A9fAN=V7 zpo;#}M1u26C3N7}>uHp_O5Q^DSB&5 z8v%w4@XentFIvAW;FQtJr_&~eDTD1T7UOo; zjL}^r{#{@icc=Bk5v3^5z)~^}8l**?IPK!7o@{V%V(28qL@)UQsxjc1e|1yF*N*XB z7|-0^7~U;PsKVR2AJmeT{z8hlEzpb!kO7{Dk};5xM41@B+R-V`3q^}vtwAFzKv8*O zY)@1pzak^J1OJas2jk;x5S`@%kO&HTh%?hw$D8mb@Nhd$<5cBR%RM6oGwHu4aKf8D zvk>`CWqjf|us0OvR`RO08z2D_@O1!8CrtFJ!tNb<}xuMikEYD!I z-##n6rG)|7IZyk&9_%`>UmzLTz(98&MS%+A0tEd0#Fo9mtrYkx8&p$8&niOSJC&jt zDBB8p&w#ZoX`|#pMur&F$`PK7PEpx3~G^$>!6iwo&(a ziIevRbe*Y{E~K(ui=(!7$D_vaiGH9;s4!-VKP$Y-QoOdnV1<`+HsXH4GuDMgv{556 z3FD-=h<9>UaDxENX-k2wF9gm!p*x;qZ2R5mG`rL+0oE28Nx630i`aky5@G^s(H!9V zV}7Kn6?7~olOcV+#NbiRt*HtiKz%TOfbd-8f=o<^WvKY1y230U44^qmJwbAxs;U_i z%ZmoJ(k-#hynwJXq>S!V=o(ofK!niOVcv?uwgd-JL}m`6vrv!=NO4BN94R8&9{xVA{j@f->h_6uy~!(u3o#fjVL>gy1ghrso4wIj2CXN9JNb%ACNsp8XS?g zI{FgFw1X0FFH zyfa6aY2l)i$%wX5zM0w`^^!JDrlWhKdL55O>iP?v1pYHO4qn~MZ7E@36G3|lDy+lnJoB?g@}K~u|3 zYYB+v^{8edO6g!yHDFUU!(}@s17vlhWM2;(%fOnrq`k!1y8>5noO7xBciwdB(V|%@$)I}P{;`NMP&tkVP%DK(Rk05Qo zJV{VPL{u;G0W3is?qgnXPhCfb0Ned#-tV3pwu(BaoQ~_l1wK;SQo-wZn4RZ%jOAn? zJ++JnV<2fUYbfJS_$m!Ir*zIkrNHQ9fVMx-sZ&^wh_V}f1K1}_0fxz55IW%@npx9y zdxlNiu)F#(G(^sdz`3WSQJf`2j{;sY9H#|){m)Lo?wp*tQ7@~(~wp{nUJ z2CgQ4I4o)-LQh$W)@iDuvOw1|VDy-|U`T<8P%=8!W02xu|JRI3ojplaRUu0Hq|wx~N@+2r$2se`uxDge0Hvw%8|EklZ{&)h)EBBBh7*je zMt<@%rQW#r$z)WJzT-kM*xrNf(7|+Aqc=mrjq9|NG)MilMtZf`t@9&c^$?!xz-*2aRnv39%m7}WyXWX!(7W{SJJ z=F!Fjenf?~=n=dXrFL{hU#ozlrG`_A%temT^U(}AQit&@J>HD6CfOGzBsU+MAC9C_ zkhh9k&lGJ^1eyYO>cjwZ08E6>ruHV@Qy40a6V?S(p-iZ*f}%uiDM|(v#j7ue$K!zv zckLd@i5-Wd%-O0~s98*a8yJCP5C9WB$EHE32}2o>1JBId(|U9Qc?WMoiY9(Z;^!)k zel|UwlN~=scfs{WMw;wFr}^SE>Z_LHRIYgbyty3BvUh)D@MsYZg4iH`n-8`(>V_m_ zlfkH#HPtW1oMqGSg+6p=U2AYLj8{L}qJx_PQE$kzTX#+|G5A%xFAi?FCH$PSqn2ab zX$r5kHje@Zo{64TiHZpVZPZKAK=6aMf)?7(YpsB_U?8Fw4RFF!G6CS)AML%{Q16=@ zU?%COzJHrbEiVK~1*UyD3LnP(JBpkjw4q1=a-M8&<1g*?rk{prtfnGikVJ9&ZgGUywz_JSxERJ# zUZ&JwhpBn(ucTV=Fw)eT=1s=s!yEUn(mfY#P%D;9W5q z8O}!-ql<)7h73|G9u4qcV`ylvz|vAoE{ax<5y>!`7%&iQADtT%I&W=;ix5`q38T#O zY(Q@&4w1%~1D30aYj<{dSafUl=XT2aSngF+Pdm)fzur4-j{gz6;l;JF$>_+bgbs}q z8XjYn;hBq$hQc)2IBBUBZu^i5oIk)rE9_NOQJY@VrJy=_*~FX5y9;P@j^;7r3JA;n zvHpMHF151zl03Ghg`2b1#qG-jyDb8+&XbqlQBH9BVC4%Gzyf zXKaldvPkQ>Jr}zhi6n=Jx4w1CkK+P0XBv4OCI+`n+{`s(X*E{aabwLwb7MLlmg4RJ zJ>HB_o(}2tb)U(mZU4%fz_u@ia~D8^tuAcLY_ok#F@z?E212c)BsT{mCE6lNSneX@ zLo0&E*#j7kwSA@pt87CSdh<-tGB(zCo2adfwvKlqkN|tpR(}VHv~|C~6K&mxrz6}z z2242_8;l&*DV9qTAIE9jF9mVKgaL4v><-2SX{JzhitFhhJ1r8Z>zxZwqQRq@#~m07 z$^x9_gTdi0s=j$pXmdbVu09GnT}KOx%59=nNdnh%M!YTAt_;TAA4nX8eyH2X3Y(9D zVgk=LBO6RRAN6E?^WC|mk%jzVGQx92UZk1wN!-!I?GQ_gjXB(!16US>=dsmm=qV}) z2eiPrVh1b{+U{ZJiuSDOwYe#u0Pv%r_6D~J0l4CJsJ)54du?oGGM*$guc=ynv-AR5 ztkw0tZK&iAl4!c_7Zm|F^(~rs6lHU2|qf_fxzZq5Tar04cYz^INg~>)r)s^yo zchqxlF=5LY*^vU-4~0QASmcaZqXro?m2U_MS1+U-OT$(6N;6(b+$nNt$$P8aa+AwS zPC+@8=`S;G-WY+0(a78uW+M@xt!PDi2&pgPZnM%90Hro zC<6)Sj&qnrgOh6cIZ%yUyO#*1_)M zog16AN$)P%rP(=tX2^B?+qu=X6b_{#-?fiZ8E8G(J_PjrGW(B+4$jgDj&qeQ~ zweetZUi5zcnZKR?{Bvt#W23Z(`oE%B=RV$u7LPLWzjg~*pl;xMR^&n(tiS}&hwIM3vzAKO}^~T%1uIRU*5Kzc5Cw}{fc3;G_Bw| z)Vq%SzS<`mmFtM~#4pCP=OaY>sHQ2}Lg2`qNSkcJ1SDUV`|b<^01;&n=2{l%AGeH{miW{qEM(d@Vjpij^GKc5eVqw(aIX)&9> zy?A%|Yem(+bg=T`s(|Gr;Zcw2BUyg3-A#i8;yK0boSGB`;wVNn``tLSca74d2>*LPMwj{OBYC>43%Zxi% zWBuKoJ2xg}Eh?xk09iC9Qxi)r~t*Zz97pMr@T=Xr?*G1{Py9?9TSa zgJe{7E?_5m<-o7*a~%JDRt8P;U*`R(aPOm3rOHo8x$dgac+M$-lwDrS6qG-o_D?Pm zGg$hRqGyCrkqXbG8bBuW4olV1qR_uL3`ajOFk{D)igN~=AbxjycSEek`Eo-jIR z%~9su4=Ho0QRW92wco7pKruXB$IAyB58)*7Fv9lXU*mZR&+&)>f1pA7<{vh6awq3V z(N<%AWak4q?f(^1+xwHMnKc-={ z9<|W)ZAQTXpRC4TWuVRqHuVPytK+5Y);`#k*`uL+8sSOJ2s51jnl)=S=#-j9l))Ow zVqI1_ASW8p0UUqvMat?@dHH4(YS!eeLU*~Vg*@2Fx~2N(#z%3wxk5k7;F{C<=pZj< zMN-OmzrG%|TG7Tvlx5MgXVH2Vt@ol<<`#ll!RvOqp$r7CU6{$6DoHGDPYt~K0*r^3 z(K*nq2P>cN6wk&^_7;oq0v*{x3}^k>AP-|0h*e_@0T$pqvh3i(VFx|K4q$cma*T>G zB_E$+J{&?Z3Km3O+9V2Jj;H5ULsQnlEgf6b(Y3xzBisO6U&4=#M~~neK79Z`zHs>R zGP<{GKl}qPs{i--i|?Mi`~kl{d-<9yg7MGyFJHfT>bhlr8mhF3RX;E2%&3^}%aiD( z!+fJ35bk#x?i+^t_>#5OZvZY-`3Jx)2VJBLa zOfq~hpP)&maTGGk%lfvf0HSqci~ZmK1vE~cI_NvXr#)^IKU7)(3}+Ujoa$Eo)IY14)FQCS14E-03&=(o3P_sQPQBDE8Thmp23 zH2E*~q1@};V^oKrm4wosbgd%B7A5_FPSj^X2ZrsJTaOtWJ!!rK5&P{%)W_201il93sf!D(t-Hkz>WEa`GPe3_nJS~+2R3~_*tYKMjG9;PT(m;()P}8Ur>3k`7rNF# z3zS^9-9l*XBJA>B(qtQYoyGtj)7dZYlM@Z^^ibJuoT*IUKzcATDWF7NgabWO8Wg|oI%ym@Ukv96prqM_Yku!G!!`_vSJU(dgyshNE7DVJr1E5C z$E2|nEgAo?md6Tdkrr=64r#so{{HD!-``hVd=!RR4Fs2`MR;F`uKp5|R`B~*a;8<- zEC;BeJ@uIwxQ0!X$%GD8>Aib6Q*g&zL>S5_3td#HbN#yvETfb55Th`r#f45S&LEA3 zU5v|(x)AjGc+*6qW_a#keZ%hUfX2xs`Ftz0s#$g_TFCUZN>5ncs}RAcm7+xICp1%Z z01XaAj5iB}wYsomm}rOeWJjU7_2l{g?O1(32E8sLsjw(=%+^BsK!XMw0vqR_q8Ytm z=OGglQ|(75(Mccu_2p9bD+7x5y7rtUeX9qwDnF3V`=_Jrc#3B8ab0?SYajGn<-6xZ zGispj-McZ#=u^Ha!9-C`XUv6a7QMQhoylm(bdEr?-d@DcAR3>0_pV|(Si^?B2PeVt zFrT6`A)yJ+7|)v17fn@u+BRGF$*=0M}D`wXwLD4+D-3F~H#!IJAhFsO`dMmCBogH{73Z0FFmb5wBNE`92D*?_YNJU?M~ zIURiAgeD>N@g_h<65xR2hzu##L+E*Z@( zC;4`KI_>x3omTWPT8~=M`quq25T|rDIfLTqgJ=W(Yo)EK3Ol4SJHu^pOqGKL1JCS; z;>YPE6i(s4phyAFS$9Gn_q`$Ug*2jz9V+_ zOy{np^*y>=M#E506XCC@NePfTRB?53RxB7NtPs-9lGikHD-z>dOJNOiRRY`ElD=hO z&MY-KS;a&1$gVL@+(7GYkVphf90XJ!;$xE<)zfg8GD?bRV!psa`xWT7?c_Xt%SvSU zLXpJq%~4q!T?*2FqBaLSJf@jBmwg=Ix83TrC;N=KW z7PZf|ql&r3=4FIWTSGd+@}}~w(6p#w#CYP0%xpM-ytZ<~UvS=DtatZ6iJ^H3;nbq* zMTSDPc~#f9l`m%Eh{NntPTT2-8Z-OncCA*Dh~J=v3B~Wl&9hLZReFoH^4|@MN@fi4 zs+JfHXLxDQg^Zee{gab^7o8xERa`f-yOX(?BS7JFVj1f<*hmSB)pt@;{B~RE=Y!cd z@ZVnLGdczs8f@q8Ovie@BO@WB2E4mB^7Jy1gC8BfV?c|6&tB*FtY=Wkm_|D*=zimCgoUaMC|(Qpj+ zwDC7^L|_xcA*N*UGD*-)^?U-4jaHTppX@QufyOzCXE*PWZ^&66O28DkY@&W$mu6Gu zXifn-^jTL$A}4R~1|FN}9EfRO$K5_f#cQf$^Tx1H=0%2~$?yoL)H-8>oD&A0Zp?Kg zww{WWE`s#}=HpXz=_XMU8NNC1qXEo_;uO-grb=It+jeZXizq2_lk5|)gA-)ki9HX4 znr~`1Tam{jpICUDCt7<{AwUsz5B8s8u9aBINRkIYOqnJn9`&trIBMrBj^)WQ{glDP zFz=paqkb_Yr{6JJ5s*b@1Uu^#t&=a&bU_hq)ewMs*1}ienKsSIsdzNgZqvgt$|G6P z@0zsNS^+$Q)3qL0fWng>UEy>#4W(&7w?nLxWA5z0utXI5#!JH|a8lF$8wNm7ahn%u z5p<mzp5Ef$7@uSd zQ?@dfTCS+>u1tI5ZrB+M$$^lJLT~$vlmug85YJ{c5Vt;D zl1D=c(*<19{Te`0e2qB^Mg^(eX)rTO!59PR0UV-|)X&QNv02fYxM%5XWun>4H+V1q zKDSl0MI9)Gg^yZ2um&lEJNr+mNCtW)(2&ApL9JfVUHi&zkClb}i=~Qfz9hXfO+)#) zK}pE;o$X8E2NjzA+J5_1rA(c8EV>LKIJn2=Ah0;g}riKi((n%#k24**tW~pp38Z9eQuTo;w7M05 zqn^)iFRx}rd3^9Us-q|KzJ3x9*$|G!k9YhMfIJRDmqsk7fTBz8AJ4KG9CHY zL&QcCwYt%{{VM9?t`u8-3swIVjdjo8zdlrWZBCXd?&^T{{5;RrIo)IE>A*=V*j8Qv ztu1<);i31%qqa6u!7QTgCR}FnfWjK9Vlc#e=#6qU$i(MRlx1?}o7?6xhs`T}TYnIr z_00=Y#oxm~Iyegu+J)`-qVCuK78@}LGQ-@$k^aW@^jy*P1>h*6GNc%ZK#=?@bxsoa zBR6%a6U~MmYgp?^sppE`AY%P6%!V-YT2MJZx%41#T3GkTtCi-sRiXoRD{;c- zNVZ-_7ad*Kff)G<9DqB}Y$mumHRL*u&h(m;=ZvWlqJOQywP0m!jH4`9CoX_MNxv5G zN{2^|>xOU}I#T`mA*|0JS!nb$QQ&)*CVPT_W522U`nAdmHB_y_SQ{HH@Ej!WAO6R9vDnYNMe6Tc z$t4c32x8~PoV4_|5H~v$Tm8!XW9h-TSeYWvZ_`g%E3bs2hDi4{!1PUMLw!`gN_4U# z=ceFrc+ue5-rhX>XVd}Dw~MEg<6nIJ-eh9q^QZS79p4&^RT*Ww>^0P$JG|LgGdY8X4HmWicOAWG%%VaQeJwS=H#M@3S~D8LmUx8kY84gVp$m+>TdXYO ztx4JKt4qoj?%(N<)nDSam4DI|$vHUTt4&J!wDCUvtw)%cGs5p&q@-nTO;F+6Q3xDJ2ta52Vqr?8;|6A{0LsU*MpQ2`tYB1=twM^2|HpF08u;T6!dTH5 z2;q3X)2@jq{8eKuJzQvqrMs-ITe;Ioe)OifAd$EZ9_c(Wu}s`)g$k*8+ImR^X|&JV zDTtVHFhSfncO=)a!EoQ5HkTR^s)_KG8wFI96rlRj3~jE{iH{_-2FjC#Bq`3Sg!`mH zMz}x}|FABe8xQsuZf<TLzEyF5V5TLw_S3zx8 zhxo`uCs!H=Jii>;1#=)gN+?$be3(1Kl`nw8!h;=SjFchFD*^M%V=gg(ExL79ter_A z7LGTryMhwE@}j9tL$plmq8(Dud46>?UG9?=agp6YGho}l<%7o;-hYhA zG|7tI4QE(-o85Crz9iV=9jkNbnz)7bG5k*j_lMZNT=PZwhlM-$*o$ZFvVJ{&(aPUA zzK~?BpOGgSP2=SPGK${mK5A*qLB9!MX1l=qPvCJO6-UBl=8ijS;anoI6q|rBoQ;S= zg7YMp?acNs#EO*YJD-hd-ewm_xv+OM+%DGZC#7(Lo+?RA;6qoKBM%QwBTlECos{VG zETDT2i-Q^LF@a`~nOnzp`bYAT)eOn%R)c7PpX_K;n}&_m765%DIe1V$1WqG_Cn>j4HwMC1*{;TA;Kfqo-r4W?Ub zUCcGbp^Bme?F4I&%=oM+;ok1W#+5s~-`>9Wi5X12=_#h%Ve zB;j$TQ1VwWXjvX5!8*+jSFyI)U!EVv7cIL4 zuL)hhpT8c0%W`^dJPdoK-NdG3+^qzoMVUCc1+4hNtOMVr6M{%Z9)yjrzPcVOcvR*i z6*-?}O$<(FdtFbJ`5jj;Nm28@R~}9k*RKcHmsjda};bi4%-P5|GhfenlhTeFL59PKN zi9-9an>6A|!)wtlu00_$e=zD*@|Gw`I_>0Ey<3P;??RE3p3t|u(>%|w;;+YYQ8S)+ zsFGR4UfrynSN2K5m8C?rPL7{Q>evKg@%t@vvtpiZCu<-orav+y)~{7Lrp^+35viGe&S`~)f1QdSx#niQPEk+HXdE%wQGts zLlW#4u>u?xRxb3y-1NMz*m2$uf%9nEZ}7l8;NvNeMwz7W;^dSn)b{~i`7$m8WfwA4 zTwK=!VpZJ7K3JWK-wvxNdEZI`8*t@@kx%7p@y;jiyJ*+pl29>;sv5Q0UF zk2j#6y8)6&`<76vqw&FG7Ab^CKdzc$xSpv4SvbODU1oLZRzPa7utdEkDT#`|9Yg-? z1oM{_Y$TW9i$GvpF7ST3bm%zBQ6?O$8+_`V!!+`TJ}2fuL33NY(B0(rPCQWG+#Eqg zlyeI$V;l+AI?^aBQoS87_AoO5qIPp++{0-Q{65xO4>_+SF3PL(l*B#KQikGhfqWrg zO?Nv2pM`h1ry+E%ZZ1SIJ30ylpTWwJfgu)Ut6tfQy;ucn3zuY4v{v}}o^@oR{cGN9&#M;`unE?#En#_w*WPPPACFk|r#+gBoi-%p! z!;l!C@gc6rmKv-Bx!65?xCQ|RJRSAY5$~VF$z_al1@y|l{Qdz)rOXazNS(~}O^Mz+ z50)3p>PQ(~l%V7EJ3->YZi^&rkiq!h3%}zT_2k~)`6yMh;Zg%56&?!P?l3>dzXo&s zr3cIIwJX$wm0jpjybw#n(-MP(^vI;#jZi{n7uwDSAV~_5s4!PJNollE4CYVIPI7Co zwRt73wG%)|n=ap$oe0J8Qt>Tt+7SO);jZG|w!MIVzrpn8?yjPKdpUd6ha-7 zE74PTpWO}#x%!{W5@oQ6uiIpq+qMw0kDI`@3GX~|9x|RRTR@V@5~nY$6$;#=^b7+e zFHv~&Oa@iEK^&A`UvTg?ca9fjLrKi}DZ}}w(hwooj-P5`7NbpW39n{|o<(WQ=YZVk6trr1moXxq1{Pflv{1b9Ke zchR-HhCP^eW{ekhOraE3J5g~?OB!i=62-`L(Ik^|;z4)-D!b8!_WZquA&_Wfo_P3| z-c_cM{}j7u_Q?5$u)TV=Cm#C8FODGu3WBDoTv0^R;p8Sx9uKr%?2g{=@PT%HGYG7s z(v2k>r53z#>Nwo<)r%;xNtW&JHkq`N8Wpvn#x{FHxF()TqJA*HRCZlBU82+Bq8m($ z@<5+S5^Qo~Ut&6*>icU}7 z01HgSXv+-igA)hiN)dU7GC7JLX!KrM`K;CV<#eq}={Z?wQc?W0t+$Ln44u9jD@t6} zDuIsuO$h1rG*+R!G2^as=XO!7MrizVQEz`tO+n)Bu^~eH(5TktvyncGJsfQ_+<4E4 z5AHsfH^X(m#y7)DMh$ll7%xqu7auqod*4lZz=yqDme)XR4m7J~At74aJYFHth>nNDP@Nx`UtRwyyeP)M?iYd4n2#PK? zR;DYm!0D@fA$%P5lvRo2HZJ};F@pdY{wjFEBtNdH=hfW>@(v&9EYL%vXkx~3#+^hIM?u35xdOKsB1fIJO5|fMLAJCdI zzJhO3Ih3%2fn7N`@F*k1~-CR5jIX_=)qpQ+ajCJ{)WKuCKvU02K`2bPBWLxBWdk&p% z`psnctr*CKU9gceds(rAvPXxV4-&J0WEzP)-^PNmwEAXj?CUtUX|8$fIajg_-SSS0;lT# zB>wj1nSmC+QaM@vqWy=nO_Qg_d)Neb=|ChcE*Vp8Wu_JzC|h)GW-lc7*}cn+{-_#%|OD>>5!&4 zu3)J}@NnO`-=~7z=3W6NmR;>j=|{Rrm`|(U4vgvm4dAN7{#9?RQ&EEcP#{L1u2IW% zhFqP22=8m9%Bc7}cx-%QFg;(MIql!?>VNFqHc=uyhT?%+1Ss%{zb(ec@o5oC3S&tw(luqq=^*Q_P!hEIYY3_KO#44N5wYJpQnLFyX_1hU;5jwD^}!( zX|ZR-C&2mFXJnq18LcO7N$@%f@Dx`%NQGj5Bj#S0J@7E@DVD5$rFCda?wQtK z%=ht!9`haf9FsOZer0Ch}V1E7y;`8AaDrX|TR(EHiSF^_Tpfnec zBOSBSkiR|AS3EXLW9s+ciE!mc5Ab{5Z$vCyr~&!A9r3{!#@CQ91gXp9U3J3RR?XSP-&KAG{P|Klyc|3>R+Cld2QRcB^7iXAu zu5BG>S|>Fc$}oh7;+-UMV;?U7?0=o+OJM0}eqC;N{?Pkd#6yhuQklHuDWjA4*1|g1 zWSg?PF_0X-K*T4t8OeG0zmTHaw*hC9S!7I|tHNNlqA7rrYOCh^(3~m5wegt0UDV$9 zrS83>UtQPLA_bYX8MC;Y(%wz$T$SF4z1w_t9r5Ry*Hb^n9(5rlo)|seZPed{MmBx$#@Ud0KR$L;eYa73m-L6(rkY<_imxqJHj& z$S`epIyD;sr?SsO7@cXQ90{fEHwx)DsV^~v)==+gOTT~2h|q9!22#lD9jvSx`olvW zj|8V3i0f(i@0DH6arbvpXKyT?3d`oz%MQvt99&hqu+Zps?v2X-trnc9FJ!}lj=H0c zGsyu=PYhv|u zUt^8;S|=9_5Y2I+m|Ja!TEE`jCx$6ZzqN)7k2O$~%KdJx8kv-w7%ulk!ru#Sy7QS( zJfwcx+Sw6I_9%vGi6KGz)QXh=hUCEfA{77QO%RsjsG4S zgutnHJ5})(vE;RNpoaSOsAyi-OKeojl^Y#A zB@rx@YyZsVr_wZP_rM~p4IS4(Z%4lW0=B$*dYy30981@^ENL=e@}KQT-I)%M3*&(q z{XNz-h$O=k=q%>UEkq#=KVo;;vHt50b%TWtVy0I3?H4yKJW@{s>axsG6LA|Hw+*_B zh-D{D&UkjkX2>!x4FGmk3V=}KRt2K(0N2*{Z8tr;Ptce`>xiaKc;+Knnzdo#V9v`K zg3_4tR=nbnXxmNN%#$}WC2uuR90;$I2-|APC~>*|hjnxstCXY!ujLL1Nk4v`idg!N zGPyJbH3bGvk2iO7SIEM-ZAh3*TAl0j#s5jMPyv$uga<#S5ygXNuv+lkbzi=SXa@3^ zhXmHXV#X=901XUlS4Ri|zgbYJYdv3Dy#qg<%A`-_mWuN5;#+jh3O?fTAabbJi4Abs zB3o1z8b+c9h4;mWot#2YC!)@}_j$fvBd~7ywVbVw&JY4w%vfo{P=E>Ao=~gNyV&Bo z>sitBct9zG`r|lSlD^4zv3IfK6F}1EVbwRbJcG=}KHh8SfeswZ>GY4}Y!W*r=X$=z z^o!9>Tr+SqOmzT3{}>bX%>FIc%@dWz?wpudAJtkEx~G(`E|#TbdoVPbl7uB6Hxsao zbFvW~ZWcQo7l$97?6l=A6l>LZ${VGMy zmCqC}aR#U{1&}(kVB3w*5DdNfs0g4G0Jb z3Md3dLgBZTyp9w;5KxjE5D@miR~K_vH-M|7qn!(*p}V<*nWHnKi?t^M;8zX*m&;~r zQtw4wAN3;hQ|^RpcC$-z1+ThY$vnS*&LP{?(JwAEXzgn1Byy=uFUM>D-feK9puD6b zPZnh0O9qVSVUxT5BLLTDHn?#DxL&<_cH<~oZV~VCuz=uJphyEu)={^7KFz|jP~CM{9eC@ckkC5$mc*w|IRF+de0G6WXWJnAm8alc_J|& zGm!ojzN1O{F4=9WgYS$Ql^N}BlfN7CH?JAy%xW#>(0fguzdM9Osyq7h8o`}`vT6bo zA~e^FvYhv)&`F*_FsWDspYP%0SvUuAG=-t;n;Y3J2SW$2;>vOIx`^jM-5b;}8%Ke3 zvV+0e#}@iTX-t9c2eu>yT%EA&K-3`%lexeWKnFSk+=<#uTO+@WLVL4u(hnz@kS>@X zK*|10v5ui-oZUe+W7NTT4w8wESuYip$(kPOa zr=g}12A`I%2zI0!Bal?@GsO^=Ac*+|T%p`ld^qGU>5m|0XOeaCN3rf|-3R(6rs!8k z4Q;@SwjRnjE3uEQ*EG|J6No{0A+;0B?x)byw5_Dc`D8W@FOOz1CcmXjV_bUqJ#Ajv zd5wf6gBORJKAXEgoSi?wgGRg^-X9~nKPAdD{22XY=;y|+KfYYNxi%PSx)5=6wF~6Q z6MMM-^7?+WbAO}#0Ln<$qhkNZ1;7^?Qd-N=9sYSf3^|C3yswm? z+SxBI6}V;G(rOT|!>mkm)ql#e*RRt!uXbj(G~vw{W=mcmThZKnu6glc{L*AP2>6?>|)YGC9Zb!Z>rYo1ZF?|8M$IQ;y%W7*uKT z4^^;s6fhWo+6Xu!0|jz?G_Mv%Ah5+e%*7xw-YkWgzzvW@b5ZtoeynO0CGAn|Bkf%0 zQR99Hc3?JzA!0a0$x=wr)ZPhF#^?j3(-in6IsvLY+9af@Af;Q`M;NBKo4H?d#GEnhg7#LXv7yH$K-sxVBtN=}^U z+0>p`S5@d4{A#XCPTqj8QRW1o89RBF2#ved)wavS5PZ?Q&FlR(t6FcAu$l*!~k#x+(?T z=13i98Yc{G*fQ9#3>3YL7C*e|Qx02{$e+=Oo>ZQ+nzEXJ-^(-Ep<4}1an};`d^$tL zmu4Sm(GI&#OS?SrAlWB6T%*rpQJO;lluqo&vk?f|R0|OKUiQyLUqCqNxZrn>$q)UB z6sM1C8%RyBkz;(IE5#*9WeQkxf8*c!JUWe9k1ECV19veF$U!DyS48M6 z$hTFIvY>|nyb0l3QCskg6|==oN#>^HZrPDeI4K=d`hoU^aHmUfRF>i;aTM25ouEY* zR!hj>cj&N=frJ$pGaVmwSJ;>aI*W)En7c0KGRz}WMwmZLiz9qiB;OgH9^GP~olH2W zps0G4d{cmYVra-Dr`NukL}8r6EM(b(#@q%Gy!rMBf_-l+<2cfKhAv(Dc{ku4uJ+n~2fW$8BxKdJzq6zzmQFw@l$)pBh}^n|o= zW}JB}{N#UEFZ6??z;>cGOX(^Q;*bUblE;QpzBIfpl8ho{A-gV;pLd5WaWpxZgU#01 zV&oU3UHK~ZA>3_Pzl5;C;FqJ+noMN?E&XK` zF*aV&J(^Iks1W3#n?)Un4jHB$Bxc-RT&N{sLFp|q_-~mRp<8H{o`QMfRA{+ zbF<);IEA!W`pe%kG}|lS7Ds*w9A&6>sJXivejJfq16yNn;oGZu#iJPrps! zmjgz!eERUJ!zJ>j7?ZAo8_HjI?;_Y=;-n>Gd%m3_mF$WlHYTP&|0nd{!^Yrq{Ya9FX#QqLbD-zl)h-IF!w~mI%YJ|#V z0J_|mURi+LbF&osz(Q>W7RpF#Y|+Ut;6%9?&V&d#VSTXi%fY*I&h6GE9ETnm-dBD3@wV{p1K22CxZm0OxaWo#|IBs|1W!Wvk@ zf!Y{Txggn)PXIVZL%6}~ScRfgEgsx0a z3|q%eAB4b=ufe>w3Wbed3tHSN$Y6ikxQ*p)6$0W?oc9J(Oj~PeY%-RHRIs@N0Vu0o z9yeZILRku*S+Y3VnZX;7&i<(VzT3;q63S#(&N<)UeO#K})kcA<%vZZXZ2d%~)DAmQ zA>ML0_QDnoLK??+HD7VS>3H;4U4${ib>sOqha2dj9vkzvhn;(4;H%S0GGN244A~mDVOne8JF~reQRduh*v+?3fl5>TG!D#4^qXD4t~UEthSiA}$_@Rvw<-eldUWuZ4>ZkWqab@ta z^1u~mLE_nFe4h824x4M%#%Y4`f{Ut@pB{3{lLTY+N}q-N-@~GA>x@Rrm4IFs9-lr<>pbf`M+~uNUY#&=5+*t3&~naqzI{Kgs^dfy05%bj=&MFg zNO0oNz<74E`M^$Sd_K}iGzJSLFIWPJL{m(n9I=T%udXgme)`2w{Abr#<33nI@R}GoR)-fd@>l$(TnlXcagPI zZ{^9up-|=!L_DK3$sY@nL_?s;W03~@Iy*WHZXbo+by>qZMaRr=V;2oA)k7pk7+_%U z`K!3>e|4RDt_FHAo^T&9Co0-Q`5*C7X8aU{b0nltRxHT+*o7iDc+9dY-z%Jna~6f= zFwsfG*Nk0{ql?tzKCOWszXsxtm_5uyQL0;1H43`xC|HypMIZp)k?;4Z=2 zmh@G}%II0>t*f+h{~;mQA5K&mi62fTLGqXq#&H`A4QSbA(b#YyUL@R);=oq=ny&nJ zKWeyqh_YL&#YE#DZg<*1FA zZrvTzw4hxmCVl!vGKbes!mG4a43>^IiKwgQEwM>--!4seHqk7c0Xu z1U~aTH&Gy!{>Aw4tg6#ciC{s4lk^DK{=>nn0p2W&_XEY0N*%}p5UnEt+U-CR?+quA zNtxMRqc)2Rclb6T?M7Qs;5Im)pTkJA90M;oaz=q~KBfx)Z#A0OW6S{Ee)HlX{~Tzf zDP6cE=*y#OEIMxy9g3aH9T(ii7a`ZjovYLAneh%~>lVo@AaGdm{4ajQrzM^kWMSs* z>@YgjHK^0WDLMPee7_r}w_vFH4&k))fF2(qXFNi+8Zm*6Jq)bv)|8(BjWi|(_1Uw~ zR`uM`iOF$lq|;3+43iC45QmMQPpb-XV1%XdC4LM7()BUXh45)y8-PiZgy;ugZJ%hIEBYTf2_X=aDcA6`qnd!gR- z7}~G(i5OY!kJS{-$;=e<8CN+vzI+DJ^CHjt=x?OpH zQLcr(WHWlaHfL5{o;0Xs)BkFScgs3Pw@tlj!@rK*2IqwA}%#UM_6}`RjOe?-i-iY#N zc-BKFT)3x2+0YJH#qFdULqM_epLv}Ccg(vSrR2OH1my*>p6*b*>`sZ}gYQrqi;{6JR?|=xt#VY$A-sUX0BOhC->^X@Z&8ti0bu(2HtA&MgE?A6?E%i_a}~>Mb=mIslXa{ z_%o#ftTsVBOo)&f2s8oPfqOJgytdo3V!31KT7>&+6H~db!{vgm&6C_2)357iYFD@^neRTfXEXh zXuf}fi>Pe&h=&5-!9&TMyJl7<5b^CYHpa74mz2=1|JltTMN!x}a?9(PS>!>h4G-ma zt1Sj(Y^1(^Wv&jMHKop89yxs35=dRE_1h@ACU2HR?>6W=d#YiSK*y zG{a;1G!0?8-V*%zLt!X#<-3U!81Zo5LzmL*#N1==uherL|Gk{+=|u@~x5U>$QyK5;3a;id1L$p9G z6J7l;_(ENUrVahh==z<5*Fg&jn^_~rr8=WacHOKWZKcj{_81|Zjy8%;(`S7ivmIue zC(n?3rX5$e+Y&6u8+TJNjPP7MORJQEq;VFX0Tykkgj19w>hvQT<$PHvA6PMrLDiP2 zbl!h-!V5L@V}_V?hjJk`5aJ2W)Jl0Mj>okX5UPRET8NCZRt&VrS_(B5o(-c?rwN9~ z{wKoQfso*~TIN@T9@~!;c(oTpksItU#&CJ`L72u;W+)ciajhcYZ=iXewDI7Ru!64Q zHnS&F#V;JN9Z!3WO9@?AUi`Me9O6!h7cNG09R)|Lzmu!lq%ho~uK7O6BlpvUs)|pv zD!-az9>zRe50PZe*|3$s8=LquH}E2>{(|x<2RblNMY4sE%A1t;Q5aBVwiqXh z<)z|N<#39sBRYiEEOqu9!}`~3D?8di%l@PaLrX9siAa*)tNRWq# z*h5#Ds+pg?ydi5Sh6gLiGwd%mKLs$G1}^`kTC$X8(U@b^#Tk64-G#Jvn!+IUiR6@2 zWP>RsNQf&Tx14@C0Tp;`!8Eb6G^8|~k0jKH!RZGY59!Ry4Qh<0wAMhv1KDtejbDr` z3bAi3ptu*&WN^R+NL=JPhKAPp{#<=GO#cPO-=QE1VtT}$q@o&g@Bv?uAkL3A?Shgj z=lEnoT6ge)Hs2Qn`$Wz%pHMi5v*99wZ*a8|nv`%IoODJFZoihuHwmc2Y2MBe*_WCW z_+^kTW!EH`yG)F-eHw4+7Cyw`Wx6vnhctVh0CJ3-qY^-*V0_TrXWYQGipoOk1A7Z= zPDf`0ip^mNaqjxBJ*Y_}&y!SwpQ5(uK2M?`Z@MYD2=eUeN~lE%apv&8q&i#lqu%JZ zsVcsRLSK{irnq*mlEFUoAu|8sI3=$8H%b^AOVKeF0rXQ5n}p&lMo71Pwfg1C%Gv z5S*d%ULqe7VV_f2h!{~Jt0vMpils$0tzb+sUFv`25W(QgujsXK&frR}caWv~ya?@W zx7s7=J7P|hYyGKGY}F^Dc=Z>fsb>3 z6EiezBD_<_L}MMI#ABr~G??p&_~+t6cM%Pf#)|%7IRhNu>h0VXz-x1AcIV7ufH7#* zu5tHV8Osq)H7aq=j&C2=<&5gXDd>*L7MFzc*FfdkWs(H?m=?yT4h}CcDsm`6j znUW3=bed%zSRUuc``TcYA_SKE$aCJPZfF#fw>C|q*DZV*uHk3$;DP?r11 zRfQ&483v0?@h+U3);LI$!D!_h^g*iBh7*D+fZF7#?Xj7)t;nchC{eZy&d9~VVX8>n zyNVJj?voITFU$Y~CHu~U3|qpTL{(Vqt?%uYfn2xg($I^)qrevTQ$e){c_Zr6{l*1q z&=6CUt+Mo((e5MRLVftWc2o$HTmYj>Dv!78iGMe|`7P6b$!llGXvj|Htf6SL$RydD zKb~OTbw~~$L#+jyn8LxMWQaBz1PddHcIdMVFep=@cNl-M^cv^WfFhXA{A*QsC)$fL zFi&j5J>o^JIo?n`Z#I01niJKc7^$PQCUX@4v3deUEnxm8JkcHo0rsq_l;zdkUhh{V z2TXdfwzakd-y!vzVLQeX&#gh(Y@?W93m2=>NoxQZH2jW158W~aQ0PG>#K$2w9-*!h zB*sKynz`ptPwrZQ4?;%9D%rqWKo!jVA=!y-kg=Oi=GbJ1t^7IVlf;q7MjqzUODeorajTJJZ6DWS9R@+c+3X&S zfE)Ol2P92OWxR4Dvbn63%V7NC#MO48O2~PP^GTApk~apC%VT;$F8|go-Rj}QzOq1p z`-LSYap-INI%}ncZ*}kaH^6A{PrVcS+V3eiCe_sFDF~Xdy8=2R)1|Z5PqFVIUG;{48`r4p4`~8l zGr!leCHgI16pE^tFfZP#qkjP@LNtP|M%wiAKmGe#X2s~_m1L3%8kloo_Pa_}WPY%pk z-b6+sPrZN4WG9&`={v`uxAX5b&!b#$0S{&0zD|cN@9Iz!BWfLRUz|Ty+oInG(1|$>m0N1V3n<}dD&$nEWD5OEB2EJ0<4k`Q%-sz# zUs8&z2I2WH9cQA*|Kbcn4>-mECScphbnWlUz&FR^OuF5qOmSheSh1S={_;=NrAH4t z8$ac=NuKS|a*!>8IvZ2>t*+`Nm4~k*7#Xn!Kt?0qALSQwIkhosWWH5IFr|fi;^fjT zB_1dR9^k3_(g*!r-4xknz!YBnNF{Kn3Wj}QtMD?4VBj|?Bp2}PXU!Z3F6PnxHmp3BZ9N{ZNC^Gzh|>RZd1QZY0v1r?3Yqjv9+61RjxMNb?c9Z2J9z(R*58N>wKe>^A4r zEuAtKX8pwLuESg~dn3|P7i>>Ro10%g@s9%fjskTpr!sd(2Ho~PNF;u6NVyCLnlCP- z3m8p>Zz5HnPjpqiz?9#>o7e#;*YZsmdU*x@atIOY_YfBVy>2>gEWhUjTj@m&*zM@p z)v26Myr!i`w>3jt_xNgd<#nao^730hp%f=Tb`+Y3<1#Mj(tc+c{_(9V0>V@aAaAMU zooHHq`EgU5*CSz1*kKsD<-pc7TB!@q zZ83`T85TiW4dsWE6aI8&g0{4la-ck9o+hX)?FK5p1fHZbd$LWA#vo}VpclFI9GVkE z$Cgb1S=)t3%psuLoZ*H)t)Y9_1Nv9-K(@<{#R>=-F)?AND^BlHMDe)UC@w;NZNLm; zwvAcJyQGX5_pA8nNmROFV4V-nC92|EB9#r4vBfAN8i4q3lQh{d%M$9WlK)2n7`dB8 z@QyAU)PRZb7Y=?e(^)ES#6PTdW^*=kTeZ zJTjdX)&l1^oQcwy>L&zcuBNSYVg>!5081TlbKo1VQx4usTcw=g$rAb?oSe8FZ#a?|Isu8F2r^SY_+UC2`8c?p_6EpQ7<(17 z9U2C@c!>Xd{K`kIH4+I71T+T%1VsJ+9=`&NO>K=WtsN{G4GoP=9NkJwoHqyzRmC%hOQ=vA*ncHz}&Gr)H`rYKMgtZRwHPN*sgT%*yLVs{Ch4)dwRDyHPE%KTh!*eNWp!B;Zg=)xHo1#2GcB?1k>QECiS7>dUA?>qS z3pz4+Z3yh7Yjc(t#ayy(obRTHIjmMC<6f>!=f)MG4eV5#+GnLKjW7GZOFe68Qo`I% zgL;QhnMpy3Ivves5yPn{J-!0vc-k&a^_+Oq&oEXq76;VYA+S&q(2d+6uw z^YMJls^k&9BL|6&+LESo)5y=(qRK?&{3~4zPiDIR-1>zL*hb3kA<{Za7{sy-VMeE{ zQl<0#BP$q(0(^fxU6J%S?D8!E5b_$Ue*SZu9_XGnf%Q*M;D35j{dYaB9jyPiobm~R zwnI#C!yf)HPHoLdB4>XK{2i$9^lM$Ihub3;u9OrA@w4{k>CyAn z;UZ=@zI%GRb?2$ZEFCr_QFfQ_<5GSW@u}zz#Nvrk6%syG&PMED2UP{L4JQem*SU2f z!2s<17C~;V#6A65pY6xVSfi`}tw`oBN71p}=0txZ-NGub+7Op8vCY!)VAEgwi77-e zoz6dcm#1-#oWBzf^@MKf-G}jhntfMZ$<#GHXD>+F1r|vEv(3?FYtewL&VWSE88czK zq3?23P5k5;U2(tj50;(&2L7MXJ+_uPnEV%AJy0MZ%KsW&Q%8G%vFrb-6&~q3ROwO__ZBXm9zyN9lXc0q!8wtCk&MGE&Ln;c~Zk>VBj-`M8E*rz2(&8bsEph!zm{r zS*6x%22(WNO7`UYYpRA!8mL~}$Wkzjkpn>(?HaP*rfEkS5d;g|Oc zDHANE(DhV_apaHp4CBcv>l)gEFa>&0-l7hb5{vK^Q>advRUizQh%OJ4c9&K||O}fXRDJ{n})lnH9T`2H)7ZP$z#F z7qGMQeO7!cjvy{z?)8+UodO@ne{P%9`T>uZYzx_ez&ZXIkZSY4DmE4@jb$VI4vv?I zH{FmTJ*1?>$7g$t@K_k*ApQXPPwj?arJ}x|fq)o^{y%Ej-q_jJ-1&d%R)W3hu*vnj zZP;Iln5Gn)Fmnk6TEwvH&L3@*M3LnhG>j9LKjvDkfx%9e%9dr(>pQzAPD0K-etAfo zHs*4&*Kx-F)=dkxjzLa-+hyIDlp?M`E6iD3!I6U6Q6#4F2Q$Qed9rZE`IUR#h`FOs z53M@0n?jI6l6kx`7UTo)<^h|WAS<)HKYllQR5n>+tX082ld;q+45DC50Wa?cP`ce`zQivaDlbW=zp`}s4`3Q_NLY?ay zeOZgz*7659x;(YGTnL!41A}=O$$7eY%P;0Tf7O|pSLy?!SAW3D67yT?T~~~w$^C4Y zbZ3Veo1xroaey1wlUxF-h(U7HS0c84GFoh&G;C#w{E@GGXdn{%bhJG%fl(mCm5f|m z)n+vv$JK-xi}YeO-QLu(89VVUCRWB`jDHDVg!C;h*LG|9=`rd3ai~#hTX(es>`Wzp z&0(3HVzAcY85EEnM5%%`B$SY?QEvKgq@e>W19NlH^lVmwX|@s~rQT?mPgUWh9uRU5 zqeA*%S>$Ai{1KDUOlMGru3_7OvA6r|PoGEGg@pz>Nmnmq)2sYlu_zA;^6gc?02l^~ zb2QlQLf@Mm7Wy(8LV3k9HrhQjwikqt2$D*_Up#yHFL~u3`B5An36%F5q`nT6;jm1p zf^x1=CbVDP`O2=IcHp3`B=bfcvYl^e=VoJ+O10PSw5g0 zs#^pRf%kGuJh;yVi_!B1@Q5YQ?K@0Z^dcNoK%AVZl1Zb!fR;OFV2#seM-mR|DF+<> zPRL`Fh#nL~e#i{L(~O#pOdx4nLJRnP*;!1SIoYykocX6SQ55F!d(pKNxSUW>8sGDOH6yekMKNvg59?_y^TeoeydpCF6wr$(C zZQHhO+qP}n*4-yJxygHSl5;<-KTye>Yu2doj6z`HD}CX_#qqp+(MDZ=~%QCBYPw3?1lHY8+_N|z_7^s!&s`+bEV zp(Q{>;KFHtg>E6Iuf2?a7U#}5}Svdz6Ob?X9@phUN z>Q|a<<*r37<1-3yf~KcWr+n1iY)%)=Rdfm)eZSH0Y3Jfn@C2BiKh<);h}YJjl{dgr z;X_8#iFWb!_<+)<1d7R#W-Dge!isw#d_>4Y#-ugYfc$afWnceQ6#Q>BUO(YKhJV1! zVc$ylC*`>HYnA=N&|<4D+3@}y2Gwr)-DZg%M)MvuoK=W1l56002QhUAyR-`~x}KY% zTB~n^{0O|Oqr-K6C{GafA-9v#H-p3ZWz$w}Kg)5pZkexZYYkHQEUMH3->51abQKfS z^R+aEDyU|m>zoP;k3WXHVcHGHk6bk(Z}xjzoOLY40WeW^sfcC|5_ z?mlhaz6#*N;Rg@r7idnn*x>zwkQLulEO@>ecUA2lvr-Z;AAp1CsxfDu3b!ex555=# zY_>x~;)r&u;_!47Xo+{hc4h(%7%C##28D?RJUL^5$13KvzN0R@rce8W;8Z3e%cE7V zK}miOuQmz;!Z8aXup~sKZvdD!lWz%QAGi#>v$<^1y+W)EF}Ik@0v9H;+M56pO`Qwh zlWkUszf+S~Rb$=^32%Nvc>=bWIxO_%SWBNa2*!#&L{@@eB|ArC0#ULuJ@So6a3xg| zJB4dx)6Z3=UvS1qEqed4G%9?UZAQzEj10~^zY_Jq>_O3vX?n3`U2O4{rsv&zqq*zH zpYOLRc-`!z(y+YIOQi0MZ(@vTP;3+-tjwqkHVX!yc(Z*DQM5_jm@i1{e_jGFI(Ois zk1%mpUba!1)i~{qj`_|9#m9}D9w{3Fx4&{SD><^?yOM&M0OdBbe*p`u$2^}E zBlwN&+XT!4woMt?pSGI@T%|mm%cl80kAdf9pmvh`y5D9iy&qqR3xlU49fk%`oA%M* z4BJ7l7unKJ4e_ul?KpWHYix8^Ja_FmNA-FuEj=QY)K9{-RCoT&Dr07(q)*C@D~IO) zeZ=xu0fWOM3r0qi{S2~ z{)s7>%KO7gN+kERP>a${Gs(D@`);DYMp?W)i$F4oFpfQA|Eaaj zrr?;O_y=iK>blY2*%6NI)Qr?Yaxe!)jo|Zp6mUaa(f01|wtyYOT|NKzS-U!y2wTS2 zf3vO!xXk&xfdK%#A^-qT{co>-2V;9@a|dH?c*T;w?{+2tKxY~$_|l1Wer|@UbWS2_?4STu zMoy9 z8TnMT4=FDZwv!bldQTN?8LV_`KT^~W2F+HU_Luk&-mldJr+Te~BAoay84`LiL^iW2 zc9QXB^_D||aoL(ulw?pX2xV)6kqK^IR~vPbK466#KMBNKvQh{~b5LBJ?{*cNJxmjU zgQoZhA9_3ZthpMu5{6gNY8g?wMAcK8u+$>}y^a<-N~$D+*SMP>8iDA+Cu(`q3I6bJ zq#ett;>e#aTTJkycCbEUKO_g~8(=1b%*ud&VU}4ab?~K;pcw>CL4QAkdP%4vKJ5l= z!Xa9_s3I%D1o@GI0X9FnW7OLEzwpNbLTs@}Y7dDccc~Kqq?xNtP*BxTF9!~?<1D*8 z#4^7Dp1VtgIAR(p>JiMOZ0*&LAm5v)+13##x>?({64D$;zVie3PCIIRL{Ji>8VB!N zzRuvZ)EcWf>Z|2i!mwMYQD-$sxCA5J{C&86uv+wDkfqUlg&H5pIp)a@(iP$B)lh}O zASqC1@?=8jLb>7wT(ia_iLtt4QVCe@x1d+yhg&Mx5CXGR z4V~v283|etKLWb6fjrRy-~lb#tN;*d7S}EL!B$A_Iy$`SEYYM55jGLIQV(DOI}cnZ zi7(=CPPs4#V|v)}e4XxDJ8-xjxX~9dKxPsl5xB$p004>nEW?;GqZCn5f!FFsh1~VT znkSU}n?||KY^zN3%K?}|;Xd{|?5X-dPNlPo5b|Jbalpos{y`My}h2$nq*&JvnzXQ-|gV@7O&YXfs(To-1@$TqH)BkNijW`y|&a0Ok8zTICGKBkg9 z;GG>6=L&uR?80w)?AXHDGI!4I=6=$CxncqAfVP;12e2=5sl%q&=rLvG`bRxf9o4K; zOBuFgYMq%G2)5JMKwdNP7Xp3|J#n5XSF}sAY1M0Qm!Z{GkXLP(RL%FPGVY~Mpca6j z2RuC+4gEFi9&mrZ!x(9UJ$KTBRcW2jj#Z`=HDl+^grA2{bSedt1-$+U>B}06*TZ(3 z7lBTLCZ7sKvAcz8UVr{+0%PpG$1<9S?G$8JEW4w%t>Y3l^$>^5<3nj;@PaM7Q%W>1 z35e^r+TdRVu4e%ra1xc^RxF>^WQ52qXa#_K{JV*j=E1>n?HDIuMd0+Caj$m1Ijl-6 zE3M_w5R%@S7d*uv8|Q$#c4I=C;w)fB^gdXpDCV!}9H^ZT>=D2Sx_sGhQ5=q^`zoS- z%(%Xo=a6s9#rgN_=FRRe^u>8X89f~T7f)MmtnYy?Z<|dS62$A?lFzle5C1?yb;t+4 z&BCH2GcD5r@sEp@%xB{v3iM~?aA1I!D5MY{Lk$#A9dR}74v{9DbvOGCcj zY{`dLwYCH?#zm#c{B3@~x#)V~lGq?{l5LKZCqf0`1=7At_uM{%&#KPN0#L@yo#qsy zh&by>i9y+hXihmzeqp3!FZ4nR(K2^cEHLaE(reJvb0v2fdUJzE zak6=0btl-kk}fl4L5CR7l5nPIYD_jyN+mcsasPTnfDgnjU~X)$PK!J2qEuN3wrn3b z;y5?-(ChV)HA+*Ck0^NBt#kTk+=s$;!y`M8pe84FI1d5x_^m!S=MaMc3r?u5yi7iB znx7fSE)S|qMUJ8QkWXWxW-9#eYxV>OVcsq8e`+9J!hun-7ytn7)&Kw$|JxtT(azY= z+{FC<${^R=mX6r03A@jfBTFjjN$2eAt-3R&6ZS~ADHRSf6fz{vB$OI<5b=#zGj`yD z@=?cMFPAo4CI0<#Ne5akjrz&d_F!gASlpN)9Pi zlj&87CVvt|RwR>^QlE~WC5-M4DYvb%yl5?xRge4iAGo;j$O^LL8)tXD%{Pn2ImyrW zRZDfd+&^!kG3$ysYK@{`W(tI3T#F#@6!Ymc;yG+&)b zEIc8*Q`6w>UQ-)>WZW z?X#&k9j6M?xMIbQ*V{b8LXXAp z7$v@m4E_r32TTDfQQi%oKw;B}XefrVvuRKlyUGHvArT`S|15!$bLwNN0H{g{{{laY z^fc6-*hRCn>OnuL?9lK>TjSW$f71Y>kf`uZ;o(E{;BDSU_D9~N(lZE3{2O5bOySx= z@?(a%E<+YVDM+T=02sX-d9KE&2S0FY^mu958A#Rub;L+ZU6JRRYRD5jzFBcK_$?Ve zLQV@fsRjLt1JX@QV735b)rZE6nU3T3At%*u({D$e)0~FpV5`-OtSUCO@GRsV6h_gI zfyGANXIwz>2B}g)5m{~CsD89Q05}-jX6UeEaLi^!r(JkYDi z2$E)+ER_I{51*!XYP`eNFM>iE*e^3dC7ehN07JePsWEd5TUTG!IE>I4t0kzWdL(AC z>oO`!?Lg9*;$VlBF^E2X2tSIC53exS2OtVh$6>~vYS&llH#dhJ7$SY@+^ho&?(z{R zAK~K5j1&EdjopZEIT^wuwFAhvu56Z*PKPFKl&-~`Rnd>KhMfj!JDLK8YQE~he>ig# zi27ysRra%ngeYoME2^Wa)=VQoN0x=-5U{F-Ru?0sfZ=ViP%^$pLbZ1{$jG-h_!wJ= z92yKR8tcYyX*j_D2E?rM-o-TEFg*p*ITX zV$FL~$adQ5SDuahajV_ffAcK9STZ4{!*ul2o9@lXHNb5J+934x!v7p2TKB|kI zAIO}Wk1XZv{)ynMOW0yjpuHB|eeEM=j1ouiDN`?!%etG)I$3c>%U@gYjOX*s5w4o# z6<~+(5dB?Np|hH@ zFXaX`;Lw&xl6-|{Hp*1|x=Piv;713vg{tWVI* z3~QQ5%(3AignpjVI7NbM(^Kl`8kRPDj5@GDbe>8lkV%fH4e_rUoyl0dX?}d_{vaTK z$VV_2<<+)VawrYp1?CAb?ClxoRg4j&V>A|h7#!=Kv1t5D@rA@B={lSDitTaGgxC`U zm-&s@GOhQ^KD7l^N1i%+2PdayOlRDn!6Ou@>5iL258QOn_jNI35I|*_3NU7I5FAag zC3d9XTY3cLc^8t^j$#0hRlYEoV=zCU$r++Lv-7YD;<0;Nwn9F-^ENLRj*ZzkM+AcP z^)jKc(p46{9i=LjhAd}TU(QBW_ID4BEat`!rOU1<3$X{#o`q3VZ#pvm_En@#H zb8#HadEg2J_AsLi=5tP#V-y0POp?oF+F~PU7IwNL95=T=!%=x`>DS6{Y&j$_!P*1L zujZH#U%1so#LWC?)Kq|x<9P&A;MHR-;&`0n7^eFi=h4XN zR(EheJt}F=E@#tceO}*6Ie7Q2EaS0z~=agmV|P!T!mtvGE}({z*apcEcJm zR;m*@2&j`Qx%2|B1qEvaV(&e&OUf$r4vDo;)B z=lypcq1n@uvAIs7XYFgf2M16xUO87{9}RgfY~ z1vx?(ObvqV&mL=bu{Z2meZcV8PsiNg*AL5sBi!z1M)+*gp|cPEkDKg!fYBF#xt5*O7sLf1+FO^WVcOT{O3I6cHq@qj}yKK|5o5f(L-NH?gv)KO_ zOo4;#!dtcbrJIZ^KsmWJLuX~;^k(v8tBxy!Y2wkF_Lx9hLHU4T>>EVq;32_lwNM{3 zcw0D|GJ8Ec1VD$#^^AaIk;cjFil!6*`*CW&ID(;J<4_4)gCD{K=ghL*96a4Pjg1nD z8Wt)xCeZ}xG{y1}v<=kFp&9$u{Dhpi$jacP5M&maf36{}>4QybTY`6%F(4WWotmD@ zWjfQErhPVL0zzeK9h?9`)czgC_g^~D!=chLJEM@?xGZFPqGk{~9|K3DVv|;CPmBBU zs9TND?Tvu>IJkN{_s!;YXYv>ZPp*tOcDWX14d%I3{JuO3)5z=={kIECeSn zi@z?B#H(vC^}E!0-kPyfMA4G2aDM;x4gR1j70er0MhSvM(fFy>+7HU&>~^vTYzr{2 zj_d3>NuXWUA%}bcj8Ow>Mo^aHt5R|SkPvRLk`|t{r{fbG%{Co(2oAi!QS|sakmmdt zt;+>E$cjMR)QR@oJ7Rl(@Ob+QNz5V2T2G2>f=61FE%j@s@gs+q zE93r^I85zZLSSeq=MHhNOIl)HN3vFsb0STBQH_85RYfbd7>(IHv_?einC3OlK}7Rv zfW**tIbJIa_yhMrwb`AkX0Pqzl9dU7HHXr z?i&O4?C_%#&<_x4hr|kzrRah0Sv$W*oTwYAhm6==bO=U_=mSW6GCB)TxG*>`7tIe1 zC#RQ#^G3&#M+{WmS(B-9KCNasrjM&os&UeEI2Nkvn_0!4cAtHo15>TWJXHX8% z`Mtp-B}w>ft}+@yJuTv>H?vgw4%^2BDwdzA^W>V9MZ#GTK)BnuBqA>0jtQB~8L02Ccy{qc1)fNQOd z=zcXT-lzLrz5Ipkq?=;#2+6ZW3;gA|#C~?j`P$1USGh4E910+JO!^&B>~O25BqlmM z6P9xkTCZ8q9MmLFOKixCnNcD-4}wYb>u)`o_LluQA(V`jMLb)E281~@_M?RyC7ObR zQjvDAi3XN`p_GS5*Fv|YIij6NoiA(-URCY#*`Xe1Z`NM9rAB}s=05x~WYiowk;U(} z(KBU}OJeNixa;16+%I)Q#=Mc%5&a+GC^x-s){KkqhVq&RGb?%sy${|CK3wv-&rfx( z(G>ZN{xnhsRTOQJXyhr{hkU%*i3)a7DMc{I#?U+HT&2;c6HaX0OEEF+-kmqaFQ^Ac zi0$~ArH>d}VWrnHR{gsXH)4mEaBbnLOmA=S$Awtt62s z&j7IB4qQuDfi~*1yCPN_rm7pvjTX&GKPK*3g9Ma$7Uh&=DU=$xEWot1O* zvDacf@KI>Ua3xBw+cg&6=sPxz!KkHPY9A7%{mM^X|0HC3H=EAEzaxr4*Em9D!=?Wq zaldsg^O+?4Qb?Q~BlUCO7T#bSoI-C3jjyeJKmLY8NUW{ivv@xoZQ|k!k4f zXK|<&?DTQclN{|3W3AZgJU&JGb0Z?W$#umcNZAK5tXwkKl-&l(ZDN|c$yt)cb8X(m zz&`l*FwKF;P$EByoSJckJo?e@GREGuF@FgSFglwasBejilzHX#=?TmoIRvxHy4IP? zl7g08g~npJoq7;4Bp*??Ae*_j6Da1*yj&`g6hMuGBN^ko|8SbBAkg<)o*%AW`GCjW;hYh7=%6aC6``w9&bRrV z4CSXjx32N3LUp8wF3-?y8HCl$a81h%tJu55W&tr?KnqoP55!~{9;LVdaOs}?{xH1? zyb!Etr+|7%ZoAz|jFF0PZwuooV55LeK&0~Nqp;zLzbupdl;d}B7`;m?J$z!X1nwHF zU`?`XtQ;sEbwm|p5 z^n}*>w-n+=i@13Q?}S`u!-4BR^<_}PSh#s64xVJ{CxKCaFiGC30nHyb)c6c!hA7w`C%3VbdTm=< zw0z7Q4;-&@$6H{z6@{QgPr=mGaFod==DP;d&{P%nG~p@{>-F8y@R!ahk!k}5WuJAOry-^mBaOd`4iTJEYx7oPtO33kagptM*^?XtMP>_%cuQHF2;>u3Q`dWSuko7KFO-GadF( zmRq(r^SS}gfwo}CGbeg`owhl_?=$-e{&bbhOBHJn(KaIJIo^;4Nq-pnn)A|O$3i<_qXYk%tW))Ac~lEqVXlZMcG~MiO`;N*8p^_%j-{hLcG)## z6bLqTpd9KW~aZzB3l7FIbgBs##WucOu0)rC~Tv-Vx$l~5YBV=unL6WBWQ1IIZJ|HRK z#=t3-Y{xBC+FzU09(J94Vm-+&JhAkxK?39(hJ&|cl&%=DiuUjT>eC?|QPHsg>!wyf zRR1)J7g5cF7rR_Cz2(GiAt9A2cA+AI$)*h#hS~%zxb@+bl`1r)y-b#dE;=pgij4nx zfi0=X{17a|)ws05=nZhB-eAAJK~5VV?U6U&vBUFw2A{mon~s5DkU1_y^#;KD!J(`5enKm98l>N zDni>hWLWwy;!^5e_?9c7);R?c3r^HSsRhEUKDE-svKF|7G*8f>0`pHq^csckeCLAV z)JLFe&TRa5;}&m`eloA#;jOS&_J!s24u-&#K@fdF=)VO9g17b@x3#Znh8P^m{rQ>| zHwM-@G!GbB2Ruzf^UB}O?%*)NKt3VYOo}EaVhGx52*M8^*Qw!ZD#u%rIEt$-vzyPf zM0m-tj$m9X(cB&EXE5d#Y&0{LZ|Dqe^MeF?<6O>H*!EiM^@n(bo1F3^?#n*SA`$=6 z(B;4p=i@d|JRhf!coCH(A4S>o1j*a5cUwp~5rc6!7{;|y=)_eh^0D>iw#h-fUGS)8 zZVrlF0Idn>b-ol0@w0OIClmc}O9a)?bh8)j1f)a?CLwyK&>M4Q#1(F`gQGtwC0zOl z{M5>$dfz5xi5*3Kq@1#hrZPpWUb-Zd6NS`vv&VvBvNP89d@YTW;~ckK}(FYdAZZTm9EW-davla)=J0=Tz0piB|h6MEIW2 z?XDhNKRy_hmhjJ})V5wmlK92tYG#QC0*qitx)*Ij-{8E6(+Z*kYoUu>3km+X-ctz1 zxtQ3Hx6s*y9rGDW>ott!ofwYwoq@k%yG>ps0j8)zdRv^#74(o;nDn1h3zyE(qg^OKXw5;Lwh4a7CG1$pC+Yx zuwX4b#sRjAC`w;+X+a1T%RFwI7N)&o^xbpdG>?f{QH~QCm8HoEvt-K*g|NcK2;2XxDctQy zzCJ7f05SFdhh5g?-;l`M*5+STk2S0vH(8K=YIOY80`4Eea#;kj?Ns%T0nZs?>xH|V@+J!FDS_^%F&bM7=P|NqL9DbEyqL-0+*CaBKl+8@S;TtX%t939bXCy z!-vw7zV5E?;YGa?Oh^2C(-#QkBN zWSX)zAf!n238>SbLd+qhPy|i!6$?|rC2-YL1nO1?^+GX!!+OwhE|cC_9gXdMDWH+l zk20)VO>d|VcNz4fp_Yo49%R~%Ow-lIGupmVJvdc7cgrX6sCZBc8-n7cx`tDYzgn+8 zmv~rIVZeY@nV7!Z31-nA$FE4ZQhj4ZU@nLxZen~Y>)XZ*H4HGyYnL0#pykfnD9b!2 zd)Um6V+Z+ZE?}Td(qp=NF|q2&s% z(Q*uMT%aAstBrj~6jy`Rc|sF=6`d4R91@zhwGK84?;>3YEsr{3Q5nfkI?W}oQ#D7( zQwBz=c0zw;ud6p16HQ!2C);=!q$}HG3`K37o`$0$rhxYk8Rd#M{JqyZn|{p#mceGt zXRYLhJUuy4?}yes=N<74p$&u>y(Fv&WpWlfcs!b$c_`a*d}>z-V+#)fPFz58z&{z5 zV|4Sh(tk&|jS7Fjwe#sFu1iw@UXOm@1V(PxpP4%w^X7HK5CZ(jwy#aEK1Aa7t4|Lx z^9GDa{L*sg73oQI)-rpBA&(}!cv%Fl_P=PE_NEUR8 zx5!>G!Bv@Q{D#URBxu2IQnHHT0l+GRo#Oq63QPyZc-kmPw?NjF~ z?f`!HeX8sGIP3fUxp~W>=*pMc5HsxX$2kQe@uUIjex0;ymRLsL0LvSsYdUnd=D|-$ z2&XC^t_Nm_W|ltT8lumbKx!`&BaDT%_Mo<;uUnU-Pe~mM7>uYtqCAL8q3#vT+UASc zPUaCgCU?MPh!#n-Lk2lHfIJS1UpQdj^AkuMIqlmSUWgxRul5TM*_Lj6s{ZOkLx76{ z-9SY1!L@<}Ky)O&oZdzs`Hv~1KrJhh)P%9MMSzP9mby!;D&`PiUwInX#}H)Ne0aQo zMOECixcc3=ifBOE4pATg5@U#K7eHFoFyF3n1q0i7nJ>h3HksNPRPs!KWFbcn*v64U zURMs05M}dHcopHlR6mu{3PD7I#;=ACb&><6WadNpKz(@$?NP^pW_On5`X1JWJFr5H zgNEM06>H&8Ge>92XSyd@O*nB3xS&?QLqQPjwP<^4bSN5O6*DOkm2#ws*>1=bN`lNt z_S`?-d;MA((q)8uwx^zJwoQV)P35J$we!3b%IsFwF0u<6g&4%0-botDBeY1)%eL{;sCB|5_bg1yIp3`x-WOHQy5r-A-N&;e7jQ4i`AwY_U#f8T)KI>niXTQi@b zWH=GD7aX3T{$loMU;^xh*2?JCjnU4IdhTl9gy;slL7;#bB&+o>00JW+W>Jp4g7ApCy%juGCO6S8Kj0`Huex( zod)dIS?B1%Ghthd@@ct>z-}mi874!=6t{P20@Iuq2L9?O!LW6B`l1_Re1u+O)7t~H z0}9Cr3FuEY~(sAsvxtZ_v-w36<_2aM;SE0pG(2&o`EkI(%uG`-o;OOGtWJSz5$V z5MU5BPL9mz+bFb3IN^5WlM$Lu2&UhqoC7RAdD5K%K!yBLf9zB=_^1W53nhiD1$&%NET_S5B= z{Tt?^sNPSpldj|_T5eLU`wc3ys@ITXV#m6yo3vft`k3aSDGua=OO8ON8OEhZ=tm<3pfGlP%f2(AMYTRFUvsL>UH^kt4EC>v zQo`_3PT>#ooX=6eOG-477_a*pz0hx8YIC04Y-23(Ubk{-gLi@y^i5!R5OI<8{1kK0 zo@q~;&$?dVAByI<1C{e8hm|qIh6gDN>dh&fcvGIzg?xxM;rVk7W-M^~Ihe7nTrutF=*N=FQ~t)s z6O(-Je!KSYcp1F?qG?S?k4GmT#r#xbtsupG!@@04cH#VNnc@=6>me=!$M!wC9_DK2 zM+JVXa#4c_q**vbURJBO7PtQJVD~`K-xSnh>Ich4*Ntv0`E7J(FR~DZ3{eAKtlR6* zZv^jv0Vk5Bk?%x_l%V6}nlBwcxEb1l@g3tiX>6Tky&2VC;h@)h<^xujTDPNh<|qc~ zg731PWcF>aIZIxII*W>TeE^_|`n$?M0>$U_(^fyav3OMj)#zGVp`05ow=K7R1yvG_ z><*pO(c>bOAyuDmugch0Ch(Ak5iZPnQzn$Sn*+|m(AOJ?ogPBY`(jPh;ckT(?a41d z;ZW4*2rl39ocwGQX^D%Z+uCU~fyS%m{+T0gSmBJIEVF#k1<|VnH>A@?n2{mCVe9jS z0^1rs2qfC|nrO}`n&$6xc}8IX;QWAUVnRgN&r2>R=LjmMnxZWsCTC7eCoAR?ZwAK9lhCcd#Yrl{NlXU@ZSvNh7ypo7kIFu#s0x+r zZTj&rHPdo#;R3u6h{t>;do%_B^Jg=7qq69Cnwr4TnSXo$z9>52rU~|4pq)Av?>~Sd z&QW73faFKicV_nAuJ!B+PK~XWGpw6>#9Fsc@G5bsr>!0}Kx*$xXRtLgQn#-7+r-)% z^xMkXLp4qj+E0-u(gM|6N*hrin+PAWxyrFtoEy_zEAOFpWl0h-=Pt3(I9#fA7&17> zY0zy8Xa+LFv#juw=+@sd)1G1aTlwqUhZLM-!<&S>EZ3y55Afcja8fwYswsb^>`xtk z<5tqy%23(dB0B2c)QDB8g0V&}H8i%iJpXhUo6o1%Yg8^Qwve#YX0}kwIZrlTWU930 z+@Y6-YA0{9@0RLNCgpnxO+H*x8~$dc2dbZ;-;#q3!oqEOeHouQkCL8ucM0WJGrXf zh^JK=?BI1WBZMW+P<19+$7?g{?hH2#dg^F6j=?kTh4{_Bu5=n;65)IHz+;~tnE%F| z#<14TS)abM*2UuQ2L1y6XP3sGg{FY;uj^I#hkxV!XXpEmMz+?sG5QDb|3B#4S$@)H zkN~0U5%n)RS;8@V*^=)WcLV~xB|2nRn0D#&ZfYp?0>yC?BW)XO-@K$aCji<+*>xGQ5lSm?&zKqBTf zgBat{3&kSmlr~6u;U@-1N=?zhu${|c7~_B@9z7#k@W;%mJ+yGw0pgKkO z5gD4a&Sm>FI*(}!^hHheJLOA_q1LC(Q{7+BkF_^sboPI~_RBq|_tii!Tp+3wtu7h? z47+CoU54-frXt9_5j}AK1HC=|L893Ib1n6)%=Q0EJLp!HjLrO~9XwK&C{gld=G`zW zz$v$m+9;Q|S_R?IskiDWZdxVQy!5($0Z8Fp=z!1Jg-}V&t`sv%p3WzWoBLWD#b$s)IkJkB!*A!H+H6-rbAo@^g)y4!;r?0#_>Z zBrz@P=xtFPTk&ZA&G!!EcBQWW+hw7v>=@oYwmk(_9!hL5OafS>mtnePd+f6a#ML@xm*6UTd^vZlBlE#zCWH=d1m2t#yw4m zA&Gxtipkw)xI@^i^z%yrO)AX_J3;1JJU1`NkVa{UVP;yoS;DmkvTIN2hNGfV)sp!^ ze>m&8`hkG#aK_`j_=q!>uLCSRezs4RHW2mcF60;t_GnN#$;`|}6ol=>%ybtg2Z0Rn zl1(_xmR#MX0bPPIddWf(zBS!oVn^-l#f@|g8J@|3J7sq0HTZyeVeHSZ=mGzO0ptLWy7I%*y7t$&ZYJ0*HUyU4wYwDN~E|BE&lM6j# zf?Ya2^k>(1SL|u$)qCeMiQYsmMdAV2oB)5+X|kQpnFzv1V%iO+VSX%IqOPt}u;g{1 zE#>}6@EllYI=f>a*hAq1u3Le&*K>pTRkSrZy=S!ld4q90bGJI9{)1{n008j+=Tm23 zWbWvsYiw%z@8nf;X*+JQB-}nyB5-gdSVpuYR$L`FBxbFubX81n&}_C7lU9@R8FM|zJgXweMZSB@u?y>yz=U$!N-2*v&vw@OR z@ebK#5}SR!2G4=zK84)eb$Yks2An6lbRpY?8I6gR&21*}g@#wTXk~-?ZpQ6>KD_kb zg>CiTIp6*4LSJ>SUNOE09l7tBZw$MTfjzfzQJ)p|JcAY-ih*ATYfo`@=CRuJ$wi=L zx$R*hy+=}k=qDHZUBB_vK4S8Zjh{QIQSrOC8s2;K z>*j!4_1mj_nytECcfG7#tUZesvPTi#w5rVRX4py;@*!Hg0=|t8L+wxYnq=^Rgs!TT zMwv{%TLc#F6N)B=T1q3(x$g{c1@6o<7gLyl!4%Q@0ug5bnE%bKLR5Yd)PcsURiOkK z?!IjB*2J^Gv#!iweb1ppSxyNyAFBvCM+a;68CW6kA*bO$)z;2m!(>X0tz{zoraG1; zx1rpV|4RmINUQMu{BZSz9WF#I(mVGAT@97&;me=$@gk0^NJ zQwda5D;zi_A}DLY=cqCr1G~DFO(R3K)YhVSM3sNDC!6;TN%W1cG4hJ7Q-F5uHt4A) z&R)@@=ig|(D2w3FbQxQoH0Bg?mXk#x#w2quc#a_|5bVvt&@{R<8 zzFS0q-HrB6_>Ea09x= z$Hy4+kJz1u4ip<-7qnt9Iv8#4f0&U(wm-xF5|F(TlgfTqph`z*P}OC15zg#AYT z%JGyzggGa;N&n(AZ+S`aq#wfWqMi@Wt3NYHaq%3XUEmmugO)Y{G-1AT5r65X;&4WQ z8J8rk!gw>(4Hy6}YMVD9F1h67tr!I9Vx0=zcr26%q{Th5BVh<}P^Tgww5ZgiUGZ_4 z?#0r&k%=5c$8qlMl33}h{u#6yNT|z;%=|@Bzu5`acdmc zm?4J{AgCKYaG_i(xQEC=9&5g+$^t^76{Vs0ES@o)`x1nss6-v6Hn8K?fmX22!S}o@ zCS12bh*>UnSBwwVDYTZ&Qf@r6>n14$F&fGT^l$<%JDgDAgnE&h`bzc?;UqDR!V%yS zas1*I2h*xouPPhUxd7XAR7f78^ZMiZh92|Z<|SL#7##!!Jpkjw9Rj_wmf61Q_zGcr za;{M9M!RJE5x)r(tB1|TgMGuEAa>kCY47~U2B_6zsoI59IMWRIzK^ab^5auwYtZPq z^?H9kC=cUubLx3&`^J2Kzh51vwGdL6Zs}4JH?4|Hsvyr~w{H}jc;xe*00R+)FU#!6 z2*pUTkY>rrz3O6zG$Sr=H-D6Hh01?{4KwD%r$uQ1V zGaOHbqc#rUg<9dH(9umU2>qVRvbLfzjG5A8z+c0HH<4;kqz9PXqV9R7pKje9QWuRO z_}m0#>lR!9K^OO0tqo7I+UEYe8U7!>&apeRsL9r`ZQHg^Y}>YN+qRt(+qP}nwv&_O zru$pJqx+8i57u6&s#)`?mwyM(?~Sc|-QTocA1~LJ>~w!@ZRd$A)Oi)>CbJIU;AQ@y zkS&H=B9>jnY51A51b4vZs8 zYEm=0n+JFje&WWmyH%wS8UkVn(XD^f!okU{+w8K7=erzbhC5F=3&DO2-g82~dHYobX&ssxNCW7lf;UEQ13Zw-BkU_JG6C zxzD(L7`w|x`st+Be?#NtfLyxM=CijS;n>>I0lk?fI%aLNHk&Xb5+EkZ%@6f z-Kpgw$n%{`mh}pYIux#Lz4voP-)7asEu=hW04f#n;5u+XIGl_?#e-!$ZwiENo1!%9 zu3E~E(7Bsm(5l+WVwf{>nIWxZjFuwbYZl0}9g>yr9D;*VLFpl8d_ z8)}^#*gSW=6Q4}hz3rEACMCL!+f)8(gXajT3R5Xz}1S0*7_0^r0e1 zgk@+I(YN~8H)u=_UXDoASvZJ$rp0IIu!$9mYI@im9)^lF-0m+6OQCV$?Q!o0TV<(w zFSW?OX>O**KDx1u^hB}!d3Q)B{d>+|dAH3Pca+jA!|vUFs>P+psj*~s(HynR8zd|+ zod&H9Oy20wEq{?H^OIak?-&qO!VJSpJw(uXYm)?QXVy{R`Y;D z!xQ??Xvbs$H3F2l#?{ojISd`s8a!f)1Ya_}GY;Rq7qDGtk>S~>pPQ0WYm+FAA)FB9 zDVBYmRZI_WI93Gn*trU-bF!%e#55q%PB9ExZW2kx-9IB~L4T?}$YQh6O|wp?)c+~se|u(i1L^7K`8?h*e8 zZ`aC;fhPttUv2};=Ya<;-pWGz2FYeRNRhg!f<={>{5>-z%y=TxG(`}n-tSx~4%vj_ z-lM?F(#1py_ZchOty#zYF$_M=5itNHbHsSS p6O9&Oh=U1DuDpEL)M9}p{RUGX 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 nul +) + +set "VIRTUAL_ENV=D:\PycharmProjects\wozek\venv" + +if not defined PROMPT ( + set "PROMPT=$P$G" +) + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" +) + +set "_OLD_VIRTUAL_PROMPT=%PROMPT%" +set "PROMPT=(venv) %PROMPT%" + +if defined PYTHONHOME ( + set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" + set PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) else ( + set "_OLD_VIRTUAL_PATH=%PATH%" +) + +set "PATH=%VIRTUAL_ENV%\Scripts;%PATH%" + +:END +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul + set "_OLD_CODEPAGE=" +) diff --git a/venv/Scripts/deactivate.bat b/venv/Scripts/deactivate.bat new file mode 100644 index 0000000..1205c61 --- /dev/null +++ b/venv/Scripts/deactivate.bat @@ -0,0 +1,21 @@ +@echo off + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) +set _OLD_VIRTUAL_PROMPT= + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) + +set _OLD_VIRTUAL_PATH= + +set VIRTUAL_ENV= + +:END diff --git a/venv/Scripts/easy_install-3.7-script.py b/venv/Scripts/easy_install-3.7-script.py new file mode 100644 index 0000000..c8e32d9 --- /dev/null +++ b/venv/Scripts/easy_install-3.7-script.py @@ -0,0 +1,12 @@ +#!D:\PycharmProjects\wozek\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install-3.7' +__requires__ = 'setuptools==40.8.0' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('setuptools==40.8.0', 'console_scripts', 'easy_install-3.7')() + ) diff --git a/venv/Scripts/easy_install-3.7.exe b/venv/Scripts/easy_install-3.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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

      @|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu6w 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[c}iI#RErv3nvcIClH@!{vM)zJ_weD zu_-L8NU*GlC{d0L!!VW10^+~>qmNB~Y8H+F}!P8_d(PpvjzMJQmr z)FkX;2B~<|3JfJeWv@IXo~nTtp$}Gjie> zs8UDG*kid(%i5QCBp~MA;#I186PI-nZ&k7!k8BiLJSuR>h7ArSYHD~B0I z=T6L{zqglekt0JjG5z&|GWb4?+B5+{p^fgTufl_KesA{@I&g7rNq==^SGc5GcM%$N zDBG2)qExz*Z;jGN_-iD-y8i2BCq)p}2lKcspLg>w-;qwg(()HXrZa3jd!}spuwBVX zwmX!iwU?#7uoQnunw|OlU~+c z^L5Ak3zWhaA4B^FhMMboO0k*O2GL)lD9_<$5b>czbCvKcSt+u*gA*=%dH>Q-Bc11h zzO7jbXN)&5mBf=w2anK6P$YcJZQoWa2#E!v{hFKxxm7Fc)Fc9iC35{|Lp7bIDjrhC zgMiGf4r2yquH{U7WdMio;XS4Y%Ry{q7#kv#gZ07i`7eo#MMh_o68E*Fd_#nrri^4b zX+slbsv>+8pmck%oLDUL()8NRJ#Z z8DReF_eq2zsjEXGs)yS{k}ykS1B!ZrY0f6O65^lslJv3g&wfpDg-&EwF8wrc=hSwm zPlV&n%%yE_@onOwK?)`GNJ6MQ0drMuBYWCH5dkD)uErh@*k}#GcFl<-;;TN+5vb|b zctkCv;*zL7f)A;QuO%(81r0)&aUz4EQu;kA!k@7i8RZ)koMaWW`5cC6n@{w!!J$5d zx}l)4VP4xL=BKi&c^{n_Qi`q@G{vimblcVR53b#*X$FUOQFm!A8JKahNSiBdY+x3bJZfD8n{--FLUM4+Mx@{vM_ep zkk)U=K8R(rhU(X_faI*ZO}cn`5t*O}lx^j8|0rt-)o=Axn^DGcQTi!#7hxLTq?|HQ zB;T6(nrsCeYK0_o%)IO+CP{n#+|;w1ZmvD2c-J{i88bp63RjyKOE!B!D3U{RCs*Zh z&^%65VM(J34230U4bHS}M@SYS9TEK}c%)2<$h1|T;##zRtjRt@#1T%J=kAhOiw+Z% z7DpyWVK@6%9K^uVD9LDKj)dR^aZK6$@Lt)l;sj@`QSzBm{TlLG{JKM_^60Zr2w~nr zr>P-BaV8OjjWm?hQ3$ZCx+lyD%q`~4iNF9xWKi$t&pzBhwN9Dq-o^v9@=abLR#|

      KZqkLal4YCRR9VNhIM|rBqmzzcImvcx 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 literal 0 HcmV?d00001 diff --git a/venv/Scripts/easy_install-3.7.exe.manifest b/venv/Scripts/easy_install-3.7.exe.manifest new file mode 100644 index 0000000..a3dcdf2 --- /dev/null +++ b/venv/Scripts/easy_install-3.7.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/venv/Scripts/easy_install-script.py b/venv/Scripts/easy_install-script.py new file mode 100644 index 0000000..7f996a9 --- /dev/null +++ b/venv/Scripts/easy_install-script.py @@ -0,0 +1,12 @@ +#!D:\PycharmProjects\wozek\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install' +__requires__ = 'setuptools==40.8.0' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('setuptools==40.8.0', 'console_scripts', 'easy_install')() + ) diff --git a/venv/Scripts/easy_install.exe b/venv/Scripts/easy_install.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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

      @|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu6w 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[c}iI#RErv3nvcIClH@!{vM)zJ_weD zu_-L8NU*GlC{d0L!!VW10^+~>qmNB~Y8H+F}!P8_d(PpvjzMJQmr z)FkX;2B~<|3JfJeWv@IXo~nTtp$}Gjie> zs8UDG*kid(%i5QCBp~MA;#I186PI-nZ&k7!k8BiLJSuR>h7ArSYHD~B0I z=T6L{zqglekt0JjG5z&|GWb4?+B5+{p^fgTufl_KesA{@I&g7rNq==^SGc5GcM%$N zDBG2)qExz*Z;jGN_-iD-y8i2BCq)p}2lKcspLg>w-;qwg(()HXrZa3jd!}spuwBVX zwmX!iwU?#7uoQnunw|OlU~+c z^L5Ak3zWhaA4B^FhMMboO0k*O2GL)lD9_<$5b>czbCvKcSt+u*gA*=%dH>Q-Bc11h zzO7jbXN)&5mBf=w2anK6P$YcJZQoWa2#E!v{hFKxxm7Fc)Fc9iC35{|Lp7bIDjrhC zgMiGf4r2yquH{U7WdMio;XS4Y%Ry{q7#kv#gZ07i`7eo#MMh_o68E*Fd_#nrri^4b zX+slbsv>+8pmck%oLDUL()8NRJ#Z z8DReF_eq2zsjEXGs)yS{k}ykS1B!ZrY0f6O65^lslJv3g&wfpDg-&EwF8wrc=hSwm zPlV&n%%yE_@onOwK?)`GNJ6MQ0drMuBYWCH5dkD)uErh@*k}#GcFl<-;;TN+5vb|b zctkCv;*zL7f)A;QuO%(81r0)&aUz4EQu;kA!k@7i8RZ)koMaWW`5cC6n@{w!!J$5d zx}l)4VP4xL=BKi&c^{n_Qi`q@G{vimblcVR53b#*X$FUOQFm!A8JKahNSiBdY+x3bJZfD8n{--FLUM4+Mx@{vM_ep zkk)U=K8R(rhU(X_faI*ZO}cn`5t*O}lx^j8|0rt-)o=Axn^DGcQTi!#7hxLTq?|HQ zB;T6(nrsCeYK0_o%)IO+CP{n#+|;w1ZmvD2c-J{i88bp63RjyKOE!B!D3U{RCs*Zh z&^%65VM(J34230U4bHS}M@SYS9TEK}c%)2<$h1|T;##zRtjRt@#1T%J=kAhOiw+Z% z7DpyWVK@6%9K^uVD9LDKj)dR^aZK6$@Lt)l;sj@`QSzBm{TlLG{JKM_^60Zr2w~nr zr>P-BaV8OjjWm?hQ3$ZCx+lyD%q`~4iNF9xWKi$t&pzBhwN9Dq-o^v9@=abLR#|

      KZqkLal4YCRR9VNhIM|rBqmzzcImvcx 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 literal 0 HcmV?d00001 diff --git a/venv/Scripts/easy_install.exe.manifest b/venv/Scripts/easy_install.exe.manifest new file mode 100644 index 0000000..9c19e18 --- /dev/null +++ b/venv/Scripts/easy_install.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/venv/Scripts/pip-script.py b/venv/Scripts/pip-script.py new file mode 100644 index 0000000..37bd1c6 --- /dev/null +++ b/venv/Scripts/pip-script.py @@ -0,0 +1,12 @@ +#!D:\PycharmProjects\wozek\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip' +__requires__ = 'pip==19.0.3' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('pip==19.0.3', 'console_scripts', 'pip')() + ) diff --git a/venv/Scripts/pip.exe b/venv/Scripts/pip.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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

      @|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu6w 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[c}iI#RErv3nvcIClH@!{vM)zJ_weD zu_-L8NU*GlC{d0L!!VW10^+~>qmNB~Y8H+F}!P8_d(PpvjzMJQmr z)FkX;2B~<|3JfJeWv@IXo~nTtp$}Gjie> zs8UDG*kid(%i5QCBp~MA;#I186PI-nZ&k7!k8BiLJSuR>h7ArSYHD~B0I z=T6L{zqglekt0JjG5z&|GWb4?+B5+{p^fgTufl_KesA{@I&g7rNq==^SGc5GcM%$N zDBG2)qExz*Z;jGN_-iD-y8i2BCq)p}2lKcspLg>w-;qwg(()HXrZa3jd!}spuwBVX zwmX!iwU?#7uoQnunw|OlU~+c z^L5Ak3zWhaA4B^FhMMboO0k*O2GL)lD9_<$5b>czbCvKcSt+u*gA*=%dH>Q-Bc11h zzO7jbXN)&5mBf=w2anK6P$YcJZQoWa2#E!v{hFKxxm7Fc)Fc9iC35{|Lp7bIDjrhC zgMiGf4r2yquH{U7WdMio;XS4Y%Ry{q7#kv#gZ07i`7eo#MMh_o68E*Fd_#nrri^4b zX+slbsv>+8pmck%oLDUL()8NRJ#Z z8DReF_eq2zsjEXGs)yS{k}ykS1B!ZrY0f6O65^lslJv3g&wfpDg-&EwF8wrc=hSwm zPlV&n%%yE_@onOwK?)`GNJ6MQ0drMuBYWCH5dkD)uErh@*k}#GcFl<-;;TN+5vb|b zctkCv;*zL7f)A;QuO%(81r0)&aUz4EQu;kA!k@7i8RZ)koMaWW`5cC6n@{w!!J$5d zx}l)4VP4xL=BKi&c^{n_Qi`q@G{vimblcVR53b#*X$FUOQFm!A8JKahNSiBdY+x3bJZfD8n{--FLUM4+Mx@{vM_ep zkk)U=K8R(rhU(X_faI*ZO}cn`5t*O}lx^j8|0rt-)o=Axn^DGcQTi!#7hxLTq?|HQ zB;T6(nrsCeYK0_o%)IO+CP{n#+|;w1ZmvD2c-J{i88bp63RjyKOE!B!D3U{RCs*Zh z&^%65VM(J34230U4bHS}M@SYS9TEK}c%)2<$h1|T;##zRtjRt@#1T%J=kAhOiw+Z% z7DpyWVK@6%9K^uVD9LDKj)dR^aZK6$@Lt)l;sj@`QSzBm{TlLG{JKM_^60Zr2w~nr zr>P-BaV8OjjWm?hQ3$ZCx+lyD%q`~4iNF9xWKi$t&pzBhwN9Dq-o^v9@=abLR#|

      KZqkLal4YCRR9VNhIM|rBqmzzcImvcx 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 literal 0 HcmV?d00001 diff --git a/venv/Scripts/pip.exe.manifest b/venv/Scripts/pip.exe.manifest new file mode 100644 index 0000000..dd6f562 --- /dev/null +++ b/venv/Scripts/pip.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/venv/Scripts/pip3-script.py b/venv/Scripts/pip3-script.py new file mode 100644 index 0000000..8191cd5 --- /dev/null +++ b/venv/Scripts/pip3-script.py @@ -0,0 +1,12 @@ +#!D:\PycharmProjects\wozek\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3' +__requires__ = 'pip==19.0.3' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('pip==19.0.3', 'console_scripts', 'pip3')() + ) diff --git a/venv/Scripts/pip3.7-script.py b/venv/Scripts/pip3.7-script.py new file mode 100644 index 0000000..90f3878 --- /dev/null +++ b/venv/Scripts/pip3.7-script.py @@ -0,0 +1,12 @@ +#!D:\PycharmProjects\wozek\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3.7' +__requires__ = 'pip==19.0.3' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('pip==19.0.3', 'console_scripts', 'pip3.7')() + ) diff --git a/venv/Scripts/pip3.7.exe b/venv/Scripts/pip3.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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

      @|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu6w 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[c}iI#RErv3nvcIClH@!{vM)zJ_weD zu_-L8NU*GlC{d0L!!VW10^+~>qmNB~Y8H+F}!P8_d(PpvjzMJQmr z)FkX;2B~<|3JfJeWv@IXo~nTtp$}Gjie> zs8UDG*kid(%i5QCBp~MA;#I186PI-nZ&k7!k8BiLJSuR>h7ArSYHD~B0I z=T6L{zqglekt0JjG5z&|GWb4?+B5+{p^fgTufl_KesA{@I&g7rNq==^SGc5GcM%$N zDBG2)qExz*Z;jGN_-iD-y8i2BCq)p}2lKcspLg>w-;qwg(()HXrZa3jd!}spuwBVX zwmX!iwU?#7uoQnunw|OlU~+c z^L5Ak3zWhaA4B^FhMMboO0k*O2GL)lD9_<$5b>czbCvKcSt+u*gA*=%dH>Q-Bc11h zzO7jbXN)&5mBf=w2anK6P$YcJZQoWa2#E!v{hFKxxm7Fc)Fc9iC35{|Lp7bIDjrhC zgMiGf4r2yquH{U7WdMio;XS4Y%Ry{q7#kv#gZ07i`7eo#MMh_o68E*Fd_#nrri^4b zX+slbsv>+8pmck%oLDUL()8NRJ#Z z8DReF_eq2zsjEXGs)yS{k}ykS1B!ZrY0f6O65^lslJv3g&wfpDg-&EwF8wrc=hSwm zPlV&n%%yE_@onOwK?)`GNJ6MQ0drMuBYWCH5dkD)uErh@*k}#GcFl<-;;TN+5vb|b zctkCv;*zL7f)A;QuO%(81r0)&aUz4EQu;kA!k@7i8RZ)koMaWW`5cC6n@{w!!J$5d zx}l)4VP4xL=BKi&c^{n_Qi`q@G{vimblcVR53b#*X$FUOQFm!A8JKahNSiBdY+x3bJZfD8n{--FLUM4+Mx@{vM_ep zkk)U=K8R(rhU(X_faI*ZO}cn`5t*O}lx^j8|0rt-)o=Axn^DGcQTi!#7hxLTq?|HQ zB;T6(nrsCeYK0_o%)IO+CP{n#+|;w1ZmvD2c-J{i88bp63RjyKOE!B!D3U{RCs*Zh z&^%65VM(J34230U4bHS}M@SYS9TEK}c%)2<$h1|T;##zRtjRt@#1T%J=kAhOiw+Z% z7DpyWVK@6%9K^uVD9LDKj)dR^aZK6$@Lt)l;sj@`QSzBm{TlLG{JKM_^60Zr2w~nr zr>P-BaV8OjjWm?hQ3$ZCx+lyD%q`~4iNF9xWKi$t&pzBhwN9Dq-o^v9@=abLR#|

      KZqkLal4YCRR9VNhIM|rBqmzzcImvcx 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 literal 0 HcmV?d00001 diff --git a/venv/Scripts/pip3.7.exe.manifest b/venv/Scripts/pip3.7.exe.manifest new file mode 100644 index 0000000..991cd51 --- /dev/null +++ b/venv/Scripts/pip3.7.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/venv/Scripts/pip3.exe b/venv/Scripts/pip3.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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

      @|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu6w 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[c}iI#RErv3nvcIClH@!{vM)zJ_weD zu_-L8NU*GlC{d0L!!VW10^+~>qmNB~Y8H+F}!P8_d(PpvjzMJQmr z)FkX;2B~<|3JfJeWv@IXo~nTtp$}Gjie> zs8UDG*kid(%i5QCBp~MA;#I186PI-nZ&k7!k8BiLJSuR>h7ArSYHD~B0I z=T6L{zqglekt0JjG5z&|GWb4?+B5+{p^fgTufl_KesA{@I&g7rNq==^SGc5GcM%$N zDBG2)qExz*Z;jGN_-iD-y8i2BCq)p}2lKcspLg>w-;qwg(()HXrZa3jd!}spuwBVX zwmX!iwU?#7uoQnunw|OlU~+c z^L5Ak3zWhaA4B^FhMMboO0k*O2GL)lD9_<$5b>czbCvKcSt+u*gA*=%dH>Q-Bc11h zzO7jbXN)&5mBf=w2anK6P$YcJZQoWa2#E!v{hFKxxm7Fc)Fc9iC35{|Lp7bIDjrhC zgMiGf4r2yquH{U7WdMio;XS4Y%Ry{q7#kv#gZ07i`7eo#MMh_o68E*Fd_#nrri^4b zX+slbsv>+8pmck%oLDUL()8NRJ#Z z8DReF_eq2zsjEXGs)yS{k}ykS1B!ZrY0f6O65^lslJv3g&wfpDg-&EwF8wrc=hSwm zPlV&n%%yE_@onOwK?)`GNJ6MQ0drMuBYWCH5dkD)uErh@*k}#GcFl<-;;TN+5vb|b zctkCv;*zL7f)A;QuO%(81r0)&aUz4EQu;kA!k@7i8RZ)koMaWW`5cC6n@{w!!J$5d zx}l)4VP4xL=BKi&c^{n_Qi`q@G{vimblcVR53b#*X$FUOQFm!A8JKahNSiBdY+x3bJZfD8n{--FLUM4+Mx@{vM_ep zkk)U=K8R(rhU(X_faI*ZO}cn`5t*O}lx^j8|0rt-)o=Axn^DGcQTi!#7hxLTq?|HQ zB;T6(nrsCeYK0_o%)IO+CP{n#+|;w1ZmvD2c-J{i88bp63RjyKOE!B!D3U{RCs*Zh z&^%65VM(J34230U4bHS}M@SYS9TEK}c%)2<$h1|T;##zRtjRt@#1T%J=kAhOiw+Z% z7DpyWVK@6%9K^uVD9LDKj)dR^aZK6$@Lt)l;sj@`QSzBm{TlLG{JKM_^60Zr2w~nr zr>P-BaV8OjjWm?hQ3$ZCx+lyD%q`~4iNF9xWKi$t&pzBhwN9Dq-o^v9@=abLR#|

      KZqkLal4YCRR9VNhIM|rBqmzzcImvcx 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 literal 0 HcmV?d00001 diff --git a/venv/Scripts/pip3.exe.manifest b/venv/Scripts/pip3.exe.manifest new file mode 100644 index 0000000..cdf9df4 --- /dev/null +++ b/venv/Scripts/pip3.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/venv/Scripts/python.exe b/venv/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..87bc9ee8afe085c6839a5c043090a215b32ef1a3 GIT binary patch literal 415248 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 z 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%0D+x>hAqSFh2DyXg!C_=$#(@*^=6iHV?X1 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

    X})OE14-`FP_N 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�M@DZC>5gUR!b&{e#Re({u8j;`5- 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 VFd_P%&(t&j&Hw+e|4X01{{k$#lX3t6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/libtiff-5.dll b/venv/Lib/site-packages/pygame/libtiff-5.dll new file mode 100644 index 0000000000000000000000000000000000000000..8e875031831f1d90dc63e1acb32eb2be9c61fb6f GIT binary patch literal 489472 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 F{{z#TvzGt> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/__pycache__/video.cpython-37.pyc b/venv/Lib/site-packages/pygame/examples/__pycache__/video.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67db2a2676a751f5938902acbea9eba48aff9a97 GIT binary patch literal 2396 zcmZ8i&2t+?7N4FOjV7`rJ70F3h-924S!*4URF*e4Fm37f;GCNW~$z#t~ zdPcEjJ`R{`D4+H`x@^IPJ5{OuGpMaTQMDYRe}Mz=dL#<7qw1c1zwZ9MU%&Ty^iHW% zQ1H3==-Wp>;pl(T`1LVy@HV!1M^hB0Fybjx0VO2^v}P5i?kU^?m1#%hbCS(#R0C~S zPjgvsWPKjY0U6*t?$8G+J%uZCUcsNB6Mm5v{SqztWm@(p=_FB@!SY`ybPAN+)9IOk zLeSst+4LMU*{Oj_l!Iv~A1TYqM@4!brs4b%A9|j72k)3DLY^JNxYfPcn;Tl|@RiI-35g9MA zS>(LmRysLq0rS9vjJfpxp zxOPOQf0t1iw=D%Mm^%^u`%oEYtAg3O46nldfrj-|8D$J!Odl{S%i#)}OW#F%b$}Ij zMBtLWhKyff6_ZV+dUYu8-}+F+{&2pzkB zZBgjVNt|j<7+Y?@!hMl%!a>sGAj}USV8DTki7q5I}}tTqGepWy%x3|Z@US8v>o-^I}Z0> zik$YI({+O`BJ$k7zQ$pRx1YES!o{dBOew;4{q9+L0vSPta5;9L<0ot=KXr#!SFC;4 z^QV;%d+Ho*~x#UETgcW}IlVJE<(iC|FoFw5izuNe4`TebRYOdOi&HCMq2A$YiSx2bx_r`jYo<3pN^|kjm z8yI7V6CU=dv1+e1?lqCa{$S<)gQf&BE`8O0xIwj5yF<(JJW^tef*_zpX^*N0nB2L! zakt(Onul|FhPx&_Cwb5;4OJU z;$!SgZHkzxNh-upE2gOxNLekCA|fVHNda+_6c91Vl&T|IPzyv?3u>7dq%2W6k4?qd iDV#f(p=WSk1@SWe 0: + self.image = self.images[1] + self.rect.top = self.origtop - (self.rect.left//self.bounce%2) + + def gunpos(self): + pos = self.facing*self.gun_offset + self.rect.centerx + return pos, self.rect.top + + +class Alien(pygame.sprite.Sprite): + speed = 13 + animcycle = 12 + images = [] + def __init__(self): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect() + self.facing = random.choice((-1,1)) * Alien.speed + self.frame = 0 + if self.facing < 0: + self.rect.right = SCREENRECT.right + + def update(self): + self.rect.move_ip(self.facing, 0) + if not SCREENRECT.contains(self.rect): + self.facing = -self.facing; + self.rect.top = self.rect.bottom + 1 + self.rect = self.rect.clamp(SCREENRECT) + self.frame = self.frame + 1 + self.image = self.images[self.frame//self.animcycle%3] + + +class Explosion(pygame.sprite.Sprite): + defaultlife = 12 + animcycle = 3 + images = [] + def __init__(self, actor): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect(center=actor.rect.center) + self.life = self.defaultlife + + def update(self): + self.life = self.life - 1 + self.image = self.images[self.life//self.animcycle%2] + if self.life <= 0: self.kill() + + +class Shot(pygame.sprite.Sprite): + speed = -11 + images = [] + def __init__(self, pos): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect(midbottom=pos) + + def update(self): + self.rect.move_ip(0, self.speed) + if self.rect.top <= 0: + self.kill() + + +class Bomb(pygame.sprite.Sprite): + speed = 9 + images = [] + def __init__(self, alien): + pygame.sprite.Sprite.__init__(self, self.containers) + self.image = self.images[0] + self.rect = self.image.get_rect(midbottom= + alien.rect.move(0,5).midbottom) + + def update(self): + self.rect.move_ip(0, self.speed) + if self.rect.bottom >= 470: + Explosion(self) + self.kill() + + +class Score(pygame.sprite.Sprite): + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.font = pygame.font.Font(None, 20) + self.font.set_italic(1) + self.color = Color('white') + self.lastscore = -1 + self.update() + self.rect = self.image.get_rect().move(10, 450) + + def update(self): + if SCORE != self.lastscore: + self.lastscore = SCORE + msg = "Score: %d" % SCORE + self.image = self.font.render(msg, 0, self.color) + + + +def main(winstyle = 0): + # Initialize pygame + if pygame.get_sdl_version()[0] == 2: + pygame.mixer.pre_init(44100, 32, 2, 1024) + pygame.init() + if pygame.mixer and not pygame.mixer.get_init(): + print ('Warning, no sound') + pygame.mixer = None + + fullscreen = False + # Set the display mode + winstyle = 0 # |FULLSCREEN + bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32) + screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth) + + #Load images, assign to sprite classes + #(do this before the classes are used, after screen setup) + img = load_image('player1.gif') + Player.images = [img, pygame.transform.flip(img, 1, 0)] + img = load_image('explosion1.gif') + Explosion.images = [img, pygame.transform.flip(img, 1, 1)] + Alien.images = load_images('alien1.gif', 'alien2.gif', 'alien3.gif') + Bomb.images = [load_image('bomb.gif')] + Shot.images = [load_image('shot.gif')] + + #decorate the game window + icon = pygame.transform.scale(Alien.images[0], (32, 32)) + pygame.display.set_icon(icon) + pygame.display.set_caption('Pygame Aliens') + pygame.mouse.set_visible(0) + + #create the background, tile the bgd image + bgdtile = load_image('background.gif') + background = pygame.Surface(SCREENRECT.size) + for x in range(0, SCREENRECT.width, bgdtile.get_width()): + background.blit(bgdtile, (x, 0)) + screen.blit(background, (0,0)) + pygame.display.flip() + + #load the sound effects + boom_sound = load_sound('boom.wav') + shoot_sound = load_sound('car_door.wav') + if pygame.mixer: + music = os.path.join(main_dir, 'data', 'house_lo.wav') + pygame.mixer.music.load(music) + pygame.mixer.music.play(-1) + + # Initialize Game Groups + aliens = pygame.sprite.Group() + shots = pygame.sprite.Group() + bombs = pygame.sprite.Group() + all = pygame.sprite.RenderUpdates() + lastalien = pygame.sprite.GroupSingle() + + #assign default groups to each sprite class + Player.containers = all + Alien.containers = aliens, all, lastalien + Shot.containers = shots, all + Bomb.containers = bombs, all + Explosion.containers = all + Score.containers = all + + #Create Some Starting Values + global score + alienreload = ALIEN_RELOAD + kills = 0 + clock = pygame.time.Clock() + + #initialize our starting sprites + global SCORE + player = Player() + Alien() #note, this 'lives' because it goes into a sprite group + if pygame.font: + all.add(Score()) + + + while player.alive(): + + #get input + for event in pygame.event.get(): + if event.type == QUIT or \ + (event.type == KEYDOWN and event.key == K_ESCAPE): + return + elif event.type == KEYDOWN: + if event.key == pygame.K_f: + if not fullscreen: + print("Changing to FULLSCREEN") + screen_backup = screen.copy() + screen = pygame.display.set_mode( + SCREENRECT.size, + winstyle | FULLSCREEN, + bestdepth + ) + screen.blit(screen_backup, (0, 0)) + else: + print("Changing to windowed mode") + screen_backup = screen.copy() + screen = pygame.display.set_mode( + SCREENRECT.size, + winstyle, + bestdepth + ) + screen.blit(screen_backup, (0, 0)) + # screen.fill((255, 0, 0)) + pygame.display.flip() + fullscreen = not fullscreen + + + keystate = pygame.key.get_pressed() + + # clear/erase the last drawn sprites + all.clear(screen, background) + + #update all the sprites + all.update() + + #handle player input + direction = keystate[K_RIGHT] - keystate[K_LEFT] + player.move(direction) + firing = keystate[K_SPACE] + if not player.reloading and firing and len(shots) < MAX_SHOTS: + Shot(player.gunpos()) + shoot_sound.play() + player.reloading = firing + + # Create new alien + if alienreload: + alienreload = alienreload - 1 + elif not int(random.random() * ALIEN_ODDS): + Alien() + alienreload = ALIEN_RELOAD + + # Drop bombs + if lastalien and not int(random.random() * BOMB_ODDS): + Bomb(lastalien.sprite) + + # Detect collisions + for alien in pygame.sprite.spritecollide(player, aliens, 1): + boom_sound.play() + Explosion(alien) + Explosion(player) + SCORE = SCORE + 1 + player.kill() + + for alien in pygame.sprite.groupcollide(shots, aliens, 1, 1).keys(): + boom_sound.play() + Explosion(alien) + SCORE = SCORE + 1 + + for bomb in pygame.sprite.spritecollide(player, bombs, 1): + boom_sound.play() + Explosion(player) + Explosion(bomb) + player.kill() + + #draw the scene + dirty = all.draw(screen) + pygame.display.update(dirty) + + #cap the framerate + clock.tick(40) + + if pygame.mixer: + pygame.mixer.music.fadeout(1000) + pygame.time.wait(1000) + pygame.quit() + + + +#call the "main" function if running this script +if __name__ == '__main__': main() + diff --git a/venv/Lib/site-packages/pygame/examples/arraydemo.py b/venv/Lib/site-packages/pygame/examples/arraydemo.py new file mode 100644 index 0000000..9341db6 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/arraydemo.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python + +import os + +import pygame +from pygame import surfarray +from pygame.locals import * + +main_dir = os.path.split(os.path.abspath(__file__))[0] + +def surfdemo_show(array_img, name): + "displays a surface, waits for user to continue" + screen = pygame.display.set_mode(array_img.shape[:2], 0, 32) + surfarray.blit_array(screen, array_img) + pygame.display.flip() + pygame.display.set_caption(name) + while 1: + e = pygame.event.wait() + if e.type == MOUSEBUTTONDOWN: break + elif e.type == KEYDOWN and e.key == K_s: + #pygame.image.save(screen, name+'.bmp') + #s = pygame.Surface(screen.get_size(), 0, 32) + #s = s.convert_alpha() + #s.fill((0,0,0,255)) + #s.blit(screen, (0,0)) + #s.fill((222,0,0,50), (0,0,40,40)) + #pygame.image.save_extended(s, name+'.png') + #pygame.image.save(s, name+'.png') + #pygame.image.save(screen, name+'_screen.png') + #pygame.image.save(s, name+'.tga') + pygame.image.save(screen, name+'.png') + elif e.type == QUIT: + raise SystemExit() + +def main(arraytype=None): + """show various surfarray effects + + If arraytype is provided then use that array package. Valid + values are 'numeric' or 'numpy'. Otherwise default to NumPy, + or fall back on Numeric if NumPy is not installed. + + """ + if arraytype not in ('numpy', None): + raise ValueError('Array type not supported: %r' % arraytype) + + import numpy as N + from numpy import int32, uint8, uint + + pygame.init() + print ('Using %s' % surfarray.get_arraytype().capitalize()) + print ('Press the mouse button to advance image.') + print ('Press the "s" key to save the current image.') + + #allblack + allblack = N.zeros((128, 128), int32) + surfdemo_show(allblack, 'allblack') + + + #striped + #the element type is required for N.zeros in NumPy else + #an array of float is returned. + striped = N.zeros((128, 128, 3), int32) + striped[:] = (255, 0, 0) + striped[:,::3] = (0, 255, 255) + surfdemo_show(striped, 'striped') + + + #rgbarray + imagename = os.path.join(main_dir, 'data', 'arraydemo.bmp') + imgsurface = pygame.image.load(imagename) + rgbarray = surfarray.array3d(imgsurface) + surfdemo_show(rgbarray, 'rgbarray') + + + #flipped + flipped = rgbarray[:,::-1] + surfdemo_show(flipped, 'flipped') + + + #scaledown + scaledown = rgbarray[::2,::2] + surfdemo_show(scaledown, 'scaledown') + + + #scaleup + #the element type is required for N.zeros in NumPy else + #an #array of floats is returned. + shape = rgbarray.shape + scaleup = N.zeros((shape[0]*2, shape[1]*2, shape[2]), int32) + scaleup[::2,::2,:] = rgbarray + scaleup[1::2,::2,:] = rgbarray + scaleup[:,1::2] = scaleup[:,::2] + surfdemo_show(scaleup, 'scaleup') + + + #redimg + redimg = N.array(rgbarray) + redimg[:,:,1:] = 0 + surfdemo_show(redimg, 'redimg') + + + #soften + #having factor as an array forces integer upgrade during multiplication + #of rgbarray, even for numpy. + factor = N.array((8,), int32) + soften = N.array(rgbarray, int32) + soften[1:,:] += rgbarray[:-1,:] * factor + soften[:-1,:] += rgbarray[1:,:] * factor + soften[:,1:] += rgbarray[:,:-1] * factor + soften[:,:-1] += rgbarray[:,1:] * factor + soften //= 33 + surfdemo_show(soften, 'soften') + + + #crossfade (50%) + src = N.array(rgbarray) + dest = N.zeros(rgbarray.shape) # dest is float64 by default. + dest[:] = 20, 50, 100 + diff = (dest - src) * 0.50 + xfade = src + diff.astype(uint) + surfdemo_show(xfade, 'xfade') + + + #alldone + pygame.quit() + +if __name__ == '__main__': + main() + + + diff --git a/venv/Lib/site-packages/pygame/examples/audiocapture.py b/venv/Lib/site-packages/pygame/examples/audiocapture.py new file mode 100644 index 0000000..c140e51 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/audiocapture.py @@ -0,0 +1,58 @@ +import pygame as pg +import time + +if pg.get_sdl_version()[0] < 2: + raise SystemExit('This example requires pygame 2 and SDL2.') + +from pygame._sdl2 import ( + get_audio_device_name, + get_num_audio_devices, + AudioDevice, + AUDIO_F32, + AUDIO_ALLOW_FORMAT_CHANGE +) + +pg.mixer.pre_init(44100, 32, 2, 512) +pg.init() + +# init_subsystem(INIT_AUDIO) +names = [get_audio_device_name(x, 1) for x in range(get_num_audio_devices(1))] +print(names) + +iscapture = 1 +sounds = [] +sound_chunks = [] + +def callback(audiodevice, audiomemoryview): + """ This is called in the sound thread. + + Note, that the frequency and such you request may not be what you get. + """ + # print(type(audiomemoryview), len(audiomemoryview)) + # print(audiodevice) + sound_chunks.append(bytes(audiomemoryview)) + + +audio = AudioDevice( + devicename=names[0], + iscapture=1, + frequency=44100, + audioformat=AUDIO_F32, + numchannels=2, + chunksize=512, + allowed_changes=AUDIO_ALLOW_FORMAT_CHANGE, + callback=callback, +) +# start recording. +audio.pause(0) + +print('recording with :%s:' % names[0]) +time.sleep(5) + + +print('Turning data into a pygame.mixer.Sound') +sound = pg.mixer.Sound(buffer=b''.join(sound_chunks)) + +print('playing back recorded sound') +sound.play() +time.sleep(5) diff --git a/venv/Lib/site-packages/pygame/examples/blend_fill.py b/venv/Lib/site-packages/pygame/examples/blend_fill.py new file mode 100644 index 0000000..822fa82 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/blend_fill.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +import os +import pygame +from pygame.locals import * + +def usage (): + print ("Press R, G, B to increase the color channel values,") + print ("1-9 to set the step range for the increment,") + print ("A - ADD, S- SUB, M- MULT, - MIN, + MAX") + print (" to change the blend modes") + + +main_dir = os.path.split(os.path.abspath(__file__))[0] +data_dir = os.path.join(main_dir, 'data') + +def main(): + color = [0, 0, 0] + changed = False + blendtype = 0 + step = 5 + + pygame.init () + screen = pygame.display.set_mode ((640, 480), 0, 32) + screen.fill ((100, 100, 100)) + + image = pygame.image.load (os.path.join (data_dir, "liquid.bmp")).convert() + blendimage = pygame.image.load (os.path.join (data_dir, "liquid.bmp")).convert() + screen.blit (image, (10, 10)) + screen.blit (blendimage, (200, 10)) + + pygame.display.flip () + pygame.key.set_repeat (500, 30) + usage() + + going = True + while going: + for event in pygame.event.get (): + if event.type == QUIT: + going = False + + if event.type == KEYDOWN: + usage () + + if event.key == K_ESCAPE: + going = False + + if event.key == K_r: + color[0] += step + if color[0] > 255: + color[0] = 0 + changed = True + + elif event.key == K_g: + color[1] += step + if color[1] > 255: + color[1] = 0 + changed = True + + elif event.key == K_b: + color[2] += step + if color[2] > 255: + color[2] = 0 + changed = True + + elif event.key == K_a: + blendtype = BLEND_ADD + changed = True + elif event.key == K_s: + blendtype = BLEND_SUB + changed = True + elif event.key == K_m: + blendtype = BLEND_MULT + changed = True + elif event.key == K_PLUS: + blendtype = BLEND_MAX + changed = True + elif event.key == K_MINUS: + blendtype = BLEND_MIN + changed = True + + elif event.key in (K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9): + step = int (event.unicode) + + if changed: + screen.fill ((100, 100, 100)) + screen.blit (image, (10, 10)) + blendimage.blit (image, (0, 0)) + #blendimage.fill (color, (0, 0, 20, 20), blendtype) + blendimage.fill (color, None, blendtype) + screen.blit (blendimage, (200, 10)) + print ("Color: %s, Pixel (0,0): %s" % + (tuple(color), + [blendimage.get_at ((0, 0))])) + changed = False + pygame.display.flip () + + + pygame.quit() + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/blit_blends.py b/venv/Lib/site-packages/pygame/examples/blit_blends.py new file mode 100644 index 0000000..33fe214 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/blit_blends.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +# fake additive blending. Using NumPy. it doesn't clamp. +# press r,g,b + +import os, pygame +from pygame.locals import * + +try: + import pygame.surfarray + import numpy +except: + print ("no surfarray for you! install numpy") + +import time + +main_dir = os.path.split(os.path.abspath(__file__))[0] +data_dir = os.path.join(main_dir, 'data') + +def main(): + pygame.init() + pygame.mixer.quit() # remove ALSA underflow messages for Debian squeeze + screen = pygame.display.set_mode((640, 480)) + + im1= pygame.Surface(screen.get_size()) + #im1= im1.convert() + im1.fill((100, 0, 0)) + + + + im2= pygame.Surface(screen.get_size()) + im2.fill((0, 50, 0)) + # we make a srcalpha copy of it. + #im3= im2.convert(SRCALPHA) + im3 = im2 + im3.set_alpha(127) + + images = {} + images[K_1] = im2 + images[K_2] = pygame.image.load(os.path.join(data_dir, "chimp.bmp")) + images[K_3] = pygame.image.load(os.path.join(data_dir, "alien3.gif")) + images[K_4] = pygame.image.load(os.path.join(data_dir, "liquid.bmp")) + img_to_blit = im2.convert() + iaa = img_to_blit.convert_alpha() + + + + blits = {} + blits[K_a] = BLEND_ADD + blits[K_s] = BLEND_SUB + blits[K_m] = BLEND_MULT + blits[K_EQUALS] = BLEND_MAX + blits[K_MINUS] = BLEND_MIN + + blitsn = {} + blitsn[K_a] = "BLEND_ADD" + blitsn[K_s] = "BLEND_SUB" + blitsn[K_m] = "BLEND_MULT" + blitsn[K_EQUALS] = "BLEND_MAX" + blitsn[K_MINUS] = "BLEND_MIN" + + + screen.blit(im1, (0, 0)) + pygame.display.flip() + clock = pygame.time.Clock() + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + + going = True + while going: + clock.tick(60) + + for event in pygame.event.get(): + if event.type == QUIT: + going = False + if event.type == KEYDOWN: + usage() + + if event.type == KEYDOWN and event.key == K_ESCAPE: + going = False + + elif event.type == KEYDOWN and event.key in images.keys(): + img_to_blit = images[event.key] + iaa = img_to_blit.convert_alpha() + + elif event.type == KEYDOWN and event.key in blits.keys(): + t1 = time.time() + # blits is a dict keyed with key -> blit flag. eg BLEND_ADD. + im1.blit(img_to_blit, (0,0), None, blits[event.key]) + t2 = time.time() + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + print ("time to do:%s:" % (t2-t1)) + + + elif event.type == KEYDOWN and event.key in [K_t]: + + for bkey in blits.keys(): + t1 = time.time() + + for x in range(300): + im1.blit(img_to_blit, (0,0), None, blits[bkey]) + + t2 = time.time() + + # show which key we're doing... + onedoing = blitsn[bkey] + print ("time to do :%s: is :%s:" % (onedoing, t2-t1)) + + + elif event.type == KEYDOWN and event.key in [K_o]: + t1 = time.time() + # blits is a dict keyed with key -> blit flag. eg BLEND_ADD. + im1.blit(iaa, (0,0)) + t2 = time.time() + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + print ("time to do:%s:" % (t2-t1)) + + + elif event.type == KEYDOWN and event.key == K_SPACE: + # this additive blend without clamp two surfaces. + #im1.set_alpha(127) + #im1.blit(im1, (0,0)) + #im1.set_alpha(255) + t1 = time.time() + + im1p = pygame.surfarray.pixels2d(im1) + im2p = pygame.surfarray.pixels2d(im2) + im1p += im2p + del im1p + del im2p + t2 = time.time() + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + print ("time to do:%s:" % (t2-t1)) + + elif event.type == KEYDOWN and event.key in [K_z]: + t1 = time.time() + im1p = pygame.surfarray.pixels3d(im1) + im2p = pygame.surfarray.pixels3d(im2) + im1p16 = im1p.astype(numpy.uint16) + im2p16 = im1p.astype(numpy.uint16) + im1p16 += im2p16 + im1p16 = numpy.minimum(im1p16, 255) + pygame.surfarray.blit_array(im1, im1p16) + + del im1p + del im2p + t2 = time.time() + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + print ("time to do:%s:" % (t2-t1)) + + elif event.type == KEYDOWN and event.key in [K_r, K_g, K_b]: + # this adds one to each pixel. + colmap={} + colmap[K_r] = 0x10000 + colmap[K_g] = 0x00100 + colmap[K_b] = 0x00001 + im1p = pygame.surfarray.pixels2d(im1) + im1p += colmap[event.key] + del im1p + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + + elif event.type == KEYDOWN and event.key == K_p: + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + + + + + + elif event.type == KEYDOWN and event.key == K_f: + # this additive blend without clamp two surfaces. + + t1 = time.time() + im1.set_alpha(127) + im1.blit(im2, (0,0)) + im1.set_alpha(255) + + t2 = time.time() + print ("one pixel is:%s:" % [im1.get_at((0,0))]) + print ("time to do:%s:" % (t2-t1)) + + + screen.blit(im1, (0, 0)) + pygame.display.flip() + + pygame.quit() + +def usage(): + print ("press keys 1-5 to change image to blit.") + print ("A - ADD, S- SUB, M- MULT, - MIN, + MAX") + print ("T - timing test for special blend modes.") + +if __name__ == '__main__': + usage() + main() diff --git a/venv/Lib/site-packages/pygame/examples/camera.py b/venv/Lib/site-packages/pygame/examples/camera.py new file mode 100644 index 0000000..9967d81 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/camera.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +# 1. Basic image capturing and displaying using the camera module + +import pygame +import pygame.camera +from pygame.locals import * + + +class VideoCapturePlayer(object): + + size = ( 640, 480 ) + def __init__(self, **argd): + self.__dict__.update(**argd) + super(VideoCapturePlayer, self).__init__(**argd) + + # create a display surface. standard pygame stuff + self.display = pygame.display.set_mode( self.size, 0 ) + self.init_cams(0) + + def init_cams(self, which_cam_idx): + + # gets a list of available cameras. + self.clist = pygame.camera.list_cameras() + print (self.clist) + + if not self.clist: + raise ValueError("Sorry, no cameras detected.") + + try: + cam_id = self.clist[which_cam_idx] + except IndexError: + cam_id = self.clist[0] + + # creates the camera of the specified size and in RGB colorspace + self.camera = pygame.camera.Camera(cam_id, self.size, "RGB") + + # starts the camera + self.camera.start() + + self.clock = pygame.time.Clock() + + # create a surface to capture to. for performance purposes, you want the + # bit depth to be the same as that of the display surface. + self.snapshot = pygame.surface.Surface(self.size, 0, self.display) + + def get_and_flip(self): + # if you don't want to tie the framerate to the camera, you can check and + # see if the camera has an image ready. note that while this works + # on most cameras, some will never return true. + if 0 and self.camera.query_image(): + # capture an image + + self.snapshot = self.camera.get_image(self.snapshot) + + if 0: + self.snapshot = self.camera.get_image(self.snapshot) + #self.snapshot = self.camera.get_image() + + # blit it to the display surface. simple! + self.display.blit(self.snapshot, (0,0)) + else: + self.snapshot = self.camera.get_image(self.display) + #self.display.blit(self.snapshot, (0,0)) + + + pygame.display.flip() + + def main(self): + going = True + while going: + events = pygame.event.get() + for e in events: + if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE): + going = False + if e.type == KEYDOWN: + if e.key in range(K_0, K_0+10) : + self.init_cams(e.key - K_0) + + + self.get_and_flip() + self.clock.tick() + print (self.clock.get_fps()) + +def main(): + pygame.init() + pygame.camera.init() + VideoCapturePlayer().main() + pygame.quit() + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/chimp.py b/venv/Lib/site-packages/pygame/examples/chimp.py new file mode 100644 index 0000000..2e703cb --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/chimp.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +""" +This simple example is used for the line-by-line tutorial +that comes with pygame. It is based on a 'popular' web banner. +Note there are comments here, but for the full explanation, +follow along in the tutorial. +""" + + +# Import Modules +import os, pygame +from pygame.locals import * +from pygame.compat import geterror + +if not pygame.font: print('Warning, fonts disabled') +if not pygame.mixer: print('Warning, sound disabled') + +main_dir = os.path.split(os.path.abspath(__file__))[0] +data_dir = os.path.join(main_dir, 'data') + + +# functions to create our resources +def load_image(name, colorkey=None): + fullname = os.path.join(data_dir, name) + try: + image = pygame.image.load(fullname) + except pygame.error: + print('Cannot load image:', fullname) + raise SystemExit(str(geterror())) + image = image.convert() + if colorkey is not None: + if colorkey is -1: + colorkey = image.get_at((0, 0)) + image.set_colorkey(colorkey, RLEACCEL) + return image, image.get_rect() + + +def load_sound(name): + class NoneSound: + def play(self): pass + if not pygame.mixer or not pygame.mixer.get_init(): + return NoneSound() + fullname = os.path.join(data_dir, name) + try: + sound = pygame.mixer.Sound(fullname) + except pygame.error: + print('Cannot load sound: %s' % fullname) + raise SystemExit(str(geterror())) + return sound + + +# classes for our game objects +class Fist(pygame.sprite.Sprite): + """moves a clenched fist on the screen, following the mouse""" + def __init__(self): + pygame.sprite.Sprite.__init__(self) #call Sprite initializer + self.image, self.rect = load_image('fist.bmp', -1) + self.punching = 0 + + def update(self): + """move the fist based on the mouse position""" + pos = pygame.mouse.get_pos() + self.rect.midtop = pos + if self.punching: + self.rect.move_ip(5, 10) + + def punch(self, target): + """returns true if the fist collides with the target""" + if not self.punching: + self.punching = 1 + hitbox = self.rect.inflate(-5, -5) + return hitbox.colliderect(target.rect) + + def unpunch(self): + """called to pull the fist back""" + self.punching = 0 + + +class Chimp(pygame.sprite.Sprite): + """moves a monkey critter across the screen. it can spin the + monkey when it is punched.""" + def __init__(self): + pygame.sprite.Sprite.__init__(self) # call Sprite intializer + self.image, self.rect = load_image('chimp.bmp', -1) + screen = pygame.display.get_surface() + self.area = screen.get_rect() + self.rect.topleft = 10, 10 + self.move = 9 + self.dizzy = 0 + + def update(self): + """walk or spin, depending on the monkeys state""" + if self.dizzy: + self._spin() + else: + self._walk() + + def _walk(self): + """move the monkey across the screen, and turn at the ends""" + newpos = self.rect.move((self.move, 0)) + if not self.area.contains(newpos): + if self.rect.left < self.area.left or \ + self.rect.right > self.area.right: + self.move = -self.move + newpos = self.rect.move((self.move, 0)) + self.image = pygame.transform.flip(self.image, 1, 0) + self.rect = newpos + + def _spin(self): + """spin the monkey image""" + center = self.rect.center + self.dizzy = self.dizzy + 12 + if self.dizzy >= 360: + self.dizzy = 0 + self.image = self.original + else: + rotate = pygame.transform.rotate + self.image = rotate(self.original, self.dizzy) + self.rect = self.image.get_rect(center=center) + + def punched(self): + """this will cause the monkey to start spinning""" + if not self.dizzy: + self.dizzy = 1 + self.original = self.image + + +def main(): + """this function is called when the program starts. + it initializes everything it needs, then runs in + a loop until the function returns.""" + # Initialize Everything + pygame.init() + screen = pygame.display.set_mode((468, 60)) + pygame.display.set_caption('Monkey Fever') + pygame.mouse.set_visible(0) + + # Create The Backgound + background = pygame.Surface(screen.get_size()) + background = background.convert() + background.fill((250, 250, 250)) + + # Put Text On The Background, Centered + if pygame.font: + font = pygame.font.Font(None, 36) + text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10)) + textpos = text.get_rect(centerx=background.get_width()/2) + background.blit(text, textpos) + + # Display The Background + screen.blit(background, (0, 0)) + pygame.display.flip() + + # Prepare Game Objects + clock = pygame.time.Clock() + whiff_sound = load_sound('whiff.wav') + punch_sound = load_sound('punch.wav') + chimp = Chimp() + fist = Fist() + allsprites = pygame.sprite.RenderPlain((fist, chimp)) + + # Main Loop + going = True + while going: + clock.tick(60) + + # Handle Input Events + for event in pygame.event.get(): + if event.type == QUIT: + going = False + elif event.type == KEYDOWN and event.key == K_ESCAPE: + going = False + elif event.type == MOUSEBUTTONDOWN: + if fist.punch(chimp): + punch_sound.play() # punch + chimp.punched() + else: + whiff_sound.play() # miss + elif event.type == MOUSEBUTTONUP: + fist.unpunch() + + allsprites.update() + + # Draw Everything + screen.blit(background, (0, 0)) + allsprites.draw(screen) + pygame.display.flip() + + pygame.quit() + +# Game Over + + +# this calls the 'main' function when this script is executed +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/pygame/examples/cursors.py b/venv/Lib/site-packages/pygame/examples/cursors.py new file mode 100644 index 0000000..2bcc9e4 --- /dev/null +++ b/venv/Lib/site-packages/pygame/examples/cursors.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python + +import pygame + + +arrow = ( "xX ", + "X.X ", + "X..X ", + "X...X ", + "X....X ", + "X.....X ", + "X......X ", + "X.......X ", + "X........X ", + "X.........X ", + "X......XXXXX ", + "X...X..X ", + "X..XX..X ", + "X.X XX..X ", + "XX X..X ", + "X X..X ", + " X..X ", + " X..X ", + " X..X ", + " XX ", + " ", + " ", + " ", + " ") + + +no = (" ", + " ", + " XXXXXX ", + " XX......XX ", + " X..........X ", + " X....XXXX....X ", + " X...XX XX...X ", + " X.....X X...X ", + " X..X...X X..X ", + " X...XX...X X...X ", + " X..X X...X X..X ", + " X..X X...X X..X ", + " X..X X.,.X X..X ", + " X..X X...X X..X ", + " X...X X...XX...X ", + " X..X X...X..X ", + " X...X X.....X ", + " X...XX X...X ", + " X....XXXXX...X ", + " X..........X ", + " XX......XX ", + " XXXXXX ", + " ", + " ", + ) + +def TestCursor(arrow): + hotspot = None + for y in range(len(arrow)): + for x in range(len(arrow[y])): + if arrow[y][x] in ['x', ',', 'O']: + hotspot = x,y + break + if hotspot != None: + break + if hotspot == None: + raise Exception("No hotspot specified for cursor '%s'!" % +cursorname) + s2 = [] + for line in arrow: + s2.append(line.replace('x', 'X').replace(',', '.').replace('O', +'o')) + cursor, mask = pygame.cursors.compile(s2, 'X', '.', 'o') + size = len(arrow[0]), len(arrow) + pygame.mouse.set_cursor(size, hotspot, cursor, mask) + +def main(): + pygame.init() + pygame.font.init() + font = pygame.font.Font(None, 24) + bg = pygame.display.set_mode((800, 600), 0, 24) + bg.fill((255,255,255)) + bg.blit(font.render("Click to advance", 1, (0, 0, 0)), (0, 0)) + pygame.display.update() + for cursor in [no, arrow]: + TestCursor(cursor) + going = True + while going: + pygame.event.pump() + for e in pygame.event.get(): + if e.type == pygame.MOUSEBUTTONDOWN: + going = False + pygame.quit() + + +if __name__ == '__main__': + main() + diff --git a/venv/Lib/site-packages/pygame/examples/data/alien1.gif b/venv/Lib/site-packages/pygame/examples/data/alien1.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4497e08d8b9da563731f96a3545cbc5bbbe5f2c GIT binary patch literal 3826 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 Hv@`iX|5k2y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/alien1.png b/venv/Lib/site-packages/pygame/examples/data/alien1.png new file mode 100644 index 0000000000000000000000000000000000000000..471d6a440621835ca48442f4cfed1b1b581ec74d GIT binary patch literal 3522 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/alien2.gif b/venv/Lib/site-packages/pygame/examples/data/alien2.gif new file mode 100644 index 0000000000000000000000000000000000000000..8df05a34e4f880f4897d7d5ad9d0e5036348b78a GIT binary patch literal 3834 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 VqT2pL?HG6OP}pdL8&|&Pe*yNpI^+NV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/alien2.png b/venv/Lib/site-packages/pygame/examples/data/alien2.png new file mode 100644 index 0000000000000000000000000000000000000000..aef5ace8e06ae08393191ee078788e83059f0be3 GIT binary patch literal 3526 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 AqyPW_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/alien3.gif b/venv/Lib/site-packages/pygame/examples/data/alien3.gif new file mode 100644 index 0000000000000000000000000000000000000000..5305d419431cfa2718a7dcf0f6ed9970cbf6fc9f GIT binary patch literal 3829 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 H0Py-hSIjqc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/alien3.png b/venv/Lib/site-packages/pygame/examples/data/alien3.png new file mode 100644 index 0000000000000000000000000000000000000000..90d0f7ce216b1e7466d7ed5d485ee7a45d15afd6 GIT binary patch literal 3518 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/arraydemo.bmp b/venv/Lib/site-packages/pygame/examples/data/arraydemo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ad96338e7b4e4a853aa2d91b44ca5f90cf5d268e GIT binary patch literal 76854 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 VsVNzd0U3}18IXa048-i8{{aTI3E2Pu literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/bomb.gif b/venv/Lib/site-packages/pygame/examples/data/bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..02271c38f105f143d36f74921761d68b018b2c74 GIT binary patch literal 1162 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 AEdT%j literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/car_door.wav b/venv/Lib/site-packages/pygame/examples/data/car_door.wav new file mode 100644 index 0000000000000000000000000000000000000000..60acf9e9fb18537bd18234613f46c3bdc6261b74 GIT binary patch literal 3910 zcmZuzd2kfhnIErRDd)!PBbAh?C|R;50oz~#SYQJNa|i>H5J&g=8VHK^TlN#xY4HTS?06-8i*J)z((U|D?9c?AO9hoT_~4>G!?& z-M{bY^*dg2;J~i$S}awsRql8AiK2hBSS*jg-xC`wtG`DqkHd1a|G%C9seoAa$n-f+YOGScVk)RnZtui8u*}dA8Pd@zh*zf-1-tU$^ zdiTT0!bkUh^WnYwGs{zx6Z4aA-sm~s8|~^$A`!2x-fnf&pWC-<*Y2`?B|8pP?^ySf zmyhgvW$*rjm8Z+!C^>rYqo3}nIwnYAn(|e-{G``~I9w-BQv${)NLavlLX7ofb-Y}!#K|ZUcdCKc>khmmu^f#&PlfzwJl@J-ncMx=YyMf=P%85cci8--G1l(t%d8CR<4cBU6>zQ zn!fj+fBg547v_KQ@x5Q(pYIr$pPZl1H>LzX7N$hh@2#)g{m(z%xcQ|WuWj47p=d*e zb=`B{d;PiRU)U8m z7Jhm6z3ZR-_owgQn7Va!?EQ|#&;K6%-{;V-2M>O4HtjbL{`dOQFO2m4tNHGJWA0bC zZ%^rG_~3Y9YSRfzg*{qXUQ1RyS^v!5`fWda2|4!0fo zU0J++YjJYw?q`4c!UVG1`10Pp z<#o22<40b%mX;#!hLW8-w!V7WdTjl(Uw`6- zJdleSVoM@7($#T(WU9S29_NzLbVoubLkQUdt6EM4m2gzba!80Z+?0vpY0f%Twb1@9GG5u z?`lunFmgRZLt__52Ku`P2l5kLxxT@n;gRm%kt?%(L!%c9lljrY^xX1dK0k5&&YgwX z$-?C1!nLKv!rYrHi}}IxBMVoqUY?j87wVuDQbZvI5E0bwz&g$`0D$LP> z5n)AtSZ*HaiAj_!Mw6KqiQ*!;Y$_U!Hg|UATAOn{O+911t(_gc1LH%vj^6gp!Tz!Q z`DE8%exN^Ea=H>roFo(*J22QsKwHTq-wGjjYMUcrNbeL4l5cT z6T=i14wC_brwJnHbz>AmqYgMqX~OPwy6q_H!-x>=by;n}02U1ReNHFNks(igU7g+O zuB~yQ0Y^(ZUm#kKBwE|^aLoL z!%#1+B^wiht{SqeMv|H4Y$B%1MzXEDqb+MF$;M<;b4PPZOSLyP>Pob|Bd$k{L{mx( zOPr<}*%nEp6_w|C0vGrYNe4-c4C4WWKuxq*6i2xd#+cg=D#M6m*BHPm1l8zg(M7pUdnTV(2aaD;X8dHX$#i9`-6^|&q zz>A_JX_}^pvZCoSF9?z%$)Y9+0>d#ZNL8H=K`VKN!7<1KawbU{N4;J@Nl`c&Vo22O z@%fMdinu+94}rHI@pxSx*vT%RKY*jodYjAR^&*JJ<*++kZZP#aoNkZ99RwKQ-yui< zLVylVg-DhcsSpKC!AUYmP=q;>I1(fQ5&{q+LJUL=qPPh@P17WpuoQ`d4^XCgi3Dte zi~yTDM00#tkQGIiSelb%MG!baltfYF1Q0-zWr62emZcd$6d2ey<|YWUG-Lon7z7O5 z*p}-N(a}Wqp z<7kFs1qn8jBAS^9f}+asfIG7RvKCQgQHD;K4k0%lC7P;5BC4u_%zzyb0}YtO3|-eX*wuy+F-cP)B4~gU=yFs88&Cj2)Z`7r zh=FP>9y8)e`1T|cu^24HxJW{zM2noy9UX*x)t97qfbFo6XnRf57+6E*QMH>n0N04QJrpg$fv(7^*)=m)2x7L$G%y8b=l)8tyqYnT zV743x7N8bW8OWTQ`X=)i0+%Kap}wHi>0iXatgf#vmoh7tnpt6tMiOuE~oQ+>iR!!Oio@ z)tjfq^4zq=a@f3z{vA3}QgLDrtd|@+P+GFDwCu;g?+c&|=61S>qRqv{#YGhXxa}4l evlCPR^A?pL4KIN9Ye&CsYSv*zuLlB{#q$3R0$=6; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/chimp.bmp b/venv/Lib/site-packages/pygame/examples/data/chimp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ec5f88a4dc86bae54d94350c384bf8c33320b71d GIT binary patch literal 5498 zcmb7{eOwb)*2jN_GPIU#w?sfK4TirHRjqWZ4O?^^Z>ZgltpF2r_qCS5-_rvg+ zxjEnYopbIz_uk3QU6F`z``tajljLqRxu%k90PYRhjg@$I{5V)QeTN4UevOuc z7cqaH3v1t6hx}J(VON72KiufTHy6+2(<6srwpsA!WlQnQXcZnG`Z%6{aUx!y{S)Hi z@5AxW190zY!=9$&VQn}mQrL!=xL9PV|AR>{ z%*V&AJ`78J4tw^rVCCw+L9eewwb6j=39sVmQ6urkyct;d#v=T){a<+a(MRx~Tiqy} z^BN8xJ`K^Z8RhT3gRBWzXx#fDzB>0cK0b61$4(xH|6&l&K06WDu7^lmEX*b+mUAoy zB_(3tz7TfQH>37_JBAH=3QwdyfiYtDg%vWbI;_0XGSGE`n7B9q}4?nznsD(_J5-~`;`xa$A?BX@F=J*v+B?3*xovRW(9((_4?Tv0!ns(mun0SLeSo?x^*D0$Ge8DR`{N(b(6|SO4!2@<;Z2-8 zeF|0YZN&VA3-FiXWf=OzFnn?LORRXa1e=}j!?W)OhCej|7ccwq=;M#Ucm5ohabq!F zor&+dzK2%FA!%?jCQr>p?0s?Y|Fav**($Vmc3`u82d-SZiqy0x(RTC-)Z?e%%~dPm zX*mFcNyLML64117F9r`uA@i~d-9O*N=`&wISGoeP&z*y*)2G3?wGNAm-hgV%XuMOg z0Vh5`33}L2?A_Z6Z`%=U-&v1U`qh~EavsL1$75aDddw<#6}vxZ0LyD};nGF?=E+q2 zX~BF9l;4kk2ioz;r-u;w{yS{j?!x|$Jh0Z-@WP}QF*1D=Uemmeqiz2{v*!!^_|pv> z{>+O<9(xqo&rd+&;3T{>WiocSccL?R1?T-2uxQC*(04RJI4UIb!pQtPe(CGLot!1e zFvW~%U)ilCeRj9s-N~7^AMIjdyBN~`Uz~;EO~F!gNmnhy->%a4+)poyqQ(h66Juda zu_Yy4%)&mq$la~pj(%Ka+;o+;$;dD(h?6A@W9c=cV})c5M_GiPo_^eAh&pcr?juw% zkuh7TJ*M?EJ>p?{VXdZ&voNJ;-`BQkK7s?o>tCbhH?6VpnkH2OWb_xv7tJO?m zC3iP&kZUQyTo5NRCX?@2H*<4ohO(tW?%kwr>)c?K^0MaG9A+^fYM&z#?Us4Wcr(+QRe8H! z{-UK(HQgujQ-nKDSr`kZMaFQzvP6@)BzVO#`F3t@gd&cyBSmH6m@yX1TBfUIMA*(e zER{)Qm~7r>&5D3Mem>Y6TpVqVTW8wET1$gW*14C$W~mmT#L}J@Z*jA~>c{=c77Y%t z)3l(!Wl4`oVwf#Cbwee)r7GatKq8O5FKGQ;^KNE1t2pje{mC2NaNq z_)e~rZwfhM9WHE?xH;xvK2ws&mtVLlJ(3pH8`R4kqv_Uwz9QF`$gMRUbh-3q$xKM> zUQyDT#o4XW6KPS-*&E(BG@S~C(`mL?;yKcb6iLF8md=!v@Nx~wTDV2H^bfGETS0MRq;~`1e5YfxZ#K3T z)|Q9mqJFOI!5}kD0qWKn{UM$0^Q#mS!eH3XPaVBniUu%h%Ixk2 zxaAQH!^x1+JM(;b$v>uZnzwqnBk~6#94VStW{82o>Rg#ZDe9vbAUR4`3AKVye05D2 z3;X$4G!Cis&Nb&$2zJ(HFpBZfZh#_VN*l|Qvex*r?3T?EDfu}r@@5Gm%`YrzEb?5> z&^s|-ql*jFMRvT5(ItDtfrz9~fO;4`sYzZ~ySFSZE$<&wpyddcjP^{6U z$J;}b3Id&ezb@>A3+F^is5I}P=?{&1y;hNOjH>cVUK1`{v&2nhppA_&=Gp^XO9LC3 znl9vo>`RtOi^Hv_q1#n0#wm;1Sh5ilZcI29C<_|wvJ{V!svVo@52(U=(tzd{vF(K8 z<(;9Tz}P~6`JpFCDHG28o#dykX}Yq>(Ci4=m6XC!og=wU{zO$bA44$OQjHFO4VBDl zC}Vbn3+o;1RC#3qg;Ei6Q+CHevOFJX4BzWr7nnU z&P8Mjcqsdlv-Um4T8Uf#(IUwwh&fY34yPlefXp44V*;eG4 zDC;P@rijXvAB}Q!6VXdh>d9h~LuIpq)+Q{HfJnp361Nbdj7pEsO&BGUlQUGr&u1_k zlr0XBi&|c=c892p-T(J7*7`V2vAU9dFpNuEj&Y3GFMiEt%qIEcx0dI5aFS%#sP1>R+=*>QLeXNzZ z?d;lK9wX#4TgfXVMYvSZWh!ks#z^^x^GV)NH>8|0>OFaO%AKB|bU|~`TFa$%TNXMa zf+F;y*Jx`}D8h0*e$r_wIY(uxxQtM>!9X;)c7|!~%C|5YDk7NU*ZJe+9jdMUxdAz# zYAZQ~&RLkC7xnT3HS6E!Q=V}X@sl*af zYw6(?B@9;eR<}T^mqoS&y-b<3% zpmP^oR;|)TmbX5RZjrg&QP=kYbV=bXHAMVA(P!GZMLNK zYQ)Vc`v3$9hcrf731Q)df(zTRg_vz7%dgG((z!JfuZEzP1!S;MV~eg^d8 zXrrtkK5x1R*2lR+?6q2zUaV0GYON4sDrMF{A3F1F)Xn}}Y(`U&$Db2W3sj2JI7lOR zZ&c>q6s*fk1AnZFwTX`Rda(W+Z8gf8RB_h2%ayz@$aGoqNlNYM>e^izW48TI%|G^H zw{dj6v~gBVS89B|wQJ{H^IbimQ57CjjH+^X@zOD(xAl!*q-#g9LFvyhs!s@ZieUte z&z@1^lo>NmSq8WELgeOlj;3dZ+;T-qDc?=L6U(Uc<~-Ift7}%)^<*+a-^tOIs!+Ak zUYb;-*_oZjoiMG@%h#Z^4(#y)XMHZsl HSm1vFBV4Ty literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/city.png b/venv/Lib/site-packages/pygame/examples/data/city.png new file mode 100644 index 0000000000000000000000000000000000000000..202da5cf1a069cad472feb9833fb81974f09c2bc GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!JgF%}28J29*~C-V}>VGHmHaRt)< z|NmclbN*eBbV-n3FoVOh8)-m}mZytj2*>s0ga#%zg|xhcgarEo2M+viXmtF?%-sB! kpRMheea4Uf_CW>=QPVYSQ|}dS1nOe&boFyt=akR{006};i~s-t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/danger.gif b/venv/Lib/site-packages/pygame/examples/data/danger.gif new file mode 100644 index 0000000000000000000000000000000000000000..106d69c0fe6a1e450ae00658748b80a436018ac9 GIT binary patch literal 2761 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/fist.bmp b/venv/Lib/site-packages/pygame/examples/data/fist.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a75f12e656b5a7eeb73363135b581c4e5c1742ec GIT binary patch literal 4378 zcmbuBX;@Ro9*2JdNipDr#+|l-hi_a{?{|`hhynGv}Feo;PoP|Cu?H z%wOnW4P*1P049^s6w*1QkHARd^8uF;eRoqPxx;0OJEpqKg4^33m@(B0v!;2$!*w>i z+&Tr3LaVp-4%EC~+7 zl6SZWL1efD%NMW1iqN$P4@H2e6$d2W7Z%gR)h^A3F62zaZEargh@z`PeRgrDP+7En-h|;acv4@$(zV$ zGY}P%fyme_#Kvxcn4by0P=@zKQp5_f!542syf_yL!VIK;kcD;e+pvCZHqsOGAXuY7 z{QLPxk|-cf*oCBo0`hz()+O#nTJjzwC6^*4`2g0Z97K9*DK@5+A$?Oha?-azu~~|Y z^-5%<6(D<45wbS!LC)sg$oOzSGB+GVCgC<^sF0f>MP6nO@;}anQkIXMTNU_ZyAlVB zcH>a-K4fKlifx&PuqCq+xmgvEWmh3@Yc&)fA3{NHC3fc@MpjlWa->JGCHp9HbB<%% zwo}-dr@^l68YuEkqhz}l%AF?&djf^|XHY`=-d$%sBPMIcby^Fduni5Nqhj7R5ybdAebLUk{IeTN(qKQ3=e$H&EL4Bdh>ilx&TOJ9}kDV9p845T{=7me5eUM(-Xg0(r^=&P>jOiw4^{Fsk%;H(I&KWZ z=%vwU4Cds=&)}E6y&6THgsh#XGYLUuuplhMI^k7WLw%V%Elm(XW{t_90-IA_Cj0At z@yi(u7t7>QX$n8c#bL}ShOs!Z$PDI`{#RoFd$VkNUS66w!s`ty0+Y&UG&)hU`qyIs zd#7A3mrGLxfgZ10jV3XSwVBfxHa{Cv{B5@TXc-abNq9c4<7_R7nCvsAg*k(Dc(C_( zU1eEWnL;WK^Ko}}upB*xNi{m1wPi5-XS24tx~g0$6@>fDnB?rhwzMQHi`HMI%7-8{+Tj>SSfbVlr5k{TqH@ zhVL628wp*dOyzS!X3lVRa`ow{VJB-)t5)tSr$dv4#EHZa3**avM*O-+|{YSoT3F(r0)f76!5vfgNn@Y2~w z-9Ku(L>gfg@>F4TIK{GAO!nl>ozxpTFayOlU20IPlte7x1$uf?Ubf>X_QL;}vJbAb zwOu-^RacfPWvOBwXXea4mQG{N>oxHXhwai|xzg68tF1DIpu8@|40Hsf7WwW?g1mJ&^|4s2_-Ba=4LI@5&xNl)@N>uRgZ3zSkL>*`?1VvlE&^C!WC?J}~Y zIO3H{_#A(KcW27Wwq{t*CqMgr^W1kG4tt;ErD{`GsZ={8)XDAcWXondvaGEKd4Kvs zuWxT5^FUaoR2&x==;mNKhGK1ON=@=otiHWbt5#R53i2d^@NjQu;$<^f?1Vo|*dGb1 zZ*S77HJWN7mhkz$t`2PWSUS_@Bhxh=2K(oi`pcK~t=fv>3XQr_DNhrN!#s%Bj_kE{ zCf=uCw70Zes8<)ua`%zMN?A$@&ubi+2YZ(F0+YPI>09dSPaH3n357ZP)Ss2fQ&V|f zPWEg&M>gxfCf?umt@ZVqioz^DC+fq!H3d5)k_Znn5%v@8tPi~k+uqXLTz~3#elj<} zKd~rZCKiW#I6K(cJ5E?cUgd%N;aam!r;_nGJ}$O1LK3&83WedGlO{TjwI4tCpefs3 zuTsgAh0!5zSvf}uvp!BtBqz%BiFWpOj+2j=cnuFvoTw?0$;4j&9OJM$OO}--3=fz& z-Pz7&tYh%wffX zP2~ILYL7~#+@#eZely;5w6S;GGnh3z{XvzwvqTb_quw4F=@t+Z72r4h&9U~5LwJe0 zqeNAl8j)Bm2?}y?Ojy4p#DDsP@ynkK;T;}p_@<;#8W+A*;NvrK{PmtQF(CoFubb?% z7q9f)8ksmSndj;{e(n=eZm01_cE}9mGrgbZM6c#dnl!%jh2XDPgQ5HCws#jV{^Z49 dBhxj0AsH4+1?he9N15FIb%vL|qJKC%_W$Q0F!ule literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/house_lo.mp3 b/venv/Lib/site-packages/pygame/examples/data/house_lo.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4c26994a93f5a499d18ca639ad65e4cfcdddfbba GIT binary patch literal 116320 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 D5JZXT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/house_lo.ogg b/venv/Lib/site-packages/pygame/examples/data/house_lo.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e050848e3fa587ca0b5b61cab6edafc1e285c0fb GIT binary patch literal 31334 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/pygame/examples/data/house_lo.wav b/venv/Lib/site-packages/pygame/examples/data/house_lo.wav new file mode 100644 index 0000000000000000000000000000000000000000..68a96b869380fd9da83e28da23c847bd03ff414e GIT binary patch literal 78464 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