From 7b52e4db07052fac07123e68ff390f29fe1a2c51 Mon Sep 17 00:00:00 2001 From: Keith Irwin Date: Thu, 31 Aug 2017 16:11:54 +0000 Subject: [PATCH] Updated dependencies --- env/bin/chardetect | 11 + .../__pycache__/update_checker.cpython-34.pyc | Bin 0 -> 8575 bytes .../update_checker_test.cpython-34.pyc | Bin 0 -> 3651 bytes .../DESCRIPTION.rst | 49 + .../certifi-2017.7.27.1.dist-info/INSTALLER | 1 + .../certifi-2017.7.27.1.dist-info/METADATA | 71 + .../certifi-2017.7.27.1.dist-info/RECORD | 16 + .../certifi-2017.7.27.1.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../site-packages/certifi/__init__.py | 3 + .../site-packages/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 229 bytes .../__pycache__/__main__.cpython-34.pyc | Bin 0 -> 197 bytes .../certifi/__pycache__/core.cpython-34.pyc | Bin 0 -> 1120 bytes .../site-packages/certifi/cacert.pem | 4834 +++++++++++ .../python3.4/site-packages/certifi/core.py | 36 + .../site-packages/certifi/old_root.pem | 414 + .../python3.4/site-packages/certifi/weak.pem | 5248 +++++++++++ .../chardet-3.0.4.dist-info/DESCRIPTION.rst | 70 + .../chardet-3.0.4.dist-info/INSTALLER | 1 + .../chardet-3.0.4.dist-info/METADATA | 96 + .../chardet-3.0.4.dist-info/RECORD | 91 + .../chardet-3.0.4.dist-info/WHEEL | 6 + .../chardet-3.0.4.dist-info/entry_points.txt | 3 + .../chardet-3.0.4.dist-info/metadata.json | 1 + .../chardet-3.0.4.dist-info/top_level.txt | 1 + .../site-packages/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 841 bytes .../__pycache__/big5freq.cpython-34.pyc | Bin 0 -> 54675 bytes .../__pycache__/big5prober.cpython-34.pyc | Bin 0 -> 1103 bytes .../chardistribution.cpython-34.pyc | Bin 0 -> 6660 bytes .../charsetgroupprober.cpython-34.pyc | Bin 0 -> 2393 bytes .../__pycache__/charsetprober.cpython-34.pyc | Bin 0 -> 3596 bytes .../codingstatemachine.cpython-34.pyc | Bin 0 -> 2928 bytes .../chardet/__pycache__/compat.cpython-34.pyc | Bin 0 -> 332 bytes .../__pycache__/cp949prober.cpython-34.pyc | Bin 0 -> 1110 bytes .../chardet/__pycache__/enums.cpython-34.pyc | Bin 0 -> 2692 bytes .../__pycache__/escprober.cpython-34.pyc | Bin 0 -> 2763 bytes .../chardet/__pycache__/escsm.cpython-34.pyc | Bin 0 -> 7878 bytes .../__pycache__/eucjpprober.cpython-34.pyc | Bin 0 -> 2558 bytes .../__pycache__/euckrfreq.cpython-34.pyc | Bin 0 -> 24061 bytes .../__pycache__/euckrprober.cpython-34.pyc | Bin 0 -> 1111 bytes .../__pycache__/euctwfreq.cpython-34.pyc | Bin 0 -> 54684 bytes .../__pycache__/euctwprober.cpython-34.pyc | Bin 0 -> 1111 bytes .../__pycache__/gb2312freq.cpython-34.pyc | Bin 0 -> 38326 bytes .../__pycache__/gb2312prober.cpython-34.pyc | Bin 0 -> 1119 bytes .../__pycache__/hebrewprober.cpython-34.pyc | Bin 0 -> 3177 bytes .../__pycache__/jisfreq.cpython-34.pyc | Bin 0 -> 44470 bytes .../chardet/__pycache__/jpcntx.cpython-34.pyc | Bin 0 -> 24782 bytes .../langbulgarianmodel.cpython-34.pyc | Bin 0 -> 24890 bytes .../langcyrillicmodel.cpython-34.pyc | Bin 0 -> 30577 bytes .../__pycache__/langgreekmodel.cpython-34.pyc | Bin 0 -> 24568 bytes .../langhebrewmodel.cpython-34.pyc | Bin 0 -> 23388 bytes .../langhungarianmodel.cpython-34.pyc | Bin 0 -> 24864 bytes .../__pycache__/langthaimodel.cpython-34.pyc | Bin 0 -> 23367 bytes .../langturkishmodel.cpython-34.pyc | Bin 0 -> 23385 bytes .../__pycache__/latin1prober.cpython-34.pyc | Bin 0 -> 3272 bytes .../mbcharsetprober.cpython-34.pyc | Bin 0 -> 2364 bytes .../mbcsgroupprober.cpython-34.pyc | Bin 0 -> 1122 bytes .../chardet/__pycache__/mbcssm.cpython-34.pyc | Bin 0 -> 18888 bytes .../sbcharsetprober.cpython-34.pyc | Bin 0 -> 3196 bytes .../sbcsgroupprober.cpython-34.pyc | Bin 0 -> 1674 bytes .../__pycache__/sjisprober.cpython-34.pyc | Bin 0 -> 2586 bytes .../universaldetector.cpython-34.pyc | Bin 0 -> 6480 bytes .../__pycache__/utf8prober.cpython-34.pyc | Bin 0 -> 2062 bytes .../__pycache__/version.cpython-34.pyc | Bin 0 -> 390 bytes .../site-packages/chardet/big5freq.py | 386 + .../site-packages/chardet/big5prober.py | 47 + .../site-packages/chardet/chardistribution.py | 233 + .../chardet/charsetgroupprober.py | 106 + .../site-packages/chardet/charsetprober.py | 145 + .../site-packages/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-34.pyc | Bin 0 -> 138 bytes .../cli/__pycache__/chardetect.cpython-34.pyc | Bin 0 -> 2753 bytes .../site-packages/chardet/cli/chardetect.py | 85 + .../chardet/codingstatemachine.py | 88 + .../python3.4/site-packages/chardet/compat.py | 34 + .../site-packages/chardet/cp949prober.py | 49 + .../python3.4/site-packages/chardet/enums.py | 76 + .../site-packages/chardet/escprober.py | 101 + .../python3.4/site-packages/chardet/escsm.py | 246 + .../site-packages/chardet/eucjpprober.py | 92 + .../site-packages/chardet/euckrfreq.py | 195 + .../site-packages/chardet/euckrprober.py | 47 + .../site-packages/chardet/euctwfreq.py | 387 + .../site-packages/chardet/euctwprober.py | 46 + .../site-packages/chardet/gb2312freq.py | 283 + .../site-packages/chardet/gb2312prober.py | 46 + .../site-packages/chardet/hebrewprober.py | 292 + .../site-packages/chardet/jisfreq.py | 325 + .../python3.4/site-packages/chardet/jpcntx.py | 233 + .../chardet/langbulgarianmodel.py | 228 + .../chardet/langcyrillicmodel.py | 333 + .../site-packages/chardet/langgreekmodel.py | 225 + .../site-packages/chardet/langhebrewmodel.py | 200 + .../chardet/langhungarianmodel.py | 225 + .../site-packages/chardet/langthaimodel.py | 199 + .../site-packages/chardet/langturkishmodel.py | 193 + .../site-packages/chardet/latin1prober.py | 145 + .../site-packages/chardet/mbcharsetprober.py | 91 + .../site-packages/chardet/mbcsgroupprober.py | 54 + .../python3.4/site-packages/chardet/mbcssm.py | 572 ++ .../site-packages/chardet/sbcharsetprober.py | 132 + .../site-packages/chardet/sbcsgroupprober.py | 73 + .../site-packages/chardet/sjisprober.py | 92 + .../chardet/universaldetector.py | 286 + .../site-packages/chardet/utf8prober.py | 82 + .../site-packages/chardet/version.py | 9 + .../idna-2.6.dist-info/DESCRIPTION.rst | 213 + .../idna-2.6.dist-info/INSTALLER | 1 + .../site-packages/idna-2.6.dist-info/METADATA | 239 + .../site-packages/idna-2.6.dist-info/RECORD | 23 + .../site-packages/idna-2.6.dist-info/WHEEL | 6 + .../idna-2.6.dist-info/metadata.json | 1 + .../idna-2.6.dist-info/top_level.txt | 1 + .../python3.4/site-packages/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-34.pyc | Bin 0 -> 203 bytes .../idna/__pycache__/codec.cpython-34.pyc | Bin 0 -> 3388 bytes .../idna/__pycache__/compat.cpython-34.pyc | Bin 0 -> 581 bytes .../idna/__pycache__/core.cpython-34.pyc | Bin 0 -> 10077 bytes .../idna/__pycache__/idnadata.cpython-34.pyc | Bin 0 -> 26983 bytes .../idna/__pycache__/intranges.cpython-34.pyc | Bin 0 -> 1875 bytes .../__pycache__/package_data.cpython-34.pyc | Bin 0 -> 153 bytes .../idna/__pycache__/uts46data.cpython-34.pyc | Bin 0 -> 230858 bytes env/lib/python3.4/site-packages/idna/codec.py | 118 + .../python3.4/site-packages/idna/compat.py | 12 + env/lib/python3.4/site-packages/idna/core.py | 387 + .../python3.4/site-packages/idna/idnadata.py | 1585 ++++ .../python3.4/site-packages/idna/intranges.py | 53 + .../site-packages/idna/package_data.py | 2 + .../python3.4/site-packages/idna/uts46data.py | 7634 +++++++++++++++++ .../praw-5.0.1.dist-info/DESCRIPTION.rst | 158 + .../praw-5.0.1.dist-info/INSTALLER | 1 + .../praw-5.0.1.dist-info/METADATA | 186 + .../site-packages/praw-5.0.1.dist-info/RECORD | 116 + .../site-packages/praw-5.0.1.dist-info/WHEEL | 6 + .../praw-5.0.1.dist-info/metadata.json | 1 + .../praw-5.0.1.dist-info/top_level.txt | 1 + .../python3.4/site-packages/praw/__init__.py | 14 + .../praw/__pycache__/__init__.cpython-34.pyc | Bin 0 -> 664 bytes .../praw/__pycache__/config.cpython-34.pyc | Bin 0 -> 4324 bytes .../praw/__pycache__/const.cpython-34.pyc | Bin 0 -> 8521 bytes .../__pycache__/exceptions.cpython-34.pyc | Bin 0 -> 1715 bytes .../praw/__pycache__/objector.cpython-34.pyc | Bin 0 -> 4689 bytes .../praw/__pycache__/reddit.cpython-34.pyc | Bin 0 -> 14816 bytes .../python3.4/site-packages/praw/config.py | 109 + env/lib/python3.4/site-packages/praw/const.py | 187 + .../site-packages/praw/exceptions.py | 35 + .../site-packages/praw/models/__init__.py | 31 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 1895 bytes .../models/__pycache__/auth.cpython-34.pyc | Bin 0 -> 5547 bytes .../models/__pycache__/base.cpython-34.pyc | Bin 0 -> 1686 bytes .../__pycache__/comment_forest.cpython-34.pyc | Bin 0 -> 6234 bytes .../models/__pycache__/front.cpython-34.pyc | Bin 0 -> 698 bytes .../models/__pycache__/helpers.cpython-34.pyc | Bin 0 -> 8016 bytes .../models/__pycache__/inbox.cpython-34.pyc | Bin 0 -> 8159 bytes .../__pycache__/modaction.cpython-34.pyc | Bin 0 -> 769 bytes .../__pycache__/stylesheet.cpython-34.pyc | Bin 0 -> 427 bytes .../__pycache__/subreddits.cpython-34.pyc | Bin 0 -> 5283 bytes .../models/__pycache__/user.cpython-34.pyc | Bin 0 -> 3707 bytes .../models/__pycache__/util.cpython-34.pyc | Bin 0 -> 6818 bytes .../site-packages/praw/models/auth.py | 121 + .../site-packages/praw/models/base.py | 41 + .../praw/models/comment_forest.py | 178 + .../site-packages/praw/models/front.py | 11 + .../site-packages/praw/models/helpers.py | 194 + .../site-packages/praw/models/inbox.py | 235 + .../praw/models/list/__init__.py | 1 + .../list/__pycache__/__init__.cpython-34.pyc | Bin 0 -> 200 bytes .../list/__pycache__/base.cpython-34.pyc | Bin 0 -> 1945 bytes .../list/__pycache__/redditor.cpython-34.pyc | Bin 0 -> 498 bytes .../site-packages/praw/models/list/base.py | 43 + .../praw/models/list/redditor.py | 8 + .../praw/models/listing/__init__.py | 1 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 223 bytes .../listing/__pycache__/domain.cpython-34.pyc | Bin 0 -> 971 bytes .../__pycache__/generator.cpython-34.pyc | Bin 0 -> 3089 bytes .../__pycache__/listing.cpython-34.pyc | Bin 0 -> 1632 bytes .../praw/models/listing/domain.py | 17 + .../praw/models/listing/generator.py | 79 + .../praw/models/listing/listing.py | 35 + .../praw/models/listing/mixins/__init__.py | 6 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 504 bytes .../mixins/__pycache__/base.cpython-34.pyc | Bin 0 -> 4947 bytes .../mixins/__pycache__/gilded.cpython-34.pyc | Bin 0 -> 928 bytes .../__pycache__/redditor.cpython-34.pyc | Bin 0 -> 5865 bytes .../mixins/__pycache__/rising.cpython-34.pyc | Bin 0 -> 1318 bytes .../__pycache__/submission.cpython-34.pyc | Bin 0 -> 1050 bytes .../__pycache__/subreddit.cpython-34.pyc | Bin 0 -> 2777 bytes .../praw/models/listing/mixins/base.py | 125 + .../praw/models/listing/mixins/gilded.py | 18 + .../praw/models/listing/mixins/redditor.py | 137 + .../praw/models/listing/mixins/rising.py | 29 + .../praw/models/listing/mixins/submission.py | 18 + .../praw/models/listing/mixins/subreddit.py | 66 + .../site-packages/praw/models/modaction.py | 16 + .../praw/models/reddit/__init__.py | 1 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 202 bytes .../reddit/__pycache__/base.cpython-34.pyc | Bin 0 -> 3531 bytes .../reddit/__pycache__/comment.cpython-34.pyc | Bin 0 -> 6575 bytes .../reddit/__pycache__/live.cpython-34.pyc | Bin 0 -> 23909 bytes .../reddit/__pycache__/message.cpython-34.pyc | Bin 0 -> 2329 bytes .../reddit/__pycache__/modmail.cpython-34.pyc | Bin 0 -> 10206 bytes .../reddit/__pycache__/more.cpython-34.pyc | Bin 0 -> 2969 bytes .../reddit/__pycache__/multi.cpython-34.pyc | Bin 0 -> 6116 bytes .../__pycache__/redditor.cpython-34.pyc | Bin 0 -> 4057 bytes .../__pycache__/submission.cpython-34.pyc | Bin 0 -> 15456 bytes .../__pycache__/subreddit.cpython-34.pyc | Bin 0 -> 79016 bytes .../__pycache__/wikipage.cpython-34.pyc | Bin 0 -> 7492 bytes .../site-packages/praw/models/reddit/base.py | 83 + .../praw/models/reddit/comment.py | 181 + .../site-packages/praw/models/reddit/live.py | 649 ++ .../praw/models/reddit/message.py | 59 + .../praw/models/reddit/mixins/__init__.py | 84 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 4279 bytes .../__pycache__/editable.cpython-34.pyc | Bin 0 -> 1319 bytes .../__pycache__/gildable.cpython-34.pyc | Bin 0 -> 708 bytes .../__pycache__/inboxable.cpython-34.pyc | Bin 0 -> 1533 bytes .../inboxtoggleable.cpython-34.pyc | Bin 0 -> 1088 bytes .../__pycache__/messageable.cpython-34.pyc | Bin 0 -> 1982 bytes .../__pycache__/replyable.cpython-34.pyc | Bin 0 -> 911 bytes .../__pycache__/reportable.cpython-34.pyc | Bin 0 -> 830 bytes .../mixins/__pycache__/savable.cpython-34.pyc | Bin 0 -> 1086 bytes .../mixins/__pycache__/votable.cpython-34.pyc | Bin 0 -> 2410 bytes .../praw/models/reddit/mixins/editable.py | 26 + .../praw/models/reddit/mixins/gildable.py | 11 + .../praw/models/reddit/mixins/inboxable.py | 35 + .../models/reddit/mixins/inboxtoggleable.py | 16 + .../praw/models/reddit/mixins/messageable.py | 45 + .../praw/models/reddit/mixins/replyable.py | 16 + .../praw/models/reddit/mixins/reportable.py | 15 + .../praw/models/reddit/mixins/savable.py | 20 + .../praw/models/reddit/mixins/votable.py | 46 + .../praw/models/reddit/modmail.py | 267 + .../site-packages/praw/models/reddit/more.py | 69 + .../site-packages/praw/models/reddit/multi.py | 137 + .../praw/models/reddit/redditor.py | 95 + .../praw/models/reddit/submission.py | 418 + .../praw/models/reddit/subreddit.py | 2128 +++++ .../praw/models/reddit/wikipage.py | 181 + .../site-packages/praw/models/stylesheet.py | 7 + .../site-packages/praw/models/subreddits.py | 103 + .../site-packages/praw/models/user.py | 86 + .../site-packages/praw/models/util.py | 175 + .../python3.4/site-packages/praw/objector.py | 137 + env/lib/python3.4/site-packages/praw/praw.ini | 19 + .../python3.4/site-packages/praw/reddit.py | 484 ++ .../prawcore-0.11.0.dist-info/DESCRIPTION.rst | 94 + .../prawcore-0.11.0.dist-info/INSTALLER | 1 + .../prawcore-0.11.0.dist-info/METADATA | 119 + .../prawcore-0.11.0.dist-info/RECORD | 23 + .../prawcore-0.11.0.dist-info/WHEEL | 6 + .../prawcore-0.11.0.dist-info/metadata.json | 1 + .../prawcore-0.11.0.dist-info/top_level.txt | 1 + .../site-packages/prawcore/__init__.py | 13 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 732 bytes .../prawcore/__pycache__/auth.cpython-34.pyc | Bin 0 -> 14389 bytes .../prawcore/__pycache__/const.cpython-34.pyc | Bin 0 -> 461 bytes .../__pycache__/exceptions.cpython-34.pyc | Bin 0 -> 5463 bytes .../__pycache__/rate_limit.cpython-34.pyc | Bin 0 -> 2810 bytes .../__pycache__/requestor.cpython-34.pyc | Bin 0 -> 2493 bytes .../__pycache__/sessions.cpython-34.pyc | Bin 0 -> 7086 bytes .../prawcore/__pycache__/util.cpython-34.pyc | Bin 0 -> 839 bytes .../python3.4/site-packages/prawcore/auth.py | 328 + .../python3.4/site-packages/prawcore/const.py | 9 + .../site-packages/prawcore/exceptions.py | 122 + .../site-packages/prawcore/rate_limit.py | 80 + .../site-packages/prawcore/requestor.py | 49 + .../site-packages/prawcore/sessions.py | 184 + .../python3.4/site-packages/prawcore/util.py | 21 + .../requests-2.18.4.dist-info/DESCRIPTION.rst | 1645 ++++ .../requests-2.18.4.dist-info/INSTALLER | 1 + .../requests-2.18.4.dist-info/METADATA | 1680 ++++ .../requests-2.18.4.dist-info/RECORD | 43 + .../requests-2.18.4.dist-info/WHEEL | 6 + .../requests-2.18.4.dist-info/metadata.json | 1 + .../requests-2.18.4.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 121 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 3475 bytes .../__pycache__/__version__.cpython-34.pyc | Bin 0 -> 514 bytes .../_internal_utils.cpython-34.pyc | Bin 0 -> 1302 bytes .../__pycache__/adapters.cpython-34.pyc | Bin 0 -> 17376 bytes .../requests/__pycache__/api.cpython-34.pyc | Bin 0 -> 6477 bytes .../requests/__pycache__/auth.cpython-34.pyc | Bin 0 -> 8566 bytes .../requests/__pycache__/certs.cpython-34.pyc | Bin 0 -> 581 bytes .../__pycache__/compat.cpython-34.pyc | Bin 0 -> 1673 bytes .../__pycache__/cookies.cpython-34.pyc | Bin 0 -> 19596 bytes .../__pycache__/exceptions.cpython-34.pyc | Bin 0 -> 5562 bytes .../requests/__pycache__/help.cpython-34.pyc | Bin 0 -> 2911 bytes .../requests/__pycache__/hooks.cpython-34.pyc | Bin 0 -> 1005 bytes .../__pycache__/models.cpython-34.pyc | Bin 0 -> 25980 bytes .../__pycache__/packages.cpython-34.pyc | Bin 0 -> 419 bytes .../__pycache__/sessions.cpython-34.pyc | Bin 0 -> 19771 bytes .../__pycache__/status_codes.cpython-34.pyc | Bin 0 -> 5239 bytes .../__pycache__/structures.cpython-34.pyc | Bin 0 -> 4524 bytes .../requests/__pycache__/utils.cpython-34.pyc | Bin 0 -> 22175 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 525 ++ .../python3.4/site-packages/requests/api.py | 152 + .../python3.4/site-packages/requests/auth.py | 293 + .../python3.4/site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 69 + .../site-packages/requests/cookies.py | 542 ++ .../site-packages/requests/exceptions.py | 122 + .../python3.4/site-packages/requests/help.py | 120 + .../python3.4/site-packages/requests/hooks.py | 34 + .../site-packages/requests/models.py | 948 ++ .../site-packages/requests/packages.py | 14 + .../site-packages/requests/sessions.py | 737 ++ .../site-packages/requests/status_codes.py | 91 + .../site-packages/requests/structures.py | 105 + .../python3.4/site-packages/requests/utils.py | 904 ++ .../DESCRIPTION.rst | 43 + .../update_checker-0.16.dist-info/INSTALLER | 1 + .../update_checker-0.16.dist-info/METADATA | 63 + .../update_checker-0.16.dist-info/RECORD | 11 + .../update_checker-0.16.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 2 + .../python3.4/site-packages/update_checker.py | 250 + .../site-packages/update_checker_test.py | 81 + .../urllib3-1.22.dist-info/DESCRIPTION.rst | 995 +++ .../urllib3-1.22.dist-info/INSTALLER | 1 + .../urllib3-1.22.dist-info/METADATA | 1031 +++ .../urllib3-1.22.dist-info/RECORD | 79 + .../urllib3-1.22.dist-info/WHEEL | 6 + .../urllib3-1.22.dist-info/metadata.json | 1 + .../urllib3-1.22.dist-info/top_level.txt | 1 + .../site-packages/urllib3/__init__.py | 97 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 2759 bytes .../__pycache__/_collections.cpython-34.pyc | Bin 0 -> 11192 bytes .../__pycache__/connection.cpython-34.pyc | Bin 0 -> 9592 bytes .../__pycache__/connectionpool.cpython-34.pyc | Bin 0 -> 25124 bytes .../__pycache__/exceptions.cpython-34.pyc | Bin 0 -> 10866 bytes .../urllib3/__pycache__/fields.cpython-34.pyc | Bin 0 -> 6115 bytes .../__pycache__/filepost.cpython-34.pyc | Bin 0 -> 2790 bytes .../__pycache__/poolmanager.cpython-34.pyc | Bin 0 -> 13510 bytes .../__pycache__/request.cpython-34.pyc | Bin 0 -> 5685 bytes .../__pycache__/response.cpython-34.pyc | Bin 0 -> 17457 bytes .../site-packages/urllib3/_collections.py | 319 + .../site-packages/urllib3/connection.py | 373 + .../site-packages/urllib3/connectionpool.py | 905 ++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 142 bytes .../__pycache__/appengine.cpython-34.pyc | Bin 0 -> 9319 bytes .../__pycache__/ntlmpool.cpython-34.pyc | Bin 0 -> 3480 bytes .../__pycache__/pyopenssl.cpython-34.pyc | Bin 0 -> 15103 bytes .../securetransport.cpython-34.pyc | Bin 0 -> 19492 bytes .../contrib/__pycache__/socks.cpython-34.pyc | Bin 0 -> 5082 bytes .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 159 bytes .../__pycache__/bindings.cpython-34.pyc | Bin 0 -> 11470 bytes .../__pycache__/low_level.cpython-34.pyc | Bin 0 -> 8012 bytes .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 343 + .../urllib3/contrib/appengine.py | 296 + .../site-packages/urllib3/contrib/ntlmpool.py | 112 + .../urllib3/contrib/pyopenssl.py | 455 + .../urllib3/contrib/securetransport.py | 810 ++ .../site-packages/urllib3/contrib/socks.py | 188 + .../site-packages/urllib3/exceptions.py | 246 + .../python3.4/site-packages/urllib3/fields.py | 178 + .../site-packages/urllib3/filepost.py | 94 + .../urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 293 bytes .../__pycache__/ordered_dict.cpython-34.pyc | Bin 0 -> 8878 bytes .../packages/__pycache__/six.cpython-34.pyc | Bin 0 -> 26457 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 153 bytes .../__pycache__/makefile.cpython-34.pyc | Bin 0 -> 1403 bytes .../urllib3/packages/backports/makefile.py | 53 + .../urllib3/packages/ordered_dict.py | 259 + .../site-packages/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-34.pyc | Bin 0 -> 587 bytes .../_implementation.cpython-34.pyc | Bin 0 -> 3529 bytes .../ssl_match_hostname/_implementation.py | 157 + .../site-packages/urllib3/poolmanager.py | 440 + .../site-packages/urllib3/request.py | 148 + .../site-packages/urllib3/response.py | 626 ++ .../site-packages/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-34.pyc | Bin 0 -> 1317 bytes .../__pycache__/connection.cpython-34.pyc | Bin 0 -> 3300 bytes .../util/__pycache__/request.cpython-34.pyc | Bin 0 -> 3348 bytes .../util/__pycache__/response.cpython-34.pyc | Bin 0 -> 1951 bytes .../util/__pycache__/retry.cpython-34.pyc | Bin 0 -> 12994 bytes .../util/__pycache__/selectors.cpython-34.pyc | Bin 0 -> 17855 bytes .../util/__pycache__/ssl_.cpython-34.pyc | Bin 0 -> 9490 bytes .../util/__pycache__/timeout.cpython-34.pyc | Bin 0 -> 9012 bytes .../util/__pycache__/url.cpython-34.pyc | Bin 0 -> 5592 bytes .../util/__pycache__/wait.cpython-34.pyc | Bin 0 -> 1689 bytes .../site-packages/urllib3/util/connection.py | 130 + .../site-packages/urllib3/util/request.py | 118 + .../site-packages/urllib3/util/response.py | 81 + .../site-packages/urllib3/util/retry.py | 401 + .../site-packages/urllib3/util/selectors.py | 581 ++ .../site-packages/urllib3/util/ssl_.py | 341 + .../site-packages/urllib3/util/timeout.py | 242 + .../site-packages/urllib3/util/url.py | 230 + .../site-packages/urllib3/util/wait.py | 40 + 402 files changed, 57430 insertions(+) create mode 100755 env/bin/chardetect create mode 100644 env/lib/python3.4/site-packages/__pycache__/update_checker.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/__pycache__/update_checker_test.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/certifi/__init__.py create mode 100644 env/lib/python3.4/site-packages/certifi/__main__.py create mode 100644 env/lib/python3.4/site-packages/certifi/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/certifi/__pycache__/__main__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/certifi/__pycache__/core.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/certifi/cacert.pem create mode 100644 env/lib/python3.4/site-packages/certifi/core.py create mode 100644 env/lib/python3.4/site-packages/certifi/old_root.pem create mode 100644 env/lib/python3.4/site-packages/certifi/weak.pem create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/chardet/__init__.py create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/big5freq.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/big5prober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/chardistribution.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/charsetgroupprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/charsetprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/codingstatemachine.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/compat.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/cp949prober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/enums.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/escprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/escsm.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/eucjpprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/euckrfreq.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/euckrprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/euctwfreq.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/euctwprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/gb2312freq.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/gb2312prober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/hebrewprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/jisfreq.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/jpcntx.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langgreekmodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langhebrewmodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langhungarianmodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langthaimodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/langturkishmodel.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/latin1prober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/mbcharsetprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/mbcssm.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/sbcharsetprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/sjisprober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/universaldetector.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/utf8prober.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/__pycache__/version.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/big5freq.py create mode 100644 env/lib/python3.4/site-packages/chardet/big5prober.py create mode 100644 env/lib/python3.4/site-packages/chardet/chardistribution.py create mode 100644 env/lib/python3.4/site-packages/chardet/charsetgroupprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/charsetprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/cli/__init__.py create mode 100644 env/lib/python3.4/site-packages/chardet/cli/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/cli/__pycache__/chardetect.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/chardet/cli/chardetect.py create mode 100644 env/lib/python3.4/site-packages/chardet/codingstatemachine.py create mode 100644 env/lib/python3.4/site-packages/chardet/compat.py create mode 100644 env/lib/python3.4/site-packages/chardet/cp949prober.py create mode 100644 env/lib/python3.4/site-packages/chardet/enums.py create mode 100644 env/lib/python3.4/site-packages/chardet/escprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/escsm.py create mode 100644 env/lib/python3.4/site-packages/chardet/eucjpprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/euckrfreq.py create mode 100644 env/lib/python3.4/site-packages/chardet/euckrprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/euctwfreq.py create mode 100644 env/lib/python3.4/site-packages/chardet/euctwprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/gb2312freq.py create mode 100644 env/lib/python3.4/site-packages/chardet/gb2312prober.py create mode 100644 env/lib/python3.4/site-packages/chardet/hebrewprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/jisfreq.py create mode 100644 env/lib/python3.4/site-packages/chardet/jpcntx.py create mode 100644 env/lib/python3.4/site-packages/chardet/langbulgarianmodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/langcyrillicmodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/langgreekmodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/langhebrewmodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/langhungarianmodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/langthaimodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/langturkishmodel.py create mode 100644 env/lib/python3.4/site-packages/chardet/latin1prober.py create mode 100644 env/lib/python3.4/site-packages/chardet/mbcharsetprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/mbcsgroupprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/mbcssm.py create mode 100644 env/lib/python3.4/site-packages/chardet/sbcharsetprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/sbcsgroupprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/sjisprober.py create mode 100644 env/lib/python3.4/site-packages/chardet/universaldetector.py create mode 100644 env/lib/python3.4/site-packages/chardet/utf8prober.py create mode 100644 env/lib/python3.4/site-packages/chardet/version.py create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/idna-2.6.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/idna/__init__.py create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/codec.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/compat.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/core.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/idnadata.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/intranges.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/package_data.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/__pycache__/uts46data.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/idna/codec.py create mode 100644 env/lib/python3.4/site-packages/idna/compat.py create mode 100644 env/lib/python3.4/site-packages/idna/core.py create mode 100644 env/lib/python3.4/site-packages/idna/idnadata.py create mode 100644 env/lib/python3.4/site-packages/idna/intranges.py create mode 100644 env/lib/python3.4/site-packages/idna/package_data.py create mode 100644 env/lib/python3.4/site-packages/idna/uts46data.py create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/praw-5.0.1.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/praw/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/__pycache__/config.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/__pycache__/const.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/__pycache__/exceptions.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/__pycache__/objector.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/__pycache__/reddit.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/config.py create mode 100644 env/lib/python3.4/site-packages/praw/const.py create mode 100644 env/lib/python3.4/site-packages/praw/exceptions.py create mode 100644 env/lib/python3.4/site-packages/praw/models/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/auth.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/base.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/comment_forest.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/front.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/helpers.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/inbox.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/modaction.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/stylesheet.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/subreddits.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/user.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/__pycache__/util.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/auth.py create mode 100644 env/lib/python3.4/site-packages/praw/models/base.py create mode 100644 env/lib/python3.4/site-packages/praw/models/comment_forest.py create mode 100644 env/lib/python3.4/site-packages/praw/models/front.py create mode 100644 env/lib/python3.4/site-packages/praw/models/helpers.py create mode 100644 env/lib/python3.4/site-packages/praw/models/inbox.py create mode 100644 env/lib/python3.4/site-packages/praw/models/list/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/models/list/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/list/__pycache__/base.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/list/__pycache__/redditor.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/list/base.py create mode 100644 env/lib/python3.4/site-packages/praw/models/list/redditor.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/__pycache__/domain.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/__pycache__/generator.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/__pycache__/listing.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/domain.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/generator.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/listing.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/base.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/gilded.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/redditor.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/rising.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/submission.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/subreddit.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/base.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/gilded.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/redditor.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/rising.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/submission.py create mode 100644 env/lib/python3.4/site-packages/praw/models/listing/mixins/subreddit.py create mode 100644 env/lib/python3.4/site-packages/praw/models/modaction.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/base.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/comment.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/live.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/message.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/modmail.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/more.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/multi.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/redditor.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/submission.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/subreddit.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/wikipage.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/base.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/comment.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/live.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/message.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__init__.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/editable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/gildable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/inboxable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/inboxtoggleable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/messageable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/replyable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/reportable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/savable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/votable.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/editable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/gildable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/inboxable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/inboxtoggleable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/messageable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/replyable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/reportable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/savable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/mixins/votable.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/modmail.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/more.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/multi.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/redditor.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/submission.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/subreddit.py create mode 100644 env/lib/python3.4/site-packages/praw/models/reddit/wikipage.py create mode 100644 env/lib/python3.4/site-packages/praw/models/stylesheet.py create mode 100644 env/lib/python3.4/site-packages/praw/models/subreddits.py create mode 100644 env/lib/python3.4/site-packages/praw/models/user.py create mode 100644 env/lib/python3.4/site-packages/praw/models/util.py create mode 100644 env/lib/python3.4/site-packages/praw/objector.py create mode 100644 env/lib/python3.4/site-packages/praw/praw.ini create mode 100644 env/lib/python3.4/site-packages/praw/reddit.py create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/prawcore/__init__.py create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/auth.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/const.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/exceptions.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/rate_limit.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/requestor.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/sessions.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/__pycache__/util.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/prawcore/auth.py create mode 100644 env/lib/python3.4/site-packages/prawcore/const.py create mode 100644 env/lib/python3.4/site-packages/prawcore/exceptions.py create mode 100644 env/lib/python3.4/site-packages/prawcore/rate_limit.py create mode 100644 env/lib/python3.4/site-packages/prawcore/requestor.py create mode 100644 env/lib/python3.4/site-packages/prawcore/sessions.py create mode 100644 env/lib/python3.4/site-packages/prawcore/util.py create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/requests-2.18.4.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/requests/__init__.py create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/__version__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/_internal_utils.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/adapters.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/api.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/auth.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/certs.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/compat.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/cookies.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/exceptions.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/help.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/hooks.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/models.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/packages.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/sessions.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/status_codes.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/structures.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__pycache__/utils.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/requests/__version__.py create mode 100644 env/lib/python3.4/site-packages/requests/_internal_utils.py create mode 100644 env/lib/python3.4/site-packages/requests/adapters.py create mode 100644 env/lib/python3.4/site-packages/requests/api.py create mode 100644 env/lib/python3.4/site-packages/requests/auth.py create mode 100644 env/lib/python3.4/site-packages/requests/certs.py create mode 100644 env/lib/python3.4/site-packages/requests/compat.py create mode 100644 env/lib/python3.4/site-packages/requests/cookies.py create mode 100644 env/lib/python3.4/site-packages/requests/exceptions.py create mode 100644 env/lib/python3.4/site-packages/requests/help.py create mode 100644 env/lib/python3.4/site-packages/requests/hooks.py create mode 100644 env/lib/python3.4/site-packages/requests/models.py create mode 100644 env/lib/python3.4/site-packages/requests/packages.py create mode 100644 env/lib/python3.4/site-packages/requests/sessions.py create mode 100644 env/lib/python3.4/site-packages/requests/status_codes.py create mode 100644 env/lib/python3.4/site-packages/requests/structures.py create mode 100644 env/lib/python3.4/site-packages/requests/utils.py create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/update_checker-0.16.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/update_checker.py create mode 100644 env/lib/python3.4/site-packages/update_checker_test.py create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/DESCRIPTION.rst create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/INSTALLER create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/METADATA create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/RECORD create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/WHEEL create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/metadata.json create mode 100644 env/lib/python3.4/site-packages/urllib3-1.22.dist-info/top_level.txt create mode 100644 env/lib/python3.4/site-packages/urllib3/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/_collections.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/connection.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/connectionpool.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/exceptions.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/fields.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/filepost.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/poolmanager.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/request.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/__pycache__/response.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/_collections.py create mode 100644 env/lib/python3.4/site-packages/urllib3/connection.py create mode 100644 env/lib/python3.4/site-packages/urllib3/connectionpool.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/appengine.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/socks.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/appengine.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/securetransport.py create mode 100644 env/lib/python3.4/site-packages/urllib3/contrib/socks.py create mode 100644 env/lib/python3.4/site-packages/urllib3/exceptions.py create mode 100644 env/lib/python3.4/site-packages/urllib3/fields.py create mode 100644 env/lib/python3.4/site-packages/urllib3/filepost.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/__pycache__/ordered_dict.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/__pycache__/six.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/backports/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/backports/makefile.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/ordered_dict.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/six.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 env/lib/python3.4/site-packages/urllib3/poolmanager.py create mode 100644 env/lib/python3.4/site-packages/urllib3/request.py create mode 100644 env/lib/python3.4/site-packages/urllib3/response.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__init__.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/__init__.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/connection.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/request.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/response.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/retry.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/selectors.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/ssl_.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/timeout.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/url.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/__pycache__/wait.cpython-34.pyc create mode 100644 env/lib/python3.4/site-packages/urllib3/util/connection.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/request.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/response.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/retry.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/selectors.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/ssl_.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/timeout.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/url.py create mode 100644 env/lib/python3.4/site-packages/urllib3/util/wait.py diff --git a/env/bin/chardetect b/env/bin/chardetect new file mode 100755 index 0000000..14304c9 --- /dev/null +++ b/env/bin/chardetect @@ -0,0 +1,11 @@ +#!/home/ubuntu/workspace/env/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from chardet.cli.chardetect import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/env/lib/python3.4/site-packages/__pycache__/update_checker.cpython-34.pyc b/env/lib/python3.4/site-packages/__pycache__/update_checker.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19db7921e44acd8dc7a733f72f25d8a0864167d6 GIT binary patch literal 8575 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/__pycache__/update_checker_test.cpython-34.pyc b/env/lib/python3.4/site-packages/__pycache__/update_checker_test.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d54c53de19db5ca98c5e2460b7f42f033b43d41 GIT binary patch literal 3651 zcmchZOK;mo5P)Y%y+u1OJ8fQ#ng$5e!j{t}0UD%f0>=%47HZI_NW#m47T1nsie#2# zS_{cZJ@ha1&~wqhwAY?`=@00sGfT>Pgcg(*sBDggHvSh z)W<^o9$wL}C|vw!-~rf2Is==*;hKJBfM>wK0NVie)V~4+VZuQTv zGk8W1P4J2^D1lvqK^g2au!n8|+#>vhFN+`;^eZqj!LEX+fm?zD1LQCIc^yUo%*SyI zo;1sU;u4|VWUBHcmOX#}(YH-Qt$ZK4PAs-xi0*-q%1ZPt@6vsjCX7D@D);b;enuhC zM@CMeFKFC0Y4J8L3zY(`%r4U6a5bctz%7GY(K;$saBEtxfLjOG(mFm|0e4mF=*9_f zPih?poC5c>)-7<)fV-x39K4QBomHo19O#HBwhN(jeoz%DUM6@Obs4UhKIB3HuWh`d zn-wXLW$Q3m8_ZO{r5VpczxUrk`Ja^;AAlMD}-J7j++cvV{*=@Ru zLh=|fY=(#G0x3sN^5VXbl--6cS)WdmLb- zI|bNmcZTL?o3}E6vW#YAg+!G^4Mo$Cn2I1N|1_FZtm3WO$Xll$@GP|BfbWXf;je^@ zdV#-&Q!>A+@u-QQ%jR+FCz2q=KmLDlJaCZR<{?klHGCYy-n)s9I0>KmDD2RN1UiC)1@=>E-E=S z3fn3+0c-`jwPAI7lin8KHMTr}gX*LqP`xT%r!boivI#8Bu4zsZOqHaF5-*;wTp#3- zi;`|vMA2U2HHpq7$JW_!YdJm>6Eh5`f@%gYQU-n92xF|o8VUBo;dzLUx}ffn*x^S8 zV^0wQQllBVSE7!?pAoPk#3h2%FO!`S&MLq`VM43e&T5n{P8~_zxmi(WbQq~p6uUtZ zOX}2;vR@Z_%}<%0@Kt4B#IGDL5gATZ52bj;vuW?q3~H29-QbdDnx$%%xDy^N92`;C zpt5B#lbtuJtj30|W56C~XND`SKy$^T*O(H68Lo{SuE+_`Oe4d1H@f=7hnUlLQJ$r% zOl<9ok1N>*NUGrSJc%6o@&diMh+-Vam*_zr@XI;C6MusIbDS8RL@`Fb&gv=j>q|kO zwl#zOD4aRk&Vq9e`@afj+!qSxk`Cu_Tb_&J;V09PA>^VKU2B$eVV}lj%Tpwl;(Rri z^IThgfaYdkr}2&FoLfu6o-^2PuBr;>zB3SqaiuN|5Sr#j?l3^9`uawD}Ro7!^T?41*bKbNx zV7rp|y_hiRkXH3a13E43NEt|F^a6WzcGL86U6&oZ(!p8V4xZHM*X0!yszAo`R;Vg> aQVMq|b0YHE(#2$rt*~`=);zakv3~$E14vf@ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..30e2362 --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,49 @@ +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +Unfortunately, old versions of OpenSSL (less than 1.0.2) sometimes fail to +validate certificate chains that use the strong roots. For this reason, if you +fail to validate a certificate using the ``certifi.where()`` mechanism, you can +intentionally re-add the 1024-bit roots back into your bundle by calling +``certifi.old_where()`` instead. This is not recommended in production: if at +all possible you should upgrade to a newer OpenSSL. However, if you have no +other option, this may work for you. + +.. _`Certifi`: http://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/INSTALLER b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/METADATA b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/METADATA new file mode 100644 index 0000000..6091144 --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/METADATA @@ -0,0 +1,71 @@ +Metadata-Version: 2.0 +Name: certifi +Version: 2017.7.27.1 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: http://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +Unfortunately, old versions of OpenSSL (less than 1.0.2) sometimes fail to +validate certificate chains that use the strong roots. For this reason, if you +fail to validate a certificate using the ``certifi.where()`` mechanism, you can +intentionally re-add the 1024-bit roots back into your bundle by calling +``certifi.old_where()`` instead. This is not recommended in production: if at +all possible you should upgrade to a newer OpenSSL. However, if you have no +other option, this may work for you. + +.. _`Certifi`: http://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/RECORD b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/RECORD new file mode 100644 index 0000000..1c20cec --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/RECORD @@ -0,0 +1,16 @@ +certifi/__init__.py,sha256=My7zz7T7ihes4NXz6H8W7R5_mbQKxH4QOC-bpe2NzWk,65 +certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 +certifi/cacert.pem,sha256=H1zXFqV-gILXM16kCI9onoUlQtpPQFRUx22fQXVygv8,296399 +certifi/core.py,sha256=QUebyXnT-N_b9vdOg1zw28xqdT0Y7mLkiBrLEQY8fXM,714 +certifi/old_root.pem,sha256=HT0KIfaM83q0XHFqGEesiGyfmlSWuD2RI0-AVIS2srY,25626 +certifi/weak.pem,sha256=Oo30AxpvkrmeN29S3UgbVzTIfaxqAbdXUZ1y2V6nEe0,322025 +certifi-2017.7.27.1.dist-info/DESCRIPTION.rst,sha256=wVWYoH3eovdWFPZnYU2NT4itGRx3eN5C_s1IuNm4qF4,1731 +certifi-2017.7.27.1.dist-info/METADATA,sha256=oq-Gce39ekQpzgfJJOSDXa3_LUhguodCWLYAGFeBkHI,2548 +certifi-2017.7.27.1.dist-info/RECORD,, +certifi-2017.7.27.1.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +certifi-2017.7.27.1.dist-info/metadata.json,sha256=u7l0Z0L2OAt8iknI-JBmglISdRD1WSh_En-v_uE6oTU,915 +certifi-2017.7.27.1.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi-2017.7.27.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi/__pycache__/__main__.cpython-34.pyc,, +certifi/__pycache__/core.cpython-34.pyc,, +certifi/__pycache__/__init__.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/WHEEL b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/metadata.json b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/metadata.json new file mode 100644 index 0000000..497b57f --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MPL-2.0", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2017.7.27.1"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/top_level.txt b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi-2017.7.27.1.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/env/lib/python3.4/site-packages/certifi/__init__.py b/env/lib/python3.4/site-packages/certifi/__init__.py new file mode 100644 index 0000000..a76cd47 --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where, old_where + +__version__ = "2017.07.27.1" diff --git a/env/lib/python3.4/site-packages/certifi/__main__.py b/env/lib/python3.4/site-packages/certifi/__main__.py new file mode 100644 index 0000000..5f1da0d --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/env/lib/python3.4/site-packages/certifi/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/certifi/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15b71741476d14576ca6382605587fea89c9ec47 GIT binary patch literal 229 zcmX|5I}5@v5Wb{Ue6G%}9c+CdT|{(s5W&eV2b!pX)`YY^|B(2XvO2l=1Ds48JnnnI zecau<(X7oD_tg{to)-V2)=ez(wk2kpKnjo%NC;#U5(1^NY<1-eP4nK>!C75Vu|1?efK`cRE4ZqNp!8miK zGT9tf8hxe&t~kw?(viCjaqD!+D@&(kMq4|wYFS9Zjn>YNo6zadufrrM(v3`#I!cl@ zQOM&Yc~_oTF=X+IGkKo;`*(P#IhLd z7q~;IBNF?~_dd6j*A70<$SUXC!H{C|p6&rSIPutor zQ@5%Ep$zFKhYOXHLw~JRF=RDcT>CH~URHO{F}LzQUG5_Q8+hg}zW=T75La4#Sas(C zN?|B-?ZdhYu6L!koe3Jf%_eM(>2~yA)!&BHDAbO_uny1LHbRTUnhcsgiZKzvErOWf zHo}k@%J$z*`#Kj%zz2Y7%4Xzp+f1Asm tZdFjSnrK5+th=RAg}ZTg(>G13!^drxJt5(iB=%U$;?6-3_u?>Se*nZ-3(Eii literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/certifi/cacert.pem b/env/lib/python3.4/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..44313cb --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi/cacert.pem @@ -0,0 +1,4834 @@ + +# 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=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. +# Subject: CN=Certum CA O=Unizeto Sp. z o.o. +# Label: "Certum Root CA" +# Serial: 65568 +# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 +# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 +# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----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=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Chambers of Commerce Root" +# Serial: 0 +# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 +# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 +# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Global Chambersign Root" +# Serial: 0 +# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 +# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 +# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----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: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----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=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Label: "DST ACES CA X6" +# Serial: 17771143917277623872238992636097467865 +# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 +# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d +# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----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: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Label: "Security Communication EV RootCA1" +# Serial: 0 +# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 +# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d +# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----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: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Subject: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" +# Serial: 17 +# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 +# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 +# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----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=ACEDICOM Root O=EDICOM OU=PKI +# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI +# Label: "ACEDICOM Root" +# Serial: 7029493972724711941 +# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 +# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 +# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----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=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Autorit\xe9 Racine" +# Serial: 1 +# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a +# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 +# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----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=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----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=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Label: "TURKTRUST Certificate Services Provider Root 2007" +# Serial: 1 +# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 +# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 +# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----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=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica +# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT +# Label: "PSCProcert" +# Serial: 11 +# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec +# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 +# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R1 O=Disig a.s. +# Subject: CN=CA Disig Root R1 O=Disig a.s. +# Label: "CA Disig Root R1" +# Serial: 14052245610670616104 +# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a +# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 +# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----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=Certification Authority of WoSign O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited +# Label: "WoSign" +# Serial: 125491772294754854453622855443212256657 +# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d +# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb +# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV +BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw +MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX +b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN +rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U +fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc +f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 +ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M +x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR +aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch +zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar +uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K +mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA +Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv +HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H +EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ +MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e +JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN +g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp +dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab +R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ +PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce +xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ +J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl +OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT +ee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +# Issuer: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Subject: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Label: "WoSign China" +# Serial: 106921963437422998931660691310149453965 +# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 +# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 +# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV +BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw +MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl +ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r +D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 +9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf +v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk +UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L +NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb ++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V +qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K +yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G +AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK +J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 +WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj +/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 +jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 +ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX +X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n +FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D +u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l +O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le +ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 +2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== +-----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=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----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=Certification Authority of WoSign G2 O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited +# Label: "Certification Authority of WoSign G2" +# Serial: 142423943073812161787490648904721057092 +# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 +# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 +# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV +BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx +MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX +JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO +gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg +5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n +fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 +2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ +KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 +fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G +3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy +SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng +LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 +XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited +# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited +# Label: "CA WoSign ECC Root" +# Serial: 138625735294506723296996289575837012112 +# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 +# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b +# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw +CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT +EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 +NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb +MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID +YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 +KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES +1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB +1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 +aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K +-----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=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----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----- diff --git a/env/lib/python3.4/site-packages/certifi/core.py b/env/lib/python3.4/site-packages/certifi/core.py new file mode 100644 index 0000000..f41d3fd --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi/core.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os +import warnings + + +class DeprecatedBundleWarning(DeprecationWarning): + """ + The weak security bundle is being deprecated. Please bother your service + provider to get them to stop using cross-signed roots. + """ + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +def old_where(): + warnings.warn( + "The weak security bundle is being deprecated.", + DeprecatedBundleWarning + ) + f = os.path.dirname(__file__) + return os.path.join(f, 'weak.pem') + +if __name__ == '__main__': + print(where()) diff --git a/env/lib/python3.4/site-packages/certifi/old_root.pem b/env/lib/python3.4/site-packages/certifi/old_root.pem new file mode 100644 index 0000000..af30ea7 --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi/old_root.pem @@ -0,0 +1,414 @@ +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure Certificate Authority" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- diff --git a/env/lib/python3.4/site-packages/certifi/weak.pem b/env/lib/python3.4/site-packages/certifi/weak.pem new file mode 100644 index 0000000..380c523 --- /dev/null +++ b/env/lib/python3.4/site-packages/certifi/weak.pem @@ -0,0 +1,5248 @@ + +# 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=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. +# Subject: CN=Certum CA O=Unizeto Sp. z o.o. +# Label: "Certum Root CA" +# Serial: 65568 +# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 +# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 +# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----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=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Chambers of Commerce Root" +# Serial: 0 +# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 +# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 +# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Global Chambersign Root" +# Serial: 0 +# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 +# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 +# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----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: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----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=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Label: "DST ACES CA X6" +# Serial: 17771143917277623872238992636097467865 +# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 +# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d +# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----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: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Label: "Security Communication EV RootCA1" +# Serial: 0 +# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 +# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d +# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----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: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Subject: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" +# Serial: 17 +# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 +# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 +# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----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=ACEDICOM Root O=EDICOM OU=PKI +# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI +# Label: "ACEDICOM Root" +# Serial: 7029493972724711941 +# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 +# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 +# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----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=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Autorit\xe9 Racine" +# Serial: 1 +# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a +# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 +# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----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=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----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=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Label: "TURKTRUST Certificate Services Provider Root 2007" +# Serial: 1 +# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 +# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 +# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----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=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica +# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT +# Label: "PSCProcert" +# Serial: 11 +# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec +# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 +# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R1 O=Disig a.s. +# Subject: CN=CA Disig Root R1 O=Disig a.s. +# Label: "CA Disig Root R1" +# Serial: 14052245610670616104 +# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a +# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 +# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----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=Certification Authority of WoSign O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited +# Label: "WoSign" +# Serial: 125491772294754854453622855443212256657 +# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d +# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb +# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV +BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw +MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX +b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN +rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U +fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc +f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 +ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M +x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR +aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch +zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar +uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K +mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA +Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv +HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H +EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ +MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e +JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN +g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp +dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab +R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ +PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce +xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ +J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl +OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT +ee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +# Issuer: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Subject: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Label: "WoSign China" +# Serial: 106921963437422998931660691310149453965 +# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 +# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 +# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV +BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw +MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl +ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r +D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 +9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf +v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk +UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L +NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb ++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V +qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K +yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G +AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK +J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 +WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj +/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 +jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 +ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX +X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n +FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D +u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l +O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le +ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 +2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== +-----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=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----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=Certification Authority of WoSign G2 O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited +# Label: "Certification Authority of WoSign G2" +# Serial: 142423943073812161787490648904721057092 +# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 +# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 +# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV +BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx +MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX +JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO +gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg +5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n +fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 +2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ +KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 +fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G +3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy +SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng +LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 +XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited +# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited +# Label: "CA WoSign ECC Root" +# Serial: 138625735294506723296996289575837012112 +# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 +# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b +# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw +CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT +EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 +NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb +MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID +YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 +KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES +1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB +1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 +aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K +-----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=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----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=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure Certificate Authority" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..c0f044d --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst @@ -0,0 +1,70 @@ +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/INSTALLER b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/METADATA b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/METADATA new file mode 100644 index 0000000..1427867 --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/METADATA @@ -0,0 +1,96 @@ +Metadata-Version: 2.0 +Name: chardet +Version: 3.0.4 +Summary: Universal encoding detector for Python 2 and 3 +Home-page: https://github.com/chardet/chardet +Author: Daniel Blanchard +Author-email: dan.blanchard@gmail.com +License: LGPL +Keywords: encoding,i18n,xml +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Linguistic + +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/RECORD b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/RECORD new file mode 100644 index 0000000..b36b905 --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/RECORD @@ -0,0 +1,91 @@ +chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +chardet/cli/chardetect.py,sha256=YBO8L4mXo0WR6_-Fjh_8QxPBoEBNqB9oNxNrdc54AQs,2738 +chardet-3.0.4.dist-info/DESCRIPTION.rst,sha256=PQ4sBsMyKFZkjC6QpmbpLn0UtCNyeb-ZqvCGEgyZMGk,2174 +chardet-3.0.4.dist-info/METADATA,sha256=RV_2I4B1Z586DL8oVO5Kp7X5bUdQ5EuKAvNoAEF8wSw,3239 +chardet-3.0.4.dist-info/RECORD,, +chardet-3.0.4.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +chardet-3.0.4.dist-info/entry_points.txt,sha256=fAMmhu5eJ-zAJ-smfqQwRClQ3-nozOCmvJ6-E8lgGJo,60 +chardet-3.0.4.dist-info/metadata.json,sha256=0htbRM18ujyGZDdfowgAqj6Hq2eQtwzwyhaEveKntgo,1375 +chardet-3.0.4.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 +../../../bin/chardetect,sha256=_zMhiDRh6li3WFpkcREmRo8tp86U4coKcc3cY6PivXE,247 +chardet-3.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +chardet/__pycache__/version.cpython-34.pyc,, +chardet/__pycache__/enums.cpython-34.pyc,, +chardet/__pycache__/mbcharsetprober.cpython-34.pyc,, +chardet/__pycache__/charsetprober.cpython-34.pyc,, +chardet/__pycache__/compat.cpython-34.pyc,, +chardet/__pycache__/gb2312freq.cpython-34.pyc,, +chardet/__pycache__/jisfreq.cpython-34.pyc,, +chardet/__pycache__/langthaimodel.cpython-34.pyc,, +chardet/__pycache__/jpcntx.cpython-34.pyc,, +chardet/__pycache__/mbcssm.cpython-34.pyc,, +chardet/__pycache__/langhungarianmodel.cpython-34.pyc,, +chardet/__pycache__/mbcsgroupprober.cpython-34.pyc,, +chardet/__pycache__/codingstatemachine.cpython-34.pyc,, +chardet/__pycache__/gb2312prober.cpython-34.pyc,, +chardet/__pycache__/langbulgarianmodel.cpython-34.pyc,, +chardet/__pycache__/langcyrillicmodel.cpython-34.pyc,, +chardet/__pycache__/latin1prober.cpython-34.pyc,, +chardet/__pycache__/charsetgroupprober.cpython-34.pyc,, +chardet/__pycache__/euctwfreq.cpython-34.pyc,, +chardet/__pycache__/escsm.cpython-34.pyc,, +chardet/__pycache__/big5freq.cpython-34.pyc,, +chardet/__pycache__/sbcsgroupprober.cpython-34.pyc,, +chardet/__pycache__/cp949prober.cpython-34.pyc,, +chardet/__pycache__/eucjpprober.cpython-34.pyc,, +chardet/__pycache__/langhebrewmodel.cpython-34.pyc,, +chardet/__pycache__/chardistribution.cpython-34.pyc,, +chardet/__pycache__/sbcharsetprober.cpython-34.pyc,, +chardet/__pycache__/universaldetector.cpython-34.pyc,, +chardet/__pycache__/hebrewprober.cpython-34.pyc,, +chardet/__pycache__/utf8prober.cpython-34.pyc,, +chardet/__pycache__/langturkishmodel.cpython-34.pyc,, +chardet/__pycache__/euckrprober.cpython-34.pyc,, +chardet/__pycache__/langgreekmodel.cpython-34.pyc,, +chardet/__pycache__/sjisprober.cpython-34.pyc,, +chardet/__pycache__/big5prober.cpython-34.pyc,, +chardet/__pycache__/__init__.cpython-34.pyc,, +chardet/cli/__pycache__/chardetect.cpython-34.pyc,, +chardet/__pycache__/euctwprober.cpython-34.pyc,, +chardet/cli/__pycache__/__init__.cpython-34.pyc,, +chardet/__pycache__/escprober.cpython-34.pyc,, +chardet/__pycache__/euckrfreq.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/WHEEL b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..a884269 --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +chardetect = chardet.cli.chardetect:main + diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/metadata.json b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/metadata.json new file mode 100644 index 0000000..8cdf025 --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Linguistic"], "extensions": {"python.commands": {"wrap_console": {"chardetect": "chardet.cli.chardetect:main"}}, "python.details": {"contacts": [{"email": "dan.blanchard@gmail.com", "name": "Daniel Blanchard", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/chardet/chardet"}}, "python.exports": {"console_scripts": {"chardetect": "chardet.cli.chardetect:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["encoding", "i18n", "xml"], "license": "LGPL", "metadata_version": "2.0", "name": "chardet", "summary": "Universal encoding detector for Python 2 and 3", "test_requires": [{"requires": ["hypothesis", "pytest"]}], "version": "3.0.4"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/top_level.txt b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/top_level.txt new file mode 100644 index 0000000..79236f2 --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet-3.0.4.dist-info/top_level.txt @@ -0,0 +1 @@ +chardet diff --git a/env/lib/python3.4/site-packages/chardet/__init__.py b/env/lib/python3.4/site-packages/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ec20e7c1e4051230e8ad4247eb64ea52a95be0b GIT binary patch literal 841 zcmYjQO>fgc5S?}Wkp!wXAPUF5MxqI#jBh58%X%os_P;W6#Wc&u_i!KexBqua1A5-gg0h!Hr?z^D~^~8w@dC3{rrM zfzKebz_)-=)q=DEnGL>O=M6|5$XxJU$UN{ptlAJe@D0FkLhQn*>-}aZ*|kjL`1CP_ z{Vp?|_j&S3s4_}l2rVXBDg@jL0;(l44+7(T7`_|5e0ww@HVtxU<9v>@{D?sVe8I?I zWkLCRlUh}J2)aRQxUfMx1Y04jy1p{FL@-+ymjF46xUd3PVi76cy2U7IQe)J$uD-W9 zj@m8P=YorTBI6{Va(PzeQ(REa#|tfZsTDSQ?TRueA{Av-Bf!RhWcUdR)KGCbLnXnr z6KGI=9(NTYd}$#|BEr*|3${ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/big5freq.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/big5freq.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73feabbcc5d686f6cd9310272a6fd1ce7f9d5333 GIT binary patch literal 54675 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

+7SKQrDzC!l^jlaIe}h8 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 O{qO6)PvHOS6ZjuuH9d;} literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/big5prober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/big5prober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0ed65473191b095b195d6efdc7c3d8000462e4c GIT binary patch literal 1103 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 TY2ilZ@kcAXK5sOy=G}h)8Di9> literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/charsetprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/charsetprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..552512c8f4f0c6b2db768772ce45a3fd00e5be37 GIT binary patch literal 3596 zcmai1Pj4H?6`$QDSENi?vTVhbn- zY^*GQ{K;Q`_swO-{>{!k74+Z7t3N;^@N-zgSi9^ytnD!2GU2hrWdo13J?4BUDoj+_ z=U7!`vcjH&T&1n8rvCzb*xm~VZPUpcpQx-8r@fX5jf`k&`grKPk5~U0jf6;uK?_L` z=}kmJ&gU3fX~HLgkRyF2mYAr~@HuADuQRc1XKQx$0uzntET&eNxM*jWnZ(p86Km7i zhNWC$VtqMVvPr65*FImqw->oEfgbwOyNg$Ep@BuG zj0I>N+i{q2*^$Q#d{$84HU{R-UenM0K$DyD3rU#vf^M7`sq&>H>-FHlyxx=MKKh{5 zf*=hCG6-^?W~FMnc}2^lt9%Ik8&eH@{`-sTW-z=yjECEuQJjeFr&-n+_QcPwM=(Q3 zGxycf46Ru^!!hxX)7S*TkI4|?$(%a=PF|byz|M48M5j#;eM<+dVPF_LDh$QJP7L)F zoqfB0=kEU9-TixeAF3+GO-Eh8$Esd5D;VZgC8658=xXa_=j8Id4t9P{0aC)AKn0zN zP|NWZA{yim2(doBUP^LLuFXq2zijTvUoFtJHsxMt)P32oN>@tp(^8sqvOX`3rWc#F zgiVO5qlr76?{uGysGpZ&+?U;F=NHSd?juaQdp$6)&v*IpA_6psva}lunMU#kHcZd# z^?BRo7tTp1q4w}L(J7(_2>}3v#Yi(}*7R1>+tW2H*m}ga|8UTJ=PNn_4ivab=AIsP zaMYJTdfDk41*n34-0KIOv5`TRCgWdWr6$45-EdCcoY!^Xj#6ccTzaj_e?kW;KWFR= zKzG=YO=hIH%g$W(RIpQ*-8uM_oq3cHkOxkSMCY?Vx@_~g!yF&=MX)lR&pHC^8KMJ=`Zf~~_%EfVt{FH_!&eAZs!RLmYz!FAS zfQ|onw*Aj9X8Q)AdMp)0d?wY{^pV@ROtj>WeqTtKEHCBk_a&GQM}`ANU8#5!ro2O@ zWTRf+aFcOFoeATVhg?e)7p6VQl+Z9ci3hQfqGZ<@^Fjl?!}t5K=G{>mkr5m_9&2J( zoH=Yyhz2gEADWpEQ}Rk=s148H*H>7-!*7ELsTcP~*+@gb;}N05dViuv$u3lqD>+QU zND3ScnFH@6lItNzJk(Jf&pf-cTy8Avuongohr@(i06WM49jSO|G=I{MqdpfIPcy?u zaQEHG3C~Vyr{t&KLMTrU{Ow22w!b}iXEvOi6H(vWQOlbJc`iUtmbu! zuTZIQtX=~pUqTEDXqEf&sgbG3mtt)rtXZ{q&1;40rO2z+^Ld3n?Ro+~2c+rCh`u(# z=bZloyY~Y~)K}23)p`}zm%HLz_1BzDTx6HrldXj?U%;lsI^BaM*1yJ}#5yt*@D0=g z*iZjX(8o1TxOeDx=io1dRg8gB!m!7#65h|M>=f5O5bZMckm?>VNjEI9YKaL$(L+RR z#mXg%{VnPP@-``80G=LuTw&@9N-quiAh#6qY+@*LizTCOqC`V13ss==@fQ6aV!Qs& z+-?+B)7?d?X*HL_f8nspNO>U5NTnK~8fC*VrIf=%!1VC2z>JcFO9VU8EGUTN^YK3k z!IIfD+3+wGoN~0yPqT=h0FhuqQH(_OM9P%kymfBLEQoI>Is=>v1*Xyd|3$=uffO<7 zuw+~+){)%|LbE6uDOJMv)+-P=$xj6k#bO{%Ggc=v{V5bnaWhC-PZU@|O1RzHy?5`N zt?wcu8jciJsAb?|>uA86@<++<@bEs;bo!H`a6LSn`RLb*kZUn)@6cPey}5r5(0jn< zH7r6YhO!jbYa&zi1KRaEnx5>J9w{8rG;gzT>-_?iIHI;NtZ*-OJupcg?xv`QA16q`45ti?}vdRUItz za?xrQ&EHaW4t=J)-}J8u~xrT-Kt}Tv2JOsN#4Nugy^n*LPQ|4R5_N yd8_Mh*%fdw6?`^-wyQE74YaMFb3f}G$;jA6i}>fYn}wCP=&)=R-*6i4n)g4QpKitg literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/codingstatemachine.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/codingstatemachine.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3985e5051313b09ca8cd6a08d56ea9b017d14657 GIT binary patch literal 2928 zcma)8&5j#I5bl}r-+G-*vPno*fYe+N7Kw8}5Gmp(Aqhx`ENC}EVlJchOxvDiJmYk? zH`ypT1zv$yK)ljiIpx9waN?^PkGLp<%`&lRyVd7%WV}0s+_7!lp=CB59N55Q~mT zws_qZNmnG>yzU6SC6b;||oK_x7 zSIA>+($R@ja(DuP)lcU-kF^{X275DQTpG_aWh8bPcp$$i41;NaR9bGLWug(hgO<^; zPLH*{DN`q(rCBCNS|`#?lv|uGq=r@4j2#X#*1B8jSf!a7X8NWqa$RXbTS=Er^*}y> zxpjqjqVln}uxL-g4V8uABByORGx|6!=60c}a&l>b4M%IQ8Qo~9Fg{sf0Xm2Mb*mf_ z9V|u=J8iUeM5)5jxhrnfl-%ty(BYH&2Tv-9yNDqLrez;0R48I$h%+}q;KYBX$0}RT z3`0>am(NG(0Hi2+tg*~Svk}ibR;@==_u97pz`eTquQ;7 zUwM+os1tGzyc19Bk*^S7cdc;Fy2k*B)6R4ZlQHo_c;uGVj%ozbMB8+nBUxN_oEqiM zLxEvBofonIhC!ItrYMtTamr_t6h#>$196c%g`_zmnp`{!SC=|v97niP;asK_Dua`l zPNzCasb63yrCLR5?K2pLn`hxDs5;>bS|1%8{BTe+TP6Gyv2WuPIm%YKKWj>^w<%M+ zYR^?Pn?gB{m7~Va#8#2Ef_zx_Hj|{E$Jrc3M$DdvtF`3F6jREAMX?xIKp*lJ5{Hh- z2do_bd1J@HbAh;L|G;OeY)aC<_Eoj|yTIBE*lq8pHQ+B6?^#A_iu z96Id#`-U&+t+EwO(HL2|6UB35A}WXoS*^cQIYybz%k4_e^Z@P4vBXeZOp2osCN0PX83<5<>Xri`#BGyFE*1w}$gHOKv?cis5XW ze0rPAp;%U*e6_OC#nn8Rosg+CPhAw$)EY5`O%Hu8c_pVD z7&=AdVc*;D2PS}|Z1N3dI#~BTgEwat2FGG9)7J}_zQVAaHt)ra4K6Sn%e>;vBM6-H z`WqIMAx`QZGQ9W7=M7IdUmOME7hjkM^j@TFHtMs1*n8jU2saxJtsEx(cezuveWJ;rc90xXtNV zoTvEvEz`sY^Th<3EA+KRQ=8-s=CJhQu*>zvaAB7VkijZuDJx8G+0FHH7qRGTY}#E+ zBDn1BBI(!t%U;{N>Rt3+yuX348TTp=H)grKf@R@&@B`msI>ji#|C#<=4mm<<|zi z|Lt5S!%vI38o%8^vj;zZTKeK|Y|a{KzrSsWhO!&ctu)W*Ht9vt)49qPcS}2pk|K^G zLnXj%XRgue9hz>CZf9nSnKtf(O`ocyWjPt@y$>)fwQ}!T%j(pKnLr@$5&sw{yLCUG_fkj(^J|eMwi}6Br!_El>a)cyho3JOgSD=Am%Gd=wtI z4<2Ccq6n=hBJ@Y!Ei#ae46*h68t6-8V{fx?OEYk@wKMOoGFQ1Iltajp$0~Y& zIje`JWwVVCwR~Xb`RcJ!jGMnII$4=xIZpAs6KrVt#UTag148QUJ0b1VN!*|M1(-HX AfdBvi literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/cp949prober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/cp949prober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ccc4efad52108e2e51c50a5d15c271113ae131a GIT binary patch literal 1110 zcmah|OK;RL5FY2XX}j%K%R?Y>f>VUry#P|Bir2OvQMOb>9LUAWZrp9Eys#aKt+*Az zPeJ^pTsd*!2XJD>>C*H9jy?W7e$31_lVAPy)mKN~-aqL9{D4k#5I@DCA`}UB1{pxk zAY#C1Z9!&1ZbM|ZYa22Lau*`ET|1C@koO?!0ehLaka+MJuX!L`ILB)~Bs~ZN|0hEO z0c&pWzZ)OC-Ak30>9p2qSv)J^Y@t$xo5OLLq{Tecu@;kfc9IqXwKpeqrqkyOEygFY z423?D3%;Pn2H`+r zL*kI<=NP(cG|N~>>N3;#vq1RE% zUCC0wz~+ zGPo7%xNQ354u-*tI2ZR(qbOvs&Te%rb`SmEs&`OI5f}e5>t}H>uj9EGbxd9fa(Mvj z0&_&(ao((Qo|j3T5$<#Tp^me5$I#aJNF!!eFXRS3D+eSf_N6Clgeh#3`@0Af6+xd3 z{h?!YSRT=)$xtWdZ50gLs!;U*@ z0bQl*{zlP1=(lLwl{Wo=zV980vK_mDTa?mVl9$7IoO|xM{H1Z%czX21$+sFIKa)#G z1+I6Y$?w60gfK$(!z~h)$aipGB7BRyDHB!#Z<&M@<*gLnGI*;b)Rb2%ycO`)NT@5X zUU;kEt&`ADUZe18;Jrh_hVnKFFT8!1IL-Iw!f3}aP0wgH;nYm>se~&(qrTuYmpp_! zk>=w`nrEs@F!4pmGdlBw7yg*H3}eU7vq>s;XwOe*C-xK7g+2`Zq;*={?vAH^6t{wO z+B5>dVRLN3)h;yo5DW)&02#0)0uV94qeNJR05A+ts1T+RfWv8O3&TogdFEt(#^;Vf z;czFBq#SlY1)m8nd6MB?I1Qt-GcMqkO6)GFPxB;t#f9`^3VY!}mI@lc>Q6b1l9n26 z3Ckf%T-~w+#%|UYy5}YSlzZO7@Vsdn<}qG3Jnv=h$Ll9G&kNJQ^O$jTJT$$w)3q#C zH=S;A`NZ0P;&o13^G71;Ft9See)2e*&K}RA*`w1uio-|Wr0MBw9De?I4fp1Z`;)EN zxxkg_&?K5hS=+*&@?L=#*S?G0hG1?9F9ULDgy{r0#_EIv8LOnjfKl+*NQc+p4k)EV zAnJ?v`hGIbfeL$3oN+OKe%oLGHPn0bOuZ=SYp#Oe&t~yC%~I;Ckw&BAB3Qk3tVW|% zj6@kWB{091${-ZW572xB#%?x570v<@l871_?7+6WPb}MXOwX|nkNVc0W%k(p!sia# zJ(9NRt5a+ziiT<_4l5f%&)g?5#@=>31dIP`-_l<*Z8_P+*0p+cvtLEhGdTVhgm z-1g92RL$XVFl3tLI{yR)@}qeT4D?}PO~)M*%3U;MIv`V+BpT`LyE%8m(~%0o{v)zfv87`nj8hP zB^oe{qF!@rQ4V5xiH4Y%i|sMbJm~3N4Dba`kAx@X`N!A6XEv$k#ETT>7)z!ixL*X4u|hhE^$iT7r0H)$%wu4nemn>X*x{NBg-FS}m7 zxAE;~$sE8RaO^RWzKKokV;AC&K?D#p@E9-}8xR=~7r-mz;{rq`#6|Fm5L@6`5SPF! z<#Q%PWr!=_RUoc{SB1C+UJYU!JR8`Zun3_AU!qbA1cRrjv<_hjx^DReL-Q`n>MJ|G z?22?l4!4CwMssBt4w8O1^;5Ct2RnmAxP`3oz)$*Pzb|eNqEyJtCi$sYW={n5BG=4n zcRk)+<7?}ytp{1N-Ce(a?fUhV&S~DgjnlmQn=@X3dz?K496jm)I{}0j!sQu+AYz5M zeFe}%CekK6L#8?9Xc(TMa1n$>0EA^iD2ScA}}A;KCWU=2-INn6*Q z%jR1uIDy*Xk5vbst(}2#PE0ssC6wbkOTjP{jtX`}ES4O9G?GI^*69tU6N*#>DI)2J z1f`Hr?`dsc>N z2%TZ#q(iN05Q-!n^bVYKM<`r9HFQ-bzP&A)glaU-qW$|p3RDCJQ7mY5Q41C`5+mj zoM)BXKU~Gq#u;g1=QUUEwmYqEi+9^=8xPvI+pX2iLJx~1l!T=$QCB9>^1WLdw@6l2 zXlUJE-)!CL$SMx9IUj@IbAh^fFdQdow!rhq5FrmRLzPIg=1UfBm$EUlxS~YOiV{7W zx<+Oy5%u)`FqbQw2a&H7=ik9UHl&Na8s05W_EzFpM?wIi`5-d`$G5z?`PsH9A{v zMb^=<_N_ce6c%VemudX7LL?HoK! z;ag!1)+AKUpF%}@Y6b~GLv00{qFAAm&|X;wjgeCPX#3jc%y4E;!h$D$ELyZ$r?GK( z`IN=ulK<1NKKSbmm#4wkK4$c^^QTg;H%PGMCq;LlTf11kyV^&EPXGCx-w)3||N9fH zGWql0NHqE)#jHtsRObS*hHI2X3lV?QIDG3A9w+5z<*$fKsA*UHhQ$7_6lklDeug6h z_J5jec=gc_aD37Dwcm@Yn$PjSk=fa2=-R zE?!Fpd|>cAd~sBO#|-2zkXlqiDU{3FXa%~ceWI(XbuDV4+EfT_V7b(o^19wcLr={e zTmNvc1P=*xROgzV+mhn$1vYT!b#%)&koKyH*iZAaA_>N<*xKA&-^{au@bRq9`W9bn z$+LP^7a-4SZ*`I9m2a1OGhJ!9HXi4HC-T&~jEnR9D(d+5%G(Di7Qj?y zEYREW>}kQJ5|`)P%lJ2YLWEsZqL#1&R>#a+z|5P&x1xKSRq<=*%{V-FDh^14TcZk3 zIfNCy%6U8t#}Uys=X+y6n#`0q4~GHgx*qDJ&&pUN@s>yrWug|`pCeHxDg`~dk+0a(ShG3y85_)(w) zP*#8`pzz1Q#z0r#v&SsG!2MEFbXp=(^S0I8>poN3zmyRyd~Qv_Eh!IJ_Ml1l=_p7Q z>~!rX+k_1kzP&(aPcZ?^5Bv$R0G#5&$AAYRg>&-|q;!;o@dsNG?2H1B;mY@tFJ60>n8)Xc7w+Dehz4M%kLZk!_t` z2=Z7D6jy#^DP&~3E*p7Ke^4}mAdj-br??3WgY7x636tfRV0l)sj1ppbLa;n1 zSbiX46F0&OU{im_^2H@w?2(t;tL_|iDG|b-t|Z#7mNCV=mUBqQsu!1lO#@#9He)&p zx4e|ZP(qHH5srE&95pW-g}!_Q+4##A9uW{%n$bP2aB^DFvkk4Gx9ALMd8zPGF-C=l z3Oq+J^a>@-F!BxUsHC%~XcVxzG-M~k z{5#dUu2uGz0GC&%CDzIO;TC_18N+wPe`*26i`ZclG<6CU(KLx4741MAIpU5T5%>4c zdm>5N+jXenc{53pj*R|`zHO*~{-8d`R!I z7`{@aH>w-^CRWsL;^29^)rB!_OD;fdA3C70DM69YX^sU&dfis-WE@b~l%PoH4n=xx zsP9mpq#Gg?zY@!ha&5VGT2qhCPD@<a3I3s5&|y}XjgG6Oo)Ty8bozkfPhBJ5cz6cqtm*wVf5wg0lt4Eig_=lgVAK7tl`$= zTrT5fH?Zb)Y{1ww)(jtiGyUcozgv|q?+5Zz-1r_K2_dUOwF1eObdQ2auF(j+4FW^1 z>u!Ts4Qe*2p%tHF&24N*xY@?Sv))pGyde`kaI@NgHr5Ty&dkL1MTiMeY6_XnOVC=`}TttI-Bff^~9~=Qf>*UQhS_ zLo(rbhgNJrWWik;HDIJSZNM{hLJY0Mz4Q+Ew5cZaa-|%eaD|Sy;PNkY?AyCPun4un z@&gHE&jm8IKwC<~Z6))|>dwogj@0B88k3Ma@YE*eA|j_RjZDvOp(#3@+4URwE*9;6 zyC-q6i~c^AyJ4~0$5@SXukmF;k{!SP55M3l`aPP6D6K?f(nmh4XBdWgPH|sa$S9rm z(b2(C=_cdhP{`7WM1MMzm*}7^YRGb!+d1g*{dVcjM>mtp(?++e#TKr*;Io;m9 zqaNEFq8|*VQi=?F^b5S0)j38QO)8fy?PDP#xuULDqOe-4-D@{{4?FkS+HhQOk&UOr z6CQ;{Sgxuw$JucliEJQPqx<0CsMmbl`BlUuWtm6P zaKb@(?%aLlH5B7(tT}lR7(3>+3S*lX$ZR#DmIB*`v5m9Wj3wimv1)FZ4diYa4Rf}> z=;x%`+`kE7s!goQCfI*R@|*`;qZmKrww{Oc;fcY;;sh-{kX z$^wwhvw2?@y`nm3OhO0AHPDxro6 zsS+lnR+cDL!iLoPAxg#6KZf?y{hvJv^WU-KPK?m>PFJ)+iwL1y2@}eyh@q@TacT9i zp&Zw;#@aUNV1;y8Ywb7HmIkbo){`dGS2cVn%dlSInP`E+bJ2SPHYjYwCTvD4qgrE& zbSt)DfXR&wC~9vKQ<{plt40&uMqGV6ti8~(Q?w*pC~XYgCC#Lzx3!mAc3azn2-aS! z?v;))FDJfKSRmS`&_c^OYZ=hi=lU~OS+{7QQV2J8eq}1F8<#0>OZQQ|9Yb$(lb~yL0wZEnJL{E&mFM5E7c%}MC zl+%vKqFbgs5k18-JV$v~@JL@$+rBZch4iE7g_b3vz6N}uxhmRAv)l1fOB^k)MD0~y zi*kwHh+3NW6z%*s&m?-Q&_T4%-jznZv$oS(cD$F)a!^KmkbcA}%^$VI!Y6AXkwRIm z5JnUh;Se4X(B9z@MUfEC-eh)kQ1}nsr5#1H9oYgotVOn?nokr(6cy1B9WjtZ^B1C+ zh=pqQ#uoJu?RDf?Q#v{0ONF%3ZuYiB9Bcn*PAcswifgTdG@d9vIvX&|yadvOsIK`d zQ6hYeZ}2U?Lq4Z{FREZ~5+s&pGJX!$n3BX=QsmLn#c3Z^lUZAtMPdU(yFdeNGIy9nnAh`>8*8j+Bec}qQ|0M_NH|8m8I*Xhd*Bs!lJw83(Xk7_S#y^+PXA8}5h7((>*QT^JKw#H}Ga>0~gTKcMHv-T6RBfUav&Aari zH>J5Khw5wTA=RAHpYe_H8x%U)o6A}xJ93M1Dg37;k2Ejxp^4@+3b#a)?8vV$N>o5p z5bL#^(vk&#NDCgd(78o5tPPPalU6n*y6CCG_oBW=m5??zWdqXk;x zJM*>~(9fvzru-yrrP>-p9iCQUvw2nRXrs^;AFORbJ82btuZ+r|?`Nz)4Qnw>Zm+Kc zx+$czHYD)g|eh^VhCIITL|r47{FQ}v_5R(wKNd+Vs4vF%q;KZWd~ zUUu|GAM{1R&n==dcJvqhX>EWgmAwN+gD@CFu+l;ORS(-%(WMPl7>3~(fo)o9W27{p zZEcJn;d6|{cGXd$QCdc048~#{LOwS;=%WFnrQ;PQU?L`AGNxcEo;fI=@zbPZY>OkE zE^VedLsZArZ!W>0K@1L^~B` zE6l-M%tLaYt&=I&MNf=+CE96izLrL&%v4w)U5N08cGP!R-(3{a*W21;&9O1xT7HL* zv*V1uMFuR!F=-Y%dWx=zO4^n{+77=;6PmIckF|{YdY574kP)jt?5?8ep%Mkj1p}*CT+TK+dg|}#D$3^p&YhHnsScM*{t3_+D z7VEGc8*ty`jiT``e3NK13b?e*s=1ACU{pj5R4DE6x}q(bvuN2R-74LN?bv~x*oEEL zgI^7(XGcWm-Zl9bQ}(LvLuPB2TtOr)HAIoI0ew}E+7VfGza0}q2Sl;8{PFqAB$_3P zhr7}cd#{SBBZ)%V&wV&(z#h>d(P5NyP+{aiTmvfD7E@Z#=U8b+eud=<6J5(B#I*L@ z+7Y9c+0hn9rN?j_ClFEJ?{@qw+Jut|$*i3ctq@&BednIGR?Oj(o#v1GI}NcIXH@ez z?X2h=hG{-8N+MdWdO>;-zgWABOVT`|O&F9$RV~x)%VugRMAj{Mw)A)0G9Y_ywkGV zjziXliZ&U)T6G2DD^xO|yYw;|>YHTkJa%H1zW3%mH{eI4)i=!*G}E$2x>c0dlzUnt zSo>hxM|?s^=miICmoQuY=U%~Fl&stUW(ueIzIeIwfJ z$QNj#-T62veisVEteBLynhn^KetsgVY0vDOu&6Qy_La%p;L24qBIYx`8A zy5_%;Nuj36vz=Q+^^$a$XridP%WW*pthtD7KZvs6M|@%L9Lz;lYnAj3x9z1V`$gFl z=4pwE5!MdiCxz^YrSPw{`Jxr}Hj(B~&55GY1*!|N2tO+nQ^+OCjXcPUe8`UiD2PHR zj3P+xprWE;IB3)%q)=Gwj1j&NO|2EzQUbrABue4154{1g?YM03644~leU#Q$24ztW zeWqxRTQ!5K@@QehkpXx^(DU*A4a z8uRvx4&Y})4~h=qFupWptGHE&5l{D(OzEYwSqICM^A%SiEM5l04^%M@663Kwm(kS*8H1xE-GuHB{o)wL- zc21Pgyz`<9*l5a0dwXdqZO5OcWWz-**F~2^|EdnM{^^*KsPkDHR(X{C)CuJ0R#`l3Ff@d~H#Oy3K8*Qve~#aGzntMN)&$&S~e zd|DEy-W0vD_7-1herHr7QEk=4pDzOs4S1*TJwBk9!bedG&6y4TLKM0`^jD%nS07i0aZ} zieib%sYVkewpJRyNw*`a0pU!JCVC<2fauZ~sA$It&0|DM%=^Yg?!jK{!xx%kV!xLC z)?!Ix<4eRrT*SixE%8MO(AoH$D2xa$BcU(sG3i{KmVPfvXvdGDW%_P9@+)hJ@HN_h zzEV+SExYlp^gDcyIo1-34!V{>=Do8P35$H_B&rRiqos%Rg-8#J%DA9sw*BF>Bi54I zkqpU^0x6LSsZrIaG@`UfhxEvRjOgc#OroQP9z$LSC2-J8(G~olWxTa%cARlReHH$) zHrYX0v`kR&O2VDvMx8)bX*T?X)>^WQR@<9H)XmTz@vR+m70yd@s{V{p(&&!7i1Em! za9fmH)Wx>A`UZ<4;G}t{5Y4%hRWB=?wwA}XH?IB{Yk8&lkRNBX6c9aiMnO>_6vkQA zBBC7z>@lFIv>1w`1g?L+3@zvESS&g(di42REhX`twF@XEEsZjWt*?X&FDosFi~7oo zDxe~!>#HQXq*__@D}KZ8IO}Whho}nv#9ye2s|KvZ-_mOM2i0-e(C<-0S`)QU8(*3H zz(=hkt&7S=9kkX)HL<<*6edcqNb5@*;FB+Lc+Ho5)U2YEIH_<|^ED*F1TBvg){82l zt)bCzUCRw5MGR{3PBT$}=4hk2g=oD|Ek&)+8evsKj8ATF8*7scZ7aH_@Q-cnr0vlG|KWlw=qT!h z&gg=!=!Wj-fo+-#Iqjr*>!n?cKZO(yZ>!o}HIXZ5qR`Xc?Fzj_z0n7K(GUGGRPzAQ zKn%iQ3{&tY%bg+8yAGOc{Ls%;gmYwm7c@`bBMet4rZ7Tu&DsroVQ&_N6L#D)@4j>_ zMrs~~(HMg=wv81)sp)x1jdwEO9#<=)is8`(fs4*HPsLJh@+~v z4EQ7s3B6HsCk+0wBdo$)Ez|LZG^}bkghvEKL?lGU8hfLNq9PiiBeDy6>+=pZDu%TN zpC^mzi^gin>Po*7#Z-ue*!U805Et)^dgruw()dV#gm|y|lWHxeJrHHG_LXWP#BtCEvFDvS=uf74_iN3QV zg30An%cDXlWm0Dj{dF9KwuA(s%^^W(Uq}%8DMNzL=8z!t31CPNdYd35@XI|2-4PN* zgCC@V7;rx!h>2K;4fn!=IEV}PR00n%0ynAyHwFUV!vnuTg0JxnzQuR&!*h@rNstuD zkQ^zH5~+|HX^>E@SQAZgvRhaEog$KXa;|;4Vt3`TA~$NqYc`k9onM<{2eUl zh)(E?F6fGG=#C!fiC*Z9KIn^n=#K#yh(Q>PAsC8b7>*GbiBTAhF&K++7>@~Th(~ygCwPiyc#ao%iC1`yH+YM8c#jYGh)-~TEC>TXMhD>#9ueTx zn!pXVzrKuq|XVGtW%!e1!@caws6@T?+8fQ0b$Do6x>*$dn{4!(sS zMFM{X2ofU+lEROML2{%(O1N_#q(&N~MLMKM24qAgWX2E3f*+9;+3*wmeLBd2obXan zkPEqy2YHbXevS-0a|sHf5c~xpD1xFWhTmy9E!0LG)I~k`J7>@U4bcdG+z$Rl6EsCL1Za*H zXo*&6jW%eDc4&_d_zxY?37ydeUC|BQ(E~lv3%$_?ebEp7F#rQG2!k;MLop1)F#;no z3ZpRwV=)fnF#!`X36n7eQ!x$GF#|I(3$rl?b1@I|u>cFP2#c`vcx3ahaO zYq1XNu>l*g37fG6Td@t>u>(7?3%jugd$AAuaR3K#2#0Y5M{x|taRMiC3a4=fXK@ba zaRC=`372sNS8)y3aRWDT3%79xcX1E*@c<9;2#@guPw@=T@d7XL3a{}7Z}ATA@c|$4 z2_a!a2?Iag1@5B-ZlDHkd<*_*pQBiCBn@FA)cE5fAZ^ z015FG62XrX!8h>mF7Wr&;Cm!S68KAckPOM;X>s7*ZjcJ8kp`ZW2I-I<8Q^DtAQLj< z2V{X)YJ;rsLP+ovvcnr;K~8wi8{|T6t^6hToGLvgr~6nIDwltd|% zMj4bvIh02QR753I#;^Ddzr%x^pbGpD5&VU!_#5sR1plBqYM>_k036gt9n?iV)JFp} zL?blDzi5J{Xa+wp1kKR`Ezt_C(FSeN4(-ta|Dhu~p)xVVK??*FZN+S4&WdT;V_Qi zD30McPT(X?;WW&-0uzi_#Q-ncZ>q>O9XCK1zvFpJhToxr4Bp` z2;3$P+$VihDt5+p@3Bu5IQ zL@K048l*)!xYHeEKt^OjX1H$?WWkTfifs4^*^vV|@iTJ4Tm69-!vnAB1>O`1-02D2 zX9)_T5DKFRio$Kvpg2n47nDRPczYypiz+CKawv}qsEA6aj9>8^e#alEfcPE|paB}95gOxPc$gJ5MKicp5;R8(v_vbkMjNz6 zJG4g!{D+R{gwE)KuIPsD=z*T-h2H3czUYVk7=VEoguxhsp%{kY7=e)(h0z#;u^5N( zn1G3xgvpqKshEc8n1Pv?h1r;cxtNFfSb&9CgvD5brC5gLSb>#Th1FPtwOEJs*no}L zgw5E3t=NX`*nyqch27YLz1WBSIDmsVgu^(3qd11+IDwNmh0{2Lvp9$IxPXhegv+>s ztGI^ixPhCvh1Z_5Op_Xi#n2Oj(d9@+#Rb_8x!2Hztwk{~IPAvsbYB~l?Z(jYC; zAw4p{o0>r;WQK=#K^Axl5_rH6WW!I$jvUB|pOFi>kq3E^5BcFAJ_Q9)2ww6Jyf7aW zg_q9*Z(j!`;FZvzB)qy8l!kY6g0d)w@~8k$00OtWgUa|7zu|ZMfhzbDf1xV=Mm79{ z>ZpO5sD;|7gSx1P`e=ZLXoSZ27fsL<&EPh1&>St$60Oi0Ue*Y_O%ZtD9e5TMcnlSI zk`Z)-XB9zbbU{~iLwEE*PxL}>^g&!*QIzNu0uIoWWU~!+Bi5MO?yVT)|ab z!*$%iP29q5+`(Pk!+ku!Lp;J`Ji${u!*jgAOT5Bsyun+%!+U(dM|?s^giyjDEW#l? zA|N6nAu^&MDxx7e{HvVc3&cb$#D;%$5O|k5@QQQb{pG;R#DTYS1FzHuUgiwE#~FB) zGVrQm;N7*rYg~cXqyq0d1zuMQyoMBb`6%$3PvCW%!22PAS3Ux7b_8DF2)w%yc+Vj4 z>OkPBeBfbp;Av-&89yKkeneJe!%xVL9LR~Ekqfzz2YHbX`B4A`Q3!=m1VvE{#Zdyk zpd?D6G|HeX%Aq_epdu=vGJeHx_#J@+p*HHEF6yB^8lWK> zp)vkN6EsCLctRF5M+>w>E3`%%v_(6#M+f|ej_8EW=z^~3hVJNrp6G?%=!3rKhyECV zff$6r7=ob~hT#~2kr;*17=y7Ghw+$ziI{}Rn1ZR8hUu7rnV5yyn1i{Phxu55g;<2e zSc0WkhUHj+l~{$;hy6H!gE)l4ID(@% zhT}MalQ@ObID@k|hx53Ai@1c#xPq&=hU>V2o4AGBxP!a6hx>Sdhj@g?c!H;RhUa*J zmw1KOc!Rfihxhn^kN5;{5(FNC2cB>T9%KieJ_jBY2N4kokr4$^5e?B1179E}Vj(uZ zL>$CLJj6!=B*a%pgs<@pzQuR=9*L0zNs$c6kpd}^3aOC>X^{@;kpUTz37PQ&vfxK# zMK=6|?8t$f_!+s78+niy`H&w4P!NSs7)4MN#ZVk2@C!~qXH_T5-Q_Y z{D$B02ddyt{DrFc8`ba+s-p&Kq84hS4(g&F>Z1V~q7fS7Uo=5eG=rA|g63#}mS~06 zXoJuj%%R@|MeWcY9q=DIq7yo!3%a5kx}yhrq8ECj5Bj1X`eOhFVh{#n2!>)9hGPUq zViZPW48~#{#$y5|ViG1}3Z`Njreg+XVism&4(4JW=3@aCVi6W&36^3RmSY80Vii_n z4c1~E)?))UViPuF3$|h#wqpl&Vi$H}5B6do_TvB!;t&qw2#(?yj^hMQ;uKEf49?;l z&f@|u;u0?73a;WBuHy!7;udb>4({R}?&AR-;t?L>37+B^p5p~x;uT)w4c_7%-s1y4 z;uAt5g%So~5f0%I0TB@ikr4$^5e?B1179E}Vj(uZL>$CLJj6!=B*a%pgs<@pzQuR= z9*L0zNs$c6kpd}^3aOC>X^{@;kpUTz37PQ&vfxK#MK=6|?8t$f_!+s78+niy`H&w4 zP!NSs7)4MN#ZVk2@C!~qXH_T5-Q_Y{D$B02ddyt{DrFc8`ba+s-p&K zq84hS4(g&F>Z1V~q7fS7Uo=5eG=rC;g63#}mS~06XoI$BhxX`z|IiVg&>3CO72VJs zJMZw7yZy5127PSFc?EH6vHqaBQO%9FdAbp7UM7;6EG2zFd0)Y71J;sGcXgg zFdK6)7xOS53$PH2uoz3Q6w9z2E3gu)uo`Qy7VEGc8?X_Zuo+vh72B{KJFpYGup4`@ z7yGau2XGLFa2Q8$6vuEJCvXy{a2jWD7Uyst7jO}ma2Z!{71wYbH*gcTa2t1U7x!=< z5AYC=@EA|<6wmM+FYpqt@EULM7Vq#LAMg>M5E40*FbIoq2#*Meh)9TxD2R$^h>jTe z0x=N_vGFD1ATHt|J`x}yzCt2=jc@QRzQgxOj3h{kWJrz_NQqQPjWkG$bV!d3$cRkH zj31B%KO!r#;U{EA4&=no$c5aw>E3`%%v_(6#M+f|ej_8EW=z^~3hVJNrp6G?%=!3rKhyECVff$6r7=ob~hT#~2 zkr;*17=y7Ghw+$ziI{}Rn1ZR8hUu7rnV5yyn1i{Phxu55g;<2eSc0WkhUHj+l~{$< zScA1#hxOQijo5_E*n+LthV9sao!Eul*n_>;hy6H!gE)l4ID(@%hT}MalQ@ObID@k| zhx53Ai@1c#xPq&=hU>V2o4AGBxP!a6hx>Sdhj@g?c!H;RhUa*Jmw1KOc!Rfihxhn^ zkNAX;D4~QwScF4(L_kDDLS#fiR768`#K0GbiCBn@FA)cE5fAZ^015FG65(rngKzO2 zzDHstK~f|`a-={?q(W+>L0Y6kdSpOGWP^g384u6;u%dE&+*fA&NzTo0ZSrTpavjcP()zx*+%| zi2p<7mWqZSK*h{D7cLE~cV}m3A2Z)K<6r&F^_RzA-+uQ1e!xm|P=A6$MJQ72403>i zLBxR3+JfAI!iLE1);8o06fQ(=w{{@+py)x=1NI_yA@$%BUh_aOxWH>Zq&)}&|0hES z0c&qhnp|hk=30!;Vi^j3EUT%IxHBAAX;#ic9cwX(le4T8XuW&zW_)VQlYPA(IoF= zZ4$Lp&!vwZAK*}=0K35ktj`uVSE$)phJ1}9;%Q9xC}d1P7+6OO53h|5Ph=l$0h8-E z8NCymxNQ3r58~iuT!;WI%0dCw;?Ane)kFVv8+nJ76mj`4w|*X%vnHO2(TdA!D3=GY zFfd6J9p~*j=S7t^Iq7}Q-#2mI?HJx#A9=*o>bcy)XXStdVP8hFK{~-U$-j?^qAKXK zp*M7l4eKKs6w^z*U0NhD5)HemQ1lBG-7jQnCfYU`T`7^SYCL>JVF^)5nWz6o(rJc% Sf3L&y_#OpAIp1dHv;P3I(e{e~ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/euctwfreq.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/euctwfreq.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5436ebc10fb7d3c934f2a784d2f8443f909f43b7 GIT binary patch literal 54684 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/euctwprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/euctwprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ecc29b344af142bb6d6f347c4a21e6a03a58319 GIT binary patch literal 1111 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 P&+~ia4CQ^3na}wHw4?O? literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/hebrewprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/hebrewprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..979389ee6836897d6015e8c6ceb3728551be8e2f GIT binary patch literal 3177 zcmaJ@OK%%h6h3!m?AXra;mq9%I1yzVP1v!EQj}59Av}uxKl9=;M@+`Uqwne_6n_yey z#i)>p?+I*>5nAUA|^$b*+jvQ06y`NIMFd!2por_ zd3T%<oF4MJ$?2sJ ziB_>chP`wfr}UABf0~tX(&Y7%cSvD?0rCzje2Baw5-!uZtGjvG#6c`?37gpB*hSvbL*8t|%03OgF!AsVYt@VYB$Y)YvEZDC5Qd&4C zOt@~jT5h;*IOMLDtIHL)i0E)DwNkl=K~StoKOEfu>Pk7-j^4!Fy7aGvw!7l5Vx}JT zM9b?c#KLa3xu`jgNk8x#h&(IsE30@WUAI_S4g%NxlJ1|GXl&Le>gD?Q%67TpjbE$P zR_Y~ha)KrE{6_R#Q%=%*o~ZB0J}C4tTd)^|M88Px`|S?w_vwk2+6P=I{gs&}hv$pao~N(&ABo|IwmkMenF)>u(qYbD`P*7n-g>;}CR1 z(6#Sa*V*^Jp&M|MD*HVB)26eKA{!>jyJ{FyG|nq!gR!-aI%Lop!|kB0Pt;pokMtbH zu~3}!oFvcLx=YowY9^{1Hpf{HZVrx?q;>TEO{!YCIB()wJd;73wkGH@>zG1pnRz)1 zBS_T`J5dg~?@2aN7|$;(x${|PV6|KU&s{5**4&kyhVRy@l^vDN@=0E+vRftlvpnRC z50kUmrR>a7EJ*o_!VZeUWRL~$C*^F3tJ4R4|Uz_lDD+4<>;I!8i+tNW0 zqjk7RZ_&}jgE|O!ae_81lC@|fox}<1+<-A|M;oCa!HZyh6tVQl86#hUnCi+T|Erqe zk@;NS)ww)#e)^(2n=33$=V!8E|AmFQ+zgWGeD=+Y*~@NzdOjPb-^mp&9ptIP=X94) zz>2l%YT5IvMPC)dFwJ|;biV%jWjOrLMZX>Hh=CgQG0I z)hl{Lhv*d@rVZM}mMuE0w$$9eKJpyLAm1uAIY(iz0<7c2wYQZN5APshqOx2qZ7-Mn zVeAm7nrpPxvet|P=S7h+h4XZzpcXgqrD3X+JK1zr8&gjx@Pof6QK93y%RGl|RQkwq zM%;Ad36O`2EqVGVORO57IUojLzqZDwQZh5bpC@c?e4eCSZb;h|#?P(@T|ERk|>tW_{bf|Bv4*&wThi$~g1HV{27H7VZPT48j!mrzYB|Vb1 v)LL{wr>hw_x)V$Go)hz{+na$lI!DdEU{!+f;bG!cZL!yRq`F&Wus)CN literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/jisfreq.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/jisfreq.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a82aea69f664898563283bc34802885f30eb4a16 GIT binary patch literal 44470 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24c441349de53b357514b1214d25c175ead09998 GIT binary patch literal 24890 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 S>(P-TMl7<#f`3N;oA*z&NLLa7 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35c264f14a0eaca2530507bac375397bd9e67323 GIT binary patch literal 30577 zcmeI5XLw!Jm4=TgvXO1DF~uYhAfXu$#(;zY2TaGf5z{XLA?w~41=&)LWU!q^0tu<~ z5)zV71B6}-VP-Pvy-aUR@57X2ddbxLe$MdWHT#@7#}?QRkMP5*wfFkg+G{VJeWdLl zzCW5Wwe!rg9=LGN)3WT3vzPxjEz9P&$0JK7WLfiDS)cWtg&s@ z{9e}BE^B^2Yiyr2e~>jgvVo4Q)mA>2^|U&&<`=S_=JQ$eXWCzWHf#P|`^y)z=Fhjk zd?{;wIqPXml)jy_Q2&*U^pm7-uU@GC>PGqDwJB z)PG|m{gkZv&Ft)1KYa1O+ns&!zrcTj{{Yv4>%k4+MsO3j8QcPH1-F6Q!6(3(;0~}5 zd=h*L+zCDnJ_9}r?gDp%d%(TmK5#!c9XtX~0*`_d!DC<%cpS_JPk<-EVsHj{3Y-c~ z22X<}U;%grtOrZMv*0=K1@Juh68JLs3ivAc8u&W+2KXlU7Wg*!4)`wk9{4`^0r(;K z1@MdDm%uNBUje@gehvIO_zm!z;J3gF;J3l=fZqkb2Yw&?0r*333iuq5zGXgU^>_t>;m=xZvcCN-9QgG z4(tyO1;>I};Be3l4g*JngTXwoAD9CU0DFTsf;WLfKo{5t90ZO6bHTpg&ER-&Bsd1l z1}A_cz-gfUf7Y1Ze_3DNJ37=mls8*>@5;X6#`NL5)!%BiR`s{q5X^k0|w_3x!tyL=q2SzUI9c+z`w(@ly z3zsgK+qJAQg+)eMqrI#8R<;@wm#rQd8R%Q}!lc2zRV!Bat!S;Aa^=9P=FpWRU2~4; zp0loV!P!f@=FaUtrmMR#d2wI=$!qh0!NGz4M#qAa7SHYJ+3>Zyd&xmr`x}?@&8r6< zke5Y-Vf}pN5j>*#7=lMRuZ0SWa}08x_MGQF=X~TGgPcb`=gj0Bmz)EZb0Bh#OU`l0 zIS@GqBIms2oQj+ynR6C$4qeXa$vG)Gr!nW~<{a3ZGm~?A{+|wU4Dx-zzJLRfb0Bh# zOU^0FIW9TJKIc^A9JQQdm2+lt&S1{L$vJd62O{Sn<{Y)0Q;~CAat>3@;mkS2Ifpan zY!%nX0n0hvIVV2n5a*o1oHLkn=<@mCL~s%~8Jq%61)RqGbZ`b(0L}yp!6L92ECEZw zS>P>T88{o91I`8Kf%Cxy;6l&<7lF5ei@_zJ7hDSZz;e(JnxF;V23CN}zyNqVxEu_E zm0%SZ0>j`PAO|C06s!hU06oBZFt22|2CN0^z&pXaz`MbFzDKLd=z{Pd>mW{t_L@O8^KNBW^fC*72F1H2cH0UfKP%?fjhyc!Dql{!Cl~P za1Xc_+z0Llp92qo2f;(&^Wb6d2zV4c1|A1bfG5FI;A!v-SP!0UWBeu9ZiJqua_Ctr z$M*EJ155;yzz(1jOa@cHRInr12}}di!Oma?*ahqgb_2VEnP3m_I`De1C)f+T0hHIb zHP_YoCD4U z=YjLV1>i!^02hIa!6l#Z#u^kKxb@#V?shnR^o41uDE>9zyqd@Gy7;=vAe+l-^ zfXBhp;CApJSOeCA>%e=!JHfla$H9%@D)2t=esDFo27CZ~5L^pB3_b!r3O)wj4c-gZ zfm^{%;1+NjxB*-bZU$F^54AD=5^Og@Pg6Pctd(PXdfEXdf=OTp&xENdldV#KtcVk@&`at1bTvy9`kW{^uUyb-)a1FQ*=tg=!mae6r z!_wU}T;cU%d;qWBf4av%$WV7!U9@$P)ook1*@yA!N~?RfZpXU9>+Y-zzV5J(qZWSV1IA`I1n5JW`Tpj zA>dHZ1r7tV!Qo&II076Ajso4F2OJINg2G>?xAxxz*HFFQe>#_&{dZc&kndP<9GC~T z!2A9j);$*#zLisN;7f@pfA5C3t=@ln_35pr7oL7hY}()9js11F{dZFNb8JiB=`nxDqRxNRPs`_46FH5y} zAHiEV3=uA)Fd{fY0zIP6Qf?`>T=L3!wGUTsD{QdV(B;+&vsh(RZDQzO)i4*iIhJeQ z94oZl1#M!|3jK4NLjSz@t6^2$po%mUrY$%@7}^oSv@Orc3Su{>LJyRng06z3*1F2) z!c$h*TadU1a-_tXQ&kpg-7sgbtqS{kO<*--PrxGZ=;a!$n%3Lma<-B35g~QN;l+GOrUdMW? zE?7Wt^LcUs(u#XBul`EaC!Z1r@393(znX~xGmPEs<`=})@PwM*0b@mqSyxiek zx)DmMVL%W|r#V9r8aj)MEVmR}E_vm=720Hp_iIblOQN}y<>rJA*^#oUZrVw!MvS4( z&8cs>iJ@ywWr;0S@1ZS)sgpw0UDgtpCsi%wlHd(H51Vl#$}Mfdsk}xiOly=oYVD(z z*rkn)Rk#^aGuveBHPEcso5*KFKM2GgPSX-fCa)iEkPL{VH zI^`>I)C3!xEi zQ=#Skx(BXaULhn1b6!^tC)nDpu&ppmZQpaL9%#RMd{PL_NlBcbYU^q}tW}d%)rE$I zp?eh^siBsXBQ(}S_fM90?oKL;9aZ-+Hagc=HD9U`p7YMboE(O{+O#Z(xi6Y?UmR=8 z39L))quiT{s5+-ws*0s^_3luxRIYWYT`I!shM^n^^Uj^rb52mp+Ux|iRtsWnH8e*B zg(e1xhterRki%Q-xst0t|g(>_wI)10^Op(ES_d$q2Hvb?v@A$#oz;#ym%DjsW{w(9MB=sC5?U6Vsw z)m*UL7h8pWaRNySb>*9OSh=o(w|**jL$TgbXqbkp}u8?x)UH(3RJsFiYIi zRF*L3CfeaSZ$DU}YmNwu+hNOOg!WRS?KHG-pj zSU*Df3Tv^$>xMZE{lKOAr>cU(`BI&J&jl+r z^qdoKy`2lrGgPCy=Ej zrE>yX?tv`VXGzLZ=0b-nkR&xMbU3q1ONl)vs{%q9O7H&JlFr?*<+E%y=A5rwQXW?5b$Ux|xq=FF603=VpBKlvcm;w&I{RcX3c5nu%PoWSPl!Z zp_UL9#9`>JDZSTl(v(A4?6BDBJy&jp2o1~U#zvy5!b0Vh25*SHjHRm>^EJ+;e zH9Tia2^?XE!(^o-o=ZtmsjAL}#Z$vnDs4t$TP{tOpH3z4_GLM&Fnw@1fgDCC!|5%l zZ+SIuD`b(w2wn{xo6@;bTMkRbI*TlYSr;k@V(V-c+Qqnc}|v5 zA%Vm$LzW@09z9uMNiXCqo(qfHQOinYaT&qup{>+vDQ{{n6|1=**3ez^S=F4gNN2HA zN#~>~%VOuNV1-m3I$!-cMWn(i6qH)mt#f9##NJ>@>^Wx+WdvQw>?MO`U2s$wx`H5f zk#<;Y%U)R_ETwZJY&lF;a5#&-p7Xk%t7U1m5D}7wp~ZH{@=%h(IVadeD^+v-RGXM3 z?6Us4TPi|@`{A+`3bMl;@}_MmEDS@c3PUAumN4`hmN;o@&R)lcxlJ5uwa^@QC?pM~ zY3Kw&tf3=p1&4;ICCej%*GW?jc`XUU@(7DlmSRKyG-rpxB(cMmy{R6gmh@c6Qtpsg zlEN^1ohn$VSZ5C63PZ=bL*Pu)&dDyGwReh;l7S5#{sdCG8 z!5fAlpC7Z}*z!Xa9-ykcBU^T)BD|RpQSPwVmLt4mnA=K*sYZA%RA0V9dqaZMRtv>; zgfJ(y6(r@u!p!Aio8v89ve2Q`%Doi|+Bm_isg2$F6uM=-|M!FL_Go|V93MEBaLpWS zf2`fA?u2KrmHt4wgnK3*QP-Ucl&7aB5i{+lABeZ8{c(7UhnlUyM(4tzfw}nxdzbS! zRQbQ3g12FI#v&EC@#M6ZeOTTG+2jSwSGGSf?`4DTZVevF^5^-N5y4O9%^qDjJbQRx zxNG_9fx%|inxUcP!z-HIv*}s0HTu$5KCrLh=2% z|Mu9cw^h}jsyF_%v8s00{>+&gy02E98h=@JR#e?zRh^Ype{I#PBQICmdn>E%_p9yQ zSE}w0>OX#1b$?X<@#CudllqUJR^6Xf+dHd*U)L7-KYtT{b=Cbvb!5x0=l)Y4KKF0I zzXbmjJSyl4P6)msI4-Cgs^(?|&kCjme-NA&JSBKS@VwwL!NUR#IM){(5!^3Gg0q5A z!MNa*;E#fb1bYOB1&;{s5 z&4MorwhF!|*e3X#puR8F+*bsj7i<=MN$|Shvx1uhBZ8fR+XY`2>=K+8Y!ZA>aGl@- zf)@oV1fLLmNbq67D#49{s|7a*)(GA&sPAhvw_dPT@JYdH!TSX31lI_z608(#5PV$l z5y2M(*9&$Fz9zU<@KM3X1ob~vXVdtJu{1h6JvyDby)=4iY|z;>NWJl1w>LH3tNq#3 zKR5B4KmY!3FU|b*p3Zf%=Lh}qvB}ZF^h|%Yf2KE@#%BA|dpg&i?DYnty{U=G{>+Kd z$=>X2FI`x_@5sX=J9lo|HL|0#K?lwBW=E&SPW3u#_NHF%Q0}X8M*EDZFd~HxvE!|w6@_un|MQoxx?!53kdpv(@@ajaNVh-OO$k1lCDnD zB}%$oNtZ3@>LlI5q&t;#Z<8)y(uGdC&`DP(>GCFB-lY4TbkCBmSkmQ9x>!jUE9n*{ zUH7DW`xYD0W1DUi+$7Kwn>Gvd+$TMHNsnmKgPHUcCq3Co_dDGp(4(C6U?#mJk{<7* zXE*7gPI^w0-U>+%f6^nL^!7+Q1bURq{WX93S3Vn`zFt4+&c->4w?uEe^7v7vZ-S)v zaJpM?k6^dpUcr5W;N5@8dO+5Lf<1!0f`It+gMveXhXscPj|d(W91-Xx zn;sK9E;uT9LU2sb5j-h)O7OHmU!qB0brrlITi(9<>5_}K51mgwO;xZVe?Msld<(J^)dpYE6Sh%dte>>$3{;!7zY z+!heulE#bABPSJ!AY%m&7b#+40aOsfYRtvW>8CW2|Oir^btfNfpV)3n>J`0)mWdR&&y!LAh<@Vpeu}T}CjAQL&5?F4>q3ARDnmkX~nUa%~oO+>@Ro! zP_eR{%R%!V>#_;t=3r=+V+~Pe*M~${lp#ujT6jy$VwkWD7=}c|Z1SRt34{xo3up3_ zh1K@89(q>0$S#eWMK6(HVaAL8EQV`YRIrd=7?yi>z7E3p}&JwHN{98?HM>_}y9{HN^%B{LF{O=a0#xuXhU~>u!fpFC+q}dpkY(~X z+-4(-MUxQ=7t69F!a_dBGcuI0qSj)#)Dl}{D~>dXBQ0hwT}6Tl62urf$i@9xf-(~= zy7W?{EJ`BIwUEEKZuV2cfz#T<;!91&w-xTazi;X)3908XP~Nmwxq zV=+G6Lm?Ix`wNR&_JW0qmEoHFl5iOstHne?DXt_ErUKclC42RnKVNnb7H)BM>;+|8 zB8k`<*_;*RTq0s5g2$&o7E0Tg9cjwp8gPcK$#~{QyDSWqT&GbBg)&Rn8B4-tm>4iz zMr9i|YKsIa#YF^#4&YI1_Y?{ZK_(lq+?|Ayv#cUV$;EP~vB}8dVj&eVz!JFuqtjfw zL8hW;k%-f9!ve?>gG`p5Ek=_@2{(quVmX`v1p#`A7;ac`BmzMpW{IM_m2r4;!g%4* zAGPqTAu6COTMO{NIp>xbyN@f7yLwdc8CgY8$WmcePyouPEm|b33_W|wNKipTrbhy+ z1;v!vU+#&rSg}76)`7WnnzM|IC}d(rhJux&P&^|jc3Q3s(VWy!F>YP%Sv4u^ zCD%r-`%r;wDs~1g6~vG#W+AtrKt|bOIhPUGUyIXXIqaDV^z1a&3E3!1(PbDcHW?F< zC=M8u7QCW>C0KTI2f@pcBSu5kpH-OKe57@1cgPMZO3@m65i>oqIV*RX9cha|g+!>d z*g>vm^vufX8D%J!y%fua>aVC`36_I=Smshjf>>B=oaF==*DBh&xg%p?90>)>^oTWE zR$(r+bbv)REW2x#HMe*WycQH&aj~N9XU=R1QDGLBkVFWeVlF%^$i&QQL9vP@>o#A)=Ir7Py~yX<=WA|m ztf1r|M<&)n8FJBzZRA#xi{(_JjTYpEX*btFbBx6nc|*0pkrP;sEz*DFUta9HaIss~bgn;8|IYN(j?w@Bx#}D0Uyjy~MrTsj#IH;r zsDESn;B>b)+1YqeB%&81n~q*ACiJ^1y`o+Gq))eAoq-{k!lPTqDw literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/langhebrewmodel.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/langhebrewmodel.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fb634e458612ece655c7af7e0309bdcdefbdf81 GIT binary patch literal 23388 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 R%HI8R^XAT-v(asT{tKIwQ|$l% literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/langturkishmodel.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/langturkishmodel.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f21d823818fe4c18c12c3f4689261c23b2469fac GIT binary patch literal 23385 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 JX){0h??0w|is1kN literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/latin1prober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/latin1prober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3f96e832e68066b444209bbaad99f0394a56be4 GIT binary patch literal 3272 zcmdT`OOG2x5U!q=9~tj@H=Bo9h$0~&25A#T5GA09Byt{rlHCp75HSQbUeDO;W&Fs@ zSR^KUNg_D%GY}Vk1V3YLhy&USH!eBxRk!V3?>YfQF3fb-RCiZbSJzin_8)Gk_{sW@ zpFdwB`i=HKg6Imy$rF<(Kob-Zbp-i>1dk1h4CV3VJtz#%_R zyjq|jM}ColJo!f`D3I?`P$a)Zq4WQ5ISOB4JM54=g|Dz3)^95a+*v>r)g&lnG}Xd~ zmFO9*1QcSRdi#rnU&(xd!UGM5q8*r=3}>#wl8Jz3v>51-Lk;&rJ3OyvX0Ag20eLOv zQj>%~N5LHV^K>&nZn*Re>4jxMPmwug3QAP-=68{hxNAXb7oBzuCP-e|wV60fa!m3d4fM&wLi{A#AR+Qss4O<3u6cR-9ZM~-9o6omnI#1L7ZAJ2eC;un=X>cIGNs0Pqn^Gca}tDd&I=k#3~d_#Wt z%QkUO-UUg~1U<$v25lSk6e0ofSi&65SUlXe$7?lDta?snCxd<%$1Zeac`4i7b}D67 zmQg)PWdn|s4X{a8lFc}LARE0wHx1*=j>9BO;ae*Sqb9xusRgC{iJo6Ln|AtV`|bY9 z=Aaz~D-V0U&3-F5f0h*nVLJIn>T-Pr)S3RHcn)UN`A&=giKC)`cX({S56+B@oN@+3 zS>=uIfWR4ibA?MwP-@VU_C#v21Hc0e_D{_-R%6BJqM>Yo7<-nxx+T1>0uU5wD`-d1!v^!$zWjoA3>CfxRd!6q3&PuAEC6THiOLRQ z7r&l@zBVYnN2yKQj)FKx>s_rj&k}Y8X?VfBgiRXo2gm6i>ngyzriMCZzk5Z0x!H~o z$?}_ax+TMID{3cOG73}7CD{l&S%sT7dR3JHW$juuxZMlFNJmSddh2Sfrb5Mp=FC}L z+mN@fXO2v`+^G0LmNDYU|sjpKty;e0G^L zMm=#39|g>4>b)zi`#=2h=iB#xzYM3H=2gBzd^8!KKAdYISN4{lK+VXTi^4MI;m3ke5jp;vMKN5S^5*njugGs{G zUM@G$>@E1EQFYY6KB~m~cGw+s5*=$NV5o22y>zfmEPqMI%ZI!n*#aqxvf&txIPjV$#eaEE74RQn-|JX^0rGz~U;qFB literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/mbcharsetprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/mbcharsetprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd66c38e2f370110c1d2b1dbd614babbca096e9e GIT binary patch literal 2364 zcma)7&2Jk;6o0ec-K?F>m(!$;D8+y(WQn$?9zdl664M4zr;1$xE1{9?ojB{Rcb(a_ z)L7|-K)LXLApWI2A#v)38y7C{d*j$mAdy(ljA!1PdGmXp^M}7w`SR&6-#%L+`kl^w zHs+tAXFP;xf?}efpg@q|wMDT-!x9B08rl@tBp!t&3T^rUOq-OTQ!pJ09ctCx*8*bd zqFCBK?C6%tpX#)$bloa^o<&K&m3MMg_)j{$!zfW^)x(kb$9VY5jxi`=7(fwN3=9we z=O>~A5DkV`AlfquFu3#zn;lXvg$opV4Du9v77V3KVP!_~C|sn_=Vbu;5{1iVUSVmi z`bx3+WE|(w=f}Capvt6Hso}evX;{skWi%k-|I%5{9%7QC2|58Liv~ue6PS+#8yZvz zou(6;6-Db?h7QdbRH<1k#+{@u5283%`ZZrucMB&QkCfI9R)r^Jltj6d#YPxqxsJNy zJW3PUNjmZIMCqd3OGCIpX2YT)<4%^#9y|pH*_nzDw96tzQI@g?W+vsY^w-Dt^5N*- zC>q`Aj-xod^CC^Vqkee*9-j0e0flxxbXj`kP7a+gx zYDPLWrlS><(Thx|@Zj?fp^-!Ux6Gs!9#(l+!*B;Z<6R`yq3EjVlbctlYs6pBmG#|b z8GIdd{oX`>t1g;w%6c=+cZZ``4ONn>u%UIT&(KU^%&`>ynImM<8LIm%(8Q!QdH)J1 z=lB0_M7j#eS0L~>P{*CV`sm#4SNVOmcb+*M%N&Zv7BQ^yqAbo_kAyL8=es}YrAZHX z9DYY8omjL5=1VL}l*8i=J-0{?O#rwwKt(XwH}DLl%m+?U(DDim7MUb{dU~`zJH2F1 z|4htY{x5sQu(2Cq2L!7eb}wy~iNxi5e`8FTZ}E;bu2>IvR;9u8&>EfCTnWUHXM%Xj zFlu1$4Hi_Q>p!x9vwiCXbYHVndoIRKnSbx{(*GwGr^U|;`@ufA0{8ZK8wDOQQe znV^!W7rD&1;%gfl3#YNazqenwaoX>r7CE8nj{ABYEPaiK5{AHS?zQEUM&V9R2JUXV zg>~S4vG=UGBX`?@(`tXV-wxLM3e{_@HPXRUF}|3S&m?PMA1D=~IP&#Dd8g5CY`1rt zkAjtcnoE_W?|OwtD)D-T?{ z5K-XIN~yWQ;}nt%!KC3l7xhgb`UE|@i-AkvrdSa^>Vq$AGvkpdYhuf~C6=u{R)9XO6Jm1vii}X*iB~?n`+z?!;%D1u4U{C#87}Or0z|L>3;c{P>*r*-!?^8w<{=tSPWu6y9Tu zTzLJGYi+nyuWDCq|7}yRn{_u>y6^&Nu6lu^lJPJz!DYhGY<_dcbjCLn-h-(I57`_U KhwQ4@Ed2vwHU8lM literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0883fd6715e7669410cb51f826c7284e22d76bdb GIT binary patch literal 1122 zcmZ8fO>fgc5S_L2;n+^orX1kHjf0WeibACpA%qe^MG;kmTOszcB(W0`){WV9#D{t- zf}eumCt2J$ap4DWVrFgJsB6#LeY5NF%$xn=x80+`w^u)#0KZ^m)NuU>P5(fM@MRzY z5(b5_I5Hq;IG`bM^5C-kv3=AA5f7si-duO-ewEgVGCG8Im?j2Or?aiip z6{E8!FAF-xe5ygR($KdMVjwk9Om30BUjZgaac#pF6xt?F7}WC4^Ikt(spEKTnIHf( zJ7_kVevOdf%itW~!h*SpdXDk{W0{Q;WHp0zgAIdCgO0(LL6>mqP!!=2&VBMw*TcX% z&OJFin~KRyW+-Vpuj^$RE9K$eb4Q5T*(?)6QAUcYRds>}0p2lCl&)$KxCp$Nn%3yN zu3{Z$ftA;EEGNpxP3%`oh_M`MEyQ>Ddw(ZO(w%gcZjF{R8Et)7EJo=x+S?gptD`up z=43S1Q|fyWd^`Q9)-c{}G<^*L*bS?}R-cab>G~CwxBu6I9l*NIhDj_$?h27CqNSv@ zFT}g$P!>Dp52}m74FpVW(0Y@Ave)5mkAPj*uymVLa|#)I zd!nRR4_**Q*TR8x6m@^}Zhmwix^mol72UWWO^AL8JP+)KK=ir`QIrs(HzcBnFClsp z_+wyS`5+p&UhDnRIYF4|e7(Q#JaDJG1$+|NZ849pT&o`?G>_YI9+)6BkFSB_e~ikz-BX`GXI%Lyq_x5amI zUJ(*e=?vn5Z?_T8rLwHqlzpVgu}qgbTK9oJ0X8nsLJ%~xP(o;pOSEv=5Lyp_KLwVn zTN--C*fhsgg?j<+LAc6r268qykEYPIt?5$?OP>}QvJ<6`?VA$~7tFRathavs9m`RS z=(@5H=;c6{MyK0rnUcqTNB1qr0uB)*YL-tqZ@-(>4c{M!2;aGJ&olJaE;HnSPW$C~ zV<)Aw@+Ytf;IqIUigJ~cI9c)t!OgVYRR zbCe{FXYU>W&fKKgM{fupQ#38wi=x}&knK^U^f2S56%0fGXdRiI-q3t~E;l*sRp|gsqnij3J zs77ZbZTA)>KHkhNNJM?iYW2}6japeyXo*avOIbMEv*y)`Ytf!C(4uav*7--Xz!<5_ zi9(6GEXqO@D}lOd^~983h(n+u%1viB6z*I~+gHSNL>7sBBCq4qCGNa|r=D1FKHzlb z`tf)bq8J2r@!Yfr_B#(je7e+2JOw$I@H<_~(%7Des8njvo-oj&ZmgyU{C|dq%A6>a zxM`1Kps}tfDS<~|Ay8+}|7ufJ2Om#0jxYVcQKgvY(y}y)_>0JS)(?UAc^)F0Pn*V> z?*TTx3}3ZXh3VjLCu7$-`pe@e;n6E);3B65{drc(KuB5?#HBHOY4l(v5D(nBROi4h z=OIvT#8fMhjvOP;Q9iOg_uT`2C#jB;A|XYXoldeyI+xl3v@uVZQeE6eLt9Y>1SRI~ z;Wd95h+y-kVh!sjUNI0c5O}0&bzygA`Z#wo_5ZjL4m%rSTqG}A=sPnZW3Mh)g}DF$ zZBQhg`Y8VG9p7%p|J`o!JBBu@xpPwf9>ed3z;oAiZkOs`Go4APiWTKMy0g<2Kl)TZ z9c`WxKmSx}^stOc56hg=(4#aaJxZfBm+0~`H4bXIAxV2~j~%&hLaO9bIpH9f%d=#8 z?{K$j(xXW%GymrGY-wSsc$_S(uD)Mo$>Q3})isuSvsNrE7g$=zi)(CHcKrV3YH6wP zuC(@YeyPCvrF6Np{QkSb66+Dq9+5Sckt8Z!v6ybn0ZZc#=%EEJ4w&F@p8@i+}+r$ zR(BsC{BoRmvAfR?cgo+~L<7|=%>AJxK6e)3l}hA|DPyiX)s;2U;*~wcVk$Xhyl`Ig zO=zCxXDTsu9mvO{TB=m_-pCogyihluV?E||2 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/sbcharsetprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/sbcharsetprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cf5b43424ad32086ba98eecb5d274efa4e790af GIT binary patch literal 3196 zcmZ`*-ESMm5uZKs_$5-ZC`Pg(CuLhZ?Ey~w6ci1TDv3L2T?MBmY+D~tB~c%yqD9v(q`qJbb+kl=rd`W6i`Tq9aCzC8QqtlI*-s;545A{h>=FVW~w_EJXeeTo0O?wc8wi0G2!RX;0V@UM<>(8d14!n{ zE70eV$xk^&@=EkMG!#goy+B@>r}PZkN`_M*Z*j^&?-F^}_}49yw@hBuv@5Kw<*X!Y zEli}ZK0Jxlm6<<(A7}&068Q(_da>#M`(J#0y?L+M1>ao!%}m}XKqJN@=nQx)>RI%R zNSv8}nV~a_J7kv5&_)9jCewfu(gtRmHVV@QW|(qHEZJKy8o_EgqUn?qI~tFa);U;C z3Q`8cAeJ)8$wBC;eo~ZLeX4Y%yre9Loq>`g2wyjm9VketqBh^1h?9^akYR_G`WDa3fl(Gwxk(6K4Pw(7` z2ctWqVD#qxIOuzCJ`KbDk?*~Ihc$aDzW7G_%z>R0_FJP9UBpcPfH$gvkXR8#3%8iv zr}a4=eQUZrT@H1=_Nd{h+gPDam-(JQ%H`1mSy1b%%an!P(&Fa2D+@*MdY(4so z`9YW&nCF6q=oS>+Hhe2xc9YfD&n}3qwJJ(jkoJL=9Nxu*>rtngsaqBA=H{PXe)3z6s)ess^u$m{JofrSv4z# zUl>ToV1OCJoKMD<`Dwwejo|;W{dh=FP?}o#Jz;xB$tKW)l*Pp2RVdqm-@6?|J!=cir ze}0+NzUqfh>Ox6&Gw_cU6ZVmh1LfT9_}_|YsYPv%$4Rklg$<&o+h^} z4=mnov>RLPo#r-*@rSa}+_C5Bp||tz)lqCPaSW zm^Jx?_lVEinmMR#II&>QnoUZy!Au;?u#-1wg%9au!o%Pr+i0;_^|3$6UN})U z{eRZJ+5YzQvrYXfZ2Nd|{cqDTVOAX*_XFbS&efMCf0wy8b4eq$jgaOV#qv)7| zZfZGKMb>JLIAvfrw{?B7TB_!&`SKlef@nH-*4Mg6#lNA-*IXuO|xziFT6#tmJOww5JISxC<8W4N+ra7v7E$9-QAmnYiF#e zdn$rI1@ZszyHFMADr6P923doyL)M`ikPYZ2WD~jt*|Odhs5Z0* z=|OiOJC?0N?LhmGK6C&XShfb$h3-N2tX_xOh3-T4t=@pzgC0N*tlosW1HBKq4{iJ2{WcIL=PZa=m(PmXp{JduN<1<|;nE%;JrG zW2)u-Zz5Y95&+T3FY;O@_B=s>(lmGCq3v(b;*F z*g#ai^&Nc~PfYwn$$D1Zwxeg`oUP5vBt0*@rqsUe!ic0S46))Jjk< zL8AoC60}OtE`e8qP6>8O;4_$e96Jn!No4Fh;cb@ zL9e(7aM5RjW#?p|kBJR?MN!l+YRt1Q&W3}$nyy!|F+D0jZ-im8NU|_A+!Dk6F;x~d z7IhX47EKl{7Ht+D3vQ&@VbLWa>#JhEQxh=dGu2JwEYv*0;l`NP;@4TcnB`RylW|zd zD`~7=$j*5&A{#fkrvvfiy=E9rRg|V-_#6KD}#+<#}}4$8(-iPYppq~kEmTOqe&tr&Y@_&pV4Ek$H=mx2~zD9k?Ndn|aPKA@F4 zBs@{*&xZG8j|-wE-l)N_i}a~7YqFIUdn>ytTFj@LbEVjn|KD!8!w<~)kg(p{?Uy~a zOv-b?TDK!1J8aG97_bJO5a}~#H`B7ke0Y}GWXW?QgW_R(6j)CluA=6*?XifPlQ%vk ZFKXy#?~#^rs{#>-19u<>4kP-x{{m+-keL7g literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/sjisprober.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/sjisprober.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47a4ab200a7a09b5a736e6ca6d26dffdcf9657fd GIT binary patch literal 2586 zcmZuzOK;mo5T4~jqGb9d$97z_g;OL4p-s|5Q}hrNO>HM}P}_l}pvVHnf);6+3Q5T% z1=vOc6i6SJ{*R)6Ah-61@Y<6v{QXJ==3-ZT2kpKU&Q`s?#Q=7|2J zsmB5Q72e`|Od*D#geVmx1qohTlvtG7ByF>{DRC%uNxEk3P*S6`PO@&+E+rnN4U!GB zu2IsYbcW;%r9MfY#G|lIp+`U9a*rZGuW|V-g$?Soo96;zv_-YDGfv9*>(esYI12Jk zR6fmz2T_il*2XZ5vwo)x%4jF(9mQD$?Dfu*?apRglzDtGF5_YLAPbVyA}+AE#CsdV ztc*^|DfBF(RcA-->}_s+)3z#~c}%XZ{EN#qqaLKXeC!LT7y*cgEd@hKi+(0L1dL(P zPr%p{j7_1VF%Cs8g%~wf|23>!)0l}t7z4OLVUr1@N8t>GzJ?ooTcr{FZxWSk~Qy+j^Dgf#^o%Pm(UqG=MO4C5 zP7x)C_%@X4B|%Xr^&9>kzVx+_5 z&ge9s0k2zlizX%#OJZL5_?_u!FxI;>(d23~-o&{p%*gh!CpMj!$jO;ZOM%3lmvqt5ZCuk6+E2MMY?L+Sac0o&=*HgVQvNtJzgv5@h{x(2qWw z;yG>o$$n4E10oI&4kxYZ?@;CAY|$DvUtysGeBjax zi}F+x)o6fx(jhu+w*!G)NlbLSl~o? zsf!v|%2%R693@K@mV47=hX)dtG&-I2mtX0K* zt9+Unx(2-RmI<*Y#F;4~=!)?zi&?uA(=uW%YrR*rCT}LZS6Rv2EUz=n!miN^hmq5E zI({QEv%8EysqdcMxK*rUn5F(*-4b;KJc=cp@ge~OMmVGQMp_D`+NIUEgAOvQC_)WbTIDc9O(HnPjx<3+uiG` zovo^7PRiPLw}Z9x9_~Hc-BjCM>2|sg_PcVaj|A$C^E}G%MM8nGY${YDvoxvZ97a)? z&uaEs6xrC^>TYdxw|5`O`Tnp}Q8pa+k5m|xK{coE9A<}c7-hXkwmOgZ_PZO;x~ltl ze+!FmHruXFSLv}yAY)#MSo)KS%F0TQrBQ4Loz8D_dL3eXfw%Y^6NxpkqU+oeDxISt zp1JZZiVs9xtXZp|_)yGQi&hKxWzn+E=BMfa>voy{>ILT77J zLceR`c9UBa*FmMKrc&uJ948F>N*#}b#O&z)pbK&3Aw1FD%G0U9SqCE{_@%*7=5!g? z6`VWaO}quir7v3bmcu{)hHe47?KwH09$XYv6a6`dw`>`=>bObGzZcy`13$$1^gLI>8oEAF5buO6Rb1AK{A<<<@Pe59R_uQP D#%d=1 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/__pycache__/universaldetector.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/__pycache__/universaldetector.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73775bec819df5cc449fafd6e249b6a92fa78f8a GIT binary patch literal 6480 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 +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/env/lib/python3.4/site-packages/chardet/big5prober.py b/env/lib/python3.4/site-packages/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/chardistribution.py b/env/lib/python3.4/site-packages/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/charsetgroupprober.py b/env/lib/python3.4/site-packages/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/charsetprober.py b/env/lib/python3.4/site-packages/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/cli/__init__.py b/env/lib/python3.4/site-packages/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/env/lib/python3.4/site-packages/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/env/lib/python3.4/site-packages/chardet/cli/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/cli/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75c7a795c6a10b65ab462cad0ddbdb6b54cad48d GIT binary patch literal 138 zcmaFI!^`Cruso8Hfq~&M5W@jTzyXMhS%5?e14FPTqu)w~B9JhG_+_qNl3So(kXfLc zRGOKSqFa%lpHz^ZVyd5 F1^}H-A$tG- literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/cli/__pycache__/chardetect.cpython-34.pyc b/env/lib/python3.4/site-packages/chardet/cli/__pycache__/chardetect.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc642d3ab81000405827ccd7391ea8864c145a44 GIT binary patch literal 2753 zcma)8%Z?kz6}{bTHpwQ3L)j7>C4y2L2c|Kkq=6O0L=eP~64-_@7+7))F|b=rc5$Xh z{h+IhGa71UHU5LFvdJQwAX(-o@(;B&vdAVM5FkL#t!|DeXp;t6U5{J0>efByRR6oT z6MTO7muG(uh<>20r-Ayf@h|_3A|{%mbSQQybtrRb>QdIAX@fG4rXD#w)}XXW)26jU z-KVK<>mH>o%Gxw-S9VQGJCp@94XUQ5y5bVcOk*jIy|40oct4pH!Au9Bq|XUEC>Sm@}5EJcw^Q7DlWN{U62O0kUe zaVera7D_G)rP)O2W0@!sOD*SG#(~V|MV#bEWf1)4Wt1&bIhh23!1KPCA4jS(6lIY~ z>ys-5d?;>NyUoxr*IbUiA2{SCx|J@mn$t6s>npC5z06S{)JT1uwiziSy`kjEyE<^ z12FxiN^%`8R{2~fMQ#SGJVE?2OcO0tl$HlW$8^K+RH_o=VTfkq@Yz0IH@?af?vB#O z_UsB}ns&Xp%d6pO*8fL%mw!W{i8FWU(#wzNg6Q!#dvw_#?a)Pot{kpkxOC#yO@|u| zQUf~tZb0~b%^jXiKG&Lb>5=wHX}WOeq(!<-CmkLJCa+w&bO;!^@EE(d)gKuxCjpz* zUHtOs_7y-BH|rtn;z{fSRju`ZZFattdZls^;V5xZN5Dx5pv}07q;m>p(G1Yqz(y1c z7+Yi%%6dqXQgd(RphPwpOp|4#qD-VoF3X8{3Rku&bRmu;vWbo@m*Z-VK3~>$6Y&}6 zhgXK{*}0bGw%a_)_aHg%lUczJI6RnC`uaAC3dG2E4RP*Biu zcATEG<93|36F42mcYcER!0Eb*t>(}r`*m@uLDU|pPe}u=KINUd0_YzB@s8)zUb-xnF+>! zLn|+yF0&QClL2!M zUY+m$KwrlffdCG?8Bkl+%aXWa!+A_XOWlPEAh zoro`LE?rOFgI{BQVtyYWFR7ZG?msqTxR@i<)Ls+no# z2)Z=Rho)5aTcZ&V1dt<~=)v%YX(L`pGvuiMNsZ7$ZYtA@ z;yA>pMeVfBDR_!wvT~(vfYhpu!uYe*Vj-1!mwWgIG=cTUQ%l9V0ckBGt?3_at)`qcP#rm`(0VPU1LDsHnQFN>1==ctu;QBbD?CF;4pbIbXu^A2=q z*BwBg8gAFQ>8O34(GEkNgL`~nT45L$^Ds0)hz|fv-r2p|bN&aPrU3r{ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/chardet/cli/chardetect.py b/env/lib/python3.4/site-packages/chardet/cli/chardetect.py new file mode 100644 index 0000000..f0a4cc5 --- /dev/null +++ b/env/lib/python3.4/site-packages/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 chardet import __version__ +from chardet.compat import PY2 +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/env/lib/python3.4/site-packages/chardet/codingstatemachine.py b/env/lib/python3.4/site-packages/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/compat.py b/env/lib/python3.4/site-packages/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/cp949prober.py b/env/lib/python3.4/site-packages/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/enums.py b/env/lib/python3.4/site-packages/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/escprober.py b/env/lib/python3.4/site-packages/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/escsm.py b/env/lib/python3.4/site-packages/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/eucjpprober.py b/env/lib/python3.4/site-packages/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/euckrfreq.py b/env/lib/python3.4/site-packages/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/euckrprober.py b/env/lib/python3.4/site-packages/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/euctwfreq.py b/env/lib/python3.4/site-packages/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/env/lib/python3.4/site-packages/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 +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/env/lib/python3.4/site-packages/chardet/euctwprober.py b/env/lib/python3.4/site-packages/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/gb2312freq.py b/env/lib/python3.4/site-packages/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/gb2312prober.py b/env/lib/python3.4/site-packages/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/hebrewprober.py b/env/lib/python3.4/site-packages/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/jisfreq.py b/env/lib/python3.4/site-packages/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/jpcntx.py b/env/lib/python3.4/site-packages/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langbulgarianmodel.py b/env/lib/python3.4/site-packages/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langcyrillicmodel.py b/env/lib/python3.4/site-packages/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langgreekmodel.py b/env/lib/python3.4/site-packages/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langhebrewmodel.py b/env/lib/python3.4/site-packages/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langhungarianmodel.py b/env/lib/python3.4/site-packages/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langthaimodel.py b/env/lib/python3.4/site-packages/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/langturkishmodel.py b/env/lib/python3.4/site-packages/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/latin1prober.py b/env/lib/python3.4/site-packages/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/mbcharsetprober.py b/env/lib/python3.4/site-packages/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/mbcsgroupprober.py b/env/lib/python3.4/site-packages/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/mbcssm.py b/env/lib/python3.4/site-packages/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/sbcharsetprober.py b/env/lib/python3.4/site-packages/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/sbcsgroupprober.py b/env/lib/python3.4/site-packages/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/sjisprober.py b/env/lib/python3.4/site-packages/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/universaldetector.py b/env/lib/python3.4/site-packages/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/utf8prober.py b/env/lib/python3.4/site-packages/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/chardet/version.py b/env/lib/python3.4/site-packages/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/idna-2.6.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/idna-2.6.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..878ecd2 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/DESCRIPTION.rst @@ -0,0 +1,213 @@ +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for the Internationalised Domain Names in Applications +(IDNA) protocol as specified in `RFC 5891 `_. +This is the latest version of the protocol and is sometimes referred to as +“IDNA 2008”. + +This library also provides support for Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +This acts as a suitable replacement for the “encodings.idna” module that +comes with the Python standard library, but only supports the +old, deprecated IDNA specification (`RFC 3490 `_). + +Basic functions are simply executed: + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + # Python 2 + >>> import idna + >>> idna.encode(u'ドメイン.テスト') + 'xn--eckwd4c7c.xn--zckzah' + >>> print idna.decode('xn--eckwd4c7c.xn--zckzah') + ドメイン.テスト + +Packages +-------- + +The latest tagged release version is published in the PyPI repository: + +.. image:: https://badge.fury.io/py/idna.svg + :target: http://badge.fury.io/py/idna + + +Installation +------------ + +To install this library, you can use pip: + +.. code-block:: bash + + $ pip install idna + +Alternatively, you can install the package using the bundled setup script: + +.. code-block:: bash + + $ python setup.py install + +This library works with Python 2.6 or later, and Python 3.3 or later. + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a domain +name argument and perform a conversion to A-labels or U-labels respectively. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + # Python 2 + >>> import idna.codec + >>> print u'домена.испытание'.encode('idna') + xn--80ahd1agd.xn--80akhbyknj4f + >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna') + домена.испытание + +Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel`` +functions if necessary: + +.. code-block:: pycon + + # Python 2 + >>> idna.alabel(u'测试') + 'xn--0zwm56d' + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the IDNA +specification no longer normalizes input from different potential ways a user +may input a domain name. This functionality, known as a “mapping”, is now +considered by the specification to be a local user-interface issue distinct +from IDNA conversion functionality. + +This library provides one such mapping, that was developed by the Unicode +Consortium. Known as `Unicode IDNA Compatibility Processing `_, +it provides for both a regular mapping for typical applications, as well as +a transitional mapping to help migrate from older IDNA 2003 applications. + +For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL +LETTER K* is not allowed (nor are capital letters in general). UTS 46 will +convert this into lower case prior to applying the IDNA conversion. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode(u'Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + +Transitional processing provides conversions to help transition from the older +2003 standard to the current standard. For example, in the original IDNA +specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two +*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this +conversion is not performed. + +.. code-block:: pycon + + # Python 2 + >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementors should use transitional processing with caution, only in rare +cases where conversion from legacy labels to current labels must be performed +(i.e. IDNA implementations that pre-date 2008). For typical applications +that just need to convert labels, transitional processing is unlikely to be +beneficial and could produce unexpected incompatible results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the +new module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification should +raise an exception derived from the ``idna.IDNAError`` base class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and right-to-left +characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is +an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext`` +when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO +or CONTEXTJ but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for +performance. These tables are derived from computing against eligibility criteria +in the respective standards. These tables are computed using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant tables from the Unicode Consortium and perform the +required calculations to identify eligibility. It has three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``, + the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors + who wish to track this library against a different Unicode version may use this tool + to manually generate a different version of the ``idnadata.py`` and ``uts46data.py`` + files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC + 5892 and the pre-computed tables published by `IANA `_. + +* ``idna-data U+0061``. Prints debugging output on the various properties + associated with an individual Unicode codepoint (in this case, U+0061), that are + used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging + or analysis. + +The tool accepts a number of arguments, described using ``idna-data -h``. Most notably, +the ``--version`` argument allows the specification of the version of Unicode to use +in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata`` +will generate library data against Unicode 9.0.0. + +Note that this script requires Python 3, but all generated library data will work +in Python 2.6+. + + +Testing +------- + +The library has a test suite based on each rule of the IDNA specification, as +well as tests that are provided as part of the Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +The tests are run automatically on each commit at Travis CI: + +.. image:: https://travis-ci.org/kjd/idna.svg?branch=master + :target: https://travis-ci.org/kjd/idna + + diff --git a/env/lib/python3.4/site-packages/idna-2.6.dist-info/INSTALLER b/env/lib/python3.4/site-packages/idna-2.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/idna-2.6.dist-info/METADATA b/env/lib/python3.4/site-packages/idna-2.6.dist-info/METADATA new file mode 100644 index 0000000..2ccb268 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/METADATA @@ -0,0 +1,239 @@ +Metadata-Version: 2.0 +Name: idna +Version: 2.6 +Summary: Internationalized Domain Names in Applications (IDNA) +Home-page: https://github.com/kjd/idna +Author: Kim Davies +Author-email: kim@cynosure.com.au +License: BSD-like +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for the Internationalised Domain Names in Applications +(IDNA) protocol as specified in `RFC 5891 `_. +This is the latest version of the protocol and is sometimes referred to as +“IDNA 2008”. + +This library also provides support for Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +This acts as a suitable replacement for the “encodings.idna” module that +comes with the Python standard library, but only supports the +old, deprecated IDNA specification (`RFC 3490 `_). + +Basic functions are simply executed: + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + # Python 2 + >>> import idna + >>> idna.encode(u'ドメイン.テスト') + 'xn--eckwd4c7c.xn--zckzah' + >>> print idna.decode('xn--eckwd4c7c.xn--zckzah') + ドメイン.テスト + +Packages +-------- + +The latest tagged release version is published in the PyPI repository: + +.. image:: https://badge.fury.io/py/idna.svg + :target: http://badge.fury.io/py/idna + + +Installation +------------ + +To install this library, you can use pip: + +.. code-block:: bash + + $ pip install idna + +Alternatively, you can install the package using the bundled setup script: + +.. code-block:: bash + + $ python setup.py install + +This library works with Python 2.6 or later, and Python 3.3 or later. + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a domain +name argument and perform a conversion to A-labels or U-labels respectively. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + # Python 2 + >>> import idna.codec + >>> print u'домена.испытание'.encode('idna') + xn--80ahd1agd.xn--80akhbyknj4f + >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna') + домена.испытание + +Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel`` +functions if necessary: + +.. code-block:: pycon + + # Python 2 + >>> idna.alabel(u'测试') + 'xn--0zwm56d' + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the IDNA +specification no longer normalizes input from different potential ways a user +may input a domain name. This functionality, known as a “mapping”, is now +considered by the specification to be a local user-interface issue distinct +from IDNA conversion functionality. + +This library provides one such mapping, that was developed by the Unicode +Consortium. Known as `Unicode IDNA Compatibility Processing `_, +it provides for both a regular mapping for typical applications, as well as +a transitional mapping to help migrate from older IDNA 2003 applications. + +For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL +LETTER K* is not allowed (nor are capital letters in general). UTS 46 will +convert this into lower case prior to applying the IDNA conversion. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode(u'Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + +Transitional processing provides conversions to help transition from the older +2003 standard to the current standard. For example, in the original IDNA +specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two +*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this +conversion is not performed. + +.. code-block:: pycon + + # Python 2 + >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementors should use transitional processing with caution, only in rare +cases where conversion from legacy labels to current labels must be performed +(i.e. IDNA implementations that pre-date 2008). For typical applications +that just need to convert labels, transitional processing is unlikely to be +beneficial and could produce unexpected incompatible results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the +new module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification should +raise an exception derived from the ``idna.IDNAError`` base class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and right-to-left +characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is +an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext`` +when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO +or CONTEXTJ but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for +performance. These tables are derived from computing against eligibility criteria +in the respective standards. These tables are computed using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant tables from the Unicode Consortium and perform the +required calculations to identify eligibility. It has three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``, + the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors + who wish to track this library against a different Unicode version may use this tool + to manually generate a different version of the ``idnadata.py`` and ``uts46data.py`` + files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC + 5892 and the pre-computed tables published by `IANA `_. + +* ``idna-data U+0061``. Prints debugging output on the various properties + associated with an individual Unicode codepoint (in this case, U+0061), that are + used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging + or analysis. + +The tool accepts a number of arguments, described using ``idna-data -h``. Most notably, +the ``--version`` argument allows the specification of the version of Unicode to use +in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata`` +will generate library data against Unicode 9.0.0. + +Note that this script requires Python 3, but all generated library data will work +in Python 2.6+. + + +Testing +------- + +The library has a test suite based on each rule of the IDNA specification, as +well as tests that are provided as part of the Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +The tests are run automatically on each commit at Travis CI: + +.. image:: https://travis-ci.org/kjd/idna.svg?branch=master + :target: https://travis-ci.org/kjd/idna + + diff --git a/env/lib/python3.4/site-packages/idna-2.6.dist-info/RECORD b/env/lib/python3.4/site-packages/idna-2.6.dist-info/RECORD new file mode 100644 index 0000000..45c34b4 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/RECORD @@ -0,0 +1,23 @@ +idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +idna/core.py,sha256=GafiWdYQIK5TSjWdRzCYCho704ALtMCrV_dnXXn57U0,11390 +idna/idnadata.py,sha256=-Cg83lurKoA9p7lb0lMAsos0rFz1dnKrGeBE3o8UuCA,32999 +idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +idna/package_data.py,sha256=KMSUTS_M7ZZ7Ugl_V_EOxV-D3o7v7yVkt45JK_bpW24,21 +idna/uts46data.py,sha256=YylQYBfljAx_WVqR2D7HgcGGyVCWwPm6uF38aERuhyw,184944 +idna-2.6.dist-info/DESCRIPTION.rst,sha256=XE7tSurJDfSB3AsHWf990INfSzTE5ysMEuqivWZobW8,7828 +idna-2.6.dist-info/METADATA,sha256=k-onXnwR756XWu_ISqwb-_NRl4Khz_Es9AmYkV0TM-o,8866 +idna-2.6.dist-info/RECORD,, +idna-2.6.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +idna-2.6.dist-info/metadata.json,sha256=f73f8l4pL23NliZdfccMvmdsd9l39J4YBcEDuTvZJY4,1097 +idna-2.6.dist-info/top_level.txt,sha256=jSag9sEDqvSPftxOQy-ABfGV_RSy7oFh4zZJpODV8k0,5 +idna-2.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna/__pycache__/uts46data.cpython-34.pyc,, +idna/__pycache__/__init__.cpython-34.pyc,, +idna/__pycache__/codec.cpython-34.pyc,, +idna/__pycache__/core.cpython-34.pyc,, +idna/__pycache__/compat.cpython-34.pyc,, +idna/__pycache__/intranges.cpython-34.pyc,, +idna/__pycache__/idnadata.cpython-34.pyc,, +idna/__pycache__/package_data.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/idna-2.6.dist-info/WHEEL b/env/lib/python3.4/site-packages/idna-2.6.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/idna-2.6.dist-info/metadata.json b/env/lib/python3.4/site-packages/idna-2.6.dist-info/metadata.json new file mode 100644 index 0000000..0e74f27 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: Name Service (DNS)", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities"], "extensions": {"python.details": {"contacts": [{"email": "kim@cynosure.com.au", "name": "Kim Davies", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/kjd/idna"}}}, "generator": "bdist_wheel (0.29.0)", "license": "BSD-like", "metadata_version": "2.0", "name": "idna", "summary": "Internationalized Domain Names in Applications (IDNA)", "version": "2.6"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/idna-2.6.dist-info/top_level.txt b/env/lib/python3.4/site-packages/idna-2.6.dist-info/top_level.txt new file mode 100644 index 0000000..c40472e --- /dev/null +++ b/env/lib/python3.4/site-packages/idna-2.6.dist-info/top_level.txt @@ -0,0 +1 @@ +idna diff --git a/env/lib/python3.4/site-packages/idna/__init__.py b/env/lib/python3.4/site-packages/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a6f64ac6c21e2e4ac55427dd3b3521fd1bce813 GIT binary patch literal 203 zcmaFI!^`CrusqU=fq~&M5W@izkmUfx#d1I*1&A0Kau^tL85yD&85lu)CWag)hL99y zhG0#WmyAF~nvA!&2KczG$)edBFG002-MgZ}rF_!=U literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/codec.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/codec.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24b0b1eb7a514cf1a24ae0287b39d57fe6ced160 GIT binary patch literal 3388 zcmd5;OK%)S5UzRb%s$3m#|}vx0@w)$Poy|O2*Du_LmZ)SSP&M9SQM?sGi@`=?CiQ{ zRwTxjkR7g^xp3fw_zyu`_yrvMNKUzsI|tyao?Y+S>p+4yFuPsT-BnZ7U0q*Q|K?3q z-}~VEj~{tNk7(>Ep}&Hb{R$G{Z%{(iF{o)!$E2o79gCV4b!=+d)G1N3L`Gy%WKrT! z)1g7%rKU^5rFNMjoA&X2h2D)y6gl(&S{)J&wX3ubWmPa-iprW%){L5Fcwkg0s%l16 zGp00S8jKo6o@RI?3SOP|v8XzDQxr{W-t>?+qj@tF)hU``R`UcedCfoZ*uX~pl5#{E zb|ayjNEGiN3D!lToPP1H++JU5?(x4!G2H|q=zE;WW%h)KH zo^i%>4BOoHw2zjHQ~STTXv{N{UXnFzK=J`fjve2UQ{10sQfI=xDaZ-#vE&@uQ+8g& zX#=5KZne^&BU&w0ZM8bxsGo4(YqhreK~iwE8w=YbE4rsmm0^a@HnTxIvtE@v6QUhF ze6%ZQ**TEOh-OG3oEcKKn!TNdQglR`2gxlBD;ct8e)uf8uYe& zU@Y1#(T+{>E2c;y^I6C+DrS*Bu5E#1QC9G)bd81g1|nN~1U68zNwkaHWz()p_f}ce z>fNifTc#bPDVuWGC=Xy|?6@RK%hn3&QitUW6VM&9ui0iuH;8!i0>Ec}n-W_AgnA7y6HD}Bi+l!MCwtQH3 z!?)!uZ-^lzPck{rG7fUjkUaiRf`3)llBWd!jpqyg@-TxVeeatj->2NB zHUd-UbYLM}(m_}Zhglvm3Sk365JgBL@(#h~Ck>klVDs%5YygujZ~&WvUn^kqa0r`+ z1ol6{2ABYT4#DOR4I6hHHkEPM{8GTCItd$y9S0ll`C+3UN3?9GCo&9i0T_1)gK~O5W~q5uj?D0){qG?B)Fqg!Dm^Q9-))@Z;p|81i*+{8?p( zT`9(l=#r!H!uLq|8i+DcncT43>BWgC@Wm@rXW!AKLqwCQU$6C8fkA*D-3PDc*v*u$ c7Wb#?9JU#U;u7z|tef+v<`?JvbJjWQFG4nrdH?_b literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/compat.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/compat.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be01cf8c194f2420fbb9ebf60d22ae7139a53f1e GIT binary patch literal 581 zcmb7B!AiqG5S>k$HVqL3e<0VWwM7s-6j7>&cnCu4L2qexk-#RqY__1{N&Oe`mvZ%@ z7eBz0GpQ93Jh)`uzGP=--n_hrYr*N+)5R+QykLAU2iYM;Jx1X8FpvPVFUF8Lz+HF* zxJ1$c?zP+n-UZ%kIezqE8u#BAmWWxyHgjUMXr~Snj5!9meV9Q2-%t<%^^Z?}`<^eEaL zjrJq1L>*PiMhjcWq83q=l|mb#BW;vbxsqtfMyhO5YAH%lS;0??QHK1je+%?ix5?s_ wz7TmDdrc=-Ml>GD&s$pzDK~WdqYk-l+G+i9srW*Q1NwQjj}WlH3Ej~B1QBv^+yDRo literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/core.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/core.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..033eabffa5998c398be53eb3dc624f5ff4520010 GIT binary patch literal 10077 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 JI(XpF{{fTi^%ejC literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/idnadata.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/idnadata.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95c370828e43802026be087b02d112fd63f29ef2 GIT binary patch literal 26983 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 K>i_l8`u_n5Gpwcn literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/intranges.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/intranges.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ff1d93cf2ffe3cd632e53e27c139e2a55325333 GIT binary patch literal 1875 zcmZuy-EQ1O6h33`dJ|_uMG7UMNQ{DnVv%mzAZ}3lBdChRMLB+6&`^{s8C;l_u$62T;+xb;3j-$y!oMGlKDAv&V1+i{O#ZUdH>6=fB*JRkLWMD zHXNKEVOCGDBt%23f)a-^K|>r|N;>ol?j1_Hlz8@x%N`{&_S~UlmJ;8dA>hzfFc-}V zBL9o@N0rM+W@%+)F_LL+)L7|iRZgNr$-3mrmEEFLqdLou1Bh0WD9dDCPj-}MZdT-D zsq4J*LBvH~skkOF z%9dWY^m-r%gF!Hm&vx0~ygGz(etJ-=%0ew4MwL90Q+PkkExXX^IL)KXe&EAp*d$Fl zQSz&mtQfC+VC@cqfqw?i(q;^o*ntQT&(ATdKd>006QUP_P6dsLPT^^nPF*_sjf^1U z(1~C!{vUt;Go5zm1U?t^&LwA`NM|es#!|a6e+kRtzQeqOkLVzy9Eu=>=z%*0`PHGN z(=MGjwC9omwvFKuZvbP#7Y?fykcUkG`o>ss+-(Kj=r%s<>4oF}C)g66LtGVnna7HQ zqN9AQs!x51F^x-j*9IcIdl{Lq4OPgo;^3^xs*ZQz_Q?Fl_ZH;*BhJ(AdnuiDiF1F;9Ib#*1Q%fkBdYl{0UW>kF%?^o92()*pMHu z%M-?eiFsjI*3@ODs)0p26$w`!r;#@mgmN{VW3SP^U&UA|1}hwbm$v7UC7@KGgm*STmDytxU^1 zJ9U~RcaDl;ryM7rtffgFO_$uXh=cODxe33vR5;Sb#A@^bRNcZtGkxLVZ%Nz|?}=Hl zD3*oq=r_QLxu@{pou|!oHUVjljCz11{A??5HqRvPtZjkQbZvMV7cQ_@?K002Gg#io ztSqpwbbL`xymv6Ik_8-EB@cP)(4!GIr0%A^0gmSP8Ha#Jr#+rOKY#8{tq_gSuPH}3 z5_J`hWjwqv<0j6R-`cZ?Q!`$HXsa5Zi~2!HqmuV*C8N^##+}yTeuwlP8IWydI<&Zi z()tb}C^%FaN)ooZ`+|xexH?hnxkHY?E3}C%uIaXLZHM4i@bU`o8k9GM;)d|@;wd}? z@BDQCu`)_e(i|B+lG})TxGhI$#T7T&LKa|5+i9B+-0Qa6Ih}@{&G4{s%c5#JEQz{E$GfHx;p@?O^C~Ctb6}!0 z{}2#uMmjgdg4-AGA|HFs0`jsidP3i3eO}WG!=#AAP`?G*rl~cwwTWe}Y2sAXoO#X6 Y#-vE literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/package_data.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/package_data.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18c17ed027cfb9a748355c220db721180f000401 GIT binary patch literal 153 zcmaFI!^`Crusl+ffq~&M5W@i@kmUfx#auulg@GXoNHQ`6Ycf?a8|j((X)@m8j*l-( zEh^5;&x?;=$xy@uR0k%08S0nh7U&mb7U(9GX6B^mR^;a=6{M$_>Sw0pB|?aT#N_P6 e^wjv2#F9k4g34PQHo5sJr8%i~AZv?(m;nICHzqOw literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/idna/__pycache__/uts46data.cpython-34.pyc b/env/lib/python3.4/site-packages/idna/__pycache__/uts46data.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81a6f41003b32a6b44c7c6cfdd70f7e6ffb52333 GIT binary patch literal 230858 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

    =)z93H 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%0DMUJ2=FoC6Tm^jAwVOc3D8Vv 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
    6IVKZM| z2%816KWrAti(#`!UJ9GVa=Xgl`nS zC48swJ>jIn4}>2Tej@y=aEkDY!moti6iyS)DEvr=Q3Ka+y6)F)bD^wv=Rj5X&u26$eQz4mfvBD*US_-uZmnvLFsH0GqP*0&gp@Bj} zLL-I7geD423C$Fm6Iv)-PPjs$CE-eis|Z&E5@W3Z^Sxl_xrQ5CV`Eb6TEcY-*As3~ zxRG#^!p($R6xtAORcK4NP2qOJ9SV06?owz+xLct;;U0y13HK>*3gJP8 zPK3@1KB0?3SHeRI-3SjWbSFHb(1Y-(!efNT6?zh$P>2zFDfA{hsnCb;ltN!ZKZX8; z0SZqOo>6#~Fc9E=b`W5D!eDM3f{pGAHiTgc!wIPhBM2iE(g^7aqX?q`iLo&N`;23` zaU3?fuc8npC`=?wQkYDbf@+BOf5%W~_QQ1z>$ER=q5W{(RQJ3)yQj$ib#+xM_g}9% z37+TA_569BKi~5gc>Y4qU*!3VJ%5SkFZKLop1<7lS9tzP&(HAuOwa${{mrJ}EnYVF zqP3AX&bj@lwR;hRcXgi*Uma+h@^;u{$~$4RO5P2d)$(50tdaM_ zX004{jT{MOog59D_3}a3Y>*Fe+fN{g?t$!`FQ2krAjep*l;f@rzJL=v{EDv)lM~#! zSUzLDNIplM+av`e-DW8i>9$DWNViprM7nKKG}3LCVv%l#6pwT}r9`CLB_+dd!XPOX z=>|*bNH;{vM7p6;Hqs4~a*+O+B=zb`VuvcLp;RS{L zgclWFA{#VL}mwqJ&}! z#R(-8N)k#blqQr>C`%}(P@Yghp(3G@LS;e~g{p*V3e^cU6lxNZ6)q-RqEL%aTj5f| zWeRl&bx{rR{_hy-EPjn&cX!bX?Ha$Hd)}ShQ{?};xT=-=Pp|P~p5M#!dwc$qp5Mpw zpYr^^p5M>&`+NQX&wtwUpYi->J%6C*5AyuMo@#OdksZt?wp)f)!M!JzwDbl&$G8gIGZ<&j9 zqoiu28!go$-59AJ>BdTpNHKb%@HjT*CW~@?m?s=1|ht>E*c@4BHAI^BYGkFA_gJ6d@gQ4q!e&55aAVc(FSol zq9vjMxT`iJb|YRvcokhdUIkTE z7o8D35xo&!9T%51NWht+J`Y(9T;-r4p^-vkLKB6igk}oO2`v;ZCtRV>l5nNMRfMY* zS`n^MXic~lkQloTU{^}lqqZxk8zO#V#BYlD%@MyP;%y>+YsA||{I-bS9`QROerLq* zig>$--yQMx5x*zm_eT7_hbrJf6Vibd;ST}|IG70 z_xvwB|4Yvo&;QEvzxMoZJpWtI|IYKj_xzKd|AXiM=mpncKeZ9BTl|uzY4`XgkN3Dc ziMB?xMGQoYL(D~Zt6d}_yn`-&L3oE;)IcO7I=avcyIi=in>Boz`)`pv;5hg_Kdze| zND3sM-X;*IneyO&p{u0Rf1#_T^M9dh#Q!gJt#olJy$}Ns+i)X&fT>%8hqFB*TLakv z(Fdrv2_E3ihz7R{bXP=!`*XTVc1JXR+f}m1seFX+-g0p*!h74r-G~%K4B@@wUdd~5 z9h!jZdQ^$1ZbX%Y>Sk2gP_;po9aURYIZ)k>DkrKtQRPC_4pnYc?NQ}HbuX&Cs5+p^ zhpHp0{HRh;6+qPq)kUa$R0UCC5lSIc-B1-q)g4t4R6S4?MfDh}VyJqeDvm0KssyUu zs7j*hgQ^s&zNkvOO3EP0BFZ7kBPt*&A}S#&BdQ>(BB~*(BWfUOB9ajoBQ8PILexfF zint6>2T>PM4^bb{0MQW92+n;$t`FNhzmoiB{|qKGe!_>zb( zjrg*NFOT?&h_8%zM#M8CzAECY=}ECQsDm%&taX*USYAh1udsozQDGBdv%(g_R)uYZ z?Fu^xI{}HYT>!iC-HqC=eD~0kVtY{s4{e{T+(UbTuwUUt!b=JV2rnzVLU>i-HNxuv z_ti>(J(4$3+aoy`@k0@RE8=fQ{GEuuOHYcuhdOu`SkCTQyidTYc5s-0#qA)AfHm&m z2mwpo!BGNMyn_!2SojV;Bw+nJ_=teRfP;?-I2t(kgn)yBgHH)KHaIv&z#+oHaYBm1 z2?7on?iQaBaNKb4IRS?c2VW3y6mjq+0S6NYLclS_!B+$vS{!^$z!Ap5Hv}AL9DGZ_ z@y5Y-1RQo8d{4m9$H7U0P3{MRP3}j6P3|XxP3~ucP3{!ICie@$Cig4BCife`CU=@( zlRHDO$^A~S$^AjF$(<#n=(GKkV3RvXu*rFq<9o7AE`eZ^OC;Fjk_a}rYy_KJc7jbV z2f-$nlVFp}MX<@`CfMZi5NvXJ2{yTW1e;ubf=#Xf!6tVR!6sLbV3R9Eu*nrBU~+$Z z;a-3I1$W_I#JvLNUAUkB#nb=YUl09%y2KAI+&^n0m%D2XJ)dCl%N1yYi@27kf{VB- zQ3V%qSE0fJm#a~ALe&aYa1nP6Dy(H`jS7ocu0@5_E7zgIvX$#mVZF)?sIXAwMpRg# zauX^nO}QBr)}-8m3X4(Npu#GYTTx;8Nn2D{cXAslEI7Fx6;_(ufeK4Z?nH&PC3m5k zkE$IitR}hJRni`D58__LeTWW-`w<-x475r~n9G(8A$4PCqpXcKS&s z*y-nDf}MUYAq1zN#8@rBe0}w5b0gM@dwnk@*w8K`*wE?_Y-n`}Hne(#6ur~>giZ<# z2sX5a1RGi-f(@-P!G_j^U_)z4u%R_0*wC62Y-lYAHnhtLHnb}UHnf%m8`_lw8`@O_ z8`{+b8(J%Z4ec6&4XrgH7@GSDUxHmTTt~3UT~Dyd-9WI(-AJ&>-9)g--Au5_-9qT3 zlWRk;$=yn@$+aceqM~0btc&4e1c7`3&AGWm0**5h|ozV z*NtG4dzfI8>rSxAJwmX_^&r^f9wpf19wXS~9w*r3dJ=4MPY`T!F@jC57a^EjVyrh{ zzCN!fxzUE!hY$=cG4@pa*0CY(L;f>{I*b2ULWAEfxGU?v?#Z8bWsPCCa{uX%CH#A3 z{g1zR9>21l?=Elj${H(N7NDJvY7r_dVOfj{Ygd-IN|vEbLAxAPCsZp?VI|5+RG5ln zxJok7V!g>KR9I-T8WmQUtU-mPC2LV(P02b`SWL1W6;_dKK!xQa8&P51$R<=c)X8R4 zST3>!71oJtb(L&GizAtAN4oW33mbML_P}sJlD(*KB$9pD@B(5#;zh(u zF7#c)0kkh8UO~Kycn$G7;tj-`h=Yhjh_?`LBi?bLSN`v!eGlhWH%u1>#GDAihF;jra!fE#f=G_lT2-9}qtxenR|=IEDBH z@hjpt#A(DC#P5hd5N8p8BF-VacU>eP5)ny=Y>4cL9EhAQ+(lYHx2D5A(0y^TKLGon z+c&8EFJNWuz1Alrf5cUEjSdqX~AhA49P7##n-#H^u?x>xYl$ zMyw9^q$fl+PUJ?c75B*|5wK(&OeWY+rV#8DKb2so_-Oj4CO%jL=43kL845UhXHf2{>xIk*p-x&@u=%v`m5xZ56?Wwwho=TSKs+ttF)B zr(H+rq_Cb~liNVB$!#RqLJ?pJ0=FkzkX1iC~jEK(NWZOt8tlLa@obO0dbjMzG1f zPUxhQdxKz;dy`<3J4mp}9U|D|-XhrK-X_@O-XYlJ-X+-N-XqxL-Y3}P4ijv0Sp=Kh z5kfGz#Mn{5e0`!Ha3hBHpBKz<_(7gixUPZs*`EPpuLC-(r`EPmt z+n)c9=fCUykG?*g%U#OoH4N6hQFTI91Qiyj6h(!VDaBkR#nECJN(oe0e^L?^7M_$sg%u~IQDLb`8B|zf zQWg~!my~mrlt+t|Bo$C$2}wm%IO<6yR9HDu*;P^nQ58`Q8*mJh>Zow=k{Z}h6OoL# z7;y=r7NR!dQp9C0^rE^B+Pa8(i28^Ih=zzph{i7T-9QtxO%cry%@HjSmm{t~v_xEq zxC(JKq7~vAL~F#gi0cqHB5p$5jJO5S25~E*E#fxB?T9-NcOvdWv_ssDXpguDaWCRN zLnN{5GjZU5uFg75k8^|qATJdL^s64i0+6-5Iqo&A|7+$E&x7qYdYKm9ehl% zGtVc4;LMX4`xG$Wjmh2m7&qEE<~YI5F((Lij`@sW=a|n4DSD@05IQM*Nw9N_5Q1}z z`(@mK`FiWGxzSE9-w^Ed@-4wmFW(XD^zuEyPA?}3c6#}N5S(5TV?P4s>qGd78|}>U zGr_J2P7$y=+$;GD0gJ@JuLK+$9Q;PG$($wxlSzu5Az(eZ5BZ&dW#!-xg3aqJ!RGZR z!RB?2VDs{-#CMq#z0(9jCxt|U%`1rz%quCDjbPUV*$FnZ90VI$PJ#_B7r};>n_xrB zL$IOcB?LoDisd8NH9>xYO|AgJt_dyz%-1JckQ;4ig$OpZ!UP*y5rQqJq5!+UV%%u+ zDo(I@l_1!>N)l{dr3k^i5@V$S_6f>xV=$`3SlP(Na@=S$C{M5%R3O+4DiUl4l?XP2 z$^@H16@o3CssMX@)wt1K{^|rW>QRRR*96E~=kKg<;AwsIWBUSyWh)G7uFOqYOfY zRVaf|Vfo1rR9JU16crYn3`2#LCc{x-iAgFdtSuRV3X4icqQYvDG*?MFViaODVhmy| zVjN;TVgh0!ViIC9VhUm^Vj5yP;yJ_xBVh*^l)h&hP4h_3 zVjtoK#D2t!h?fut5HBNMLA;814e>hS4aA#>gNQ?jw_Lc3sa8Co*_r1Wf}MF<6YR`$ zEy2z_*AeW@b3Fn3r~5275bVrzBf-u*Hxca2b2GutJhu>1^iJCl?96j3!OlEw3D~dQ zh?gX3MBLtgV4}wkZQG!kGF@jC*ae_^*C&4E71i>a3BiQ765o~h32{ySW z2{ySt1e@Gb1e;u6f=#X;!6w(AV3Qj_u*p45u*p3`u*p43u*nT1*yIKgY;uDMHn|}L zo7_->O>P*$CO4d5lS?Jogxio@JE}dYL8%40mjV9RS#t>|BV+l67aRi&( zc!EuC0>LIXkzkXXM6k(CCfMYr5NvW&2{yTD1e@G+f=%u@f=zA)!6rA8V3T{EV3V6g zu*uCP*yQFAY;to6Ho18Oo7{YYO>P0fCby7alUqcv$t@;ea({b`-MCJP3+)g>^3Pqrw80!>F*b zB?}dnv>ZW&wJb+bVG+v*sIYqFLsVF{@)0VmSNRwf7OH%L3M*7TMU{f;7%HquIgSd8 zQBI)3(B(5!Sbp+3Dy%#C0u>gVe2EGxO#~H|n0$o_YfHXHg+(Rbpu%dBZ(SwdA-+eP zMErpG5%Ck^XT&MQFNj|ezadT|&LDnA{DC-&_!Dss;l1Y~0g;GELS#c^N8~`{MC3x` zM&v={MdU-|M-)I@geZt8geZ(Cf+&h8hA56GfhdV6g(!_EgD8tAhbWJzfT)P5gs6>${gXD7kVJi7>X=GjfK zGtV9Z){1)^dkHqVeFU4_3j~|oeu7QzMS@N4C4x=v0Kq2rGQlSI3c)7#D#0fA8o?&_ zI>9FQ2EiuxCc!3mkYJNLM6k)dMX<@eO|Z$mL$JxcOR&kkN3hAgPq4`yCfMY%2sXJR z1e@GZf=%uNf=%v2f=%utf=%vYf=%udf=%vIf=%ui!6tW{V3RvRu*rQ!u*rQ+u*rQv zu*rQ%u*nI*CifM=CigYLCie}&CigADCifk|CigwTCU=rxlly^SllzfillzHallz%q zlRHJQ$^AmG$^A;O$^AyK$(<(Hp>|e!6uiBV3W&Du*u~i*yQpOFuA|I#%?nG zg1g4f=U#!%?z!`ScrjbK|Ngzk{vTdrH+EM$x*V|hr3qTBdTELZ%UznG!aA4csIb7L z1uCp;xf~Uiv|ND-Ygt;N!XlO{QDODURj9CR3M*7vqr%dZYf)iM z%5|u)80C6YScP%}suWZ=qQbh9n^5_vZbpTjLvBHZB_?f9VQtB+sIaJ{Eh?-gxy@B_ zJK_$+ort>-?GSe(+9U2k+>5vm(E)Kkq9ft~L<-_TL?=XNgpcTg=!$p<(GBr1qC4Ud zL=VKHh{q6*BYGm9K*SKe5WNvkBKjbnLi9!SL-a=sKs=3j2JtLnAYu?=Fk%Q|C}J35 zI3g7>0x=SihDb+@LX1X?L5xL=LySjEKuknTLQFd5RP4%u|A3XP%M-JM)wx z*qNs^!OlEo2zKTvORzIfIf9*e$`kC&Q-P48Pp%@t&ODU}zTToT0qeoN9#sf-=BY}s zGfy>woq4JguvXlC)F9a8Y7%U6$po9+#RQw&B?OyXErLz1Ho+!$DZwUp8Nnu3hhUSd zOR&k+BiQ8X6Krw~2sXKf1e;tVf=#Y5!6w&)V3TV~NYR(D8NnvkoZ#y%S`chv27*oQMuJW5 zCW1}wW`a%b7J^N#4Z$XNE5Rn$mSB^+jbM|zonVu@gJ6@plVFp(i{R_z+7WDWcN1)K z?Flxydk8kUdkHqV`v^9<4g{Or{REp_M}kf60fJ2~g+FP0Az) zqry6uIjFF}WiBeLY?+4&OIqfm!djLEsIZ7-p{q_My6S~BvM633*d&W_i}|?4(zw2{ zMwYQ&E6Z80lNGGj%SzT8B!l%v$z;7rRyfgXb(-u!o#bAwVhWH%u1>#GDAihF;jra!fE#f=G_lT2-9}qtx zenR|=IEDBH@hjpt#A(DC#P5hd5N8p8BF-Va_k%0@7!RX%zUxJ>^IdO(o$sC`*!ivx z!OnM25$t@|mtg0+egr$;^(WZ*ZUEtFSGg zMi{P;N*JLql8~m5P8g*ynlMITEMc6&c)|pQiG)cClL=E4rV^$pOeZ|2FoQ5t;d#O= zh1rBT3Udkb6y_7`kuD%C)LSefELK=TSgNp$uv}pUVWmO_AyZ)$VYR{Q^ACbx%R zliN$M$?YT9{4K#I_Z`6|_dUTTcamU}`+6QSW{LJi%S)1Q+$erS}^fCDDP_nL0DxCe1B;yy$N#QlhlhzAfUhzAj!5S=kQFut(a2VEac?g6$v82)2JTC)iwC5N!XroM8LM z6$INqS`w~wl^fJm1e@H|1e;tdf=%ukf=#Y9!6tVt!6tVd!6tV-!CsFW2sXJJ2{yT# z2sXK!2{yS~2sXJk1e@Hg1e;u2f=%u=f=%vrf(_~pf(`0Uf(_~}f(@!2!3K3V!3Ncy zV1v4cU<>(Pg1yN15$q-GK(JTreu6!Yjs$yh4-o9>rx0v+c#vSbLnngm4xI_MJNN{9 zq+JNMJ9H)3?(h)7o=Z1^?G6tU?8$W}*zWKM!FGop1lt`RCD`up7{PXj#|id&^d#UF z``at?x(6?~EAuDZ^Ztt~^Z%{?3gQ3YEAhdV`4?^EA$PSCYwf;(r`MpHrJIAGesici z%zBt~XFXgVVVx>HSdWlLS&x**Sf|P3sN-KP?it_UzP|nh>$MVNy-s?uUN5~_Z;&Th zZCbwb3}C%oo@Tv6o?*RHo@KpD2F7dm-eC~y!7|v@G88ck zF&vSK7=ajxNOQrr0_l)Zh|!2Kh_Q%qi1COCh>3_vh{=d4h^dHai0O#u5Hk=n5zixL zA!Z}yAm$?GA?70%AQmDPAr>Q+AeJJQA(kUnAXXwW5SfToh}DQSh_#4yi1mmKh>eI% zh|P#Ch^>fih#iQXh+T-?h&_nCh<%6`5c?4?B3?oqK)j52#f9#Wv*a~b>vw71K(!@r zaM=*!aj}=H+;v26!jlSp2u~^WCG=D1PZ*%^G~pSAX9)up1`!4;3?U3v7)BVbkV+V# zFp`j_kWLt-Fq$w%VJu;s!g#_2g^2`vJth$*>n)}brYcM$Ojmf0FhgM`;dzBwgxLyn z2y+$Y5#}o_AS_f^M6f|ECfJ~s5NuFO2{x!@1RKc~!3MRGkl`w~!(U>${a+ext9VHd%6hus9*9rh4xci2m?-C-ZWUXK?D_KNK%*du+BVEe~Q1lvCj z5N!W=nP78yg<$)~s|4FWUL)B4@jAg4@*4!3+?xcO+(Cj(?hwHy_ZGn>_cp;M_YT1( z_b$O+kM{^Rx%UY+xx)mTTo%D5cZ6V*J4&$0eL%3ueMqp$eMGRyeN3=HeL}E7eM+!F z9V6JFjuUK9CkQsE&j>cC&j}f>atrwjg1yLJ66_@ug1us25$th%O|U2T4Z)uNw}kIp z<-QI2J;1&VdXgJ)divX|^m_t#MMq~carj5vk(1@SB5H^gbg8N~01KM-dTesWhnGkK z>!p&&dZi?>UM1OFE!pFcHBxfK>%(g$C+iH!#d?$Ej@Mb~l85zB$;*0}Sh|3Ul5OoptT(|@Mk37m^ML770fQ8}UX9CuTgHr@769>N#uv#4a zO2DFV@EZYZ$H8d=mXL!p1gsy8o|1D zpCy4{k2H~Bk2Hy3k2D*>9%*)hJ<=Qmd!#uD_DFLP?2+as*dxtDu-7y%!5(Qof<4mw z1bd_f2=+)XBG@A>NU%p*h+vPjFu@*a5rRF^q6B-S#R&FDixcdTmLS+8ElIFPT8dzg zv^2pUX&Hh&(y|15q~!?qNXrxKkyaqsBdtiVM_P$skF+u&c%+H3DuDUAGOBW8HCMUa zt2&{ELQO)l!o`G30Pde^0@(f4=Eh60F)4N#p^idbLOq50ga!%?35^sQ6PhSAB{WlL zPH3TUIpGS0mV_%6t|DBm(28)4LTkdc3fB>?SGa+2qry#un-y*$v{AT~&{p9#!tDxo z5bjjCi_lKtZbEy7dkFU`+(+o3a6h4=!UKd9g$D_p0Ew~A02`~%jkZ^GAq0CxVytWA z)(>%GH&?m4dN{JNJ2wXNPmDbh+1P^{ZS;>4Z1j&2Z1j&4Z1g<|Hu@(BHu@OBM&FBI zqwh_y(LYJR=>PW8zW&@&7uuzLANRb^yR`4(jv%evfBJVyM|l27&rkFGbk85<`Tzd- z`+xth*#}>M|GJITch@s|x!M2~PV&KJ(&6>e(1F&=r4j2D(wKFoG;y^wC2W*tfaZj) z(gJWbVWqSJTt~=|>j5{!!ClAR2)KzbOl}6;LP(W1@!DOv-pYE5w8af?BW#e{XBi9_f*49&CBp#2I7#jqz`y0%SLv-WN$i`vZI9xZT zMmCP%#*w-)EwVA48%OEJ(UFZ~xN)p*92eO*o*O6V#)*-Qlelp*HYUZU5T+_jBTNS* z#-0P%lbykhGqKVAD>;N&fW+8rfZciyHwG_tVr*_?<2-J(7j=GQ;{tB97jMHkumPIx$=f)Mfab;v<1~+D6V^VAt!RE6%a_cqRxE8lgjIE1oT+fZc z@RDL12pe(hq}V1xFu|nQX2KTSA~CiVU@zo0ZrqNINwFOS8{>=#uMq4&75^UMLM6hLZfM64T8DRJK3O5E5PKv!sc+FMr@x4w6 z#+(#;gYYJ9kr+D&u=_j2jc@73w<8@XoqKja7@7P}H%N+oP58!D?$!I2VEe*%1lt$BC)mDlk`U|*NwFUYKf21@=}!dP zA$}&<4snWL>;4yjy;#3;qfPWTf=%=^A(&`l>`eT_|MnufL9Wsl+C}v5?#Z8b5#9B? zi|8$$zt!`%dH#0K-{JW?J%5+y@AmvXp1;@g_j&#cp1b%N z|C;B&?)m>;{L44~XP*DL_s_ph?Vs}eUp)U;&;QNyPka6u&;Q-?|M2{?p8u!kpYwb# z!B0r=6BGQT1V3AXpFP3Pk>KY{@N*^jxfA?634Y!LKVO2MKfy1M;9r#B7fkRACHRFC z{2~c{(FDI(f?qtrFOlGvOz=x3_@xv4G6{a!1YAVdESKPUZDf(V+z79p-DS~Y2YR`( zR+g~Nkfp3Q$+CFuE_#={I@qIS1$CILWIbFmSf@&6ymlABt5|Q5)$!VW>2^)Lc3-+( z8?W7U@Va>IzI3~u^?KRBdbw<5y+Ssz&XmopSIZXG8)Yl&&9aU4R@v@qIq4!+$L(bD zBUXblsW6y0s)JDC*Uc zY(Y`KmShi#2DKzdP&BM1IfJ56Ey)!WjcZBnplDJ{@&rZGT9VflQV?BI%?FdEkXD_N zrLb0=lck7OezFwRs!OsI)2eH-6xZsZWGSIlw`3`))x*hBN~`Y4Qd+A=lBJARJ(8uY zR*xo2IjtT`mhxIXo-7r#>X|GRwR$31Drpr0EQBV0frMs07eo5mW*@QWOxr8eL^9b_+3kVAViwKJWO9)E=%LvN>D+pI<@N`_Qq2*g~B_~(u zNiWAWgw=p+3D*IxC)@zIk#G~>X2LCiTM4%TZYSIUxRY=fU=87Jz*@pOzJzNWlh5FFM^%vcB z(wRj%T_>GcthaWkZ#7w>w_GQkS*o}6c{OC2-g2FEX1U(lt8InaI_J50k6fkcygp#N z+C@9Z!m`Ch+t$my*s#l1J*OWuWQW?4D3{x} zNVKjLJv8dUc0nCTwpP2<`<$-#2^9~vZ&|%>nRx2<((}F*;-x~m7-8sksMAQKHiX)@SEQ-!Y#VZAe=ak@`S2Epel!lmtyn-KZfnP17(n8|o6|T1Mn?xlT{pzE#6u zJxtQWbUn<_!+t$@>mgPT8G3k14`=o8ydKW$;Tt{JzEi`MdYGpM^<0+5XR4Od_@onB zPUCZ!pdVn=MKTC2r}4=o=!YA%M;4*wG(On`{otea$RQk2TMBXw?DO2VM|GanJM{rd zfm`oXeblt0P;DtFA{^7;=_uBqAE?yiaZaAllU|MzLa7Gz^Lh=g;~h^&x!!KMWCeFT zi5)9B>FKD_+btJ5MOSCi*W0eg>C&_rkk2;oz}XN1oIUl6_od`0*g@D1St;9J6XfbR)E z0DdI=1o)Zo3*cA6Z-Czke*pd@*haa&9X!+@`1bMyco8lFv?8~(wv?E*$Xiw+> z=t$@U=uGGW=t}4Y=uWr<(1XxZgQugHhL&&h-kiKtPkK4}5c&f85&8oL5C#GU5e5T> z5QYMV5rzXs5Jmz<5k_lJKWEU;awo@fa-5#@a*QWT(BSEqsG;RSV3OW;J#u(DCcF6* zH^0oyr@HwxH=pk2Gu(Wpo6mCd%ia76H=ph1bKHEcn_ubX^Nj!Hl4bfkf4e2ieD%Tq z!;(d>?iQ;5@kXNmELQ%04bv*sFi#Hy zsrnM3s0lPWgzJj*HYC{W`-xOD^J6ZHBaB)D=r>E7Tc)Of-1= zN?V3cwX|dSCdtJNzdUJgMWl2vQ6G~o9d+O?Bvwl&Gu03fE}gB2l`dA~NLMQ=rJD|1 zLu{&aH&gX7r{oe74FP%5gQ3Ih4jK^s zUnJAaRFlsMnQo#XGDK!raad+r7dn zAS42k2+4pHLMkAQkPbLZ$N*##vH;nH9KaDmE+CJP4=5lU1r!pB0LKW$fa8P{fD%F} zpo~xss34pKR1&HHrwG-6(}Ws8Euju@hVUrhF~Z}3CkRgho+6wDJWY58@GRju!1II` z051|=0=!Ik1@J22HNfkHHvn%E-U7T$cn9z<;T+&S!ux;^2p`eJFQ5TyR68PHH;%!a<>j# zcXGb0wJPPPtmBS(MY5iepCWcE@?--eFHtr!3UXzWiTadc*{lLf#d{1l6a~o^E9zvc z4&0l(Alb&L<9>3V6^XLliagn2MVZ{M1J_WLC=P4tjO=8b2$WqaWVa<*vd2Vyx{o|y zqM;;1_F7Ra4>HQUWgnw7TprSao36}}hdEW@C;Q!|a^(?gs#p$KQ7GP4)QAtGGE;o5 z$Pzyj^%?57GfXs8)=B`QDqjMvsFj0^Qw0)aqCPWAf_1p=cUGXEgjiEG5^AEM`hr?SFIbSo0%uob5y!$hO6k7Syt Iy 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 RS8I 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 + break + 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']): + 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))) + 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') + try: + ulabel(label) + except IDNAError: + raise IDNAError('The label {0} is not a valid A-label'.format(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 std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and 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) + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + result.append(alabel(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'.') + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + result.append(ulabel(label)) + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/env/lib/python3.4/site-packages/idna/idnadata.py b/env/lib/python3.4/site-packages/idna/idnadata.py new file mode 100644 index 0000000..c48f1b5 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna/idnadata.py @@ -0,0 +1,1585 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "6.3.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 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, + 0x101400001018b, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009fcd, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b002, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 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, + 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: 68, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 82, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x8a0: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 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, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 85, + 0x1886: 85, + 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, + 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, +} +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, + 0x5590000055a, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8a0000008a1, + 0x8a2000008ad, + 0x8e4000008ff, + 0x90000000958, + 0x96000000964, + 0x96600000970, + 0x97100000978, + 0x97900000980, + 0x98100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 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, + 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, + 0xc0100000c04, + 0xc0500000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c34, + 0xc3500000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5a, + 0xc6000000c64, + 0xc6600000c70, + 0xc8200000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0200000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d3b, + 0xd3d00000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5700000d58, + 0xd6000000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 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, + 0x13a0000013f5, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001878, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191d, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cf7, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001de7, + 0x1dfc00001e00, + 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, + 0x31050000312e, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009fcd, + 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, + 0xa69f0000a6e6, + 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, + 0xa78e0000a78f, + 0xa7910000a792, + 0xa7930000a794, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c5, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa9000000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aa7c, + 0xaa800000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe27, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x103000001031f, + 0x1033000010341, + 0x103420001034a, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10c0000010c49, + 0x1100000011047, + 0x1106600011070, + 0x11080000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x11180000111c5, + 0x111d0000111da, + 0x11680000116b8, + 0x116c0000116ca, + 0x120000001236f, + 0x130000001342f, + 0x1680000016a39, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x1b0000001b002, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/env/lib/python3.4/site-packages/idna/intranges.py b/env/lib/python3.4/site-packages/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/idna/package_data.py b/env/lib/python3.4/site-packages/idna/package_data.py new file mode 100644 index 0000000..fc33139 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.6' + diff --git a/env/lib/python3.4/site-packages/idna/uts46data.py b/env/lib/python3.4/site-packages/idna/uts46data.py new file mode 100644 index 0000000..f9b3236 --- /dev/null +++ b/env/lib/python3.4/site-packages/idna/uts46data.py @@ -0,0 +1,7634 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "6.3.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, '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'ђ'), + (0x403, 'M', u'ѓ'), + ] + +def _seg_7(): + return [ + (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'), + (0x49E, 'M', u'ҟ'), + ] + +def _seg_8(): + return [ + (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'ԃ'), + (0x503, 'V'), + ] + +def _seg_9(): + return [ + (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, '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'), + (0x560, 'X'), + (0x561, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'X'), + (0x589, 'V'), + (0x58B, 'X'), + (0x58F, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5F0, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + ] + +def _seg_10(): + return [ + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x800, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x8A0, 'V'), + (0x8A1, 'X'), + (0x8A2, 'V'), + (0x8AD, 'X'), + (0x8E4, 'V'), + (0x8FF, 'X'), + (0x900, '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'), + (0x978, 'X'), + (0x979, 'V'), + (0x980, 'X'), + (0x981, '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'), + (0x9FC, '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'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + ] + +def _seg_11(): + return [ + (0xA66, 'V'), + (0xA76, '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'), + (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'), + (0xC01, 'V'), + (0xC04, 'X'), + (0xC05, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC34, 'X'), + (0xC35, 'V'), + ] + +def _seg_12(): + return [ + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5A, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC80, 'X'), + (0xC82, 'V'), + (0xC84, 'X'), + (0xC85, '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'), + (0xD02, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD3B, 'X'), + (0xD3D, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD4F, 'X'), + (0xD57, 'V'), + (0xD58, 'X'), + (0xD60, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD76, 'X'), + (0xD79, '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'), + (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'), + ] + +def _seg_13(): + return [ + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + (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'), + ] + +def _seg_14(): + return [ + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (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'), + (0x13F5, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F1, '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'), + (0x1878, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191D, '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'), + (0x1A9A, 'X'), + ] + +def _seg_15(): + return [ + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CF7, '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'ð'), + (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'ɭ'), + ] + +def _seg_16(): + return [ + (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'), + (0x1DE7, 'X'), + (0x1DFC, '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'), + (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'ṋ'), + ] + +def _seg_17(): + return [ + (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'ẩ'), + (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'), + ] + +def _seg_18(): + return [ + (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'ἒ'), + (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'ἥ'), + ] + +def _seg_19(): + return [ + (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'ὣι'), + (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'ὦι'), + ] + +def _seg_20(): + return [ + (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'‵‵‵'), + (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'), + ] + +def _seg_21(): + return [ + (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'), + (0x20BB, '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'), + (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'א'), + ] + +def _seg_22(): + return [ + (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, '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'), + (0x23F4, 'X'), + (0x2400, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (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'), + ] + +def _seg_23(): + return [ + (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'), + (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'), + ] + +def _seg_24(): + return [ + (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'), + (0x2700, 'X'), + (0x2701, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B4D, 'X'), + (0x2B50, 'V'), + (0x2B5A, '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'ɒ'), + (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'ⲃ'), + ] + +def _seg_25(): + return [ + (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'ⳛ'), + (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'ⳮ'), + ] + +def _seg_26(): + return [ + (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'), + (0x2E3C, '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'山'), + (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'彐'), + ] + +def _seg_27(): + return [ + (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'襾'), + (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'身'), + ] + +def _seg_28(): + return [ + (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'), + (0x312E, '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'ᄄ'), + (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'ᄡ'), + ] + +def _seg_29(): + return [ + (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'天'), + (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'(ᄆ)'), + ] + +def _seg_30(): + return [ + (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'ᄅ'), + (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'나'), + ] + +def _seg_31(): + return [ + (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月'), + (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'エ'), + ] + +def _seg_32(): + return [ + (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'パーセント'), + (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'ペソ'), + ] + +def _seg_33(): + return [ + (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'), + (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'), + ] + +def _seg_34(): + return [ + (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日'), + (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'), + ] + +def _seg_35(): + return [ + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FCD, '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, 'X'), + (0xA69F, 'V'), + (0xA6F8, 'X'), + (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'), + ] + +def _seg_36(): + return [ + (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'), + (0xA78F, 'X'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA794, 'X'), + (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, 'X'), + (0xA7F8, 'M', u'ħ'), + ] + +def _seg_37(): + return [ + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C5, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA8FC, 'X'), + (0xA900, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9E0, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAA7C, 'X'), + (0xAA80, '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'), + (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'洛'), + (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'來'), + ] + +def _seg_38(): + return [ + (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'凉'), + (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'撚'), + ] + +def _seg_39(): + return [ + (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'利'), + (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'淋'), + ] + +def _seg_40(): + return [ + (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'渚'), + (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'著'), + ] + +def _seg_41(): + return [ + (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'窱'), + (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'醙'), + ] + +def _seg_42(): + return [ + (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'), + (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'ڍ'), + ] + +def _seg_43(): + return [ + (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'طح'), + (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'كي'), + ] + +def _seg_44(): + return [ + (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'نر'), + (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'تح'), + ] + +def _seg_45(): + return [ + (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'نم'), + (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'صي'), + ] + +def _seg_46(): + return [ + (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'شجي'), + (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'محم'), + ] + +def _seg_47(): + return [ + (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','), + (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'), + (0xFE27, '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'》'), + ] + +def _seg_48(): + return [ + (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'ص'), + (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'"'), + ] + +def _seg_49(): + return [ + (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'), + (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'ヲ'), + ] + +def _seg_50(): + return [ + (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'ᄇ'), + (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'ᅪ'), + ] + +def _seg_51(): + return [ + (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'), + (0x1018B, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x10300, 'V'), + (0x1031F, 'X'), + (0x10320, 'V'), + (0x10324, 'X'), + (0x10330, 'V'), + (0x1034B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + (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'𐑅'), + ] + +def _seg_52(): + return [ + (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'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x10860, 'X'), + (0x10900, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BE, 'V'), + (0x109C0, 'X'), + (0x10A00, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A34, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A48, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10A80, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B80, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x11080, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11144, 'X'), + (0x11180, 'V'), + (0x111C9, 'X'), + (0x111D0, 'V'), + (0x111DA, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x12000, 'V'), + (0x1236F, 'X'), + (0x12400, 'V'), + (0x12463, 'X'), + (0x12470, 'V'), + (0x12474, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + ] + +def _seg_53(): + return [ + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x1B000, 'V'), + (0x1B002, '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'), + (0x1D1DE, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D372, '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'), + ] + +def _seg_54(): + return [ + (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'), + (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'), + ] + +def _seg_55(): + return [ + (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'), + (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'), + ] + +def _seg_56(): + return [ + (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'), + (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'), + ] + +def _seg_57(): + return [ + (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'), + (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'), + ] + +def _seg_58(): + return [ + (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'), + (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'), + ] + +def _seg_59(): + return [ + (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'), + (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'), + ] + +def _seg_60(): + return [ + (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'τ'), + (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'ε'), + ] + +def _seg_61(): + return [ + (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'ζ'), + (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'ρ'), + ] + +def _seg_62(): + return [ + (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'ψ'), + (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'), + ] + +def _seg_63(): + return [ + (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'), + (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, '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'ش'), + (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'ق'), + ] + +def _seg_64(): + return [ + (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'د'), + (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'), + ] + +def _seg_65(): + return [ + (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'), + (0x1F0BF, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0E0, '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, '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)'), + (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, 'X'), + (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'), + ] + +def _seg_66(): + return [ + (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'), + (0x1F19B, '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, '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'), + (0x1F300, 'V'), + (0x1F321, 'X'), + (0x1F330, 'V'), + (0x1F336, 'X'), + (0x1F337, 'V'), + (0x1F37D, 'X'), + (0x1F380, 'V'), + (0x1F394, 'X'), + (0x1F3A0, 'V'), + (0x1F3C5, 'X'), + (0x1F3C6, 'V'), + (0x1F3CB, 'X'), + (0x1F3E0, 'V'), + (0x1F3F1, 'X'), + (0x1F400, 'V'), + (0x1F43F, 'X'), + (0x1F440, 'V'), + ] + +def _seg_67(): + return [ + (0x1F441, 'X'), + (0x1F442, 'V'), + (0x1F4F8, 'X'), + (0x1F4F9, 'V'), + (0x1F4FD, 'X'), + (0x1F500, 'V'), + (0x1F53E, 'X'), + (0x1F540, 'V'), + (0x1F544, 'X'), + (0x1F550, 'V'), + (0x1F568, 'X'), + (0x1F5FB, 'V'), + (0x1F641, 'X'), + (0x1F645, 'V'), + (0x1F650, 'X'), + (0x1F680, 'V'), + (0x1F6C6, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, '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'剆'), + (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'圗'), + ] + +def _seg_68(): + return [ + (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'𢆃'), + (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'扝'), + ] + +def _seg_69(): + return [ + (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'次'), + (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'災'), + ] + +def _seg_70(): + return [ + (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'𥛅'), + (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'聰'), + ] + +def _seg_71(): + return [ + (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'蛢'), + (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'郱'), + ] + +def _seg_72(): + return [ + (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'), + (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() +) diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..67b6260 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,158 @@ +PRAW: The Python Reddit API Wrapper +=================================== + +.. image:: https://img.shields.io/pypi/v/praw.svg + :alt: Latest PRAW Version + :target: https://pypi.python.org/pypi/praw +.. image:: https://travis-ci.org/praw-dev/praw.svg?branch=master + :alt: Travis CI Status + :target: https://travis-ci.org/praw-dev/praw +.. image:: https://coveralls.io/repos/github/praw-dev/praw/badge.svg?branch=master + :alt: Coveralls Coverage + :target: https://coveralls.io/github/praw-dev/praw?branch=master +.. image:: https://badges.gitter.im/praw-dev/praw.svg + :alt: Join the chat at https://gitter.im/praw-dev/praw + :target: https://gitter.im/praw-dev/praw + +PRAW, an acronym for "Python Reddit API Wrapper", is a python package that +allows for simple access to Reddit's API. PRAW aims to be easy to use and +internally follows all of `Reddit's API rules +`_. With PRAW there's no need to +introduce ``sleep`` calls in your code. Give your client an appropriate user +agent and you're set. + +.. _installation: + +Installation +------------ + +PRAW is supported on python 2.7, 3.3, 3.4, 3.5 and 3.6. The recommended way to +install PRAW is via `pip `_. + +.. code-block:: bash + + pip install praw + +To install the latest development version of PRAW run the following instead: + +.. code-block:: bash + + pip install --upgrade https://github.com/praw-dev/praw/archive/master.zip + +For instructions on installing python and pip see "The Hitchhiker's Guide to +Python" `Installation Guides +`_. + +Quickstart +---------- + +Assuming you already have a credentials for a script-type OAuth application you +can instantiate an instance of PRAW like so: + +.. code-block:: python + + import praw + reddit = praw.Reddit(client_id='CLIENT_ID', client_secret="CLIENT_SECRET", + password='PASSWORD', user_agent='USERAGENT', + username='USERNAME') + +With the ``reddit`` instance you can then interact with Reddit: + +.. code-block:: python + + # Create a submission to /r/test + reddit.subreddit('test').submit('Test Submission', url='https://reddit.com') + + # Comment on a known submission + submission = reddit.submission(url='https://www.reddit.com/comments/5e1az9') + submission.reply('Super rad!') + + # Reply to the first comment of a weekly top thread of a moderated community + submission = next(reddit.subreddit('mod').top('week')) + submission.comments[0].reply('An automated reply') + + # Output score for the first 256 items on the frontpage + for submission in reddit.front.hot(limit=256): + print(submission.score) + + # Obtain the moderator listing for redditdev + for moderator in reddit.subreddit('redditdev').moderator: + print(moderator) + +Please see PRAW's `documentation `_ for +more examples of what you can do with PRAW. + +PRAW Discussion and Support +--------------------------- + +For those new to python, or would otherwise consider themselves a python +beginner, please consider asking questions on the `r/learnpython +`_ subreddit. There are wonderful people +there who can help with general python and simple PRAW related questions. + +Otherwise, there are a few official places to ask questions about PRAW: + +`/r/redditdev `_ is the best place on +Reddit to ask PRAW related questions. This subreddit is for all Reddit API +related discussion so please tag submissions with *[PRAW]*. Please perform a +search on the subreddit first to see if anyone has similar questions. + +Real-time chat can be conducted via the `praw-dev/praw +`_ channel on gitter. + +Please do not directly message any of the contributors via Reddit, email, or +gitter unless they have indicated otherwise. We strongly encourage everyone to +help others with their questions. + +Please file bugs and feature requests as issues on `GitHub +`_ after first searching to ensure a +similar issue was not already filed. If such an issue already exists please +give it a thumbs up reaction. Comments to issues containing additional +information are certainly welcome. + +.. note:: This project is released with a `Contributor Code of Conduct + `_. By + participating in this project you agree to abide by its terms. + +Documentation +------------- + +PRAW's documentation is located at http://praw.readthedocs.io/. + +History +------- + +`August 2010 +`_: +Timothy Mellor created a github project called ``reddit_api``. + +`March 2011 +`_: +The python package ``reddit`` was registered and uploaded to pypi. + +`December 2011 +`_: +Bryce Boe took over as maintainer of the ``reddit`` package. + +`June 2012 +`_: +Bryce renamed the project ``PRAW`` and the repository was relocated to the +newly created praw-dev organization on GitHub. + +`February 2016 +`_: +Bryce began work on PRAW4, a complete rewrite of PRAW. + + +License +------- + +PRAW's source (v4.0.0+) is provided under the `Simplified BSD License +`_. + +* Copyright (c), 2016, Bryce Boe + +Earlier versions of PRAW were released under `GPLv3 +`_. + + diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/INSTALLER b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/METADATA b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/METADATA new file mode 100644 index 0000000..3ebd7d2 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/METADATA @@ -0,0 +1,186 @@ +Metadata-Version: 2.0 +Name: praw +Version: 5.0.1 +Summary: PRAW, an acronym for `Python Reddit API Wrapper`, is a python package that allows for simple access to reddit's API. +Home-page: https://praw.readthedocs.org/ +Author: Bryce Boe +Author-email: bbzbryce@gmail.com +License: Simplified BSD License +Keywords: reddit api wrapper +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Utilities +Requires-Dist: prawcore (<0.12,>=0.11.0) +Requires-Dist: update-checker (>=0.16) + +PRAW: The Python Reddit API Wrapper +=================================== + +.. image:: https://img.shields.io/pypi/v/praw.svg + :alt: Latest PRAW Version + :target: https://pypi.python.org/pypi/praw +.. image:: https://travis-ci.org/praw-dev/praw.svg?branch=master + :alt: Travis CI Status + :target: https://travis-ci.org/praw-dev/praw +.. image:: https://coveralls.io/repos/github/praw-dev/praw/badge.svg?branch=master + :alt: Coveralls Coverage + :target: https://coveralls.io/github/praw-dev/praw?branch=master +.. image:: https://badges.gitter.im/praw-dev/praw.svg + :alt: Join the chat at https://gitter.im/praw-dev/praw + :target: https://gitter.im/praw-dev/praw + +PRAW, an acronym for "Python Reddit API Wrapper", is a python package that +allows for simple access to Reddit's API. PRAW aims to be easy to use and +internally follows all of `Reddit's API rules +`_. With PRAW there's no need to +introduce ``sleep`` calls in your code. Give your client an appropriate user +agent and you're set. + +.. _installation: + +Installation +------------ + +PRAW is supported on python 2.7, 3.3, 3.4, 3.5 and 3.6. The recommended way to +install PRAW is via `pip `_. + +.. code-block:: bash + + pip install praw + +To install the latest development version of PRAW run the following instead: + +.. code-block:: bash + + pip install --upgrade https://github.com/praw-dev/praw/archive/master.zip + +For instructions on installing python and pip see "The Hitchhiker's Guide to +Python" `Installation Guides +`_. + +Quickstart +---------- + +Assuming you already have a credentials for a script-type OAuth application you +can instantiate an instance of PRAW like so: + +.. code-block:: python + + import praw + reddit = praw.Reddit(client_id='CLIENT_ID', client_secret="CLIENT_SECRET", + password='PASSWORD', user_agent='USERAGENT', + username='USERNAME') + +With the ``reddit`` instance you can then interact with Reddit: + +.. code-block:: python + + # Create a submission to /r/test + reddit.subreddit('test').submit('Test Submission', url='https://reddit.com') + + # Comment on a known submission + submission = reddit.submission(url='https://www.reddit.com/comments/5e1az9') + submission.reply('Super rad!') + + # Reply to the first comment of a weekly top thread of a moderated community + submission = next(reddit.subreddit('mod').top('week')) + submission.comments[0].reply('An automated reply') + + # Output score for the first 256 items on the frontpage + for submission in reddit.front.hot(limit=256): + print(submission.score) + + # Obtain the moderator listing for redditdev + for moderator in reddit.subreddit('redditdev').moderator: + print(moderator) + +Please see PRAW's `documentation `_ for +more examples of what you can do with PRAW. + +PRAW Discussion and Support +--------------------------- + +For those new to python, or would otherwise consider themselves a python +beginner, please consider asking questions on the `r/learnpython +`_ subreddit. There are wonderful people +there who can help with general python and simple PRAW related questions. + +Otherwise, there are a few official places to ask questions about PRAW: + +`/r/redditdev `_ is the best place on +Reddit to ask PRAW related questions. This subreddit is for all Reddit API +related discussion so please tag submissions with *[PRAW]*. Please perform a +search on the subreddit first to see if anyone has similar questions. + +Real-time chat can be conducted via the `praw-dev/praw +`_ channel on gitter. + +Please do not directly message any of the contributors via Reddit, email, or +gitter unless they have indicated otherwise. We strongly encourage everyone to +help others with their questions. + +Please file bugs and feature requests as issues on `GitHub +`_ after first searching to ensure a +similar issue was not already filed. If such an issue already exists please +give it a thumbs up reaction. Comments to issues containing additional +information are certainly welcome. + +.. note:: This project is released with a `Contributor Code of Conduct + `_. By + participating in this project you agree to abide by its terms. + +Documentation +------------- + +PRAW's documentation is located at http://praw.readthedocs.io/. + +History +------- + +`August 2010 +`_: +Timothy Mellor created a github project called ``reddit_api``. + +`March 2011 +`_: +The python package ``reddit`` was registered and uploaded to pypi. + +`December 2011 +`_: +Bryce Boe took over as maintainer of the ``reddit`` package. + +`June 2012 +`_: +Bryce renamed the project ``PRAW`` and the repository was relocated to the +newly created praw-dev organization on GitHub. + +`February 2016 +`_: +Bryce began work on PRAW4, a complete rewrite of PRAW. + + +License +------- + +PRAW's source (v4.0.0+) is provided under the `Simplified BSD License +`_. + +* Copyright (c), 2016, Bryce Boe + +Earlier versions of PRAW were released under `GPLv3 +`_. + + diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/RECORD b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/RECORD new file mode 100644 index 0000000..1497c71 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/RECORD @@ -0,0 +1,116 @@ +praw/__init__.py,sha256=T67RxGTGOpnrvE4UYZO-ov-_UGRyurucaxK6r5wTno4,510 +praw/config.py,sha256=_X673uwBTpDl6vRPLP8HoPyIiSXvKNA1dvXPkTJubso,3886 +praw/const.py,sha256=tXLQv4CCvcmQFasTPWm5LDh-77QPWCsMmW69inqykfc,9904 +praw/exceptions.py,sha256=x-UMSebv1O_Wu3fCxmtCethNeZrZ1qKSysTL5iAD7zg,1210 +praw/objector.py,sha256=kSBgC5HqDxplKPx7aJ5qywz_gmjCGaPcvnSrcZwOutU,5137 +praw/praw.ini,sha256=TgjyhYSHr03UFwxdBqJ9llDHMTvivQU7CjMwmhvh0po,430 +praw/reddit.py,sha256=RlK5ZaYg0H3t43EvqkjHHkxw2N4JVj4VfAzajre1Re8,18556 +praw/models/__init__.py,sha256=LTotKytjY-k_954WOZw2S03DfpF6bU1RxzrSF6vPBVA,1552 +praw/models/auth.py,sha256=nNrzCPrxk89DOXNIZnxZqfesNtbw4teHelLp30da-BA,5602 +praw/models/base.py,sha256=r_gGBiUMO1E49G0trGjHXbF4tKvocec1GYFONpX7l3M,1256 +praw/models/comment_forest.py,sha256=BB1fJj4AEElIFHxyAKehBW0DM08xLn1QGNwYSkd90S0,6342 +praw/models/front.py,sha256=JdYjd4hekyFekPMkI-THvLB0-Y89kyEI8R3rd_oTjZs,337 +praw/models/helpers.py,sha256=Dyv6c-qIZiBBhLYFW4tY84Xt4sXJxDGNVPvyVGUVEX8,7426 +praw/models/inbox.py,sha256=tRmKCgg_fnwQ3u4hpfFGuLKYCW64nviPK9JgbMPhAsg,7523 +praw/models/modaction.py,sha256=02diBPSyoXPs4LXJJv1zisNPxNwqpVhuRhovj_a4JQQ,397 +praw/models/stylesheet.py,sha256=haL-hBghyLRHb8Xax-W7uZ-uhAgnWZDkTR6t526IpYI,128 +praw/models/subreddits.py,sha256=BEAbj4UN42N2D7q-MyjcttDPrJuoqj1B5nz8Wq2LeFs,4318 +praw/models/user.py,sha256=GYWgYX8KOlnrcGJh9zS83IsCfG7JPZpaDzM0t4Qpm30,3143 +praw/models/util.py,sha256=uaD3WT5m0z8b6mjcBjov3-KzGyCCBDCcxhCfP3plJWM,6327 +praw/models/list/__init__.py,sha256=XAASphlPb0VdjWy4OljGFy1cWyrSt35UGhQpja7w-ds,53 +praw/models/list/base.py,sha256=5s0nB2OUTPk4Yvyqq_leNmLLvNi0EARFgYfR9CMTa0M,1371 +praw/models/list/redditor.py,sha256=L9Sz6_Q7iLXikL5y6cfyjl6HQfJJw62N18J3H-J6qxk,194 +praw/models/listing/__init__.py,sha256=hmX-b021T0xCkrB74sC7qAy_MnhcoricSlTKp5P14IA,73 +praw/models/listing/domain.py,sha256=S0zPC0_9TgP7Byg-9aR7GEA9mt4_vEjAnNVqldDQRTA,591 +praw/models/listing/generator.py,sha256=U8_M7z14NlHMcRueK6u_vtYia-lwJKIzuKZFcjiz3Rs,2777 +praw/models/listing/listing.py,sha256=IT7ZrRct3TmIu4seuLJep_nNH9BsTL0KiM5HLQbj1kg,1051 +praw/models/listing/mixins/__init__.py,sha256=6idt7U9ZGiP8OAUnBPYDmT8JqYIUdWeG5kqnMTFEtr4,312 +praw/models/listing/mixins/base.py,sha256=lEuK07njaStpgdCxhOWJ886MmyDMn_tCvEHKbJEp20I,4724 +praw/models/listing/mixins/gilded.py,sha256=3CRp9W5l7z3nMMVyZT3RU4K2sY2mczFVSOeh7ejunfQ,570 +praw/models/listing/mixins/redditor.py,sha256=9gOD57MlQbtWT0rlzleIU7I_ovfCM0FS-XZ9Uabiu3A,5343 +praw/models/listing/mixins/rising.py,sha256=Ng2ldg2MJwh9hccuvfPoQFGpTMOvQWum2zMCrbp8gDQ,985 +praw/models/listing/mixins/submission.py,sha256=5yIO_HcQsZ6wf312AQTKuC6KvrwUu6HNnHuFo0oTE4w,659 +praw/models/listing/mixins/subreddit.py,sha256=yxlKMu8kcU3zzEh9kOsqUP9XAXEiTbROJZ51HYvisOU,2095 +praw/models/reddit/__init__.py,sha256=3LAvA8SSd5oXmDQPQdckg0vS-zaXGjw15TqE5k_STlk,53 +praw/models/reddit/base.py,sha256=3FIOpYBbVt-Kr1oUFUgxzGH_pXuViafldraKJ_RjCFE,3107 +praw/models/reddit/comment.py,sha256=xAfTM-w3UWCZDu1AUIf7N7qgn0rXpmXO6zvPixPiHgc,6697 +praw/models/reddit/live.py,sha256=uhgpwsoZmR-i3mbLKAuR8W8jwm-d96yzAIrax4U5Beo,21888 +praw/models/reddit/message.py,sha256=zcbIOlip92Dw42pBXhgJ91egGWg4qf7z9--nfCa1DMc,1871 +praw/models/reddit/modmail.py,sha256=Lx1hiH-JzIII1IELruzvg05T1kwV8zi34O_WkNc83V8,9036 +praw/models/reddit/more.py,sha256=R_a8GTrwXyzfC3U9NkOMiuY20GOCGHBqQl-km-Cpx2Q,2876 +praw/models/reddit/multi.py,sha256=iuoJTf4EfZuIS3_fjSXDPyIq0k54QWqRf3TzA_TgsSM,5415 +praw/models/reddit/redditor.py,sha256=KVNkE0oMzJXRhUZa9XxOXNwqX8EXMYQ8YQEAPwKJm1g,3087 +praw/models/reddit/submission.py,sha256=6ZSDe7mHUaeqiJO9vp6zqV0tJzXpTa224peFT9W0gfw,14180 +praw/models/reddit/subreddit.py,sha256=OnCxwTllRrmUmchYcNaBbSq6AZbfGIFcRnjwu6oMCm4,77396 +praw/models/reddit/wikipage.py,sha256=zyzDECizqLBr5lA5NnxNlO8jWiDSP9IiAXgNI-jRJYM,6838 +praw/models/reddit/mixins/__init__.py,sha256=BaeYWFK69eI69wNbsvLS869XkgNRw3hOPxX-XNOe0N8,3509 +praw/models/reddit/mixins/editable.py,sha256=ghiLnBwmyY94Cae3ru_FtNOCaC_OI0xivHQ4u3SLu7o,928 +praw/models/reddit/mixins/gildable.py,sha256=RafiEQWpLYNyLZM3vkVCx8d1OFwTwKyvvO8Ef228KhU,311 +praw/models/reddit/mixins/inboxable.py,sha256=NiPYXCScD-09Jt7MaCCfV0Fjtd1iBQuMlVRBi0Pbrv0,968 +praw/models/reddit/mixins/inboxtoggleable.py,sha256=IuyRzxNWK7cf0cBOULrM3YFd4WGDC2XmV8bFF6i-1L0,667 +praw/models/reddit/mixins/messageable.py,sha256=PnwjznkY_nXw47TWaeOe-g9FIMWXe2eUeRO-7_6C84I,1640 +praw/models/reddit/mixins/replyable.py,sha256=bHioSgRw4rqGDU8aKnX1AdfAkU4zEroXXD9ekOBJe-c,513 +praw/models/reddit/mixins/reportable.py,sha256=qS7X6kfRW7QOT9TNkDsxXdzocJ25LkzLlhjkFvQYExc,448 +praw/models/reddit/mixins/savable.py,sha256=zSs-_JWtyfhzwTs4_tUet89qu-XHL7KA4JTAJu97Jtk,663 +praw/models/reddit/mixins/votable.py,sha256=ndAO4-uLTn4IvXA_rWokYMoy60jsaDieoiGejycREs0,1781 +praw-5.0.1.dist-info/DESCRIPTION.rst,sha256=b0shlc6E8Bgvu6pS9byHKzTscDF9AfienevJz3qTy7I,5828 +praw-5.0.1.dist-info/METADATA,sha256=qSM6eLjfJ80oPK4orETCzw5-Q6KZYt1nRlwQr81PQO4,6971 +praw-5.0.1.dist-info/RECORD,, +praw-5.0.1.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +praw-5.0.1.dist-info/metadata.json,sha256=M7UGygW1hXtQX7Rh4f9oo5JODK9hsg7qIJTybq5njLQ,1433 +praw-5.0.1.dist-info/top_level.txt,sha256=t44PlsGS9Ub7_bDM1uelvaT9zBEyUuFR7_iOYvg4MpY,5 +praw-5.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +praw/models/reddit/mixins/__pycache__/messageable.cpython-34.pyc,, +praw/models/reddit/__pycache__/subreddit.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/gildable.cpython-34.pyc,, +praw/models/reddit/__pycache__/more.cpython-34.pyc,, +praw/__pycache__/exceptions.cpython-34.pyc,, +praw/models/reddit/__pycache__/message.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/gilded.cpython-34.pyc,, +praw/models/__pycache__/modaction.cpython-34.pyc,, +praw/models/list/__pycache__/redditor.cpython-34.pyc,, +praw/models/__pycache__/util.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/submission.cpython-34.pyc,, +praw/__pycache__/const.cpython-34.pyc,, +praw/models/reddit/__pycache__/comment.cpython-34.pyc,, +praw/models/listing/__pycache__/generator.cpython-34.pyc,, +praw/models/list/__pycache__/__init__.cpython-34.pyc,, +praw/models/reddit/__pycache__/live.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/votable.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/inboxtoggleable.cpython-34.pyc,, +praw/models/__pycache__/subreddits.cpython-34.pyc,, +praw/models/listing/__pycache__/__init__.cpython-34.pyc,, +praw/models/__pycache__/auth.cpython-34.pyc,, +praw/models/__pycache__/base.cpython-34.pyc,, +praw/models/reddit/__pycache__/__init__.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/rising.cpython-34.pyc,, +praw/models/__pycache__/stylesheet.cpython-34.pyc,, +praw/models/__pycache__/helpers.cpython-34.pyc,, +praw/__pycache__/objector.cpython-34.pyc,, +praw/models/reddit/__pycache__/multi.cpython-34.pyc,, +praw/__pycache__/config.cpython-34.pyc,, +praw/models/listing/__pycache__/domain.cpython-34.pyc,, +praw/models/__pycache__/front.cpython-34.pyc,, +praw/models/__pycache__/__init__.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/__init__.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/reportable.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/savable.cpython-34.pyc,, +praw/models/__pycache__/inbox.cpython-34.pyc,, +praw/__pycache__/reddit.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/replyable.cpython-34.pyc,, +praw/models/list/__pycache__/base.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/__init__.cpython-34.pyc,, +praw/models/reddit/__pycache__/modmail.cpython-34.pyc,, +praw/models/reddit/__pycache__/redditor.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/subreddit.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/inboxable.cpython-34.pyc,, +praw/models/__pycache__/user.cpython-34.pyc,, +praw/models/reddit/__pycache__/wikipage.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/redditor.cpython-34.pyc,, +praw/models/__pycache__/comment_forest.cpython-34.pyc,, +praw/models/reddit/__pycache__/submission.cpython-34.pyc,, +praw/__pycache__/__init__.cpython-34.pyc,, +praw/models/listing/__pycache__/listing.cpython-34.pyc,, +praw/models/reddit/mixins/__pycache__/editable.cpython-34.pyc,, +praw/models/listing/mixins/__pycache__/base.cpython-34.pyc,, +praw/models/reddit/__pycache__/base.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/WHEEL b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/metadata.json b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/metadata.json new file mode 100644 index 0000000..82dd694 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Utilities"], "extensions": {"python.details": {"contacts": [{"email": "bbzbryce@gmail.com", "name": "Bryce Boe", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://praw.readthedocs.org/"}}}, "extras": [], "generator": "bdist_wheel (0.30.0.a0)", "keywords": ["reddit", "api", "wrapper"], "license": "Simplified BSD License", "metadata_version": "2.0", "name": "praw", "run_requires": [{"requires": ["prawcore (<0.12,>=0.11.0)", "update-checker (>=0.16)"]}], "summary": "PRAW, an acronym for `Python Reddit API Wrapper`, is a python package that allows for simple access to reddit's API.", "test_requires": [{"requires": ["betamax (>=0.8,<0.9)", "betamax-matchers (>=0.3.0,<0.4)", "betamax-serializers (>=0.2,<0.3)", "mock (>=0.8)", "pytest (>=2.7.3)", "six (>=1.10)"]}], "version": "5.0.1"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/top_level.txt b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..6c81bc0 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw-5.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +praw diff --git a/env/lib/python3.4/site-packages/praw/__init__.py b/env/lib/python3.4/site-packages/praw/__init__.py new file mode 100644 index 0000000..3bfc4ca --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/__init__.py @@ -0,0 +1,14 @@ +""" +Python Reddit API Wrapper. + +PRAW, an acronym for "Python Reddit API Wrapper", is a python package that +allows for simple access to reddit's API. PRAW aims to be as easy to use as +possible and is designed to follow all of reddit's API rules. You have to give +a useragent, everything else is handled by PRAW so you needn't worry about +violating them. + +More information about PRAW can be found at https://github.com/praw-dev/praw +""" + +from .const import __version__ # NOQA +from .reddit import Reddit # NOQA diff --git a/env/lib/python3.4/site-packages/praw/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dda1dfc194b31850a3adbe8d66846b77de9318b3 GIT binary patch literal 664 zcmZ{izmC)}5XPPT2g-rOBaE&&E!s^g8iWv6UIAJi#p$-OoYK=( z6%7wSffy$Z6h!jGOLV$?iC+(Y%)C)+WAapl< zs;Dl25@Ae*eMo8UFa%vCgq2BAs-PRIWGXpf5(1I~JpDrk-y0PQc*GuBF;HI!jUH4k z64z6wHts+T%2WH=HlPg25xylEL-cB#dkY97F|1P3-b6T~_alf3`3k>b=@=qH8>0)a%d*k2?W>~3u5@0U_fiehB>zG8#kSey zigW5R5RP+7H}l6IG0#+ep%OOL-gt2IBsTt{gRTe%x~y5g^e0xQNu%fV8yvY6lp@Yq0 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/__pycache__/config.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/__pycache__/config.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5e5edbc3060abf26598684aaf696f79f5fb001a GIT binary patch literal 4324 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 bbmM9{8eXS@Q{*HElN~+_t#!U`pY{F&tB~O# literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/__pycache__/const.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/__pycache__/const.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52bafc53338b4c48940de11e8ef369cc6f7e4d7a GIT binary patch literal 8521 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/__pycache__/exceptions.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/__pycache__/exceptions.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09c80b035e98bc946b9fa4e38ede029b84f49c2e GIT binary patch literal 1715 zcma)6&1xh!5U&22A5X@c9}=HMF3v!9d|Cp-5_S`oFc6H{4TSijm0KEHOLwayX*|2L z!h}sz1kvqxspdKm48o`~jVTYj}dw zeTzZ@oCAC#BakutgzFeo1n&|!k5QX|OoKKB6$fpC+8)S$(DrxQ6yyM2Ook$f0M4F2 z{hq1UnX0@tCChT*oO09AXkKRdQYy#%%CJJ{a(~Lr*eo2Jy_`Nhn?KuGzhnzz+3HG_ z%$Y*@D_vf)OQYOqWextKe}AQzQ}$X}=Co9wGf~RDv#)clO5gGKpT4qS5qwSASH@p4 zv!F|y+NFYFd)2*!GTvW-nP!M=I}nlv?<4$Ch&N)5G6n?w91)HYxuib41!x!`H@KRG0G6NoB>V5$(lpTD`H9;|QmVQH-Ooz6C;p zdK&IC6!$^+1z-^nO$wU?>=ZW0>o{yB@GgQcaH9n9 z5%?H3Ku2FCbO`q%vIgL28uoaPe2}IOm=mV5{(D|(uSKrc3OUMj>AWa2MfB<>iS%LH zF{^|X1yj}<%l(^5%^1-ltQoD5_?~K@%@b)ky=z`5=fvgK7HiRD8WEIis}B{1Tx#6j zvtDSG%jRBPR!h%Qk3#I#h#0YVk3c=xhF$l9he@waoyr$>j3)Mw!~+!P2aSpIb`sSG zoQLMZdBgDm9eWSOhd3Rbhv7$2KRUwi0KfGow;p5{$E0V8-j;Y{iAD zNE_~;JjlJH)8nWghs=m_?f8G);r%;(Z2jzhC178r-XKkR?2%nfLFm#eE3(ju!$Y-H zp_0HR@vkYhouGpkVf87_U5V5B6d@rD>VvjHh0+gcS~{@@X78#VK5m-Pmjsfd%lgSt Hdi3!>;<>j& literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/__pycache__/objector.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/__pycache__/objector.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3efce2dfd57935080351711f8be6baae233e2a16 GIT binary patch literal 4689 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 Dk%cw| literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/config.py b/env/lib/python3.4/site-packages/praw/config.py new file mode 100644 index 0000000..9d2bba1 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/config.py @@ -0,0 +1,109 @@ +"""Provides the code to load PRAW's configuration file `praw.ini`.""" +from threading import Lock +import os +import sys + +from .const import configparser +from .exceptions import ClientException + + +class _NotSet(object): + def __bool__(self): + return False + + __nonzero__ = __bool__ + + def __str__(self): + return 'NotSet' + + +class Config(object): + """A class containing the configuration for a reddit site.""" + + CONFIG = None + CONFIG_NOT_SET = _NotSet() # Represents a config value that is not set. + LOCK = Lock() + + @staticmethod + def _config_boolean(item): + if isinstance(item, bool): + return item + return item.lower() in {'1', 'yes', 'true', 'on'} + + @classmethod + def _load_config(cls): + """Attempt to load settings from various praw.ini files.""" + config = configparser.RawConfigParser() + module_dir = os.path.dirname(sys.modules[__name__].__file__) + if 'APPDATA' in os.environ: # Windows + os_config_path = os.environ['APPDATA'] + elif 'XDG_CONFIG_HOME' in os.environ: # Modern Linux + os_config_path = os.environ['XDG_CONFIG_HOME'] + elif 'HOME' in os.environ: # Legacy Linux + os_config_path = os.path.join(os.environ['HOME'], '.config') + else: + os_config_path = None + locations = [os.path.join(module_dir, 'praw.ini'), 'praw.ini'] + if os_config_path is not None: + locations.insert(1, os.path.join(os_config_path, 'praw.ini')) + config.read(locations) + cls.CONFIG = config + + @property + def short_url(self): + """Return the short url or raise a ClientException when not set.""" + if self._short_url is self.CONFIG_NOT_SET: + raise ClientException('No short domain specified.') + return self._short_url + + def __init__(self, site_name, **settings): + """Initialize a Config instance.""" + with Config.LOCK: + if Config.CONFIG is None: + self._load_config() + + self._settings = settings + self.custom = dict(Config.CONFIG.items(site_name), **settings) + + self.client_id = self.client_secret = self.oauth_url = None + self.reddit_url = self.refresh_token = self.redirect_uri = None + self.password = self.user_agent = self.username = None + + self._initialize_attributes() + + def _fetch(self, key): + value = self.custom[key] + del self.custom[key] + return value + + def _fetch_default(self, key, default=None): + if key not in self.custom: + return default + return self._fetch(key) + + def _fetch_or_not_set(self, key): + if key in self._settings: # Passed in values have the highest priority + return self._fetch(key) + + env_value = os.getenv('praw_{}'.format(key)) + ini_value = self._fetch_default(key) # Needed to remove from custom + + # Environment variables have higher priority than praw.ini settings + return env_value or ini_value or self.CONFIG_NOT_SET + + def _initialize_attributes(self): + self._short_url = self._fetch_default('short_url') \ + or self.CONFIG_NOT_SET + self.check_for_updates = self._config_boolean( + self._fetch_or_not_set('check_for_updates')) + self.kinds = {x: self._fetch('{}_kind'.format(x)) for x in + ['comment', 'message', 'redditor', 'submission', + 'subreddit']} + + for attribute in ('client_id', 'client_secret', 'redirect_uri', + 'refresh_token', 'password', 'user_agent', + 'username'): + setattr(self, attribute, self._fetch_or_not_set(attribute)) + + for required_attribute in ('oauth_url', 'reddit_url'): + setattr(self, required_attribute, self._fetch(required_attribute)) diff --git a/env/lib/python3.4/site-packages/praw/const.py b/env/lib/python3.4/site-packages/praw/const.py new file mode 100644 index 0000000..554822b --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/const.py @@ -0,0 +1,187 @@ +"""praw constants.""" +import sys + + +__version__ = '5.0.1' + +API_PATH = { + 'about_edited': 'r/{subreddit}/about/edited/', + 'about_log': 'r/{subreddit}/about/log/', + 'about_modqueue': 'r/{subreddit}/about/modqueue/', + 'about_reports': 'r/{subreddit}/about/reports/', + 'about_spam': 'r/{subreddit}/about/spam/', + 'about_sticky': 'r/{subreddit}/about/sticky/', + 'about_stylesheet': 'r/{subreddit}/about/stylesheet/', + 'about_traffic': 'r/{subreddit}/about/traffic/', + 'about_unmoderated': 'r/{subreddit}/about/unmoderated/', + 'accept_mod_invite': 'r/{subreddit}/api/accept_moderator_invite', + 'approve': 'api/approve/', + 'block': 'api/block', + 'blocked': 'prefs/blocked/', + 'comment': 'api/comment/', + 'comment_replies': 'message/comments/', + 'compose': 'api/compose/', + 'contest_mode': 'api/set_contest_mode/', + 'del': 'api/del/', + 'deleteflair': 'r/{subreddit}/api/deleteflair', + 'delete_sr_banner': 'r/{subreddit}/api/delete_sr_banner', + 'delete_sr_header': 'r/{subreddit}/api/delete_sr_header', + 'delete_sr_icon': 'r/{subreddit}/api/delete_sr_icon', + 'delete_sr_image': 'r/{subreddit}/api/delete_sr_img', + 'distinguish': 'api/distinguish/', + 'domain': 'domain/{domain}/', + 'duplicates': 'duplicates/{submission_id}/', + 'edit': 'api/editusertext/', + 'flair': 'r/{subreddit}/api/flair/', + 'flairconfig': 'r/{subreddit}/api/flairconfig/', + 'flaircsv': 'r/{subreddit}/api/flaircsv/', + 'flairlist': 'r/{subreddit}/api/flairlist/', + 'flairselector': 'r/{subreddit}/api/flairselector/', + 'flairtemplate': 'r/{subreddit}/api/flairtemplate/', + 'flairtemplateclear': 'r/{subreddit}/api/clearflairtemplates/', + 'flairtemplatedelete': 'r/{subreddit}/api/deleteflairtemplate/', + 'friend': 'r/{subreddit}/api/friend/', + 'friend_v1': 'api/v1/me/friends/{user}', + 'friends': 'api/v1/me/friends/', + 'gild_thing': 'api/v1/gold/gild/{fullname}/', + 'gild_user': 'api/v1/gold/give/{username}/', + 'hide': 'api/hide/', + 'ignore_reports': 'api/ignore_reports/', + 'inbox': 'message/inbox/', + 'info': 'api/info/', + 'karma': 'api/v1/me/karma', + 'leavecontributor': 'api/leavecontributor', + 'leavemoderator': 'api/leavemoderator', + 'link_flair': 'r/{subreddit}/api/link_flair', + 'list_banned': 'r/{subreddit}/about/banned/', + 'list_contributor': 'r/{subreddit}/about/contributors/', + 'list_moderator': 'r/{subreddit}/about/moderators/', + 'list_muted': 'r/{subreddit}/about/muted/', + 'list_wikibanned': 'r/{subreddit}/about/wikibanned/', + 'list_wikicontributor': 'r/{subreddit}/about/wikicontributors/', + 'live_accept_invite': 'api/live/{id}/accept_contributor_invite', + 'live_add_update': 'api/live/{id}/update', + 'live_close': 'api/live/{id}/close_thread', + 'live_contributors': 'live/{id}/contributors', + 'live_discussions': 'live/{id}/discussions', + 'live_info': 'api/live/by_id/{ids}', + 'live_invite': 'api/live/{id}/invite_contributor', + 'live_leave': 'api/live/{id}/leave_contributor', + 'live_now': 'api/live/happening_now', + 'live_remove_update': 'api/live/{id}/delete_update', + 'live_remove_contrib': 'api/live/{id}/rm_contributor', + 'live_remove_invite': 'api/live/{id}/rm_contributor_invite', + 'live_report': 'api/live/{id}/report', + 'live_strike': 'api/live/{id}/strike_update', + 'live_update_perms': 'api/live/{id}/set_contributor_permissions', + 'live_update_thread': 'api/live/{id}/edit', + 'live_updates': 'live/{id}', + 'liveabout': 'api/live/{id}/about/', + 'livecreate': 'api/live/create', + 'lock': 'api/lock/', + 'me': 'api/v1/me', + 'mentions': 'message/mentions', + 'message': 'message/messages/{id}/', + 'messages': 'message/messages/', + 'moderator_messages': 'r/{subreddit}/message/moderator/', + 'moderator_unread': 'r/{subreddit}/message/moderator/unread/', + 'morechildren': 'api/morechildren/', + 'my_contributor': 'subreddits/mine/contributor/', + 'my_moderator': 'subreddits/mine/moderator/', + 'my_multireddits': 'api/multi/mine/', + 'my_subreddits': 'subreddits/mine/subscriber/', + 'marknsfw': 'api/marknsfw/', + 'modmail_archive': 'api/mod/conversations/{id}/archive', + 'modmail_bulk_read': 'api/mod/conversations/bulk/read', + 'modmail_conversation': 'api/mod/conversations/{id}', + 'modmail_conversations': 'api/mod/conversations/', + 'modmail_highlight': 'api/mod/conversations/{id}/highlight', + 'modmail_mute': 'api/mod/conversations/{id}/mute', + 'modmail_read': 'api/mod/conversations/read', + 'modmail_subreddits': 'api/mod/conversations/subreddits', + 'modmail_unarchive': 'api/mod/conversations/{id}/unarchive', + 'modmail_unmute': 'api/mod/conversations/{id}/unmute', + 'modmail_unread': 'api/mod/conversations/unread', + 'modmail_unread_count': 'api/mod/conversations/unread/count', + 'multireddit': 'user/{user}/m/{multi}/', + 'multireddit_api': 'api/multi/user/{user}/m/{multi}/', + 'multireddit_base': 'api/multi/', + 'multireddit_copy': 'api/multi/copy/', + 'multireddit_rename': 'api/multi/rename/', + 'multireddit_update': 'api/multi/user/{user}/m/{multi}/r/{subreddit}', + 'multireddit_user': 'api/multi/user/{user}/', + 'mute_sender': 'api/mute_message_author/', + 'quarantine_opt_in': 'api/quarantine_optin', + 'quarantine_opt_out': 'api/quarantine_optout', + 'read_message': 'api/read_message/', + 'remove': 'api/remove/', + 'report': 'api/report/', + 'rules': 'r/{subreddit}/about/rules', + 'save': 'api/save/', + 'search': 'r/{subreddit}/search/', + 'select_flair': 'r/{subreddit}/api/selectflair/', + 'sendreplies': 'api/sendreplies', + 'sent': 'message/sent/', + 'setpermissions': 'r/{subreddit}/api/setpermissions/', + 'spoiler': 'api/spoiler/', + 'site_admin': 'api/site_admin/', + 'sticky_submission': 'api/set_subreddit_sticky/', + 'sub_recommended': 'api/recommend/sr/{subreddits}', + 'submission': 'comments/{id}/', + 'submission_replies': 'message/selfreply/', + 'submit': 'api/submit/', + 'subreddit': 'r/{subreddit}/', + 'subreddit_about': 'r/{subreddit}/about/', + 'subreddit_filter': ('api/filter/user/{user}/f/{special}/' + 'r/{subreddit}'), + 'subreddit_filter_list': 'api/filter/user/{user}/f/{special}', + 'subreddit_random': 'r/{subreddit}/random/', + 'subreddit_settings': 'r/{subreddit}/about/edit/', + 'subreddit_stylesheet': 'r/{subreddit}/api/subreddit_stylesheet/', + 'subreddits_by_topic': 'api/subreddits_by_topic', + 'subreddits_default': 'subreddits/default/', + 'subreddits_gold': 'subreddits/gold/', + 'subreddits_new': 'subreddits/new/', + 'subreddits_popular': 'subreddits/popular/', + 'subreddits_name_search': 'api/search_reddit_names/', + 'subreddits_search': 'subreddits/search/', + 'subscribe': 'api/subscribe/', + 'suggested_sort': 'api/set_suggested_sort/', + 'unfriend': 'r/{subreddit}/api/unfriend/', + 'unhide': 'api/unhide/', + 'unignore_reports': 'api/unignore_reports/', + 'unlock': 'api/unlock/', + 'unmarknsfw': 'api/unmarknsfw/', + 'unmute_sender': 'api/unmute_message_author/', + 'unread': 'message/unread/', + 'unread_message': 'api/unread_message/', + 'unsave': 'api/unsave/', + 'unspoiler': 'api/unspoiler/', + 'upload_image': 'r/{subreddit}/api/upload_sr_img', + 'user': 'user/{user}/', + 'user_about': 'user/{user}/about/', + 'vote': 'api/vote/', + 'wiki_edit': 'r/{subreddit}/api/wiki/edit/', + 'wiki_page': 'r/{subreddit}/wiki/{page}', + 'wiki_page_editor': 'r/{subreddit}/api/wiki/alloweditor/{method}', + 'wiki_page_revisions': 'r/{subreddit}/wiki/revisions/{page}', + 'wiki_page_settings': 'r/{subreddit}/wiki/settings/{page}', + 'wiki_pages': 'r/{subreddit}/wiki/pages/', + 'wiki_revisions': 'r/{subreddit}/wiki/revisions/'} + +JPEG_HEADER = b'\xff\xd8\xff' +MAX_IMAGE_SIZE = 512000 +MIN_PNG_SIZE = 67 +MIN_JPEG_SIZE = 128 +PNG_HEADER = b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a' + +USER_AGENT_FORMAT = '{{}} PRAW/{}'.format(__version__) + + +# pylint: disable=import-error,no-name-in-module,unused-import +if sys.version_info.major == 2: + import ConfigParser as configparser # NOQA + from urlparse import urljoin, urlparse # NOQA +else: + import configparser # NOQA + from urllib.parse import urljoin, urlparse # NOQA diff --git a/env/lib/python3.4/site-packages/praw/exceptions.py b/env/lib/python3.4/site-packages/praw/exceptions.py new file mode 100644 index 0000000..8704a88 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/exceptions.py @@ -0,0 +1,35 @@ +"""PRAW exception classes. + +Includes two main exceptions: :class:`.APIException` for when something goes +wrong on the server side, and :class:`.ClientException` when something goes +wrong on the client side. Both of these classes extend :class:`.PRAWException`. + +""" + + +class PRAWException(Exception): + """The base PRAW Exception that all other exception classes extend.""" + + +class APIException(PRAWException): + """Indicate exception that involve responses from Reddit's API.""" + + def __init__(self, error_type, message, field): + """Initialize an instance of APIException. + + :param error_type: The error type set on Reddit's end. + :param message: The associated message for the error. + :param field: The input field associated with the error if available. + + """ + error_str = '{}: \'{}\''.format(error_type, message) + if field: + error_str += ' on field \'{}\''.format(field) + super(APIException, self).__init__(error_str) + self.error_type = error_type + self.message = message + self.field = field + + +class ClientException(PRAWException): + """Indicate exceptions that don't involve interaction with Reddit's API.""" diff --git a/env/lib/python3.4/site-packages/praw/models/__init__.py b/env/lib/python3.4/site-packages/praw/models/__init__.py new file mode 100644 index 0000000..52b0694 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/__init__.py @@ -0,0 +1,31 @@ +"""Provide the PRAW models.""" +from .auth import Auth # NOQA +from .front import Front # NOQA +from .helpers import LiveHelper, MultiredditHelper, SubredditHelper # NOQA +from .inbox import Inbox # NOQA +from .list.redditor import RedditorList # NOQA +from .listing.domain import DomainListing # NOQA +from .listing.generator import ListingGenerator # NOQA +from .listing.listing import Listing # NOQA +from .modaction import ModAction # NOQA +from .reddit.comment import Comment # NOQA +from .reddit.live import LiveThread, LiveUpdate # NOQA +from .reddit.message import Message, SubredditMessage # NOQA +from .reddit.modmail import (ModmailAction, ModmailConversation, # NOQA + ModmailMessage) # NOQA +from .reddit.more import MoreComments # NOQA +from .reddit.multi import Multireddit # NOQA +from .reddit.redditor import Redditor # NOQA +from .reddit.submission import Submission # NOQA +from .reddit.subreddit import Subreddit # NOQA +from .reddit.wikipage import WikiPage # NOQA +from .stylesheet import Stylesheet # NOQA +from .subreddits import Subreddits # NOQA +from .user import User # NOQA + +__all__ = ('Auth', 'Comment', 'DomainListing', 'Front', 'Inbox', 'Listing', + 'ListingGenerator', 'LiveHelper', 'LiveThread', 'Message', + 'ModAction', 'ModmailConversation', 'MoreComments', 'Multireddit', + 'MultiredditHelper', 'Redditor', 'RedditorList', 'Stylesheet', + 'Submission', 'Subreddit', 'SubredditHelper', 'SubredditMessage', + 'Subreddits', 'User', 'WikiPage') diff --git a/env/lib/python3.4/site-packages/praw/models/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fe1d721edebfce03dcea5c2cdd9d4e1b7b089d7 GIT binary patch literal 1895 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 Iht6U1|3$DS>;M1& literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/__pycache__/base.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/__pycache__/base.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e78c38e2bc435dc439d9936aab9bdf1475d1cb0a GIT binary patch literal 1686 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/__pycache__/helpers.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/__pycache__/helpers.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..693d07544950bfa77fc4fee7a32425896ffc1ac8 GIT binary patch literal 8016 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 AJOBUy literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/__pycache__/modaction.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/__pycache__/modaction.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a96fd3650f0e98dc6c780f6c28b6dbd12210384 GIT binary patch literal 769 zcmZuvzmL-}82#-0XztV^1S?2cGh7S9ZGi5M0Wn-vl>yPka%02gl-9vcuC%)CSou2; z|B_cG7XAPxzRx+T4p{l#XFo@N?>YHB938)%egE){0sMr65##&}%RNI-01HG0ibKs{ z#bLpLy-^XU7{20844T7T1Pf#mcvqymCo^kqDy8%GO6QkGotJH8)_GY==f=NK4GQM7 z+5G(dg><^a^?pP+JHv7>5j0ApE+QubD4=7qf!Zj1hfD%Gf$Nk^9Fn~cf3(-$J)P^u zYNyw2F7uU9+RE10Tn1<3l04C%&aqx&xyJ~%0N41iFu|A%1G3%oxo$hV4*BL3$%iF5j$Of`~fya#XqN$cGXOpsySJ9 zRjp3G7_)3Xsnbbg<)#M;P`e4X`vA?>N4Pp7+vFdj-RSb)#gB2P3@mO?-zOa5;x=Rx z;X`A#X~Arabir+c%_ldq?sRb0!vI;EAw0n9#rU)s_)LhkTxlWvv7lI8P4l4;pF3IK z?+k=crbIextZB4ux8Wq8I^DL~9;nbw*dRrJ1g#vwkfr=lVu_m;u_gaLUgA$=DO2G8 TcZknk^p0N92X>S%5d5$Ku*X&anKA34mk&Qr2v#KzenVIf*G1IF1T$W>VuTC;!<JsGhrYU^-Jx3zxL%(rsuYS*8M&(=22{X;na6A|AJegOcdWfuSd literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/__pycache__/subreddits.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/__pycache__/subreddits.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecc7051f45407933a777ca1b9eaa9a694b195aea GIT binary patch literal 5283 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/__pycache__/util.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/__pycache__/util.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b946f915b606a835bbac766e452495a15cea25c8 GIT binary patch literal 6818 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 aS?j*N@%@NOO-&_?DRJso*RQU3U-=Ke^fXZb literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/auth.py b/env/lib/python3.4/site-packages/praw/models/auth.py new file mode 100644 index 0000000..6e6b262 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/auth.py @@ -0,0 +1,121 @@ +"""Provide the Auth class.""" +from prawcore import (Authorizer, ImplicitAuthorizer, TrustedAuthenticator, + UntrustedAuthenticator, session) + +from .base import PRAWBase +from ..exceptions import ClientException + + +class Auth(PRAWBase): + """Auth provides an interface to Reddit's authorization.""" + + @property + def limits(self): + """Return a dictionary containing the rate limit info. + + The keys are: + + :remaining: The number of requests remaining to be made in the + current rate limit window. + :reset_timestamp: A unix timestamp providing an upper bound on when the + rate limit counters will reset. + :used: The number of requests made in the current rate limit + window. + + All values are initially ``None`` as these values are set in response + to issued requests. + + The ``reset_timestamp`` value is an upper bound as the real timestamp + is computed on Reddit's end in preparation for sending the + response. This value may change slightly within a given window due to + slight changes in response times and rounding. + + """ + data = self._reddit._core._rate_limiter + return {'remaining': data.remaining, + 'reset_timestamp': data.reset_timestamp, 'used': data.used} + + def authorize(self, code): + """Complete the web authorization flow and return the refresh token. + + :param code: The code obtained through the request to the redirect uri. + :returns: The obtained refresh token, if available, otherwise ``None``. + + The session's active authorization will be updated upon success. + + """ + authenticator = self._reddit._read_only_core._authorizer._authenticator + if not isinstance(authenticator, TrustedAuthenticator) or \ + self._reddit.config.username: + raise ClientException('authorize can only be used with web apps.') + authorizer = Authorizer(authenticator) + authorizer.authorize(code) + authorized_session = session(authorizer) + self._reddit._core = self._reddit._authorized_core = authorized_session + return authorizer.refresh_token + + def implicit(self, access_token, expires_in, scope): + """Set the active authorization to be an implicit authorization. + + :param access_token: The access_token obtained from Reddit's callback. + :param expires_in: The number of seconds the ``access_token`` is valid + for. The origin of this value was returned from Reddit's callback. + You may need to subtract an offset before passing in this number to + account for a delay between when Reddit prepared the response, and + when you make this function call. + :param scope: A space-delimited string of Reddit OAuth2 scope names as + returned from Reddit's callback. + + Raise :class:`.ClientException` if :class:`.Reddit` was initialized for + a non-installed application type. + + """ + authenticator = self._reddit._read_only_core._authorizer._authenticator + if not isinstance(authenticator, UntrustedAuthenticator): + raise ClientException('implicit can only be used with installed ' + 'apps.') + implicit_session = session(ImplicitAuthorizer( + authenticator, access_token, expires_in, scope)) + self._reddit._core = self._reddit._authorized_core = implicit_session + + def scopes(self): + """Return a set of scopes included in the current authorization. + + For read-only authorizations this should return ``{'*'}``. + + """ + authorizer = self._reddit._core._authorizer + if not authorizer.is_valid(): + authorizer.refresh() + return authorizer.scopes + + def url(self, scopes, state, duration='permanent', implicit=False): + """Return the URL used out-of-band to grant access to your application. + + :param scopes: A list of OAuth scopes to request authorization for. + :param state: A string that will be reflected in the callback to + ``redirect_uri``. This value should be temporarily unique to the + client for whom the URL was generated for. + :param duration: Either ``permanent`` or ``temporary`` (default: + permanent). ``temporary`` authorizations generate access tokens + that last only 1 hour. ``permanent`` authorizations additionally + generate a refresh token that can be indefinitely used to generate + new hour-long access tokens. This value is ignored when + ``implicit=True``. + :param implicit: For **installed** applications, this value can be set + to use the implicit, rather than the code flow. When True, the + ``duration`` argument has no effect as only temporary tokens can be + retrieved. + + """ + authenticator = self._reddit._read_only_core._authorizer._authenticator + if authenticator.redirect_uri is self._reddit.config.CONFIG_NOT_SET: + raise ClientException('redirect_uri must be provided') + if isinstance(authenticator, UntrustedAuthenticator): + return authenticator.authorize_url( + 'temporary' if implicit else duration, scopes, state, + implicit=implicit) + elif implicit: + raise ClientException('implicit can only be set for installed ' + 'applications') + return authenticator.authorize_url(duration, scopes, state) diff --git a/env/lib/python3.4/site-packages/praw/models/base.py b/env/lib/python3.4/site-packages/praw/models/base.py new file mode 100644 index 0000000..4a3ec7c --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/base.py @@ -0,0 +1,41 @@ +"""Provide the PRAWBase superclass.""" +from copy import deepcopy + + +class PRAWBase(object): + """Superclass for all models in PRAW.""" + + @staticmethod + def _safely_add_arguments(argument_dict, key, **new_arguments): + """Replace argument_dict[key] with a deepcopy and update. + + This method is often called when new parameters need to be added to a + request. By calling this method and adding the new or updated + parameters we can insure we don't modify the dictionary passed in by + the caller. + + """ + value = deepcopy(argument_dict[key]) if key in argument_dict else {} + value.update(new_arguments) + argument_dict[key] = value + + @classmethod + def parse(cls, data, reddit): + """Return an instance of ``cls`` from ``data``. + + :param data: The structured data. + :param reddit: An instance of :class:`.Reddit`. + + """ + return cls(reddit, _data=data) + + def __init__(self, reddit, _data): + """Initialize a PRAWModel instance. + + :param reddit: An instance of :class:`.Reddit`. + + """ + self._reddit = reddit + if _data: + for attribute, value in _data.items(): + setattr(self, attribute, value) diff --git a/env/lib/python3.4/site-packages/praw/models/comment_forest.py b/env/lib/python3.4/site-packages/praw/models/comment_forest.py new file mode 100644 index 0000000..7152e73 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/comment_forest.py @@ -0,0 +1,178 @@ +"""Provide CommentForest for Submission comments.""" +from heapq import heappop, heappush + +from .reddit.more import MoreComments + + +class CommentForest(object): + """A forest of comments starts with multiple top-level comments. + + Each of these comments can be a tree of replies. + + """ + + @staticmethod + def _gather_more_comments(tree, parent_tree=None): + """Return a list of MoreComments objects obtained from tree.""" + more_comments = [] + queue = [(None, x) for x in tree] + while len(queue) > 0: + parent, comment = queue.pop(0) + if isinstance(comment, MoreComments): + heappush(more_comments, comment) + if parent: + comment._remove_from = parent.replies._comments + else: + comment._remove_from = parent_tree or tree + else: + for item in comment.replies: + queue.append((comment, item)) + return more_comments + + def __getitem__(self, index): + """Return the comment at position ``index`` in the list. + + This method is to be used like an array access, such as: + + .. code:: python + + first_comment = submission.comments[0] + + Alternatively, the presence of this method enables one to iterate over + all top_level comments, like so: + + .. code:: python + + for comment in submission.comments: + print(comment.body) + + """ + return self._comments[index] + + def __init__(self, submission, comments=None): + """Initialize a CommentForest instance. + + :param submission: An instance of :class:`~.Subreddit` that is the + parent of the comments. + :param comments: Initialize the Forest with a list of comments + (default: None). + + """ + self._comments = comments + self._submission = submission + + def __len__(self): + """Return the number of top-level comments in the forest.""" + return len(self._comments) + + def _insert_comment(self, comment): + assert comment.name not in self._submission._comments_by_id + comment.submission = self._submission + if isinstance(comment, MoreComments) or comment.is_root: + self._comments.append(comment) + else: + assert comment.parent_id in self._submission._comments_by_id + parent = self._submission._comments_by_id[comment.parent_id] + parent.replies._comments.append(comment) + + def _update(self, comments): + self._comments = comments + for comment in comments: + comment.submission = self._submission + + def list(self): + """Return a flattened list of all Comments. + + This list may contain :class:`.MoreComments` instances if + :meth:`.replace_more` was not called first. + + """ + comments = [] + queue = list(self) + while queue: + comment = queue.pop(0) + comments.append(comment) + if not isinstance(comment, MoreComments): + queue.extend(comment.replies) + return comments + + def replace_more(self, limit=32, threshold=0): + """Update the comment forest by resolving instances of MoreComments. + + :param limit: The maximum number of :class:`.MoreComments` instances to + replace. Each replacement requires 1 API request. Set to ``None`` + to have no limit, or to ``0`` to remove all :class:`.MoreComments` + instances without additional requests (default: 32). + :param threshold: The minimum number of children comments a + :class:`.MoreComments` instance must have in order to be + replaced. :class:`.MoreComments` instances that represent "continue + this thread" links unfortunately appear to have 0 + children. (default: 0). + + :returns: A list of :class:`.MoreComments` instances that were not + replaced. + + For example, to replace up to 32 :class:`.MoreComments` instances of a + submission try: + + .. code:: python + + submission = reddit.submission('3hahrw') + submission.comments.replace_more() + + Alternatively, to replace :class:`.MoreComments` instances within the + replies of a single comment try: + + .. code:: python + + comment = reddit.comment('d8r4im1') + comment.refresh() + comment.replies.replace_more() + + .. note:: This method can take a long time as each replacement will + discover at most 20 new :class:`.Comment` or + :class:`.MoreComments` instances. As a result, consider + looping and handling exceptions until the method returns + successfully. For example: + + .. code:: python + + while True: + try: + submission.comments.replace_more() + break + except PossibleExceptions: + print('Handling replace_more exception') + sleep(1) + + """ + remaining = limit + more_comments = self._gather_more_comments(self._comments) + skipped = [] + + # Fetch largest more_comments until reaching the limit or the threshold + while more_comments: + item = heappop(more_comments) + if remaining is not None and remaining <= 0 or \ + item.count < threshold: + skipped.append(item) + item._remove_from.remove(item) + continue + + new_comments = item.comments(update=False) + if remaining is not None: + remaining -= 1 + + # Add new MoreComment objects to the heap of more_comments + for more in self._gather_more_comments(new_comments, + self._comments): + more.submission = self._submission + heappush(more_comments, more) + # Insert all items into the tree + for comment in new_comments: + self._insert_comment(comment) + + # Remove from forest + item._remove_from.remove(item) + + return more_comments + skipped diff --git a/env/lib/python3.4/site-packages/praw/models/front.py b/env/lib/python3.4/site-packages/praw/models/front.py new file mode 100644 index 0000000..f38c65e --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/front.py @@ -0,0 +1,11 @@ +"""Provide the Front class.""" +from .listing.mixins import SubredditListingMixin + + +class Front(SubredditListingMixin): + """Front is a Listing class that represents the front page.""" + + def __init__(self, reddit): + """Initialize a Front instance.""" + super(Front, self).__init__(reddit, None) + self._path = '/' diff --git a/env/lib/python3.4/site-packages/praw/models/helpers.py b/env/lib/python3.4/site-packages/praw/models/helpers.py new file mode 100644 index 0000000..0657519 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/helpers.py @@ -0,0 +1,194 @@ +"""Provide the helper classes.""" +from json import dumps + +from ..const import API_PATH +from .base import PRAWBase +from .reddit.live import LiveThread +from .reddit.multi import Multireddit, Subreddit + + +class LiveHelper(PRAWBase): + """Provide a set of functions to interact with LiveThreads.""" + + def __call__(self, id): # pylint: disable=invalid-name,redefined-builtin + """Return a new lazy instance of :class:`~.LiveThread`. + + This method is intended to be used as: + + .. code:: python + + livethread = reddit.live('ukaeu1ik4sw5') + + :param id: A live thread ID, e.g., ``ukaeu1ik4sw5``. + """ + return LiveThread(self._reddit, id=id) + + def info(self, ids): + """Fetch information about each live thread in ``ids``. + + :param ids: A list of IDs for a live thread. + :returns: A generator that yields :class:`.LiveThread` instances. + + Live threads that cannot be matched will not be generated. + Requests will be issued in batches for each 100 IDs. + + .. note:: + This method doesn't support IDs for live updates. + + .. warning: + Unlike :meth:`.Reddit.info`, the output of this method + may not reflect the order of input. + + Usage: + + .. code:: python + + ids = ['3rgnbke2rai6hen7ciytwcxadi', + 'sw7bubeycai6hey4ciytwamw3a', + 't8jnufucss07'] + for thread in reddit.live.info(ids) + print(thread.title) + + """ + if not isinstance(ids, list): + raise TypeError('ids must be a list') + + def generator(): + for position in range(0, len(ids), 100): + ids_chunk = ids[position:position + 100] + url = API_PATH['live_info'].format(ids=','.join(ids_chunk)) + params = {'limit': 100} # 25 is used if not specified + for result in self._reddit.get(url, params=params): + yield result + + return generator() + + def create(self, title, description=None, nsfw=False, resources=None): + """Create a new LiveThread. + + :param title: The title of the new LiveThread. + :param description: (Optional) The new LiveThread's description. + :param nsfw: (boolean) Indicate whether this thread is not safe for + work (default: False). + :param resources: (Optional) Markdown formatted information that is + useful for the LiveThread. + :returns: The new LiveThread object. + + """ + return self._reddit.post(API_PATH['livecreate'], data={ + 'description': description, 'nsfw': nsfw, 'resources': resources, + 'title': title}) + + def now(self): + """Get the currently featured live thread. + + :returns: The :class:`.LiveThread` object, or ``None`` if there is + no currently featured live thread. + + Usage: + + .. code-block:: python + + thread = reddit.live.now() # LiveThread object or None + + """ + return self._reddit.get(API_PATH['live_now']) + + +class MultiredditHelper(PRAWBase): + """Provide a set of functions to interact with Multireddits.""" + + def __call__(self, redditor, name): + """Return a lazy instance of :class:`~.Multireddit`. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance who owns the multireddit. + :param name: The name of the multireddit. + + """ + path = '/user/{}/m/{}'.format(redditor, name) + return Multireddit(self._reddit, _data={'name': name, 'path': path}) + + def create(self, display_name, subreddits, description_md=None, + icon_name=None, key_color=None, visibility='private', + weighting_scheme='classic'): + """Create a new multireddit. + + :param display_name: The display name for the new multireddit. + :param subreddits: Subreddits to add to the new multireddit. + :param description_md: (Optional) Description for the new multireddit, + formatted in markdown. + :param icon_name: (Optional) Can be one of: ``art + and design``, ``ask``, ``books``, ``business``, ``cars``, + ``comics``, ``cute animals``, ``diy``, ``entertainment``, ``food + and drink``, ``funny``, ``games``, ``grooming``, ``health``, ``life + advice``, ``military``, ``models pinup``, ``music``, ``news``, + ``philosophy``, ``pictures and gifs``, ``science``, ``shopping``, + ``sports``, ``style``, ``tech``, ``travel``, ``unusual stories``, + ``video``, or ``None``. + :param key_color: (Optional) RGB hex color code of the form + ``'#FFFFFF'``. + :param visibility: (Optional) Can be one of: ``hidden``, ``private``, + ``public`` (default: private). + :param weighting_scheme: (Optional) Can be one of: ``classic``, + ``fresh`` (default: classic). + :returns: The new Multireddit object. + + """ + model = {'description_md': description_md, + 'display_name': display_name, + 'icon_name': icon_name, + 'key_color': key_color, + 'subreddits': [{'name': str(sub)} for sub in subreddits], + 'visibility': visibility, + 'weighting_scheme': weighting_scheme} + return self._reddit.post(API_PATH['multireddit_base'], + data={'model': dumps(model)}) + + +class SubredditHelper(PRAWBase): + """Provide a set of functions to interact with Subreddits.""" + + def __call__(self, display_name): + """Return a lazy instance of :class:`~.Subreddit`. + + :param display_name: The name of the subreddit. + """ + lower_name = display_name.lower() + + if lower_name == 'random': + return self._reddit.random_subreddit() + elif lower_name == 'randnsfw': + return self._reddit.random_subreddit(nsfw=True) + + return Subreddit(self._reddit, display_name=display_name) + + def create(self, name, title=None, link_type='any', + subreddit_type='public', wikimode='disabled', **other_settings): + """Create a new subreddit. + + :param name: The name for the new subreddit. + + :param title: The title of the subreddit. When ``None`` or ``''`` use + the value of ``name``. + + :param link_type: The types of submissions users can make. + One of ``any``, ``link``, ``self`` (default: any). + :param subreddit_type: One of ``archived``, ``employees_only``, + ``gold_only``, ``gold_restricted``, ``private``, ``public``, + ``restricted`` (default: public). + :param wikimode: One of ``anyone``, ``disabled``, ``modonly``. + + See :meth:`~.SubredditModeration.update` for documentation of other + available settings. + + Any keyword parameters not provided, or set explicitly to None, will + take on a default value assigned by the Reddit server. + + """ + Subreddit._create_or_update(_reddit=self._reddit, name=name, + link_type=link_type, + subreddit_type=subreddit_type, + title=title or name, wikimode=wikimode, + **other_settings) + return self(name) diff --git a/env/lib/python3.4/site-packages/praw/models/inbox.py b/env/lib/python3.4/site-packages/praw/models/inbox.py new file mode 100644 index 0000000..e1ea61d --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/inbox.py @@ -0,0 +1,235 @@ +"""Provide the Front class.""" +from ..const import API_PATH +from .listing.generator import ListingGenerator +from .base import PRAWBase +from .util import stream_generator + + +class Inbox(PRAWBase): + """Inbox is a Listing class that represents the Inbox.""" + + def all(self, **generator_kwargs): + """Return a ListingGenerator for all inbox comments and messages. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To output the type and ID of all items available via this listing do: + + .. code:: python + + for item in reddit.inbox.all(limit=None): + print(repr(item)) + + """ + return ListingGenerator(self._reddit, API_PATH['inbox'], + **generator_kwargs) + + def comment_replies(self, **generator_kwargs): + """Return a ListingGenerator for comment replies. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To output the author of one request worth of comment replies try: + + .. code:: python + + for reply in reddit.inbox.comment_replies(): + print(reply.author) + + """ + return ListingGenerator(self._reddit, API_PATH['comment_replies'], + **generator_kwargs) + + def mark_read(self, items): + """Mark Comments or Messages as read. + + :param items: A list containing instances of :class:`.Comment` and/or + :class:`.Message` to be be marked as read relative to the + authorized user's inbox. + + Requests are batched at 25 items (reddit limit). + + For example, to mark all unread Messages as read, try: + + .. code:: python + + from praw.models import Message + unread_messages = [] + for item in reddit.inbox.unread(limit=None): + if isinstance(item, Message): + unread_messages.append(item) + reddit.inbox.mark_read(unread_messages) + + .. seealso:: + + :meth:`.Comment.mark_read` and :meth:`.Message.mark_read` + + """ + while items: + data = {'id': ','.join(x.fullname for x in items[:25])} + self._reddit.post(API_PATH['read_message'], data=data) + items = items[25:] + + def mark_unread(self, items): + """Unmark Comments or Messages as read. + + :param items: A list containing instances of :class:`.Comment` and/or + :class:`.Message` to be be marked as unread relative to the + authorized user's inbox. + + Requests are batched at 25 items (reddit limit). + + For example, to mark the first 10 items as unread try: + + .. code:: python + + to_unread = list(reddit.inbox.all(limit=10)) + reddit.inbox.mark_unread(to_unread) + + .. seealso:: + + :meth:`.Comment.mark_unread` and :meth:`.Message.mark_unread` + + """ + while items: + data = {'id': ','.join(x.fullname for x in items[:25])} + self._reddit.post(API_PATH['unread_message'], data=data) + items = items[25:] + + def mentions(self, **generator_kwargs): + r"""Return a ListingGenerator for mentions. + + A mention is :class:`.Comment` in which the authorized redditor is + named in its body like ``/u/redditor_name``. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + For example, to output the author and body of the first 25 mentions + try: + + .. code:: python + + for mention in reddit.inbox.mentions(limit=25): + print('{}\n{}\n'.format(mention.author, mention.body)) + + """ + return ListingGenerator(self._reddit, API_PATH['mentions'], + **generator_kwargs) + + def message(self, message_id): + """Return a Message corresponding to ``message_id``. + + :param message_id: The base36 id of a message. + + Example: + + .. code:: python + + message = reddit.inbox.message('7bnlgu') + + """ + listing = self._reddit.get(API_PATH['message'].format(id=message_id)) + messages = [listing[0]] + listing[0].replies + while messages: + message = messages.pop(0) + if message.id == message_id: + return message + + def messages(self, **generator_kwargs): + """Return a ListingGenerator for inbox messages. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + For example, to output the subject of the most recent 5 messages try: + + .. code:: python + + for message in reddit.inbox.messages(limit=5): + print(message.subject) + + """ + return ListingGenerator(self._reddit, API_PATH['messages'], + **generator_kwargs) + + def sent(self, **generator_kwargs): + """Return a ListingGenerator for sent messages. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + For example, to output the recipient of the mot recent 15 messages + try: + + .. code:: python + + for message in reddit.inbox.sent(limit=15): + print(message.dest) + + """ + return ListingGenerator(self._reddit, API_PATH['sent'], + **generator_kwargs) + + def stream(self, **stream_options): + """Yield new inbox items as they become available. + + Items are yielded oldest first. Up to 100 historical items will + initially be returned. + + Keyword arguments are passed to :meth:`.stream_generator`. + + For example, to retrieve all new inbox items, try: + + .. code:: python + + for item in reddit.inbox.stream(): + print(item) + + """ + return stream_generator(self.unread, **stream_options) + + def submission_replies(self, **generator_kwargs): + """Return a ListingGenerator for submission replies. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To output the author of one request worth of submission replies try: + + .. code:: python + + for reply in reddit.inbox.submission_replies(): + print(reply.author) + + """ + return ListingGenerator(self._reddit, API_PATH['submission_replies'], + **generator_kwargs) + + def unread(self, mark_read=False, **generator_kwargs): + """Return a ListingGenerator for unread comments and messages. + + :param mark_read: Marks the inbox as read (default: False). + + .. note:: This only marks the inbox as read not the messages. Use + :meth:`.Inbox.mark_read` to mark the messages. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + For example, to output the author of unread comments try: + + .. code:: python + + from praw.models import Comment + for item in reddit.inbox.unread(limit=None): + if isinstance(item, Comment): + print(item.author) + + """ + self._safely_add_arguments( + generator_kwargs, 'params', mark=mark_read) + return ListingGenerator(self._reddit, API_PATH['unread'], + **generator_kwargs) diff --git a/env/lib/python3.4/site-packages/praw/models/list/__init__.py b/env/lib/python3.4/site-packages/praw/models/list/__init__.py new file mode 100644 index 0000000..fd3ca07 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/list/__init__.py @@ -0,0 +1 @@ +"""Package providing models that act like a list.""" diff --git a/env/lib/python3.4/site-packages/praw/models/list/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/list/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3734af9f319163dafbf7fcb2d304eab0a344a9e0 GIT binary patch literal 200 zcmaFI!^`CvusqU~fq~&M5W@i@kmUfx#auulg@GXoNHQ`6Ycf^o1tcbCC#I(=6cpu` zWu|22r7Ps-r=;c-E0km;mMA19mnh_9W~VA70;%E>JwHvxTkP@iDf!9q@hcgMn1IHC ziC>obCAkIq1(^l9Nu`-NDY_N;`AG%oDW>`bMTzAQ0%EQ{$Q=Fn_{_Y_lK6PNg34PQ RHb9xuoK!oID~o}c0RWu?I2r%| literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/list/__pycache__/base.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/list/__pycache__/base.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9aa7dd2f331773bc3a5d480a3df1229334f88e2 GIT binary patch literal 1945 zcmbVMU2hvj6utZ5jqNyfnzo=&Ar>TrEL5iws*s`zk$wmwRZ)}%Dhz14-kGH9u6MVy zV@RzOA%ftiApX+6^27^2fG5tKwH+q{f!JiO@6OzvIrrRi=a0@>dw2hrFTQLL{YFcV z5C3C~@-~bl8o)XvT}mAqyEJgg`9yjoefkkAJ}H;ZJQ`r8L63XE^ya?Kze%JD%`+9= zi%RtB<}HAq zu-f2rWx!wt0m&7TP3yyHk!)MPNph8B$NHFDBYDO8ZQkv1uUj?eIHw=%WMMQcjgI0O z=+NY0oGTrxFbY%7CCM-qh4UQxd+{830N_3bzn9;`82meQN_6JZ$fZ;GpbHdYYJ?md zdfp`cAsL_3J9Fp}M8ERrUg*b;sD>Q1-X@l1g zaq83E7oXD;Z2q|CP2=4xF-eprQ%+!>D3T~ml*OvwZilmHyNGl&4z-dpG20=SmO z2d&ymj$ZbH$}d%VGzjVps)mq}i3aWXS&~Y@rK=hVAe~fxV$>KqYzbkr65?0-^UjtT z7h6SA+!{{s!L5@#9~Q^*&Q_tLZ)-EorAo^!-fC+I`Sy#K8vR3UjIskm!KT}Fy6%Rv z=}fQAIqA<+j#>Zw@GlGHK1TT(49WDN0+FJ?JmaA z@432(4K!;HK10!KY`P1x4zKDU*E};3YAVDgW=adjo!(f2c^+{ADi_W|y$r1E?0kMM!e)x9*n)$s1 z8ohYNt?x|Vn!%0$(y+R6%^lB|S52>XPOsH2f`sTfHPIJ2*4J>-+Zc0dFDSr%cmd%B z1pr}vRdCzeO9Ji82;W;G79B8Dn%j{Xxg-Ry@=}$Z!~J`Z)rt@Z6XM+^pzBL)+Qt8Y z^ZhxKA+FCPJH|y)XjP(>BdY;`UShTK5cOZMA`E>01J-(Rl?#(aV}(nlEd;uBlClrU zznDbnYz2ACJQl)sifvnc72E0!He5Mv@UdEVho^0NeCf;F?KU4oe?Sntuw6;w)!u|-|#cK zb>+qnaOIss&`IveopUGWoZR`gw`%R)+sy|6d}6JSiCqIr?julu08s;~1J_`tL!g6p zK@FfLyyCPM=X4XNl;kZCL4s%BqAi(KD}&r z&Pa1O?6+H2!}E6#o0z$TpCdn;rG6Tx^-+%c^`|5mrDJ;Nry_h@0_rm^eU;f4t2KG) xvoKJkqBfvD!q%#K$#h*)SV$D+2-hZbY)k&nbJ^9@8|!!({zPrF)TwGa#xFf;d*1*6 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/list/base.py b/env/lib/python3.4/site-packages/praw/models/list/base.py new file mode 100644 index 0000000..edb1ed1 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/list/base.py @@ -0,0 +1,43 @@ +"""Provide the BaseList class.""" +from ..base import PRAWBase + + +class BaseList(PRAWBase): + """An abstract class to coerce a list into a PRAWBase.""" + + CHILD_ATTRIBUTE = None + + def __init__(self, reddit, _data): + """Initialize a BaseList instance. + + :param reddit: An instance of :class:`~.Reddit`. + + """ + super(BaseList, self).__init__(reddit, _data) + + if self.CHILD_ATTRIBUTE is None: + raise NotImplementedError('BaseList must be extended.') + + child_list = getattr(self, self.CHILD_ATTRIBUTE) + for index, item in enumerate(child_list): + child_list[index] = reddit._objector.objectify(item) + + def __contains__(self, item): + """Test if item exists in the list.""" + return item in getattr(self, self.CHILD_ATTRIBUTE) + + def __getitem__(self, index): + """Return the item at position index in the list.""" + return getattr(self, self.CHILD_ATTRIBUTE)[index] + + def __iter__(self): + """Return an iterator to the list.""" + return getattr(self, self.CHILD_ATTRIBUTE).__iter__() + + def __len__(self): + """Return the number of items in the list.""" + return len(getattr(self, self.CHILD_ATTRIBUTE)) + + def __str__(self): + """Return a string representation of the list.""" + return str(getattr(self, self.CHILD_ATTRIBUTE)) diff --git a/env/lib/python3.4/site-packages/praw/models/list/redditor.py b/env/lib/python3.4/site-packages/praw/models/list/redditor.py new file mode 100644 index 0000000..8ab0030 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/list/redditor.py @@ -0,0 +1,8 @@ +"""Provide the RedditorList class.""" +from .base import BaseList + + +class RedditorList(BaseList): + """A list of Redditors. Works just like a regular list.""" + + CHILD_ATTRIBUTE = 'children' diff --git a/env/lib/python3.4/site-packages/praw/models/listing/__init__.py b/env/lib/python3.4/site-packages/praw/models/listing/__init__.py new file mode 100644 index 0000000..f9faa15 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/listing/__init__.py @@ -0,0 +1 @@ +"""Package providing models and mixins pertaining to reddit listings.""" diff --git a/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7f349e107f80f3ea0a1796d553b319d99ca3148 GIT binary patch literal 223 zcmX|*u?oU45QbA1Mf4rAc4#xXiHKVlDLCm8q8G|x+k_<5>I;dl)YaVwaPq3+!T<4d zKiq%M$#k6Mw{6B4dyxJUkz11dm;j9Jh!NYwgX=0+hodSqx6Ygpur7FIK$o7Y8hC{* z)}CAKg2K8FgW*mCVBjVCKpUT~ow)&3eDIo!P+4KoCi@0UNLpj|wt$(i fPMyE_c8T9DAtkj0DN}ptMso_AQZM@FJ&C;m4DUg} literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/domain.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/domain.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82e3067bc1aa578c37e947faebe62e336322dbe0 GIT binary patch literal 971 zcmZ8g&2AGh5FYPe(x`JM z8SzTKa_WT#;KX=0p{3S(JUbrGeBXHddvj|rng00jJ^=UycSel*OPpqcLI7ka35Wm+ z0%ZVM07Qf!A}B&ABgi5sW5{A4uSEI(U?N{8$mG3)ssVevANEtkM*OsI2 zzu_bKVV4hiuTA`j?>6({fBG$d<~gXBQ33GbhfB+tLn;7 zTT@k8sd;Ycg|c%hT1vF&IGJI-2I1HBG|%wI;z!^L;5vZw0Im=U@j9_s*Z_9VBfne) za18{#7}k{_ym0w_QYou=p_Y>Jdo@&*vAoLVa4?{&F>bi#CDl?0Wyf^CLd2bur*hPq zhxffZ8e@8bx3r=(t2Mott9*WmvJ?IVt)2D1 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/generator.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/generator.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ee479945dbc9a9152812850bafb7fef83650f0d GIT binary patch literal 3089 zcmbVOUvC^q5wDq@UGJ{fi7&YvG2x*Rpkq&$+1w$7Sls~!(w!pZj1>nV7Kw3tr){@0 ze>UB{#J2nbLBK1Y0`bac;e~laJmrNCz!Sgfp0#5;NQh0QUDI7vT~)vOGyfWG3?J|O z`4@j568)3j_$8o!gvah+$%$rIBg$hcA}V8=#T4Zo$`dL&R3)2nuGC^)FHT=aVPo`pA+>3xUdJuh&eP9+{$pv?oW)kZZcEr-fl%-RPGF7Mn;9Gc z(V;&O9bi8pxbS;82ck!?9;VOWRG*Dz8kz>GO!Q{u4 zb+Vc(E9wLIt8MU490q@tn0kMwd+Ae^=i0FodqS_I(&13xm!{&SG!^1Bor-6dTI^B1 zEOJrRPV6g@Yoq3_I2B8$3w@^YRPgmm=Hj$oikG@5yf!F2&{Zy^sFvlvGHhC@+)IPc|EtOt|zLR6w)c{CRRx^KT3~W zS^V(Dr`KZ?biD>Fv^`(p#eX~PV}Ap};eSNuM6Y5xj_DkDMNCJ45W5+$^v4;%3q+UB zJN~Fg=Lwmgl3QcqRYX;XH2I@G^DHDM0hAmA>4ZKx4;lxY4y+oOM}W5{aWBBsPD>6g zVt3t@i*U7=F>cd^G_piI8QQ7%>@ubt(reJ~r7Lt+a!XS{Nc`;SlNJ&r0B#QIL=h_I zhE$k{92T{%@bfyZcMqpQV%asWm=J`j6*US#eaK~61#Tg& zC}nkep$6}Z+FHF|s8oDeTgQF{``*8*sbh#{9AHfVl^-4whL^Vs0fjiT2y%6JM7x}}Jy53(L=HK<5AS`8_tHMrNVx1OEaJqax;u`}KHgCV$$zspk?u7@hnB=CEK!F* zg2zp2-i7!$GHi^e!*UO=KE~k7vJdcPIerws-8|2A#k>xfy?K8E!TrS#(dPp)5B;m} zQ`mgo37m?!_JM@LWaBpy4l!u_2RLQDeAy% zV9(s*gHE9;xJG%Y$tOycU!p_Oy!~PEt zA?)TJPme3%#TdDWM+i?BfsMeQ_57#+ULg8BWXvzyP$QaKfujOom?wd0;FRX z{D3edTV?oxmjc=I|AAAMNY%L3Q-E3&riF7^Y^Z?do%*Nw{E}gu9&KNO}y-eWo5@ zc{_Gy3rABt_N!P3B|HLjcTmiCq6g6+zK8cw^j>`SwVQ=~nHN`3yr^w_ntJy!`a^~P zzghcn3gg+nxBJi}Y{{26UzPd28^$unc)(4elBM#EH$$IW7EF(_?8QM*UuV|NbZ$jYfC<$@aK!zKMe-;Sb`_ q&(|0+%o-0@lkDU3(ezfTE^m3WseKZR{s9Ns@@>6nGv16gJO2TTQ281F literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/listing.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/__pycache__/listing.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ff784bc313d96be08b7f4138a53c77c49f5fad5 GIT binary patch literal 1632 zcmZ`(-*4PR5T3PtwlBSMs4bx_60&#!Bh`_RcmkoODJ_wz5aogpep&hKy~M$1o85Iu ztndVaKLznG?JG~b@CWe3%%1ND2rTb-y=%{W-+VLs=j86*@#(MMyyF4<4m%gV!&4mU z1)2gNMa!UYpklCeAa#JfEL1k{<5StZ zE(;OqOA);)l`iXxD6cZ5l0O^_6f+Z^o*jPuEK?%K_s!)FGYdx`9K?dwAy60;aith! zjVDD2YZR#uzW^-o`v8g%e#XB7TA9UT6ATdgj}D`1KvSwHi}I$bM6S!Gj+#YuCW@le zgefX(rL#I0DluVxSyqJ}--`^tM?B|4(E_$wqdX6s$lk@@j)&cpxoimc_ z%7t62*bffWNX`R2qFrQm<=elkqzp@N7CZe1U(TNiih}WjTy+qUdeHe8+bt-o&%(IWBE3BKs7FO3?gYp9}2mb*p1TVTWV4&tl(9 zUQ}5r2l4xO){4B$s?9;OXk>Jm)kQ_8&VoL*U9XaK)F~m=KN^{k91)VoXjX-dLZkL_ ze<+a|o;tJG?cdue?^;~zt<(_)JZWl?7>_niV#frRnIhffLv)KdqUzoz&1TDtvV|7% zT?%d$bEhm|{k>gsiT#8s={`B2=96!cp<~AiW5QN8SU>tk5`&!>bV{sbc^hYsaM&;_ pStPBU#3Sp-cym1TB=xzK%5MIbClh|UDwfaa47Bci_NKf4;BS~uayS40 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/domain.py b/env/lib/python3.4/site-packages/praw/models/listing/domain.py new file mode 100644 index 0000000..cc03206 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/listing/domain.py @@ -0,0 +1,17 @@ +"""Provide the DomainListing class.""" +from ...const import API_PATH +from .mixins import BaseListingMixin, RisingListingMixin + + +class DomainListing(BaseListingMixin, RisingListingMixin): + """Provide a set of functions to interact with domain listings.""" + + def __init__(self, reddit, domain): + """Initialize a DomainListing instance. + + :param reddit: An instance of Reddit. + :param domain: The domain for which to obtain listings. + + """ + super(DomainListing, self).__init__(reddit, None) + self._path = API_PATH['domain'].format(domain=domain) diff --git a/env/lib/python3.4/site-packages/praw/models/listing/generator.py b/env/lib/python3.4/site-packages/praw/models/listing/generator.py new file mode 100644 index 0000000..5d6a492 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/listing/generator.py @@ -0,0 +1,79 @@ +"""Provide the ListingGenerator class.""" +from copy import deepcopy + +from .listing import FlairListing +from ..base import PRAWBase + + +class ListingGenerator(PRAWBase): + """Instances of this class generate :class:`.RedditBase` instances. + + .. warning:: This class should not be directly utilized. Instead you will + find a number of methods that return instances of the class: + + http://praw.readthedocs.io/en/latest/search.html?q=ListingGenerator + + """ + + def __init__(self, reddit, url, limit=100, params=None): + """Initialize a ListingGenerator instance. + + :param reddit: An instance of :class:`.Reddit`. + :param url: A URL returning a reddit listing. + :param limit: The number of content entries to fetch. If ``limit`` is + None, then fetch as many entries as possible. Most of reddit's + listings contain a maximum of 1000 items, and are returned 100 at a + time. This class will automatically issue all necessary + requests (default: 100). + :param params: A dictionary containing additional query string + parameters to send with the request. + + """ + super(ListingGenerator, self).__init__(reddit, None) + self._exhausted = False + self._listing = None + self._list_index = None + self.limit = limit + self.params = deepcopy(params) if params else {} + self.params['limit'] = limit or 1024 + self.url = url + self.yielded = 0 + + def __iter__(self): + """Permit ListingGenerator to operate as an iterator.""" + return self + + def __next__(self): + """Permit ListingGenerator to operate as a generator in py3.""" + if self.limit is not None and self.yielded >= self.limit: + raise StopIteration() + + if self._listing is None or self._list_index >= len(self._listing): + self._next_batch() + + self._list_index += 1 + self.yielded += 1 + return self._listing[self._list_index - 1] + + def _next_batch(self): + if self._exhausted: + raise StopIteration() + + self._listing = self._reddit.get(self.url, params=self.params) + if isinstance(self._listing, list): + self._listing = self._listing[1] # for submission duplicates + elif isinstance(self._listing, dict): + self._listing = FlairListing(self._reddit, self._listing) + self._list_index = 0 + + if len(self._listing) == 0: + raise StopIteration() + + if self._listing.after: + self.params['after'] = self._listing.after + else: + self._exhausted = True + + def next(self): + """Permit ListingGenerator to operate as a generator in py2.""" + return self.__next__() diff --git a/env/lib/python3.4/site-packages/praw/models/listing/listing.py b/env/lib/python3.4/site-packages/praw/models/listing/listing.py new file mode 100644 index 0000000..60bb838 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/listing/listing.py @@ -0,0 +1,35 @@ +"""Provide the Listing class.""" +from ..base import PRAWBase + + +class Listing(PRAWBase): + """A listing is a collection of RedditBase instances.""" + + CHILD_ATTRIBUTE = 'children' + + def __len__(self): + """Return the number of items in the Listing.""" + return len(getattr(self, self.CHILD_ATTRIBUTE)) + + def __getitem__(self, index): + """Return the item at position index in the list.""" + return getattr(self, self.CHILD_ATTRIBUTE)[index] + + def __setattr__(self, attribute, value): + """Objectify the CHILD_ATTRIBUTE attribute.""" + if attribute == self.CHILD_ATTRIBUTE: + value = self._reddit._objector.objectify(value) + super(Listing, self).__setattr__(attribute, value) + + +class FlairListing(Listing): + """Special Listing for handling flair lists.""" + + CHILD_ATTRIBUTE = 'users' + + @property + def after(self): + """Return the next attribute or None.""" + if hasattr(self, 'next'): + return self.next # pylint: disable=no-member + return None diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__init__.py b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__init__.py new file mode 100644 index 0000000..ca25d61 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__init__.py @@ -0,0 +1,6 @@ +"""Package providing models that pertain to listing mixins.""" +from .base import BaseListingMixin # NOQA +from .redditor import RedditorListingMixin # NOQA +from .rising import RisingListingMixin # NOQA +from .submission import SubmissionListingMixin # NOQA +from .subreddit import SubredditListingMixin # NOQA diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11ed04cbb1ca74442702b4221a0292608a4e34d4 GIT binary patch literal 504 zcmZ8du};G<5WS>nng);%0_Ln8+Du3t5JE5^0jk;wFIG}V#lns)+l9gpA$}<<6AK@} z#3e?ksx80sd+&5--}nAOdNX@}m<9l!u(d+GU*fR@fdOD(0k9B605Sv;LeTOah#trY zNaT40q7O0#5_{eUF#wqWNj#513_+$qQse_zjFPwMtXMu3t18n*J#)tERVEdygw5Pz z;WAwrSMWM>Dihqg&gL6l+sPNc8Ad^KcvaZy)_ZrYh1&7FVvIXwcJ!k;w^(9FJzcCz z$*tw8-f>RQFenWP^(3NDmK~iT+TT=bLKnWoZa6m3*}q)e*R7` zGxi%ByByT7;8x$G@EL2Ow3we`p~a#cYv!2c+st=ZXtT&+O$Y5f^9wA@v#7wD1+}1J^_#&H-cBT67rr0h zVLTGLoA?S#@igx%!9D({FXVvtJn2OoGwKRSqcK-ZPf$VOH~i7!I6wm09k zh;~S=ZNmTc-T<@gNr9P*BDuJPg5{R2Q&!QEOQ^S~WB)3kas{_~j6wh;a5~ByZAKHw zLdD=KLlv;p1*#k-05Sk)j-Z4+1I|dYOi+4`CLmW~{(?ar#Evn4(bR!Hh%GVyxDkW= zGB)s?bZHW9!%J6vY+n?_LDY}95}GINmv`0c^}+$y3HQQ~?|Fh}9#-|#MsI5S-XL|l zNnfV7rlSNdw5wQ324j0pxa($iURw78fUVIRG)%lSHtG+(urF>%naB+uwE4z{4kF>UgHQ{(fiA`4MDxd9 z82I(!*|9+$^_AwEf+sQVc7y-$beLP^cWZfh9Ft6!A6~tE>$>~k)}0&f&0Du0+*rS# zmJgnm77!4Tr&EXG6d^l5X4?QQD;CMtN!Luk)50B-I)NcY0Aco`wP+2`PwrCvP_-6e zo-T4KMfx|m)z>JpNJm`5btarG3Su}Ho~2#{Ih+kC>a~fTp4v=<08HfX8YcKDN1pbo zHe>5T_hpRGp5z+C1ubki2u(;8cp*i36etxWv8tELeD7*xbTGE&2EPVQ81p)Cw90{_ zRZcisUG`%A2k}hHvsF#2P1HZG>lyLlgJC=m1+=m`m)|iqG}E0*aods$)nZUXod&65&Ris zc2=s&i~15l=0(+2UhT=G13m{$bfyhr(+;(lnMx##^~7*m&+PE5nvr4q$+ZwJX0tGk z%L#`7L5JFa%Dy*@$mGKbr%)VuQqnPyS~^{L=>g!8_c0*nsi1Q~QmCgzH#1&yaO#P$ zEzeNzQfL1hcei%{IhEST048WeegM(;aA#-Ey9+pTmaXC0DcX2x9<6;IMnoIRFm!Pd z4Nw9S1JFZ&Lk5|S23?q5&;@Zrj;NWq!4Lza4L8_c2?X@l+|UK(23kbpT<})K78bbj zMzM61fvMn`Sr9>=#mdYYZ#SH=z&C^QQ3j^qJhR{k&NFL_!}%zs zDL7|>lW<0F&5@rFL`Td$8;;LI=guo}4Ez5`7WeBbnOY~k|8uwhUhal%`8zT;V`k<& z%}Bpac4ib`FDEmqGiPE(`q2DKo<-25HUtjOyRztYvQvmsuA`5lDn?rr!sg9>Kg*gv zjPR_xwR!qx5qo&$bknly;=@5dq~3vNeu|+qj~q~G^LZq7 qHu2#i`$inz0+b?jH8EwDd)`o=cQMsxpd#wM2h*rSvC~sx>tL literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/gilded.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/gilded.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da3eae2358357949977ade2c7233474535dca7e4 GIT binary patch literal 928 zcmZWnJ#X7E5IucZQd}1>I<@FfqCf`^v8OIZQN&%0qHSO#Ls2b^Y|=IpN>oUxPK<8p z+F#M3=wH&>$xDAgryeESFcJ!PI8w)Z?;Y=N=W+Y}3-AXHmXGlXnwg+u05N(8 zmjuhk3w!kRGHy#6Ip@zygphNCSuiaKfx3a5;~=i`^^Gs}+(mzd=93 zynmxXk>-P3lhaw*9P literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/redditor.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/redditor.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a8a412c4c4f2025756f0fedc07c520ea8409ea4 GIT binary patch literal 5865 zcmeHLOK%)S5boLc+H35XS3)2(5|X`AG8+znSOFqL!bA`&N^)V7XgoX9wkMev-92`^ zATB|0;&&i^4IplF;lKgq!VloYS3SEkYsW!KB2W&Qb+`LjT~+;cbyxk>TUxku<;O36 ze}S<-*xc7d`6DECfXruXgxq3&jfEDAYHUM`>784zI4>P-L!(U+jqUl(qj(c@BLQ9Wb>n}~#uE=CB z@CDbqf?pNBALvAW9w;5eJC}pILCn3-Rm#5K0Hb{?Z)Y;RodogyT2Wt_j@=NkkS^xl zx27E*yGqOx!sOMBAoPVl-|As>`PEVS2ubZB6VM7&g1kn$8P%C+kcOZa$aoJeP1AzL z=B%YfD)QS@9kp4h5U8ir0Tcq!{UtL7YIu(M%ci`@{1vF=ME=5YYM8ut!S@w+NkKsp zyCIK+-c8Vy3aQ;7hQ7E?N)_@TR@#j{p=^&dLLdDnHC{wgA0YdhvD^5AlokmD;qG*p ze23|p>8hI?^3`e2FxY9bxR})hrw#WKD9-lJjmsr@vdxEP+lE{AwQM}q_ZHtyB=?di z60zp42i}yuu)wF^C+HM+-6##kS&}5lbed^{i|s%v&BGuTMA{8Q9*g}MCB?@FC6TSI zK{imSm~3rvEf0njdE3SWUkrylJ%Hlkst4=OGX}^>gG0Ocm&o-sqPW(#r@Sj0%ddw) z6zC5&lUVeJ<@!@uQW?a0eLCD8C;ox0(lF5LYd7Pyv;3|8jq|r|4Bvh4R=;8+?>aO3 zn|Wte?6>lc&`~-_ zgY?`u1N_h3O_FiC497Tr9~vwLdKR(T4$`u zYgdmsuBDFtJJfAF2I^Ecjsm4{avlkII?$n5Q-nI5r2MV(=Vt)aK_qxZRh0-JC_MoR zE0Q=)4+Ua1O4(p+eGO+~?O`yi2HQrSdCc{ks#k4}x~8VJ@cS)E`z?EvEm8IyWy_R3 zkF0OW6)F?Nifk37d~uH4t7uRiWQ3Px{3fM!nzz9A+>{bDWZmhG`V2|Ej!YMJ$Es`- z*(}&8i~Uf8F{-)00Tx$<&Lp;&PZua}1#`j!Eh1$MN~VP5yRPDXvLEjykax}yU3L$+ zbOR-@k90=7L<$?$X&m^zh+$aVZH?)GQ)Y}VE-op)%mhqS0GyyoRhzRSQv?gbcwP59XPlCo@9tVv(=6NzF{4*#P@P9g>IO!D|G}sCD zMEtL4lrI5dM*x_2XgW-Wd3zN%X|GFm@%Wo`Hu`^u;jS@s&tOPa{%N#`tzv^78G!O6 zKzSLdvVfP`W1HxHrim19w7$Uh0_ zetjI!W$Cl`-&6hmYfpFR(Si30KzHX5@LoL@c+&+o`#titV>c4;wHF)*ZgCb;x#u`v zW^Op`X~Q2+JT!MwnNaklaE~QoY|K0|<;zqeV=D>!lK7Z=3mBJ)yd_D_5hX>gRL^SF zR!^+1_Lh4qNXw?zLr3}5rzN$H!h_+d?-|=RK^(+uzC!@2!O(&*jd9;5Z+|L6Fk6Jv zj5{=aFOv^*^a0M3@onL0#E#5c8OzasTAz}-fD8_qwkRkBC+xQI!wQGYLKKNYMF<#~ zZl}R?lYNawM3IUvgvcx~R-gQNY33Wi0pZumNKqL{ntOu`Q&+mt)FU493l9l56&t)| zS58JTZ;WW5iIEKXbvPvyEg?UQ9F#&z+w3oznR(Mo5Py{9q~+bxF*EL4-XIAi1(HUs;z2Fjs2IE#p@u4` bP@a{%^L}w0KZKEIioy~tYo++rPpN+ZIV@AA literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/rising.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/rising.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b012e0b46eca2d347879a1d9dfe2d1f60e78eac7 GIT binary patch literal 1318 zcmd5+y>HYo6o1a;lHB!5D-aS$NO)n$(A>mQA=I)|2&hii0g=Vco!zV3d|@ZFJ+YOQ zzXNsS-@z+W7ybYyo|9|UFNuK#NAKnN#rE&_KAc~J<^Jo@w+}x$06*c%aM9jC(IZqG zAVy7qJCG8{9EcqtyaU{Yv;&z7v5WIAa1YWhWFEvGkS*>558w;#3_!SW+JP87J=h8R z^JgPfe3D$yYG2T?)H0vFmAb;$J9#W~I!zO;qjO6mB*w2*dQiyx9BJBlFdA>Zf0bx) z?zE28#pW%M3zbxbnxg-5*hL#CIzlBd7>oq9V?&BD3N$*FCq{u0VI0?*U^+9j2#xYi}D6VKSfmmd;h2NlT2zYi(E(jK3$AW&SizZB&CPq$B9<-d=9E7g&Fizt$B`ghPQ((HR zOsf6RF|HQro>`q;REZrPAvJvlYJls0Zw{-h9G0?No76JpYsW<~DQEoouvE!WtFnTN zR1ed(SB9Bw7Cmgiqw>Tow`^GJ>Eo%|5(2+RR>=I0PK&N>_?Ob1{iSqmll%`gGv2jo zsQ?qyR7&;G3LRzhrk1R-b!pYIwN_9)MA7zQg8zujACGTc-l#o&JM>JzSe|5pG1F%Z zYgeb%9x(Q?PSV8}pD|uc8B_Q0$OhpGYJ=ZE`xX$Tspo)r&R|K|`F0qn2lzJKDc*xc m$GH>yIVelg^e(%tY0YNOT>vI{(Gq-VudlW_@yM!uI)4DjZ&fw` literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/submission.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/submission.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a74c3c8f309c478487e15b573c20c8cddd31a0b3 GIT binary patch literal 1050 zcmZvby>8nu5XVoFEh|D&1Q`lsW4jar8hh%J7C|x;Y0x$>nl9DCFe2kHp*~7dbz-F)PGp8u|{#RtQmpMLlNe_&~KaKDRYhUhpz zirxe6gYqEvA@#xI0q_o}0P+r`9enNr4?%Sy4262asZ91&)$< zk_>hEMRGyxnIK2?NiL0%W${iLD~r*4c_|B$DP~On#-Su$6YUKT=y31jn;T?xf%V&$ z_eCKzv!%ZAW(OPlQgOkTb7gokU+()|H1ialKy4@tz3&vJC<-@$!$wgk@F?jvj~^zS zyxim55XQN*2+tJBg*_`VR0(aFEKmxu<&r)k3u9T43DeIUty=+_)A$z6JV$5SUT>ba z{hk7x`*023S08Ku?y&yn-Ha0$&{QhC!Cb0^F-V2t!*Fo@53A~ zRcqn}M7p-1qmn0G?e3=ukv(U&@g>);J86$<;UJTs=@_9-)AiBa#nX#1!kQ+iwfY5m z4PXEFdSLTvP|0fRq{eaBx-83+YQ$d*D$T|-mzP{9Gf=ac8{}^2%wR#&udZ~2xneZq z7@)W5O`beF3;l(nL!6k1(t_oJ(k7-93)RZ)S1J8mGj)5?qm-8!rEQUxddWS)a=Pbg zqP5jmz0hwXhe@P2Fxqsp631!Qua$W>X6*_`?Vmu0cX^g_y9Q}jpow11*mm478YedN I*4;1o4+(l2Z2$lO literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/subreddit.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/listing/mixins/__pycache__/subreddit.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d490a384408aaf54fef0a2d1346246c58acf60f GIT binary patch literal 2777 zcmd5;OK%)S5U!bhZ`O%plRzMf8VM1Pz`IhETvoh-QA`9_QOt$CjN8*~d+d49-4n;F z+>F8neh1<&&6QIw`~Xf=^*na%Bo|JM-L*5_J@x$R>-l@MGJO2xkDn%efWKhr>f-%Z zIP`BQ1i%cX1Hy&Kf!Kwa3yx@kXhYP3xDB&5K6gNLA?iTfg;}?J?m^UpxDT^_`P_$S z0PzrJLvXgm0K^b}LCr&uU66f{Lpbli>7rlC%N7p3f#L4U5`@5>jw#uk<57>gn`RN{LN zSe$CZlnhW23rd9=mm6JsdlNM&aUkTgy**ScgWSmJ!rXX_Zwfh`vg{1CCyN#I=K!r$ zdNB&LM0p+S8e1E88{K!kaqYlH6vml?8`Z{f8IHHGxZ}CSz_0Zb zD_hGsLd>;li;CFYw-lb0UTk zD@YFxBG{d$j}rtbkHWcRe1XX2-f5t-gpX;)6_2Z0OxeS?;OnWa)iSVlymryiIl@g1 z(9fdp``8c0_tg*|y_Oo`&#YUPwCMPP8;(gI_`by~?xP&3t0bbkWqu@3pVMZQvuh$bQ)hoFSGK^!4;cIJZ`wiB!y(Nr;L z6l3W!ZjLZXRM17%%5=StbD!YQ^cJ}D^$Sflwyy?ujh1ncJ2bS1;&pHzTRaoK3F*j% zNYy32Ke~YL3uYF$-tjtW6&2fD+A(oK;QPoQ#$kFPyW>EG(3=d=}h+Ih<^`m73PWV}7^5)#Q?8$P6|9BMY>cC_AD9t0m z_9e?J1Du`mGp3Q8Bd!RVWU)GFa9@<3{!fnuggBKdRTv{_$Q~BSA7ZW zL^%PEBHzD{Z z2Z^Y?*0H$W@m8#|q7xu1n5tnL=WTRFdmlft6rDh`?xFp*Qa$^i>?f5Xt(MrzR%v`F dy&)7F6r6N9+FsB|YC@9w_d?<;b#?avoIEXf@O>N{ zeB5h1iI>HFlQYJi#D5~%7KD#U$k>(~v2`-IWrZ^*g_4(A^Twdmo`-!IcvD&)40jSy z1#YT?tb@;1Nz@Gi(9{4A<_47e={*&pvBD~wR;|*QUW}>i4s&5$dG6KMMPC#E>Zk%h RX0P37Mz>bW`S(vxun!#)IQ;+s literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/base.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/base.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f69c15c0f0e7f1c8ed36e0c6e09ed35feab4659 GIT binary patch literal 3531 zcmaJ^TXWmS6+Qq-@FL2(ICkU2nZnM^Xc8)J#?C}ZnyRs#XeOg*EYD=hnRW?bmlkM} zpm)L8rlLH=o%X$t{R5r;g1+>Z;5AQv=?~~rzq0^%(IkP48Yasd%WfljU?)#bx682bZF#K*CmI?6&hA(RHbee<0{D-4Qn*=sOypQ zh4e_)=`UDWC*{%e3U%uw8*~&jXRjUVF z?{Hrn?mhSt{q@89d*9rB8mUPdC*v1xA;Gh}GQxQN@N$04KhP*>4^`2+Y(uv~3Ywx{ zVcni%rbfB$7((&6+PSu}$zt6G{f(%PeOe^f=&zV*l5CS)w_h=Nf#inmuaVp&xn=th z*d}?=_SZ?iMDmjDU*O%2g3DQJVf*an!UJ$inEF~xv@&X(8b6HEX*euAyn-UstDT;S)3czKdHqC> z!ZfQ3Z86ksirkPyXH`}%b7KkcRE-+;|3w-wr~iGpla3}klX&vp@iZRF_ns!n@#LYr zwKLJ-le`%vQVq>czUdBY)|ouZ8l`Vq?B*&OYP{^sE-qr&DJ3GtCqMi@nbIjY|AVm4_5ki!Ua>yzyo&5Q{5U;^T%WDE>cB=^MlM{vP(z%yyFCLpT z97oDmkAWs*zeH250kKX{&04W3C9;Z1bynjT>Z~b*%}XHySFgc_td{V8)}48?&a<8n z>ah@)&^HY<YT?YLvzKf( z4{BD@qe0#J1cDCzU@7V-sLqf%bEtnC4yVdb`hG7=Qym{qQ`PHaj+k9Ly{69!aQi2r z@yCfj7xDSyLD0xr@S#r4lQ=!e8ltb#=tN1_ZhKk%p-Op8c44pF{I1rC)^*sXx6xpc z-~?NEvpGNHyhqoBDE1TLD%KiC9=WeLEoa?nI>;Bl?AMA`c<5vH@VqD6F3$w=dFSRc!dye zK*rciaaXda{2p=U@Wa35Yj!YT#q)##xw#zi?-234D#1Weq1aj~EI5vW%51tnj?*|C z#xrowa>*$z@oyv=U(EE_f<0IwoZU&N!x8wH>(s8lH=di%ZrQc+yS?u_c{G-(>fQnT zQ!~>Evc-em9Q+uH2%&$)!!}0!MA-dJP_gdndig@S;BD!vZ0tKRdIv z)3Y0=XPux#My>#B(Tw=vsMvFC< z!I+~y2R>5<@V!$S=Y#0Ddd-XNPa6Z~yMmoGL-uD>tqXy@g!m95C91bq64ZWPp*{w` zRg-BI3IfPr{x)m)aiQTa(725IebiIGuanVoc6KaS3bNK0vGw^B1XYj0Kp!uux=Pag zb?#7h=A1_Ug8{A=xle(XM;__h3szw-qg+7-X_?>h*&Z8?hh<9z%VBJ=dHcL3T zfMQnQipICD#zEF9(+(W&<;ka+TC*yrR`;d^!^*#KJyq7OHJ`nXQ`_YE+>PPJES(8a+$;EkzyS^cavFKtF&<&UdYWLvnn z8I_8K*w?I#y*;4BZ8%%b?CNq3ofi)_ayDrRflJ$T2-t#D1>bM-B8$7BkV%B;#zZIJ z;q+M^nwMCe*SPsLH%zMfO>VeO>bJRJA8RI_h1w+>^M%JUI@fh`8BN>q-0ih?z1?V6 zw_EL6yNbU}D}!r;z6Fu27A3fX<)~<>@;@`i;v%c^JySDJ+eM2r7g5g|pX65ljw`%% Kljm&mU*-Q`7AgM# literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/comment.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/comment.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e03f62e8b99c1cd558e9ea8390c7a08a71543ed GIT binary patch literal 6575 zcma)BTW=f36`ti~c@ZT_a^y&klWyv^(k3#QrU?qDb{j{Q69cgvSPFtN2$n1EP+DoZ zOV2EIVWO8RNYKarfW8C;ngRv-UZDS?=)=DD$uIo@dFpp&c9)dw7NNw^?p)9HJLio4 z)0nM4{P@qmwQn%?Z#MNY@%$dX@;fvhV;!^x^9n35*r32V1!mBDkp)FID6vin?!39r=iDcESP13Io6qD#s^-V zc{A)QoI1mJmGL^`4R%pxohJLhYcOwCjmy16F`0W9?nS5WUcevur+%2cw0q!(`;Q`z3zzoNz4M<)E;geu#xbe~r&jeo zk?3LH{8LV!X`^Qu`7q=yML z29c(#YK+&|p_1@)C&{(JzG1A7qi0E?U*pi3tf$GmdG<9(!n6hEEz)isOuNRsm(=qd z^Ol%*op~>_uRt5-FEejN4b9UgJNAvFl1g^`#yzbTD9Vj3!H1AEWF##YFC=EGr?n?r zNx}DeqyzephDec{_{z7?e971$enB#R3+w^{E3%bygMEo#3>4U5ksZP|OKjz+03yoc zcb@QgBtmOfjJS1jz(Zv%>3Nn!C38~K5E`!tI7hWp;T?V)f_bTfc?1+uO8Zl@HthG$8|myU>{xQUHqiAXH27~^It z?N&OPOOd2Wl2lS$!-JM0M0iwX;&m1)*}=ll?=Ti-6L##v_!pUrxuNBUGIqlrx1zqa zq1=G}z zMZAN#v8L8wu`&m7o5e-NU`e$G*$DAvWPBO03S->B( z1-^_0`Lmcu^FR2jq|4_?wTOnHE)9h?t_+ z;DJO~8m}YN!S+Wmrz_|%9gnrawZ>~(kS7;b*Y~ z5mb#PWpyk9bIoxShG7{2vLGB1Z=fMmk#lHB`c30yNZ&LXh4Fl5yxDO*QUQH3btskm z2^}yvLRU!eC!`e^Fxe_ZsW1u_8TQnif|}E(eh8Q5Z;|EFgynRJj%TzGj!>o{#5M%H z@O8CAS*`jen+#2=nY05eqr&1U4UukZO1Fvt%GP%5%GiFaz`*aHS?(x4h{QU@W`ebK zXw@ZHj#hspIyL=-!;)(603i=S zRJ5^3*wiRZ&Nzb({FgduX6L(idY#CKEqX&k#N&uhax#QhKpNQ*^R{ zjH^U4R^1-uKIV2(K`syjGQT(4&&X$0J|W1i5KCaPo)0K>1X){R3YAE7DuEv!0ZPOo zO?zReM7(C~F}^yCkbxG)ujTB$5TkQW32P}-DNcWn2hAq6ib1l#n<>9LsT42((}W;) zFV8Mbbz+VVw+wOtqR@s4R47?PdYa1($r|KD`Im&^)KNfqSOZmhTm~ z zig3;M?oPP>d?GHOeJU=ga84nfT@woc8kN^1)&3|5D0vdUq`q6!5b*0XlR!^Jce|hh zcVcQLuck;FnD+_3lF}%4W67u#7LBFCLh+{n`|(^#W-9szy)40`zknDGejnlixYLj; z6SSv16FAqVJW~TBkdGb|xbFbP5P;JG4R?CLF1jn&JjE{8LSiy-3CWRAPiu4vO*X)p zJFxmnuv4H1ZI1$^Q__OF!@__8(i%o6J%Iw&n#cPt#y6}7Zh(7>hC9Zn*jBB>9kb2A%LE;&^lm39}V-Osl>i$>Ooi_00>?rex88>HbTAm=QITyKh-d)5`IgD5(ZR^T7O zakBu>7HMhh@#CyImhHFq2jiz)70}K>91o?#LxNDRojUBqUU3S@y-jCR2+6fZA|gkW zFw{&^s0JWLBI7C*naO7-KYtEx46?n)^Ak$HIB&PVIJZsZ8rmVqM8&VDp-eV0LCL_4 zGj}KvxmTTmX2T}abYNk{xNeNIvb&X^n`ZzN{c|VyCtfb)I&UiTem>WseDgKB@XH+n zo^YYl2a__NG@@77p$g|0$bS*)k#iyuMMf%5Sd1GeOwFnh%6O4Pooff1q07Ug8WVq{ z3I<67F0}3ar&xynMG~4$j&o2{IbMQ%RK!%`xHxd?ArL-CmQdj{cja_ zJy|X(r>qU3eT33}-`W`P_yBhrPcA`y7kdDUX)N;ca;4`6Fe=2T-0yP3)M>$$lT)Cc zI##8A-y6Tti6PzPjLk339oWQpImIw?HSK4(34&L9+ZrF|w7F33s8U67hn@%yJ9X4T z{m2=*$VteE6tpHqRH5Q6dL`xS63QH@3Ro3Yc3GE7jntae`cD2vcN~<^svA~h#MnY* z-+2n2;DSTNmp@=kzJ`WXn#Ron3Mc$f0o63>g{CoUTr13@q@7$=rR(ek%84m7I8IV` z==Nw7&~w9ao{n4HDr&HV6ed0WLxb@Nfq>9QBh8~}ZWg_eqYN%4zA;(0% z4>(knouEQNCD4Lmi1xJi=_%(XD=t(uNTI2Yue^z-VVDK8uxKt;@Kar?6^*5t#b(27 ztTvZa5bI%5{vl6(4`2CXG%vj1g@b$reW|-j+*1l%%CqsE{94Ka-IV|9>4<<$B7lqlkq&-=8zOi+-RgBWf!etIaI8fO1e`5-nJLix}=Qi3}8wJCv~3vOF%03=**>@ zI>2Ab&j~bfBY}SfhzcG%=79bQAO+oRi5fLzC7r5H5pnZFwXjZXh>RD}msIaSY%uX( UQ}wAb854e?e{LG{#hc&$7d042qW}N^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/live.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/live.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41d08271d9ef57453f84586204d08495b26556bc GIT binary patch literal 23909 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 E7aF}D0RR91 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/message.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/message.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70a0483d8f1175b6c0375123e66a979ee3ebfde2 GIT binary patch literal 2329 zcmbVNOLN;)6h4w|S(cMDw9quA1u-p9O{p`?0K;T5Ohch1Gc;u4us|#nS-NhN(Zk#; z_u(n4@YwSwIxP4@TEeOu7A(8sJ6E>rrd=@H#)kwaIVSrxv9)WgYT6 z^}bE1Ls^&nE*W=Xo8k`r1o<5jO%fJ~Hl4J{U!ps)LvdH%bxADINrU`likGPGEl)1) z$>M$z3%5KH?p>i&cu%-d8Y`oP&2ah#N&he~*6wX%~B ziihDK6?c<|NnWk&i&6S$zGne7e<88%^v46KpGOcjAFPUpx(Ol>C`1X=*d?N4T_t-R(jY5f?i4K_-CPbKba7F-~=Fz;uqrq4{; z%GVYIzHq}DEogkAbz${mgJm5z=(tIb5r;M;+K^>T8MbnV?$uUUw8hUmc>d>t4cJdL zcWA3@u{huXoF|6Sf2{p_zW2J5KlVjAmbn||Zj!4q%p>6z!#Ok%#d!v2a2d)Xa}N*W zunZ3mdyeBy$L1)MVdnDrrh5Qgt<8kw_SL0|=MP-HK z@~DtiGZw0RW?Ye+&E2Xk0m4KmoI`tMM@LB-OOaO{HN#)k3i!^mB&wDw2foTuJxIzU zY2(1}1jXQ3L}elUPQ6NokE+$v-h0ie5v59=VIfxSfn34ncam%PdA7MxW}}T!GP*Gs z!-yLXi()Xk7k|7llHr4zWJN4ewNXFbn4+^cdQ`O#K_yt4x&%VDV_Y=P8CT6U(=i;Q zV_YyDtk#TGbFw^5M^C?*qnhI}o9aDmfaMbKK?wm^8mE8+)&{VS(?C~S-)l@hxK#iE zoUzkjSnL&bXnF^`2t-SbM?%UDv{ZHwBzaN>fo}&xQAS51_8L`FiF7E>gF&7J;f4?d zI=w-l!zC~9-J2lSF%{P&nd`=6b>`hntY@=|Jj_H8R89~ehU1jiOF{6%I83KE?I4JY z2v&6Z2m8V8oiD%sqUvgenE-HNxef(dU#*@~<{9!bpK4Rs8J>zkv1C}LWuCpPU5s!r z9~|PFnCe52S2nO|>q6hsEdh0oHs+&swb8L``8wWBt}b?~DGrod7H;Uyaof8cnc(HY zzx;{0g{iKAAb-dBH@N<}b)j!2I;-d)(EkZ)-atp{d##CgcZ^QRnN%W=h2$bHj}rA# zdH4Ko2G*cv(>Rw7baBGlL5rG_x|S znP#mFt7n+@u9an0jy=N49J4d*VVc#m>|HC*tb!aZM58&37MWF&qa|kN)0E1nPE2eB=?DJJ;XS6hLLEaG?HgF zaFmncN-iro?{E*g7DWX&*lWNlMHbW7atBvW^7@m~~M0vEUH14$J;1vyL$9 zsO)3$1hZa{{c!?lO){%O531u{K*0A!X1&B70pWwpI>xNyaxtKtVAe_5Kg=whSue{z zAOpxLX1yYT93>2wtFH!!uPaJk^4z;N7pCucZuiuz-e{Uakvk-{-bkzvwIJnKjZ{cX zB5DS|OZbT`G){_bNZC10e<^l;H^uJXU=MJSW)&;LDwl7+#dg!|0mz(XmE8=@J-|2( zZriRE6b%K+ z<3UmNob{b*F34D>Zw5IoWsm+vr|Ab-f75X{cnL7-CD}J<-R~JcgrO(X=loXtT-#}% zUF$ea>+F5cTWfDvZ=P#&^PXyeB&7eGf_pCHNUgmS95)ose)z8#7-A*@24cqngjmzDr z(G$LqavNv{PlIXoV%z2|v+20oQWhIzD(OT2q`u4eiNk1o>_V~>oCF_1$>nN#A;_%3 znm&FN3#zFg?YO>D3oX#@OG#D@0SF2+O|!LTnHQ@B6F=7d;Zwzq$Y6+0t7YvB z@q@guebe_jCm{}U!sEVeRY&+3F8Me$Cukx=5Q3ZnT+fFlqh3&Y>sWxJu;d5n9#ZNc zd)I7s>_HkFjdd!yxudv2=xA6vt-Yk>Qzx{FmeY=Fr?fIOw4xo+4yMu==~kbaU@Hw` zAAKTAO#BuB8d49aBh(27pIj1@Bh7w>3Fs!-VHi`@ow+|n>T&tDPHOiH@Ly>)R16kc zEkkeS&Kpn(sp{~580No`!Xga;Mk=@y8mRRE;Gq}}pOa@Z&_C!1|1&*zOB#MCA|R?8 zu};H^@OEf6VhWAS0VEQGmQ-mektOpOBzMX7JKTlI*Bw{*rrWSdxrUHVU*}#+UtJ~B zySiE{mGtm44PKiqoyMp2l}%e0KJPRD)wbkdZE&SB!_)d~|1+nh&zxSZElKl_M+`h6 zGS#6>P3!aP`U>yZXF}f^d$0iqCb5Wt5m4x!7kM*%%Cgr@_!%G%VAaIVcmWd7h}4|C zHOUDns5pfN1{OrUJ;`<@@nb6vdjBfL?&R3A6zOV8DjOfgEl~Va?K|*;9e>l~RZS@l zxiL;)pOj{rFl8`W?Tg>XwV-DfweHy={HRG4OX_-bXFadLiy-UWb8Q}sV5#pkoVMxu zL58#`$VwMlO?A~0eijd^=6i?+=?&ZGQy2|$oi=!D^CP&ZA25V#Zrer!rp$n67x3EY zMpN|6Kz)3GPm+p34p!LlcN9g!eM?i9mHYTMfQw^j*hncg4o5qx6}6-29f4}+v~g`T zbtu)X>`RA*D-AMQ^r3&!U#Y_$IxxpRv{dR91wm3{NymIB9hqlF9jPbVDaPL>j|Zj4 z_(vKeZNuP_45t_~vT_9ax6Pc$9GnMiBS#Z33Cq=N_qT9bN(%-R%ZGjp*+eLe3E2y^ z3if>4;I?V)k#-fT=#J274Rp;E@QJ3?C+I!dz5<8PC*0ksIS1Hqebup6b>s!BQY2RO zR!8{ynyt50>R{DY>IHhl5`ZsM^Fda0;0TqEC>Vz0I=*4Rxp`hQD6Z_Z?K#dpE`3|Q zjOlgHkQPEzvq47K&2=U8WNPchcz^sHu91lp4MW-i!|1s~ejao4_=zzztWeP=weeIA z1|Mer*bs8oBDCVjD-wuH1cihhEZdMVS9_ck`2|GS;5l?yS@=hi?PT5YU9M)jZ$yR? z#s*&YtgvZQaDh5$EZIyY_90v5FN@j}?Mx$SJV=?zmy1dD{M%z>Imj0<_MUbJfgj}* z+5*gijF(fKyuVbR0pIwfIJ059_Wd@$c$)wc{R+BzAGB*haZV(z}# zYB%lao-3}^u-3Atr}g#@9E{tWfzwlNw}wzx^`=g%f6Kmmx>^g#HFf%pjaC=erh5KV zwFjd<9?>+Ml;m81TIXS+s9X?a+6bE^dHF2%tLUu_rENY0vKAAz)O~3fVZ(J_230@4 z>TGN_@$B(!~zR7BbiM>*&wrUmk?tmvsBblUhfarJH8TF*K^NeM=Ci(A;fDq(p27q$NAbQ z-vV}hM9(bVSYD}@Bhu4+AJr*qy3?_rRiHBjpi4xTX0BA$x|74mPRsiIQfwl=i<=Qt zD5AqJz#f3^l;qQp%oz}=5EF<4GO-M4Z+-^bcpXl94|S(RHHr)prX!3lhS+z6<*`ST z(|y)Q)`G}q?-OM#cy3>iaRqUOt<2OJ%FgN5Jt#)_>1NY&H*_f^>d`6{kDryagD9?1 zK0@YEm@Qk1+Ot~1*aYeqo^BQ6C&PRuACCKC7?I_yB^N|ybUy$!iqxi(vy_$$VaJ6e z)Eb5ExRnYY(yw_UVV;99@KzBBN^d>Url-jWeW9A+Z$ZiitV-zc`9+$d7;DfGW(Wc@ zU?wOsVF!zd&xcDlEsWD?%AaEC-o=Hgcacy-d?Co^sa}Z^m jz7d%<*%{=uk)5F; z6@};;RW?yQLQ0HWwt^B86~ZdJn3grA3QAcODsACLd{KMCj7+qbt7Y?2nlj#YQshF|pSeETh>$f&-H%wa9 z3EA*pkpXCfl?e+G?**iD@dX`z#7 zoj#-YiN^(5fanEWD_%&PeL1Il?jCdcJiCNZ8HQaXP=kn3wrB0s#~d*$3mI3Xbk|Fc zm=8q|Sv0H&84G1k$P(}(HPArD^VA$igPOx7>JJHUdc}xpK}C?)v9dneN3wb$!cjga zDB#SXjpWUg$jf28Ba!2gcB zdZFjZVWDSY^_N8AKi+gHo|VMyv%=q$sJ|oeOA?-61)=I=QP{5*JTC)s>h^#3(f-BZ zwEs#1|11>hX@P&orHCwHOuliUzryhUDfm}A{*uFg{^J3$CcghqK|f@hV0=oloe2B) zk#1UAod{47rcetN;gVrM$2v{wmkr}i$83f(dBd>028N5vD@(?e`MGPCgE9`Ea7NLx zQMa<>S%W%#7?IWBaF`NgSqxT5%sX^BN6ov`{D_)s)ZCzEk(woHmZ@2xMxL}#17|f& z19Su-OWCwR@hvncDyMR(L#0C#>C~ZPX>IaAIa^Mb=`%Wh^w7)nUmlhBG_XAWP+UVF zK}g!LFi76f%0gfKW(;y2yxxOEijER-%8;d_M7$q^k!75ujE08ehK!TD-<#Fx$T;yb zNqF=nb7TjncF~JGec5S^Q|U%pv_^y#{YO7R!4{o@$P|f=JWlrt3`o1wnFy*5s374e z#FtqZ&Pynh!d<94P|b(R;;C*`p^Dcxqzjn6xpMW!k}U-Eg|2 f$GzU(@p6T-OBVrNz2B454rm9`6aStVoyhzb(I@uq literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/more.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/more.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5884b10f460032e78287eb6c7851f45097040f12 GIT binary patch literal 2969 zcmZ`*TW{P%6h32ny_ak*O=!`!g_;VGmbRNBXe&@!2<6f~5QU~v)fH&utewP(*WS!{ zq1|L(Xn{Y$JK`VojsM|Sp7O#E=nH&jyiRi|mV7)OkH_bH-}%n*Kh5dJ{nbAnFHI5s zO-Bv~!_1e|Yd}KD34j;U0X0wb;q7O}`Os7;oX@ub6k(Q@97;*d>>};xPs_3hHKDrJzB< zlo?~PNx`%k*D08xV3vY8dXCK-y!l%DOx`>i#pud%5r`KhLDciJDB0vtRp|LR`v}9~yF&Yd_AMR@yunKmNHIVZ0`6I( z5AUXl&eX7%d42+~bmk|$&`UQ?Gmx%thrO(`(yrx|UOG&&ygq=}NhYHpul2T~IKW+A z(ZfNgR0V$KH7TPc%B0NevWzQl=;3-l(mG0$ww*gVj5oTj3WFfZ@`?=n%m=}BDGlRN z{z)%yEoS|};vgDaTOZ;p*Pf*5`d~A-u{covPlf5HK^W`BVw*(DiV|t6IReukkcSZk)p-ZJ@85@{^zU1QzhYYd9j~=XV$sej<}maDK6CXXSwX8`+&s=YYK)U0m85L(ve+?Y;3;uN2Acy?503&cVMp+OFX=w_|9>-AGm6 z&kWxzo&>odR0ZsymmF%UIZ{gu2*B8WDF)iHFxn8V1B%d8V1obIyIM)FV5*?5U zPGx<8GK+pLkOh=@>Tr1h>OdBHfNf#*7=l3Eae0NTGUQ6p6VJR*r7wS&r*ZLijrMJl zHQIelkH83T$mQQzIl%WR7gD{6YrC#mxD@crENdMqX5cHOQk753IQ4_FsHiHxSJ8tw z%DPoV7)PO2XjY_}ypvN1#vKk&Uc%fh>Q-Kz)TEPm&ST#MwRsqpAJFe%8$AO<;)1v= znm~3=EQryiM;06iefkd|-*+rXiy zm@zmbm2XboK|y!v<})F_$4fSi9m;?*XsR0?tA@ut${L18GmoCuT5H!=M(*BNF7AyD zRJny>&iMF!omb+hkD~0b;teH=6RbU@&f}t3j^-WpK1O*JIcRFQy%}cR=?S#5*rHk9 znyn6LRhM|bieabQDA&LPXW(aB>TTY)HksBZSW+IIc5qH;aY4&GQoaR(M(2;yax_;S z9#V2F_5Z?7jHMxFr$*|9xh<-QMe53g9p(kClb710KjnT4WkmSNK{-LoHS;VTr{Kor z+%Ad24gMKG)P&bMZ8s>J;{S{m=-_581h(ML4)we!)k8eUEz^6rrIZMIC@&rg8_HUIq7RkL-7x%8Ts5leR^uqyL3>wipwn&k z(N@b6mOG|XHw%@S-ozR)?-^QiXFH9OBB^Q{!#L(*rmpgu4`4uXiVDj~G?Aye%+Ic~ zd6&)czNVP!TR1f*A6c_v7G%$gbFi$$LXqcA*1IxvB<%&fmN%rtufi}!SSYJU?C`3H)ByEyvXS;udy;$$>yUTt2COjEBd6<*)ruA=!PTz}^5{{V6#o2mc+ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/multi.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/multi.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e07054041a58b1e07e38210d46381ff2ae447338 GIT binary patch literal 6116 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 BOacG^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/subreddit.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/__pycache__/subreddit.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e81a59fce5e336f67f7128530b942e0cc178f8a8 GIT binary patch literal 79016 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 Fe*>Ux<9Yx9 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/base.py b/env/lib/python3.4/site-packages/praw/models/reddit/base.py new file mode 100644 index 0000000..a932ce2 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/base.py @@ -0,0 +1,83 @@ +"""Provide the RedditBase class.""" +from ...const import API_PATH +from ...exceptions import PRAWException +from ..base import PRAWBase + + +class RedditBase(PRAWBase): + """Base class that represents actual Reddit objects.""" + + @property + def fullname(self): + """Return the object's fullname. + + A fullname is an object's kind mapping like ``t3`` followed by an + underscore and the object's base36 ID, e.g., ``t1_c5s96e0``. + + """ + return '{}_{}'.format(self._reddit._objector.kind(self), + self.id) # pylint: disable=invalid-name + + def __eq__(self, other): + """Return whether the other instance equals the current.""" + if isinstance(other, str): + return other.lower() == str(self).lower() + return (isinstance(other, self.__class__) and + str(self).lower() == str(other).lower()) + + def __getattr__(self, attribute): + """Return the value of `attribute`.""" + if not attribute.startswith('_') and not self._fetched: + self._fetch() + return getattr(self, attribute) + raise AttributeError('{!r} object has no attribute {!r}' + .format(self.__class__.__name__, attribute)) + + def __hash__(self): + """Return the hash of the current instance.""" + return hash(self.__class__.__name__) ^ hash(str(self).lower()) + + def __init__(self, reddit, _data): + """Initialize a RedditBase instance (or a subclass). + + :param reddit: An instance of :class:`~.Reddit`. + + """ + super(RedditBase, self).__init__(reddit, _data) + self._fetched = False + self._info_params = {} + + def __repr__(self): + """Return an object initialization representation of the instance.""" + return '{}({}={!r})'.format(self.__class__.__name__, self.STR_FIELD, + str(self)) + + def __str__(self): + """Return a string representation of the instance.""" + return getattr(self, self.STR_FIELD) + + def __ne__(self, other): + """Return whether the other instance differs from the current.""" + return not self == other + + def _fetch(self): + if '_info_path' in dir(self): + other = self._reddit.get(self._info_path(), + params=self._info_params) + else: + self._info_params['id'] = self.fullname + children = self._reddit.get(API_PATH['info'], + params=self._info_params).children + if not children: + raise PRAWException('No {!r} data returned for thing {}' + .format(self.__class__.__name__, + self.fullname)) + other = children[0] + self.__dict__.update(other.__dict__) + self._fetched = True + + def _reset_attributes(self, *attributes): + for attribute in attributes: + if attribute in self.__dict__: + del self.__dict__[attribute] + self._fetched = False diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/comment.py b/env/lib/python3.4/site-packages/praw/models/reddit/comment.py new file mode 100644 index 0000000..62c32a5 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/comment.py @@ -0,0 +1,181 @@ +"""Provide the Comment class.""" +from ...const import urljoin +from ...exceptions import ClientException +from ..comment_forest import CommentForest +from .base import RedditBase +from .mixins import InboxableMixin, ThingModerationMixin, UserContentMixin +from .redditor import Redditor + + +class Comment(RedditBase, InboxableMixin, UserContentMixin): + """A class that represents a reddit comments.""" + + STR_FIELD = 'id' + + @property + def is_root(self): + """Return True when the comment is a top level comment.""" + parent_type = self.parent_id.split('_', 1)[0] + return parent_type == self._reddit.config.kinds['submission'] + + @property + def mod(self): + """Provide an instance of :class:`.CommentModeration`.""" + if self._mod is None: + self._mod = CommentModeration(self) + return self._mod + + @property + def replies(self): + """Provide an instance of :class:`.CommentForest`.""" + if isinstance(self._replies, list): + self._replies = CommentForest(self.submission, self._replies) + return self._replies + + @property + def submission(self): + """Return the Submission object this comment belongs to.""" + if not self._submission: # Comment not from submission + self._submission = self._reddit.submission( + self._extract_submission_id()) + return self._submission + + @submission.setter + def submission(self, submission): + """Update the Submission associated with the Comment.""" + assert self.name not in submission._comments_by_id + submission._comments_by_id[self.name] = self + self._submission = submission + for reply in getattr(self, 'replies', []): + reply.submission = submission + + def __init__(self, reddit, id=None, # pylint: disable=redefined-builtin + _data=None): + """Construct an instance of the Comment object.""" + if bool(id) == bool(_data): + raise TypeError('Either `id` or `_data` must be provided.') + self._mod = self._replies = self._submission = None + super(Comment, self).__init__(reddit, _data) + if id: + self.id = id # pylint: disable=invalid-name + else: + self._fetched = True + + def __setattr__(self, attribute, value): + """Objectify author, replies, and subreddit.""" + # pylint: disable=redefined-variable-type + if attribute == 'author': + value = Redditor.from_data(self._reddit, value) + elif attribute == 'replies': + if value == '': + value = [] + else: + value = self._reddit._objector.objectify(value).children + attribute = '_replies' + elif attribute == 'subreddit': + value = self._reddit.subreddit(value) + super(Comment, self).__setattr__(attribute, value) + + def _extract_submission_id(self): + if 'context' in self.__dict__: + return self.context.rsplit('/', 4)[1] + else: + return self.link_id.split('_', 1)[1] + + def parent(self): + """Return the parent of the comment. + + The returned parent will be an instance of either + :class:`.Comment`, or :class:`.Submission`. + + If this comment was obtained through a :class:`.Submission`, then its + entire ancestry should be immediately available, requiring no extra + network requests. However, if this comment was obtained through other + means, e.g., ``reddit.comment('COMMENT_ID')``, or + ``reddit.inbox.comment_replies``, then the returned parent may be a + lazy instance of either :class:`.Comment`, or :class:`.Submission`. + + Lazy Comment Example: + + .. code:: python + + comment = reddit.comment('cklhv0f') + parent = comment.parent() + # `replies` is empty until the comment is refreshed + print(parent.replies) # Output: [] + parent.refresh() + print(parent.replies) # Output is at least: [Comment(id='cklhv0f')] + + """ + # pylint: disable=no-member + if self.parent_id == self.submission.fullname: + return self.submission + + if '_comments' in self.submission.__dict__ \ + and self.parent_id in self.submission._comments_by_id: + # The Comment already exists, so simply return it + return self.submission._comments_by_id[self.parent_id] + # pylint: enable=no-member + + parent = Comment(self._reddit, self.parent_id.split('_', 1)[1]) + parent._submission = self.submission + return parent + + def permalink(self, fast=False): + """Return a permalink to the comment. + + :param fast: Return the result as quickly as possible (default: False). + + In order to determine the full permalink for a comment, the Submission + may need to be fetched if it hasn't been already. Set ``fast=True`` if + you want to bypass that possible load. + + A full permalink looks like: + /r/redditdev/comments/2gmzqe/praw_https_enabled/cklhv0f + + A fast-loaded permalink for the same comment will look like: + /comments/2gmzqe//cklhv0f + + """ + # pylint: disable=no-member + if not fast or 'permalink' in self.submission.__dict__: + return urljoin(self.submission.permalink, self.id) + return '/comments/{}//{}'.format(self.submission.id, self.id) + + def refresh(self): + """Refresh the comment's attributes. + + If using :meth:`.Reddit.comment` this method must be called in order to + obtain the comment's replies. + + """ + if 'context' in self.__dict__: # Using hasattr triggers a fetch + comment_path = self.context.split('?', 1)[0] + else: + comment_path = '{}_/{}'.format( + self.submission._info_path(), # pylint: disable=no-member + self.id) + comment_list = self._reddit.get(comment_path)[1].children + if not comment_list: + raise ClientException('Comment has been deleted') + comment = comment_list[0] + + if self._submission is not None: + del comment.__dict__['_submission'] # Don't replace if set + self.__dict__.update(comment.__dict__) + + for reply in comment._replies: + reply.submission = self.submission + return self + + +class CommentModeration(ThingModerationMixin): + """Provide a set of functions pertaining to Comment moderation.""" + + def __init__(self, comment): + """Create a CommentModeration instance. + + :param comment: The comment to moderate. + + """ + self.thing = comment diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/live.py b/env/lib/python3.4/site-packages/praw/models/reddit/live.py new file mode 100644 index 0000000..4583baf --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/live.py @@ -0,0 +1,649 @@ +"""Provide the LiveThread class.""" +from ...const import API_PATH +from ..listing.generator import ListingGenerator +from ..list.redditor import RedditorList +from .base import RedditBase +from .redditor import Redditor + + +class LiveContributorRelationship(object): + """Provide methods to interact with live threads' contributors.""" + + @staticmethod + def _handle_permissions(permissions): + if permissions is None: + permissions = {'all'} + else: + permissions = set(permissions) + return ','.join('+{}'.format(x) for x in permissions) + + def __call__(self): + """Return a :class:`.RedditorList` for live threads' contributors. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + for contributor in thread.contributor(): + print(contributor) + + """ + url = API_PATH['live_contributors'].format(id=self.thread.id) + temp = self.thread._reddit.get(url) + return temp if isinstance(temp, RedditorList) else temp[0] + + def __init__(self, thread): + """Create a :class:`.LiveContributorRelationship` instance. + + :param thread: An instance of :class:`.LiveThread`. + + .. note:: This class should not be initialized directly. Instead obtain + an instance via: ``thread.contributor`` where ``thread`` is a + :class:`.LiveThread` instance. + + """ + self.thread = thread + + def accept_invite(self): + """Accept an invite to contribute the live thread. + + Usage: + + .. code-block:: python + + thread = reddit.live('ydwwxneu7vsa') + thread.contributor.accept_invite() + + """ + url = API_PATH['live_accept_invite'].format(id=self.thread.id) + self.thread._reddit.post(url) + + def invite(self, redditor, permissions=None): + """Invite a redditor to be a contributor of the live thread. + + Raise :class:`praw.exceptions.APIException` if the invitation + already exists. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should + be a list of strings specifying which subset of permissions to + grant. An empty list ``[]`` indicates no permissions, and when + not provided (``None``), indicates full permissions. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + redditor = reddit.redditor('spez') + + # 'manage' and 'settings' permissions + thread.contributor.invite(redditor, ['manage', 'settings']) + + :seealso: :meth:`.LiveContributorRelationship.remove_invite` to + remove the invite for redditor. + + """ + url = API_PATH['live_invite'].format(id=self.thread.id) + data = {'name': str(redditor), + 'type': 'liveupdate_contributor_invite', + 'permissions': self._handle_permissions(permissions)} + self.thread._reddit.post(url, data=data) + + def leave(self): + """Abdicate the live thread contributor position (use with care). + + Usage: + + .. code-block:: python + + thread = reddit.live('ydwwxneu7vsa') + thread.contributor.leave() + + """ + url = API_PATH['live_leave'].format(id=self.thread.id) + self.thread._reddit.post(url) + + def remove(self, redditor): + """Remove the redditor from the live thread contributors. + + :param redditor: A redditor fullname (e.g., ``'t2_1w72'``) or + :class:`~.Redditor` instance. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + redditor = reddit.redditor('spez') + thread.contributor.remove(redditor) + thread.contributor.remove('t2_1w72') # with fullname + + """ + if isinstance(redditor, Redditor): + fullname = redditor.fullname + else: + fullname = redditor + data = {'id': fullname} + url = API_PATH['live_remove_contrib'].format(id=self.thread.id) + self.thread._reddit.post(url, data=data) + + def remove_invite(self, redditor): + """Remove the invite for redditor. + + :param redditor: A redditor fullname (e.g., ``'t2_1w72'``) or + :class:`~.Redditor` instance. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + redditor = reddit.redditor('spez') + thread.contributor.remove_invite(redditor) + thread.contributor.remove_invite('t2_1w72') # with fullname + + :seealso: :meth:`.LiveContributorRelationship.invite` to + invite a redditor to be a contributor of the live thread. + + """ + if isinstance(redditor, Redditor): + fullname = redditor.fullname + else: + fullname = redditor + data = {'id': fullname} + url = API_PATH['live_remove_invite'].format(id=self.thread.id) + self.thread._reddit.post(url, data=data) + + def update(self, redditor, permissions=None): + """Update the contributor permissions for ``redditor``. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should + be a list of strings specifying which subset of permissions to + grant (other permissions are removed). An empty list ``[]`` + indicates no permissions, and when not provided (``None``), + indicates full permissions. + + For example, to grant all permissions to the contributor, try: + + .. code:: python + + thread = reddit.live('ukaeu1ik4sw5') + thread.contributor.update('spez') + + To grant 'access' and 'edit' permissions (and to remove other + permissions), try: + + .. code:: python + + thread.contributor.update('spez', ['access', 'edit']) + + To remove all permissions from the contributor, try: + + .. code:: python + + subreddit.moderator.update('spez', []) + + """ + url = API_PATH['live_update_perms'].format(id=self.thread.id) + data = {'name': str(redditor), + 'type': 'liveupdate_contributor', + 'permissions': self._handle_permissions(permissions)} + self.thread._reddit.post(url, data=data) + + def update_invite(self, redditor, permissions=None): + """Update the contributor invite permissions for ``redditor``. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should + be a list of strings specifying which subset of permissions to + grant (other permissions are removed). An empty list ``[]`` + indicates no permissions, and when not provided (``None``), + indicates full permissions. + + For example, to set all permissions to the invitation, try: + + .. code:: python + + thread = reddit.live('ukaeu1ik4sw5') + thread.contributor.update_invite('spez') + + To set 'access' and 'edit' permissions (and to remove other + permissions) to the invitation, try: + + .. code:: python + + thread.contributor.update_invite('spez', ['access', 'edit']) + + To remove all permissions from the invitation, try: + + .. code:: python + + thread.contributor.update_invite('spez', []) + + """ + url = API_PATH['live_update_perms'].format(id=self.thread.id) + data = {'name': str(redditor), + 'type': 'liveupdate_contributor_invite', + 'permissions': self._handle_permissions(permissions)} + self.thread._reddit.post(url, data=data) + + +class LiveThread(RedditBase): + """An individual LiveThread object.""" + + STR_FIELD = 'id' + + @property + def contrib(self): + """Provide an instance of :class:`.LiveThreadContribution`. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + thread.contrib.add('### update') + + """ + if self._contrib is None: + self._contrib = LiveThreadContribution(self) + return self._contrib + + @property + def contributor(self): + """Provide an instance of :class:`.LiveContributorRelationship`. + + You can call the instance to get a list of contributors which is + represented as :class:`.RedditorList` instance consists of + :class:`.Redditor` instances. Those Redditor instances have + ``permissions`` attributes as contributors: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + for contributor in thread.contributor(): + # prints `(Redditor(name='Acidtwist'), [u'all'])` + print(contributor, contributor.permissions) + + """ + if self._contributor is None: + self._contributor = LiveContributorRelationship(self) + return self._contributor + + def __eq__(self, other): + """Return whether the other instance equals the current. + + .. note:: This comparison is case sensitive. + """ + if isinstance(other, str): + return other == str(self) + return (isinstance(other, self.__class__) and + str(self) == str(other)) + + def __getitem__(self, update_id): + """Return a lazy :class:`.LiveUpdate` instance. + + .. warning:: At this time, accessing lazy attributes, whose value + have not loaded, raises ``AttributeError``. + + :param update_id: A live update ID, e.g., + ``'7827987a-c998-11e4-a0b9-22000b6a88d2'``. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + update = thread['7827987a-c998-11e4-a0b9-22000b6a88d2'] + update.thread # LiveThread(id='ukaeu1ik4sw5') + update.id # '7827987a-c998-11e4-a0b9-22000b6a88d2' + update.author # raise ``AttributeError`` + """ + return LiveUpdate(self._reddit, self.id, update_id) + + def __hash__(self): + """Return the hash of the current instance.""" + return hash(self.__class__.__name__) ^ hash(str(self)) + + def __init__(self, reddit, id=None, # pylint: disable=redefined-builtin + _data=None): + """Initialize a lazy :class:`.LiveThread` instance. + + :param reddit: An instance of :class:`.Reddit`. + :param id: A live thread ID, e.g., ``'ukaeu1ik4sw5'`` + """ + if bool(id) == bool(_data): + raise TypeError('Either `id` or `_data` must be provided.') + super(LiveThread, self).__init__(reddit, _data) + if id: + self.id = id # pylint: disable=invalid-name + self._contrib = None + self._contributor = None + + def _info_path(self): + return API_PATH['liveabout'].format(id=self.id) + + def discussions(self, **generator_kwargs): + """Get submissions linking to the thread. + + :param generator_kwargs: keyword arguments passed to + :class:`.ListingGenerator` constructor. + :returns: A :class:`.ListingGenerator` object which yields + :class:`.Submission` object. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + for submission in thread.discussions(limit=None): + print(submission.title) + + """ + url = API_PATH['live_discussions'].format(id=self.id) + return ListingGenerator(self._reddit, url, **generator_kwargs) + + def report(self, type): # pylint: disable=redefined-builtin + """Report the thread violating the Reddit rules. + + :param type: One of ``'spam'``, ``'vote-manipulation'``, + ``'personal-information'``, ``'sexualizing-minors'``, + ``'site-breaking'``. + + Usage: + + .. code-block:: python + + thread = reddit.live('xyu8kmjvfrww') + thread.report('spam') + + """ + url = API_PATH['live_report'].format(id=self.id) + self._reddit.post(url, data={'type': type}) + + def updates(self, **generator_kwargs): + """Return a :class:`.ListingGenerator` yields :class:`.LiveUpdate` s. + + :param generator_kwargs: keyword arguments passed to + :class:`.ListingGenerator` constructor. + :returns: A :class:`.ListingGenerator` object which yields + :class:`.LiveUpdate` object. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + after = 'LiveUpdate_fefb3dae-7534-11e6-b259-0ef8c7233633' + for submission in thread.updates(limit=5, params={'after': after}): + print(submission.body) + + """ + url = API_PATH['live_updates'].format(id=self.id) + for update in ListingGenerator(self._reddit, url, + **generator_kwargs): + update._thread = self + yield update + + +class LiveThreadContribution(object): + """Provides a set of contribution functions to a LiveThread.""" + + def __init__(self, thread): + """Create an instance of :class:`.LiveThreadContribution`. + + :param thread: An instance of :class:`.LiveThread`. + + This instance can be retrieved through ``thread.contrib`` + where thread is a :class:`.LiveThread` instance. E.g., + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + thread.contrib.add('### update') + + """ + self.thread = thread + + def add(self, body): + """Add an update to the live thread. + + :param body: The markdown formatted content for the update. + + Usage: + + .. code-block:: python + + thread = reddit.live('ydwwxneu7vsa') + thread.contrib.add('test `LiveThreadContribution.add()`') + + """ + url = API_PATH['live_add_update'].format(id=self.thread.id) + self.thread._reddit.post(url, data={'body': body}) + + def close(self): + """Close the live thread permanently (cannot be undone). + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + thread.contrib.close() + + """ + url = API_PATH['live_close'].format(id=self.thread.id) + self.thread._reddit.post(url) + + def update(self, title=None, description=None, nsfw=None, resources=None, + **other_settings): + """Update settings of the live thread. + + :param title: (Optional) The title of the live thread (default: None). + :param description: (Optional) The live thread's description + (default: None). + :param nsfw: (Optional) Indicate whether this thread is not safe for + work (default: None). + :param resources: (Optional) Markdown formatted information that is + useful for the live thread (default: None). + + Does nothing if no arguments are provided. + + Each setting will maintain its current value if ``None`` is specified. + + Additional keyword arguments can be provided to handle new settings as + Reddit introduces them. + + Usage: + + .. code-block:: python + + thread = reddit.live('xyu8kmjvfrww') + + # update `title` and `nsfw` + updated_thread = thread.contrib.update(title=new_title, nsfw=True) + + If Reddit introduces new settings, you must specify ``None`` for the + setting you want to maintain: + + .. code-block:: python + + # update `nsfw` and maintain new setting `foo` + thread.contrib.update(nsfw=True, foo=None) + + """ + settings = {'title': title, 'description': description, + 'nsfw': nsfw, 'resources': resources} + settings.update(other_settings) + if all(value is None for value in settings.values()): + return + # get settings from Reddit (not cache) + thread = LiveThread(self.thread._reddit, self.thread.id) + data = {key: getattr(thread, key) if value is None else value + for key, value in settings.items()} + + url = API_PATH['live_update_thread'].format(id=self.thread.id) + # prawcore (0.7.0) Session.request() modifies `data` kwarg + self.thread._reddit.post(url, data=data.copy()) + self.thread._reset_attributes(*data.keys()) + + +class LiveUpdate(RedditBase): + """An individual :class:`.LiveUpdate` object. + + .. warning:: At this time, accessing lazy attributes on this class + may raises ``AttributeError``: if an update is instantiated + through :meth:`.LiveThread.updates`, the exception is not + thrown. For example: + + .. code-block:: python + + thread = reddit.live('xyu8kmjvfrww') + for update in thread.updates(limit=None): + if update.id == 'cb5fe532-dbee-11e6-9a91-0e6d74fabcc4': + print(update.stricken) # True + break + + But the update is instantiated through ``thread[update_id]`` + or ``LiveUpdate(reddit, update_id)``, ``AttributeError`` is thrown: + + .. code-block:: python + + thread = reddit.live('xyu8kmjvfrww') + update = thread['cb5fe532-dbee-11e6-9a91-0e6d74fabcc4'] + update.stricken # raise AttributeError + + """ + + STR_FIELD = 'id' + + @property + def contrib(self): + """Provide an instance of :class:`.LiveUpdateContribution`. + + Usage: + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + update = thread['7827987a-c998-11e4-a0b9-22000b6a88d2'] + update.contrib # LiveUpdateContribution instance + + """ + if self._contrib is None: + self._contrib = LiveUpdateContribution(self) + return self._contrib + + @property + def thread(self): + """Return :class:`.LiveThread` object the update object belongs to.""" + return self._thread + + def __init__(self, reddit, thread_id=None, update_id=None, _data=None): + """Initialize a lazy :class:`.LiveUpdate` instance. + + Either ``thread_id`` and ``update_id``, or ``_data`` must be + provided. + + .. warning:: At this time, accessing lazy attributes, whose value + have not loaded, raises ``AttributeError``. See :class:`.LiveUpdate` + for details. + + :param reddit: An instance of :class:`.Reddit`. + :param thread_id: A live thread ID, e.g., ``'ukaeu1ik4sw5'``. + :param update_id: A live update ID, e.g., + ``'7827987a-c998-11e4-a0b9-22000b6a88d2'``. + + Usage: + + .. code-block:: python + + update = LiveUpdate(reddit, 'ukaeu1ik4sw5', + '7827987a-c998-11e4-a0b9-22000b6a88d2') + update.thread # LiveThread(id='ukaeu1ik4sw5') + update.id # '7827987a-c998-11e4-a0b9-22000b6a88d2' + update.author # raise ``AttributeError`` + """ + if _data is not None: + # Since _data (part of JSON returned from reddit) have no + # thread ID, self._thread must be set by the caller of + # LiveUpdate(). See the code of LiveThread.updates() for example. + super(LiveUpdate, self).__init__(reddit, _data) + elif thread_id and update_id: + super(LiveUpdate, self).__init__(reddit, None) + self._thread = LiveThread(self._reddit, thread_id) + self.id = update_id # pylint: disable=invalid-name + else: + raise TypeError('Either `thread_id` and `update_id`, or ' + '`_data` must be provided.') + self._fetched = True + self._contrib = None + + def __setattr__(self, attribute, value): + """Objectify author.""" + if attribute == 'author': + value = Redditor(self._reddit, name=value) + super(LiveUpdate, self).__setattr__(attribute, value) + + +class LiveUpdateContribution(object): + """Provides a set of contribution functions to LiveUpdate.""" + + def __init__(self, update): + """Create an instance of :class:`.LiveUpdateContribution`. + + :param update: An instance of :class:`.LiveUpdate`. + + This instance can be retrieved through ``update.contrib`` + where update is a :class:`.LiveUpdate` instance. E.g., + + .. code-block:: python + + thread = reddit.live('ukaeu1ik4sw5') + update = thread['7827987a-c998-11e4-a0b9-22000b6a88d2'] + update.contrib # LiveUpdateContribution instance + update.contrib.remove() + + """ + self.update = update + + def remove(self): + """Remove a live update. + + Usage: + + .. code-block:: python + + thread = reddit.live('ydwwxneu7vsa') + update = thread['6854605a-efec-11e6-b0c7-0eafac4ff094'] + update.contrib.remove() + + """ + url = API_PATH['live_remove_update'].format(id=self.update.thread.id) + data = {'id': self.update.fullname} + self.update.thread._reddit.post(url, data=data) + + def strike(self): + """Strike a content of a live update. + + .. code-block:: python + + thread = reddit.live('xyu8kmjvfrww') + update = thread['cb5fe532-dbee-11e6-9a91-0e6d74fabcc4'] + update.contrib.strike() + + To check whether the update is stricken or not, use ``update.stricken`` + attribute. But note that accessing lazy attributes on updates + (includes ``update.stricken``) may raises ``AttributeError``. + See :class:`.LiveUpdate` for details. + + """ + url = API_PATH['live_strike'].format(id=self.update.thread.id) + data = {'id': self.update.fullname} + self.update.thread._reddit.post(url, data=data) diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/message.py b/env/lib/python3.4/site-packages/praw/models/reddit/message.py new file mode 100644 index 0000000..3287be3 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/message.py @@ -0,0 +1,59 @@ +"""Provide the Message class.""" +from ...const import API_PATH +from .base import RedditBase +from .mixins import InboxableMixin, ReplyableMixin +from .redditor import Redditor +from .subreddit import Subreddit + + +class Message(RedditBase, InboxableMixin, ReplyableMixin): + """A class for private messages.""" + + STR_FIELD = 'id' + + @classmethod + def parse(cls, data, reddit): + """Return an instance of Message or SubredditMessage from ``data``. + + :param data: The structured data. + :param reddit: An instance of :class:`.Reddit`. + + """ + if data['author']: + data['author'] = Redditor(reddit, data['author']) + + if data['dest'].startswith('#'): + data['dest'] = Subreddit(reddit, data['dest'][1:]) + else: + data['dest'] = Redditor(reddit, data['dest']) + + if data['replies']: + replies = data['replies'] + data['replies'] = reddit._objector.objectify( + replies['data']['children']) + else: + data['replies'] = [] + + if data['subreddit']: + data['subreddit'] = Subreddit(reddit, data['subreddit']) + return SubredditMessage(reddit, _data=data) + + return cls(reddit, _data=data) + + def __init__(self, reddit, _data): + """Construct an instance of the Message object.""" + super(Message, self).__init__(reddit, _data) + self._fetched = True + + +class SubredditMessage(Message): + """A class for messages to a subreddit.""" + + def mute(self, _unmute=False): + """Mute the sender of this SubredditMessage.""" + self._reddit.post(API_PATH['mute_sender'], data={'id': self.fullname}) + + def unmute(self): + """Unmute the sender of this SubredditMessage.""" + self._reddit.post(API_PATH['unmute_sender'], + data={'id': self.fullname}) diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__init__.py b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__init__.py new file mode 100644 index 0000000..2ddf48d --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__init__.py @@ -0,0 +1,84 @@ +"""Package providing reddit class mixins.""" +from ....const import API_PATH +from .editable import EditableMixin # NOQA +from .gildable import GildableMixin # NOQA +from .inboxable import InboxableMixin # NOQA +from .inboxtoggleable import InboxToggleableMixin # NOQA +from .messageable import MessageableMixin # NOQA +from .replyable import ReplyableMixin # NOQA +from .reportable import ReportableMixin # NOQA +from .savable import SavableMixin # NOQA +from .votable import VotableMixin # NOQA + + +class ThingModerationMixin(object): + """Provides moderation methods for Comments and Submissions.""" + + def approve(self): + """Approve a :class:`~.Comment` or :class:`~.Submission`. + + Approving a comment or submission reverts a removal, resets the report + counter, adds a green check mark indicator (only visible to other + moderators) on the website view, and sets the ``approved_by`` attribute + to the authenticated user. + + """ + self.thing._reddit.post(API_PATH['approve'], + data={'id': self.thing.fullname}) + + def distinguish(self, how='yes', sticky=False): + """Distinguish a :class:`~.Comment` or :class:`~.Submission`. + + :param how: One of 'yes', 'no', 'admin', 'special'. 'yes' adds a + moderator level distinguish. 'no' removes any distinction. 'admin' + and 'special' require special user privileges to use. + :param sticky: Comment is stickied if True, placing it at the top of + the comment page regardless of score. If thing is not a top-level + comment, this parameter is silently ignored. + """ + data = {'how': how, 'id': self.thing.fullname} + if sticky and getattr(self.thing, 'is_root', False): + data['sticky'] = True + self.thing._reddit.post(API_PATH['distinguish'], data=data) + + def ignore_reports(self): + """Ignore future reports on a Comment or Submission. + + Calling this method will prevent future reports on this Comment or + Submission from both triggering notifications and appearing in the + various moderation listings. The report count will still increment on + the Comment or Submission. + + """ + self.thing._reddit.post(API_PATH['ignore_reports'], + data={'id': self.thing.fullname}) + + def remove(self, spam=False): + """Remove a :class:`~.Comment` or :class:`~.Submission`. + + :param spam: When True, use the removal to help train the Subreddit's + spam filter (default: False). + + """ + data = {'id': self.thing.fullname, 'spam': bool(spam)} + self.thing._reddit.post(API_PATH['remove'], data=data) + + def undistinguish(self): + """Remove mod, admin, or special distinguishing on object.""" + self.distinguish(how='no') + + def unignore_reports(self): + """Resume receiving future reports on a Comment or Submission. + + Future reports on this Comment or Submission will cause notifications, + and appear in the various moderation listings. + + """ + self.thing._reddit.post(API_PATH['unignore_reports'], + data={'id': self.thing.fullname}) + + +class UserContentMixin(EditableMixin, GildableMixin, InboxToggleableMixin, + ReplyableMixin, ReportableMixin, SavableMixin, + VotableMixin): + """A convenience mixin that applies to both Comments and Submissions.""" diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..402f16b3329a3ef4e3a6a7e98a0a09d819f0ac85 GIT binary patch literal 4279 zcmb_gTXP#p6+R=$x>>%&>-Dmm1-f?GbyVfZPXusnQE?0jd5AHwfkH3i(M(J3WG>q7 zksZ6Tyd?jH;s;R0kKh-~D=+K|4?Ob3ce>?~v@58Bprkv~x6`N3`ObH`^Y_kL`{~Ia ze)p#}qQBDIuZ{1ADCTddBBDNOkD?029wim(SICR16xArMQc|OS&9zr3UZJE;{km({ zDQ-~Gq<+)28x*%FX;Z)L+D(dADd|wZ?oDc+!Dllq&ky-M*NO17xK z<=P#J-=k!k`rG6^iPk7ur?=2_o#gxUrb_)CdJ=6=v}t=cN!Cc#Nw!I12AW$Wx9Lrb z`X5kqhfcd&H=myb;mcqo#aL&TDpKi4Xc%&}F`F{ka^+ z*YiCa=*jfLo}JU+a(+tZH`#1Fgren-kMR)2j8I9q89qi`VQ2T@Uwl;AcJOb6zbh2g zDQeJLAOPP@iduFQooKcxTBWyG*r2FG@CGl$oOOZ^_`AiPIPKmkw$CnL*=JcKb&#tp zwZ^*n$%(bOgq6z?k;wcai;Ng%S{!9bBGcT6AdST7WRNIhu-f!Owm$#(-#W?>is_+x zP4ohPJ$g~090&5~LmWzZw*xp-l^(qDJP+qP?XCpRAmVV$-j^Z}2iEHc=fCew_dXZU zW7a!U;=I>xi|Nm;XY2$bbUO1gQ)&!MT}sUd!B>)92Js#~j6_d(QWFdjue+#l=U%2j;A*z7x@`z~7deP5+2_x;}ZTCYRU9TZbTMXeq0 z=Hq2x?AX~5Tmud4LALi!Qq7`G5~Yza<6 zCxYcQuvn)r(h{LndQqbsQPcoJn>=no*#aor!9M`XpDB~WViRR9fPonV{~KT)i~}7c z;v%~`5Wh^N$cADU=iA*AyJ^OC5G5+*4>Ojb3gX?Kn=pl5>39Zu2__K(&9R7P3St%H zIcy`GgYi=|&ql$K(uhXoZlSzW4Fjvx}q1I~J-gz3p(qVVPQ z!7Wn=WrXcgz@-|BGd+=eVjKq{2Pa59$Sr{LYz$kJ!uWKI>)Y5Jb3)K^6zC`hC9~N~ zm}%J)PluRjWf_rXkO#%a_pLn^q)jF5@oXck7bHU3>W34hIigmLQpk*EXDX_2l->l& z`VD1#on`ssv!d?KSgg+3TW?^}aks7+*?JpQ(HO~`16FTw*Lz%XaCK|?eg6KCtB<(i zr8c}=^#M2UqWUh1X`-U`N8Vj;&ASmx17%K)|04|_0r5|*LBw#9Pk;nRiZFf(D^Ees ztU9CMInp@_;+WlH&FxZ%xKeQp2mz~UzC@^rSpo%h$iR*%%dw@XOY~-wh4dD?pfNod_x6my9SGm)3ui-Xm4?U@tap}{(iovL zeV5yzSa+xb%W_IF&f5$raIizmB0em5x}F0GlkOZU7!i9YGwS?wDIylP3>kL(tD=B%XN=f8w;Vz%_mEbu`qq%H1Bj1y!p#>X(kB=Whjw%aF+jti5`E8y}m&- zbAjtZJ`5Oq3$(IVB8;=7;}?*EMd*JbmD!cF*qo$`arsVE@F~3Vm_1`}Q4QRpKKnPm zS={uv+b){E&zC#jFWSBj5KUtK?)d(flfYj4&}#U8l!d-;uWJ@8n%PG)wDl)ku?BN# z%TkriU3ke7U-ArB9j{*Lbhb7+osD*G)h<^v z(w&{@9tM7eVgsR5)!aVre#b5-R-j3Fb(YiTr)J0Wo1^LDQ?GEdrEZ^|nnR<%VcU86 z@YD_NT}@`sPR$p9ehb;dJvw!Z+ijOk_=&0cKMMK{;~t!P)wV9(b5nQFD(Wu$t?jMi e%T8D{zi>$SDSO0xjH>Q!e)~^#=V-@kdH(|ERa&Y5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/editable.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/editable.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2aeca37718d44428faac0dc220ea529d137a7fba GIT binary patch literal 1319 zcmZuxy>1*g5FYOC?Ve7j*l-L4O2x*-6~0Sj6^3EhiGxIi1R*jI_<(@gTk<5H_s=9Z zk`GcPw|)nAhF`^xz&4eeJV2_yKT-DB6-9B7&x|9#knr6`+%SW@;K2GRQdEvlydfg)_;KBaw~`g>gH2+pw-40d`F zun;>JXbW_#B5+7T4BJ?f^9U{(!*1BVh~exBl}2VDhafjVj^KCzFaCG{7kCh#7*+|q zPQmPf8_*JsMC6-2z~^^zpTH`;I(W%|q3Lk4x&Hi{YD+3Cwb`PPZ+Wx4!8bqE?t~v5 z(azD)bTr~u<8hmtyb3oS^OtzH%FS!poYvGKRqm)6iU!-JcA;m;eb>sI>{q4y>dPqC zncDV_iq06ih1|Qm#>ny|HeY{P*T-Bt%hA8li_R%~BP5?Vb>`+ncY?=+mOi1<`2<1p zFGxMihhnK*aiXM2X}KwEx2UwWx~b=xK_axW^9?li9WcoZRXQ9t8EJio2_bdigzy^N#&{aXw$JzJGYm0Di*B2(Z4yFi$ZFfE+Ue;X%uw z^C0(tT?-#X0N-#Y0O`Zthdclg!c8*U#Vf5oHA2RABjf9)6-C*~x6N(S$5mSxll~$? z!lvkIwdAX-_irkkABTt4C5Cy7Ng^KEm_0I)BNhvv$OH@!7*6N^L3YWqw^G+dCF5G@ z15+AwQ`opF`nZ(w8eK_|R@k~5^e0oVG0YQ8UjerGF|dyNaO=Rd8o(ado&iG_H%YL2 zL~z$?G1?9CRPAPsm0g<8iNx)u>DNj{i(>mQ&a-23w?v)zyl&2UkUD0y+KR5`50vux1C=R@k0kgdrMx>-jTZZhK2{inm1 zDWD0d86tr9fbH&+`{VnhbO7B=5$9x-^J&gG>W(ed3(h}|g=+z4XPgUFajxg6u|?K2Plzdz$P12VQk#r6sqt%w z))8&kb#R)1q*dO!o_+DMpJ^s1BxZObB!0sv<$8xGR^eg_AQO#+re(iY|e0LdM@3V=QI?96c-0J|U57UfPN;&(P`p_s(S zGl3P$bd^W5G;Fu=`3OUt3C()FbF7#O00~PtXENm)k4-F|O|c23aFHcUDSRplJR@_4 z$uiPKM2ve@gWh4dE7BD59zwmBi+k`snX`_+OHQ#CSd5QYtQDxw z;~73?l0hIXIh!+z=X{lL<~rSEd=PlD0hr60-6>lszyrbw4IJ5q4NGffI_B{fn7c45 zZW@dGH@I28|Bw89{)3+)`!5)h>ri#MX6vgU{e_|1aPHw1hBj6)R7DsBjj|atpw6!xuT6}erW~rz%!o~)dbUV>TajqX-Ts> l2x`(uSJq;YUEHL4)kyZhs(5Adc?If)`DQ6|HR|pi?>8g$dc^<$ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/inboxtoggleable.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/inboxtoggleable.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25a984386272e88b5e92eaa760cf13933cb17456 GIT binary patch literal 1088 zcmb`F&2AGh5XbHPN@!C+q8zxb;D8pXSuX7fp;mn6KoyBz$i>>Mo#M(_FSb+Ch+BCJ z9su!5zH;Ki18`!-TS_ZM;=(HaXYASC`OSa!=U{7NH2(VTOGL+dN?-vRC1BK_aYxPQ@uRW$Hz)k zQzhQWrEKzARn`uFV4;Hg{=s;}#s^2QYuI02K-EzUArL?T2%r(NOrSahF#=%SP#WWu z@C+DwetTWr)&8h)!py2#(0Q*kMgC z`0zi2^$eCRK|T?30zXPzAiM{BG76`_8k4<_aqpZ`+99qUJeL+Nxn3fGp>fiQ`Ot4# z(eR7vKH-(Cd?fixpITQraabh2$Bf`yI-j)KI)k?P{%oOCQ_Tgqn^>V{--sDN;@7Bj z^R{edyE9!##dnrkPupX@Tehb9*vVXTp={Z`w4CF-Y#Cf|ms1?JXZ|kl@L9+KL~y8& ze&Ae5l+)FtbyFCweei!ed;dlAFJlcdniK`ccw~B@V5h+b%ncND(rkbf)NEpm4tBBy zk>3`f%Ju#+^SA$EZU5_@J1jEaXAEb?nBQOw#;{Nr4;cHfsKPX1*JF(9nlW<|VQyU# zU1u{fB(OP)%?)T44bpISSfu6-9Qm}?&7ZF&)6)}CyKuvmCc`U3r~M}#%~Sm9Lw6ay G9sdR?rV%>; literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/messageable.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/messageable.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8bc241ba4c0270f5e266ede5d667454d62f76c4 GIT binary patch literal 1982 zcmcgt%Z?jG6s@+~k1<0sQG^5%i;@uXSWMb%n1vNkEaZe)*jTZpfH&=OS9#nc_ajy1 zVaAzR4gZ4prQWh)!w0b9R6qQRA|w{H+}HKI_ndQYSN(PTapPk6+s}(CA%Bpa$42`F zUiCE$Cu9O^5nduoiv%SyDG}=xFB5K)Uom47Q6>*%GO-D-kWs6;{$ePjYo80M7lQVM zQtVQ&*;4fV8$YDpk}2i9EMtdbrEVI=gbpy9?2}SP=LiW^;k$}f(98p?hHJG$UGIikc51XR|PPB zncM+@Mb7UKxJ1qo{E855kvl@JFqATf1n54XTP5fBHn}Sk`6JO7g*;e_MK$s~B6(kw(yfL>|ohnI$xGCWZ*o3Ms|5yrT4=$nNIX`Iy-KPx5`WfCNS zf|_M1hfU-?ZxCi7q)C6cUCLG%47KkuEjV2%Assr1v?*Rx$swTkSJPmnw5cTIs1U!9 zasz`hkXx|p19nIbjfD(+rTi#VJ9&BuZNv==;-xs-sKY?szXr~Nx|x|y+pD&U#d-AdN8_QggF< zN^ES@vV_AE2eYljaxTsBn$+?_nmpPUR@O25JCP^&`@7fHLEMi0_}OgbFZr{ZD4NBW z{F`d>Oau7>3X%){*tORkfa4>reX!mr@}o zz}8(iWPt#qhU+5CYH8ZXuKRYymibK0b$R5uZWuxxTU&=A3(*}8$z(;iD%Y%@6Gf4>K=8*lW*^d2k;XPR)FW{xT_}^1VDt5fbbwC zka-Y!Kwb(TL;zp$O90Y`TOXnTL<8RSnwv)xReVZ>r20nEx3Wyve45JF$tuZdobsv) z?<_@+nD%foW|QINs~GeBLOnJAV?0RYM{rr;;j^m`Fi&5yqC=E+4lQIl^6?VMsjKq7DM*TYx$C z?ZNqHtYJc6?tw;OKAfPStp~S+pcg0Bj2})KVmmjA>0HJ->~!dE4N9(fMyG{X59lTO zm2ve!6wBNS&$!m8D=x5`T)S2{W?6<=_zyx!y-;~IphG%v{tm9bgroY}6|E`VpY40( za+$7atR%0YcVK%o6KJ{8QCr_6`87*~Y3&G2Ah_mtXa)2F)1EETH0PO&T1+{6O;8q< zR@T6tZ-PpuGZWapR1-_zL3Q!x_o%P4vR@|U>2#5#;&fFM)ACxJ^-IN>EMrA=x}|KJN!DbXVTsY_u7(IvFz^#t?gv+H;q&j|=WP zz^uiXC}PIcF`_x42jR%p>^wAZJHjq$dai=_>ONLY1K()ZylK{sy9);}wtZ!>O#4|a M z3Dg9d1Xc-tJ3+Grx@&+7{19*f<0(R@ zBxDgNh50oyW-z}Ygxt2lL?#qcmg@3CR*pIyn$lcPJ194*76+GFm)*H|UUY_kjm}@CwneO5G=9c@ zcQ^D|cV+ynM`+dukUu8dC$Tm6zlvEraEg;0G3Id?>&J{?@lEaH31go(Jb>bE$e7R- zW1(^&-EkAtFe$nLT9BNOJP8@BZ}u?T4=UZ>bs&$U318SL&4y;P1IX? z2Oa@&7R()U}UC13o%FdzZj|V-3iT!0mGg3eW)>Vt^dRfC@>C4OBjhn|;?-%~ za@}pn)r&!1Dl-*{VpDC{2PI`%z7bZ{WRwM#qGXB4*+elb7E1Pp2}t4%*9iPAxa~u@ zBIE)-l$4&(W57%Uas?b4FNI3sO0ZL)YR^2Q+kHp>1hUA=jQ( zS(b~riUatu%BBWI`$0?>mcPgSa$fX{wAi0iX(snCwVo6+`LbUa@ud!PEmdawb>;pX zhsE}R1&&UySQ?y|Hn_!vw4Tt_Ly&bdSUn`1P`m@fbQA9t&^O<$5Qe9@ z+WnYgEkC;Jez~afXQm0IObY_YV33Wug8>yV9SAWscQMCD*I@^TaQXn; literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/votable.cpython-34.pyc b/env/lib/python3.4/site-packages/praw/models/reddit/mixins/__pycache__/votable.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7c251ee58f171f4f97091457a17cea7b95df961 GIT binary patch literal 2410 zcmeHI&u<(x6!!euY`0rfXc2J2QjyR~%}g)NA*!l|A|OI+S52tIBIJ6<-ma^e@znNY zlc=|FMEn~FiN9#BoO0pDg$umrX_ASAsvdi&wSImx^Y*>Z?|pv$YkY0AJNxa2zXyc; zNqQp&{Q*pS2ZSJG4l*DjBt<~Vkjz68d@Uj(V)8S5iHVHJNkrx`5eeCw430mY8GWFH zq;4hY6Ycn-kl(38RnffQ)~2TzU=p;$o!Ks%?d*S(!}IwFL3;qxeg#58bO;SHL=1C? z3QB~5F`f^JdP2m2hz7u8wq9FP>D%0-(bdLYU5g4XE0tHfzl3_O;J?5l#{TH ztt^)975JCTozm6s#Eil4pPkH=byll-bJ3_mY#wU8sGo_uS#9{b6Qvfiuvr%*E3r5> z11MOkv_5JRhPZ~fy%+=uZUx65Jn5A(^#*x>A7S7c!So5a2}+lcjy5L*_8Y-|WBvyi zJ}e|Ro*TRYhEz`F924AFX+F0;+mLK;pcl_!Yw2i2UyU@S6#(1bMqWXg%Eme@QOJP(6;^^Rd5DczIZDd`G9O;bqQ z_lE2&HNX(kaaCAM%-T~^SJo-lU=qB`d?mR9Xes^i>0`OfE7 zG86J3Yz(&X;;!`MqLac}I=6f*N@6r>FnIcs)Oc;#KiJ?y=*; zOYAtacoS}f7u<;XF972E`W-XQn&ey2G|c3Hq3^7Y+CKAv|p`CUnl2?^EVFcr`ar;C`_] + + """ + self._vote(direction=0) + + def downvote(self): + """Downvote the object. + + .. note:: Votes must be cast by humans. That is, API clients proxying a + human's action one-for-one are OK, but bots deciding how to vote on + content or amplifying a human's vote are not. See the reddit rules + for more details on what constitutes vote cheating. [`Ref + `_] + + """ + self._vote(direction=-1) + + def upvote(self): + """Upvote the object. + + .. note:: Votes must be cast by humans. That is, API clients proxying a + human's action one-for-one are OK, but bots deciding how to vote on + content or amplifying a human's vote are not. See the reddit rules + for more details on what constitutes vote cheating. [`Ref + `_] + + """ + self._vote(direction=1) diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/modmail.py b/env/lib/python3.4/site-packages/praw/models/reddit/modmail.py new file mode 100644 index 0000000..6c6a68f --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/modmail.py @@ -0,0 +1,267 @@ +"""Provide models for new modmail.""" +from ...const import API_PATH +from .base import RedditBase + + +class ModmailConversation(RedditBase): + """A class for modmail conversations.""" + + STR_FIELD = 'id' + + @staticmethod + def _convert_conversation_objects(data, reddit): + """Convert messages and mod actions to PRAW objects.""" + result = {'messages': [], 'modActions': []} + for thing in data['conversation']['objIds']: + key = thing['key'] + thing_data = data[key][thing['id']] + result[key].append(reddit._objector.objectify(thing_data)) + return result + + @staticmethod + def _convert_user_summary(data, reddit): + """Convert dictionaries of recent user history to PRAW objects.""" + parsers = {'recentComments': + reddit._objector.parsers[reddit.config.kinds['comment']], + 'recentConvos': ModmailConversation, + 'recentPosts': + reddit._objector.parsers[reddit.config.kinds['submission']]} + for kind, parser in parsers.items(): + objects = [] + for thing_id, summary in data[kind].items(): + thing = parser(reddit, id=thing_id.rsplit('_', 1)[-1]) + if parser is not ModmailConversation: + del summary['permalink'] + for key, value in summary.items(): + setattr(thing, key, value) + objects.append(thing) + # Sort by id, oldest to newest + data[kind] = sorted( + objects, + key=lambda x: int(x.id, base=36), reverse=True) + + @classmethod + def parse(cls, data, reddit, # pylint: disable=arguments-differ + convert_objects=True): + """Return an instance of ModmailConversation from ``data``. + + :param data: The structured data. + :param reddit: An instance of :class:`.Reddit`. + :param convert_objects: If True, convert message and mod action data + into objects (default: True). + + """ + conversation = data['conversation'] + + conversation['authors'] = [reddit._objector.objectify(author) + for author in conversation['authors']] + for entity in 'owner', 'participant': + conversation[entity] = reddit._objector.objectify( + conversation[entity]) + + if data.get('user'): + cls._convert_user_summary(data['user'], reddit) + conversation['user'] = reddit._objector.objectify(data['user']) + if convert_objects: + conversation.update(cls._convert_conversation_objects(data, + reddit)) + + conversation = reddit._objector._snake_case_keys(conversation) + + return cls(reddit, _data=conversation) + + def __init__(self, reddit, id=None, # pylint: disable=redefined-builtin + mark_read=False, _data=None): + """Construct an instance of the ModmailConversation object. + + :param mark_read: If True, conversation is marked as read + (default: False). + + """ + super(ModmailConversation, self).__init__(reddit, _data) + if bool(id) == bool(_data): + raise TypeError('Either `id` or `_data` must be provided.') + + if id: + self.id = id # pylint: disable=invalid-name + if mark_read: + self._info_params = {'markRead': True} + + def _build_conversation_list(self, other_conversations): + """Return a comma-separated list of conversation IDs.""" + conversations = [self] + (other_conversations or []) + return ','.join(conversation.id for conversation in conversations) + + def _info_path(self): + return API_PATH['modmail_conversation'].format(id=self.id) + + def archive(self): + """Archive the conversation. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz').archive() + + """ + self._reddit.post(API_PATH['modmail_archive'].format(id=self.id)) + + def highlight(self): + """Highlight the conversation. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz').highlight() + + """ + self._reddit.post(API_PATH['modmail_highlight'].format(id=self.id)) + + def mute(self): + """Mute the non-mod user associated with the conversation. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz').mute() + + """ + self._reddit.request('POST', + API_PATH['modmail_mute'].format(id=self.id)) + + def read(self, other_conversations=None): + """Mark the conversation(s) as read. + + :param other_conversations: A list of other conversations to mark + (default: None). + + For example, to mark the conversation as read along with other recent + conversations from the same user: + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + conversation = subreddit.modmail.conversation('2gmz') + conversation.read( + other_conversations=conversation.user.recent_convos) + + """ + data = {'conversationIds': self._build_conversation_list( + other_conversations)} + self._reddit.post(API_PATH['modmail_read'], data=data) + + def reply(self, body, author_hidden=False, internal=False): + """Reply to the conversation. + + :param body: The markdown formatted content for a message. + :param author_hidden: When True, author is hidden from non-moderators + (default: False). + :param internal: When True, message is a private moderator note, + hidden from non-moderators (default: False). + :returns: A :class:`~.ModmailMessage` object for the newly created + message. + + For example, to reply to the non-mod user while hiding your username: + + .. code:: python + + conversation = reddit.subreddit('redditdev').modmail('2gmz') + conversation.reply('Message body', author_hidden=True) + + To create a private moderator note on the conversation: + + .. code:: python + + conversation.reply('Message body', internal=True) + + """ + data = {'body': body, 'isAuthorHidden': author_hidden, + 'isInternal': internal} + response = self._reddit.post(API_PATH['modmail_conversation'] + .format(id=self.id), data=data) + message_id = response['conversation']['objIds'][-1]['id'] + message_data = response['messages'][message_id] + return self._reddit._objector.objectify(message_data) + + def unarchive(self): + """Unarchive the conversation. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz').unarchive() + + """ + self._reddit.post(API_PATH['modmail_unarchive'].format(id=self.id)) + + def unhighlight(self): + """Un-highlight the conversation. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz').unhighlight() + + """ + self._reddit.request('DELETE', + API_PATH['modmail_highlight'].format(id=self.id)) + + def unmute(self): + """Unmute the non-mod user associated with the conversation. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz').unmute() + + """ + self._reddit.request('POST', + API_PATH['modmail_unmute'].format(id=self.id)) + + def unread(self, other_conversations=None): + """Mark the conversation(s) as unread. + + :param other_conversations: A list of other conversations to mark + (default: None). + + For example, to mark the conversation as unread along with other recent + conversations from the same user: + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + conversation = subreddit.modmail.conversation('2gmz') + conversation.unread( + other_conversations=conversation.user.recent_convos) + + """ + data = {'conversationIds': self._build_conversation_list( + other_conversations)} + self._reddit.post(API_PATH['modmail_unread'], data=data) + + +class ModmailObject(RedditBase): + """A base class for objects within a modmail conversation.""" + + AUTHOR_ATTRIBUTE = 'author' + STR_FIELD = 'id' + + def __setattr__(self, attribute, value): + """Objectify the AUTHOR_ATTRIBUTE attribute.""" + if attribute == self.AUTHOR_ATTRIBUTE: + value = self._reddit._objector.objectify(value) + super(ModmailObject, self).__setattr__(attribute, value) + + +class ModmailAction(ModmailObject): + """A class for moderator actions on modmail conversations.""" + + +class ModmailMessage(ModmailObject): + """A class for modmail messages.""" diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/more.py b/env/lib/python3.4/site-packages/praw/models/reddit/more.py new file mode 100644 index 0000000..30ecd9b --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/more.py @@ -0,0 +1,69 @@ +"""Provide the MoreComments class.""" +from ...const import API_PATH +from ..base import PRAWBase + + +class MoreComments(PRAWBase): + """A class indicating there are more comments.""" + + def __init__(self, reddit, _data): + """Construct an instance of the MoreComments object.""" + self.count = self.parent_id = None + self.children = [] + super(MoreComments, self).__init__(reddit, _data) + self._comments = None + self.submission = None + + def __eq__(self, other): + """Return True if these MoreComments instances are the same.""" + return isinstance(other, self.__class__) and \ + self.count == other.count and self.children == other.children + + def __lt__(self, other): + """Provide a sort order on the MoreComments object.""" + # To work with heapq a "smaller" item is the one with the most comments + # We are intentionally making the biggest element the smallest element + # to turn the min-heap implementation in heapq into a max-heap. + return self.count > other.count + + def __repr__(self): + """Return a string representation of the MoreComments instance.""" + children = self.children[:4] + if len(self.children) > 4: + children[-1] = '...' + return '<{} count={}, children={!r}>'.format( + self.__class__.__name__, self.count, children) + + def _continue_comments(self, update): + assert len(self.children) == 0 + parent = self._load_comment(self.parent_id.split('_', 1)[1]) + self._comments = parent.replies + if update: + for comment in self._comments: + comment.submission = self.submission + return self._comments + + def _load_comment(self, comment_id): + path = '{}_/{}'.format( + API_PATH['submission'].format(id=self.submission.id), comment_id) + _, comments = self._reddit.get(path, params={ + 'limit': self.submission.comment_limit, + 'sort': self.submission.comment_sort}) + assert len(comments.children) == 1 + return comments.children[0] + + def comments(self, update=True): + """Fetch and return the comments for a single MoreComments object.""" + if self._comments is None: + if self.count == 0: # Handle 'continue this thread' + return self._continue_comments(update) + assert self.children + data = {'children': ','.join(self.children), + 'link_id': self.submission.fullname, + 'sort': self.submission.comment_sort} + self._comments = self._reddit.post(API_PATH['morechildren'], + data=data) + if update: + for comment in self._comments: + comment.submission = self.submission + return self._comments diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/multi.py b/env/lib/python3.4/site-packages/praw/models/reddit/multi.py new file mode 100644 index 0000000..90cdd99 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/multi.py @@ -0,0 +1,137 @@ +"""Provide the Multireddit class.""" +from json import dumps +import re + +from ...const import API_PATH +from ..listing.mixins import SubredditListingMixin +from .base import RedditBase +from .redditor import Redditor +from .subreddit import Subreddit + + +class Multireddit(RedditBase, SubredditListingMixin): + """A class for users' Multireddits.""" + + STR_FIELD = 'path' + RE_INVALID = re.compile(r'(\s|\W|_)+', re.UNICODE) + + @staticmethod + def sluggify(title): + """Return a slug version of the title. + + :param title: The title to make a slug of. + + Adapted from reddit's utils.py. + + """ + title = Multireddit.RE_INVALID.sub('_', title).strip('_').lower() + if len(title) > 21: # truncate to nearest word + title = title[:21] + last_word = title.rfind('_') + if last_word > 0: + title = title[:last_word] + return title or '_' + + def __init__(self, reddit, _data): + """Construct an instance of the Multireddit object.""" + self.path = None + super(Multireddit, self).__init__(reddit, _data) + self._author = Redditor(reddit, self.path.split('/', 3)[2]) + self._path = API_PATH['multireddit'].format( + multi=self.name, user=self._author) + self.path = '/' + self._path[:-1] # Prevent requests for path + if 'subreddits' in self.__dict__: + self.subreddits = [Subreddit(reddit, x['name']) + for x in self.subreddits] + + def _info_path(self): + return API_PATH['multireddit_api'].format( + multi=self.name, user=self._author) + + def add(self, subreddit): + """Add a subreddit to this multireddit. + + :param subreddit: The subreddit to add to this multi. + + """ + url = API_PATH['multireddit_update'].format( + multi=self.name, user=self._author, subreddit=subreddit) + self._reddit.request( + 'PUT', url, data={'model': dumps({'name': str(subreddit)})}) + self._reset_attributes('subreddits') + + def copy(self, display_name=None): + """Copy this multireddit and return the new multireddit. + + :param display_name: (optional) The display name for the copied + multireddit. Reddit will generate the ``name`` field from this + display name. When not provided the copy will use the same display + name and name as this multireddit. + + """ + if display_name: + name = self.sluggify(display_name) + else: + display_name = self.display_name + name = self.name + data = {'display_name': display_name, 'from': self.path, + 'to': API_PATH['multireddit'].format( + multi=name, user=self._reddit.user.me())} + return self._reddit.post(API_PATH['multireddit_copy'], data=data) + + def delete(self): + """Delete this multireddit.""" + self._reddit.request('DELETE', self._info_path()) + + def remove(self, subreddit): + """Remove a subreddit from this multireddit. + + :param subreddit: The subreddit to remove from this multi. + + """ + url = API_PATH['multireddit_update'].format( + multi=self.name, user=self._author, subreddit=subreddit) + self._reddit.request( + 'DELETE', url, data={'model': dumps({'name': str(subreddit)})}) + self._reset_attributes('subreddits') + + def rename(self, display_name): + """Rename this multireddit. + + :param display_name: The new display name for this multireddit. Reddit + will generate the ``name`` field from this display name. + + """ + data = {'from': self.path, 'display_name': display_name} + updated = self._reddit.post(API_PATH['multireddit_rename'], data=data) + self.__dict__.update(updated.__dict__) + + def update(self, **updated_settings): + """Update this multireddit. + + Keyword arguments are passed for settings that should be updated. They + can any of: + + :param display_name: The display name for this multireddit. + :param subreddits: Subreddits for this multireddit. + :param description_md: Description for this multireddit, formatted in + markdown. + :param icon_name: Can be one of: ``art and design``, ``ask``, + ``books``, ``business``, ``cars``, ``comics``, ``cute animals``, + ``diy``, ``entertainment``, ``food and drink``, ``funny``, + ``games``, ``grooming``, ``health``, ``life advice``, ``military``, + ``models pinup``, ``music``, ``news``, ``philosophy``, ``pictures + and gifs``, ``science``, ``shopping``, ``sports``, ``style``, + ``tech``, ``travel``, ``unusual stories``, ``video``, or ``None``. + :param key_color: RGB hex color code of the form ``'#FFFFFF'``. + :param visibility: Can be one of: ``hidden``, ``private``, ``public``. + :param weighting_scheme: Can be one of: ``classic``, ``fresh``. + + """ + if 'subreddits' in updated_settings: + updated_settings['subreddits'] = [ + {'name': str(sub)} for sub in updated_settings['subreddits']] + response = self._reddit.request( + 'PUT', self._info_path(), data={'model': dumps(updated_settings)}) + new = Multireddit(self._reddit, response['data']) + self.__dict__.update(new.__dict__) diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/redditor.py b/env/lib/python3.4/site-packages/praw/models/reddit/redditor.py new file mode 100644 index 0000000..15e901d --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/redditor.py @@ -0,0 +1,95 @@ +"""Provide the Redditor class.""" +from json import dumps + +from ...const import API_PATH +from ..listing.mixins import RedditorListingMixin +from .base import RedditBase +from .mixins import MessageableMixin + + +class Redditor(RedditBase, MessageableMixin, RedditorListingMixin): + """A class representing the users of reddit.""" + + STR_FIELD = 'name' + + @classmethod + def from_data(cls, reddit, data): + """Return an instance of Redditor, or None from ``data``.""" + if data == '[deleted]': + return None + else: + return cls(reddit, data) + + def __init__(self, reddit, name=None, _data=None): + """Initialize a Redditor instance. + + :param reddit: An instance of :class:`~.Reddit`. + :param name: The name of the redditor. + + """ + if bool(name) == bool(_data): + raise TypeError('Either `name` or `_data` must be provided.') + super(Redditor, self).__init__(reddit, _data) + self._listing_use_sort = True + if name: + self.name = name + self._path = API_PATH['user'].format(user=self) + + def _info_path(self): + return API_PATH['user_about'].format(user=self) + + def _friend(self, method, data): + url = API_PATH['friend_v1'].format(user=self) + self._reddit.request(method, url, data=dumps(data)) + + def friend(self, note=None): + """Friend the Redditor. + + :param note: A note to save along with the relationship. Requires + reddit Gold (default: None). + + Calling this method subsequent times will update the note. + + """ + self._friend('PUT', data={'note': note} if note else {}) + + def friend_info(self): + """Return a Redditor instance with specific friend-related attributes. + + :returns: A :class:`.Redditor` instance with fields ``date``, ``id``, + and possibly ``note`` if the authenticated user has reddit Gold. + + """ + return self._reddit.get(API_PATH['friend_v1'].format(user=self)) + + def gild(self, months=1): + """Gild the Redditor. + + :param months: Specifies the number of months to gild up to 36 + (default: 1). + + """ + if months < 1 or months > 36: + raise TypeError('months must be between 1 and 36') + self._reddit.post(API_PATH['gild_user'].format(username=self), + data={'months': months}) + + def multireddits(self): + """Return a list of the redditor's public multireddits.""" + return self._reddit.get(API_PATH['multireddit_user'].format(user=self)) + + def unblock(self): + """Unblock the Redditor. + + Blocking must be done from a Message, Comment Reply or Submission + Reply. + + """ + data = {'container': self._reddit.user.me().fullname, + 'name': str(self), 'type': 'enemy'} + url = API_PATH['unfriend'].format(subreddit='all') + self._reddit.post(url, data=data) + + def unfriend(self): + """Unfriend the Redditor.""" + self._friend(method='DELETE', data={'id': str(self)}) diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/submission.py b/env/lib/python3.4/site-packages/praw/models/reddit/submission.py new file mode 100644 index 0000000..b8b77aa --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/submission.py @@ -0,0 +1,418 @@ +"""Provide the Submission class.""" +from ...const import API_PATH, urljoin, urlparse +from ...exceptions import ClientException +from ..comment_forest import CommentForest +from ..listing.mixins import SubmissionListingMixin +from .base import RedditBase +from .mixins import ThingModerationMixin, UserContentMixin +from .redditor import Redditor +from .subreddit import Subreddit + + +class Submission(RedditBase, SubmissionListingMixin, UserContentMixin): + """A class for submissions to reddit.""" + + STR_FIELD = 'id' + + @staticmethod + def id_from_url(url): + """Return the ID contained within a submission URL. + + :param url: A url to a submission in one of the following formats (http + urls will also work): + * https://redd.it/2gmzqe + * https://reddit.com/comments/2gmzqe/ + * https://www.reddit.com/r/redditdev/comments/2gmzqe/praw_https/ + + Raise :class:`.ClientException` if URL is not a valid submission URL. + + """ + parsed = urlparse(url) + if not parsed.netloc: + raise ClientException('Invalid URL: {}'.format(url)) + + parts = parsed.path.split('/') + if 'comments' not in parts: + submission_id = parts[-1] + else: + submission_id = parts[parts.index('comments') + 1] + + if not submission_id.isalnum(): + raise ClientException('Invalid URL: {}'.format(url)) + return submission_id + + @property + def comments(self): + """Provide an instance of :class:`.CommentForest`. + + This attribute can use used, for example, to obtain a flat list of + comments, with any :class:`.MoreComments` removed: + + .. code:: python + + submission.comments.replace_more(limit=0) + comments = submission.comments.list() + + Sort order and comment limit can be set with the ``comment_sort`` and + ``comment_limit`` attributes before comments are fetched, including + any call to :meth:`.replace_more`: + + .. code:: python + + submission.comment_sort = 'new' + comments = submission.comments.list() + + See :ref:`extracting_comments` for more on working with a + :class:`.CommentForest`. + + """ + # This assumes _comments is set so that _fetch is called when it's not. + return self._comments + + @property + def flair(self): + """Provide an instance of :class:`.SubmissionFlair`. + + This attribute is used to work with flair as a regular user of the + subreddit the submission belongs to. Moderators can directly use + :meth:`.flair`. + + For example, to select an arbitrary editable flair text (assuming there + is one) and set a custom value try: + + .. code:: python + + choices = submission.flair.choices() + template_id = next(x for x in choices + if x['flair_text_editable'])['flair_template_id'] + submission.flair.select(template_id, 'my custom value') + + """ + if self._flair is None: + self._flair = SubmissionFlair(self) + return self._flair + + @property + def mod(self): + """Provide an instance of :class:`.SubmissionModeration`.""" + if self._mod is None: + self._mod = SubmissionModeration(self) + return self._mod + + def __init__(self, reddit, id=None, # pylint: disable=redefined-builtin + url=None, _data=None): + """Initialize a Submission instance. + + :param reddit: An instance of :class:`~.Reddit`. + :param id: A reddit base36 submission ID, e.g., ``2gmzqe``. + :param url: A URL supported by :meth:`~.id_from_url`. + + Either ``id`` or ``url`` can be provided, but not both. + + """ + if [id, url, _data].count(None) != 2: + raise TypeError('Exactly one of `id`, `url`, or `_data` must be ' + 'provided.') + super(Submission, self).__init__(reddit, _data) + self.comment_limit = 2048 + + #: Specify the sort order for ``comments`` + self.comment_sort = 'best' + + if id is not None: + self.id = id # pylint: disable=invalid-name + elif url is not None: + self.id = self.id_from_url(url) + self._flair = self._mod = None + + self._comments_by_id = {} + + def __setattr__(self, attribute, value): + """Objectify author, and subreddit attributes.""" + # pylint: disable=redefined-variable-type + if attribute == 'author': + value = Redditor.from_data(self._reddit, value) + elif attribute == 'subreddit': + value = Subreddit(self._reddit, value) + super(Submission, self).__setattr__(attribute, value) + + def _chunk(self, other_submissions, chunk_size): + all_submissions = [self.fullname] + if other_submissions: + all_submissions += [x.fullname for x in other_submissions] + + for position in range(0, len(all_submissions), chunk_size): + yield ','.join(all_submissions[position:position + 50]) + + def _fetch(self): + other, comments = self._reddit.get(self._info_path(), + params={'limit': self.comment_limit, + 'sort': self.comment_sort}) + other = other.children[0] + delattr(other, 'comment_limit') + delattr(other, 'comment_sort') + other._comments = CommentForest(self) + self.__dict__.update(other.__dict__) + self.comments._update(comments.children) + self._fetched = True + + def _info_path(self): + return API_PATH['submission'].format(id=self.id) + + def hide(self, other_submissions=None): + """Hide Submission. + + :param other_submissions: When provided, additionally + hide this list of :class:`.Submission` instances + as part of a single request (default: None). + + """ + for submissions in self._chunk(other_submissions, 50): + self._reddit.post(API_PATH['hide'], data={'id': submissions}) + + @property + def shortlink(self): + """Return a shortlink to the submission. + + For example http://redd.it/eorhm is a shortlink for + https://www.reddit.com/r/announcements/comments/eorhm/reddit_30_less_typing/. + + """ + return urljoin(self._reddit.config.short_url, self.id) + + def unhide(self, other_submissions=None): + """Unhide Submission. + + :param other_submissions: When provided, additionally + unhide this list of :class:`.Submission` instances + as part of a single request (default: None). + + """ + for submissions in self._chunk(other_submissions, 50): + self._reddit.post(API_PATH['unhide'], data={'id': submissions}) + + +class SubmissionFlair(object): + """Provide a set of functions pertaining to Submission flair.""" + + def __init__(self, submission): + """Create a SubmissionFlair instance. + + :param submission: The submission associated with the flair functions. + + """ + self.submission = submission + + def choices(self): + """Return list of available flair choices. + + Choices are required in order to use :meth:`.select`. + + Example: + + .. code:: python + + choices = submission.flair.choices() + + """ + url = API_PATH['flairselector'].format( + subreddit=self.submission.subreddit) + return self.submission._reddit.post(url, data={ + 'link': self.submission.fullname})['choices'] + + def select(self, flair_template_id, text=None): + """Select flair for submission. + + :param flair_template_id: The flair template to select. The possible + ``flair_template_id`` values can be discovered through + :meth:`.choices`. + :param text: If the template's ``flair_text_editable`` value is True, + this value will set a custom text (default: None). + + For example, to select an arbitrary editable flair text (assuming there + is one) and set a custom value try: + + .. code:: python + + choices = submission.flair.choices() + template_id = next(x for x in choices + if x['flair_text_editable'])['flair_template_id'] + submission.flair.select(template_id, 'my custom value') + + """ + data = {'flair_template_id': flair_template_id, + 'link': self.submission.fullname, 'text': text} + url = API_PATH['select_flair'].format( + subreddit=self.submission.subreddit) + self.submission._reddit.post(url, data=data) + + +class SubmissionModeration(ThingModerationMixin): + """Provide a set of functions pertaining to Submission moderation.""" + + def __init__(self, submission): + """Create a SubmissionModeration instance. + + :param submission: The submission to moderate. + + """ + self.thing = submission + + def contest_mode(self, state=True): + """Set contest mode for the comments of this submission. + + :param state: (boolean) True enables contest mode, False, disables + (default: True). + + Contest mode have the following effects: + * The comment thread will default to being sorted randomly. + * Replies to top-level comments will be hidden behind + "[show replies]" buttons. + * Scores will be hidden from non-moderators. + * Scores accessed through the API (mobile apps, bots) will be + obscured to "1" for non-moderators. + + """ + self.thing._reddit.post(API_PATH['contest_mode'], data={ + 'id': self.thing.fullname, 'state': state}) + + def flair(self, text='', css_class=''): + """Set flair for the submission. + + :param text: The flair text to associate with the Submission (default: + ''). + :param css_class: The css class to associate with the flair html + (default: ''). + + This method can only be used by an authenticated user who is a + moderator of the Submission's Subreddit. + + Example: + + .. code:: python + + submission.mod.flair(text='PRAW', css_class='bot') + + """ + data = {'css_class': css_class, 'link': self.thing.fullname, + 'text': text} + url = API_PATH['flair'].format(subreddit=self.thing.subreddit) + self.thing._reddit.post(url, data=data) + + def lock(self): + """Lock the submission.""" + self.thing._reddit.post(API_PATH['lock'], + data={'id': self.thing.fullname}) + + def nsfw(self): + """Mark as not safe for work. + + This method can be used both by the submission author and moderators of + the subreddit that the submission belongs to. + + Example: + + .. code:: python + + submission = reddit.subreddit('test').submit('nsfw test', + selftext='nsfw') + submission.mod.nsfw() + + """ + self.thing._reddit.post(API_PATH['marknsfw'], + data={'id': self.thing.fullname}) + + def sfw(self): + """Mark as safe for work. + + This method can be used both by the submission author and moderators of + the subreddit that the submission belongs to. + + Example: + + .. code:: python + + submission = reddit.submission(id='5or86n') + submission.mod.sfw() + + """ + self.thing._reddit.post(API_PATH['unmarknsfw'], + data={'id': self.thing.fullname}) + + def spoiler(self): + """Indicate that the submission contains spoilers. + + This method can be used both by the submission author and moderators of + the subreddit that the submission belongs to. + + Example: + + .. code:: python + + submission = reddit.submission(id='5or86n') + submission.mod.spoiler() + + """ + self.thing._reddit.post(API_PATH['spoiler'], + data={'id': self.thing.fullname}) + + def sticky(self, state=True, bottom=True): + """Set the submission's sticky state in its subreddit. + + :param state: (boolean) True sets the sticky for the submission, false + unsets (default: True). + :param bottom: (boolean) When true, set the submission as the bottom + sticky. If no top sticky exists, this submission will become the + top sticky regardless (default: True). + + This submission will replace an existing stickied submission if one + exists. + + Example: + + .. code:: python + + submission.mod.sticky() + + """ + data = {'id': self.thing.fullname, 'state': state} + if not bottom: + data['num'] = 1 + return self.thing._reddit.post(API_PATH['sticky_submission'], + data=data) + + def suggested_sort(self, sort='blank'): + """Set the suggested sort for the comments of the submission. + + :param sort: Can be one of: confidence, top, new, controversial, old, + random, qa, blank (default: blank). + + """ + self.thing._reddit.post(API_PATH['suggested_sort'], data={ + 'id': self.thing.fullname, 'sort': sort}) + + def unlock(self): + """Unlock the submission.""" + self.thing._reddit.post(API_PATH['unlock'], + data={'id': self.thing.fullname}) + + def unspoiler(self): + """Indicate that the submission does not contain spoilers. + + This method can be used both by the submission author and moderators of + the subreddit that the submission belongs to. + + Example: + + .. code:: python + + submission = reddit.subreddit('test').submit('not spoiler', + selftext='spoiler') + submission.mod.unspoiler() + + """ + self.thing._reddit.post(API_PATH['unspoiler'], + data={'id': self.thing.fullname}) + + +Subreddit._submission_class = Submission diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/subreddit.py b/env/lib/python3.4/site-packages/praw/models/reddit/subreddit.py new file mode 100644 index 0000000..f35f0c5 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/subreddit.py @@ -0,0 +1,2128 @@ +"""Provide the Subreddit class.""" +from copy import deepcopy +from json import dumps +import time + +from prawcore import Redirect + +from ...const import API_PATH, urljoin +from ...exceptions import APIException +from ..util import permissions_string, stream_generator +from ..listing.generator import ListingGenerator +from ..listing.mixins import SubredditListingMixin +from .base import RedditBase +from .mixins import MessageableMixin +from .modmail import ModmailConversation +from .wikipage import WikiPage + + +class Subreddit(RedditBase, MessageableMixin, SubredditListingMixin): + """A class for Subreddits. + + To obtain an instance of this class for subreddit ``/r/redditdev`` execute: + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + + While ``/r/all`` is not a real subreddit, it can still be treated like + one. The following outputs the titles of the 25 hottest submissions in + ``/r/all``: + + .. code:: python + + for submission in reddit.subreddit('all').hot(limit=25): + print(submission.title) + + Multiple subreddits can be combined like so: + + .. code:: python + + for submission in reddit.subreddit('redditdev+learnpython').top('all'): + print(submission) + + Subreddits can be filtered from combined listings as follows: + + .. code:: python + + for submission in reddit.subreddit('all-redditdev').new(): + print(submission) + + """ + + # pylint: disable=too-many-public-methods + + STR_FIELD = 'display_name' + MESSAGE_PREFIX = '#' + + @staticmethod + def _create_or_update(_reddit, allow_images=None, allow_top=None, + collapse_deleted_comments=None, + comment_score_hide_mins=None, description=None, + domain=None, exclude_banned_modqueue=None, + header_hover_text=None, hide_ads=None, lang=None, + key_color=None, link_type=None, name=None, + over_18=None, public_description=None, + public_traffic=None, show_media=None, + show_media_preview=None, spam_comments=None, + spam_links=None, spam_selfposts=None, + spoilers_enabled=None, sr=None, + submit_link_label=None, submit_text=None, + submit_text_label=None, subreddit_type=None, + suggested_comment_sort=None, title=None, + wiki_edit_age=None, wiki_edit_karma=None, + wikimode=None, **other_settings): + # pylint: disable=invalid-name,too-many-locals + model = {'allow_images': allow_images, + 'allow_top': allow_top, + 'collapse_deleted_comments': collapse_deleted_comments, + 'comment_score_hide_mins': comment_score_hide_mins, + 'description': description, + 'domain': domain, + 'exclude_banned_modqueue': exclude_banned_modqueue, + 'header-title': header_hover_text, # Remap here - better name + 'hide_ads': hide_ads, + 'key_color': key_color, + 'lang': lang, + 'link_type': link_type, + 'name': name, + 'over_18': over_18, + 'public_description': public_description, + 'public_traffic': public_traffic, + 'show_media': show_media, + 'show_media_preview': show_media_preview, + 'spam_comments': spam_comments, + 'spam_links': spam_links, + 'spam_selfposts': spam_selfposts, + 'spoilers_enabled': spoilers_enabled, + 'sr': sr, + 'submit_link_label': submit_link_label, + 'submit_text': submit_text, + 'submit_text_label': submit_text_label, + 'suggested_comment_sort': suggested_comment_sort, + 'title': title, + 'type': subreddit_type, + 'wiki_edit_age': wiki_edit_age, + 'wiki_edit_karma': wiki_edit_karma, + 'wikimode': wikimode} + + model.update(other_settings) + + _reddit.post(API_PATH['site_admin'], data=model) + + @staticmethod + def _subreddit_list(subreddit, other_subreddits): + if other_subreddits: + return ','.join([str(subreddit)] + + [str(x) for x in other_subreddits]) + return str(subreddit) + + @property + def banned(self): + """Provide an instance of :class:`.SubredditRelationship`. + + For example to ban a user try: + + .. code-block:: python + + reddit.subreddit('SUBREDDIT').banned.add('NAME', ban_reason='...') + + To list the banned users along with any notes, try: + + .. code-block:: python + + for ban in reddit.subreddit('SUBREDDIT').banned(): + print('{}: {}'.format(ban, ban.note)) + + """ + if self._banned is None: + self._banned = SubredditRelationship(self, 'banned') + return self._banned + + @property + def contributor(self): + """Provide an instance of :class:`.ContributorRelationship`.""" + if self._contributor is None: + self._contributor = ContributorRelationship(self, 'contributor') + return self._contributor + + @property + def filters(self): + """Provide an instance of :class:`.SubredditFilters`.""" + if self._filters is None: + self._filters = SubredditFilters(self) + return self._filters + + @property + def flair(self): + """Provide an instance of :class:`.SubredditFlair`. + + Use this attribute for interacting with a subreddit's flair. For + example to list all the flair for a subreddit which you have the + ``flair`` moderator permission on try: + + .. code-block:: python + + for flair in reddit.subreddit('NAME').flair(): + print(flair) + + Flair templates can be interacted with through this attribute via: + + .. code-block:: python + + for template in reddit.subreddit('NAME').flair.templates: + print(template) + + """ + if self._flair is None: + self._flair = SubredditFlair(self) + return self._flair + + @property + def mod(self): + """Provide an instance of :class:`.SubredditModeration`.""" + if self._mod is None: + self._mod = SubredditModeration(self) + return self._mod + + @property + def moderator(self): + """Provide an instance of :class:`.ModeratorRelationship`. + + For example to add a moderator try: + + .. code-block:: python + + reddit.subreddit('SUBREDDIT').moderator.add('NAME') + + To list the moderators along with their permissions try: + + .. code-block:: python + + for moderator in reddit.subreddit('SUBREDDIT').moderator(): + print('{}: {}'.format(moderator, moderator.mod_permissions)) + + """ + if self._moderator is None: + self._moderator = ModeratorRelationship(self, 'moderator') + return self._moderator + + @property + def modmail(self): + """Provide an instance of :class:`.Modmail`.""" + if self._modmail is None: + self._modmail = Modmail(self) + return self._modmail + + @property + def muted(self): + """Provide an instance of :class:`.SubredditRelationship`.""" + if self._muted is None: + self._muted = SubredditRelationship(self, 'muted') + return self._muted + + @property + def quaran(self): + """Provide an instance of :class:`.SubredditQuarantine`. + + This property is named ``quaran`` because ``quarantine`` is a + Subreddit attribute returned by Reddit to indicate whether or not a + Subreddit is quarantined. + + """ + if self._quarantine is None: + self._quarantine = SubredditQuarantine(self) + return self._quarantine + + @property + def stream(self): + """Provide an instance of :class:`.SubredditStream`. + + Streams can be used to indefinitely retrieve new comments made to a + subreddit, like: + + .. code:: python + + for comment in reddit.subreddit('iama').stream.comments(): + print(comment) + + Additionally, new submissions can be retrieved via the stream. In the + following example all submissions are fetched via the special subreddit + ``all``: + + .. code:: python + + for submission in reddit.subreddit('all').stream.submissions(): + print(submission) + + """ + if self._stream is None: + self._stream = SubredditStream(self) + return self._stream + + @property + def stylesheet(self): + """Provide an instance of :class:`.SubredditStylesheet`.""" + if self._stylesheet is None: + self._stylesheet = SubredditStylesheet(self) + return self._stylesheet + + @property + def wiki(self): + """Provide an instance of :class:`.SubredditWiki`. + + This attribute can be used to discover all wikipages for a subreddit: + + .. code:: python + + for wikipage in reddit.subreddit('iama').wiki: + print(wikipage) + + To fetch the content for a given wikipage try: + + .. code:: python + + wikipage = reddit.subreddit('iama').wiki['proof'] + print(wikipage.content_md) + + """ + if self._wiki is None: + self._wiki = SubredditWiki(self) + return self._wiki + + def __init__(self, reddit, display_name=None, _data=None): + """Initialize a Subreddit instance. + + :param reddit: An instance of :class:`~.Reddit`. + :param display_name: The name of the subreddit. + + .. note:: This class should not be initialized directly. Instead obtain + an instance via: ``reddit.subreddit('subreddit_name')`` + + """ + if bool(display_name) == bool(_data): + raise TypeError( + 'Either `display_name` or `_data` must be provided.') + super(Subreddit, self).__init__(reddit, _data) + if display_name: + self.display_name = display_name + self._banned = self._contributor = self._filters = self._flair = None + self._mod = self._moderator = self._modmail = self._muted = None + self._quarantine = self._stream = self._stylesheet = self._wiki = None + self._path = API_PATH['subreddit'].format(subreddit=self) + + def _info_path(self): + return API_PATH['subreddit_about'].format(subreddit=self) + + def random(self): + """Return a random Submission.""" + url = API_PATH['subreddit_random'].format(subreddit=self) + try: + self._reddit.get(url, params={'unique': self._reddit._next_unique}) + except Redirect as redirect: + path = redirect.path + return self._submission_class(self._reddit, url=urljoin( + self._reddit.config.reddit_url, path)) + + def rules(self): + """Return rules for the subreddit. + + For example to show the rules of ``/r/redditdev`` try: + + .. code:: python + + reddit.subreddit('redditdev').rules() + + """ + return self._reddit.get(API_PATH['rules'].format(subreddit=self)) + + def search(self, query, sort='relevance', syntax='lucene', + time_filter='all', **generator_kwargs): + """Return a ListingGenerator for items that match ``query``. + + :param query: The query string to search for. + :param sort: Can be one of: relevance, hot, top, new, + comments. (default: relevance). + :param syntax: Can be one of: cloudsearch, lucene, plain + (default: lucene). + :param time_filter: Can be one of: all, day, hour, month, week, year + (default: all). + + For more information on building a search query see: + https://www.reddit.com/wiki/search + + For example to search all subreddits for ``praw`` try: + + .. code:: python + + for submission in reddit.subreddit('all').search('praw'): + print(submission.title) + + """ + self._validate_time_filter(time_filter) + not_all = self.display_name.lower() != 'all' + self._safely_add_arguments(generator_kwargs, 'params', q=query, + restrict_sr=not_all, sort=sort, + syntax=syntax, t=time_filter) + url = API_PATH['search'].format(subreddit=self) + return ListingGenerator(self._reddit, url, **generator_kwargs) + + def sticky(self, number=1): + """Return a Submission object for a sticky of the subreddit. + + :param number: Specify which sticky to return. 1 appears at the top + (default: 1). + + Raises ``prawcore.NotFound`` if the sticky does not exist. + + """ + url = API_PATH['about_sticky'].format(subreddit=self) + try: + self._reddit.get(url, params={'num': number}) + except Redirect as redirect: + path = redirect.path + return self._submission_class(self._reddit, url=urljoin( + self._reddit.config.reddit_url, path)) + + def submissions(self, start=None, end=None, extra_query=None): + """Yield submissions created between timestamps ``start`` and ``end``. + + :param start: A UNIX timestamp indicating the earliest creation time of + submission yielded during the call. A value of ``None`` will + consider all submissions older than ``end`` (default: None). + :param end: A UNIX timestamp indicating the latest creation time of a + submission yielded during the call. A value of ``None`` will + consider all submissions newer than ``start`` (default: None). + :param extra_query: A cloudsearch query that will be combined via + ``(and timestamp:start..end EXTRA_QUERY)`` to further filter + results (default: None). + + Submissions are yielded newest first. + + **Example**: Suppose you want to obtain all submissions to + ``/r/politics`` on November 8, 2016 PST. First, you need to determine + the start and end dates as UNIX timestamps. Using + http://www.epochconverter.com/, those timestamps are 1478592000 and + 1478678400, respectively. The following outputs all such submissions' + titles: + + .. code:: python + + subreddit = reddit.subreddit('politics') + for submission in subreddit.submissions(1478592000, 1478678400): + print(submission.title) + + As of this writing there are 809 results. + + .. note:: The results are only as reliable as reddit's search. + Submissions may be missing from the results. + + """ + utc_offset = 28800 + now = int(time.time()) + start = max(int(start) + utc_offset if start else 0, 0) + end = min(int(end) if end else now, now) + utc_offset + + found_new_submission = True + last_ids = set() + params = {} + while found_new_submission: + query = 'timestamp:{}..{}'.format(start, end) + if extra_query: + query = '(and {} {})'.format(query, extra_query) + + current_ids = set() + found_new_submission = False + for submission in self.search(query, limit=None, params=params, + sort='new', syntax='cloudsearch'): + current_ids.add(submission.id) + end = min(end, int(submission.created)) + if submission.id not in last_ids: + found_new_submission = True + yield submission + params['after'] = submission.fullname + last_ids = current_ids + + def submit(self, title, selftext=None, url=None, flair_id=None, + flair_text=None, resubmit=True, send_replies=True): + """Add a submission to the subreddit. + + :param title: The title of the submission. + :param selftext: The markdown formatted content for a ``text`` + submission. Use an empty string, ``''``, to make a title-only + submission. + :param url: The URL for a ``link`` submission. + :param flair_id: The flair template to select (default: None). + :param flair_text: If the template's ``flair_text_editable`` value is + True, this value will set a custom text (default: None). + :param resubmit: When False, an error will occur if the URL has already + been submitted (default: True). + :param send_replies: When True, messages will be sent to the submission + author when comments are made to the submission (default: True). + :returns: A :class:`~.Submission` object for the newly created + submission. + + Either ``selftext`` or ``url`` can be provided, but not both. + + For example to submit a URL to ``/r/reddit_api_test`` do: + + .. code:: python + + title = 'PRAW documentation' + url = 'https://praw.readthedocs.io' + reddit.subreddit('reddit_api_test').submit(title, url=url) + + """ + if (bool(selftext) or selftext == '') == bool(url): + raise TypeError('Either `selftext` or `url` must be provided.') + + data = {'sr': str(self), 'resubmit': bool(resubmit), + 'sendreplies': bool(send_replies), 'title': title} + for key, value in (('flair_id', flair_id), ('flair_text', flair_text)): + if value is not None: + data[key] = value + if selftext is not None: + data.update(kind='self', text=selftext) + else: + data.update(kind='link', url=url) + return self._reddit.post(API_PATH['submit'], data=data) + + def subscribe(self, other_subreddits=None): + """Subscribe to the subreddit. + + :param other_subreddits: When provided, also subscribe to the provided + list of subreddits. + + """ + data = {'action': 'sub', 'skip_inital_defaults': True, + 'sr_name': self._subreddit_list(self, other_subreddits)} + self._reddit.post(API_PATH['subscribe'], data=data) + + def traffic(self): + """Return a dictionary of the subreddit's traffic statistics. + + Raises ``prawcore.NotFound`` when the traffic stats aren't available to + the authenticated user, that is, they are not public and the + authenticated user is not a moderator of the subreddit. + + """ + return self._reddit.get(API_PATH['about_traffic'] + .format(subreddit=self)) + + def unsubscribe(self, other_subreddits=None): + """Unsubscribe from the subreddit. + + :param other_subreddits: When provided, also unsubscribe to the + provided list of subreddits. + + """ + data = {'action': 'unsub', + 'sr_name': self._subreddit_list(self, other_subreddits)} + self._reddit.post(API_PATH['subscribe'], data=data) + + +class SubredditFilters(object): + """Provide functions to interact with the special Subreddit's filters. + + Members of this class should be utilized via ``Subreddit.filters``. For + example to add a filter run: + + .. code:: python + + reddit.subreddit('all').filters.add('subreddit_name') + + """ + + def __init__(self, subreddit): + """Create a SubredditFilters instance. + + :param subreddit: The special subreddit whose filters to work with. + + As of this writing filters can only be used with the special subreddits + ``all`` and ``mod``. + + """ + self.subreddit = subreddit + + def __iter__(self): + """Iterate through the special subreddit's filters. + + This method should be invoked as: + + .. code:: python + + for subreddit in reddit.subreddit('NAME').filters: + ... + + """ + url = API_PATH['subreddit_filter_list'].format( + special=self.subreddit, user=self.subreddit._reddit.user.me()) + params = {'unique': self.subreddit._reddit._next_unique} + response_data = self.subreddit._reddit.get(url, params=params) + for subreddit in response_data.subreddits: + yield subreddit + + def add(self, subreddit): + """Add ``subreddit`` to the list of filtered subreddits. + + :param subreddit: The subreddit to add to the filter list. + + Items from subreddits added to the filtered list will no longer be + included when obtaining listings for ``/r/all``. + + Alternatively, you can filter a subreddit temporarily from a special + listing in a manner like so: + + .. code:: python + + reddit.subreddit('all-redditdev-learnpython') + + Raises ``prawcore.NotFound`` when calling on a non-special subreddit. + + """ + url = API_PATH['subreddit_filter'].format( + special=self.subreddit, user=self.subreddit._reddit.user.me(), + subreddit=subreddit) + self.subreddit._reddit.request( + 'PUT', url, data={'model': dumps({'name': subreddit})}) + + def remove(self, subreddit): + """Remove ``subreddit`` from the list of filtered subreddits. + + :param subreddit: The subreddit to remove from the filter list. + + Raises ``prawcore.NotFound`` when calling on a non-special subreddit. + + """ + url = API_PATH['subreddit_filter'].format( + special=self.subreddit, user=self.subreddit._reddit.user.me(), + subreddit=subreddit) + self.subreddit._reddit.request('DELETE', url, data={}) + + +class SubredditFlair(object): + """Provide a set of functions to interact with a Subreddit's flair.""" + + @property + def link_templates(self): + """Provide an instance of :class:`.SubredditLinkFlairTemplates`. + + Use this attribute for interacting with a subreddit's link flair + templates. For example to list all the link flair templates for a + subreddit which you have the ``flair`` moderator permission on try: + + .. code-block:: python + + for template in reddit.subreddit('NAME').flair.link_templates: + print(template) + + """ + if self._link_templates is None: + self._link_templates = SubredditLinkFlairTemplates(self.subreddit) + return self._link_templates + + @property + def templates(self): + """Provide an instance of :class:`.SubredditRedditorFlairTemplates`. + + Use this attribute for interacting with a subreddit's flair + templates. For example to list all the flair templates for a subreddit + which you have the ``flair`` moderator permission on try: + + .. code-block:: python + + for template in reddit.subreddit('NAME').flair.templates: + print(template) + + """ + if self._templates is None: + self._templates = SubredditRedditorFlairTemplates(self.subreddit) + return self._templates + + def __call__(self, redditor=None, **generator_kwargs): + """Return a generator for Redditors and their associated flair. + + :param redditor: When provided, yield at most a single + :class:`~.Redditor` instance (default: None). + + This method is intended to be used like: + + .. code-block:: python + + for flair in reddit.subreddit('NAME').flair(limit=None): + print(flair) + + """ + Subreddit._safely_add_arguments(generator_kwargs, 'params', + name=redditor) + generator_kwargs.setdefault('limit', None) + url = API_PATH['flairlist'].format(subreddit=self.subreddit) + return ListingGenerator(self.subreddit._reddit, url, + **generator_kwargs) + + def __init__(self, subreddit): + """Create a SubredditFlair instance. + + :param subreddit: The subreddit whose flair to work with. + + """ + self._link_templates = self._templates = None + self.subreddit = subreddit + + def configure(self, position='right', self_assign=False, + link_position='left', link_self_assign=False, + **settings): + """Update the subreddit's flair configuration. + + :param position: One of left, right, or False to disable (default: + right). + :param self_assign: (boolean) Permit self assignment of user flair + (default: False). + :param link_position: One of left, right, or False to disable + (default: left). + :param link_self_assign: (boolean) Permit self assignment + of link flair (default: False). + + Additional keyword arguments can be provided to handle new settings as + Reddit introduces them. + + """ + data = {'flair_enabled': bool(position), + 'flair_position': position or 'right', + 'flair_self_assign_enabled': self_assign, + 'link_flair_position': link_position or '', + 'link_flair_self_assign_enabled': link_self_assign} + data.update(settings) + url = API_PATH['flairconfig'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + def delete(self, redditor): + """Delete flair for a Redditor. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + + .. note:: To delete the flair of many Redditors at once, please see + :meth:`~praw.models.reddit.subreddit.SubredditFlair.update`. + + """ + url = API_PATH['deleteflair'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data={'name': str(redditor)}) + + def delete_all(self): + """Delete all Redditor flair in the Subreddit. + + :returns: List of dictionaries indicating the success or failure of + each delete. + + """ + return self.update(x['user'] for x in self()) + + def set(self, redditor=None, text='', css_class=''): + """Set flair for a Redditor. + + :param redditor: (Required) A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param text: The flair text to associate with the Redditor or + Submission (default: ''). + :param css_class: The css class to associate with the flair html + (default: ''). + + This method can only be used by an authenticated user who is a + moderator of the associated Subreddit. + + Example: + + .. code:: python + + reddit.subreddit('redditdev').flair.set('bboe', 'PRAW author') + + """ + data = {'css_class': css_class, 'name': str(redditor), 'text': text} + url = API_PATH['flair'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + def update(self, flair_list, text='', css_class=''): + """Set or clear the flair for many Redditors at once. + + :param flair_list: Each item in this list should be either: the name of + a Redditor, an instance of :class:`.Redditor`, or a dictionary + mapping keys ``user``, ``flair_text``, and ``flair_css_class`` to + their respective values. The ``user`` key should map to a Redditor, + as described above. When a dictionary isn't provided, or the + dictionary is missing one of ``flair_text``, or ``flair_css_class`` + attributes the default values will come from the the following + arguments. + + :param text: The flair text to use when not explicitly provided in + ``flair_list`` (default: ''). + :param css_class: The css class to use when not explicitly provided in + ``flair_list`` (default: ''). + :returns: List of dictionaries indicating the success or failure of + each update. + + For example to clear the flair text, and set the ``praw`` flair css + class on a few users try: + + .. code:: python + + subreddit.flair.update(['bboe', 'spez', 'spladug'], + css_class='praw') + + """ + lines = [] + for item in flair_list: + if isinstance(item, dict): + fmt_data = (str(item['user']), item.get('flair_text', text), + item.get('flair_css_class', css_class)) + else: + fmt_data = (str(item), text, css_class) + lines.append('"{}","{}","{}"'.format(*fmt_data)) + + response = [] + url = API_PATH['flaircsv'].format(subreddit=self.subreddit) + while len(lines): + data = {'flair_csv': '\n'.join(lines[:100])} + response.extend(self.subreddit._reddit.post(url, data=data)) + lines = lines[100:] + return response + + +class SubredditFlairTemplates(object): + """Provide functions to interact with a Subreddit's flair templates.""" + + @staticmethod + def flair_type(is_link): + """Return LINK_FLAIR or USER_FLAIR depending on ``is_link`` value.""" + return 'LINK_FLAIR' if is_link else 'USER_FLAIR' + + def __init__(self, subreddit): + """Create a SubredditFlairTemplate instance. + + :param subreddit: The subreddit whose flair templates to work with. + + .. note:: This class should not be initialized directly. Instead obtain + an instance via: + ``reddit.subreddit('subreddit_name').flair.templates`` or + ``reddit.subreddit('subreddit_name').flair.link_templates``. + + """ + self.subreddit = subreddit + + def _add(self, text, css_class='', text_editable=False, is_link=None): + url = API_PATH['flairtemplate'].format(subreddit=self.subreddit) + data = {'css_class': css_class, 'flair_type': self.flair_type(is_link), + 'text': text, 'text_editable': bool(text_editable)} + self.subreddit._reddit.post(url, data=data) + + def _clear(self, is_link=None): + url = API_PATH['flairtemplateclear'].format(subreddit=self.subreddit) + self.subreddit._reddit.post( + url, data={'flair_type': self.flair_type(is_link)}) + + def delete(self, template_id): + """Remove a flair template provided by ``template_id``. + + For example, to delete the first Redditor flair template listed, try: + + .. code-block:: python + + template_info = list(subreddit.flair.templates)[0] + subreddit.flair.templates.delete(template_info['flair_template_id]) + + """ + url = API_PATH['flairtemplatedelete'].format(subreddit=self.subreddit) + self.subreddit._reddit.post( + url, data={'flair_template_id': template_id}) + + def update(self, template_id, text, css_class='', text_editable=False): + """Update the flair templated provided by ``template_id``. + + :param template_id: The flair template to update. + :param text: The flair template's new text (required). + :param css_class: The flair template's new css_class (default: ''). + :param text_editable: (boolean) Indicate if the flair text can be + modified for each Redditor that sets it (default: False). + + For example to make a link flair template text_editable, try: + + .. code-block:: python + + template_info = list(subreddit.flair.templates)[0] + subreddit.flair.templates.update( + template_info['flair_template_id'], + text_editable=True) + + """ + url = API_PATH['flairtemplate'].format(subreddit=self.subreddit) + data = {'css_class': css_class, 'flair_template_id': template_id, + 'text': text, 'text_editable': bool(text_editable)} + self.subreddit._reddit.post(url, data=data) + + +class SubredditRedditorFlairTemplates(SubredditFlairTemplates): + """Provide functions to interact with Redditor flair templates.""" + + def __iter__(self): + """Iterate through the user flair templates. + + Example: + + .. code-block:: python + + for template in reddit.subreddit('NAME').flair.templates: + print(template) + + + """ + url = API_PATH['flairselector'].format(subreddit=self.subreddit) + data = {'unique': self.subreddit._reddit._next_unique} + for template in self.subreddit._reddit.post(url, data=data)['choices']: + yield template + + def add(self, text, css_class='', text_editable=False): + """Add a Redditor flair template to the associated subreddit. + + :param text: The flair template's text (required). + :param css_class: The flair template's css_class (default: ''). + :param text_editable: (boolean) Indicate if the flair text can be + modified for each Redditor that sets it (default: False). + + For example, to add an editable Redditor flair try: + + .. code-block:: python + + reddit.subreddit('NAME').flair.templates.add( + css_class='praw', text_editable=True) + + """ + self._add(text, css_class=css_class, text_editable=text_editable, + is_link=False) + + def clear(self): + """Remove all Redditor flair templates from the subreddit. + + For example: + + .. code-block:: python + + reddit.subreddit('NAME').flair.templates.clear() + + """ + self._clear(is_link=False) + + +class SubredditLinkFlairTemplates(SubredditFlairTemplates): + """Provide functions to interact with link flair templates.""" + + def __iter__(self): + """Iterate through the link flair templates. + + Example: + + .. code-block:: python + + for template in reddit.subreddit('NAME').flair.link_templates: + print(template) + + + """ + url = API_PATH['link_flair'].format(subreddit=self.subreddit) + for template in self.subreddit._reddit.get(url): + yield template + + def add(self, text, css_class='', text_editable=False): + """Add a link flair template to the associated subreddit. + + :param text: The flair template's text (required). + :param css_class: The flair template's css_class (default: ''). + :param text_editable: (boolean) Indicate if the flair text can be + modified for each Redditor that sets it (default: False). + + For example, to add an editable link flair try: + + .. code-block:: python + + reddit.subreddit('NAME').flair.link_templates.add( + css_class='praw', text_editable=True) + + """ + self._add(text, css_class=css_class, text_editable=text_editable, + is_link=True) + + def clear(self): + """Remove all link flair templates from the subreddit. + + For example: + + .. code-block:: python + + reddit.subreddit('NAME').flair.link_templates.clear() + + """ + self._clear(is_link=True) + + +class SubredditModeration(object): + """Provides a set of moderation functions to a Subreddit.""" + + @staticmethod + def _handle_only(only, generator_kwargs): + if only is not None: + if only == 'submissions': + only = 'links' + RedditBase._safely_add_arguments( + generator_kwargs, 'params', only=only) + + def __init__(self, subreddit): + """Create a SubredditModeration instance. + + :param subreddit: The subreddit to moderate. + + """ + self.subreddit = subreddit + + def accept_invite(self): + """Accept an invitation as a moderator of the community.""" + url = API_PATH['accept_mod_invite'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url) + + def edited(self, only=None, **generator_kwargs): + """Return a ListingGenerator for edited comments and submissions. + + :param only: If specified, one of ``'comments'``, or ``'submissions'`` + to yield only results of that type. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To print all items in the edited queue try: + + .. code:: python + + for item in reddit.subreddit('mod').mod.edited(limit=None): + print(item) + + """ + self._handle_only(only, generator_kwargs) + return ListingGenerator( + self.subreddit._reddit, API_PATH['about_edited'].format( + subreddit=self.subreddit), **generator_kwargs) + + def inbox(self, **generator_kwargs): + """Return a ListingGenerator for moderator messages. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + See ``unread`` for unread moderator messages. + + To print the last 5 moderator mail messages and their replies, try: + + .. code:: python + + for message in reddit.subreddit('mod').mod.inbox(limit=5): + print("From: {}, Body: {}".format(message.author, message.body)) + for reply in message.replies: + print("From: {}, Body: {}".format(reply.author, reply.body)) + + """ + return ListingGenerator( + self.subreddit._reddit, API_PATH['moderator_messages'].format( + subreddit=self.subreddit), **generator_kwargs) + + def log(self, action=None, mod=None, **generator_kwargs): + """Return a ListingGenerator for moderator log entries. + + :param action: If given, only return log entries for the specified + action. + :param mod: If given, only return log entries for actions made by the + passed in Redditor. + + To print the moderator and subreddit of the last 5 modlog entries try: + + .. code:: python + + for log in reddit.subreddit('mod').mod.log(limit=5): + print("Mod: {}, Subreddit: {}".format(log.mod, log.subreddit)) + + """ + params = {'mod': str(mod) if mod else mod, 'type': action} + Subreddit._safely_add_arguments(generator_kwargs, 'params', + **params) + return ListingGenerator( + self.subreddit._reddit, API_PATH['about_log'].format( + subreddit=self.subreddit), **generator_kwargs) + + def modqueue(self, only=None, **generator_kwargs): + """Return a ListingGenerator for comments/submissions in the modqueue. + + :param only: If specified, one of ``'comments'``, or ``'submissions'`` + to yield only results of that type. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To print all modqueue items try: + + .. code:: python + + for item in reddit.subreddit('mod').mod.modqueue(limit=None): + print(item) + + """ + self._handle_only(only, generator_kwargs) + return ListingGenerator( + self.subreddit._reddit, API_PATH['about_modqueue'].format( + subreddit=self.subreddit), **generator_kwargs) + + def reports(self, only=None, **generator_kwargs): + """Return a ListingGenerator for reported comments and submissions. + + :param only: If specified, one of ``'comments'``, or ``'submissions'`` + to yield only results of that type. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To print the user and mod report reasons in the report queue try: + + .. code:: python + + for item in reddit.subreddit('mod').mod.reports(): + print("User Reports: {}".format(report.user_reports)) + print("Mod Reports: {}".format(report.mod_reports)) + + """ + self._handle_only(only, generator_kwargs) + return ListingGenerator( + self.subreddit._reddit, API_PATH['about_reports'].format( + subreddit=self.subreddit), **generator_kwargs) + + def settings(self): + """Return a dictionary of the subreddit's current settings.""" + url = API_PATH['subreddit_settings'].format(subreddit=self.subreddit) + return self.subreddit._reddit.get(url)['data'] + + def spam(self, only=None, **generator_kwargs): + """Return a ListingGenerator for spam comments and submissions. + + :param only: If specified, one of ``'comments'``, or ``'submissions'`` + to yield only results of that type. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To print the items in the spam queue try: + + .. code:: python + + for item in reddit.subreddit('mod').mod.spam(): + print(item) + + """ + self._handle_only(only, generator_kwargs) + return ListingGenerator( + self.subreddit._reddit, API_PATH['about_spam'].format( + subreddit=self.subreddit), **generator_kwargs) + + def unmoderated(self, **generator_kwargs): + """Return a ListingGenerator for unmoderated submissions. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To print the items in the unmoderated queue try: + + .. code:: python + + for item in reddit.subreddit('mod').mod.unmoderated(): + print(item) + + """ + return ListingGenerator( + self.subreddit._reddit, API_PATH['about_unmoderated'].format( + subreddit=self.subreddit), **generator_kwargs) + + def unread(self, **generator_kwargs): + """Return a ListingGenerator for unread moderator messages. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + See ``inbox`` for all messages. + + To print the mail in the unread modmail queue try: + + .. code:: python + + for message in reddit.subreddit('mod').mod.unread(): + print("From: {}, To: {}".format(message.author, message.dest)) + + """ + return ListingGenerator( + self.subreddit._reddit, API_PATH['moderator_unread'].format( + subreddit=self.subreddit), **generator_kwargs) + + def update(self, **settings): + """Update the subreddit's settings. + + :param allow_images: Allow users to upload images using the native + image hosting. Only applies to link-only subreddits. + :param allow_top: Allow the subreddit to appear on ``/r/all`` as well + as the default and trending lists. + :param collapse_deleted_comments: Collapse deleted and removed comments + on comments pages by default. + :param comment_score_hide_mins: The number of minutes to hide comment + scores. + :param description: Shown in the sidebar of your subreddit. + :param domain: Domain name with a cname that points to + {subreddit}.reddit.com. + :param exclude_banned_modqueue: Exclude posts by site-wide banned users + from modqueue/unmoderated. + :param header_hover_text: The text seen when hovering over the snoo. + :param hide_ads: Don't show ads within this subreddit. Only applies to + gold-user only subreddits. + :param key_color: A 6-digit rgb hex color (e.g. ``'#AABBCC'``), used as + a thematic color for your subreddit on mobile. + :param lang: A valid IETF language tag (underscore separated). + :param link_type: The types of submissions users can make. + One of ``any``, ``link``, ``self``. + :param over_18: Viewers must be over 18 years old (i.e. NSFW). + :param public_description: Public description blurb. Appears in search + results and on the landing page for private subreddits. + :param public_traffic: Make the traffic stats page public. + :param show_media: Show thumbnails on submissions. + :param show_media_preview: Expand media previews on comments pages. + :param spam_comments: Spam filter strength for comments. + One of ``all``, ``low``, ``high``. + :param spam_links: Spam filter strength for links. + One of ``all``, ``low``, ``high``. + :param spam_selfposts: Spam filter strength for selfposts. + One of ``all``, ``low``, ``high``. + :param spoilers_enabled: Enable marking posts as containing spoilers. + :param sr: The fullname of the subreddit whose settings will be + updated. + :param submit_link_label: Custom label for submit link button + (None for default). + :param submit_text: Text to show on submission page. + :param submit_text_label: Custom label for submit text post button + (None for default). + :param subreddit_type: One of ``archived``, ``employees_only``, + ``gold_only``, ``gold_restricted``, ``private``, ``public``, + ``restricted``. + :param suggested_comment_sort: All comment threads will use this + sorting method by default. Leave None, or choose one of + ``confidence``, ``controversial``, ``new``, ``old``, ``qa``, + ``random``, ``top``. + :param title: The title of the subreddit. + :param wiki_edit_age: Account age, in days, required to edit and create + wiki pages. + :param wiki_edit_karma: Subreddit karma required to edit and create + wiki pages. + :param wikimode: One of ``anyone``, ``disabled``, ``modonly``. + + Additional keyword arguments can be provided to handle new settings as + Reddit introduces them. + + Settings that are documented here and aren't explicitly set by you in a + call to :meth:`.SubredditModeration.update` should retain their current + value. If they do not please file a bug. + + .. warning:: Undocumented settings, or settings that were very recently + documented, may not retain their current value when + updating. This often occurs when Reddit adds a new setting + but forgets to add that setting to the API endpoint that + is used to fetch the current settings. + + """ + current_settings = self.settings() + fullname = current_settings.pop('subreddit_id') + + # These attributes come out using different names than they go in. + remap = {'allow_top': 'default_set', + 'lang': 'language', + 'link_type': 'content_options'} + for (new, old) in remap.items(): + current_settings[new] = current_settings.pop(old) + + current_settings.update(settings) + return Subreddit._create_or_update(_reddit=self.subreddit._reddit, + sr=fullname, **current_settings) + + +class SubredditQuarantine(object): + """Provides subreddit quarantine related methods.""" + + def __init__(self, subreddit): + """Create a SubredditQuarantine instance. + + :param subreddit: The subreddit associated with the quarantine. + + """ + self.subreddit = subreddit + + def opt_in(self): + """Permit your user access to the quarantined subreddit. + + Usage: + + .. code:: python + + subreddit = reddit.subreddit('QUESTIONABLE') + next(subreddit.hot()) # Raises prawcore.Forbidden + + subreddit.quaran.opt_in() + next(subreddit.hot()) # Returns Submission + + """ + data = {'sr_name': self.subreddit} + try: + self.subreddit._reddit.post(API_PATH['quarantine_opt_in'], + data=data) + except Redirect: + pass + + def opt_out(self): + """Remove access to the quarantined subreddit. + + Usage: + + .. code:: python + + subreddit = reddit.subreddit('QUESTIONABLE') + next(subreddit.hot()) # Returns Submission + + subreddit.quaran.opt_out() + next(subreddit.hot()) # Raises prawcore.Forbidden + + """ + data = {'sr_name': self.subreddit} + try: + self.subreddit._reddit.post(API_PATH['quarantine_opt_out'], + data=data) + except Redirect: + pass + + +class SubredditRelationship(object): + """Represents a relationship between a redditor and subreddit. + + Instances of this class can be iterated through in order to discover the + Redditors that make up the relationship. + + For example, banned users of a subreddit can be iterated through like so: + + .. code-block:: python + + for ban in reddit.subreddit('redditdev').banned(): + print('{}: {}'.format(ban, ban.note)) + + """ + + def __call__(self, redditor=None, **generator_kwargs): + """Return a generator for Redditors belonging to this relationship. + + :param redditor: When provided, yield at most a single + :class:`~.Redditor` instance. This is useful to confirm if a + relationship exists, or to fetch the metadata associated with a + particular relationship (default: None). + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + """ + Subreddit._safely_add_arguments(generator_kwargs, 'params', + user=redditor) + url = API_PATH['list_{}'.format(self.relationship)].format( + subreddit=self.subreddit) + return ListingGenerator(self.subreddit._reddit, url, + **generator_kwargs) + + def __init__(self, subreddit, relationship): + """Create a SubredditRelationship instance. + + :param subreddit: The subreddit for the relationship. + :param relationship: The name of the relationship. + + """ + self.relationship = relationship + self.subreddit = subreddit + + def add(self, redditor, **other_settings): + """Add ``redditor`` to this relationship. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + + """ + data = {'name': str(redditor), 'type': self.relationship} + data.update(other_settings) + url = API_PATH['friend'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + def remove(self, redditor): + """Remove ``redditor`` from this relationship. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + + """ + data = {'name': str(redditor), 'type': self.relationship} + url = API_PATH['unfriend'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + +class ContributorRelationship(SubredditRelationship): + """Provides methods to interact with a Subreddit's contributors. + + Contributors of a subreddit can be iterated through like so: + + .. code-block:: python + + for contributor in reddit.subreddit('redditdev').contributor(): + print(contributor) + + """ + + def leave(self): + """Abdicate the contributor position.""" + self.subreddit._reddit.post(API_PATH['leavecontributor'], + data={'id': self.subreddit.fullname}) + + +class ModeratorRelationship(SubredditRelationship): + """Provides methods to interact with a Subreddit's moderators. + + Moderators of a subreddit can be iterated through like so: + + .. code-block:: python + + for moderator in reddit.subreddit('redditdev').moderator(): + print(moderator) + + """ + + PERMISSIONS = {'access', 'config', 'flair', 'mail', 'posts', 'wiki'} + + @staticmethod + def _handle_permissions(permissions, other_settings): + other_settings = deepcopy(other_settings) if other_settings else {} + other_settings['permissions'] = permissions_string( + permissions, ModeratorRelationship.PERMISSIONS) + return other_settings + + def __call__(self, redditor=None): + """Return a list of Redditors who are moderators. + + :param redditor: When provided, return a list containing at most one + :class:`~.Redditor` instance. This is useful to confirm if a + relationship exists, or to fetch the metadata associated with a + particular relationship (default: None). + + .. note:: Unlike other relationship callables, this relationship is not + paginated. Thus it simply returns the full list, rather than + an iterator for the results. + + To be used like: + + .. code:: python + + moderators = reddit.subreddit('nameofsub').moderator() + + For example, to list the moderators along with their permissions try: + + .. code:: python + + for moderator in reddit.subreddit('SUBREDDIT').moderator(): + print('{}: {}'.format(moderator, moderator.mod_permissions)) + + + """ + params = {} if redditor is None else {'user': redditor} + url = API_PATH['list_{}'.format(self.relationship)].format( + subreddit=self.subreddit) + return self.subreddit._reddit.get(url, params=params) + + def add(self, redditor, permissions=None, **other_settings): + """Add or invite ``redditor`` to be a moderator of the subreddit. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should be + a list of strings specifying which subset of permissions to + grant. An empty list ``[]`` indicates no permissions, and when not + provided ``None``, indicates full permissions. + + An invite will be sent unless the user making this call is an admin + user. + + For example, to invite ``'spez'`` with ``'posts'`` and ``'mail'`` + permissions to ``'/r/test/``, try: + + .. code:: python + + reddit.subreddit('test').moderator.add('spez', ['posts', 'mail']) + + """ + other_settings = self._handle_permissions(permissions, other_settings) + super(ModeratorRelationship, self).add(redditor, **other_settings) + + def invite(self, redditor, permissions=None, **other_settings): + """Invite ``redditor`` to be a moderator of the subreddit. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should be + a list of strings specifying which subset of permissions to + grant. An empty list ``[]`` indicates no permissions, and when not + provided ``None``, indicates full permissions. + + For example, to invite ``'spez'`` with ``'posts'`` and ``'mail'`` + permissions to ``'/r/test/``, try: + + .. code:: python + + reddit.subreddit('test').moderator.invite('spez', ['posts', 'mail']) + + """ + data = self._handle_permissions(permissions, other_settings) + data.update({'name': str(redditor), 'type': 'moderator_invite'}) + url = API_PATH['friend'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + def leave(self): + """Abdicate the moderator position (use with care). + + Example: + + .. code:: python + + reddit.subreddit('subredditname').moderator.leave() + + """ + self.subreddit._reddit.post(API_PATH['leavemoderator'], + data={'id': self.subreddit.fullname}) + + def remove_invite(self, redditor): + """Remove the moderator invite for ``redditor``. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + + Example: + + .. code:: python + + reddit.subreddit('subredditname').moderator.remove_invite('spez') + + """ + data = {'name': str(redditor), 'type': 'moderator_invite'} + url = API_PATH['unfriend'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + def update(self, redditor, permissions=None): + """Update the moderator permissions for ``redditor``. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should be + a list of strings specifying which subset of permissions to + grant. An empty list ``[]`` indicates no permissions, and when not + provided, ``None``, indicates full permissions. + + For example, to add all permissions to the moderator, try: + + .. code:: python + + subreddit.moderator.update('spez') + + To remove all permissions from the moderator, try: + + .. code:: python + + subreddit.moderator.update('spez', []) + + """ + url = API_PATH['setpermissions'].format(subreddit=self.subreddit) + data = self._handle_permissions( + permissions, {'name': str(redditor), 'type': 'moderator'}) + self.subreddit._reddit.post(url, data=data) + + def update_invite(self, redditor, permissions=None): + """Update the moderator invite permissions for ``redditor``. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + :param permissions: When provided (not ``None``), permissions should be + a list of strings specifying which subset of permissions to + grant. An empty list ``[]`` indicates no permissions, and when not + provided, ``None``, indicates full permissions. + + For example, to grant the flair and mail permissions to the moderator + invite, try: + + .. code:: python + + subreddit.moderator.update_invite('spez', ['flair', 'mail']) + + """ + url = API_PATH['setpermissions'].format(subreddit=self.subreddit) + data = self._handle_permissions( + permissions, {'name': str(redditor), 'type': 'moderator_invite'}) + self.subreddit._reddit.post(url, data=data) + + +class Modmail(object): + """Provides modmail functions for a subreddit.""" + + def __call__(self, id=None, mark_read=False): + """Return an individual conversation. + + :param id: A reddit base36 conversation ID, e.g., ``2gmz``. + :param mark_read: If True, conversation is marked as read + (default: False). + + Example: + + .. code:: python + + reddit.subreddit('redditdev').modmail('2gmz', mark_read=True) + + To print all messages from a conversation as Markdown source: + + .. code:: python + + conversation = reddit.subreddit('redditdev').modmail('2gmz', + mark_read=True) + for message in conversation.messages: + print(message.body_markdown) + + ``ModmailConversation.user`` is a special instance of + :class:`.Redditor` with extra attributes describing the non-moderator + user's recent posts, comments, and modmail messages within the + subreddit, as well as information on active bans and mutes. This + attribute does not exist on internal moderator discussions. + + For example, to print the user's ban status: + + .. code:: python + + conversation = reddit.subreddit('redditdev').modmail('2gmz', + mark_read=True) + print(conversation.user.ban_status) + + To print a list of recent submissions by the user: + + .. code:: python + + conversation = reddit.subreddit('redditdev').modmail('2gmz', + mark_read=True) + print(conversation.user.recent_posts) + + """ + # pylint: disable=invalid-name,redefined-builtin + return ModmailConversation(self.subreddit._reddit, id=id, + mark_read=mark_read) + + def __init__(self, subreddit): + """Construct an instance of the Modmail object.""" + self.subreddit = subreddit + + def _build_subreddit_list(self, other_subreddits): + """Return a comma-separated list of subreddit display names.""" + subreddits = [self.subreddit] + (other_subreddits or []) + return ','.join(str(subreddit) for subreddit in subreddits) + + def bulk_read(self, other_subreddits=None, state=None): + """Mark conversations for subreddit(s) as read. + + Due to server-side restrictions, 'all' is not a valid subreddit for + this method. Instead, use :meth:`~.Modmail.subreddits` to get a list of + subreddits using the new modmail. + + :param other_subreddits: A list of :class:`.Subreddit` instances for + which to mark conversations (default: None). + :param state: Can be one of: all, archived, highlighted, inprogress, + mod, new, notifications, (default: all). "all" does not include + internal or archived conversations. + :returns: A list of :class:`.ModmailConversation` instances that were + marked read. + + For example, to mark all notifications for a subreddit as read: + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + subreddit.modmail.bulk_read(state='notifications') + + """ + params = {'entity': self._build_subreddit_list(other_subreddits)} + if state: + params['state'] = state + response = self.subreddit._reddit.post( + API_PATH['modmail_bulk_read'], params=params) + return [self(conversation_id) + for conversation_id in response['conversation_ids']] + + def conversations(self, after=None, limit=None, other_subreddits=None, + sort=None, state=None): + """Generate :class:`.ModmailConversation` objects for subreddit(s). + + :param after: A base36 modmail conversation id. When provided, the + listing begins after this conversation (default: None). + :param limit: The maximum number of conversations to fetch. If None, + the server-side default is 25 at the time of writing + (default: None). + :param other_subreddits: A list of :class:`.Subreddit` instances for + which to fetch conversations (default: None). + :param sort: Can be one of: mod, recent, unread, user + (default: recent). + :param state: Can be one of: all, archived, highlighted, inprogress, + mod, new, notifications, (default: all). "all" does not include + internal or archived conversations. + + + Example: + + .. code:: python + + conversations = reddit.subreddit('all').conversations(state='mod') + + """ + params = {} + if self.subreddit != 'all': + params['entity'] = self._build_subreddit_list(other_subreddits) + + for name, value in {'after': after, 'limit': limit, 'sort': sort, + 'state': state}.items(): + if value: + params[name] = value + + response = self.subreddit._reddit.get( + API_PATH['modmail_conversations'], params=params) + for conversation_id in response['conversationIds']: + data = {'conversation': response['conversations'][conversation_id], + 'messages': response['messages']} + yield ModmailConversation.parse(data, self.subreddit._reddit, + convert_objects=False) + + def create(self, subject, body, recipient, author_hidden=False): + """Create a new modmail conversation. + + :param subject: The message subject. Cannot be empty. + :param body: The message body. Cannot be empty. + :param recipient: The recipient; a username or an instance of + :class:`.Redditor`. + :param author_hidden: When True, author is hidden from non-moderators + (default: False). + :returns: A :class:`.ModmailConversation` object for the newly created + conversation. + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + redditor = reddit.redditor('bboe') + subreddit.modmail.create('Subject', 'Body', redditor) + + """ + data = { + 'body': body, + 'isAuthorHidden': author_hidden, + 'srName': self.subreddit, + 'subject': subject, + 'to': recipient, + } + return self.subreddit._reddit.post(API_PATH['modmail_conversations'], + data=data) + + def subreddits(self): + """Yield subreddits using the new modmail that the user moderates. + + Example: + + .. code:: python + + subreddits = reddit.subreddit('all').modmail.subreddits() + + """ + response = self.subreddit._reddit.get(API_PATH['modmail_subreddits']) + for value in response['subreddits'].values(): + subreddit = self.subreddit._reddit.subreddit(value['display_name']) + subreddit.last_updated = value['lastUpdated'] + yield subreddit + + def unread_count(self): + """Return unread conversation count by conversation state. + + At time of writing, possible states are: archived, highlighted, + inprogress, mod, new, notifications. + + :returns: A dict mapping conversation states to unread counts. + + For example, to print the count of unread moderator discussions: + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + unread_counts = subreddit.modmail.unread_count() + print(unread_counts['mod']) + + """ + return self.subreddit._reddit.get(API_PATH['modmail_unread_count']) + + +class SubredditStream(object): + """Provides submission and comment streams.""" + + def __init__(self, subreddit): + """Create a SubredditStream instance. + + :param subreddit: The subreddit associated with the streams. + + """ + self.subreddit = subreddit + + def comments(self, **stream_options): + """Yield new comments as they become available. + + Comments are yielded oldest first. Up to 100 historical comments will + initially be returned. + + Keyword arguments are passed to :meth:`.stream_generator`. + + For example, to retrieve all new comments made to the ``iama`` + subreddit, try: + + .. code:: python + + for comment in reddit.subreddit('iama').stream.comments(): + print(comment) + + """ + return stream_generator(self.subreddit.comments, **stream_options) + + def submissions(self, **stream_options): + """Yield new submissions as they become available. + + Submissions are yielded oldest first. Up to 100 historical submissions + will initially be returned. + + Keyword arguments are passed to :meth:`.stream_generator`. + + For example to retrieve all new submissions made to all of Reddit, try: + + .. code:: python + + for submission in reddit.subreddit('all').stream.submissions(): + print(submission) + + """ + return stream_generator(self.subreddit.new, **stream_options) + + +class SubredditStylesheet(object): + """Provides a set of stylesheet functions to a Subreddit.""" + + JPEG_HEADER = b'\xff\xd8\xff' + + def __call__(self): + """Return the subreddit's stylesheet. + + To be used as: + + .. code:: python + + stylesheet = reddit.subreddit('SUBREDDIT').stylesheet() + + """ + url = API_PATH['about_stylesheet'].format(subreddit=self.subreddit) + return self.subreddit._reddit.get(url) + + def __init__(self, subreddit): + """Create a SubredditStylesheet instance. + + :param subreddit: The subreddit associated with the stylesheet. + + An instance of this class is provided as: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet + + """ + self.subreddit = subreddit + + def _upload_image(self, image_path, data): + with open(image_path, 'rb') as image: + header = image.read(len(self.JPEG_HEADER)) + image.seek(0) + data['img_type'] = 'jpg' if header == self.JPEG_HEADER else 'png' + url = API_PATH['upload_image'].format(subreddit=self.subreddit) + response = self.subreddit._reddit.post(url, data=data, + files={'file': image}) + if response['errors']: + assert response['errors'] == ['IMAGE_ERROR'], \ + 'Please file a bug with PRAW' + raise APIException(response['errors'][0], '', None) + return response + + def delete_header(self): + """Remove the current subreddit header image. + + Succeeds even if there is no header image. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.delete_header() + + """ + url = API_PATH['delete_sr_header'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url) + + def delete_image(self, name): + """Remove the named image from the subreddit. + + Succeeds even if the named image does not exist. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.delete_image('smile') + + """ + url = API_PATH['delete_sr_image'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data={'img_name': name}) + + def delete_mobile_header(self): + """Remove the current subreddit mobile header. + + Succeeds even if there is no mobile header. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.delete_mobile_header() + + """ + url = API_PATH['delete_sr_header'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url) + + def delete_mobile_icon(self): + """Remove the current subreddit mobile icon. + + Succeeds even if there is no mobile icon. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.delete_mobile_icon() + + """ + url = API_PATH['delete_sr_icon'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url) + + def update(self, stylesheet, reason=None): + """Update the subreddit's stylesheet. + + :param stylesheet: The CSS for the new stylesheet. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.update( + 'p { color: green; }', 'color text green') + + """ + data = {'op': 'save', 'reason': reason, + 'stylesheet_contents': stylesheet} + url = API_PATH['subreddit_stylesheet'].format(subreddit=self.subreddit) + self.subreddit._reddit.post(url, data=data) + + def upload(self, name, image_path): + """Upload an image to the Subreddit. + + :param name: The name to use for the image. If an image already exists + with the same name, it will be replaced. + :param image_path: A path to a jpeg or png image. + :returns: A dictionary containing a link to the uploaded image under + the key ``img_src``. + + Raises ``prawcore.TooLarge`` if the overall request body is too large. + + Raises :class:`.APIException` if there are other issues with the + uploaded image. Unfortunately the exception info might not be very + specific, so try through the website with the same image to see what + the problem actually might be. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.upload('smile', 'img.png') + + """ + return self._upload_image(image_path, + {'name': name, 'upload_type': 'img'}) + + def upload_header(self, image_path): + """Upload an image to be used as the Subreddit's header image. + + :param image_path: A path to a jpeg or png image. + :returns: A dictionary containing a link to the uploaded image under + the key ``img_src``. + + Raises ``prawcore.TooLarge`` if the overall request body is too large. + + Raises :class:`.APIException` if there are other issues with the + uploaded image. Unfortunately the exception info might not be very + specific, so try through the website with the same image to see what + the problem actually might be. + + Example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.upload_header('header.png') + + """ + return self._upload_image(image_path, {'upload_type': 'header'}) + + def upload_mobile_header(self, image_path): + """Upload an image to be used as the Subreddit's mobile header. + + :param image_path: A path to a jpeg or png image. + :returns: A dictionary containing a link to the uploaded image under + the key ``img_src``. + + Raises ``prawcore.TooLarge`` if the overall request body is too large. + + Raises :class:`.APIException` if there are other issues with the + uploaded image. Unfortunately the exception info might not be very + specific, so try through the website with the same image to see what + the problem actually might be. + + For example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.upload_mobile_header( + 'header.png') + + """ + return self._upload_image(image_path, {'upload_type': 'banner'}) + + def upload_mobile_icon(self, image_path): + """Upload an image to be used as the Subreddit's mobile icon. + + :param image_path: A path to a jpeg or png image. + :returns: A dictionary containing a link to the uploaded image under + the key ``img_src``. + + Raises ``prawcore.TooLarge`` if the overall request body is too large. + + Raises :class:`.APIException` if there are other issues with the + uploaded image. Unfortunately the exception info might not be very + specific, so try through the website with the same image to see what + the problem actually might be. + + For example: + + .. code:: python + + reddit.subreddit('SUBREDDIT').stylesheet.upload_mobile_icon( + 'icon.png') + + """ + return self._upload_image(image_path, {'upload_type': 'icon'}) + + +class SubredditWiki(object): + """Provides a set of moderation functions to a Subreddit.""" + + def __getitem__(self, page_name): + """Lazily return the WikiPage for the subreddit named ``page_name``. + + This method is to be used to fetch a specific wikipage, like so: + + .. code:: python + + wikipage = reddit.subreddit('iama').wiki['proof'] + print(wikipage.content_md) + + """ + return WikiPage(self.subreddit._reddit, self.subreddit, + page_name.lower()) + + def __init__(self, subreddit): + """Create a SubredditModeration instance. + + :param subreddit: The subreddit to moderate. + + """ + self.banned = SubredditRelationship(subreddit, 'wikibanned') + self.contributor = SubredditRelationship(subreddit, 'wikicontributor') + self.subreddit = subreddit + + def __iter__(self): + """Iterate through the pages of the wiki. + + This method is to be used to discover all wikipages for a subreddit: + + .. code:: python + + for wikipage in reddit.subreddit('iama').wiki: + print(wikipage) + + """ + response = self.subreddit._reddit.get( + API_PATH['wiki_pages'].format(subreddit=self.subreddit), + params={'unique': self.subreddit._reddit._next_unique}) + for page_name in response['data']: + yield WikiPage(self.subreddit._reddit, self.subreddit, page_name) + + def create(self, name, content, reason=None, **other_settings): + """Create a new wiki page. + + :param name: The name of the new WikiPage. This name will be + normalized. + :param content: The content of the new WikiPage. + :param reason: (Optional) The reason for the creation. + :param other_settings: Additional keyword arguments to pass. + + To create the wiki page ``'praw_test'`` in ``'/r/test'`` try: + + .. code:: python + + reddit.subreddit('test').wiki.create( + 'praw_test', 'wiki body text', reason='PRAW Test Creation') + + """ + name = name.replace(' ', '_').lower() + new = WikiPage(self.subreddit._reddit, self.subreddit, name) + new.edit(content=content, reason=reason, **other_settings) + return new + + def revisions(self, **generator_kwargs): + """Return a generator for recent wiki revisions. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To view the wiki revisions for ``'praw_test'`` in ``'/r/test'`` try: + + .. code:: python + + for item in reddit.subreddit('test').wiki['praw_test'].revisions(): + print(item) + + """ + url = API_PATH['wiki_revisions'].format(subreddit=self.subreddit) + return WikiPage._revision_generator( + self.subreddit, url, generator_kwargs) diff --git a/env/lib/python3.4/site-packages/praw/models/reddit/wikipage.py b/env/lib/python3.4/site-packages/praw/models/reddit/wikipage.py new file mode 100644 index 0000000..11bceb4 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/reddit/wikipage.py @@ -0,0 +1,181 @@ +"""Provide the WikiPage class.""" +from ...const import API_PATH +from ..listing.generator import ListingGenerator +from .base import RedditBase +from .redditor import Redditor + + +class WikiPage(RedditBase): + """An individual WikiPage object.""" + + @staticmethod + def _revision_generator(subreddit, url, generator_kwargs): + for revision in ListingGenerator(subreddit._reddit, url, + **generator_kwargs): + if revision['author'] is not None: + revision['author'] = Redditor(subreddit._reddit, + _data=revision['author']['data']) + revision['page'] = WikiPage(subreddit._reddit, subreddit, + revision['page'], revision['id']) + yield revision + + @property + def mod(self): + """Provide an instance of :class:`.WikiPageModeration`.""" + if self._mod is None: + self._mod = WikiPageModeration(self) + return self._mod + + def __eq__(self, other): + """Return whether the other instance equals the current.""" + return isinstance(other, self.__class__) and \ + str(self).lower() == str(other).lower() + + def __hash__(self): + """Return the hash of the current instance.""" + return super(WikiPage, self).__hash__() + + def __init__(self, reddit, subreddit, name, revision=None, _data=None): + """Construct an instance of the WikiPage object. + + :param revision: A specific revision ID to fetch. By default, fetches + the most recent revision. + + """ + self.name = name + self._revision = revision + self.subreddit = subreddit + super(WikiPage, self).__init__(reddit, _data) + self._mod = None + + def __repr__(self): + """Return an object initialization representation of the instance.""" + return '{}(subreddit={!r}, name={!r})'.format( + self.__class__.__name__, self.subreddit, self.name) + + def __str__(self): + """Return a string representation of the instance.""" + return '{}/{}'.format(self.subreddit, self.name) + + def _fetch(self): + params = {'v': self._revision} if self._revision else None + data = self._reddit.get(self._info_path(), params=params)['data'] + if data['revision_by'] is not None: + data['revision_by'] = Redditor(self._reddit, + _data=data['revision_by']['data']) + self.__dict__.update(data) + self._fetched = True + + def _info_path(self): + return API_PATH['wiki_page'].format(subreddit=self.subreddit, + page=self.name) + + def edit(self, content, reason=None, **other_settings): + """Edit this WikiPage's contents. + + :param content: The updated markdown content of the page. + :param reason: (Optional) The reason for the revision. + :param other_settings: Additional keyword arguments to pass. + + """ + other_settings.update({'content': content, 'page': self.name, + 'reason': reason}) + self._reddit.post(API_PATH['wiki_edit'].format( + subreddit=self.subreddit), data=other_settings) + + def revisions(self, **generator_kwargs): + """Return a generator for page revisions. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + To view the wiki revisions for ``'praw_test'`` in ``'/r/test'`` try: + + .. code:: python + + for item in reddit.subreddit('test').wiki['praw_test'].revisions(): + print(item) + + """ + url = API_PATH['wiki_page_revisions'].format(subreddit=self.subreddit, + page=self.name) + return self._revision_generator(self.subreddit, url, generator_kwargs) + + +class WikiPageModeration(object): + """Provides a set of moderation functions for a WikiPage.""" + + def __init__(self, wikipage): + """Create a WikiPageModeration instance. + + :param wikipage: The wikipage to moderate. + + """ + self.wikipage = wikipage + + def add(self, redditor): + """Add an editor to this WikiPage. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + + To add ``'spez'`` as an editor on the wikipage ``'praw_test'`` try: + + .. code:: python + + reddit.subreddit('test').wiki['praw_test'].mod.add('spez') + + """ + data = {'page': self.wikipage.name, 'username': str(redditor)} + url = API_PATH['wiki_page_editor'].format( + subreddit=self.wikipage.subreddit, method='add') + self.wikipage._reddit.post(url, data=data) + + def remove(self, redditor): + """Remove an editor from this WikiPage. + + :param redditor: A redditor name (e.g., ``'spez'``) or + :class:`~.Redditor` instance. + + To remove ``'spez'`` as an editor on the wikipage ``'praw_test'`` try: + + .. code:: python + + reddit.subreddit('test').wiki['praw_test'].mod.remove('spez') + + """ + data = {'page': self.wikipage.name, 'username': str(redditor)} + url = API_PATH['wiki_page_editor'].format( + subreddit=self.wikipage.subreddit, method='del') + self.wikipage._reddit.post(url, data=data) + + def settings(self): + """Return the settings for this WikiPage.""" + url = API_PATH['wiki_page_settings'].format( + subreddit=self.wikipage.subreddit, page=self.wikipage.name) + return self.wikipage._reddit.get(url)['data'] + + def update(self, listed, permlevel, **other_settings): + """Update the settings for this WikiPage. + + :param listed: (boolean) Show this page on page list. + :param permlevel: (int) Who can edit this page? (0) use subreddit wiki + permissions, (1) only approved wiki contributors for this page may + edit (see :meth:`.WikiPageModeration.add`), (2) only mods may edit + and view + :param other_settings: Additional keyword arguments to pass. + :returns: The updated WikiPage settings. + + To set the wikipage ``'praw_test'`` in ``'/r/test'`` to mod only and + disable it from showing in the page list, try: + + .. code:: python + + reddit.subreddit('test').wiki['praw_test'].mod.update(listed=False, + permlevel=2) + + """ + other_settings.update({'listed': listed, 'permlevel': permlevel}) + url = API_PATH['wiki_page_settings'].format( + subreddit=self.wikipage.subreddit, page=self.wikipage.name) + return self.wikipage._reddit.post(url, data=other_settings)['data'] diff --git a/env/lib/python3.4/site-packages/praw/models/stylesheet.py b/env/lib/python3.4/site-packages/praw/models/stylesheet.py new file mode 100644 index 0000000..8a66a72 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/stylesheet.py @@ -0,0 +1,7 @@ +"""Provide the Stylesheet class.""" + +from .base import PRAWBase + + +class Stylesheet(PRAWBase): + """Represent a stylesheet.""" diff --git a/env/lib/python3.4/site-packages/praw/models/subreddits.py b/env/lib/python3.4/site-packages/praw/models/subreddits.py new file mode 100644 index 0000000..729376e --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/subreddits.py @@ -0,0 +1,103 @@ +"""Provide the Subreddits class.""" +from . import Subreddit +from .base import PRAWBase +from .listing.generator import ListingGenerator +from .util import stream_generator +from ..const import API_PATH + + +class Subreddits(PRAWBase): + """Subreddits is a Listing class that provides various subreddit lists.""" + + def default(self, **generator_kwargs): + """Return a :class:`.ListingGenerator` for default subreddits.""" + return ListingGenerator(self._reddit, API_PATH['subreddits_default'], + **generator_kwargs) + + def gold(self, **generator_kwargs): + """Return a :class:`.ListingGenerator` for gold subreddits.""" + return ListingGenerator(self._reddit, API_PATH['subreddits_gold'], + **generator_kwargs) + + def new(self, **generator_kwargs): + """Return a :class:`.ListingGenerator` for new subreddits.""" + return ListingGenerator(self._reddit, API_PATH['subreddits_new'], + **generator_kwargs) + + def popular(self, **generator_kwargs): + """Return a :class:`.ListingGenerator` for popular subreddits.""" + return ListingGenerator(self._reddit, API_PATH['subreddits_popular'], + **generator_kwargs) + + def recommended(self, subreddits, omit_subreddits=None): + """Return subreddits recommended for the given list of subreddits. + + :param subreddits: A list of Subreddit instances and/or subreddit + names. + :param omit_subreddits: A list of Subreddit instances and/or subreddit + names to exclude from the results (Reddit's end may not work as + expected). + + """ + def _to_list(subreddit_list): + return ','.join([str(x) for x in subreddit_list]) + + if not isinstance(subreddits, list): + raise TypeError('subreddits must be a list') + if omit_subreddits is not None and \ + not isinstance(omit_subreddits, list): + raise TypeError('omit_subreddits must be a list or None') + + params = {'omit': _to_list(omit_subreddits or [])} + url = API_PATH['sub_recommended'].format( + subreddits=_to_list(subreddits)) + return [Subreddit(self._reddit, sub['sr_name']) for sub in + self._reddit.get(url, params=params)] + + def search(self, query, **generator_kwargs): + """Return a :class:`.ListingGenerator` of subreddits matching ``query``. + + Subreddits are searched by both their title and description. To search + names only see ``search_by_name``. + + :param query: The query string to filter subreddits by. + + """ + self._safely_add_arguments(generator_kwargs, 'params', q=query) + return ListingGenerator(self._reddit, API_PATH['subreddits_search'], + **generator_kwargs) + + def search_by_name(self, query, include_nsfw=True, exact=False): + """Return list of Subreddits whose names begin with ``query``. + + :param query: Search for subreddits beginning with this string. + :param include_nsfw: Include subreddits labeled NSFW (default: True). + :param exact: Return only exact matches to ``query`` (default: False). + + """ + result = self._reddit.post(API_PATH['subreddits_name_search'], + data={'include_over_18': include_nsfw, + 'exact': exact, 'query': query}) + return [self._reddit.subreddit(x) for x in result['names']] + + def search_by_topic(self, query): + """Return list of Subreddits whose topics match ``query``. + + :param query: Search for subreddits relevant to the search topic. + + """ + result = self._reddit.get(API_PATH['subreddits_by_topic'], + params={'query': query}) + return [self._reddit.subreddit(x['name']) for x in result + if x.get('name')] + + def stream(self, **stream_options): + """Yield new subreddits as they are created. + + Subreddits are yielded oldest first. Up to 100 historical subreddits + will initially be returned. + + Keyword arguments are passed to :meth:`.stream_generator`. + + """ + return stream_generator(self.new, **stream_options) diff --git a/env/lib/python3.4/site-packages/praw/models/user.py b/env/lib/python3.4/site-packages/praw/models/user.py new file mode 100644 index 0000000..84d7fad --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/user.py @@ -0,0 +1,86 @@ +"""Provides the User class.""" +from ..const import API_PATH +from .base import PRAWBase +from .listing.generator import ListingGenerator +from .reddit.redditor import Redditor +from .reddit.subreddit import Subreddit + + +class User(PRAWBase): + """The user class provides methods for the currently authenticated user.""" + + def __init__(self, reddit): + """Initialize a User instance. + + This class is intended to be interfaced with through ``reddit.user``. + + """ + super(User, self).__init__(reddit, None) + self._me = None + + def blocked(self): + """Return a RedditorList of blocked Redditors.""" + return self._reddit.get(API_PATH['blocked']) + + def contributor_subreddits(self, **generator_kwargs): + """Return a ListingGenerator of subreddits user is a contributor of. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + """ + return ListingGenerator(self._reddit, API_PATH['my_contributor'], + **generator_kwargs) + + def friends(self): + """Return a RedditorList of friends.""" + return self._reddit.get(API_PATH['friends']) + + def karma(self): + """Return a dictionary mapping subreddits to their karma.""" + karma_map = {} + for row in self._reddit.get(API_PATH['karma'])['data']: + subreddit = Subreddit(self._reddit, row['sr']) + del row['sr'] + karma_map[subreddit] = row + return karma_map + + def me(self, use_cache=True): # pylint: disable=invalid-name + """Return a :class:`.Redditor` instance for the authenticated user. + + :param use_cache: When true, and if this function has been previously + called, returned the cached version (default: True). + + .. note:: If you change the Reddit instance's authorization, you might + want to refresh the cached value. Prefer using separate Reddit + instances, however, for distinct authorizations. + + """ + if self._me is None or not use_cache: + user_data = self._reddit.get(API_PATH['me']) + self._me = Redditor(self._reddit, _data=user_data) + return self._me + + def moderator_subreddits(self, **generator_kwargs): + """Return a ListingGenerator of subreddits the user is a moderator of. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + """ + return ListingGenerator(self._reddit, API_PATH['my_moderator'], + **generator_kwargs) + + def multireddits(self): + """Return a list of multireddits belonging to the user.""" + return self._reddit.get(API_PATH['my_multireddits']) + + def subreddits(self, **generator_kwargs): + """Return a ListingGenerator of subreddits the user is subscribed to. + + Additional keyword arguments are passed in the initialization of + :class:`.ListingGenerator`. + + """ + return ListingGenerator(self._reddit, API_PATH['my_subreddits'], + **generator_kwargs) diff --git a/env/lib/python3.4/site-packages/praw/models/util.py b/env/lib/python3.4/site-packages/praw/models/util.py new file mode 100644 index 0000000..ec87f7d --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/models/util.py @@ -0,0 +1,175 @@ +"""Provide helper classes used by other models.""" +import random +import time + + +class BoundedSet(object): + """A set with a maximum size that evicts the oldest items when necessary. + + This class does not implement the complete set interface. + """ + + def __init__(self, max_items): + """Construct an instance of the BoundedSet.""" + self.max_items = max_items + self._fifo = [] + self._set = set() + + def __contains__(self, item): + """Test if the BoundedSet contains item.""" + return item in self._set + + def add(self, item): + """Add an item to the set discarding the oldest item if necessary.""" + if len(self._set) == self.max_items: + self._set.remove(self._fifo.pop(0)) + self._fifo.append(item) + self._set.add(item) + + +class ExponentialCounter(object): + """A class to provide an exponential counter with jitter.""" + + def __init__(self, max_counter): + """Initialize an instance of ExponentialCounter. + + :param max_counter: The maximum base value. Note that the computed + value may be 3.125% higher due to jitter. + """ + self._base = 1 + self._max = max_counter + + def counter(self): + """Increment the counter and return the current value with jitter.""" + max_jitter = self._base / 16. + value = self._base + random.random() * max_jitter - max_jitter / 2 + self._base = min(self._base * 2, self._max) + return value + + def reset(self): + """Reset the counter to 1.""" + self._base = 1 + + +def permissions_string(permissions, known_permissions): + """Return a comma separated string of permission changes. + + :param permissions: A list of strings, or ``None``. These strings can + exclusively contain ``+`` or ``-`` prefixes, or contain no prefixes at + all. When prefixed, the resulting string will simply be the joining of + these inputs. When not prefixed, all permissions are considered to be + additions, and all permissions in the ``known_permissions`` set that + aren't provided are considered to be removals. When None, the result is + ``+all``. + :param known_permissions: A set of strings representing the available + permissions. + + """ + to_set = [] + if permissions is None: + to_set = ['+all'] + else: + to_set = ['-all'] + omitted = sorted(known_permissions - set(permissions)) + to_set.extend('-{}'.format(x) for x in omitted) + to_set.extend('+{}'.format(x) for x in permissions) + return ','.join(to_set) + + +def stream_generator(function, pause_after=None): + """Yield new items from ListingGenerators and ``None`` when paused. + + :param function: A callable that returns a ListingGenerator, e.g. + ``subreddit.comments`` or ``subreddit.new``. + + :param pause_after: An integer representing the number of requests that + result in no new items before this function yields ``None``, + effectively introducing a pause into the stream. A negative value + yields ``None`` after items from a single response have been yielded, + regardless of number of new items obtained in that response. A value of + ``0`` yields ``None`` after every response resulting in no new items, + and a value of ``None`` never introduces a pause (default: None). + + .. note:: This function internally uses an exponential delay with jitter + between subsequent responses that contain no new results, up to a + maximum delay of just over a 16 seconds. In practice that means that the + time before pause for ``pause_after=N+1`` is approximately twice the + time before pause for ``pause_after=N``. + + For example to pause a comment stream after six responses with no new + comments, try: + + .. code:: python + + subreddit = reddit.subreddit('redditdev') + for comment in subreddit.stream.comments(pause_after=6): + if comment is None: + break + print(comment) + + To resume fetching comments after a pause, try: + + .. code:: python + + subreddit = reddit.subreddit('help') + comment_stream = subreddit.stream.comments(pause_after=5) + + for comment in comment_stream: + if comment is None: + break + print(comment) + # Do any other processing, then try to fetch more data + for comment in comment_stream: + if comment is None: + break + print(comment) + + To bypass the internal exponential backoff, try the following. This + approach is useful if you are monitoring an subreddit with infrequent + activity, and you want the to consistently learn about new items from the + stream as soon as possible, rather than up to a delay of just over sixteen + seconds. + + .. code:: python + + subreddit = reddit.subreddit('help') + for comment in subreddit.stream.comments(pause_after=0): + if comment is None: + continue + print(comment) + + """ + before_fullname = None + exponential_counter = ExponentialCounter(max_counter=16) + seen_fullnames = BoundedSet(301) + without_before_counter = 0 + responses_without_new = 0 + valid_pause_after = pause_after is not None + while True: + found = False + newest_fullname = None + limit = 100 + if before_fullname is None: + limit -= without_before_counter + without_before_counter = (without_before_counter + 1) % 30 + for item in reversed(list(function( + limit=limit, params={'before': before_fullname}))): + if item.fullname in seen_fullnames: + continue + found = True + seen_fullnames.add(item.fullname) + newest_fullname = item.fullname + yield item + before_fullname = newest_fullname + if valid_pause_after and pause_after < 0: + yield None + elif found: + exponential_counter.reset() + responses_without_new = 0 + else: + responses_without_new += 1 + if valid_pause_after and responses_without_new > pause_after: + responses_without_new = 0 + yield None + else: + time.sleep(exponential_counter.counter()) diff --git a/env/lib/python3.4/site-packages/praw/objector.py b/env/lib/python3.4/site-packages/praw/objector.py new file mode 100644 index 0000000..b03f025 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/objector.py @@ -0,0 +1,137 @@ +"""Provides the Objector class.""" +import re + +from .exceptions import APIException + + +class Objector(object): + """The objector builds :class:`.RedditBase` objects.""" + + @staticmethod + def _camel_to_snake(name): + """Return `name` converted from camelCase to snake_case. + + Code from http://stackoverflow.com/a/1176023/. + + """ + first_break_replaced = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) + return re.sub( + '([a-z0-9])([A-Z])', r'\1_\2', first_break_replaced).lower() + + @classmethod + def _snake_case_keys(cls, dictionary): + """Return a copy of dictionary with keys converted to snake_case. + + :param dictionary: The dict to be corrected. + + """ + return {cls._camel_to_snake(k): v for k, v in dictionary.items()} + + def __init__(self, reddit): + """Initialize an Objector instance. + + :param reddit: An instance of :class:`~.Reddit`. + + """ + self.parsers = {} + self._reddit = reddit + + def kind(self, instance): + """Return the kind from the instance class. + + :param instance: An instance of a subclass of RedditBase. + + """ + for key in self.parsers: + if isinstance(instance, self.parsers[key]): + return key + + def _objectify_dict(self, data): + """Create RedditBase objects from dicts. + + :param data: The structured data, assumed to be a dict. + :returns: An instance of :class:`~.RedditBase`. + + """ + if ({'conversation', 'messages', 'modActions'}.issubset(data)): + parser = self.parsers['ModmailConversation'] + elif {'actionTypeId', 'author', 'date'}.issubset(data): + # Modmail mod action + data = self._snake_case_keys(data) + parser = self.parsers['ModmailAction'] + elif {'bodyMarkdown', 'isInternal'}.issubset(data): + # Modmail message + data = self._snake_case_keys(data) + parser = self.parsers['ModmailMessage'] + elif {'isAdmin', 'isDeleted'}.issubset(data): + # Modmail author + data = self._snake_case_keys(data) + # Prevent clobbering base-36 id + del data['id'] + data['is_subreddit_mod'] = data.pop('is_mod') + parser = self.parsers[self._reddit.config.kinds['redditor']] + elif {'banStatus', 'muteStatus', 'recentComments'}.issubset(data): + # Modmail user + data = self._snake_case_keys(data) + data['created_string'] = data.pop('created') + parser = self.parsers[self._reddit.config.kinds['redditor']] + elif {'displayName', 'id', 'type'}.issubset(data): + # Modmail subreddit + data = self._snake_case_keys(data) + parser = self.parsers[self._reddit.config.kinds[data['type']]] + elif ({'date', 'id', 'name'}.issubset(data) + or {'id', 'name', 'permissions'}.issubset(data)): + parser = self.parsers[self._reddit.config.kinds['redditor']] + else: + if 'user' in data: + parser = self.parsers[self._reddit.config.kinds['redditor']] + data['user'] = parser.parse({'name': data['user']}, + self._reddit) + return data + return parser.parse(data, self._reddit) + + def objectify(self, data): + """Create RedditBase objects from data. + + :param data: The structured data. + :returns: An instance of :class:`~.RedditBase`, or ``None`` if + given ``data`` is ``None``. + + """ + # pylint: disable=too-many-return-statements + if data is None: # 204 no content + return + if isinstance(data, list): + return [self.objectify(item) for item in data] + if 'kind' in data and data['kind'] in self.parsers: + parser = self.parsers[data['kind']] + return parser.parse(data['data'], self._reddit) + elif 'json' in data and 'data' in data['json']: + if 'things' in data['json']['data']: # Submission.reply + return self.objectify(data['json']['data']['things']) + if 'url' in data['json']['data']: # Subreddit.submit + # The URL is the URL to the submission, so it's removed. + del data['json']['data']['url'] + parser = self.parsers[self._reddit.config.kinds['submission']] + else: + parser = self.parsers['LiveUpdateEvent'] + return parser.parse(data['json']['data'], self._reddit) + elif 'json' in data and 'errors' in data['json']: + errors = data['json']['errors'] + if len(errors) == 1: + raise APIException(*errors[0]) + assert len(errors) == 0 + + elif isinstance(data, dict): + return self._objectify_dict(data) + + return data + + def register(self, kind, cls): + """Register a class for a given kind. + + :param kind: The kind in the parsed data to map to ``cls``. + :param cls: A RedditBase class. + + """ + self.parsers[kind] = cls diff --git a/env/lib/python3.4/site-packages/praw/praw.ini b/env/lib/python3.4/site-packages/praw/praw.ini new file mode 100644 index 0000000..d1f2653 --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/praw.ini @@ -0,0 +1,19 @@ +[DEFAULT] +# A boolean to indicate whether or not to check for package updates. +check_for_updates=True + +# Object to kind mappings +comment_kind=t1 +message_kind=t4 +redditor_kind=t2 +submission_kind=t3 +subreddit_kind=t5 + +# The URL prefix for OAuth-related requests. +oauth_url=https://oauth.reddit.com + +# The URL prefix for regular requests. +reddit_url=https://www.reddit.com + +# The URL prefix for short URLs. +short_url=https://redd.it diff --git a/env/lib/python3.4/site-packages/praw/reddit.py b/env/lib/python3.4/site-packages/praw/reddit.py new file mode 100644 index 0000000..140219e --- /dev/null +++ b/env/lib/python3.4/site-packages/praw/reddit.py @@ -0,0 +1,484 @@ +"""Provide the Reddit class.""" +import os + +try: + from update_checker import update_check + UPDATE_CHECKER_MISSING = False +except ImportError: # pragma: no cover + UPDATE_CHECKER_MISSING = True + + +from prawcore import (Authorizer, DeviceIDAuthorizer, ReadOnlyAuthorizer, + Redirect, Requestor, ScriptAuthorizer, + TrustedAuthenticator, UntrustedAuthenticator, session) + +from .exceptions import ClientException +from .config import Config +from .const import __version__, API_PATH, USER_AGENT_FORMAT, configparser +from .objector import Objector +from . import models + + +class Reddit(object): + """The Reddit class provides convenient access to reddit's API. + + Instances of this class are the gateway to interacting with Reddit's API + through PRAW. The canonical way to obtain an instance of this class is via: + + + .. code-block:: python + + import praw + reddit = praw.Reddit(client_id='CLIENT_ID', + client_secret="CLIENT_SECRET", password='PASSWORD', + user_agent='USERAGENT', username='USERNAME') + + """ + + update_checked = False + + @property + def _next_unique(self): + value = self._unique_counter + self._unique_counter += 1 + return value + + @property + def read_only(self): + """Return True when using the ReadOnlyAuthorizer.""" + return self._core == self._read_only_core + + @read_only.setter + def read_only(self, value): + """Set or unset the use of the ReadOnlyAuthorizer. + + Raise :class:`ClientException` when attempting to unset ``read_only`` + and only the ReadOnlyAuthorizer is available. + + """ + if value: + self._core = self._read_only_core + elif self._authorized_core is None: + raise ClientException('read_only cannot be unset as only the ' + 'ReadOnlyAuthorizer is available.') + else: + self._core = self._authorized_core + + def __enter__(self): + """Handle the context manager open.""" + return self + + def __exit__(self, *_args): + """Handle the context manager close.""" + pass + + def __init__(self, site_name=None, requestor_class=None, + requestor_kwargs=None, **config_settings): + """Initialize a Reddit instance. + + :param site_name: The name of a section in your ``praw.ini`` file from + which to load settings from. This parameter, in tandem with an + appropriately configured ``praw.ini``, file is useful if you wish + to easily save credentials for different applications, or + communicate with other servers running reddit. If ``site_name`` is + ``None``, then the site name will be looked for in the environment + variable praw_site. If it is not found there, the DEFAULT site will + be used. + :param requestor_class: A class that will be used to create a + requestor. If not set, use ``prawcore.Requestor`` (default: None). + :param requestor_kwargs: Dictionary with additional keyword arguments + used to initialize the requestor (default: None). + + Additional keyword arguments will be used to initialize the + :class`.Config` object. This can be used to specify configuration + settings during instantiation of the :class:`.Reddit` instance. For + more details please see :ref:`configuration`. + + Required settings are: + + * client_id + * client_secret (for installed applications set this value to ``None``) + * user_agent + + The ``requestor_class`` and ``requestor_kwargs`` allow for + customization of the requestor :class`.Reddit` will use. This allows, + e.g., easily adding behavior to the requestor or wrapping its + :class`Session` in a caching layer. Example usage: + + .. code-block:: python + + import json, betamax, requests + + class JSONDebugRequestor(Requestor): + def request(self, *args, **kwargs): + response = super().request(*args, **kwargs) + print(json.dumps(response.json(), indent=4)) + return response + + my_session = betamax.Betamax(requests.Session()) + reddit = Reddit(..., requestor_class=JSONDebugRequestor, + requestor_kwargs={'session': my_session}) + + """ + self._core = self._authorized_core = self._read_only_core = None + self._objector = None + self._unique_counter = 0 + + try: + config_section = site_name or os.getenv('praw_site') or 'DEFAULT' + self.config = Config(config_section, **config_settings) + except configparser.NoSectionError as exc: + help_message = ('You provided the name of a praw.ini ' + 'configuration which does not exist.\n\nFor help ' + 'with creating a Reddit instance, visit\n' + 'https://praw.readthedocs.io/en/latest/code_overvi' + 'ew/reddit_instance.html\n\n' + 'For help on configuring PRAW, visit\n' + 'https://praw.readthedocs.io/en/latest/getting_sta' + 'rted/configuration.html') + if site_name is not None: + exc.message += '\n' + help_message + raise + + required_message = ('Required configuration setting {!r} missing. \n' + 'This setting can be provided in a praw.ini file, ' + 'as a keyword argument to the `Reddit` class ' + 'constructor, or as an environment variable.') + for attribute in ('client_id', 'user_agent'): + if getattr(self.config, attribute) in (self.config.CONFIG_NOT_SET, + None): + raise ClientException(required_message.format(attribute)) + if self.config.client_secret is self.config.CONFIG_NOT_SET: + raise ClientException(required_message.format('client_secret') + + '\nFor installed applications this value ' + 'must be set to None via a keyword argument ' + 'to the `Reddit` class constructor.') + + self._check_for_update() + self._prepare_objector() + self._prepare_prawcore(requestor_class, requestor_kwargs) + + self.auth = models.Auth(self, None) + """An instance of :class:`.Auth`. + + Provides the interface for interacting with installed and web + applications. See :ref:`auth_url` + + """ + + self.front = models.Front(self) + """An instance of :class:`.Front`. + + Provides the interface for interacting with front page listings. For + example: + + .. code-block:: python + + for submission in reddit.front.hot(): + print(submission) + + """ + + self.inbox = models.Inbox(self, None) + """An instance of :class:`.Inbox`. + + Provides the interface to a user's inbox which produces + :class:`.Message`, :class:`.Comment`, and :class:`.Submission` + instances. For example to iterate through comments which mention the + authorized user run: + + .. code-block:: python + + for comment in reddit.inbox.mentions(): + print(comment) + + """ + + self.live = models.LiveHelper(self, None) + """An instance of :class:`.LiveHelper`. + + Provides the interface for working with :class:`.LiveThread` + instances. At present only new LiveThreads can be created. + + .. code-block:: python + + reddit.live.create('title', 'description') + + """ + + self.multireddit = models.MultiredditHelper(self, None) + """An instance of :class:`.MultiredditHelper`. + + Provides the interface to working with :class:`.Multireddit` + instances. For example you can obtain a :class:`.Multireddit` instance + via: + + .. code-block:: python + + reddit.multireddit('samuraisam', 'programming') + + """ + + self.subreddit = models.SubredditHelper(self, None) + """An instance of :class:`.SubredditHelper`. + + Provides the interface to working with :class:`.Subreddit` + instances. For example to create a Subreddit run: + + .. code-block:: python + + reddit.subreddit.create('coolnewsubname') + + To obtain a lazy a :class:`.Subreddit` instance run: + + .. code-block:: python + + reddit.subreddit('redditdev') + + Note that multiple subreddits can be combined and filtered views of + /r/all can also be used just like a subreddit: + + .. code-block:: python + + reddit.subreddit('redditdev+learnpython+botwatch') + reddit.subreddit('all-redditdev-learnpython') + + """ + + self.subreddits = models.Subreddits(self, None) + """An instance of :class:`.Subreddits`. + + Provides the interface for :class:`.Subreddit` discovery. For example + to iterate over the set of default subreddits run: + + .. code-block:: python + + for subreddit in reddit.subreddits.default(limit=None): + print(subreddit) + + """ + + self.user = models.User(self) + """An instance of :class:`.User`. + + Provides the interface to the currently authorized + :class:`.Redditor`. For example to get the name of the current user + run: + + .. code-block:: python + + print(reddit.user.me()) + + """ + + def _check_for_update(self): + if UPDATE_CHECKER_MISSING: + return + if not Reddit.update_checked and self.config.check_for_updates: + update_check(__package__, __version__) + Reddit.update_checked = True + + def _prepare_objector(self): + self._objector = Objector(self) + mappings = {self.config.kinds['comment']: models.Comment, + self.config.kinds['message']: models.Message, + self.config.kinds['redditor']: models.Redditor, + self.config.kinds['submission']: models.Submission, + self.config.kinds['subreddit']: models.Subreddit, + 'LabeledMulti': models.Multireddit, + 'Listing': models.Listing, + 'LiveUpdate': models.LiveUpdate, + 'LiveUpdateEvent': models.LiveThread, + 'ModmailAction': models.ModmailAction, + 'ModmailConversation': models.ModmailConversation, + 'ModmailMessage': models.ModmailMessage, + 'UserList': models.RedditorList, + 'modaction': models.ModAction, + 'more': models.MoreComments, + 'stylesheet': models.Stylesheet} + for kind, klass in mappings.items(): + self._objector.register(kind, klass) + + def _prepare_prawcore(self, requestor_class=None, requestor_kwargs=None): + requestor_class = requestor_class or Requestor + requestor_kwargs = requestor_kwargs or {} + + requestor = requestor_class( + USER_AGENT_FORMAT.format(self.config.user_agent), + self.config.oauth_url, self.config.reddit_url, + **requestor_kwargs) + + if self.config.client_secret: + self._prepare_trusted_prawcore(requestor) + else: + self._prepare_untrusted_prawcore(requestor) + + def _prepare_trusted_prawcore(self, requestor): + authenticator = TrustedAuthenticator(requestor, self.config.client_id, + self.config.client_secret, + self.config.redirect_uri) + read_only_authorizer = ReadOnlyAuthorizer(authenticator) + self._read_only_core = session(read_only_authorizer) + + if self.config.username and self.config.password: + script_authorizer = ScriptAuthorizer( + authenticator, self.config.username, self.config.password) + self._core = self._authorized_core = session(script_authorizer) + elif self.config.refresh_token: + authorizer = Authorizer(authenticator, self.config.refresh_token) + self._core = self._authorized_core = session(authorizer) + else: + self._core = self._read_only_core + + def _prepare_untrusted_prawcore(self, requestor): + authenticator = UntrustedAuthenticator(requestor, + self.config.client_id, + self.config.redirect_uri) + read_only_authorizer = DeviceIDAuthorizer(authenticator) + self._core = self._read_only_core = session(read_only_authorizer) + + def comment(self, id): # pylint: disable=invalid-name,redefined-builtin + """Return a lazy instance of :class:`~.Comment` for ``id``. + + :param id: The ID of the comment. + + .. note:: If you want to obtain the comment's replies, you will need to + call :meth:`.refresh` on the returned :class:`.Comment`. + + """ + return models.Comment(self, id=id) + + def domain(self, domain): + """Return an instance of :class:`.DomainListing`. + + :param domain: The domain to obtain submission listings for. + + """ + return models.DomainListing(self, domain) + + def get(self, path, params=None): + """Return parsed objects returned from a GET request to ``path``. + + :param path: The path to fetch. + :param params: The query parameters to add to the request (default: + None). + + """ + data = self.request('GET', path, params=params) + return self._objector.objectify(data) + + def info(self, fullnames=None, url=None): + """Fetch information about each item in ``fullnames`` or from ``url``. + + :param param_list: A list of paramaters, either fullnames for a + comment/submission/subreddit or a url for a list of link + submissions. + :param url: A url (as a string) to retrieve lists of link submissions + from. + :returns: A generator that yields found items in their relative order. + + Items that cannot be matched will not be generated. Requests will be + issued in batches for each 100 fullnames. + + .. note:: For comments that are retrieved via this method, if you want + to obtain its replies, you will need to call :meth:`.refresh` + on the yielded :class:`.Comment`. + + .. note:: When using the URL option, it is important to be aware that + URLs are treated literally by Reddit's API. As such, the URLs + "youtube.com" and "https://www.youtube.com" will provide a + different set of submissions. + + """ + if bool(fullnames) == bool(url): + raise TypeError('Either `fullnames` or `url` must be provided.') + + elif fullnames: + if not isinstance(fullnames, list): + raise TypeError('fullnames must be a list') + + def generator(): + for position in range(0, len(fullnames), 100): + fullname_chunk = fullnames[position:position + 100] + params = {'id': ','.join(fullname_chunk)} + for result in self.get(API_PATH['info'], params=params): + yield result + + return generator() + + else: + try: + params = {'url': url} + url_list = [result for result in + self.get(API_PATH['info'], params=params)] + return url_list + except: + raise TypeError('Invalid URL or no posts exist') + + def post(self, path, data=None, files=None, params=None): + """Return parsed objects returned from a POST request to ``path``. + + :param path: The path to fetch. + :param data: Dictionary, bytes, or file-like object to send in the body + of the request (default: None). + :param files: Dictionary, filename to file (like) object mapping + (default: None). + :param params: The query parameters to add to the request (default: + None). + + """ + data = self.request('POST', path, data=data or {}, files=files, + params=params) + return self._objector.objectify(data) + + def random_subreddit(self, nsfw=False): + """Return a random lazy instance of :class:`~.Subreddit`. + + :param nsfw: Return a random NSFW (not safe for work) subreddit + (default: False). + + """ + url = API_PATH['subreddit'].format(subreddit='randnsfw' if nsfw + else 'random') + path = None + try: + self.get(url, params={'unique': self._next_unique}) + except Redirect as redirect: + path = redirect.path + return models.Subreddit(self, path.split('/')[2]) + + def redditor(self, name): + """Return a lazy instance of :class:`~.Redditor` for ``name``. + + :param name: The name of the redditor. + + """ + return models.Redditor(self, name) + + def request(self, method, path, params=None, data=None, files=None): + """Return the parsed JSON data returned from a request to URL. + + :param method: The HTTP method (e.g., GET, POST, PUT, DELETE). + :param path: The path to fetch. + :param params: The query parameters to add to the request (default: + None). + :param data: Dictionary, bytes, or file-like object to send in the body + of the request (default: None). + :param files: Dictionary, filename to file (like) object mapping + (default: None). + + """ + return self._core.request(method, path, data=data, files=files, + params=params) + + def submission( # pylint: disable=invalid-name,redefined-builtin + self, id=None, url=None): + """Return a lazy instance of :class:`~.Submission`. + + :param id: A reddit base36 submission ID, e.g., ``2gmzqe``. + :param url: A URL supported by :meth:`.id_from_url`. + + Either ``id`` or ``url`` can be provided, but not both. + + """ + return models.Submission(self, id=id, url=url) diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..e9662a1 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,94 @@ +.. _main_page: + +prawcore +======== + +.. image:: https://img.shields.io/pypi/v/prawcore.svg + :alt: Latest prawcore Version + :target: https://pypi.python.org/pypi/prawcore +.. image:: https://travis-ci.org/praw-dev/prawcore.svg?branch=master + :target: https://travis-ci.org/praw-dev/prawcore +.. image:: https://coveralls.io/repos/github/praw-dev/prawcore/badge.svg?branch=master + :target: https://coveralls.io/github/praw-dev/prawcore?branch=master +.. image:: https://badges.gitter.im/praw-dev/praw.svg + :alt: Join the chat at https://gitter.im/praw-dev/praw + :target: https://gitter.im/praw-dev/praw + + +prawcore is a low-level communication layer for PRAW 4+. + + +Installation +------------ + +Install prawcore using ``pip`` via: + +.. code-block:: console + + pip install prawcore + + +Execution Example +----------------- + +The following example demonstrates how to use prawcore to obtain the list of +trophies for a given user using the script-app type. This example assumes you +have the environment variables ``PRAWCORE_CLIENT_ID`` and +``PRAWCORE_CLIENT_SECRET`` set to the appropriate values for your application. + +.. code-block:: python + + #!/usr/bin/env python + import os + import pprint + import prawcore + + authenticator = prawcore.TrustedAuthenticator( + prawcore.Requestor('YOUR_VALID_USER_AGENT'), + os.environ['PRAWCORE_CLIENT_ID'], + os.environ['PRAWCORE_CLIENT_SECRET']) + authorizer = prawcore.ReadOnlyAuthorizer(authenticator) + authorizer.refresh() + + with prawcore.session(authorizer) as session: + pprint.pprint(session.request('GET', '/api/v1/user/bboe/trophies')) + +Save the above as ``trophies.py`` and then execute via: + +.. code-block:: console + + python trophies.py + +Additional examples can be found at: +https://github.com/praw-dev/prawcore/tree/master/examples + + +Depending on prawcore +--------------------- + +prawcore follows `semantic versioning `_ with the exception +that deprecations will not be preceded by a minor release. In essense, expect +only major versions to introduce breaking changes to prawcore's public +interface. As a result, if you depend on prawcore then it is a good idea to +specify not only the minimum version of prawcore your package requires, but to +also limit the major version. + +Below are two examples of how you may want to specify your prawcore dependency: + +setup.py +~~~~~~~~ + +.. code-block:: python + + setup(..., + install_requires=['prawcore >=0.1, <1'], + ...) + +requirements.txt +~~~~~~~~~~~~~~~~ + +.. code-block:: text + + prawcore >=1.5.1, <2 + + diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/INSTALLER b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/METADATA b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/METADATA new file mode 100644 index 0000000..009fd67 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/METADATA @@ -0,0 +1,119 @@ +Metadata-Version: 2.0 +Name: prawcore +Version: 0.11.0 +Summary: Low-level communication layer for PRAW 4+. +Home-page: https://github.com/praw-dev/prawcore +Author: Bryce Boe +Author-email: bbzbryce@gmail.com +License: Simplified BSD License +Keywords: praw reddit api +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Requires-Dist: requests (>=2.6.0,<3.0) + +.. _main_page: + +prawcore +======== + +.. image:: https://img.shields.io/pypi/v/prawcore.svg + :alt: Latest prawcore Version + :target: https://pypi.python.org/pypi/prawcore +.. image:: https://travis-ci.org/praw-dev/prawcore.svg?branch=master + :target: https://travis-ci.org/praw-dev/prawcore +.. image:: https://coveralls.io/repos/github/praw-dev/prawcore/badge.svg?branch=master + :target: https://coveralls.io/github/praw-dev/prawcore?branch=master +.. image:: https://badges.gitter.im/praw-dev/praw.svg + :alt: Join the chat at https://gitter.im/praw-dev/praw + :target: https://gitter.im/praw-dev/praw + + +prawcore is a low-level communication layer for PRAW 4+. + + +Installation +------------ + +Install prawcore using ``pip`` via: + +.. code-block:: console + + pip install prawcore + + +Execution Example +----------------- + +The following example demonstrates how to use prawcore to obtain the list of +trophies for a given user using the script-app type. This example assumes you +have the environment variables ``PRAWCORE_CLIENT_ID`` and +``PRAWCORE_CLIENT_SECRET`` set to the appropriate values for your application. + +.. code-block:: python + + #!/usr/bin/env python + import os + import pprint + import prawcore + + authenticator = prawcore.TrustedAuthenticator( + prawcore.Requestor('YOUR_VALID_USER_AGENT'), + os.environ['PRAWCORE_CLIENT_ID'], + os.environ['PRAWCORE_CLIENT_SECRET']) + authorizer = prawcore.ReadOnlyAuthorizer(authenticator) + authorizer.refresh() + + with prawcore.session(authorizer) as session: + pprint.pprint(session.request('GET', '/api/v1/user/bboe/trophies')) + +Save the above as ``trophies.py`` and then execute via: + +.. code-block:: console + + python trophies.py + +Additional examples can be found at: +https://github.com/praw-dev/prawcore/tree/master/examples + + +Depending on prawcore +--------------------- + +prawcore follows `semantic versioning `_ with the exception +that deprecations will not be preceded by a minor release. In essense, expect +only major versions to introduce breaking changes to prawcore's public +interface. As a result, if you depend on prawcore then it is a good idea to +specify not only the minimum version of prawcore your package requires, but to +also limit the major version. + +Below are two examples of how you may want to specify your prawcore dependency: + +setup.py +~~~~~~~~ + +.. code-block:: python + + setup(..., + install_requires=['prawcore >=0.1, <1'], + ...) + +requirements.txt +~~~~~~~~~~~~~~~~ + +.. code-block:: text + + prawcore >=1.5.1, <2 + + diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/RECORD b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/RECORD new file mode 100644 index 0000000..50511d7 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/RECORD @@ -0,0 +1,23 @@ +prawcore/__init__.py,sha256=1mPaNaSR15WQmtFrFZoII8Q_HVwCBpw1iIHBcce2SXY,504 +prawcore/auth.py,sha256=XvCSkJPIV1Tvux1Q4y5nRBSq43Vv7sJ915PeZ2gLFsc,13355 +prawcore/const.py,sha256=Dky-tfYjxXuSo7kKBq36pB3t1mb8uDKsBi8JUrrTtFY,260 +prawcore/exceptions.py,sha256=Sqee-PgUHSw6GbIU8pjDThgrFJmi4vHPS4CHCN0Bg0I,3807 +prawcore/rate_limit.py,sha256=PA_LDvycGIHeegdC0W9donJyGSTWVHBT-mYz60zGo58,2884 +prawcore/requestor.py,sha256=BIwtOJcLb4Vlv9Va9-k7UUYzPib1Z2XFWnmbfNIjQX0,2016 +prawcore/sessions.py,sha256=rkzm09JThg5D8sYc4VvitUKYtGY1bie30erqgPcZu3Y,7614 +prawcore/util.py,sha256=UNHJoWY1pcN_IhArlswZupLmt1-9lci1e1rXMcgJNg0,694 +prawcore-0.11.0.dist-info/DESCRIPTION.rst,sha256=1Mfl5hWqsW0PSYTB8Nc8DeCDgGrgwvGmohHLpnONhhQ,2608 +prawcore-0.11.0.dist-info/METADATA,sha256=tX24mejTGMmsTPddf-sEeXlnMafVaWqRfFliyqNZPHg,3579 +prawcore-0.11.0.dist-info/RECORD,, +prawcore-0.11.0.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +prawcore-0.11.0.dist-info/metadata.json,sha256=fvAfhNV_bp_I-eOlZn42RulQu1MhJTu0njYZIcytYbg,1289 +prawcore-0.11.0.dist-info/top_level.txt,sha256=I6b2BHtTmvgJ9TV6NMwqEJTdAJNh2nRP0XIGhmn1gjw,9 +prawcore-0.11.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +prawcore/__pycache__/exceptions.cpython-34.pyc,, +prawcore/__pycache__/__init__.cpython-34.pyc,, +prawcore/__pycache__/auth.cpython-34.pyc,, +prawcore/__pycache__/sessions.cpython-34.pyc,, +prawcore/__pycache__/requestor.cpython-34.pyc,, +prawcore/__pycache__/rate_limit.cpython-34.pyc,, +prawcore/__pycache__/const.cpython-34.pyc,, +prawcore/__pycache__/util.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/WHEEL b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/metadata.json b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/metadata.json new file mode 100644 index 0000000..0994382 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython"], "extensions": {"python.details": {"contacts": [{"email": "bbzbryce@gmail.com", "name": "Bryce Boe", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/praw-dev/prawcore"}}}, "extras": [], "generator": "bdist_wheel (0.30.0.a0)", "keywords": ["praw", "reddit", "api"], "license": "Simplified BSD License", "metadata_version": "2.0", "name": "prawcore", "run_requires": [{"requires": ["requests (>=2.6.0,<3.0)"]}], "summary": "Low-level communication layer for PRAW 4+.", "test_requires": [{"requires": ["betamax (>=0.8,<0.9)", "betamax-matchers (<0.5,>=0.4.0)", "betamax-serializers (<0.3,>=0.2.0)", "mock (<3,>=0.8)", "testfixtures (>4.13.2,<5)"]}], "version": "0.11.0"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/top_level.txt b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/top_level.txt new file mode 100644 index 0000000..88f9ade --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore-0.11.0.dist-info/top_level.txt @@ -0,0 +1 @@ +prawcore diff --git a/env/lib/python3.4/site-packages/prawcore/__init__.py b/env/lib/python3.4/site-packages/prawcore/__init__.py new file mode 100644 index 0000000..5b3c67a --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore/__init__.py @@ -0,0 +1,13 @@ +"""prawcore: Low-level communication layer for PRAW 4+.""" + +import logging +from .auth import (Authorizer, DeviceIDAuthorizer, ReadOnlyAuthorizer, # NOQA + ImplicitAuthorizer, ScriptAuthorizer, TrustedAuthenticator, + UntrustedAuthenticator) +from .const import __version__ # noqa +from .exceptions import * # noqa +from .requestor import Requestor # noqa +from .sessions import Session, session # noqa + + +logging.getLogger(__package__).addHandler(logging.NullHandler()) diff --git a/env/lib/python3.4/site-packages/prawcore/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/prawcore/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ce886c028f7d14ab92207c07686a19ccf20dafa GIT binary patch literal 732 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/prawcore/__pycache__/exceptions.cpython-34.pyc b/env/lib/python3.4/site-packages/prawcore/__pycache__/exceptions.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec1fecce79b6240fcdc0514f47bd7e3c82c98b61 GIT binary patch literal 5463 zcmbtYU2ojR6&>!kRx4SOrM2Za4igluw@B7N6W5K=2L3>t2ryJZR)N+iKvA4oEiEp& znIWZ!wtxUm+vmRYFBJVteCb2c2fy?Ov=8pN!yPUqIjB~p&C$#ucX&DX+;i{nU!8^a z#@1hd_xDA{{=rH|4gCi=)pr(SoU!Lu-J2p35&g`5VFpz?4ZKrFZAUa3#x2X zWzVb33YQF2GtgJO&Uk};kGUF5)Y)s?*k-_Ym{gDwGmkMWxty=l;8pzkw&OQW|8x&rhA#%+z-28C4>_N@0| z`stR84t*|c@vSGuu^)xD7r06ZWe*~0$3tO{rF-N>5*^n&aQ8+34f%8PO$BYw%36sG z#;#PtBiJ19ZtmwUIs$%%lhJD5!i)Op)ogidGWVC}>FMJ~t~zIpwxzI8!7MknBhO2u zedNbOKLp~d!oba5Eo(VW=#GTrWNpV8MLY?p-*KF85;vG!X*v#%JjeMPlXEarH~+qO zCmxOOjQ#N^dx;w3)8Xm_%ds<5gxjM&+#Yn zT=Gcz^No=E=!^Wt$thk0pT!Z}CcFd}JU0xZ*xsWnqj4Z&!TVSSS*Q1EP}8KQMNRRp zd9O{_Jenn(#&{Z^GQJ9c4s{#Nd58Xqv4M_b#O)v9=o$m^41QSJ7T+X7#ZwPII`=l< z){(1hH?)P6U>*5XQ_m00+t^?4>}=UGpR4cDTGK&)$uc_C7ieBt>=k1UIu+f)u&O&1 z7FStZqyFm(djY|K)HLY+*ZRMeQ_@`kb2mai_Tht6*sgune%lXK?1rA`x7+sQxQ_sE zM|LFreLr*qry$0Cdk4-kcqz!H43_ZJ*@-6a>9}%VO8W|5S z9vLPs_?f^U?V*GIl4W$NJ7|i)h%FZD*q|_g5+e){6=;z+%aM@!mkk3sd9nNULld#8 zZ@_njPr5FJC;UUf?UyI!h4RJO>@~8M`K=^{l55mxpRJ&m%_AD)L^-60y^6d_S1IWj zKWeqp&ZOV;a4OP6*3e|Ran1|>2V2OpAJYR0wh(fPE##L6bjwF*&dVr72m<=O7EoS; zfY!6cUq4LZ;l)UzZ~Yk-JwUSHXVr8Pi&OQa>q6cbG~zW-lj zIwQqevvTRoDcZ@#getb?gxlo?;btOcPEDh~wpp|zbheHvfG}6Tr z1bix&?}5VkEx76lrTlQ;gh5)jZ@)b05vl9?o@~DK08Lv-q}H{A<~Ss)V6EjE>{T(5}Y_i!pwPos%ftcKOK(rc&Jyx{rfg=DcLyw@@HXY`PQ=7gN0`Nhh= z_9K^1#5(=B&^|w}e^AXKr=pON(^Awhc$UiMCT#nftfkOHSw`ba*xGs=g@eHN;`DA| zsf%JO2g%3Y&<*zmsH|BMBgcvuj#p74Q7p`2^7}CHX~|?7U&7?MCz0IqITvC2tHNd~ z9$g3uY6&VSso+QDOtm8t^T>}$H%#S!ndQC(TenKK)A$m$FK>h@84P^ShoR5BXe>(W zu8Svnk%@u&uaBj+U7P!Zfspu-t>{-Xt@{VCb*E%IjW1z)XHvoMLk|7QECuGfh)1G;@C zTR((tzc1NJ<5RX$oIao%K0&ol}wodrwffS0bA1A2J^3qHvTX~m;$f5YQ@rMdq4|Ntsc6D%Ho}Ftf zuItSVK7gRpq}+>%sGKwDx0(L=OgWb?LTO7<>}yKdY^EekY8bny=^=)$9ZYtwMP?id zmkU{%JZqVI(t7`eio(q|RFR~M#+|gnFHhe5=k43Ky_Tf4%bNKtDyxwTvX%(BqU~ay zJ85aBrD3mH%AG%UOhMa#UKq$L}3Cj2%;kdY~Uj$&1CjZVdinkY#R4g z^@oqFs*Y9G!FnpBJ#0Ra=QOE0_=FYsdwu;GE1N57?Ys=5Pa%5Sm+w5N*3m_Tq_iw4 zze!3I(x!&gOgmfBdP#bEiFKNPM7^x_%lw?da literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/prawcore/__pycache__/rate_limit.cpython-34.pyc b/env/lib/python3.4/site-packages/prawcore/__pycache__/rate_limit.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3504b94df4631a11bd863f8395a52856b2b17379 GIT binary patch literal 2810 zcmai0OK%%h6u$HDBd$Z7q(D&-x*HI#h`WNKP(e{q3la)dTNZdTxt_VUCmzq8-aC_r z)vO8&HvA35FW{fBm?f;bL9AKvojYU4NkL3BXU={2yw7*?XLqyn)uW%k`{Ej7f3UU3 z2Y(N*`2ZwhYzXSG$YqJch7Nlec`WkT_t^EBblD4!4YA|0C;i6aokv<7$C2duRPx6n zmtV*8IG37-i7;mH5)#=#NObwQVD8~H4?rZeK^3S=IxD%*2W3N_^hFKJH(1nUQOojR z+AP|ze2YaL*m14Awx)aW!vhh4d8>*Ya5*O^#CqK8oUe(CKhI zB&ND)xX_Y^D$TV@5*hK4FrX^sV=1GN2xok()%?Fjg$^8~hrZXGGE*93;5M{O5ez2{0q}6C<*wwB+)9uc@Tb$*T*#<-{9cTyB}ID1 zQyEHQgg)aYkuu{{7nfwIFf6or#ok*&Ps~0PNS-N!K2oVj&>@pzF4L-y4iA^bwv5%` z;j40P%}y>v&E(mM(y;IU<*bY>TeZ7=uWUpz5ocwy$RZS>2C%VyQ@8LL_O2Q;-2IoB zmp&O&HY=mb_A-UG2`aJyX{Aqz*#&1hAgtSQHk~b}=PY{bHBFaRT~8gq>iUORRP~G! zp0%0YwGCcv5^+bp`(h2b$oh?`a>O(x?2F4OVE`O~OS2Z!_m**S*=&R9yR`Jt_ZR{nyMRc$L`*z( z#|<2o;slc?cWu7|0T3ID6Xzbw0Smb4v$qhdbD!nDT|0J-TaZ>?X{@$j2PF9HO**g8 z1R9!*67Z`PZ8rl99jFEH;6rx)Zb8Uup81!SHvmeh9ae-+5Dx0I>y?!^t)5C)zb$@5 zD899|YtsaP2GrN^u8Fs>iX^UP4*~zONLPJdjV?k03jlMOPgTUtR22ygtmKT3Fv(Dy zfPyiGnL42{D3+*Y;qaA7Na7yXh_=)OD}j5F;;G8*XrwYb-6K=2rFRkb_`)G&+f%ZI>{ zMQ?qJaN4%kgbJRqzdq}?vo)Y>X2na^0X^>cJYYN&r?hKI*w(N-tF> z!`Ct`k1@vUu|Dk8eHr8myD($8jlmwz;an7iNla*bwP!b>W`Nhc2f{jCK-ZSDHR4-(6=Dos2GaZ#q4<>3Ys$XT6&%d_Cy5X}qUmE`y-#1i@TIMM8Wx2%Z%psZUx# z5UDT-G-0LQCPHAL$&5AA=zjxE=&A`OC>|DEyN#yXZFP6L8+O0%>$mBS4PdjHruN|9 UB$e&El}(>g&J2aO>2$q+00DX5qW}N^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/prawcore/__pycache__/requestor.cpython-34.pyc b/env/lib/python3.4/site-packages/prawcore/__pycache__/requestor.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..079910a98daa8ea591968e58562beed4107deb19 GIT binary patch literal 2493 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/prawcore/__pycache__/util.cpython-34.pyc b/env/lib/python3.4/site-packages/prawcore/__pycache__/util.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..064938380dbe6e85090e46a5280195d87b79f557 GIT binary patch literal 839 zcmZ8fv2GMG5FPK{?dFz5B9|%>g@r_MMG{evA|eQcK%@X7at+t4oV9atvTIwmH8`n@8PQlybs%xKJW~94xcat8cT368q7!g zR-Z{OXzOJy{RKVJmil8sjb*b+TQpd8%BEuTC&BciGz?yAdnh>hw;Ll|0-WH3bO~G& zxFT>#!0tvoL6RNM>jX|ZrpOX)#PzEL)S$cE1GIe~E)!VCU>M_Il+8bX5WcmFGDXFC zC5)F^Q7qFlRSBfeJZ+e9)ay=*_b*z1OkY{6?PgI>TswwY)=(>)(aMP(I!4LfjK}+T zN3_z)GpVGSQbuR9*#^TPsFSRi7gQ_+o8SNc_YHX%;D+qlPV+3}$AWQTT}Y?GhujKN zvr2@_I)hCM_por^y0X$-gtamzD!T+FvM^Wywr%OQ){r;CIqYcYcRt_1uARyA|3hz*PY*^p%9Q8FNQ z4Zq%v@{pG$*Hu}D;!b;Kap=Lu*4ti$l?d@dSK9&%@hmJoZ8UFd@hr;IrOC*Hv>-Vt F(% self.remaining: + estimated_clients = prev_remaining - self.remaining + else: + estimated_clients = 1.0 + + self.next_request_timestamp = now + ( + estimated_clients * seconds_to_reset / self.remaining) diff --git a/env/lib/python3.4/site-packages/prawcore/requestor.py b/env/lib/python3.4/site-packages/prawcore/requestor.py new file mode 100644 index 0000000..a2658f6 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore/requestor.py @@ -0,0 +1,49 @@ +"""Provides the HTTP request handling interface.""" +import requests +from .const import __version__, TIMEOUT +from .exceptions import InvalidInvocation, RequestException + + +class Requestor(object): + """Requestor provides an interface to HTTP requests.""" + + def __getattr__(self, attribute): + """Pass all undefined attributes to the _http attribute.""" + if attribute.startswith('__'): + raise AttributeError + return getattr(self._http, attribute) + + def __init__(self, user_agent, oauth_url='https://oauth.reddit.com', + reddit_url='https://www.reddit.com', session=None): + """Create an instance of the Requestor class. + + :param user_agent: The user-agent for your application. Please follow + reddit's user-agent guidlines: + https://github.com/reddit/reddit/wiki/API#rules + :param oauth_url: (Optional) The URL used to make OAuth requests to the + reddit site. (Default: https://oauth.reddit.com) + :param reddit_url: (Optional) The URL used when obtaining access + tokens. (Default: https://www.reddit.com) + :param session: (Optional) A session to handle requests, compatible + with requests.Session(). (Default: None) + """ + if user_agent is None or len(user_agent) < 7: + raise InvalidInvocation('user_agent is not descriptive') + + self._http = session or requests.Session() + self._http.headers['User-Agent'] = '{} prawcore/{}'.format( + user_agent, __version__) + + self.oauth_url = oauth_url + self.reddit_url = reddit_url + + def close(self): + """Call close on the underlying session.""" + return self._http.close() + + def request(self, *args, **kwargs): + """Issue the HTTP request capturing any errors that may occur.""" + try: + return self._http.request(*args, timeout=TIMEOUT, **kwargs) + except Exception as exc: + raise RequestException(exc, args, kwargs) diff --git a/env/lib/python3.4/site-packages/prawcore/sessions.py b/env/lib/python3.4/site-packages/prawcore/sessions.py new file mode 100644 index 0000000..0de9731 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore/sessions.py @@ -0,0 +1,184 @@ +"""prawcore.sessions: Provides prawcore.Session and prawcore.session.""" +from copy import deepcopy +import logging +import random +import time + +from requests.compat import urljoin +from requests.exceptions import ChunkedEncodingError, ConnectionError +from requests.status_codes import codes + +from .auth import BaseAuthorizer +from .rate_limit import RateLimiter +from .exceptions import (BadRequest, Conflict, InvalidInvocation, NotFound, + Redirect, RequestException, ServerError, TooLarge) +from .util import authorization_error_class + +log = logging.getLogger(__package__) + + +class Session(object): + """The low-level connection interface to reddit's API.""" + + RETRY_EXCEPTIONS = (ChunkedEncodingError, ConnectionError) + RETRY_STATUSES = {520, 522, codes['bad_gateway'], codes['gateway_timeout'], + codes['internal_server_error'], + codes['service_unavailable']} + STATUS_EXCEPTIONS = {codes['bad_gateway']: ServerError, + codes['bad_request']: BadRequest, + codes['conflict']: Conflict, + codes['found']: Redirect, + codes['forbidden']: authorization_error_class, + codes['gateway_timeout']: ServerError, + codes['internal_server_error']: ServerError, + codes['not_found']: NotFound, + codes['request_entity_too_large']: TooLarge, + codes['service_unavailable']: ServerError, + codes['unauthorized']: authorization_error_class, + # CloudFlare status (not named in requests) + 520: ServerError, + 522: ServerError} + SUCCESS_STATUSES = {codes['created'], codes['ok']} + + @staticmethod + def _log_request(data, method, params, url): + log.debug('Fetching: {} {}'.format(method, url)) + log.debug('Data: {}'.format(data)) + log.debug('Params: {}'.format(params)) + + @staticmethod + def _retry_sleep(retries): + if retries < 3: + base = 0 if retries == 2 else 2 + sleep_time = base + 2 * random.random() + log.debug('Sleeping: {:0.2f} seconds'.format(sleep_time)) + time.sleep(sleep_time) + + def __init__(self, authorizer): + """Preprare the connection to reddit's API. + + :param authorizer: An instance of :class:`Authorizer`. + + """ + if not isinstance(authorizer, BaseAuthorizer): + raise InvalidInvocation('invalid Authorizer: {}' + .format(authorizer)) + self._authorizer = authorizer + self._rate_limiter = RateLimiter() + + def __enter__(self): + """Allow this object to be used as a context manager.""" + return self + + def __exit__(self, *_args): + """Allow this object to be used as a context manager.""" + self.close() + + def _do_retry(self, data, files, json, method, params, response, retries, + saved_exception, url): + if saved_exception: + status = repr(saved_exception) + else: + status = response.status_code + log.warning('Retrying due to {} status: {} {}' + .format(status, method, url)) + return self._request_with_retries( + data=data, files=files, json=json, method=method, + params=params, url=url, retries=retries - 1) + + def _make_request(self, data, files, json, method, params, retries, url): + try: + response = self._rate_limiter.call( + self._requestor.request, self._set_header_callback, method, + url, allow_redirects=False, data=data, files=files, json=json, + params=params) + log.debug('Response: {} ({} bytes)'.format( + response.status_code, response.headers.get('content-length'))) + return response, None + except RequestException as exception: + if retries <= 1 or not isinstance(exception.original_exception, + self.RETRY_EXCEPTIONS): + raise + return None, exception.original_exception + + def _request_with_retries(self, data, files, json, method, params, url, + retries=3): + self._retry_sleep(retries) + self._log_request(data, method, params, url) + response, saved_exception = self._make_request( + data, files, json, method, params, retries, url) + + do_retry = False + if response is not None and \ + response.status_code == codes['unauthorized']: + self._authorizer._clear_access_token() + if hasattr(self._authorizer, 'refresh'): + do_retry = True + + if retries > 1 and (do_retry or response is None or + response.status_code in self.RETRY_STATUSES): + return self._do_retry(data, files, json, method, params, response, + retries, saved_exception, url) + elif response.status_code in self.STATUS_EXCEPTIONS: + raise self.STATUS_EXCEPTIONS[response.status_code](response) + elif response.status_code == codes['no_content']: + return + assert response.status_code in self.SUCCESS_STATUSES, \ + 'Unexpected status code: {}'.format(response.status_code) + if response.headers.get('content-length') == '0': + return '' + return response.json() + + def _set_header_callback(self): + if not self._authorizer.is_valid() and hasattr(self._authorizer, + 'refresh'): + self._authorizer.refresh() + return {'Authorization': 'bearer {}' + .format(self._authorizer.access_token)} + + @property + def _requestor(self): + return self._authorizer._authenticator._requestor + + def close(self): + """Close the session and perform any clean up.""" + self._requestor.close() + + def request(self, method, path, data=None, files=None, json=None, + params=None): + """Return the json content from the resource at ``path``. + + :param method: The request verb. E.g., get, post, put. + :param path: The path of the request. This path will be combined with + the ``oauth_url`` of the Requestor. + :param data: Dictionary, bytes, or file-like object to send in the body + of the request. + :param files: Dictionary, mapping ``filename`` to file-like object. + :param json: Object to be serialized to JSON in the body of the + request. + :param params: The query parameters to send with the request. + + Automatically refreshes the access token if it becomes invalid and a + refresh token is available. Raises InvalidInvocation in such a case if + a refresh token is not available. + + """ + params = deepcopy(params) or {} + params['raw_json'] = 1 + if isinstance(data, dict): + data = deepcopy(data) + data['api_type'] = 'json' + data = sorted(data.items()) + url = urljoin(self._requestor.oauth_url, path) + return self._request_with_retries( + data=data, files=files, json=json, method=method, + params=params, url=url) + + +def session(authorizer=None): + """Return a :class:`Session` instance. + + :param authorizer: An instance of :class:`Authorizer`. + + """ + return Session(authorizer=authorizer) diff --git a/env/lib/python3.4/site-packages/prawcore/util.py b/env/lib/python3.4/site-packages/prawcore/util.py new file mode 100644 index 0000000..043e490 --- /dev/null +++ b/env/lib/python3.4/site-packages/prawcore/util.py @@ -0,0 +1,21 @@ +"""Provide utility for the prawcore package.""" +from .exceptions import Forbidden, InsufficientScope, InvalidToken + + +_auth_error_mapping = {403: Forbidden, + 'insufficient_scope': InsufficientScope, + 'invalid_token': InvalidToken} + + +def authorization_error_class(response): + """Return an exception instance that maps to the OAuth Error. + + :param response: The HTTP response containing a www-authenticate error. + + """ + message = response.headers.get('www-authenticate') + if message: + error = message.replace('"', '').rsplit('=', 1)[1] + else: + error = response.status_code + return _auth_error_mapping[error](response) diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..8934d3c --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/DESCRIPTION.rst @@ -0,0 +1,1645 @@ +Requests: HTTP for Humans +========================= + +.. image:: https://img.shields.io/pypi/v/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://img.shields.io/pypi/l/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://img.shields.io/pypi/pyversions/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://codecov.io/github/requests/requests/coverage.svg?branch=master + :target: https://codecov.io/github/requests/requests + :alt: codecov.io + +.. image:: https://img.shields.io/github/contributors/requests/requests.svg + :target: https://github.com/requests/requests/graphs/contributors + +.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg + :target: https://saythanks.io/to/kennethreitz + + + +Requests is the only *Non-GMO* HTTP library for Python, safe for human +consumption. + +**Warning:** Recreational use of the Python standard library for HTTP may result in dangerous side-effects, +including: security vulnerabilities, verbose code, reinventing the wheel, +constantly reading documentation, depression, headaches, or even death. + +Behold, the power of Requests: + +.. code-block:: python + + >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) + >>> r.status_code + 200 + >>> r.headers['content-type'] + 'application/json; charset=utf8' + >>> r.encoding + 'utf-8' + >>> r.text + u'{"type":"User"...' + >>> r.json() + {u'disk_usage': 368627, u'private_gists': 484, ...} + +See `the similar code, sans Requests `_. + +.. image:: https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png + :target: http://docs.python-requests.org/ + + +Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, without the +need for manual labor. There's no need to manually add query strings to your +URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling +are 100% automatic, thanks to `urllib3 `_. + +Besides, all the cool kids are doing it. Requests is one of the most +downloaded Python packages of all time, pulling in over 11,000,000 downloads +every month. You don't want to be left out! + +Feature Support +--------------- + +Requests is ready for today's web. + +- International Domains and URLs +- Keep-Alive & Connection Pooling +- Sessions with Cookie Persistence +- Browser-style SSL Verification +- Basic/Digest Authentication +- Elegant Key/Value Cookies +- Automatic Decompression +- Automatic Content Decoding +- Unicode Response Bodies +- Multipart File Uploads +- HTTP(S) Proxy Support +- Connection Timeouts +- Streaming Downloads +- ``.netrc`` Support +- Chunked Requests + +Requests officially supports Python 2.6–2.7 & 3.3–3.7, and runs great on PyPy. + +Installation +------------ + +To install Requests, simply: + +.. code-block:: bash + + $ pip install requests + ✨🍰✨ + +Satisfaction guaranteed. + +Documentation +------------- + +Fantastic documentation is available at http://docs.python-requests.org/, for a limited time only. + + +How to Contribute +----------------- + +#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. +#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). +#. Write a test which shows that the bug was fixed or that the feature works as expected. +#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. + +.. _`the repository`: http://github.com/requests/requests +.. _AUTHORS: https://github.com/requests/requests/blob/master/AUTHORS.rst +.. _Contributor Friendly: https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open + + +.. :changelog: + +Release History +--------------- + +2.18.4 (2017-08-15) ++++++++++++++++++++ + +**Improvements** + +- Error messages for invalid headers now include the header name for easier debugging + +**Dependencies** + +- We now support idna v2.6. + +2.18.3 (2017-08-02) ++++++++++++++++++++ + +**Improvements** + +- Running ``$ python -m requests.help`` now includes the installed version of idna. + +**Bugfixes** + +- Fixed issue where Requests would raise ``ConnectionError`` instead of + ``SSLError`` when encountering SSL problems when using urllib3 v1.22. + +2.18.2 (2017-07-25) ++++++++++++++++++++ + +**Bugfixes** + +- ``requests.help`` no longer fails on Python 2.6 due to the absence of + ``ssl.OPENSSL_VERSION_NUMBER``. + +**Dependencies** + +- We now support urllib3 v1.22. + +2.18.1 (2017-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fix an error in the packaging whereby the *.whl contained incorrect data that + regressed the fix in v2.17.3. + +2.18.0 (2017-06-14) ++++++++++++++++++++ + +**Improvements** + +- ``Response`` is now a context manager, so can be used directly in a ``with`` statement + without first having to be wrapped by ``contextlib.closing()``. + +**Bugfixes** + +- Resolve installation failure if multiprocessing is not available +- Resolve tests crash if multiprocessing is not able to determine the number of CPU cores +- Resolve error swallowing in utils set_environ generator + + +2.17.3 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.2 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.1 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.0 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Removal of the 301 redirect cache. This improves thread-safety. + + +2.16.5 (2017-05-28) ++++++++++++++++++++ + +- Improvements to ``$ python -m requests.help``. + +2.16.4 (2017-05-27) ++++++++++++++++++++ + +- Introduction of the ``$ python -m requests.help`` command, for debugging with maintainers! + +2.16.3 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +2.16.2 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +No code modification (noted below) should be neccessary any longer. + +2.16.1 (2017-05-27) ++++++++++++++++++++ + +- Restored the ``requests.packages`` namespace for compatibility reasons. +- Bugfix for ``urllib3`` version parsing. + +**Note**: code that was written to import against the ``requests.packages`` +namespace previously will have to import code that rests at this module-level +now. + +For example:: + + from requests.packages.urllib3.poolmanager import PoolManager + +Will need to be re-written to be:: + + from requests.packages import urllib3 + urllib3.poolmanager.PoolManager + +Or, even better:: + + from urllib3.poolmanager import PoolManager + +2.16.0 (2017-05-26) ++++++++++++++++++++ + +- Unvendor ALL the things! + +2.15.1 (2017-05-26) ++++++++++++++++++++ + +- Everyone makes mistakes. + +2.15.0 (2017-05-26) ++++++++++++++++++++ + +**Improvements** + +- Introduction of the ``Response.next`` property, for getting the next + ``PreparedResponse`` from a redirect chain (when ``allow_redirects=False``). +- Internal refactoring of ``__version__`` module. + +**Bugfixes** + +- Restored once-optional parameter for ``requests.utils.get_environ_proxies()``. + +2.14.2 (2017-05-10) ++++++++++++++++++++ + +**Bugfixes** + +- Changed a less-than to an equal-to and an or in the dependency markers to + widen compatibility with older setuptools releases. + +2.14.1 (2017-05-09) ++++++++++++++++++++ + +**Bugfixes** + +- Changed the dependency markers to widen compatibility with older pip + releases. + +2.14.0 (2017-05-09) ++++++++++++++++++++ + +**Improvements** + +- It is now possible to pass ``no_proxy`` as a key to the ``proxies`` + dictionary to provide handling similar to the ``NO_PROXY`` environment + variable. +- When users provide invalid paths to certificate bundle files or directories + Requests now raises ``IOError``, rather than failing at the time of the HTTPS + request with a fairly inscrutable certificate validation error. +- The behavior of ``SessionRedirectMixin`` was slightly altered. + ``resolve_redirects`` will now detect a redirect by calling + ``get_redirect_target(response)`` instead of directly + querying ``Response.is_redirect`` and ``Response.headers['location']``. + Advanced users will be able to process malformed redirects more easily. +- Changed the internal calculation of elapsed request time to have higher + resolution on Windows. +- Added ``win_inet_pton`` as conditional dependency for the ``[socks]`` extra + on Windows with Python 2.7. +- Changed the proxy bypass implementation on Windows: the proxy bypass + check doesn't use forward and reverse DNS requests anymore +- URLs with schemes that begin with ``http`` but are not ``http`` or ``https`` + no longer have their host parts forced to lowercase. + +**Bugfixes** + +- Much improved handling of non-ASCII ``Location`` header values in redirects. + Fewer ``UnicodeDecodeErrors`` are encountered on Python 2, and Python 3 now + correctly understands that Latin-1 is unlikely to be the correct encoding. +- If an attempt to ``seek`` file to find out its length fails, we now + appropriately handle that by aborting our content-length calculations. +- Restricted ``HTTPDigestAuth`` to only respond to auth challenges made on 4XX + responses, rather than to all auth challenges. +- Fixed some code that was firing ``DeprecationWarning`` on Python 3.6. +- The dismayed person emoticon (``/o\\``) no longer has a big head. I'm sure + this is what you were all worrying about most. + + +**Miscellaneous** + +- Updated bundled urllib3 to v1.21.1. +- Updated bundled chardet to v3.0.2. +- Updated bundled idna to v2.5. +- Updated bundled certifi to 2017.4.17. + +2.13.0 (2017-01-24) ++++++++++++++++++++ + +**Features** + +- Only load the ``idna`` library when we've determined we need it. This will + save some memory for users. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.20. +- Updated bundled idna to 2.2. + +2.12.5 (2017-01-18) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed an issue with JSON encoding detection, specifically detecting + big-endian UTF-32 with BOM. + +2.12.4 (2016-12-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from 2.12.2 where non-string types were rejected in the + basic auth parameters. While support for this behaviour has been readded, + the behaviour is deprecated and will be removed in the future. + +2.12.3 (2016-12-01) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from v2.12.1 for URLs with schemes that begin with "http". + These URLs have historically been processed as though they were HTTP-schemed + URLs, and so have had parameters added. This was removed in v2.12.2 in an + overzealous attempt to resolve problems with IDNA-encoding those URLs. This + change was reverted: the other fixes for IDNA-encoding have been judged to + be sufficient to return to the behaviour Requests had before v2.12.0. + +2.12.2 (2016-11-30) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed several issues with IDNA-encoding URLs that are technically invalid but + which are widely accepted. Requests will now attempt to IDNA-encode a URL if + it can but, if it fails, and the host contains only ASCII characters, it will + be passed through optimistically. This will allow users to opt-in to using + IDNA2003 themselves if they want to, and will also allow technically invalid + but still common hostnames. +- Fixed an issue where URLs with leading whitespace would raise + ``InvalidSchema`` errors. +- Fixed an issue where some URLs without the HTTP or HTTPS schemes would still + have HTTP URL preparation applied to them. +- Fixed an issue where Unicode strings could not be used in basic auth. +- Fixed an issue encountered by some Requests plugins where constructing a + Response object would cause ``Response.content`` to raise an + ``AttributeError``. + +2.12.1 (2016-11-16) ++++++++++++++++++++ + +**Bugfixes** + +- Updated setuptools 'security' extra for the new PyOpenSSL backend in urllib3. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19.1. + +2.12.0 (2016-11-15) ++++++++++++++++++++ + +**Improvements** + +- Updated support for internationalized domain names from IDNA2003 to IDNA2008. + This updated support is required for several forms of IDNs and is mandatory + for .de domains. +- Much improved heuristics for guessing content lengths: Requests will no + longer read an entire ``StringIO`` into memory. +- Much improved logic for recalculating ``Content-Length`` headers for + ``PreparedRequest`` objects. +- Improved tolerance for file-like objects that have no ``tell`` method but + do have a ``seek`` method. +- Anything that is a subclass of ``Mapping`` is now treated like a dictionary + by the ``data=`` keyword argument. +- Requests now tolerates empty passwords in proxy credentials, rather than + stripping the credentials. +- If a request is made with a file-like object as the body and that request is + redirected with a 307 or 308 status code, Requests will now attempt to + rewind the body object so it can be replayed. + +**Bugfixes** + +- When calling ``response.close``, the call to ``close`` will be propagated + through to non-urllib3 backends. +- Fixed issue where the ``ALL_PROXY`` environment variable would be preferred + over scheme-specific variables like ``HTTP_PROXY``. +- Fixed issue where non-UTF8 reason phrases got severely mangled by falling + back to decoding using ISO 8859-1 instead. +- Fixed a bug where Requests would not correctly correlate cookies set when + using custom Host headers if those Host headers did not use the native + string type for the platform. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19. +- Updated bundled certifi certs to 2016.09.26. + +2.11.1 (2016-08-17) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed a bug when using ``iter_content`` with ``decode_unicode=True`` for + streamed bodies would raise ``AttributeError``. This bug was introduced in + 2.11. +- Strip Content-Type and Transfer-Encoding headers from the header block when + following a redirect that transforms the verb from POST/PUT to GET. + +2.11.0 (2016-08-08) ++++++++++++++++++++ + +**Improvements** + +- Added support for the ``ALL_PROXY`` environment variable. +- Reject header values that contain leading whitespace or newline characters to + reduce risk of header smuggling. + +**Bugfixes** + +- Fixed occasional ``TypeError`` when attempting to decode a JSON response that + occurred in an error case. Now correctly returns a ``ValueError``. +- Requests would incorrectly ignore a non-CIDR IP address in the ``NO_PROXY`` + environment variables: Requests now treats it as a specific IP. +- Fixed a bug when sending JSON data that could cause us to encounter obscure + OpenSSL errors in certain network conditions (yes, really). +- Added type checks to ensure that ``iter_content`` only accepts integers and + ``None`` for chunk sizes. +- Fixed issue where responses whose body had not been fully consumed would have + the underlying connection closed but not returned to the connection pool, + which could cause Requests to hang in situations where the ``HTTPAdapter`` + had been configured to use a blocking connection pool. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.16. +- Some previous releases accidentally accepted non-strings as acceptable header values. This release does not. + +2.10.0 (2016-04-29) ++++++++++++++++++++ + +**New Features** + +- SOCKS Proxy Support! (requires PySocks; ``$ pip install requests[socks]``) + +**Miscellaneous** + +- Updated bundled urllib3 to 1.15.1. + +2.9.2 (2016-04-29) +++++++++++++++++++ + +**Improvements** + +- Change built-in CaseInsensitiveDict (used for headers) to use OrderedDict + as its underlying datastore. + +**Bugfixes** + +- Don't use redirect_cache if allow_redirects=False +- When passed objects that throw exceptions from ``tell()``, send them via + chunked transfer encoding instead of failing. +- Raise a ProxyError for proxy related connection issues. + +2.9.1 (2015-12-21) +++++++++++++++++++ + +**Bugfixes** + +- Resolve regression introduced in 2.9.0 that made it impossible to send binary + strings as bodies in Python 3. +- Fixed errors when calculating cookie expiration dates in certain locales. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.13.1. + +2.9.0 (2015-12-15) +++++++++++++++++++ + +**Minor Improvements** (Backwards compatible) + +- The ``verify`` keyword argument now supports being passed a path to a + directory of CA certificates, not just a single-file bundle. +- Warnings are now emitted when sending files opened in text mode. +- Added the 511 Network Authentication Required status code to the status code + registry. + +**Bugfixes** + +- For file-like objects that are not seeked to the very beginning, we now + send the content length for the number of bytes we will actually read, rather + than the total size of the file, allowing partial file uploads. +- When uploading file-like objects, if they are empty or have no obvious + content length we set ``Transfer-Encoding: chunked`` rather than + ``Content-Length: 0``. +- We correctly receive the response in buffered mode when uploading chunked + bodies. +- We now handle being passed a query string as a bytestring on Python 3, by + decoding it as UTF-8. +- Sessions are now closed in all cases (exceptional and not) when using the + functional API rather than leaking and waiting for the garbage collector to + clean them up. +- Correctly handle digest auth headers with a malformed ``qop`` directive that + contains no token, by treating it the same as if no ``qop`` directive was + provided at all. +- Minor performance improvements when removing specific cookies by name. + +**Miscellaneous** + +- Updated urllib3 to 1.13. + +2.8.1 (2015-10-13) +++++++++++++++++++ + +**Bugfixes** + +- Update certificate bundle to match ``certifi`` 2015.9.6.2's weak certificate + bundle. +- Fix a bug in 2.8.0 where requests would raise ``ConnectTimeout`` instead of + ``ConnectionError`` +- When using the PreparedRequest flow, requests will now correctly respect the + ``json`` parameter. Broken in 2.8.0. +- When using the PreparedRequest flow, requests will now correctly handle a + Unicode-string method name on Python 2. Broken in 2.8.0. + +2.8.0 (2015-10-05) +++++++++++++++++++ + +**Minor Improvements** (Backwards Compatible) + +- Requests now supports per-host proxies. This allows the ``proxies`` + dictionary to have entries of the form + ``{'://': ''}``. Host-specific proxies will be used + in preference to the previously-supported scheme-specific ones, but the + previous syntax will continue to work. +- ``Response.raise_for_status`` now prints the URL that failed as part of the + exception message. +- ``requests.utils.get_netrc_auth`` now takes an ``raise_errors`` kwarg, + defaulting to ``False``. When ``True``, errors parsing ``.netrc`` files cause + exceptions to be thrown. +- Change to bundled projects import logic to make it easier to unbundle + requests downstream. +- Changed the default User-Agent string to avoid leaking data on Linux: now + contains only the requests version. + +**Bugfixes** + +- The ``json`` parameter to ``post()`` and friends will now only be used if + neither ``data`` nor ``files`` are present, consistent with the + documentation. +- We now ignore empty fields in the ``NO_PROXY`` environment variable. +- Fixed problem where ``httplib.BadStatusLine`` would get raised if combining + ``stream=True`` with ``contextlib.closing``. +- Prevented bugs where we would attempt to return the same connection back to + the connection pool twice when sending a Chunked body. +- Miscellaneous minor internal changes. +- Digest Auth support is now thread safe. + +**Updates** + +- Updated urllib3 to 1.12. + +2.7.0 (2015-05-03) +++++++++++++++++++ + +This is the first release that follows our new release process. For more, see +`our documentation +`_. + +**Bugfixes** + +- Updated urllib3 to 1.10.4, resolving several bugs involving chunked transfer + encoding and response framing. + +2.6.2 (2015-04-23) +++++++++++++++++++ + +**Bugfixes** + +- Fix regression where compressed data that was sent as chunked data was not + properly decompressed. (#2561) + +2.6.1 (2015-04-22) +++++++++++++++++++ + +**Bugfixes** + +- Remove VendorAlias import machinery introduced in v2.5.2. + +- Simplify the PreparedRequest.prepare API: We no longer require the user to + pass an empty list to the hooks keyword argument. (c.f. #2552) + +- Resolve redirects now receives and forwards all of the original arguments to + the adapter. (#2503) + +- Handle UnicodeDecodeErrors when trying to deal with a unicode URL that + cannot be encoded in ASCII. (#2540) + +- Populate the parsed path of the URI field when performing Digest + Authentication. (#2426) + +- Copy a PreparedRequest's CookieJar more reliably when it is not an instance + of RequestsCookieJar. (#2527) + +2.6.0 (2015-03-14) +++++++++++++++++++ + +**Bugfixes** + +- CVE-2015-2296: Fix handling of cookies on redirect. Previously a cookie + without a host value set would use the hostname for the redirected URL + exposing requests users to session fixation attacks and potentially cookie + stealing. This was disclosed privately by Matthew Daley of + `BugFuzz `_. This affects all versions of requests from + v2.1.0 to v2.5.3 (inclusive on both ends). + +- Fix error when requests is an ``install_requires`` dependency and ``python + setup.py test`` is run. (#2462) + +- Fix error when urllib3 is unbundled and requests continues to use the + vendored import location. + +- Include fixes to ``urllib3``'s header handling. + +- Requests' handling of unvendored dependencies is now more restrictive. + +**Features and Improvements** + +- Support bytearrays when passed as parameters in the ``files`` argument. + (#2468) + +- Avoid data duplication when creating a request with ``str``, ``bytes``, or + ``bytearray`` input to the ``files`` argument. + +2.5.3 (2015-02-24) +++++++++++++++++++ + +**Bugfixes** + +- Revert changes to our vendored certificate bundle. For more context see + (#2455, #2456, and http://bugs.python.org/issue23476) + +2.5.2 (2015-02-23) +++++++++++++++++++ + +**Features and Improvements** + +- Add sha256 fingerprint support. (`shazow/urllib3#540`_) + +- Improve the performance of headers. (`shazow/urllib3#544`_) + +**Bugfixes** + +- Copy pip's import machinery. When downstream redistributors remove + requests.packages.urllib3 the import machinery will continue to let those + same symbols work. Example usage in requests' documentation and 3rd-party + libraries relying on the vendored copies of urllib3 will work without having + to fallback to the system urllib3. + +- Attempt to quote parts of the URL on redirect if unquoting and then quoting + fails. (#2356) + +- Fix filename type check for multipart form-data uploads. (#2411) + +- Properly handle the case where a server issuing digest authentication + challenges provides both auth and auth-int qop-values. (#2408) + +- Fix a socket leak. (`shazow/urllib3#549`_) + +- Fix multiple ``Set-Cookie`` headers properly. (`shazow/urllib3#534`_) + +- Disable the built-in hostname verification. (`shazow/urllib3#526`_) + +- Fix the behaviour of decoding an exhausted stream. (`shazow/urllib3#535`_) + +**Security** + +- Pulled in an updated ``cacert.pem``. + +- Drop RC4 from the default cipher list. (`shazow/urllib3#551`_) + +.. _shazow/urllib3#551: https://github.com/shazow/urllib3/pull/551 +.. _shazow/urllib3#549: https://github.com/shazow/urllib3/pull/549 +.. _shazow/urllib3#544: https://github.com/shazow/urllib3/pull/544 +.. _shazow/urllib3#540: https://github.com/shazow/urllib3/pull/540 +.. _shazow/urllib3#535: https://github.com/shazow/urllib3/pull/535 +.. _shazow/urllib3#534: https://github.com/shazow/urllib3/pull/534 +.. _shazow/urllib3#526: https://github.com/shazow/urllib3/pull/526 + +2.5.1 (2014-12-23) +++++++++++++++++++ + +**Behavioural Changes** + +- Only catch HTTPErrors in raise_for_status (#2382) + +**Bugfixes** + +- Handle LocationParseError from urllib3 (#2344) +- Handle file-like object filenames that are not strings (#2379) +- Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated (#2389) + +2.5.0 (2014-12-01) +++++++++++++++++++ + +**Improvements** + +- Allow usage of urllib3's Retry object with HTTPAdapters (#2216) +- The ``iter_lines`` method on a response now accepts a delimiter with which + to split the content (#2295) + +**Behavioural Changes** + +- Add deprecation warnings to functions in requests.utils that will be removed + in 3.0 (#2309) +- Sessions used by the functional API are always closed (#2326) +- Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9) (#2323) + +**Bugfixes** + +- Only parse the URL once (#2353) +- Allow Content-Length header to always be overridden (#2332) +- Properly handle files in HTTPDigestAuth (#2333) +- Cap redirect_cache size to prevent memory abuse (#2299) +- Fix HTTPDigestAuth handling of redirects after authenticating successfully + (#2253) +- Fix crash with custom method parameter to Session.request (#2317) +- Fix how Link headers are parsed using the regular expression library (#2271) + +**Documentation** + +- Add more references for interlinking (#2348) +- Update CSS for theme (#2290) +- Update width of buttons and sidebar (#2289) +- Replace references of Gittip with Gratipay (#2282) +- Add link to changelog in sidebar (#2273) + +2.4.3 (2014-10-06) +++++++++++++++++++ + +**Bugfixes** + +- Unicode URL improvements for Python 2. +- Re-order JSON param for backwards compat. +- Automatically defrag authentication schemes from host/pass URIs. (`#2249 `_) + + +2.4.2 (2014-10-05) +++++++++++++++++++ + +**Improvements** + +- FINALLY! Add json parameter for uploads! (`#2258 `_) +- Support for bytestring URLs on Python 3.x (`#2238 `_) + +**Bugfixes** + +- Avoid getting stuck in a loop (`#2244 `_) +- Multiple calls to iter* fail with unhelpful error. (`#2240 `_, `#2241 `_) + +**Documentation** + +- Correct redirection introduction (`#2245 `_) +- Added example of how to send multiple files in one request. (`#2227 `_) +- Clarify how to pass a custom set of CAs (`#2248 `_) + + + +2.4.1 (2014-09-09) +++++++++++++++++++ + +- Now has a "security" package extras set, ``$ pip install requests[security]`` +- Requests will now use Certifi if it is available. +- Capture and re-raise urllib3 ProtocolError +- Bugfix for responses that attempt to redirect to themselves forever (wtf?). + + +2.4.0 (2014-08-29) +++++++++++++++++++ + +**Behavioral Changes** + +- ``Connection: keep-alive`` header is now sent automatically. + +**Improvements** + +- Support for connect timeouts! Timeout now accepts a tuple (connect, read) which is used to set individual connect and read timeouts. +- Allow copying of PreparedRequests without headers/cookies. +- Updated bundled urllib3 version. +- Refactored settings loading from environment -- new `Session.merge_environment_settings`. +- Handle socket errors in iter_content. + + +2.3.0 (2014-05-16) +++++++++++++++++++ + +**API Changes** + +- New ``Response`` property ``is_redirect``, which is true when the + library could have processed this response as a redirection (whether + or not it actually did). +- The ``timeout`` parameter now affects requests with both ``stream=True`` and + ``stream=False`` equally. +- The change in v2.0.0 to mandate explicit proxy schemes has been reverted. + Proxy schemes now default to ``http://``. +- The ``CaseInsensitiveDict`` used for HTTP headers now behaves like a normal + dictionary when references as string or viewed in the interpreter. + +**Bugfixes** + +- No longer expose Authorization or Proxy-Authorization headers on redirect. + Fix CVE-2014-1829 and CVE-2014-1830 respectively. +- Authorization is re-evaluated each redirect. +- On redirect, pass url as native strings. +- Fall-back to autodetected encoding for JSON when Unicode detection fails. +- Headers set to ``None`` on the ``Session`` are now correctly not sent. +- Correctly honor ``decode_unicode`` even if it wasn't used earlier in the same + response. +- Stop advertising ``compress`` as a supported Content-Encoding. +- The ``Response.history`` parameter is now always a list. +- Many, many ``urllib3`` bugfixes. + +2.2.1 (2014-01-23) +++++++++++++++++++ + +**Bugfixes** + +- Fixes incorrect parsing of proxy credentials that contain a literal or encoded '#' character. +- Assorted urllib3 fixes. + +2.2.0 (2014-01-09) +++++++++++++++++++ + +**API Changes** + +- New exception: ``ContentDecodingError``. Raised instead of ``urllib3`` + ``DecodeError`` exceptions. + +**Bugfixes** + +- Avoid many many exceptions from the buggy implementation of ``proxy_bypass`` on OS X in Python 2.6. +- Avoid crashing when attempting to get authentication credentials from ~/.netrc when running as a user without a home directory. +- Use the correct pool size for pools of connections to proxies. +- Fix iteration of ``CookieJar`` objects. +- Ensure that cookies are persisted over redirect. +- Switch back to using chardet, since it has merged with charade. + +2.1.0 (2013-12-05) +++++++++++++++++++ + +- Updated CA Bundle, of course. +- Cookies set on individual Requests through a ``Session`` (e.g. via ``Session.get()``) are no longer persisted to the ``Session``. +- Clean up connections when we hit problems during chunked upload, rather than leaking them. +- Return connections to the pool when a chunked upload is successful, rather than leaking it. +- Match the HTTPbis recommendation for HTTP 301 redirects. +- Prevent hanging when using streaming uploads and Digest Auth when a 401 is received. +- Values of headers set by Requests are now always the native string type. +- Fix previously broken SNI support. +- Fix accessing HTTP proxies using proxy authentication. +- Unencode HTTP Basic usernames and passwords extracted from URLs. +- Support for IP address ranges for no_proxy environment variable +- Parse headers correctly when users override the default ``Host:`` header. +- Avoid munging the URL in case of case-sensitive servers. +- Looser URL handling for non-HTTP/HTTPS urls. +- Accept unicode methods in Python 2.6 and 2.7. +- More resilient cookie handling. +- Make ``Response`` objects pickleable. +- Actually added MD5-sess to Digest Auth instead of pretending to like last time. +- Updated internal urllib3. +- Fixed @Lukasa's lack of taste. + +2.0.1 (2013-10-24) +++++++++++++++++++ + +- Updated included CA Bundle with new mistrusts and automated process for the future +- Added MD5-sess to Digest Auth +- Accept per-file headers in multipart file POST messages. +- Fixed: Don't send the full URL on CONNECT messages. +- Fixed: Correctly lowercase a redirect scheme. +- Fixed: Cookies not persisted when set via functional API. +- Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError. +- Updated internal urllib3 and chardet. + +2.0.0 (2013-09-24) +++++++++++++++++++ + +**API Changes:** + +- Keys in the Headers dictionary are now native strings on all Python versions, + i.e. bytestrings on Python 2, unicode on Python 3. +- Proxy URLs now *must* have an explicit scheme. A ``MissingSchema`` exception + will be raised if they don't. +- Timeouts now apply to read time if ``Stream=False``. +- ``RequestException`` is now a subclass of ``IOError``, not ``RuntimeError``. +- Added new method to ``PreparedRequest`` objects: ``PreparedRequest.copy()``. +- Added new method to ``Session`` objects: ``Session.update_request()``. This + method updates a ``Request`` object with the data (e.g. cookies) stored on + the ``Session``. +- Added new method to ``Session`` objects: ``Session.prepare_request()``. This + method updates and prepares a ``Request`` object, and returns the + corresponding ``PreparedRequest`` object. +- Added new method to ``HTTPAdapter`` objects: ``HTTPAdapter.proxy_headers()``. + This should not be called directly, but improves the subclass interface. +- ``httplib.IncompleteRead`` exceptions caused by incorrect chunked encoding + will now raise a Requests ``ChunkedEncodingError`` instead. +- Invalid percent-escape sequences now cause a Requests ``InvalidURL`` + exception to be raised. +- HTTP 208 no longer uses reason phrase ``"im_used"``. Correctly uses + ``"already_reported"``. +- HTTP 226 reason added (``"im_used"``). + +**Bugfixes:** + +- Vastly improved proxy support, including the CONNECT verb. Special thanks to + the many contributors who worked towards this improvement. +- Cookies are now properly managed when 401 authentication responses are + received. +- Chunked encoding fixes. +- Support for mixed case schemes. +- Better handling of streaming downloads. +- Retrieve environment proxies from more locations. +- Minor cookies fixes. +- Improved redirect behaviour. +- Improved streaming behaviour, particularly for compressed data. +- Miscellaneous small Python 3 text encoding bugs. +- ``.netrc`` no longer overrides explicit auth. +- Cookies set by hooks are now correctly persisted on Sessions. +- Fix problem with cookies that specify port numbers in their host field. +- ``BytesIO`` can be used to perform streaming uploads. +- More generous parsing of the ``no_proxy`` environment variable. +- Non-string objects can be passed in data values alongside files. + +1.2.3 (2013-05-25) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.2 (2013-05-23) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.1 (2013-05-20) +++++++++++++++++++ + +- 301 and 302 redirects now change the verb to GET for all verbs, not just + POST, improving browser compatibility. +- Python 3.3.2 compatibility +- Always percent-encode location headers +- Fix connection adapter matching to be most-specific first +- new argument to the default connection adapter for passing a block argument +- prevent a KeyError when there's no link headers + +1.2.0 (2013-03-31) +++++++++++++++++++ + +- Fixed cookies on sessions and on requests +- Significantly change how hooks are dispatched - hooks now receive all the + arguments specified by the user when making a request so hooks can make a + secondary request with the same parameters. This is especially necessary for + authentication handler authors +- certifi support was removed +- Fixed bug where using OAuth 1 with body ``signature_type`` sent no data +- Major proxy work thanks to @Lukasa including parsing of proxy authentication + from the proxy url +- Fix DigestAuth handling too many 401s +- Update vendored urllib3 to include SSL bug fixes +- Allow keyword arguments to be passed to ``json.loads()`` via the + ``Response.json()`` method +- Don't send ``Content-Length`` header by default on ``GET`` or ``HEAD`` + requests +- Add ``elapsed`` attribute to ``Response`` objects to time how long a request + took. +- Fix ``RequestsCookieJar`` +- Sessions and Adapters are now picklable, i.e., can be used with the + multiprocessing library +- Update charade to version 1.0.3 + +The change in how hooks are dispatched will likely cause a great deal of +issues. + +1.1.0 (2013-01-10) +++++++++++++++++++ + +- CHUNKED REQUESTS +- Support for iterable response bodies +- Assume servers persist redirect params +- Allow explicit content types to be specified for file data +- Make merge_kwargs case-insensitive when looking up keys + +1.0.3 (2012-12-18) +++++++++++++++++++ + +- Fix file upload encoding bug +- Fix cookie behavior + +1.0.2 (2012-12-17) +++++++++++++++++++ + +- Proxy fix for HTTPAdapter. + +1.0.1 (2012-12-17) +++++++++++++++++++ + +- Cert verification exception bug. +- Proxy fix for HTTPAdapter. + +1.0.0 (2012-12-17) +++++++++++++++++++ + +- Massive Refactor and Simplification +- Switch to Apache 2.0 license +- Swappable Connection Adapters +- Mountable Connection Adapters +- Mutable ProcessedRequest chain +- /s/prefetch/stream +- Removal of all configuration +- Standard library logging +- Make Response.json() callable, not property. +- Usage of new charade project, which provides python 2 and 3 simultaneous chardet. +- Removal of all hooks except 'response' +- Removal of all authentication helpers (OAuth, Kerberos) + +This is not a backwards compatible change. + +0.14.2 (2012-10-27) ++++++++++++++++++++ + +- Improved mime-compatible JSON handling +- Proxy fixes +- Path hack fixes +- Case-Insensitive Content-Encoding headers +- Support for CJK parameters in form posts + + +0.14.1 (2012-10-01) ++++++++++++++++++++ + +- Python 3.3 Compatibility +- Simply default accept-encoding +- Bugfixes + + +0.14.0 (2012-09-02) +++++++++++++++++++++ + +- No more iter_content errors if already downloaded. + +0.13.9 (2012-08-25) ++++++++++++++++++++ + +- Fix for OAuth + POSTs +- Remove exception eating from dispatch_hook +- General bugfixes + +0.13.8 (2012-08-21) ++++++++++++++++++++ + +- Incredible Link header support :) + +0.13.7 (2012-08-19) ++++++++++++++++++++ + +- Support for (key, value) lists everywhere. +- Digest Authentication improvements. +- Ensure proxy exclusions work properly. +- Clearer UnicodeError exceptions. +- Automatic casting of URLs to strings (fURL and such) +- Bugfixes. + +0.13.6 (2012-08-06) ++++++++++++++++++++ + +- Long awaited fix for hanging connections! + +0.13.5 (2012-07-27) ++++++++++++++++++++ + +- Packaging fix + +0.13.4 (2012-07-27) ++++++++++++++++++++ + +- GSSAPI/Kerberos authentication! +- App Engine 2.7 Fixes! +- Fix leaking connections (from urllib3 update) +- OAuthlib path hack fix +- OAuthlib URL parameters fix. + +0.13.3 (2012-07-12) ++++++++++++++++++++ + +- Use simplejson if available. +- Do not hide SSLErrors behind Timeouts. +- Fixed param handling with urls containing fragments. +- Significantly improved information in User Agent. +- client certificates are ignored when verify=False + +0.13.2 (2012-06-28) ++++++++++++++++++++ + +- Zero dependencies (once again)! +- New: Response.reason +- Sign querystring parameters in OAuth 1.0 +- Client certificates no longer ignored when verify=False +- Add openSUSE certificate support + +0.13.1 (2012-06-07) ++++++++++++++++++++ + +- Allow passing a file or file-like object as data. +- Allow hooks to return responses that indicate errors. +- Fix Response.text and Response.json for body-less responses. + +0.13.0 (2012-05-29) ++++++++++++++++++++ + +- Removal of Requests.async in favor of `grequests `_ +- Allow disabling of cookie persistence. +- New implementation of safe_mode +- cookies.get now supports default argument +- Session cookies not saved when Session.request is called with return_response=False +- Env: no_proxy support. +- RequestsCookieJar improvements. +- Various bug fixes. + +0.12.1 (2012-05-08) ++++++++++++++++++++ + +- New ``Response.json`` property. +- Ability to add string file uploads. +- Fix out-of-range issue with iter_lines. +- Fix iter_content default size. +- Fix POST redirects containing files. + +0.12.0 (2012-05-02) ++++++++++++++++++++ + +- EXPERIMENTAL OAUTH SUPPORT! +- Proper CookieJar-backed cookies interface with awesome dict-like interface. +- Speed fix for non-iterated content chunks. +- Move ``pre_request`` to a more usable place. +- New ``pre_send`` hook. +- Lazily encode data, params, files. +- Load system Certificate Bundle if ``certify`` isn't available. +- Cleanups, fixes. + +0.11.2 (2012-04-22) ++++++++++++++++++++ + +- Attempt to use the OS's certificate bundle if ``certifi`` isn't available. +- Infinite digest auth redirect fix. +- Multi-part file upload improvements. +- Fix decoding of invalid %encodings in URLs. +- If there is no content in a response don't throw an error the second time that content is attempted to be read. +- Upload data on redirects. + +0.11.1 (2012-03-30) ++++++++++++++++++++ + +* POST redirects now break RFC to do what browsers do: Follow up with a GET. +* New ``strict_mode`` configuration to disable new redirect behavior. + + +0.11.0 (2012-03-14) ++++++++++++++++++++ + +* Private SSL Certificate support +* Remove select.poll from Gevent monkeypatching +* Remove redundant generator for chunked transfer encoding +* Fix: Response.ok raises Timeout Exception in safe_mode + +0.10.8 (2012-03-09) ++++++++++++++++++++ + +* Generate chunked ValueError fix +* Proxy configuration by environment variables +* Simplification of iter_lines. +* New `trust_env` configuration for disabling system/environment hints. +* Suppress cookie errors. + +0.10.7 (2012-03-07) ++++++++++++++++++++ + +* `encode_uri` = False + +0.10.6 (2012-02-25) ++++++++++++++++++++ + +* Allow '=' in cookies. + +0.10.5 (2012-02-25) ++++++++++++++++++++ + +* Response body with 0 content-length fix. +* New async.imap. +* Don't fail on netrc. + + +0.10.4 (2012-02-20) ++++++++++++++++++++ + +* Honor netrc. + +0.10.3 (2012-02-20) ++++++++++++++++++++ + +* HEAD requests don't follow redirects anymore. +* raise_for_status() doesn't raise for 3xx anymore. +* Make Session objects picklable. +* ValueError for invalid schema URLs. + +0.10.2 (2012-01-15) ++++++++++++++++++++ + +* Vastly improved URL quoting. +* Additional allowed cookie key values. +* Attempted fix for "Too many open files" Error +* Replace unicode errors on first pass, no need for second pass. +* Append '/' to bare-domain urls before query insertion. +* Exceptions now inherit from RuntimeError. +* Binary uploads + auth fix. +* Bugfixes. + + +0.10.1 (2012-01-23) ++++++++++++++++++++ + +* PYTHON 3 SUPPORT! +* Dropped 2.5 Support. (*Backwards Incompatible*) + +0.10.0 (2012-01-21) ++++++++++++++++++++ + +* ``Response.content`` is now bytes-only. (*Backwards Incompatible*) +* New ``Response.text`` is unicode-only. +* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Response.text`` will guess an encoding. +* Default to ISO-8859-1 (Western) encoding for "text" subtypes. +* Removal of `decode_unicode`. (*Backwards Incompatible*) +* New multiple-hooks system. +* New ``Response.register_hook`` for registering hooks within the pipeline. +* ``Response.url`` is now Unicode. + +0.9.3 (2012-01-18) +++++++++++++++++++ + +* SSL verify=False bugfix (apparent on windows machines). + +0.9.2 (2012-01-18) +++++++++++++++++++ + +* Asynchronous async.send method. +* Support for proper chunk streams with boundaries. +* session argument for Session classes. +* Print entire hook tracebacks, not just exception instance. +* Fix response.iter_lines from pending next line. +* Fix but in HTTP-digest auth w/ URI having query strings. +* Fix in Event Hooks section. +* Urllib3 update. + + +0.9.1 (2012-01-06) +++++++++++++++++++ + +* danger_mode for automatic Response.raise_for_status() +* Response.iter_lines refactor + +0.9.0 (2011-12-28) +++++++++++++++++++ + +* verify ssl is default. + + +0.8.9 (2011-12-28) +++++++++++++++++++ + +* Packaging fix. + + +0.8.8 (2011-12-28) +++++++++++++++++++ + +* SSL CERT VERIFICATION! +* Release of Cerifi: Mozilla's cert list. +* New 'verify' argument for SSL requests. +* Urllib3 update. + +0.8.7 (2011-12-24) +++++++++++++++++++ + +* iter_lines last-line truncation fix +* Force safe_mode for async requests +* Handle safe_mode exceptions more consistently +* Fix iteration on null responses in safe_mode + +0.8.6 (2011-12-18) +++++++++++++++++++ + +* Socket timeout fixes. +* Proxy Authorization support. + +0.8.5 (2011-12-14) +++++++++++++++++++ + +* Response.iter_lines! + +0.8.4 (2011-12-11) +++++++++++++++++++ + +* Prefetch bugfix. +* Added license to installed version. + +0.8.3 (2011-11-27) +++++++++++++++++++ + +* Converted auth system to use simpler callable objects. +* New session parameter to API methods. +* Display full URL while logging. + +0.8.2 (2011-11-19) +++++++++++++++++++ + +* New Unicode decoding system, based on over-ridable `Response.encoding`. +* Proper URL slash-quote handling. +* Cookies with ``[``, ``]``, and ``_`` allowed. + +0.8.1 (2011-11-15) +++++++++++++++++++ + +* URL Request path fix +* Proxy fix. +* Timeouts fix. + +0.8.0 (2011-11-13) +++++++++++++++++++ + +* Keep-alive support! +* Complete removal of Urllib2 +* Complete removal of Poster +* Complete removal of CookieJars +* New ConnectionError raising +* Safe_mode for error catching +* prefetch parameter for request methods +* OPTION method +* Async pool size throttling +* File uploads send real names +* Vendored in urllib3 + +0.7.6 (2011-11-07) +++++++++++++++++++ + +* Digest authentication bugfix (attach query data to path) + +0.7.5 (2011-11-04) +++++++++++++++++++ + +* Response.content = None if there was an invalid response. +* Redirection auth handling. + +0.7.4 (2011-10-26) +++++++++++++++++++ + +* Session Hooks fix. + +0.7.3 (2011-10-23) +++++++++++++++++++ + +* Digest Auth fix. + + +0.7.2 (2011-10-23) +++++++++++++++++++ + +* PATCH Fix. + + +0.7.1 (2011-10-23) +++++++++++++++++++ + +* Move away from urllib2 authentication handling. +* Fully Remove AuthManager, AuthObject, &c. +* New tuple-based auth system with handler callbacks. + + +0.7.0 (2011-10-22) +++++++++++++++++++ + +* Sessions are now the primary interface. +* Deprecated InvalidMethodException. +* PATCH fix. +* New config system (no more global settings). + + +0.6.6 (2011-10-19) +++++++++++++++++++ + +* Session parameter bugfix (params merging). + + +0.6.5 (2011-10-18) +++++++++++++++++++ + +* Offline (fast) test suite. +* Session dictionary argument merging. + + +0.6.4 (2011-10-13) +++++++++++++++++++ + +* Automatic decoding of unicode, based on HTTP Headers. +* New ``decode_unicode`` setting. +* Removal of ``r.read/close`` methods. +* New ``r.faw`` interface for advanced response usage.* +* Automatic expansion of parameterized headers. + + +0.6.3 (2011-10-13) +++++++++++++++++++ + +* Beautiful ``requests.async`` module, for making async requests w/ gevent. + + +0.6.2 (2011-10-09) +++++++++++++++++++ + +* GET/HEAD obeys allow_redirects=False. + + +0.6.1 (2011-08-20) +++++++++++++++++++ + +* Enhanced status codes experience ``\o/`` +* Set a maximum number of redirects (``settings.max_redirects``) +* Full Unicode URL support +* Support for protocol-less redirects. +* Allow for arbitrary request types. +* Bugfixes + + +0.6.0 (2011-08-17) +++++++++++++++++++ + +* New callback hook system +* New persistent sessions object and context manager +* Transparent Dict-cookie handling +* Status code reference object +* Removed Response.cached +* Added Response.request +* All args are kwargs +* Relative redirect support +* HTTPError handling improvements +* Improved https testing +* Bugfixes + + +0.5.1 (2011-07-23) +++++++++++++++++++ + +* International Domain Name Support! +* Access headers without fetching entire body (``read()``) +* Use lists as dicts for parameters +* Add Forced Basic Authentication +* Forced Basic is default authentication type +* ``python-requests.org`` default User-Agent header +* CaseInsensitiveDict lower-case caching +* Response.history bugfix + + +0.5.0 (2011-06-21) +++++++++++++++++++ + +* PATCH Support +* Support for Proxies +* HTTPBin Test Suite +* Redirect Fixes +* settings.verbose stream writing +* Querystrings for all methods +* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised + ``r.requests.get('hwe://blah'); r.raise_for_status()`` + + +0.4.1 (2011-05-22) +++++++++++++++++++ + +* Improved Redirection Handling +* New 'allow_redirects' param for following non-GET/HEAD Redirects +* Settings module refactoring + + +0.4.0 (2011-05-15) +++++++++++++++++++ + +* Response.history: list of redirected responses +* Case-Insensitive Header Dictionaries! +* Unicode URLs + + +0.3.4 (2011-05-14) +++++++++++++++++++ + +* Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) +* Internal Refactor +* Bytes data upload Bugfix + + + +0.3.3 (2011-05-12) +++++++++++++++++++ + +* Request timeouts +* Unicode url-encoded data +* Settings context manager and module + + +0.3.2 (2011-04-15) +++++++++++++++++++ + +* Automatic Decompression of GZip Encoded Content +* AutoAuth Support for Tupled HTTP Auth + + +0.3.1 (2011-04-01) +++++++++++++++++++ + +* Cookie Changes +* Response.read() +* Poster fix + + +0.3.0 (2011-02-25) +++++++++++++++++++ + +* Automatic Authentication API Change +* Smarter Query URL Parameterization +* Allow file uploads and POST data together +* New Authentication Manager System + - Simpler Basic HTTP System + - Supports all build-in urllib2 Auths + - Allows for custom Auth Handlers + + +0.2.4 (2011-02-19) +++++++++++++++++++ + +* Python 2.5 Support +* PyPy-c v1.4 Support +* Auto-Authentication tests +* Improved Request object constructor + +0.2.3 (2011-02-15) +++++++++++++++++++ + +* New HTTPHandling Methods + - Response.__nonzero__ (false if bad HTTP Status) + - Response.ok (True if expected HTTP Status) + - Response.error (Logged HTTPError if bad HTTP Status) + - Response.raise_for_status() (Raises stored HTTPError) + + +0.2.2 (2011-02-14) +++++++++++++++++++ + +* Still handles request in the event of an HTTPError. (Issue #2) +* Eventlet and Gevent Monkeypatch support. +* Cookie Support (Issue #1) + + +0.2.1 (2011-02-14) +++++++++++++++++++ + +* Added file attribute to POST and PUT requests for multipart-encode file uploads. +* Added Request.url attribute for context and redirects + + +0.2.0 (2011-02-14) +++++++++++++++++++ + +* Birth! + + +0.0.1 (2011-02-13) +++++++++++++++++++ + +* Frustration +* Conception + + diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/INSTALLER b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/METADATA b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/METADATA new file mode 100644 index 0000000..2ab00d4 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/METADATA @@ -0,0 +1,1680 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.18.4 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: certifi (>=2017.4.17) +Requires-Dist: chardet (>=3.0.2,<3.1.0) +Requires-Dist: idna (>=2.5,<2.7) +Requires-Dist: urllib3 (<1.23,>=1.21.1) +Provides-Extra: security +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + +Requests: HTTP for Humans +========================= + +.. image:: https://img.shields.io/pypi/v/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://img.shields.io/pypi/l/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://img.shields.io/pypi/pyversions/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://codecov.io/github/requests/requests/coverage.svg?branch=master + :target: https://codecov.io/github/requests/requests + :alt: codecov.io + +.. image:: https://img.shields.io/github/contributors/requests/requests.svg + :target: https://github.com/requests/requests/graphs/contributors + +.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg + :target: https://saythanks.io/to/kennethreitz + + + +Requests is the only *Non-GMO* HTTP library for Python, safe for human +consumption. + +**Warning:** Recreational use of the Python standard library for HTTP may result in dangerous side-effects, +including: security vulnerabilities, verbose code, reinventing the wheel, +constantly reading documentation, depression, headaches, or even death. + +Behold, the power of Requests: + +.. code-block:: python + + >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) + >>> r.status_code + 200 + >>> r.headers['content-type'] + 'application/json; charset=utf8' + >>> r.encoding + 'utf-8' + >>> r.text + u'{"type":"User"...' + >>> r.json() + {u'disk_usage': 368627, u'private_gists': 484, ...} + +See `the similar code, sans Requests `_. + +.. image:: https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png + :target: http://docs.python-requests.org/ + + +Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, without the +need for manual labor. There's no need to manually add query strings to your +URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling +are 100% automatic, thanks to `urllib3 `_. + +Besides, all the cool kids are doing it. Requests is one of the most +downloaded Python packages of all time, pulling in over 11,000,000 downloads +every month. You don't want to be left out! + +Feature Support +--------------- + +Requests is ready for today's web. + +- International Domains and URLs +- Keep-Alive & Connection Pooling +- Sessions with Cookie Persistence +- Browser-style SSL Verification +- Basic/Digest Authentication +- Elegant Key/Value Cookies +- Automatic Decompression +- Automatic Content Decoding +- Unicode Response Bodies +- Multipart File Uploads +- HTTP(S) Proxy Support +- Connection Timeouts +- Streaming Downloads +- ``.netrc`` Support +- Chunked Requests + +Requests officially supports Python 2.6–2.7 & 3.3–3.7, and runs great on PyPy. + +Installation +------------ + +To install Requests, simply: + +.. code-block:: bash + + $ pip install requests + ✨🍰✨ + +Satisfaction guaranteed. + +Documentation +------------- + +Fantastic documentation is available at http://docs.python-requests.org/, for a limited time only. + + +How to Contribute +----------------- + +#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. +#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). +#. Write a test which shows that the bug was fixed or that the feature works as expected. +#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. + +.. _`the repository`: http://github.com/requests/requests +.. _AUTHORS: https://github.com/requests/requests/blob/master/AUTHORS.rst +.. _Contributor Friendly: https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open + + +.. :changelog: + +Release History +--------------- + +2.18.4 (2017-08-15) ++++++++++++++++++++ + +**Improvements** + +- Error messages for invalid headers now include the header name for easier debugging + +**Dependencies** + +- We now support idna v2.6. + +2.18.3 (2017-08-02) ++++++++++++++++++++ + +**Improvements** + +- Running ``$ python -m requests.help`` now includes the installed version of idna. + +**Bugfixes** + +- Fixed issue where Requests would raise ``ConnectionError`` instead of + ``SSLError`` when encountering SSL problems when using urllib3 v1.22. + +2.18.2 (2017-07-25) ++++++++++++++++++++ + +**Bugfixes** + +- ``requests.help`` no longer fails on Python 2.6 due to the absence of + ``ssl.OPENSSL_VERSION_NUMBER``. + +**Dependencies** + +- We now support urllib3 v1.22. + +2.18.1 (2017-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fix an error in the packaging whereby the *.whl contained incorrect data that + regressed the fix in v2.17.3. + +2.18.0 (2017-06-14) ++++++++++++++++++++ + +**Improvements** + +- ``Response`` is now a context manager, so can be used directly in a ``with`` statement + without first having to be wrapped by ``contextlib.closing()``. + +**Bugfixes** + +- Resolve installation failure if multiprocessing is not available +- Resolve tests crash if multiprocessing is not able to determine the number of CPU cores +- Resolve error swallowing in utils set_environ generator + + +2.17.3 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.2 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.1 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.0 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Removal of the 301 redirect cache. This improves thread-safety. + + +2.16.5 (2017-05-28) ++++++++++++++++++++ + +- Improvements to ``$ python -m requests.help``. + +2.16.4 (2017-05-27) ++++++++++++++++++++ + +- Introduction of the ``$ python -m requests.help`` command, for debugging with maintainers! + +2.16.3 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +2.16.2 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +No code modification (noted below) should be neccessary any longer. + +2.16.1 (2017-05-27) ++++++++++++++++++++ + +- Restored the ``requests.packages`` namespace for compatibility reasons. +- Bugfix for ``urllib3`` version parsing. + +**Note**: code that was written to import against the ``requests.packages`` +namespace previously will have to import code that rests at this module-level +now. + +For example:: + + from requests.packages.urllib3.poolmanager import PoolManager + +Will need to be re-written to be:: + + from requests.packages import urllib3 + urllib3.poolmanager.PoolManager + +Or, even better:: + + from urllib3.poolmanager import PoolManager + +2.16.0 (2017-05-26) ++++++++++++++++++++ + +- Unvendor ALL the things! + +2.15.1 (2017-05-26) ++++++++++++++++++++ + +- Everyone makes mistakes. + +2.15.0 (2017-05-26) ++++++++++++++++++++ + +**Improvements** + +- Introduction of the ``Response.next`` property, for getting the next + ``PreparedResponse`` from a redirect chain (when ``allow_redirects=False``). +- Internal refactoring of ``__version__`` module. + +**Bugfixes** + +- Restored once-optional parameter for ``requests.utils.get_environ_proxies()``. + +2.14.2 (2017-05-10) ++++++++++++++++++++ + +**Bugfixes** + +- Changed a less-than to an equal-to and an or in the dependency markers to + widen compatibility with older setuptools releases. + +2.14.1 (2017-05-09) ++++++++++++++++++++ + +**Bugfixes** + +- Changed the dependency markers to widen compatibility with older pip + releases. + +2.14.0 (2017-05-09) ++++++++++++++++++++ + +**Improvements** + +- It is now possible to pass ``no_proxy`` as a key to the ``proxies`` + dictionary to provide handling similar to the ``NO_PROXY`` environment + variable. +- When users provide invalid paths to certificate bundle files or directories + Requests now raises ``IOError``, rather than failing at the time of the HTTPS + request with a fairly inscrutable certificate validation error. +- The behavior of ``SessionRedirectMixin`` was slightly altered. + ``resolve_redirects`` will now detect a redirect by calling + ``get_redirect_target(response)`` instead of directly + querying ``Response.is_redirect`` and ``Response.headers['location']``. + Advanced users will be able to process malformed redirects more easily. +- Changed the internal calculation of elapsed request time to have higher + resolution on Windows. +- Added ``win_inet_pton`` as conditional dependency for the ``[socks]`` extra + on Windows with Python 2.7. +- Changed the proxy bypass implementation on Windows: the proxy bypass + check doesn't use forward and reverse DNS requests anymore +- URLs with schemes that begin with ``http`` but are not ``http`` or ``https`` + no longer have their host parts forced to lowercase. + +**Bugfixes** + +- Much improved handling of non-ASCII ``Location`` header values in redirects. + Fewer ``UnicodeDecodeErrors`` are encountered on Python 2, and Python 3 now + correctly understands that Latin-1 is unlikely to be the correct encoding. +- If an attempt to ``seek`` file to find out its length fails, we now + appropriately handle that by aborting our content-length calculations. +- Restricted ``HTTPDigestAuth`` to only respond to auth challenges made on 4XX + responses, rather than to all auth challenges. +- Fixed some code that was firing ``DeprecationWarning`` on Python 3.6. +- The dismayed person emoticon (``/o\\``) no longer has a big head. I'm sure + this is what you were all worrying about most. + + +**Miscellaneous** + +- Updated bundled urllib3 to v1.21.1. +- Updated bundled chardet to v3.0.2. +- Updated bundled idna to v2.5. +- Updated bundled certifi to 2017.4.17. + +2.13.0 (2017-01-24) ++++++++++++++++++++ + +**Features** + +- Only load the ``idna`` library when we've determined we need it. This will + save some memory for users. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.20. +- Updated bundled idna to 2.2. + +2.12.5 (2017-01-18) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed an issue with JSON encoding detection, specifically detecting + big-endian UTF-32 with BOM. + +2.12.4 (2016-12-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from 2.12.2 where non-string types were rejected in the + basic auth parameters. While support for this behaviour has been readded, + the behaviour is deprecated and will be removed in the future. + +2.12.3 (2016-12-01) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from v2.12.1 for URLs with schemes that begin with "http". + These URLs have historically been processed as though they were HTTP-schemed + URLs, and so have had parameters added. This was removed in v2.12.2 in an + overzealous attempt to resolve problems with IDNA-encoding those URLs. This + change was reverted: the other fixes for IDNA-encoding have been judged to + be sufficient to return to the behaviour Requests had before v2.12.0. + +2.12.2 (2016-11-30) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed several issues with IDNA-encoding URLs that are technically invalid but + which are widely accepted. Requests will now attempt to IDNA-encode a URL if + it can but, if it fails, and the host contains only ASCII characters, it will + be passed through optimistically. This will allow users to opt-in to using + IDNA2003 themselves if they want to, and will also allow technically invalid + but still common hostnames. +- Fixed an issue where URLs with leading whitespace would raise + ``InvalidSchema`` errors. +- Fixed an issue where some URLs without the HTTP or HTTPS schemes would still + have HTTP URL preparation applied to them. +- Fixed an issue where Unicode strings could not be used in basic auth. +- Fixed an issue encountered by some Requests plugins where constructing a + Response object would cause ``Response.content`` to raise an + ``AttributeError``. + +2.12.1 (2016-11-16) ++++++++++++++++++++ + +**Bugfixes** + +- Updated setuptools 'security' extra for the new PyOpenSSL backend in urllib3. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19.1. + +2.12.0 (2016-11-15) ++++++++++++++++++++ + +**Improvements** + +- Updated support for internationalized domain names from IDNA2003 to IDNA2008. + This updated support is required for several forms of IDNs and is mandatory + for .de domains. +- Much improved heuristics for guessing content lengths: Requests will no + longer read an entire ``StringIO`` into memory. +- Much improved logic for recalculating ``Content-Length`` headers for + ``PreparedRequest`` objects. +- Improved tolerance for file-like objects that have no ``tell`` method but + do have a ``seek`` method. +- Anything that is a subclass of ``Mapping`` is now treated like a dictionary + by the ``data=`` keyword argument. +- Requests now tolerates empty passwords in proxy credentials, rather than + stripping the credentials. +- If a request is made with a file-like object as the body and that request is + redirected with a 307 or 308 status code, Requests will now attempt to + rewind the body object so it can be replayed. + +**Bugfixes** + +- When calling ``response.close``, the call to ``close`` will be propagated + through to non-urllib3 backends. +- Fixed issue where the ``ALL_PROXY`` environment variable would be preferred + over scheme-specific variables like ``HTTP_PROXY``. +- Fixed issue where non-UTF8 reason phrases got severely mangled by falling + back to decoding using ISO 8859-1 instead. +- Fixed a bug where Requests would not correctly correlate cookies set when + using custom Host headers if those Host headers did not use the native + string type for the platform. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19. +- Updated bundled certifi certs to 2016.09.26. + +2.11.1 (2016-08-17) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed a bug when using ``iter_content`` with ``decode_unicode=True`` for + streamed bodies would raise ``AttributeError``. This bug was introduced in + 2.11. +- Strip Content-Type and Transfer-Encoding headers from the header block when + following a redirect that transforms the verb from POST/PUT to GET. + +2.11.0 (2016-08-08) ++++++++++++++++++++ + +**Improvements** + +- Added support for the ``ALL_PROXY`` environment variable. +- Reject header values that contain leading whitespace or newline characters to + reduce risk of header smuggling. + +**Bugfixes** + +- Fixed occasional ``TypeError`` when attempting to decode a JSON response that + occurred in an error case. Now correctly returns a ``ValueError``. +- Requests would incorrectly ignore a non-CIDR IP address in the ``NO_PROXY`` + environment variables: Requests now treats it as a specific IP. +- Fixed a bug when sending JSON data that could cause us to encounter obscure + OpenSSL errors in certain network conditions (yes, really). +- Added type checks to ensure that ``iter_content`` only accepts integers and + ``None`` for chunk sizes. +- Fixed issue where responses whose body had not been fully consumed would have + the underlying connection closed but not returned to the connection pool, + which could cause Requests to hang in situations where the ``HTTPAdapter`` + had been configured to use a blocking connection pool. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.16. +- Some previous releases accidentally accepted non-strings as acceptable header values. This release does not. + +2.10.0 (2016-04-29) ++++++++++++++++++++ + +**New Features** + +- SOCKS Proxy Support! (requires PySocks; ``$ pip install requests[socks]``) + +**Miscellaneous** + +- Updated bundled urllib3 to 1.15.1. + +2.9.2 (2016-04-29) +++++++++++++++++++ + +**Improvements** + +- Change built-in CaseInsensitiveDict (used for headers) to use OrderedDict + as its underlying datastore. + +**Bugfixes** + +- Don't use redirect_cache if allow_redirects=False +- When passed objects that throw exceptions from ``tell()``, send them via + chunked transfer encoding instead of failing. +- Raise a ProxyError for proxy related connection issues. + +2.9.1 (2015-12-21) +++++++++++++++++++ + +**Bugfixes** + +- Resolve regression introduced in 2.9.0 that made it impossible to send binary + strings as bodies in Python 3. +- Fixed errors when calculating cookie expiration dates in certain locales. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.13.1. + +2.9.0 (2015-12-15) +++++++++++++++++++ + +**Minor Improvements** (Backwards compatible) + +- The ``verify`` keyword argument now supports being passed a path to a + directory of CA certificates, not just a single-file bundle. +- Warnings are now emitted when sending files opened in text mode. +- Added the 511 Network Authentication Required status code to the status code + registry. + +**Bugfixes** + +- For file-like objects that are not seeked to the very beginning, we now + send the content length for the number of bytes we will actually read, rather + than the total size of the file, allowing partial file uploads. +- When uploading file-like objects, if they are empty or have no obvious + content length we set ``Transfer-Encoding: chunked`` rather than + ``Content-Length: 0``. +- We correctly receive the response in buffered mode when uploading chunked + bodies. +- We now handle being passed a query string as a bytestring on Python 3, by + decoding it as UTF-8. +- Sessions are now closed in all cases (exceptional and not) when using the + functional API rather than leaking and waiting for the garbage collector to + clean them up. +- Correctly handle digest auth headers with a malformed ``qop`` directive that + contains no token, by treating it the same as if no ``qop`` directive was + provided at all. +- Minor performance improvements when removing specific cookies by name. + +**Miscellaneous** + +- Updated urllib3 to 1.13. + +2.8.1 (2015-10-13) +++++++++++++++++++ + +**Bugfixes** + +- Update certificate bundle to match ``certifi`` 2015.9.6.2's weak certificate + bundle. +- Fix a bug in 2.8.0 where requests would raise ``ConnectTimeout`` instead of + ``ConnectionError`` +- When using the PreparedRequest flow, requests will now correctly respect the + ``json`` parameter. Broken in 2.8.0. +- When using the PreparedRequest flow, requests will now correctly handle a + Unicode-string method name on Python 2. Broken in 2.8.0. + +2.8.0 (2015-10-05) +++++++++++++++++++ + +**Minor Improvements** (Backwards Compatible) + +- Requests now supports per-host proxies. This allows the ``proxies`` + dictionary to have entries of the form + ``{'://': ''}``. Host-specific proxies will be used + in preference to the previously-supported scheme-specific ones, but the + previous syntax will continue to work. +- ``Response.raise_for_status`` now prints the URL that failed as part of the + exception message. +- ``requests.utils.get_netrc_auth`` now takes an ``raise_errors`` kwarg, + defaulting to ``False``. When ``True``, errors parsing ``.netrc`` files cause + exceptions to be thrown. +- Change to bundled projects import logic to make it easier to unbundle + requests downstream. +- Changed the default User-Agent string to avoid leaking data on Linux: now + contains only the requests version. + +**Bugfixes** + +- The ``json`` parameter to ``post()`` and friends will now only be used if + neither ``data`` nor ``files`` are present, consistent with the + documentation. +- We now ignore empty fields in the ``NO_PROXY`` environment variable. +- Fixed problem where ``httplib.BadStatusLine`` would get raised if combining + ``stream=True`` with ``contextlib.closing``. +- Prevented bugs where we would attempt to return the same connection back to + the connection pool twice when sending a Chunked body. +- Miscellaneous minor internal changes. +- Digest Auth support is now thread safe. + +**Updates** + +- Updated urllib3 to 1.12. + +2.7.0 (2015-05-03) +++++++++++++++++++ + +This is the first release that follows our new release process. For more, see +`our documentation +`_. + +**Bugfixes** + +- Updated urllib3 to 1.10.4, resolving several bugs involving chunked transfer + encoding and response framing. + +2.6.2 (2015-04-23) +++++++++++++++++++ + +**Bugfixes** + +- Fix regression where compressed data that was sent as chunked data was not + properly decompressed. (#2561) + +2.6.1 (2015-04-22) +++++++++++++++++++ + +**Bugfixes** + +- Remove VendorAlias import machinery introduced in v2.5.2. + +- Simplify the PreparedRequest.prepare API: We no longer require the user to + pass an empty list to the hooks keyword argument. (c.f. #2552) + +- Resolve redirects now receives and forwards all of the original arguments to + the adapter. (#2503) + +- Handle UnicodeDecodeErrors when trying to deal with a unicode URL that + cannot be encoded in ASCII. (#2540) + +- Populate the parsed path of the URI field when performing Digest + Authentication. (#2426) + +- Copy a PreparedRequest's CookieJar more reliably when it is not an instance + of RequestsCookieJar. (#2527) + +2.6.0 (2015-03-14) +++++++++++++++++++ + +**Bugfixes** + +- CVE-2015-2296: Fix handling of cookies on redirect. Previously a cookie + without a host value set would use the hostname for the redirected URL + exposing requests users to session fixation attacks and potentially cookie + stealing. This was disclosed privately by Matthew Daley of + `BugFuzz `_. This affects all versions of requests from + v2.1.0 to v2.5.3 (inclusive on both ends). + +- Fix error when requests is an ``install_requires`` dependency and ``python + setup.py test`` is run. (#2462) + +- Fix error when urllib3 is unbundled and requests continues to use the + vendored import location. + +- Include fixes to ``urllib3``'s header handling. + +- Requests' handling of unvendored dependencies is now more restrictive. + +**Features and Improvements** + +- Support bytearrays when passed as parameters in the ``files`` argument. + (#2468) + +- Avoid data duplication when creating a request with ``str``, ``bytes``, or + ``bytearray`` input to the ``files`` argument. + +2.5.3 (2015-02-24) +++++++++++++++++++ + +**Bugfixes** + +- Revert changes to our vendored certificate bundle. For more context see + (#2455, #2456, and http://bugs.python.org/issue23476) + +2.5.2 (2015-02-23) +++++++++++++++++++ + +**Features and Improvements** + +- Add sha256 fingerprint support. (`shazow/urllib3#540`_) + +- Improve the performance of headers. (`shazow/urllib3#544`_) + +**Bugfixes** + +- Copy pip's import machinery. When downstream redistributors remove + requests.packages.urllib3 the import machinery will continue to let those + same symbols work. Example usage in requests' documentation and 3rd-party + libraries relying on the vendored copies of urllib3 will work without having + to fallback to the system urllib3. + +- Attempt to quote parts of the URL on redirect if unquoting and then quoting + fails. (#2356) + +- Fix filename type check for multipart form-data uploads. (#2411) + +- Properly handle the case where a server issuing digest authentication + challenges provides both auth and auth-int qop-values. (#2408) + +- Fix a socket leak. (`shazow/urllib3#549`_) + +- Fix multiple ``Set-Cookie`` headers properly. (`shazow/urllib3#534`_) + +- Disable the built-in hostname verification. (`shazow/urllib3#526`_) + +- Fix the behaviour of decoding an exhausted stream. (`shazow/urllib3#535`_) + +**Security** + +- Pulled in an updated ``cacert.pem``. + +- Drop RC4 from the default cipher list. (`shazow/urllib3#551`_) + +.. _shazow/urllib3#551: https://github.com/shazow/urllib3/pull/551 +.. _shazow/urllib3#549: https://github.com/shazow/urllib3/pull/549 +.. _shazow/urllib3#544: https://github.com/shazow/urllib3/pull/544 +.. _shazow/urllib3#540: https://github.com/shazow/urllib3/pull/540 +.. _shazow/urllib3#535: https://github.com/shazow/urllib3/pull/535 +.. _shazow/urllib3#534: https://github.com/shazow/urllib3/pull/534 +.. _shazow/urllib3#526: https://github.com/shazow/urllib3/pull/526 + +2.5.1 (2014-12-23) +++++++++++++++++++ + +**Behavioural Changes** + +- Only catch HTTPErrors in raise_for_status (#2382) + +**Bugfixes** + +- Handle LocationParseError from urllib3 (#2344) +- Handle file-like object filenames that are not strings (#2379) +- Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated (#2389) + +2.5.0 (2014-12-01) +++++++++++++++++++ + +**Improvements** + +- Allow usage of urllib3's Retry object with HTTPAdapters (#2216) +- The ``iter_lines`` method on a response now accepts a delimiter with which + to split the content (#2295) + +**Behavioural Changes** + +- Add deprecation warnings to functions in requests.utils that will be removed + in 3.0 (#2309) +- Sessions used by the functional API are always closed (#2326) +- Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9) (#2323) + +**Bugfixes** + +- Only parse the URL once (#2353) +- Allow Content-Length header to always be overridden (#2332) +- Properly handle files in HTTPDigestAuth (#2333) +- Cap redirect_cache size to prevent memory abuse (#2299) +- Fix HTTPDigestAuth handling of redirects after authenticating successfully + (#2253) +- Fix crash with custom method parameter to Session.request (#2317) +- Fix how Link headers are parsed using the regular expression library (#2271) + +**Documentation** + +- Add more references for interlinking (#2348) +- Update CSS for theme (#2290) +- Update width of buttons and sidebar (#2289) +- Replace references of Gittip with Gratipay (#2282) +- Add link to changelog in sidebar (#2273) + +2.4.3 (2014-10-06) +++++++++++++++++++ + +**Bugfixes** + +- Unicode URL improvements for Python 2. +- Re-order JSON param for backwards compat. +- Automatically defrag authentication schemes from host/pass URIs. (`#2249 `_) + + +2.4.2 (2014-10-05) +++++++++++++++++++ + +**Improvements** + +- FINALLY! Add json parameter for uploads! (`#2258 `_) +- Support for bytestring URLs on Python 3.x (`#2238 `_) + +**Bugfixes** + +- Avoid getting stuck in a loop (`#2244 `_) +- Multiple calls to iter* fail with unhelpful error. (`#2240 `_, `#2241 `_) + +**Documentation** + +- Correct redirection introduction (`#2245 `_) +- Added example of how to send multiple files in one request. (`#2227 `_) +- Clarify how to pass a custom set of CAs (`#2248 `_) + + + +2.4.1 (2014-09-09) +++++++++++++++++++ + +- Now has a "security" package extras set, ``$ pip install requests[security]`` +- Requests will now use Certifi if it is available. +- Capture and re-raise urllib3 ProtocolError +- Bugfix for responses that attempt to redirect to themselves forever (wtf?). + + +2.4.0 (2014-08-29) +++++++++++++++++++ + +**Behavioral Changes** + +- ``Connection: keep-alive`` header is now sent automatically. + +**Improvements** + +- Support for connect timeouts! Timeout now accepts a tuple (connect, read) which is used to set individual connect and read timeouts. +- Allow copying of PreparedRequests without headers/cookies. +- Updated bundled urllib3 version. +- Refactored settings loading from environment -- new `Session.merge_environment_settings`. +- Handle socket errors in iter_content. + + +2.3.0 (2014-05-16) +++++++++++++++++++ + +**API Changes** + +- New ``Response`` property ``is_redirect``, which is true when the + library could have processed this response as a redirection (whether + or not it actually did). +- The ``timeout`` parameter now affects requests with both ``stream=True`` and + ``stream=False`` equally. +- The change in v2.0.0 to mandate explicit proxy schemes has been reverted. + Proxy schemes now default to ``http://``. +- The ``CaseInsensitiveDict`` used for HTTP headers now behaves like a normal + dictionary when references as string or viewed in the interpreter. + +**Bugfixes** + +- No longer expose Authorization or Proxy-Authorization headers on redirect. + Fix CVE-2014-1829 and CVE-2014-1830 respectively. +- Authorization is re-evaluated each redirect. +- On redirect, pass url as native strings. +- Fall-back to autodetected encoding for JSON when Unicode detection fails. +- Headers set to ``None`` on the ``Session`` are now correctly not sent. +- Correctly honor ``decode_unicode`` even if it wasn't used earlier in the same + response. +- Stop advertising ``compress`` as a supported Content-Encoding. +- The ``Response.history`` parameter is now always a list. +- Many, many ``urllib3`` bugfixes. + +2.2.1 (2014-01-23) +++++++++++++++++++ + +**Bugfixes** + +- Fixes incorrect parsing of proxy credentials that contain a literal or encoded '#' character. +- Assorted urllib3 fixes. + +2.2.0 (2014-01-09) +++++++++++++++++++ + +**API Changes** + +- New exception: ``ContentDecodingError``. Raised instead of ``urllib3`` + ``DecodeError`` exceptions. + +**Bugfixes** + +- Avoid many many exceptions from the buggy implementation of ``proxy_bypass`` on OS X in Python 2.6. +- Avoid crashing when attempting to get authentication credentials from ~/.netrc when running as a user without a home directory. +- Use the correct pool size for pools of connections to proxies. +- Fix iteration of ``CookieJar`` objects. +- Ensure that cookies are persisted over redirect. +- Switch back to using chardet, since it has merged with charade. + +2.1.0 (2013-12-05) +++++++++++++++++++ + +- Updated CA Bundle, of course. +- Cookies set on individual Requests through a ``Session`` (e.g. via ``Session.get()``) are no longer persisted to the ``Session``. +- Clean up connections when we hit problems during chunked upload, rather than leaking them. +- Return connections to the pool when a chunked upload is successful, rather than leaking it. +- Match the HTTPbis recommendation for HTTP 301 redirects. +- Prevent hanging when using streaming uploads and Digest Auth when a 401 is received. +- Values of headers set by Requests are now always the native string type. +- Fix previously broken SNI support. +- Fix accessing HTTP proxies using proxy authentication. +- Unencode HTTP Basic usernames and passwords extracted from URLs. +- Support for IP address ranges for no_proxy environment variable +- Parse headers correctly when users override the default ``Host:`` header. +- Avoid munging the URL in case of case-sensitive servers. +- Looser URL handling for non-HTTP/HTTPS urls. +- Accept unicode methods in Python 2.6 and 2.7. +- More resilient cookie handling. +- Make ``Response`` objects pickleable. +- Actually added MD5-sess to Digest Auth instead of pretending to like last time. +- Updated internal urllib3. +- Fixed @Lukasa's lack of taste. + +2.0.1 (2013-10-24) +++++++++++++++++++ + +- Updated included CA Bundle with new mistrusts and automated process for the future +- Added MD5-sess to Digest Auth +- Accept per-file headers in multipart file POST messages. +- Fixed: Don't send the full URL on CONNECT messages. +- Fixed: Correctly lowercase a redirect scheme. +- Fixed: Cookies not persisted when set via functional API. +- Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError. +- Updated internal urllib3 and chardet. + +2.0.0 (2013-09-24) +++++++++++++++++++ + +**API Changes:** + +- Keys in the Headers dictionary are now native strings on all Python versions, + i.e. bytestrings on Python 2, unicode on Python 3. +- Proxy URLs now *must* have an explicit scheme. A ``MissingSchema`` exception + will be raised if they don't. +- Timeouts now apply to read time if ``Stream=False``. +- ``RequestException`` is now a subclass of ``IOError``, not ``RuntimeError``. +- Added new method to ``PreparedRequest`` objects: ``PreparedRequest.copy()``. +- Added new method to ``Session`` objects: ``Session.update_request()``. This + method updates a ``Request`` object with the data (e.g. cookies) stored on + the ``Session``. +- Added new method to ``Session`` objects: ``Session.prepare_request()``. This + method updates and prepares a ``Request`` object, and returns the + corresponding ``PreparedRequest`` object. +- Added new method to ``HTTPAdapter`` objects: ``HTTPAdapter.proxy_headers()``. + This should not be called directly, but improves the subclass interface. +- ``httplib.IncompleteRead`` exceptions caused by incorrect chunked encoding + will now raise a Requests ``ChunkedEncodingError`` instead. +- Invalid percent-escape sequences now cause a Requests ``InvalidURL`` + exception to be raised. +- HTTP 208 no longer uses reason phrase ``"im_used"``. Correctly uses + ``"already_reported"``. +- HTTP 226 reason added (``"im_used"``). + +**Bugfixes:** + +- Vastly improved proxy support, including the CONNECT verb. Special thanks to + the many contributors who worked towards this improvement. +- Cookies are now properly managed when 401 authentication responses are + received. +- Chunked encoding fixes. +- Support for mixed case schemes. +- Better handling of streaming downloads. +- Retrieve environment proxies from more locations. +- Minor cookies fixes. +- Improved redirect behaviour. +- Improved streaming behaviour, particularly for compressed data. +- Miscellaneous small Python 3 text encoding bugs. +- ``.netrc`` no longer overrides explicit auth. +- Cookies set by hooks are now correctly persisted on Sessions. +- Fix problem with cookies that specify port numbers in their host field. +- ``BytesIO`` can be used to perform streaming uploads. +- More generous parsing of the ``no_proxy`` environment variable. +- Non-string objects can be passed in data values alongside files. + +1.2.3 (2013-05-25) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.2 (2013-05-23) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.1 (2013-05-20) +++++++++++++++++++ + +- 301 and 302 redirects now change the verb to GET for all verbs, not just + POST, improving browser compatibility. +- Python 3.3.2 compatibility +- Always percent-encode location headers +- Fix connection adapter matching to be most-specific first +- new argument to the default connection adapter for passing a block argument +- prevent a KeyError when there's no link headers + +1.2.0 (2013-03-31) +++++++++++++++++++ + +- Fixed cookies on sessions and on requests +- Significantly change how hooks are dispatched - hooks now receive all the + arguments specified by the user when making a request so hooks can make a + secondary request with the same parameters. This is especially necessary for + authentication handler authors +- certifi support was removed +- Fixed bug where using OAuth 1 with body ``signature_type`` sent no data +- Major proxy work thanks to @Lukasa including parsing of proxy authentication + from the proxy url +- Fix DigestAuth handling too many 401s +- Update vendored urllib3 to include SSL bug fixes +- Allow keyword arguments to be passed to ``json.loads()`` via the + ``Response.json()`` method +- Don't send ``Content-Length`` header by default on ``GET`` or ``HEAD`` + requests +- Add ``elapsed`` attribute to ``Response`` objects to time how long a request + took. +- Fix ``RequestsCookieJar`` +- Sessions and Adapters are now picklable, i.e., can be used with the + multiprocessing library +- Update charade to version 1.0.3 + +The change in how hooks are dispatched will likely cause a great deal of +issues. + +1.1.0 (2013-01-10) +++++++++++++++++++ + +- CHUNKED REQUESTS +- Support for iterable response bodies +- Assume servers persist redirect params +- Allow explicit content types to be specified for file data +- Make merge_kwargs case-insensitive when looking up keys + +1.0.3 (2012-12-18) +++++++++++++++++++ + +- Fix file upload encoding bug +- Fix cookie behavior + +1.0.2 (2012-12-17) +++++++++++++++++++ + +- Proxy fix for HTTPAdapter. + +1.0.1 (2012-12-17) +++++++++++++++++++ + +- Cert verification exception bug. +- Proxy fix for HTTPAdapter. + +1.0.0 (2012-12-17) +++++++++++++++++++ + +- Massive Refactor and Simplification +- Switch to Apache 2.0 license +- Swappable Connection Adapters +- Mountable Connection Adapters +- Mutable ProcessedRequest chain +- /s/prefetch/stream +- Removal of all configuration +- Standard library logging +- Make Response.json() callable, not property. +- Usage of new charade project, which provides python 2 and 3 simultaneous chardet. +- Removal of all hooks except 'response' +- Removal of all authentication helpers (OAuth, Kerberos) + +This is not a backwards compatible change. + +0.14.2 (2012-10-27) ++++++++++++++++++++ + +- Improved mime-compatible JSON handling +- Proxy fixes +- Path hack fixes +- Case-Insensitive Content-Encoding headers +- Support for CJK parameters in form posts + + +0.14.1 (2012-10-01) ++++++++++++++++++++ + +- Python 3.3 Compatibility +- Simply default accept-encoding +- Bugfixes + + +0.14.0 (2012-09-02) +++++++++++++++++++++ + +- No more iter_content errors if already downloaded. + +0.13.9 (2012-08-25) ++++++++++++++++++++ + +- Fix for OAuth + POSTs +- Remove exception eating from dispatch_hook +- General bugfixes + +0.13.8 (2012-08-21) ++++++++++++++++++++ + +- Incredible Link header support :) + +0.13.7 (2012-08-19) ++++++++++++++++++++ + +- Support for (key, value) lists everywhere. +- Digest Authentication improvements. +- Ensure proxy exclusions work properly. +- Clearer UnicodeError exceptions. +- Automatic casting of URLs to strings (fURL and such) +- Bugfixes. + +0.13.6 (2012-08-06) ++++++++++++++++++++ + +- Long awaited fix for hanging connections! + +0.13.5 (2012-07-27) ++++++++++++++++++++ + +- Packaging fix + +0.13.4 (2012-07-27) ++++++++++++++++++++ + +- GSSAPI/Kerberos authentication! +- App Engine 2.7 Fixes! +- Fix leaking connections (from urllib3 update) +- OAuthlib path hack fix +- OAuthlib URL parameters fix. + +0.13.3 (2012-07-12) ++++++++++++++++++++ + +- Use simplejson if available. +- Do not hide SSLErrors behind Timeouts. +- Fixed param handling with urls containing fragments. +- Significantly improved information in User Agent. +- client certificates are ignored when verify=False + +0.13.2 (2012-06-28) ++++++++++++++++++++ + +- Zero dependencies (once again)! +- New: Response.reason +- Sign querystring parameters in OAuth 1.0 +- Client certificates no longer ignored when verify=False +- Add openSUSE certificate support + +0.13.1 (2012-06-07) ++++++++++++++++++++ + +- Allow passing a file or file-like object as data. +- Allow hooks to return responses that indicate errors. +- Fix Response.text and Response.json for body-less responses. + +0.13.0 (2012-05-29) ++++++++++++++++++++ + +- Removal of Requests.async in favor of `grequests `_ +- Allow disabling of cookie persistence. +- New implementation of safe_mode +- cookies.get now supports default argument +- Session cookies not saved when Session.request is called with return_response=False +- Env: no_proxy support. +- RequestsCookieJar improvements. +- Various bug fixes. + +0.12.1 (2012-05-08) ++++++++++++++++++++ + +- New ``Response.json`` property. +- Ability to add string file uploads. +- Fix out-of-range issue with iter_lines. +- Fix iter_content default size. +- Fix POST redirects containing files. + +0.12.0 (2012-05-02) ++++++++++++++++++++ + +- EXPERIMENTAL OAUTH SUPPORT! +- Proper CookieJar-backed cookies interface with awesome dict-like interface. +- Speed fix for non-iterated content chunks. +- Move ``pre_request`` to a more usable place. +- New ``pre_send`` hook. +- Lazily encode data, params, files. +- Load system Certificate Bundle if ``certify`` isn't available. +- Cleanups, fixes. + +0.11.2 (2012-04-22) ++++++++++++++++++++ + +- Attempt to use the OS's certificate bundle if ``certifi`` isn't available. +- Infinite digest auth redirect fix. +- Multi-part file upload improvements. +- Fix decoding of invalid %encodings in URLs. +- If there is no content in a response don't throw an error the second time that content is attempted to be read. +- Upload data on redirects. + +0.11.1 (2012-03-30) ++++++++++++++++++++ + +* POST redirects now break RFC to do what browsers do: Follow up with a GET. +* New ``strict_mode`` configuration to disable new redirect behavior. + + +0.11.0 (2012-03-14) ++++++++++++++++++++ + +* Private SSL Certificate support +* Remove select.poll from Gevent monkeypatching +* Remove redundant generator for chunked transfer encoding +* Fix: Response.ok raises Timeout Exception in safe_mode + +0.10.8 (2012-03-09) ++++++++++++++++++++ + +* Generate chunked ValueError fix +* Proxy configuration by environment variables +* Simplification of iter_lines. +* New `trust_env` configuration for disabling system/environment hints. +* Suppress cookie errors. + +0.10.7 (2012-03-07) ++++++++++++++++++++ + +* `encode_uri` = False + +0.10.6 (2012-02-25) ++++++++++++++++++++ + +* Allow '=' in cookies. + +0.10.5 (2012-02-25) ++++++++++++++++++++ + +* Response body with 0 content-length fix. +* New async.imap. +* Don't fail on netrc. + + +0.10.4 (2012-02-20) ++++++++++++++++++++ + +* Honor netrc. + +0.10.3 (2012-02-20) ++++++++++++++++++++ + +* HEAD requests don't follow redirects anymore. +* raise_for_status() doesn't raise for 3xx anymore. +* Make Session objects picklable. +* ValueError for invalid schema URLs. + +0.10.2 (2012-01-15) ++++++++++++++++++++ + +* Vastly improved URL quoting. +* Additional allowed cookie key values. +* Attempted fix for "Too many open files" Error +* Replace unicode errors on first pass, no need for second pass. +* Append '/' to bare-domain urls before query insertion. +* Exceptions now inherit from RuntimeError. +* Binary uploads + auth fix. +* Bugfixes. + + +0.10.1 (2012-01-23) ++++++++++++++++++++ + +* PYTHON 3 SUPPORT! +* Dropped 2.5 Support. (*Backwards Incompatible*) + +0.10.0 (2012-01-21) ++++++++++++++++++++ + +* ``Response.content`` is now bytes-only. (*Backwards Incompatible*) +* New ``Response.text`` is unicode-only. +* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Response.text`` will guess an encoding. +* Default to ISO-8859-1 (Western) encoding for "text" subtypes. +* Removal of `decode_unicode`. (*Backwards Incompatible*) +* New multiple-hooks system. +* New ``Response.register_hook`` for registering hooks within the pipeline. +* ``Response.url`` is now Unicode. + +0.9.3 (2012-01-18) +++++++++++++++++++ + +* SSL verify=False bugfix (apparent on windows machines). + +0.9.2 (2012-01-18) +++++++++++++++++++ + +* Asynchronous async.send method. +* Support for proper chunk streams with boundaries. +* session argument for Session classes. +* Print entire hook tracebacks, not just exception instance. +* Fix response.iter_lines from pending next line. +* Fix but in HTTP-digest auth w/ URI having query strings. +* Fix in Event Hooks section. +* Urllib3 update. + + +0.9.1 (2012-01-06) +++++++++++++++++++ + +* danger_mode for automatic Response.raise_for_status() +* Response.iter_lines refactor + +0.9.0 (2011-12-28) +++++++++++++++++++ + +* verify ssl is default. + + +0.8.9 (2011-12-28) +++++++++++++++++++ + +* Packaging fix. + + +0.8.8 (2011-12-28) +++++++++++++++++++ + +* SSL CERT VERIFICATION! +* Release of Cerifi: Mozilla's cert list. +* New 'verify' argument for SSL requests. +* Urllib3 update. + +0.8.7 (2011-12-24) +++++++++++++++++++ + +* iter_lines last-line truncation fix +* Force safe_mode for async requests +* Handle safe_mode exceptions more consistently +* Fix iteration on null responses in safe_mode + +0.8.6 (2011-12-18) +++++++++++++++++++ + +* Socket timeout fixes. +* Proxy Authorization support. + +0.8.5 (2011-12-14) +++++++++++++++++++ + +* Response.iter_lines! + +0.8.4 (2011-12-11) +++++++++++++++++++ + +* Prefetch bugfix. +* Added license to installed version. + +0.8.3 (2011-11-27) +++++++++++++++++++ + +* Converted auth system to use simpler callable objects. +* New session parameter to API methods. +* Display full URL while logging. + +0.8.2 (2011-11-19) +++++++++++++++++++ + +* New Unicode decoding system, based on over-ridable `Response.encoding`. +* Proper URL slash-quote handling. +* Cookies with ``[``, ``]``, and ``_`` allowed. + +0.8.1 (2011-11-15) +++++++++++++++++++ + +* URL Request path fix +* Proxy fix. +* Timeouts fix. + +0.8.0 (2011-11-13) +++++++++++++++++++ + +* Keep-alive support! +* Complete removal of Urllib2 +* Complete removal of Poster +* Complete removal of CookieJars +* New ConnectionError raising +* Safe_mode for error catching +* prefetch parameter for request methods +* OPTION method +* Async pool size throttling +* File uploads send real names +* Vendored in urllib3 + +0.7.6 (2011-11-07) +++++++++++++++++++ + +* Digest authentication bugfix (attach query data to path) + +0.7.5 (2011-11-04) +++++++++++++++++++ + +* Response.content = None if there was an invalid response. +* Redirection auth handling. + +0.7.4 (2011-10-26) +++++++++++++++++++ + +* Session Hooks fix. + +0.7.3 (2011-10-23) +++++++++++++++++++ + +* Digest Auth fix. + + +0.7.2 (2011-10-23) +++++++++++++++++++ + +* PATCH Fix. + + +0.7.1 (2011-10-23) +++++++++++++++++++ + +* Move away from urllib2 authentication handling. +* Fully Remove AuthManager, AuthObject, &c. +* New tuple-based auth system with handler callbacks. + + +0.7.0 (2011-10-22) +++++++++++++++++++ + +* Sessions are now the primary interface. +* Deprecated InvalidMethodException. +* PATCH fix. +* New config system (no more global settings). + + +0.6.6 (2011-10-19) +++++++++++++++++++ + +* Session parameter bugfix (params merging). + + +0.6.5 (2011-10-18) +++++++++++++++++++ + +* Offline (fast) test suite. +* Session dictionary argument merging. + + +0.6.4 (2011-10-13) +++++++++++++++++++ + +* Automatic decoding of unicode, based on HTTP Headers. +* New ``decode_unicode`` setting. +* Removal of ``r.read/close`` methods. +* New ``r.faw`` interface for advanced response usage.* +* Automatic expansion of parameterized headers. + + +0.6.3 (2011-10-13) +++++++++++++++++++ + +* Beautiful ``requests.async`` module, for making async requests w/ gevent. + + +0.6.2 (2011-10-09) +++++++++++++++++++ + +* GET/HEAD obeys allow_redirects=False. + + +0.6.1 (2011-08-20) +++++++++++++++++++ + +* Enhanced status codes experience ``\o/`` +* Set a maximum number of redirects (``settings.max_redirects``) +* Full Unicode URL support +* Support for protocol-less redirects. +* Allow for arbitrary request types. +* Bugfixes + + +0.6.0 (2011-08-17) +++++++++++++++++++ + +* New callback hook system +* New persistent sessions object and context manager +* Transparent Dict-cookie handling +* Status code reference object +* Removed Response.cached +* Added Response.request +* All args are kwargs +* Relative redirect support +* HTTPError handling improvements +* Improved https testing +* Bugfixes + + +0.5.1 (2011-07-23) +++++++++++++++++++ + +* International Domain Name Support! +* Access headers without fetching entire body (``read()``) +* Use lists as dicts for parameters +* Add Forced Basic Authentication +* Forced Basic is default authentication type +* ``python-requests.org`` default User-Agent header +* CaseInsensitiveDict lower-case caching +* Response.history bugfix + + +0.5.0 (2011-06-21) +++++++++++++++++++ + +* PATCH Support +* Support for Proxies +* HTTPBin Test Suite +* Redirect Fixes +* settings.verbose stream writing +* Querystrings for all methods +* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised + ``r.requests.get('hwe://blah'); r.raise_for_status()`` + + +0.4.1 (2011-05-22) +++++++++++++++++++ + +* Improved Redirection Handling +* New 'allow_redirects' param for following non-GET/HEAD Redirects +* Settings module refactoring + + +0.4.0 (2011-05-15) +++++++++++++++++++ + +* Response.history: list of redirected responses +* Case-Insensitive Header Dictionaries! +* Unicode URLs + + +0.3.4 (2011-05-14) +++++++++++++++++++ + +* Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) +* Internal Refactor +* Bytes data upload Bugfix + + + +0.3.3 (2011-05-12) +++++++++++++++++++ + +* Request timeouts +* Unicode url-encoded data +* Settings context manager and module + + +0.3.2 (2011-04-15) +++++++++++++++++++ + +* Automatic Decompression of GZip Encoded Content +* AutoAuth Support for Tupled HTTP Auth + + +0.3.1 (2011-04-01) +++++++++++++++++++ + +* Cookie Changes +* Response.read() +* Poster fix + + +0.3.0 (2011-02-25) +++++++++++++++++++ + +* Automatic Authentication API Change +* Smarter Query URL Parameterization +* Allow file uploads and POST data together +* New Authentication Manager System + - Simpler Basic HTTP System + - Supports all build-in urllib2 Auths + - Allows for custom Auth Handlers + + +0.2.4 (2011-02-19) +++++++++++++++++++ + +* Python 2.5 Support +* PyPy-c v1.4 Support +* Auto-Authentication tests +* Improved Request object constructor + +0.2.3 (2011-02-15) +++++++++++++++++++ + +* New HTTPHandling Methods + - Response.__nonzero__ (false if bad HTTP Status) + - Response.ok (True if expected HTTP Status) + - Response.error (Logged HTTPError if bad HTTP Status) + - Response.raise_for_status() (Raises stored HTTPError) + + +0.2.2 (2011-02-14) +++++++++++++++++++ + +* Still handles request in the event of an HTTPError. (Issue #2) +* Eventlet and Gevent Monkeypatch support. +* Cookie Support (Issue #1) + + +0.2.1 (2011-02-14) +++++++++++++++++++ + +* Added file attribute to POST and PUT requests for multipart-encode file uploads. +* Added Request.url attribute for context and redirects + + +0.2.0 (2011-02-14) +++++++++++++++++++ + +* Birth! + + +0.0.1 (2011-02-13) +++++++++++++++++++ + +* Frustration +* Conception + + diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/RECORD b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/RECORD new file mode 100644 index 0000000..f2c166b --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/RECORD @@ -0,0 +1,43 @@ +requests/__init__.py,sha256=SJjehBwpQDd1WA_Lu1Nr-E5tvRT_eF_QYJgKjumoTT4,3507 +requests/__version__.py,sha256=BQ279bjqQ_8PHhvD_FN36UuFqjbSUqsm7bMeyJV-kVo,436 +requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +requests/adapters.py,sha256=1MwYKQiENWeuzwnTl_VFaMBz86DL07PJsbX3mUsoq3U,20836 +requests/api.py,sha256=BqVZnvsWu6Pwm0vQ3fw_Dj9_I-gcOR9CbScB2htPArA,6237 +requests/auth.py,sha256=4KCFQHrL1Lcox3uMh4tjOh3OrJhw-F5zti91wY-ZyTY,9728 +requests/certs.py,sha256=dOB5rV2DZ13dEhq9BUa_4hd5kAqg59e_zUZB00faYz8,453 +requests/compat.py,sha256=gy7Fz4GH3bDOKDFcOg70a5lpVzOXAZkRAjkySxhorko,1595 +requests/cookies.py,sha256=u7QC5hmloMwdT9-2taz5GpwAvzp2LTUS9cP4SWUKnfM,18208 +requests/exceptions.py,sha256=DGzfDo4bkPWwdDfQigpqq4bVX9zwvRrHeqt47eFvHS4,3103 +requests/help.py,sha256=vQxbWU20pU742CQn9EoOFMW6pBkdrfmPRsDfpC1BMDA,3616 +requests/hooks.py,sha256=HXAHoC1FNTFRZX6-lNdvPM7Tst4kvGwYTN-AOKRxoRU,767 +requests/models.py,sha256=l56PnVSxDMTISDBf3XPhaBjMVLyQWI0AkcHOwmy3tbs,34003 +requests/packages.py,sha256=Q2rF0L5mc3wQAvc6q_lAVtPTDOaOeFgD-7kWSQLkjEQ,542 +requests/sessions.py,sha256=_A5qpfrohHVFYLEuVyEJ4v3-lIlNwO3GpHG-LzkWFCM,27546 +requests/status_codes.py,sha256=a9bwuU7lMr4HshsRZdzBbUsYVsIo4Fu9GYg1XFTFFPc,3323 +requests/structures.py,sha256=yexCvWbX40M6E8mLQOpAGZZ-ZoAnyaT2dni-Bp-b42g,3012 +requests/utils.py,sha256=sPEkSVLXnGlfobbJMnx5E9Vc4kfv6TpFWpHKFB8wO8U,27652 +requests-2.18.4.dist-info/DESCRIPTION.rst,sha256=89LY7u2BQc53iJ41nVqSmxdBuU_4njwzBwhs3rSDSI0,49017 +requests-2.18.4.dist-info/METADATA,sha256=5gb6Rt0yWESLHmdvQO1Tkt_BOYrU_KL86K7zhpj0w8I,50496 +requests-2.18.4.dist-info/RECORD,, +requests-2.18.4.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +requests-2.18.4.dist-info/metadata.json,sha256=nnAg1-zPQ3UXLwsDcvxFJrC-LMTaMbhDZkQZAm411Ms,1638 +requests-2.18.4.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 +requests-2.18.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests/__pycache__/hooks.cpython-34.pyc,, +requests/__pycache__/adapters.cpython-34.pyc,, +requests/__pycache__/__init__.cpython-34.pyc,, +requests/__pycache__/_internal_utils.cpython-34.pyc,, +requests/__pycache__/packages.cpython-34.pyc,, +requests/__pycache__/structures.cpython-34.pyc,, +requests/__pycache__/status_codes.cpython-34.pyc,, +requests/__pycache__/api.cpython-34.pyc,, +requests/__pycache__/auth.cpython-34.pyc,, +requests/__pycache__/compat.cpython-34.pyc,, +requests/__pycache__/utils.cpython-34.pyc,, +requests/__pycache__/cookies.cpython-34.pyc,, +requests/__pycache__/sessions.cpython-34.pyc,, +requests/__pycache__/__version__.cpython-34.pyc,, +requests/__pycache__/models.cpython-34.pyc,, +requests/__pycache__/help.cpython-34.pyc,, +requests/__pycache__/exceptions.cpython-34.pyc,, +requests/__pycache__/certs.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/WHEEL b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/metadata.json b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/metadata.json new file mode 100644 index 0000000..8adc53a --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.org", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://python-requests.org"}}}, "extras": ["security", "socks"], "generator": "bdist_wheel (0.29.0)", "license": "Apache 2.0", "metadata_version": "2.0", "name": "requests", "run_requires": [{"extra": "socks", "requires": ["PySocks (!=1.5.7,>=1.5.6)"]}, {"requires": ["certifi (>=2017.4.17)", "chardet (>=3.0.2,<3.1.0)", "idna (>=2.5,<2.7)", "urllib3 (<1.23,>=1.21.1)"]}, {"extra": "security", "requires": ["cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)"]}, {"environment": "sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\")", "extra": "socks", "requires": ["win-inet-pton"]}], "summary": "Python HTTP for Humans.", "test_requires": [{"requires": ["PySocks (!=1.5.7,>=1.5.6)", "pytest (>=2.8.0)", "pytest-cov", "pytest-httpbin (==0.0.7)", "pytest-mock", "pytest-xdist"]}], "version": "2.18.4"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/top_level.txt b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/top_level.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests-2.18.4.dist-info/top_level.txt @@ -0,0 +1 @@ +requests diff --git a/env/lib/python3.4/site-packages/requests/__init__.py b/env/lib/python3.4/site-packages/requests/__init__.py new file mode 100644 index 0000000..268e7dc --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/__init__.py @@ -0,0 +1,121 @@ +# -*- 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('http://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 . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import urllib3 +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.22 + assert major == 1 + assert minor >= 21 + assert minor <= 22 + + # 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 + + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +try: + from urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from 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 +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f542b5bc39fdf52c4fd0d2aa77329bcbcc69be1 GIT binary patch literal 3475 zcmbVPOLN=E5$+*Kk%A~umSoBDYhkW!iMB*N{HATK9Y@~X#H+YuC7Yc}6&51K6eJ9Q zodIpryUHQn9QOz0luN2oIi~VA@(bpglP|gCmQ%U`kX9vo3MqW->FJ*7o_-AU&-$eO zv*&;Q>Ti<(|9}&p3rIi0NB^k=-~(_(27U=b1{{f;E&(qMX$!aoKK_*P=?%^3(+K&}E`1=$AP&bhM?u7O+! zzMhZgvcPQs-vGG@d=umi;5R_t1b!3bE#S96-UfafnU6pHJkP$VS`#i#x}_zRR7h@u0B58xeU(0#~aM2v?Zw%{FR%O@c2 zQ#_F#2I~xnJK!&Ze-=Z=7^dZm);aHAn5y=!_@*y(s-4gF_MSV>f_>$wf&JSb``90Z z1MPTGt`g=dE6!^bq^XFUAab4$(t|i!abCvCIp|9i-4{XB({1M`o({Usr`vmWUwb{# zv2Dk3wzjsMKqj$D9aWe!WGm<4h}Z6kbb09@O%vT&TYLTbbvw!SX~(L!)Ea5Db?T*k z?RH~d5OZ^VeK@z28|IMtPNL$T@}xw=oY0GUeY9tZtXJ)B9HA#EsqLx0u1soUf35KODhfzH;dus3F}V!lf=4k2>l_y_JfF= zS)&PD!uL||VX@1|zeEL5x~$r%c#~$#Z^=x@K@)SLiKi}`9jD+sPLoVQMl-W*v$>MX z)a4c*^r+jgfLCj%Aq4$_XZ+-+eHH|{w5 z1Lx-=ig0^pR|M(Xw%rMXu86egIFA#ri)L=N*H+zcL0Z3f5#F#&W2b~ zJqAY>=*y5Y_#K0^L}Dm_-S4Ob>S?BxwR3g|zc;8fv=f&S}|gKc4GFkVi64SrvO#s6>jTDJQH%iW~i z(H=aQ3qwvha~bVfD>%60i`Mv#VQpji;?;XPSHsp7{k}gNiA`?#>#S^jqYxJ6B+uo)Q}$nayK zqovf5WGZ&44+T~@c?pwtJQ>7z5L$;gIQ2i7YsP{e`YT#xGw!-+kcPr_O~ZA4p}Q(b z=v0wWbzL+Di3xXjV6L0%WG8|%w(EL*tagR;^oSM`D=F72>JRlwX41t|DXJD{YdG|d zaA&l!(oeDWkf>pq9$}-^Ez4Ak(lfPPp_3TP*fgFikzil(i>X%4REuyJ3){ab9|+Gk zWonRW2G7%2Nk27Xz6eDsOf}AY(`Zap3r#s;sxNYate`7Fx5mwMvHbR%uE;b@buW-2 z#-%2Hx%-S}12n=+@5S*KUNqPhK90MoHsf?n<{8;|5@Rpwen`>A(;yUI;1)##F;j)a zXzg7zz8Ii66Fb-(Kl36#6sk+fGyG6tJi;eSDSQrrtw#bZCNMt+ISvEFRU%d4CVXCHZX0P># z@)B1L|X6B4sM-!JBVEcT}MAkUU9azj5w7%SBoeW$JZS&J>OS)?1RZdq)aO|eN< hv8LH{smYpbzJwGz&pK=#e;-xr%wlsWak0E;{Rdn6doKV0 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/__version__.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/__version__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d2402587d6ac9a5d8f1775acec05edd18eed981 GIT binary patch literal 514 zcmZ8dJx{|h5WSXuq-iS<3?RhdwL_D(0#PA^Kr9F(Q~?WKth6?b)qEJoK{Wq?e}KdY zYz+LGjIbkSCfq=w;FF*3-rYOj`K?wr4}16L&pCism^nIzU45eoPynnk2RH{b4>%8W z4)7e%0^kDBBH$v>65tZhGT<^$1F!+K0=NRygwsYfH6*)?S)`(5xi?mB7@&i*vmUw# zB|3})gbiAvhk=ZB`msNza2_XcDXvG9U=F;iuuHAOhZ8x@i zH@({A0C^Y0g%fYV8}yYEmpnjDRC#8|5=*YJtIJjP_kA^Qu5Ksa9{u*@n*qSzaB0M} zzC+U;k|_WdWCauvR08S<77^4jEMlk!uo!?SVkibs4B@qa#Sn@S6k~Wz$7nHu`E=|2 zkHq57EjsUJsnQ;;&Z@Nas&dJz|BWO$vgTA3=p=tuzLUqT&b>0)Nnd7OW)@{mySBzc zZgN$fTz2yNb&ce#RCy^2Y)}`{Xo)Yp#TqH<7|(bYE+9*+8njM+=2{BR9ObQ>%ukbl z1igD2_ao)frn}W&S+=V3N~g}-K4vq_T&`3eQ5+8jjORU?j*SPnAS>Y42<%6^ei?!O z6g+Kj^7dH_7xYyG|4#4>-gzz}f=!(N^+27XmYJlIN}ouxe1^IITv|NIY*C?e(i}_Q zHOM~SS^_DfRb$bi_8G%Q5s9P`z+2~0nzkr41)Sn0`6>F@a@o#VM`?}e0RC9w_DQ>(lX4#w+U+ixr_HOZ>)@DuD z?|PH2-pypvL$6Uz$BALMBetTExE}39mc2QvfCv9xp~=L$2V^d@>-Lz`Uj%e}YhI~U zh*v@FGXGJ32m?QW=Ly)mAOyF{{D~Iu6E)0yIz0dLDlR zX9U|C;k?XjmeUzGO9HM34LNEiQMT(R9lW2&8=04wKcC6(TIb~wHvu67tAp9r#>=D5 zm!z3n@+l>Jx?=9YvNR6l(wHh7utUP&@z;;0Lp!3CrN0m8uN^vvmKAs3T4U{)o!5U@ zz34ux3d4t~SWGq-4TP@DHiz%70Z6IuLW6xm-W56HJrRp-F`;QcAn&8;xF4r!Ve&NX qN2|sSdRi%quM|iO!I$bV(>4^F+^$X0R`}%>7vYDDqL1U9-G2cyENMdk literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/adapters.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/adapters.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc9652877a31c453c2b407c725137b634f4573ff GIT binary patch literal 17376 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

    j4!Z@z*b(8*q>thdZ715>FJ* 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/api.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/api.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3db2c6e7911a8b7ab56dff23d4dbbb6c58ca3c GIT binary patch literal 6477 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/compat.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/compat.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f88b2cdd5e5ff7b0e06eed44ac0a2a41add5079d GIT binary patch literal 1673 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 Z(5$5YX4Yy+Z>^I2Yw|C!YIACB>c3$|d;$Of literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/help.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/help.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aed75c5541e7a98ae719c278cfe2a9ddef3766bd GIT binary patch literal 2911 zcmZ`*&2rqv5$*wY7yE)*(6J}V+$7)b^&rh zVh8X5D`{!zq}=inIVF{QULYqwLMn63NtZl8PX2lTP!y}eC1!ehdb)dhy1$wKy2JjX z!@oW8Hi-U1m;MHze~Yge2%?C{M=L0@C>6A{$hS!F*rwDb-!^lgTjaMIx=nt&p*!Sv z8rmV>Y3MHb-G=Uw-=hf2+m!ZcIUwI9vEDJP4y8j{Zjir0;wyQRTJea^`lS9rLI^kk zKDV2u-J&P*J^H$KZ_}_VSGUODq6pTz^e1d-n<7~38~PeW1BzTj?@)Z5q9L7Gq#P0N z&?_P#5dfQxCL8DD&$DQi#@;-WWthlBo_Mp>iKpT`Q>C|v(>zu`FDBF19L|Z*8@Wnk z862nx9DQKWNT$bS~T7QXxVihrXiiB1K(^OER= zIT7}8Z1|Sp3zB~^Q}C-qBO|4NOT`AR8RN!OlQNj~4H_xntF@$--!xZ}b0{o17uryoy0@)GtnO_2iZ zzR~gRm~D?g@y502_>MQOJz%a`IDT0>{>36Gye2`sXPG)Hyjfh7mre0@57&q5PrO8W zd8o={zDh%Nhpp!-n}xG>O48`=^DLX?C(%duRQ$~f5ii~l3>njWtw&dO@dGY< z4-E}m%M~Nx;@16?Ho(KBG(v|BZKA{aEp*u1 zHae)fMtkfoZXe$44#U~?^V@%jWvs%ID~wB_sxK~)@X~cL)g5GJ885X{C!KO}bPCro z?JGV>J*sboCc)0FThA5W3VQe8@WKAk(PzOQA3Q#Kc(5PrfBE_E9z0ef*6YDgb4{#VzCG!a2Z&0|nYysWeSyztqlr5vnLIwL4eqyv$Bim@n44l|(Ys-6nM> zTa}F;v!S1`A?M-21EqiroQdjZ+^~!4rkSkG_%>{*8-{ff1I0_FZn4yDX4!C3wVB#% z>@-`R^!#B{@d1a^zjmeg4AZT5QHi+qR;m#Ip^2lB-MYNLN~Fh|G^F||-0(+lf>&|5 zu1#^PAF`V*R`hF7#UnIi*}@h>v11L#OEf#zl(46c(;%fs8+zbj~M-xR1*9UGw}f z(9O>jcDl*Nu<#xo9qdnaufWqKIE&ZC7rK+k2)EyBethgtTDoo40|tvs>UOkR=7sUF zip15JEb$^z>?$uOOZ^J1?gjz#@yyxPP7p-dJP33@z>|otpde5ztUlz%2#znh2iv+yJ?ruE5B`Aw#hS(QhFhf98vRf##_^(Na)igJuEoa5^S xUcA|hq0Aw7KV6#F-f#HPR5>CweSqDP}EaY8NdN* z0(}Ap1TqgYAHJg#jS6Ievwg@y*lShKen*lYO}Nr39tbg1(YHG*iuMP&q9c(_3QkKY zj`NHwst25=tYqE1$aRj6o{-M@VGc$e7*$iH`6!N}*T*a`SQjx|U_FXD9m!QG#)@}3 z>k-AZkDv=5?ej60O!JKPq!>{~=g4tnYKx>4yS-jMT5nL)BUIWEfURTSn!wft0o;2n zznzkKh2_lFC@YUq%>WLU;hew>sRQVF@R1xLPk?o#{R>*2@#1GD;KzKdr7d^r^7*PB zm8)f5u5>4Pk*%Bx(JlMg+UkPX8^iS;m($DohVAdPl$-bM>n&IaXEftIHYs#+mA6rd zloe_-zD~v~RI)tPCV0EMyR&z5i7P8W7}LB1vb=x?BI{_Uwq?6QlnTlYiu#HQyDl4+ zxC@w*@CB*BBbguN324uz;b>iWAYVG7TyzX@x@M1ChfmcbBV2QUll6b|bk zx2=8d!O^zepRf+|@Uxt~*veJObUMIUVs1vLZ8R5SCZ|-4(b>yd>npliH!R zKaa=z{+Lo_r3wfwRgS5ur3#3ccuW;yVLYx1@i3lHg`~ves+v-@0aX}K7Rw}5bx_sP zs*pDCNmb3L+K?&?nfH{cW>sxi6^2!9L={FY}I<0E^RAHa0?N^2Us&+sX4w!Gl zs``kk9aM#bs&+^f4yl^03bv{pR)xc=HlqqNs`jWVJgRDsslsEX%!sNUQMJca;c-Zqz7Q?;Bb{bE@{dDm<@hbE+_> zYA>k53#xWj70#;Ki>mOVsb!bca!wUKWZuVB^}MQGP=yQ1axbV`FDZr>C7hS=l7yGl zYEl(GtjZIr@UklJR^>^xyKqI7F}WX6A1?1v<-H1UgV23N-N*XBiqvUU-Y2R1!qnH0 zx?hzKNa_LQz9xAWkot%!AC%OC%6(Nn0B~N%heN7t%LhBG z-EzyXH(f0`-nY;k&js}8zRTx&GeJtRzAbUgP;-E-?+rB%7@&R0q;=6iW*>5Z2h zuTr|uZms3w{zM4{D()>u7gu$oRxBf*zw4&kDw+?)HFVZRr}5t03KNk%H{hpPSuldv zDxO!V-&`!Mxi!bnT&dr7s+IDaS6}saUtDX~*WL0ZP8PD50=q9_9o%|LCMHT9MQR-@ zfw7xx6N@eFIyEGF?HcOf1meii_Ylh`u+-9g)8h?ne(`a#>D*i##g~p0yS*)UVy(ZelH&eAgidNU%ts;h2 ztX901KW^68Oc9dm>z+SUX}P-SRVyXe3wvuo?+&(82pF$bHY@cK0h&M3 z8}vh6#N&AgZYp)pQZ1$KDs{_Z<@aLhZcN>Zse5sCH?F)Bq%errk;hWEBoWyxW=g1g z33WH2^lI=8*h9XVj0t%`L3I9Bl3DO^F_-AEnj}xF0P2}=ZPP6IO%YG7wNpE4g8mY_kL)zv`LJ}Ucisn3iOl;LQq7FFF!eFDib;zpJXm+-GJdN!LqbLdP}%sL!vAX< z3+h^Hkd>DObnjc%B8QA-7jpxh|0N&`^5JOU73_DV+X%$ zm1@=Y+9jX_Z?#>mZrNu4_EvCb&8_3z^W3uSc&Ln+*luXVh-*-5RNd(lt#-5OdU^YG zY;tWkMV z*0goV%38yCQr2PXDei+uciad4wUvl@_#4AR#CQ>pcLS+_0&kMw1XKeQ@hMBy4-&2b zD%c+czo+CY;^wPCT!28pp{1IafL{3tXv*xL=Cv?Ism-A&3KNfPI6{s3R+Z+uGKOR2jl!aw)O7o-mC5wp*JN44ZD`;Zb;3G6r^ zd9XnwkN%cy5b)A?#Q@QB**mBcWjV$@7UH+kJsDEb4*G)H_yTrNSzX&4w=iAvH!>Et z`~cfSpYEYvgz2zb8PysJ5z9ZcT3L1-t%6{zqoq%>B^J-9dqZmDcX~1mNQN&;hIo(x zl_L*}pb0606tq>}t6IZB&CTDi?xHgpzM@Vp9zvO*)`(h-%LxD2LgKxws-r(c>ei^b z5Au^$tuX}|1H~a`+|8;oD#@twkh+^jhQvKIF|2OwQe~7HM2aP}XMm{~lC|-ab*(i{ ze1ta+YDC=|Rd+|!-BHfKVs6;^A~0^3tUF%PP%Ia~IM+r?kULSAmxW(;h5Zq|M(K!^5&UuT8g2b;Oo zbaN2~!+bvd=PQHqZLbBk*syqBu8RgcdoIhA){udHZ0g4CO4%*vJNxFjHj-X%$T!C} zoL63703Hbu=KDl4@5d4N3G%0!+?78V4iWfLSZ~kIQf9#*iZYA|Kl7GTZ5z2j6EPWF zDp+-%uf(H zqs&SsrU%InhiF-vtl^`_%2Xx=43B@Ylr?UR$0kB7A2Vsd^sxziOIefnJ}P-8W8+pT zwii56Hg?z=vv$SCW1X4rNDHLV1#qgMbzGog(a#i%Mvg>0TP$w0ooeu95C8z)zO|)4 zgbw;ykiS-?1nyw1QP!^@NrQ3j9iR-Aq)eYia2Ai3LXfq_C&%|oS_!Ywk1KK>k4J*q z%Yz%u3)pRHTSC?woH&s8VlL(H3WoSH1w+GPa~=8PUp^P{c%MQ50tJM9OR4n%rDup4 zQ8^N)fUZdCzzhn@4ax_%^!l4UNsV` z=MP?Vs#RyD>Ov%qt1fIKeO}!o4P|WA=TOG42Xsq%=1_xT#IxiZc590$-CdA%22Iw{^}R?rZdCk=@H8 zQ1MY~0=s1oc24Kecj;=00K^~v4&f1CqExeWpm)^)M+PD`{ zRnFUWOI-(OQ0l78yJ6q3_)YEJt~A9$KInA#oYu-#3< z5WwRyCR9EFDR-& zO2)0-)*yJ!&fy2=Zd<8^ToM8)YKNqx^csUUgF6hmxUh>V*74zI@OT8{td$+oOex`s zeq6%yc)aTfwjm0l2-%en4b9ffP?R^K&wD^D;5e~s2NmPs;mE0^{efU~&L3duFHj=Z zCrS_vFxmE8sR~JEZaK(epA91CmIGB=z_PqaX$RsoRv2u&i?t3*zF|_zQ4QM?&MjlZ zuT@HGlysowYOxwFI=X>14C&$A)pHJtuVkYvuuFoiQj zb_i4sCLtKS4j4lF$|~lP5@gU*Oj5|8fOR4RDbf=(XF!_}PFtY#cC+e~+`d6mO*CgS z6fTtW`yCs$k74V{uqn9;kBXMb1x0u|V4;FpHNxBWIiiw9z8Kk>!xVi=I81!+>n3%2 zb2c@a_L@^KS3xq+{4s*$tjN?k!%+4WGHN!jzin+_1k$LuA8}B{D!50!$h!1SG{zLp zbT9k}dhV|eRe(gSIHh&LMxIPQlm(z_b*G9=BxP4fjY0bHFdb4E zR6#;jng1oqzRVB#4IyxgsizR8LqY>10YTHG>o7en0wg49q2WbKZJrU{Bu%v+62Vf; z-0-R`THweh3sn&Ekh!n+_>5zV0|h(Kx+tyK~79=;+4A|K>E zL_~CC1cD#3AtLe~Bg5?KVlKYWB^|jD&8ZV2qu)f#PeOB2^90rVsenbKR#3me;B5w! z1#}*PpE7&IPY}wX-8CSY8y5PmJIuFJ*?0H>JyQA}15!AtPq=Zzmv;$_kThy^>XjBa zTjcd-5UAu{EBF`7g2&zmZDRkw4vZN_1`P{G%odq0@;d@1oB+<%aS& z=!%d+_6Yzfi%uAkMF%en^2bkrNq__*pn$U0x1hfONFW7Z36MYpDgXhDTSI6iW1)@3 z+)(E_trjiareW!OA#4WKYNzhiXjB321x~|WHw;dtm4Eo66JYcXE1%2yquchjKM?Hx zzd&sH&B$(36REMnkv>dXXF0#t8WX#bUWpDi$F0K5!Q5%eCIra|Q*9k^kHuRu-(fXt{WkI7eLgUV=J;?OCf(Fs~t-$OPO znWTM{m5eB3VTDDNpHO_Cf*qBgpp`nHU_E6VRV4s_2lXc~MCaGA4XIEuYUf(JMRDbO z;IaaKZB}Ri^$<`qlWQO=;BGolQH%8n@35Q-D*;`|L;0}}Ll}bL5=kEM5L4J|+yyny)ZdbSdAJI!gZ~xphvxiuFy`*{(HURADh~|=`J;00)1I1-TX`*D*Q@4)CH@JnIg zG?*Xc0VJw(Cg>sk0s!sxRs|x8HuTPD8<>6*R%lvoLQ_zF0jBYh0Id}bb@zwDciIR? z!cQY}$Kx&3y+N`#F3+&xsjFM1doNBEUKdEhqnGtc;gQB`L)$f2Mivq8*8=#jCp6XIsnd(n)agi+Cj z_eKxEZiB(^L$+5qFp3vs9-x3axP3591B=1Via?Mg!2N-o!--DmIAXU zEtZus)B%_9O)oM-`pW#m1>?Vxebe}kgpMoF!+|CItIXOzc7Li!ryJH3=)B9&D|xMt zayrPhDB#SvHG^$AWOW|jJ}EmFj+ApmzX$QioC^=U4|JrQ`ihLw-l!UGAV_nX8Hir$s`LR&YDz04mcn%CR;~T3(T_A^l_Ns zAo)QkguDn*53gdayHRrZVfBIKNjZN+o%rz@%7z|x=!sO zaKD$fz_`P#N2}e4YQelF>^{cHm4=~jjGquU3T+StZ-z!ia`}Cl?p-7p$mhA%)`VaN zSnebRy}h<^-%7M5q=yb*MQXsvrP{ag@jB)Zxs9-ZWPQIc3-%DC%jV}SNDwe9LLSv$ zu#7?RSy~4>Au+W|`+ko=EX@S$kA~7 z_$@f=LFN^^GqXwkK?Xa9y1N;qb!LE3*qDPa#1QXhFbyHYV3=VghIlu_p!5V81ZW6h zpN=8k&5%|bpN<9HkTC((1g<4N6XTMZ#fr&10GKAj6tS=B-)D3Bn=vrdh`_drvQxDD z;=?dOh*eLi)*cb%F@a!k0LaLiRySq#I1xYw2BR6c%#CyoJPe&t-{dFYae~yXD>htC?0T;2Swg~!_{j})3di4ZRj2yXetBk%sZ#$s^w5N4(r# zVR)uHl1FwNjc82m5;L4~g{c7VYV1WiqA78L2XypEefVk z?cA(^@A54dh756@Ox4{Mj3a&q`pdxeV;d&bpGI9DBif`sT@Aqe7dsfwCTBn>6Y;op z1cY)%jDvgOCY7=#QduhwK4%zedzcU7bQKx4G6?s?=|V+QqcI|O|4zmxVSF4#9+U?= z`7BwjT!00ow`koYW*OM(wo4*rN=%uJ|PDMM~A@dm8)Judh{s?Bf@yO&1fS!XMfi^G{ z(v#KKIZ(WlKe3p54}De@_M(_o^M+8Pu3V+h~?rui@^)UblX2=EnrM#we%vY4{a-GP8>0ODSu zHi-QK*+EC3EI<{}APx&@K_7Qbw z#OSX|hJB0^Z<;xl3F91p$qMEYauvGs%M_llEE``Hq9l$opPyA{9aleAd`_)u)Xexl`8 ztDPqo#l;s22$ZB|pQ<%uu%P`3`VmnvK($e-wmnF8`OXN`c=WzF@v2+DDH>Sg&)nIy zL>=8K%wCrQ*Jgbl;M+Oe+mFo?ckbLdAr==P0^_n)?t~s4C+N}9$%ZW~(M{zM+L&wb z@7v@U;8oYIHN75GPUPyxp$HLsukrn$R#`7G0KW?y{~EdgEe&k=cuTWd!;X$zfd5?u zUV!FZrzJNSPw~t9NmfAN!ymZvx+yU5`l5-XjElTKvCwE;Veg2S1BYxlf1)5Uh4FD9 z=J%&U{70n`^3v%U(JI@%{btP^fej2{aAWU$^28A-^w&9!aN8W!# zeDe`R)Bq51Yy#+-ULlj26cHAUuERLUSW-3bn2lh+LXlhkX_u4hTy1bN>ZIg1N^`!3Km^%(0n%u)tUW z!Ts1Kh``c>siS}+rS#tv(kc{`xT`AcwUosI(EAW6LMR|{M5R!_L4#}vd@)d}coPe9 zLsDoG;Cr}M@rPqD>U501@Pd97qk%$aKmG{&g>7EnGFx9Z_gnlx^BX;qXx)XaCe>~N z|GAp8Y&KUwxzW9#79JfaitfnL+ZX2tkZXjCBf5k{7W;?0;&2R%P<$f(@cqF0cHR%r zBm{e)>rVq=$S~Vjgi+yGWSY^(u69K%FjxoU)*o!Aj|pAEw2I#WX@dZN+!;itA4V07 z8g085wwwZ5ZP&#pZXAUSvZsp$9RpG^|uqnW)SIH$ga*MEY^q(JS!PuF}^U?&5S} zf$^B~gVDaj1RV|~s;dMEp;3pI3{>zmJIn5eLprFBG+nK%ig$YNU_#A%FqI+Nv$rek z&PARZ_J#Tuq>~l+dbfesrKQj`ZFA(y%iV1(=5x%Y40Fx7?ZO$rhSdNQZ@a6jaDAAy z+jY1T8Wqxvnf#e(NM^Q-hdZ5fK(}2C$EBIySo7&(zu>1#L0FN97W88X{Ip4fDc>mA zM)+lv0ZCPew(c?Ouvx8uCEdP9K8q}mMF?yNdNv3S)V4jGw>9;7eH$cV{E5!69h#6v z1+Q$*@OA#iJ^_8eIz9_ChHx4i!rGWn*97ci^o|o(nO>EfD1yPwTVhcT2PUdS4^3?! z&JQB(ISxm(Y)QJucOKcc{#_;=yTQwiZ!^y6PqAJx%zctEvCaWWDjeHDfB^*JAZ0O; z4KxY1K~h9Hnschzlb+rQ-JrQw^reHO?o?W3$5OHEIPlU~Hl7{Irp7bbx3WW{m$Jj7 zQ`y~;w}fobFN4^5Jl-c!gA09}C<4v7)W87>bigp}s{EXM-LJ~etMZ)0F~(VN?=Sd+p*gFwwgiJoh;qVITKmjNy9mjIzFp)U<*=qB z7{T~<0io*9K1SD|y7B7@xEzBO#Be1{kv~LF+_ncp7M$;dNu>?~-qk><4IIuI3_YRf z0O)|_7KaIcz^y`S#`2v7P$W0bu1vWVWna1(tvS_JuyY#Q1YyK{b z+wkA`D`zPEWDy>zE&UaI?u!3@TswD+&ga+o;a3^_Is-wQf+YvZXtZ!})lW0TSzBm} zzREnmf#5rs0AD4x5r+WdJ`ztSvq=~N@t5J~;CQ05D+Geb4%j#0oOGggaeTxS(Xb+@ zW9Mf5bP;NFutmk$9m=z;sAFWJmq(AVa_G=*H|xHn9R;h$YEow6dUr2#oo5UxXdX$ z?YlL9l5G>mt9aVVK-PniXmZCsMAVn_o5Ujk^if1Mk8={t>dxOdASw^hs~MXYsV~F^ zn29%raS%|pH#RwU9nyk#&=8qK109J48QhZoO;nE=q&CeT@Qh@QkyDxGCuMR(ji$ed zgzd0{aiT;pgP-F#2a!wR6x;6jSpO)y`J$EY!%IUbXYdk6X&kObBRm^Dyhi=eXQ+%ROj$nG9aQ1OlBued<); z<3Z+5*mf2Xy@f5urg7fVxOkgNz-*U8&bCV%Q0I!K7O*=$aPZDpfES^IRCMgEqjjY)w$)szYhnxyhauGlY|v}%RPrj z{Xrh^634l?kx592{gJDe=C546baAP;xO8FZ%Fg=-H;i~ut^Xw2N6AiizxQP5o4q(1 zk*#!W`|KU<&K~$m%pt61v_6@cJiqfyHtG@4g<}ugGf6pd_=f(C9*<9iW6$eK4sTX6%V>lv91KHID1UL*2#3mWvJux@0c4|!s&M6?H>>Fd?h*k%3biq9o3>Z! z2(XgFt+#6{JWsV6IC?`X?X3|#Mm4eZ-e#mKfI9wDv5otjfHECj0iI-q#-7ItU7lRy zQJ9{pc*ue1l}dAPx}sZ$NYHyeEy^vOElOv@Q~0QrCRKKa-1`Ezn|;9+mjyP-1YyOa zN{6IcyQzH(sH;A*Yl-l1+2x1EZdcaG3V*T~4sAvARbk`nf>{D`T> z@Q7L>18hrG1oo}yG`MfSp|)n#=8+%~`tX{Af>4umc6H54#yb$@MZNwmJOd?vQaHt*=;jyO9=85N^5cRLaF)N_%@0$bu*W;* zzg|Dq)BkjURZOqFKT&T$rvluJ{(lq7d_iD1M}{8ayff?NfEw@i1p^sr(^Wfhv8{)hl}^Hc`w7?Rr-WAE_CwUcFmm_05fc8Y)}x!7D16$ z1rdcf_7N`+XK8ldm~nmuG2RZ*sOmk8#!*WDoFsCWYa3Dh2m;uB#9QgV@LM>Cp`+V> zWg^bHLxL$6r8k~GZ00+BO_^k)P>g9-V=5Gl*T2Qksr|719I&QwgG4$u z32P~ClIUundM9L|L`ufrARaClH-z`Q2tdr>O0)STA=m=yRLdDpFBO}=@#Et41S^Gc zcRD9NF-f%tM2L_CKhL+s!4wpqTSQ2XxQvqe1MUIaa6kH64B>S&%@{my%zH{r!|XAQ zgz})8rlDKX!TGTyC>zR{?!oaj1C1`r{C6y^Ff{Lf8$bQ0e2oI=0SQac z1Ik5y8TrGB@cekQ(G1;U1pHW$pN5XTQX@p+xSpX%`aeqzrWCGmf$921HX?y+=Zrw0 zWEhGA+9)ci!Bp%J&TtM3v}R*@dcnkSzyoQWiT=$jCHvS+)MDg@A4G%u_%*C+=&vaLX_t$mT?M2A}KT`3r##J3yJyQnEEEWyxb3aD9daZr}loo7qGW16LtelMq zvj=%C<~2tps69$L{}d$tJ1tFsocr07Xt<%2Lh?YCZMMsB2#W<8B6oX&0}}s>Xwxq* z2VxAhqERZBKdN#YphR$irYPj-n%tvjoTnhdyI=>w1X4*5)fYI>@-RPjWaJaCUcP9b zKJ(-mYHbOJRkww@goUHyH(fJ?hjq%gfje;09{?NG2kqPm(L$`(8+YKgfv;rRc_)KI zl`?8F<0UdN0N&;$4m#W$1bB(GV&(MBu(liiQHc=9;Phgjav)Rk#YYo8m4gL^^atpv-7WY(rFV z$=qz6Bm4_t9ig{1OgcEcn+30Nz?vA?7wdGTU*_)H07Izw6+GULATZ#a4elBOMtZjk z(?BL9RtZTIHzRBgBnF;F&~w0{_+7PSlZE6pMzVW|k&Kcr@3_lP#Yp60HYHjBGDAU4$( zyO$vAIPgONAb!dWZ6_F!D+_>Q0u(uLED7KMl1$+)g5e}iLUqA|qc5RW`H>?g>va*2 z2ecP}M<8wpu7p*c>kmj-6-Y4<5m%eflcSoyktZia*FFG`fI;(W_-Ys~zzH&-iX_}Q zpA^q~yz%;?=X%#2iWe#j15YLp*LBg2_0D{>@Vu9;z7AWwTNPV8W=K?Kzl0I!LkO_< zgwg#wi2GI*)6Dwx0LJadaX0ZcUO;E?;ayH2WiOQ&kEg%@WI^~3;sUhJNQ7{unrQY= zpi5o8g%?9zAhMaA0b)Us?Yi2U3ik>~hD;Ks^xB3aB!l~8iTfnjPQne`mtFTZvRucR zGV=vx3_pOamx!-hs__m<{W{KI#&AoA{&6{+g*}NGH*^QLO~!HL2aLuGp>u3l^h@;U ziHiO%Ib61~Ls5(di~m2U0V3-yy@9N0*cW&M@eYU6SEOenu1V>dq84`tON4E17JD=qwTu?2%;$dNBi+* zyl_oWv)m+%9cF|U3K5X%4O9T;2vXotz}HBeSbCoE`>;2Y9TY1Mv1}ENJ6I*|DWI+3 z265;naP3Y&kDCx8abGSqVnXc#rk>}jsM(K5ao{(}n%Z?Z3{|&CAVE%@JIkR9WdGfc zLPY@^&P`y;9@Kq&fii@>D9SRU3FEOTnhWYK@}py2KTTW_hocJ>=$`V&qrUiA-~o<| zK0Nh>z<9*M2_r{&&ksaOpzJW5v z$M3fo`)vmQiow5TK>q;!Zy5X@g9{9RQk7UL^&c?yM-2WW12PDPIUc>Tbm?jjXRQB> zpM*t-a|C(55^D+cX&GjBR1%|*qrZ&cB|w#T8j)5Dc58c#=41B7Z)P55R9FOa^z-@1i=}j;ux+75=P4ShA zmBJ`){sEJTE2(fzeWmJ|qkYr(?>i1d8)cmE(7v6kzsTi5pUcK_#l_mXc<`^Zc{Q_fzB)Lvc zu8q;3;48tbXIDk==MSDW_kf<`f_X0?fRifrRyLW9jp5+Qm^A~J9sI-F0qg1blyy0A cnJG!08RS0zEl(N7r|MICr!G%_TfOkV0TtJ=o&W#< literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/packages.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/packages.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee04758171770528d0a368c08426a688d6745bc9 GIT binary patch literal 419 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 TPBC45x>}w6ud{!ye*OOg`(tO& literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/status_codes.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/status_codes.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dc6fa7150055e71c9508a6a8781e1e220c17b7e GIT binary patch literal 5239 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 F{|CBk7@YtB literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/requests/__pycache__/utils.cpython-34.pyc b/env/lib/python3.4/site-packages/requests/__pycache__/utils.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07135ea091d3727b70db6a273e0766f0c64bf369 GIT binary patch literal 22175 zcmch9du$z7df%D*CVBY~B~hX*OJmtGbtUpr4_mgWhb@zoEnB8!krL%=$=8>6hU6vh zOK0wt$ZN}+#BQ1evh5a4(`J*lK{vqeHt81V7D!t(4K{r(kf1G^CMjlHv}pg>7)4to z8=!!Ibo={#XJ$y=m7PsrvhVQBnKNh3ob!FZ?|J6GW&3;Ixc;?w5>=)Cv)cAAj`Az` zdB2L1qf`M$OF1!BwNwEGQ;w-ZEG)-WAs&_!s*niFNmWRO<&-L!*ZW0^eG3ANT_O7)v~IPRTj^as@kt=1FA4!&Qq#7sA@y1Fl5fts=7+$9a4ous&-fv4y&523bv{}r3z1(-g{K_h^jrU3QwE!UR8ZY)sCvdQFGp> zs?Vz0m@15^+A&o)rfNA=$f??KRXC0oWmPz#+yS*Vu0F=BPbfF7*77Vn18O~{^fxSL zP&q^D6I`8C&MxH)OZf>^N1NTs*(0YXm9tklBT_!4oPEmKubff!30Cj4at zJf)oD$~htBbIKW4&V-cDD<`jrq&%Y>bbUd}v&untFH8Bda?sZ$DZi%Ngj#!DIp}1XHSGL~ za&YggG4jNyPOIMYHtEjmum)=qi{-2XebIQ45W6tvXipBe`_HdXwJX zP^(d_ms*wkZqaM$N__=&gUyom+~R7h)ht#kUMn}?C-1czE!WSqbyY6<$)(Mf>-llq z2}?;?OkzOc-M^znq^toEG}&}OP=TVqL+5v^wYak@-T6Hvfp2+ zx7-z17h9W6+?1+##pdQ2fB*KIi*EgXMK|g-x8CwcwjQy)9(W;G#Hd(8K6M)5z2&qS}O7 ztdFQfE2Y+ZmHtRsmIWN2f2VG#+aJbN*87tBFrl*gFA(16QCx$pNRj>@Ce+3kcyZ?L z1N9L7Lb#*_8GlPT8TFx3>uIG??osnVL|k5jXuR^sHjn>TLE&Mg#g&d=WP zvv0Ruy?LutZM(A@e)`(H(1@S(nqYW8t=(p|RCfKCcKu|n)GDv~)|Fh!Ppme;2}kg_ z!Vp=3@38d>!Uf?g$VvDLegdr6`i9bzxb@NL$yTj7*{n1tmfDr7GqKTVEHzi0=O;sq z+A0WG<(r%SUgi*6Q7=WpVLAaPut?wkd(2=X0^nS8lkiwyxU? zy6ukJm1Ur#YjcKdZ?(~`I`)!l8$fZLd~dHE{F`2N%j+Idc4O1_0s^pCO1K*kWfKjg zr)@YQy?af!Tv@KT&Un-npq0-Irz0O-n9IfW9=rx#00+Km&eEJMSpjo6$zcu9av ze@kr+$yM}&&f~zey}-1%T1yD5eLz@y=iax}?G{idr2uT8Cm2W?fv5GW)__`$$pi5?%K|dvRo8oz{$m0%8ltCn z?me(>2i*zC=?7uMj6!+yjJyamOWfTfL*N3NM+qma4HDR!Z(5`POIeHeTGq~|H~DnV zuZ738tlM}b3BwErPxL-}s%RfjQatd8=s(a(fVa|esUj5URXVQS zFwD!xOo4?TxWL|VX~ime&XVia?FJwf4}#Luf=)w)$+eGF@@`&qp+>tU_lzx#*~`_^ zinPO+*esW~jgD2?w5yQZcB^5SquhXKD7U%>p0}@TDOUEG{K;|KYd4z>-NKWqRYHq) zYmNH^44?o<>FpR+o|s#$`U%f<*FPn;<#y>a_@iIo;YA$$Sf%0bxe1L-I(8ih3=K`I zQTJmF&rdFUtrCQR*D7+3`~+Xa&p^Ua&G7sLOL~;OP4O_sF4I@8i73(McowgfHlV#& z4L{pzv`SU3DOSZFDjRuNY&NLoH0m;*Zbt9Hz@Tg4o-#V~UcrGlpNf&o2dylAacc1FEORCeiWVp4(p(- z&8s9%nzu^Tgu7}WS0E;pp$@k z1S0f5S0BPkfMRCUqKu$0jKzMnHo!}`5wA4*ut#maMm|ILs3IGKztJiB!VsUfaAZ5( z#~G-@o(4Yk@!E%dYLpi-XI-2iUh2;fFvwthl{fT(Ya_5FaQU8*%4 zwp(U9xyIMZ^>ogKQi6;dF?Flm1k07$0r!^d73jfr8!EYxjiSEhMdyONNE&T+aE{9D zb(#f2e{-GWN0T3%eE5AVs+#hXC9hnmXs)|Hk3(*^ev{>^IQV^YvkNz-iPljb^Ftz>d*CpoWGbQV*vj!Q+} z+cxrEdHJG@)>;NuHptViJsUnSS%CIT8UUT0d)(i)JQCD?FB=QSR>Z%IO^iNEl~S5@yi*f z2o?@|7llZDptTUEkO2JaMUlN0xr=JWqKJ#Q8UcHE%g)NUraRc$f&EicBEXWAzuN6okG!WU+)Gl7G1^EIQTN1@`OKr>BH|r2MkT~X! zdZYE2yS#RJbsS~8Dxb6P#V*D+(+k8Sm4j3RQ{lwEi6{b?Nc@$-Np%= z8}JU4*P|gkzVi=c#8YO(54Rri`2&_tr!-v*Q}(u|Qa{%@fhFR6Ln>1HFsr%EGsA1A zCj>;jTv`j^5|VTe4t`>((Wv@y=;VIy)|=`+T!XTml=tgKh+X2K*uEIwMRSjxsv*L` z6V$q!ID0%DySVayK*w@3s2K_~vEg0z1%>%zh-Z;Dk$jv7q5t&%Z9>1YjV-o_*{0V? zv_=Xm?{i5Rmdf_I`y3MOCh;BQ)!of!5!auplg}srKLw=)_H9VEoSy$3dhP9^R}DQ( zX=q|f1JWQY%Z+LkxDA!j^V4sYnoX#pVk-IxaRger!N&A6m;JC4|R^WpeJLVL71&ULlYFY?(K#yNKZqm6vJ3Vw-LGn9@Fgc z%Fq;mPfMHjjmy*a>62$)gg;5<#y%aa2aE`KF`;m@t0fpTD0?)KYPHgY=i&^uw-faF zfbItom~Pdj^U?!-%NkOM3cc50yHx7sY8$vCE>vg2z^9kD?MpkW@D#W}f1tHApqfFcs#Z7c z(lX3Jc~MYCI17+YB`;|3prPS?sa7Bir|8(8dS7M*-h@_hRa~m?+iPvgMf$qMEn$X$ zmj}JMC2iN*)mDW{YO7M?U?54$Pz4}Hjn|ewbC{eWLN!dZU>FOS$3PkyIf6DNygu$P zX~&)_SK)h}dY@DMejpAhSIqEO8;tMRSgWz_*2nE5!3;`oM*&u>SJFOk;)58!h8d=Oz1hdEBqgX4j6D8ZwK7O;{a@b1794L#Y2P}~_eC(3nbgbF;PDsEhY+8+kkSg@DAxuV;wk*w}KTap8zC z$a2M7Ju(gs))$Td_#VKk5z;!@gL=|2Cr5^32l8}!WTn6c9;_?ZIp*YrmyhL)9tJUq z9?2y^pJTakTOP~0=)q7l4c|Zy02csuaH-x1riHGT66cAEaOjtLf38t?f0%)Hyd4z+ zM$h0eGQ=4$uL$+7D^oT*eE6fYFQ4@O{}c9Q&jD(D2K&mhW$Hs!fHhL_$hu%SShv9% z+j&^uX9Z1UO*xxO7$LsNiVhEtGpqs*W%mJ_pCpIwL3=eq4$WG;_$t9=zvZ$N+u?)^|YL`#G~5 z;$d_ekV&)x0_29w!R-bS3B~X(*bgY%mNdeD=v<^}soZK)fXY%CCn>3$&)O2CQ#-(& zdcpSL8oNkF7gC2YVj$tATk+W#Ck#noPFyjFX5D#Y-NB#jxNhkjTI6B|s{0UV4K3&{ zq!x;q=gNyck~y9nNB@n)FRAHyI0<2-a(40}tCBM)Vu$&3MW_W|dQ*r77| z6C5M@B5g(VMKr^#86j>wT9)xwQRRoz29Y6piY-_ZLA|(qx9Y{WgXj_9gtmc+ornG$ zl4n@n2PwXF0#l(=4VOp!17KZ4SAi2Xh>iq0ch}OG$jKB83i^daZQDkrJNq-!+xaCJ z7-7`bL@DS^jGCI%hVY@GfD9D(ynPt}Bi@xt-MCl5PB2ms9uZ~QSR+owE4Mx7h1mGN z;(2huJbn7~*|T~3nBZLykO+gWjXJFWqo_CFkIm;gPo1y9jh8?Ea(R^+PV2(ENA8T> zJ$@{I;^iER7w;n2fq0GAIT5uqlM%E$7u~t-p3XDxoxk()My-mD!#Donp5cNa=;#?7 z{NWiFMghFPc$-BNM?u&T7t*lFnuy`(aXDLN_C~de&{-%={FDHj*S%z;+n3BR zPH_KMq7_RI#!~RN?L{n$@htt9xnhDxD9~?A3@YR2{TvRMW3ys(ALrD@Zm!|X-M&EB z-LmeDAcY0%5v?GaV|@%teXJ}1&&COJ)68FDhNHJS&*Vhp+x!=7O zhp>bgUD31ze|b$foZMo&Ug1OkHWy?+2ZnGXQ%&ds?MFl;1*H@55KDg**P?}q<0M)b zny#1w*nn6b%rw@66 zal~o6=ctbpTQpsMn-e0oG3XO$f=SqIAy29cPne7{ji2||aOjqh#=8a?NT4w!CT|Fx zXLApO8?1-ilL*oL;ynk^MH60qpW#&!J3^|)b@mRf-p1T*9@ueXK-e)0LCjIy-Xqc3 zpOf3AbCY-m`kl`uJO3$!BkH+h`7%h;6@SjMOFc7Q)dx7v^VP@7@8EU=LLu=-_U->~@vZ*~s71_yxm@p-Fx5ZFY9b)w`k*I z5>nM0tm;_+rpr0JKYyJygP?QQ*-};X&-4B+El@D|v9s};r1*olMP-c?O~r}Lacd8N zU~fEb9l&4x%eY>6?$WE%Gqaapd;Q8AZ(e;ytR1yokD4;?6}J-tCh9& zYOUUA-qT*IegDD6W~Vc7^3>@w&pm(kg%@9%$QM6~!;T|ZX z!d{RBi}fSmACtBD74i>Q5rB_YBj^eNNRz>dTanoWIseZnH831`JoMVMJbs_4Ie+iJ z5)y;UQ6&uT$5k%Ef?h*Pgo*nii{R@w>l1K>mzpm4VADp*NEw14tO}FF#GPESZ{E0K z9J}-&w~;Uj>jNHI;RZ6C;g%p*2a4!@$|i7B*btd`2tcgBpeE1Ji+yQ+`pOlfGY2ub z(BIq5ZI7&@#`p#8m^6e>sfTrr1_`~NHFN|Jk9uQsz5@A69zjx<>c~PSWc%p~oCEcC z4VuWR-inmyeY`kubMD40@;z_O&J^co7yQIpqf*Z$nN(2mlh8w2o^Mrr3+bKZZrUFX zeW+Wr^hYH61L#<#2Cai2^+O=|Q4&0qk;70+MlAjJaWx{=I8GQ^6k@%G0wteNC&U!N z8DaoyY_txsa-cE*oJm|JmF*27E}?RxQnG=`Au%ZZD>qydNT7QzuyU}-A*3?(EA&vq z&FCSOduKzO=|+2H73&Fl5a-3D9PRREnJ)f@&;~sFZBR@Q6QC0ix$QJG==+Cm0G}y{ z4i$3mXHh_B&r?r7bM)DsbC0RlVk0h};7L1aA8g8v8iwXKc44JnhC zfb&Lq9p*_7@*-PBsMYl#1IcN$;0$NJPp#yw3tr&%Sf%O5QHLE3O*lTZpT>z45=#|e z1W(ys3Y@NPsv2fvB!m=^VT879a)iW1p{z28p%0$0p0@OF;w%CO+AWdKgn}2~U^Fxk z)&7ep?!QD2iBJUKz}Sz(eUU;`(SCf|gc-1P1*0>X(&WYlQz8)&`@_4Gcya0INu=Q`?;3vfnLtaRau?mWnX4hc-L3m~>&HK+40|GeD zfy=5V;)st8!8p?Y8hu5>=OjgTz^~v0qmJ|!tU35u|B~8#G7t=S35*>OL43g<5QNz= z0-rq67DYS&ZGs&m(rg_gC{sV6Mw4KmfekhfQImn+jn9iZO-iRoV*WZLj^uE%*I$$= zW3Q;cT^Br?r=tRf>n)kNTi88edljNYfG#kqD1gcp2idrW{9qi^8%2}nf4`(F+}jbF z2|;W#;%EJjFcm^Um$7LDMK1FKSTl(@dc9=?yF^G})~KyD(*FvlAg6&~g#zZ&|B|h` zwAp^F6QNN?Aki1R##-jO|>w=DV{0OWA*Q?oP~ZpAG+zHm=2?6~zd zi5Pne{snfN$XsvRAc1(CnO}Phwb(CKbH~X3%oS_9V}^I3% ztIoIpIo6NfOb<>7O8V}$Fqv_I$=^Z(Z15+HAXsdK4uf$}Z(uNQ+;$oa(O~!73Pn6~ z3jK7@oBlG+a)|;w9p+6W22$vkS1CeCh3@D0J&mekLWkYU+{a9Ypsykqc@O$inJgsy zFcvnBWu~8^Kc@dJ>Z9fD!AZoJ5b*&Ve`uI3kU)R_CB=;xOg=NykU^8DfFiw2%tk(TkQ{vz=xaIsOxreT z(U`%vZzC^TFIyZiE@2B<=c>?D=y5_>bJ~riF+Pd zex2Y7!@y?}flx~;AUr&$Zb|?*LWv9v&1w&<;<`BK(U^JZ}C`a?xJqx>y zUtRX(%Cv$CzsWhES))?Jka+s{QHtIw^rOpL{S92f%QSm}h;f8-v~|Kn9U|g1n~||Z zQ8i`gEWj6l#k{En>+dr+$sf=!&_p`fho&nDVk{;P__=Y6a&hLa9c*nye{`dC_z>XR zD4JZq*HQSN+eN4f|E+nX?IAjfG#lAi2pvRZ7`6|{?m%^xfCp#&W@E3TK!DRax-a`RyKqqCo%cW$6{d6#baHBVjlV0hYIkwodBxMH3xSJbQ z-PDlvWSR_r{R5K0K|B>wv*tEq6R%9$gt;(Qo%r#|<9^E2c6!%cw>bf|_P*=)!XB)f z6j)5WbkhmDftodfcavAgPRkurCX;s(b^c&DZ$a$s-*eK8Jww760ygUZfriogQ*C0u zvi{#kVMTKO$i^|X@gD>EiWvk^010O9{ua4>^C0<~juZg_T(|>g2>>7oE#h$G{aT_S zLIpXgV&)zoYL#C(m4~^<#Zvi^sh2My% zR_g0PmXO)=OeMeoyX>31itAJMd49@aYBHbCPa+@!(qC)3D;Lj!OR5*7;+*99AtSH` zTAt+9BjdqMau>rO+i&9eIR4FthxugW_jj)GGsPtdtfkB2`k4aWa@|8WmKM2TBW7qf&1=M%b&CjAOv(*uLqzkqL z*X?6~YFOqk%<_^hxr@`Yakt8(urX^ClKCJc_Hb+jj#uM|O~vfku9#+Az=x(Zhrg0! z^(mnuqFJ6qa{CYv3~vU41(8ZnK*TpN07S!MOjKD&pK&pyA%WP|1Q2*#vg0(qpu#US zn2RRiloyTjFBx{xpb@}Uh~yz;05Ual6vRn|{m&6lC@g_6JpVn)J3bBnqfaCeKn3T8 zUnLsJ)A0RzT7{+>bbH-WwQCHM}-`|0=avhhB23723`+nR@Owcw40Ku_Lr z^sLfDi2f!J5=dA_@WUQm9J6vhYNZh*7{U1nO1d9&6=__Q`*bu<<-I@gJ+F{%$Xdp;u!b;!H; z1k4ecby0m$!xcaocBDm?$HFbv4~c6Hc6(qE&xv>>CdDtWfQt5;@M858Tn+5t(C{>2dr_GPqzp=KPy@ zO;b*p`R98>)eJiGGhuJKz?QV+pjOcIkgOiaJ3qlqwB1v`i#7-^n2r83UN8)FkY_~)5fcQ<Ws-7gyGLo6 z1w;DaC^FWLdJnOq2pf*D@0MOCN^UyV@UqiAlorV0!%jE!mI7h&)L8%&w#Zg8|>B2j}d5+_kA zu_%a%binx%sttg9P52*9T!D8cd7#N{d=rexAL0Z>9iBjU#PVCnIFqgSb`v=VNI^20 zN-bo3gF}%73rvPI#O^n2PXvpHUjmV}^4Mx?FFL-KBAd~e01OX&h2KjtLRdaCGS@kG zscwrS&2E(C(<1mbopI*lTUdf1fjw$3;d^M};E4L^oVY1p-D0@Fd^Zh$%(r5GxG`98 z71PUY)Xt`GV_~4k^46D3cHz2w*+D*tq8VXy zw)6{%4tA<0_DZ_NE=Yf%k*^kk&X_dc=7nG9VVVa#*vLXn8B-WUXcw!9EKI0;_=2FO$ACGQ zHG&0wW@Z-;S=`7@TE-?TtB)npr#S137nD-Yd{99qY?!CJc_5lF?OFCjNS?mm3pfm% z2x7zY%N+Cw0Lwi|iZG}qpQ7P>>uc;IDLY#I5#(N7x_Nb>IDM)3>dm>CtFy)Hmlj@! zn!AadjhcKMOFkJT--eN|SI9RRWJ9~`2$oHLvVTZ6mB@YxN&lCOX_JEXRX+A>Jp3}B z-2` 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) ` 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 ` 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 dict((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 `. + + :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 `. + + :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 `. + + :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 = 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: {0}".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: {0}".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: {0}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`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 ` + + :param req: The :class:`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 `. + + :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_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 `. + + :param request: The :class:`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 `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`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 `. + + :param proxies: 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 ` 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) ` 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 + """ + + conn = self.get_connection(request.url, proxies) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request) + + 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 {0}. 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+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/env/lib/python3.4/site-packages/requests/api.py b/env/lib/python3.4/site-packages/requests/api.py new file mode 100644 index 0000000..bc2115c --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/api.py @@ -0,0 +1,152 @@ +# -*- 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 `. + + :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 or list of tuples ``[(key, value)]`` (will be form-encoded), 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 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) ` 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 ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + + """ + + # 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 or bytes to be sent in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`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 ` 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 ` 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 (will be form-encoded), 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 ` 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 (will be form-encoded), 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 ` 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 (will be form-encoded), 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 ` 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 ` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/env/lib/python3.4/site-packages/requests/auth.py b/env/lib/python3.4/site-packages/requests/auth.py new file mode 100644 index 0000000..1a182df --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/auth.py @@ -0,0 +1,293 @@ +# -*- 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 ({0!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 ({0!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 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/env/lib/python3.4/site-packages/requests/certs.py b/env/lib/python3.4/site-packages/requests/certs.py new file mode 100644 index 0000000..d1a378d --- /dev/null +++ b/env/lib/python3.4/site-packages/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 certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/env/lib/python3.4/site-packages/requests/compat.py b/env/lib/python3.4/site-packages/requests/compat.py new file mode 100644 index 0000000..f417cfd --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/compat.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +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) + +try: + import simplejson as json +except ImportError: + 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 urllib3.packages.ordered_dict import 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 + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/env/lib/python3.4/site-packages/requests/cookies.py b/env/lib/python3.4/site-packages/requests/cookies.py new file mode 100644 index 0000000..ab3c88b --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/cookies.py @@ -0,0 +1,542 @@ +# -*- 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 +import collections + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel + +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, collections.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.update(self) + return new_cj + + +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 = dict( + 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. + """ + 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. + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/env/lib/python3.4/site-packages/requests/exceptions.py b/env/lib/python3.4/site-packages/requests/exceptions.py new file mode 100644 index 0000000..be7eaed --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/exceptions.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from 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 ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/env/lib/python3.4/site-packages/requests/help.py b/env/lib/python3.4/site-packages/requests/help.py new file mode 100644 index 0000000..5440ee6 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/help.py @@ -0,0 +1,120 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from .packages.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__', ''), + } + + # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. + system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/env/lib/python3.4/site-packages/requests/hooks.py b/env/lib/python3.4/site-packages/requests/hooks.py new file mode 100644 index 0000000..32b32de --- /dev/null +++ b/env/lib/python3.4/site-packages/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 dict((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 dict() + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/env/lib/python3.4/site-packages/requests/models.py b/env/lib/python3.4/site-packages/requests/models.py new file mode 100644 index 0000000..4041cac --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/models.py @@ -0,0 +1,948 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +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 urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from 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 ( + 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 + else: + fdata = fp.read() + + 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, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.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 ` object. + + Used to prepare a :class:`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 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: dictionary of URL parameters to append to the URL. + :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', 'http://httpbin.org/get') + >>> req.prepare() + + """ + + 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 '' % (self.method) + + def prepare(self): + """Constructs a :class:`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 ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + 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 '' % (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): + 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, collections.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 ` 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 ` 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 ` 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 ` 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 dict( + (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 '' % (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. + + 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=None, 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 = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/env/lib/python3.4/site-packages/requests/packages.py b/env/lib/python3.4/site-packages/requests/packages.py new file mode 100644 index 0000000..7232fe0 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/packages.py @@ -0,0 +1,14 @@ +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'): + locals()[package] = __import__(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 == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/env/lib/python3.4/site-packages/requests/sessions.py b/env/lib/python3.4/site-packages/requests/sessions.py new file mode 100644 index 0000000..6570e73 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/sessions.py @@ -0,0 +1,737 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import platform +import time +from collections import Mapping +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse +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 +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 platform.system() == 'Windows': + try: # Python 3.3+ + 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 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) + 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) + + # The scheme should be lower case... + parsed = urlparse(url) + 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: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + 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 + + # http://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('http://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('http://httpbin.org/get') + + """ + + __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 ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`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 `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`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 `, 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 ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`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 `, prepares it and sends it. + Returns :class:`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, 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) ` 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, 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, 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, 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): + 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 = dict((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. + + :rtype: Session + """ + + return Session() diff --git a/env/lib/python3.4/site-packages/requests/status_codes.py b/env/lib/python3.4/site-packages/requests/status_codes.py new file mode 100644 index 0000000..dee8919 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/status_codes.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +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') + +for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) diff --git a/env/lib/python3.4/site-packages/requests/structures.py b/env/lib/python3.4/site-packages/requests/structures.py new file mode 100644 index 0000000..05d2b3f --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/structures.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +import collections + +from .compat import OrderedDict + + +class CaseInsensitiveDict(collections.MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``collections.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, collections.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 '' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/env/lib/python3.4/site-packages/requests/utils.py b/env/lib/python3.4/site-packages/requests/utils.py new file mode 100644 index 0000000..5c47de9 --- /dev/null +++ b/env/lib/python3.4/site-packages/requests/utils.py @@ -0,0 +1,904 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import cgi +import codecs +import collections +import contextlib +import io +import os +import platform +import re +import socket +import struct +import warnings + +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) +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() + + +if platform.system() == 'Windows': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + if is_py3: + import winreg + else: + import _winreg as winreg + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + 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 + # '' 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 == '': + 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('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://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 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: need more than 1 value to unpack + >>> 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, collections.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']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +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 = cgi.parse_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 + """ + 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') + netloc = urlparse(url).netloc + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + ip = netloc.split(':')[0] + if is_ipv4_address(ip): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(ip, proxy_ip): + return True + elif ip == 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: + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + with set_environ('no_proxy', no_proxy_arg): + try: + bypass = proxy_bypass(netloc) + 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 dict of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..da1bc47 --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/DESCRIPTION.rst @@ -0,0 +1,43 @@ +[![Build Status](https://travis-ci.org/bboe/update_checker.png)](https://travis-ci.org/bboe/update_checker) + +# update_checker + +A python module that will check for package updates. + +Only whitelisted packages can be checked for updates. Contact update_checker's +author for information on adding a package to the whitelist. + +### Installation + +The update_checker module can be installed via: + + pip install update_checker + +### Usage + +To simply output when there is a newer version of the `praw` package, you can +use the following bit of code: + +```python +from update_checker import update_check +update_check('praw', '0.0.1') +``` + +If you need more control, such as performing operations conditionally when +there is an update you can use the following approach: + +```python +from update_checker import UpdateChecker +checker = UpdateChecker() +result = checker.check('praw', '0.0.1') +if result: # result is None when an update was not found or a failure occured + # result is a UpdateResult object that contains the following attributes: + # * available_version + # * package_name + # * running_version + # * release_date (is None if the information isn't available) + print(result) + # Conditionally perform other actions +``` + + diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/INSTALLER b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/METADATA b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/METADATA new file mode 100644 index 0000000..9acb174 --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/METADATA @@ -0,0 +1,63 @@ +Metadata-Version: 2.0 +Name: update-checker +Version: 0.16 +Summary: A python module that will check for package updates. +Home-page: https://github.com/bboe/update_checker +Author: Bryce Boe +Author-email: bbzbryce@gmail.com +License: Simplified BSD License +Platform: UNKNOWN +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Requires-Dist: requests (>=2.3.0) + +[![Build Status](https://travis-ci.org/bboe/update_checker.png)](https://travis-ci.org/bboe/update_checker) + +# update_checker + +A python module that will check for package updates. + +Only whitelisted packages can be checked for updates. Contact update_checker's +author for information on adding a package to the whitelist. + +### Installation + +The update_checker module can be installed via: + + pip install update_checker + +### Usage + +To simply output when there is a newer version of the `praw` package, you can +use the following bit of code: + +```python +from update_checker import update_check +update_check('praw', '0.0.1') +``` + +If you need more control, such as performing operations conditionally when +there is an update you can use the following approach: + +```python +from update_checker import UpdateChecker +checker = UpdateChecker() +result = checker.check('praw', '0.0.1') +if result: # result is None when an update was not found or a failure occured + # result is a UpdateResult object that contains the following attributes: + # * available_version + # * package_name + # * running_version + # * release_date (is None if the information isn't available) + print(result) + # Conditionally perform other actions +``` + + diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/RECORD b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/RECORD new file mode 100644 index 0000000..706694e --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/RECORD @@ -0,0 +1,11 @@ +update_checker.py,sha256=PvVMSlyMa3XWue1l1-_nG3e_leFQe0n4G7E3UOMixGw,9367 +update_checker_test.py,sha256=NEAj_peQV6y-Tfv9uF3j0_fSPL4ThsdCpG0wfwURdR0,2848 +update_checker-0.16.dist-info/DESCRIPTION.rst,sha256=IthinrvroBWJck3eXVJM8pEtVti2BNwNXjVs5QZrZ40,1228 +update_checker-0.16.dist-info/METADATA,sha256=4Lcomh5FWzU0wS3g8gezRZ7kI3wLdfqk0xoAHj6ZCBY,1966 +update_checker-0.16.dist-info/RECORD,, +update_checker-0.16.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +update_checker-0.16.dist-info/metadata.json,sha256=wphiRaz24qnZfdstYjQQFzONg4-f6o_-vQTi3KDsy5U,899 +update_checker-0.16.dist-info/top_level.txt,sha256=v2qENVN-klKjtYpEJDzFt7tHDq7ALuBw1hYg7n6Xrk0,35 +update_checker-0.16.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +__pycache__/update_checker_test.cpython-34.pyc,, +__pycache__/update_checker.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/WHEEL b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/metadata.json b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/metadata.json new file mode 100644 index 0000000..f7b619c --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5"], "extensions": {"python.details": {"contacts": [{"email": "bbzbryce@gmail.com", "name": "Bryce Boe", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/bboe/update_checker"}}}, "extras": [], "generator": "bdist_wheel (0.30.0.a0)", "license": "Simplified BSD License", "metadata_version": "2.0", "name": "update-checker", "run_requires": [{"requires": ["requests (>=2.3.0)"]}], "summary": "A python module that will check for package updates.", "version": "0.16"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/top_level.txt b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/top_level.txt new file mode 100644 index 0000000..23cb7e6 --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker-0.16.dist-info/top_level.txt @@ -0,0 +1,2 @@ +update_checker +update_checker_test diff --git a/env/lib/python3.4/site-packages/update_checker.py b/env/lib/python3.4/site-packages/update_checker.py new file mode 100644 index 0000000..6c83bcc --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python + +"""Module that checks if there is an updated version of a package available.""" + +from __future__ import print_function +import json +import os +import pickle +import platform +import re +import requests +import sys +import time +from datetime import datetime +from functools import wraps +from requests.status_codes import codes +from tempfile import gettempdir + +__version__ = '0.16' + + +# http://bugs.python.org/issue7980 +datetime.strptime('', '') + + +def cache_results(function): + """Return decorated function that caches the results.""" + def save_to_permacache(): + """Save the in-memory cache data to the permacache. + + There is a race condition here between two processes updating at the + same time. It's perfectly acceptable to lose and/or corrupt the + permacache information as each process's in-memory cache will remain + in-tact. + + """ + update_from_permacache() + try: + with open(filename, 'wb') as fp: + pickle.dump(cache, fp, pickle.HIGHEST_PROTOCOL) + except IOError: + pass # Ignore permacache saving exceptions + + def update_from_permacache(): + """Attempt to update newer items from the permacache.""" + try: + with open(filename, 'rb') as fp: + permacache = pickle.load(fp) + except Exception: # TODO: Handle specific exceptions + return # It's okay if it cannot load + for key, value in permacache.items(): + if key not in cache or value[0] > cache[key][0]: + cache[key] = value + + cache = {} + cache_expire_time = 3600 + try: + filename = os.path.join(gettempdir(), 'update_checker_cache.pkl') + update_from_permacache() + except NotImplementedError: + filename = None + + @wraps(function) + def wrapped(obj, package_name, package_version, **extra_data): + """Return cached results if available.""" + now = time.time() + key = (package_name, package_version) + if not obj.bypass_cache and key in cache: # Check the in-memory cache + cache_time, retval = cache[key] + if now - cache_time < cache_expire_time: + return retval + retval = function(obj, package_name, package_version, **extra_data) + cache[key] = now, retval + if filename: + save_to_permacache() + return retval + return wrapped + + +# This class must be defined before UpdateChecker in order to unpickle objects +# of this type +class UpdateResult(object): + + """Contains the information for a package that has an update.""" + + def __init__(self, package, running, available, release_date): + """Initialize an UpdateResult instance.""" + self.available_version = available + self.package_name = package + self.running_version = running + if release_date: + self.release_date = datetime.strptime(release_date, + '%Y-%m-%dT%H:%M:%S') + else: + self.release_date = None + + def __str__(self): + """Return a printable UpdateResult string.""" + retval = ('Version {0} of {1} is outdated. Version {2} ' + .format(self.running_version, self.package_name, + self.available_version)) + if self.release_date: + retval += 'was released {0}.'.format( + pretty_date(self.release_date)) + else: + retval += 'is available.' + return retval + + +class UpdateChecker(object): + + """A class to check for package updates.""" + + def __init__(self, url=None): + """Store the URL to use for checking.""" + self.bypass_cache = False + self.url = url if url \ + else 'http://updatechecker.bryceboe.com/check' + + @cache_results + def check(self, package_name, package_version, **extra_data): + """Return a UpdateResult object if there is a newer version.""" + data = extra_data + data['package_name'] = package_name + data['package_version'] = package_version + data['python_version'] = sys.version.split()[0] + data['platform'] = platform.platform(True) or 'Unspecified' + + try: + headers = {'connection': 'close', + 'content-type': 'application/json'} + response = requests.put(self.url, json.dumps(data), timeout=1, + headers=headers) + if response.status_code == codes.UNPROCESSABLE_ENTITY: + return 'update_checker does not support {!r}'.format( + package_name) + data = response.json() + except (requests.exceptions.RequestException, ValueError): + return None + + if not data or not data.get('success') \ + or (parse_version(package_version) >= + parse_version(data['data']['version'])): + return None + + return UpdateResult(package_name, running=package_version, + available=data['data']['version'], + release_date=data['data']['upload_time']) + + +def pretty_date(the_datetime): + """Attempt to return a human-readable time delta string.""" + # Source modified from + # http://stackoverflow.com/a/5164027/176978 + diff = datetime.utcnow() - the_datetime + if diff.days > 7 or diff.days < 0: + return the_datetime.strftime('%A %B %d, %Y') + elif diff.days == 1: + return '1 day ago' + elif diff.days > 1: + return '{0} days ago'.format(diff.days) + elif diff.seconds <= 1: + return 'just now' + elif diff.seconds < 60: + return '{0} seconds ago'.format(diff.seconds) + elif diff.seconds < 120: + return '1 minute ago' + elif diff.seconds < 3600: + return '{0} minutes ago'.format(int(round(diff.seconds / 60))) + elif diff.seconds < 7200: + return '1 hour ago' + else: + return '{0} hours ago'.format(int(round(diff.seconds / 3600))) + + +def update_check(package_name, package_version, bypass_cache=False, url=None, + **extra_data): + """Convenience method that outputs to stdout if an update is available.""" + checker = UpdateChecker(url) + checker.bypass_cache = bypass_cache + result = checker.check(package_name, package_version, **extra_data) + if result: + print(result) + + +# The following section of code is taken from setuptools pkg_resources.py (PSF +# license). Unfortunately importing pkg_resources to directly use the +# parse_version function results in some undesired side effects. + +component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) +replace = {'pre': 'c', 'preview': 'c', '-': 'final-', 'rc': 'c', + 'dev': '@'}.get + + +def _parse_version_parts(s): + for part in component_re.split(s): + part = replace(part, part) + if not part or part == '.': + continue + if part[:1] in '0123456789': + yield part.zfill(8) # pad for numeric comparison + else: + yield '*'+part + + yield '*final' # ensure that alpha/beta/candidate are before final + + +def parse_version(s): + """Convert a version string to a chronologically-sortable key. + + This is a rough cross between distutils' StrictVersion and LooseVersion; + if you give it versions that would work with StrictVersion, then it behaves + the same; otherwise it acts like a slightly-smarter LooseVersion. It is + *possible* to create pathological version coding schemes that will fool + this parser, but they should be very rare in practice. + + The returned value will be a tuple of strings. Numeric portions of the + version are padded to 8 digits so they will compare numerically, but + without relying on how numbers compare relative to strings. Dots are + dropped, but dashes are retained. Trailing zeros between alpha segments + or dashes are suppressed, so that e.g. "2.4.0" is considered the same as + "2.4". Alphanumeric parts are lower-cased. + + The algorithm assumes that strings like "-" and any alpha string that + alphabetically follows "final" represents a "patch level". So, "2.4-1" + is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is + considered newer than "2.4-1", which in turn is newer than "2.4". + + Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that + come before "final" alphabetically) are assumed to be pre-release versions, + so that the version "2.4" is considered newer than "2.4a1". + + Finally, to handle miscellaneous cases, the strings "pre", "preview", and + "rc" are treated as if they were "c", i.e. as though they were release + candidates, and therefore are not as new as a version string that does not + contain them, and "dev" is replaced with an '@' so that it sorts lower than + than any other pre-release tag. + + """ + parts = [] + for part in _parse_version_parts(s.lower()): + if part.startswith('*'): + if part < '*final': # remove '-' before a prerelease tag + while parts and parts[-1] == '*final-': + parts.pop() + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == '00000000': + parts.pop() + parts.append(part) + return tuple(parts) diff --git a/env/lib/python3.4/site-packages/update_checker_test.py b/env/lib/python3.4/site-packages/update_checker_test.py new file mode 100644 index 0000000..3724588 --- /dev/null +++ b/env/lib/python3.4/site-packages/update_checker_test.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +import sys +import unittest +try: + from StringIO import StringIO +except ImportError: + from io import StringIO # NOQA +from update_checker import UpdateChecker, update_check + + +class UpdateCheckerTest(unittest.TestCase): + TRACKED_PACKAGE = 'praw' + UNTRACKED_PACKAGE = 'requests' + + def test_checker_check__bad_url(self): + checker = UpdateChecker('http://sdlkjsldfkjsdlkfj.com') + checker.bypass_cache = True + self.assertFalse(checker.check(self.TRACKED_PACKAGE, '0.0.1')) + + def test_checker_check__no_update_to_beta_version(self): + checker = UpdateChecker() + checker.bypass_cache = True + self.assertFalse(checker.check(self.TRACKED_PACKAGE, '3.6')) + + def test_check_check__untracked_package(self): + checker = UpdateChecker() + checker.bypass_cache = True + self.assertEqual("update_checker does not support 'requests'", + checker.check(self.UNTRACKED_PACKAGE, '0.0.1')) + + def test_checker_check__update_to_beta_version_from_beta_version(self): + checker = UpdateChecker() + checker.bypass_cache = True + self.assertTrue(checker.check(self.TRACKED_PACKAGE, '4.0.0b4')) + + def test_checker_check__update_to_rc_version_from_beta_version(self): + checker = UpdateChecker() + checker.bypass_cache = True + self.assertTrue(checker.check(self.TRACKED_PACKAGE, '4.0.0b4')) + + def test_checker_check__successful(self): + checker = UpdateChecker() + checker.bypass_cache = True + result = checker.check(self.TRACKED_PACKAGE, '1.0.0') + self.assertTrue(result is not None) + + def test_update_check__successful(self): + prev_stdout = sys.stdout + sys.stdout = StringIO() + try: + update_check(self.TRACKED_PACKAGE, '0.0.1', bypass_cache=True) + finally: + result = sys.stdout + sys.stdout = prev_stdout + self.assertTrue(len(result.getvalue()) > 0) + + def test_update_check__unsuccessful(self): + prev_stdout = sys.stdout + sys.stdout = StringIO() + try: + update_check(self.TRACKED_PACKAGE, '0.0.1', bypass_cache=True, + url='http://sdlkjsldfkjsdlkfj.com') + finally: + result = sys.stdout + sys.stdout = prev_stdout + self.assertTrue(len(result.getvalue()) == 0) + + def test_update_check__untracked_package(self): + prev_stdout = sys.stdout + sys.stdout = StringIO() + try: + update_check(self.UNTRACKED_PACKAGE, '0.0.1', bypass_cache=True) + finally: + result = sys.stdout + sys.stdout = prev_stdout + self.assertEqual("update_checker does not support 'requests'\n", + result.getvalue()) + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/DESCRIPTION.rst b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..59b3b6c --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/DESCRIPTION.rst @@ -0,0 +1,995 @@ +urllib3 +======= + +.. image:: https://travis-ci.org/shazow/urllib3.svg?branch=master + :alt: Build status on Travis + :target: https://travis-ci.org/shazow/urllib3 + +.. image:: https://img.shields.io/appveyor/ci/shazow/urllib3/master.svg + :alt: Build status on AppVeyor + :target: https://ci.appveyor.com/project/shazow/urllib3 + +.. image:: https://readthedocs.org/projects/urllib3/badge/?version=latest + :alt: Documentation Status + :target: https://urllib3.readthedocs.io/en/latest/ + +.. image:: https://img.shields.io/codecov/c/github/shazow/urllib3.svg + :alt: Coverage Status + :target: https://codecov.io/gh/shazow/urllib3 + +.. image:: https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400 + :alt: PyPI version + :target: https://pypi.python.org/pypi/urllib3 + +.. image:: https://www.bountysource.com/badge/tracker?tracker_id=192525 + :alt: Bountysource + :target: https://www.bountysource.com/trackers/192525-urllib3?utm_source=192525&utm_medium=shield&utm_campaign=TRACKER_BADGE + +urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the +Python ecosystem already uses urllib3 and you should too. +urllib3 brings many critical features that are missing from the Python +standard libraries: + +- Thread safety. +- Connection pooling. +- Client-side SSL/TLS verification. +- File uploads with multipart encoding. +- Helpers for retrying requests and dealing with HTTP redirects. +- Support for gzip and deflate encoding. +- Proxy support for HTTP and SOCKS. +- 100% test coverage. + +urllib3 is powerful and easy to use:: + + >>> import urllib3 + >>> http = urllib3.PoolManager() + >>> r = http.request('GET', 'http://httpbin.org/robots.txt') + >>> r.status + 200 + >>> r.data + 'User-agent: *\nDisallow: /deny\n' + +Installing +---------- + +urllib3 can be installed with `pip `_:: + + $ pip install urllib3 + +Alternatively, you can grab the latest source code from `GitHub `_:: + + $ git clone git://github.com/shazow/urllib3.git + $ python setup.py install + + +Documentation +------------- + +urllib3 has usage and reference documentation at `urllib3.readthedocs.io `_. + + +Contributing +------------ + +urllib3 happily accepts contributions. Please see our +`contributing documentation `_ +for some tips on getting started. + +Maintainers +----------- + +- `@lukasa `_ (Cory Benfield) +- `@sigmavirus24 `_ (Ian Cordasco) +- `@shazow `_ (Andrey Petrov) + +👋 + +Sponsorship +----------- + +If your company benefits from this library, please consider `sponsoring its +development `_. + + +Changes +======= + +1.22 (2017-07-20) +----------------- + +* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via + IPv6 proxy. (Issue #1222) + +* Made the connection pool retry on ``SSLError``. The original ``SSLError`` + is available on ``MaxRetryError.reason``. (Issue #1112) + +* Drain and release connection before recursing on retry/redirect. Fixes + deadlocks with a blocking connectionpool. (Issue #1167) + +* Fixed compatibility for cookiejar. (Issue #1229) + +* pyopenssl: Use vendored version of ``six``. (Issue #1231) + + +1.21.1 (2017-05-02) +------------------- + +* Fixed SecureTransport issue that would cause long delays in response body + delivery. (Pull #1154) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``socket_options`` flag to the ``PoolManager``. (Issue #1165) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``. + (Pull #1157) + + +1.21 (2017-04-25) +----------------- + +* Improved performance of certain selector system calls on Python 3.5 and + later. (Pull #1095) + +* Resolved issue where the PyOpenSSL backend would not wrap SysCallError + exceptions appropriately when sending data. (Pull #1125) + +* Selectors now detects a monkey-patched select module after import for modules + that patch the select module like eventlet, greenlet. (Pull #1128) + +* Reduced memory consumption when streaming zlib-compressed responses + (as opposed to raw deflate streams). (Pull #1129) + +* Connection pools now use the entire request context when constructing the + pool key. (Pull #1016) + +* ``PoolManager.connection_from_*`` methods now accept a new keyword argument, + ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``. + (Pull #1016) + +* Add retry counter for ``status_forcelist``. (Issue #1147) + +* Added ``contrib`` module for using SecureTransport on macOS: + ``urllib3.contrib.securetransport``. (Pull #1122) + +* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes: + for schemes it does not recognise, it assumes they are case-sensitive and + leaves them unchanged. + (Issue #1080) + + +1.20 (2017-01-19) +----------------- + +* Added support for waiting for I/O using selectors other than select, + improving urllib3's behaviour with large numbers of concurrent connections. + (Pull #1001) + +* Updated the date for the system clock check. (Issue #1005) + +* ConnectionPools now correctly consider hostnames to be case-insensitive. + (Issue #1032) + +* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Pull #1063) + +* Outdated versions of cryptography now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Issue #1044) + +* Automatically attempt to rewind a file-like body object when a request is + retried or redirected. (Pull #1039) + +* Fix some bugs that occur when modules incautiously patch the queue module. + (Pull #1061) + +* Prevent retries from occuring on read timeouts for which the request method + was not in the method whitelist. (Issue #1059) + +* Changed the PyOpenSSL contrib module to lazily load idna to avoid + unnecessarily bloating the memory of programs that don't need it. (Pull + #1076) + +* Add support for IPv6 literals with zone identifiers. (Pull #1013) + +* Added support for socks5h:// and socks4a:// schemes when working with SOCKS + proxies, and controlled remote DNS appropriately. (Issue #1035) + + +1.19.1 (2016-11-16) +------------------- + +* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025) + + +1.19 (2016-11-03) +----------------- + +* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when + using the default retry logic. (Pull #955) + +* Remove markers from setup.py to assist ancient setuptools versions. (Issue + #986) + +* Disallow superscripts and other integerish things in URL ports. (Issue #989) + +* Allow urllib3's HTTPResponse.stream() method to continue to work with + non-httplib underlying FPs. (Pull #990) + +* Empty filenames in multipart headers are now emitted as such, rather than + being supressed. (Issue #1015) + +* Prefer user-supplied Host headers on chunked uploads. (Issue #1009) + + +1.18.1 (2016-10-27) +------------------- + +* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with + PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This + release fixes a vulnerability whereby urllib3 in the above configuration + would silently fail to validate TLS certificates due to erroneously setting + invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous + flags do not cause a problem in OpenSSL versions before 1.1.0, which + interprets the presence of any flag as requesting certificate validation. + + There is no PR for this patch, as it was prepared for simultaneous disclosure + and release. The master branch received the same fix in PR #1010. + + +1.18 (2016-09-26) +----------------- + +* Fixed incorrect message for IncompleteRead exception. (PR #973) + +* Accept ``iPAddress`` subject alternative name fields in TLS certificates. + (Issue #258) + +* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3. + (Issue #977) + +* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979) + + +1.17 (2016-09-06) +----------------- + +* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835) + +* ConnectionPool debug log now includes scheme, host, and port. (Issue #897) + +* Substantially refactored documentation. (Issue #887) + +* Used URLFetch default timeout on AppEngine, rather than hardcoding our own. + (Issue #858) + +* Normalize the scheme and host in the URL parser (Issue #833) + +* ``HTTPResponse`` contains the last ``Retry`` object, which now also + contains retries history. (Issue #848) + +* Timeout can no longer be set as boolean, and must be greater than zero. + (PR #924) + +* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We + now use cryptography and idna, both of which are already dependencies of + PyOpenSSL. (PR #930) + +* Fixed infinite loop in ``stream`` when amt=None. (Issue #928) + +* Try to use the operating system's certificates when we are using an + ``SSLContext``. (PR #941) + +* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to + ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947) + +* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958) + +* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958) + +* Implemented ``length_remaining`` to determine remaining content + to be read. (PR #949) + +* Implemented ``enforce_content_length`` to enable exceptions when + incomplete data chunks are received. (PR #949) + +* Dropped connection start, dropped connection reset, redirect, forced retry, + and new HTTPS connection log levels to DEBUG, from INFO. (PR #967) + + +1.16 (2016-06-11) +----------------- + +* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840) + +* Provide ``key_fn_by_scheme`` pool keying mechanism that can be + overridden. (Issue #830) + +* Normalize scheme and host to lowercase for pool keys, and include + ``source_address``. (Issue #830) + +* Cleaner exception chain in Python 3 for ``_make_request``. + (Issue #861) + +* Fixed installing ``urllib3[socks]`` extra. (Issue #864) + +* Fixed signature of ``ConnectionPool.close`` so it can actually safely be + called by subclasses. (Issue #873) + +* Retain ``release_conn`` state across retries. (Issues #651, #866) + +* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to + ``HTTPResponse`` but can be replaced with a subclass. (Issue #879) + + +1.15.1 (2016-04-11) +------------------- + +* Fix packaging to include backports module. (Issue #841) + + +1.15 (2016-04-06) +----------------- + +* Added Retry(raise_on_status=False). (Issue #720) + +* Always use setuptools, no more distutils fallback. (Issue #785) + +* Dropped support for Python 3.2. (Issue #786) + +* Chunked transfer encoding when requesting with ``chunked=True``. + (Issue #790) + +* Fixed regression with IPv6 port parsing. (Issue #801) + +* Append SNIMissingWarning messages to allow users to specify it in + the PYTHONWARNINGS environment variable. (Issue #816) + +* Handle unicode headers in Py2. (Issue #818) + +* Log certificate when there is a hostname mismatch. (Issue #820) + +* Preserve order of request/response headers. (Issue #821) + + +1.14 (2015-12-29) +----------------- + +* contrib: SOCKS proxy support! (Issue #762) + +* Fixed AppEngine handling of transfer-encoding header and bug + in Timeout defaults checking. (Issue #763) + + +1.13.1 (2015-12-18) +------------------- + +* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761) + + +1.13 (2015-12-14) +----------------- + +* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706) + +* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717) + +* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696) + +* Close connections more defensively on exception. (Issue #734) + +* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without + repeatedly flushing the decoder, to function better on Jython. (Issue #743) + +* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758) + + +1.12 (2015-09-03) +----------------- + +* Rely on ``six`` for importing ``httplib`` to work around + conflicts with other Python 3 shims. (Issue #688) + +* Add support for directories of certificate authorities, as supported by + OpenSSL. (Issue #701) + +* New exception: ``NewConnectionError``, raised when we fail to establish + a new connection, usually ``ECONNREFUSED`` socket error. + + +1.11 (2015-07-21) +----------------- + +* When ``ca_certs`` is given, ``cert_reqs`` defaults to + ``'CERT_REQUIRED'``. (Issue #650) + +* ``pip install urllib3[secure]`` will install Certifi and + PyOpenSSL as dependencies. (Issue #678) + +* Made ``HTTPHeaderDict`` usable as a ``headers`` input value + (Issues #632, #679) + +* Added `urllib3.contrib.appengine `_ + which has an ``AppEngineManager`` for using ``URLFetch`` in a + Google AppEngine environment. (Issue #664) + +* Dev: Added test suite for AppEngine. (Issue #631) + +* Fix performance regression when using PyOpenSSL. (Issue #626) + +* Passing incorrect scheme (e.g. ``foo://``) will raise + ``ValueError`` instead of ``AssertionError`` (backwards + compatible for now, but please migrate). (Issue #640) + +* Fix pools not getting replenished when an error occurs during a + request using ``release_conn=False``. (Issue #644) + +* Fix pool-default headers not applying for url-encoded requests + like GET. (Issue #657) + +* log.warning in Python 3 when headers are skipped due to parsing + errors. (Issue #642) + +* Close and discard connections if an error occurs during read. + (Issue #660) + +* Fix host parsing for IPv6 proxies. (Issue #668) + +* Separate warning type SubjectAltNameWarning, now issued once + per host. (Issue #671) + +* Fix ``httplib.IncompleteRead`` not getting converted to + ``ProtocolError`` when using ``HTTPResponse.stream()`` + (Issue #674) + +1.10.4 (2015-05-03) +------------------- + +* Migrate tests to Tornado 4. (Issue #594) + +* Append default warning configuration rather than overwrite. + (Issue #603) + +* Fix streaming decoding regression. (Issue #595) + +* Fix chunked requests losing state across keep-alive connections. + (Issue #599) + +* Fix hanging when chunked HEAD response has no body. (Issue #605) + + +1.10.3 (2015-04-21) +------------------- + +* Emit ``InsecurePlatformWarning`` when SSLContext object is missing. + (Issue #558) + +* Fix regression of duplicate header keys being discarded. + (Issue #563) + +* ``Response.stream()`` returns a generator for chunked responses. + (Issue #560) + +* Set upper-bound timeout when waiting for a socket in PyOpenSSL. + (Issue #585) + +* Work on platforms without `ssl` module for plain HTTP requests. + (Issue #587) + +* Stop relying on the stdlib's default cipher list. (Issue #588) + + +1.10.2 (2015-02-25) +------------------- + +* Fix file descriptor leakage on retries. (Issue #548) + +* Removed RC4 from default cipher list. (Issue #551) + +* Header performance improvements. (Issue #544) + +* Fix PoolManager not obeying redirect retry settings. (Issue #553) + + +1.10.1 (2015-02-10) +------------------- + +* Pools can be used as context managers. (Issue #545) + +* Don't re-use connections which experienced an SSLError. (Issue #529) + +* Don't fail when gzip decoding an empty stream. (Issue #535) + +* Add sha256 support for fingerprint verification. (Issue #540) + +* Fixed handling of header values containing commas. (Issue #533) + + +1.10 (2014-12-14) +----------------- + +* Disabled SSLv3. (Issue #473) + +* Add ``Url.url`` property to return the composed url string. (Issue #394) + +* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412) + +* ``MaxRetryError.reason`` will always be an exception, not string. + (Issue #481) + +* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492) + +* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473) + +* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request. + (Issue #496) + +* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``. + (Issue #499) + +* Close and discard sockets which experienced SSL-related errors. + (Issue #501) + +* Handle ``body`` param in ``.request(...)``. (Issue #513) + +* Respect timeout with HTTPS proxy. (Issue #505) + +* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520) + + +1.9.1 (2014-09-13) +------------------ + +* Apply socket arguments before binding. (Issue #427) + +* More careful checks if fp-like object is closed. (Issue #435) + +* Fixed packaging issues of some development-related files not + getting included. (Issue #440) + +* Allow performing *only* fingerprint verification. (Issue #444) + +* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445) + +* Fixed PyOpenSSL compatibility with PyPy. (Issue #450) + +* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3. + (Issue #443) + + + +1.9 (2014-07-04) +---------------- + +* Shuffled around development-related files. If you're maintaining a distro + package of urllib3, you may need to tweak things. (Issue #415) + +* Unverified HTTPS requests will trigger a warning on the first request. See + our new `security documentation + `_ for details. + (Issue #426) + +* New retry logic and ``urllib3.util.retry.Retry`` configuration object. + (Issue #326) + +* All raised exceptions should now wrapped in a + ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326) + +* All errors during a retry-enabled request should be wrapped in + ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions + which were previously exempt. Underlying error is accessible from the + ``.reason`` propery. (Issue #326) + +* ``urllib3.exceptions.ConnectionError`` renamed to + ``urllib3.exceptions.ProtocolError``. (Issue #326) + +* Errors during response read (such as IncompleteRead) are now wrapped in + ``urllib3.exceptions.ProtocolError``. (Issue #418) + +* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``. + (Issue #417) + +* Catch read timeouts over SSL connections as + ``urllib3.exceptions.ReadTimeoutError``. (Issue #419) + +* Apply socket arguments before connecting. (Issue #427) + + +1.8.3 (2014-06-23) +------------------ + +* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385) + +* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393) + +* Wrap ``socket.timeout`` exception with + ``urllib3.exceptions.ReadTimeoutError``. (Issue #399) + +* Fixed proxy-related bug where connections were being reused incorrectly. + (Issues #366, #369) + +* Added ``socket_options`` keyword parameter which allows to define + ``setsockopt`` configuration of new sockets. (Issue #397) + +* Removed ``HTTPConnection.tcp_nodelay`` in favor of + ``HTTPConnection.default_socket_options``. (Issue #397) + +* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411) + + +1.8.2 (2014-04-17) +------------------ + +* Fix ``urllib3.util`` not being included in the package. + + +1.8.1 (2014-04-17) +------------------ + +* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356) + +* Don't install ``dummyserver`` into ``site-packages`` as it's only needed + for the test suite. (Issue #362) + +* Added support for specifying ``source_address``. (Issue #352) + + +1.8 (2014-03-04) +---------------- + +* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in + username, and blank ports like 'hostname:'). + +* New ``urllib3.connection`` module which contains all the HTTPConnection + objects. + +* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor + signature to a more sensible order. [Backwards incompatible] + (Issues #252, #262, #263) + +* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274) + +* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which + returns the number of bytes read so far. (Issue #277) + +* Support for platforms without threading. (Issue #289) + +* Expand default-port comparison in ``HTTPConnectionPool.is_same_host`` + to allow a pool with no specified port to be considered equal to to an + HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305) + +* Improved default SSL/TLS settings to avoid vulnerabilities. + (Issue #309) + +* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors. + (Issue #310) + +* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests + will send the entire HTTP request ~200 milliseconds faster; however, some of + the resulting TCP packets will be smaller. (Issue #254) + +* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl`` + from the default 64 to 1024 in a single certificate. (Issue #318) + +* Headers are now passed and stored as a custom + ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``. + (Issue #329, #333) + +* Headers no longer lose their case on Python 3. (Issue #236) + +* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA + certificates on inject. (Issue #332) + +* Requests with ``retries=False`` will immediately raise any exceptions without + wrapping them in ``MaxRetryError``. (Issue #348) + +* Fixed open socket leak with SSL-related failures. (Issue #344, #348) + + +1.7.1 (2013-09-25) +------------------ + +* Added granular timeout support with new ``urllib3.util.Timeout`` class. + (Issue #231) + +* Fixed Python 3.4 support. (Issue #238) + + +1.7 (2013-08-14) +---------------- + +* More exceptions are now pickle-able, with tests. (Issue #174) + +* Fixed redirecting with relative URLs in Location header. (Issue #178) + +* Support for relative urls in ``Location: ...`` header. (Issue #179) + +* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus + file-like functionality. (Issue #187) + +* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will + skip hostname verification for SSL connections. (Issue #194) + +* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a + generator wrapped around ``.read(...)``. (Issue #198) + +* IPv6 url parsing enforces brackets around the hostname. (Issue #199) + +* Fixed thread race condition in + ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204) + +* ``ProxyManager`` requests now include non-default port in ``Host: ...`` + header. (Issue #217) + +* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139) + +* New ``RequestField`` object can be passed to the ``fields=...`` param which + can specify headers. (Issue #220) + +* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails. + (Issue #221) + +* Use international headers when posting file names. (Issue #119) + +* Improved IPv6 support. (Issue #203) + + +1.6 (2013-04-25) +---------------- + +* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156) + +* ``ProxyManager`` automatically adds ``Host: ...`` header if not given. + +* Improved SSL-related code. ``cert_req`` now optionally takes a string like + "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23" + The string values reflect the suffix of the respective constant variable. + (Issue #130) + +* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly + closed proxy connections and larger read buffers. (Issue #135) + +* Ensure the connection is closed if no data is received, fixes connection leak + on some platforms. (Issue #133) + +* Added SNI support for SSL/TLS connections on Py32+. (Issue #89) + +* Tests fixed to be compatible with Py26 again. (Issue #125) + +* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant + to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109) + +* Allow an explicit content type to be specified when encoding file fields. + (Issue #126) + +* Exceptions are now pickleable, with tests. (Issue #101) + +* Fixed default headers not getting passed in some cases. (Issue #99) + +* Treat "content-encoding" header value as case-insensitive, per RFC 2616 + Section 3.5. (Issue #110) + +* "Connection Refused" SocketErrors will get retried rather than raised. + (Issue #92) + +* Updated vendored ``six``, no longer overrides the global ``six`` module + namespace. (Issue #113) + +* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding + the exception that prompted the final retry. If ``reason is None`` then it + was due to a redirect. (Issue #92, #114) + +* Fixed ``PoolManager.urlopen()`` from not redirecting more than once. + (Issue #149) + +* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters + that are not files. (Issue #111) + +* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122) + +* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or + against an arbitrary hostname (when connecting by IP or for misconfigured + servers). (Issue #140) + +* Streaming decompression support. (Issue #159) + + +1.5 (2012-08-02) +---------------- + +* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug + logging in urllib3. + +* Native full URL parsing (including auth, path, query, fragment) available in + ``urllib3.util.parse_url(url)``. + +* Built-in redirect will switch method to 'GET' if status code is 303. + (Issue #11) + +* ``urllib3.PoolManager`` strips the scheme and host before sending the request + uri. (Issue #8) + +* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding, + based on the Content-Type header, fails. + +* Fixed bug with pool depletion and leaking connections (Issue #76). Added + explicit connection closing on pool eviction. Added + ``urllib3.PoolManager.clear()``. + +* 99% -> 100% unit test coverage. + + +1.4 (2012-06-16) +---------------- + +* Minor AppEngine-related fixes. + +* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``. + +* Improved url parsing. (Issue #73) + +* IPv6 url support. (Issue #72) + + +1.3 (2012-03-25) +---------------- + +* Removed pre-1.0 deprecated API. + +* Refactored helpers into a ``urllib3.util`` submodule. + +* Fixed multipart encoding to support list-of-tuples for keys with multiple + values. (Issue #48) + +* Fixed multiple Set-Cookie headers in response not getting merged properly in + Python 3. (Issue #53) + +* AppEngine support with Py27. (Issue #61) + +* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs + bytes. + + +1.2.2 (2012-02-06) +------------------ + +* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47) + + +1.2.1 (2012-02-05) +------------------ + +* Fixed another bug related to when ``ssl`` module is not available. (Issue #41) + +* Location parsing errors now raise ``urllib3.exceptions.LocationParseError`` + which inherits from ``ValueError``. + + +1.2 (2012-01-29) +---------------- + +* Added Python 3 support (tested on 3.2.2) + +* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2) + +* Use ``select.poll`` instead of ``select.select`` for platforms that support + it. + +* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive + connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``. + +* Fixed ``ImportError`` during install when ``ssl`` module is not available. + (Issue #41) + +* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not + completing properly. (Issue #28, uncovered by Issue #10 in v1.1) + +* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` + + ``eventlet``. Removed extraneous unsupported dummyserver testing backends. + Added socket-level tests. + +* More tests. Achievement Unlocked: 99% Coverage. + + +1.1 (2012-01-07) +---------------- + +* Refactored ``dummyserver`` to its own root namespace module (used for + testing). + +* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in + Py32's ``ssl_match_hostname``. (Issue #25) + +* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10) + +* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue + #27) + +* Fixed timeout-related bugs. (Issues #17, #23) + + +1.0.2 (2011-11-04) +------------------ + +* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if + you're using the object manually. (Thanks pyos) + +* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by + wrapping the access log in a mutex. (Thanks @christer) + +* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and + ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code. + + +1.0.1 (2011-10-10) +------------------ + +* Fixed a bug where the same connection would get returned into the pool twice, + causing extraneous "HttpConnectionPool is full" log warnings. + + +1.0 (2011-10-08) +---------------- + +* Added ``PoolManager`` with LRU expiration of connections (tested and + documented). +* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works + with HTTPS proxies). +* Added optional partial-read support for responses when + ``preload_content=False``. You can now make requests and just read the headers + without loading the content. +* Made response decoding optional (default on, same as before). +* Added optional explicit boundary string for ``encode_multipart_formdata``. +* Convenience request methods are now inherited from ``RequestMethods``. Old + helpers like ``get_url`` and ``post_url`` should be abandoned in favour of + the new ``request(method, url, ...)``. +* Refactored code to be even more decoupled, reusable, and extendable. +* License header added to ``.py`` files. +* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code + and docs in ``docs/`` and on urllib3.readthedocs.org. +* Embettered all the things! +* Started writing this file. + + +0.4.1 (2011-07-17) +------------------ + +* Minor bug fixes, code cleanup. + + +0.4 (2011-03-01) +---------------- + +* Better unicode support. +* Added ``VerifiedHTTPSConnection``. +* Added ``NTLMConnectionPool`` in contrib. +* Minor improvements. + + +0.3.1 (2010-07-13) +------------------ + +* Added ``assert_host_name`` optional parameter. Now compatible with proxies. + + +0.3 (2009-12-10) +---------------- + +* Added HTTPS support. +* Minor bug fixes. +* Refactored, broken backwards compatibility with 0.2. +* API to be treated as stable from this version forward. + + +0.2 (2008-11-17) +---------------- + +* Added unit tests. +* Bug fixes. + + +0.1 (2008-11-16) +---------------- + +* First release. + + diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/INSTALLER b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/METADATA b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/METADATA new file mode 100644 index 0000000..ff7129b --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/METADATA @@ -0,0 +1,1031 @@ +Metadata-Version: 2.0 +Name: urllib3 +Version: 1.22 +Summary: HTTP library with thread-safe connection pooling, file post, and more. +Home-page: https://urllib3.readthedocs.io/ +Author: Andrey Petrov +Author-email: andrey.petrov@shazow.net +License: MIT +Keywords: urllib httplib threadsafe filepost http https ssl pooling +Platform: UNKNOWN +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Software Development :: Libraries +Provides-Extra: secure +Provides-Extra: socks +Requires-Dist: pyOpenSSL>=0.14; python_version<="2.7" and extra == 'secure' +Requires-Dist: cryptography>=1.3.4; python_version<="2.7" and extra == 'secure' +Requires-Dist: idna>=2.0.0; python_version<="2.7" and extra == 'secure' +Requires-Dist: certifi; extra == 'secure' +Requires-Dist: ipaddress; python_version<="2.7" and extra == 'secure' +Requires-Dist: PySocks>=1.5.6,<2.0,!=1.5.7; extra == 'socks' + +urllib3 +======= + +.. image:: https://travis-ci.org/shazow/urllib3.svg?branch=master + :alt: Build status on Travis + :target: https://travis-ci.org/shazow/urllib3 + +.. image:: https://img.shields.io/appveyor/ci/shazow/urllib3/master.svg + :alt: Build status on AppVeyor + :target: https://ci.appveyor.com/project/shazow/urllib3 + +.. image:: https://readthedocs.org/projects/urllib3/badge/?version=latest + :alt: Documentation Status + :target: https://urllib3.readthedocs.io/en/latest/ + +.. image:: https://img.shields.io/codecov/c/github/shazow/urllib3.svg + :alt: Coverage Status + :target: https://codecov.io/gh/shazow/urllib3 + +.. image:: https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400 + :alt: PyPI version + :target: https://pypi.python.org/pypi/urllib3 + +.. image:: https://www.bountysource.com/badge/tracker?tracker_id=192525 + :alt: Bountysource + :target: https://www.bountysource.com/trackers/192525-urllib3?utm_source=192525&utm_medium=shield&utm_campaign=TRACKER_BADGE + +urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the +Python ecosystem already uses urllib3 and you should too. +urllib3 brings many critical features that are missing from the Python +standard libraries: + +- Thread safety. +- Connection pooling. +- Client-side SSL/TLS verification. +- File uploads with multipart encoding. +- Helpers for retrying requests and dealing with HTTP redirects. +- Support for gzip and deflate encoding. +- Proxy support for HTTP and SOCKS. +- 100% test coverage. + +urllib3 is powerful and easy to use:: + + >>> import urllib3 + >>> http = urllib3.PoolManager() + >>> r = http.request('GET', 'http://httpbin.org/robots.txt') + >>> r.status + 200 + >>> r.data + 'User-agent: *\nDisallow: /deny\n' + +Installing +---------- + +urllib3 can be installed with `pip `_:: + + $ pip install urllib3 + +Alternatively, you can grab the latest source code from `GitHub `_:: + + $ git clone git://github.com/shazow/urllib3.git + $ python setup.py install + + +Documentation +------------- + +urllib3 has usage and reference documentation at `urllib3.readthedocs.io `_. + + +Contributing +------------ + +urllib3 happily accepts contributions. Please see our +`contributing documentation `_ +for some tips on getting started. + +Maintainers +----------- + +- `@lukasa `_ (Cory Benfield) +- `@sigmavirus24 `_ (Ian Cordasco) +- `@shazow `_ (Andrey Petrov) + +👋 + +Sponsorship +----------- + +If your company benefits from this library, please consider `sponsoring its +development `_. + + +Changes +======= + +1.22 (2017-07-20) +----------------- + +* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via + IPv6 proxy. (Issue #1222) + +* Made the connection pool retry on ``SSLError``. The original ``SSLError`` + is available on ``MaxRetryError.reason``. (Issue #1112) + +* Drain and release connection before recursing on retry/redirect. Fixes + deadlocks with a blocking connectionpool. (Issue #1167) + +* Fixed compatibility for cookiejar. (Issue #1229) + +* pyopenssl: Use vendored version of ``six``. (Issue #1231) + + +1.21.1 (2017-05-02) +------------------- + +* Fixed SecureTransport issue that would cause long delays in response body + delivery. (Pull #1154) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``socket_options`` flag to the ``PoolManager``. (Issue #1165) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``. + (Pull #1157) + + +1.21 (2017-04-25) +----------------- + +* Improved performance of certain selector system calls on Python 3.5 and + later. (Pull #1095) + +* Resolved issue where the PyOpenSSL backend would not wrap SysCallError + exceptions appropriately when sending data. (Pull #1125) + +* Selectors now detects a monkey-patched select module after import for modules + that patch the select module like eventlet, greenlet. (Pull #1128) + +* Reduced memory consumption when streaming zlib-compressed responses + (as opposed to raw deflate streams). (Pull #1129) + +* Connection pools now use the entire request context when constructing the + pool key. (Pull #1016) + +* ``PoolManager.connection_from_*`` methods now accept a new keyword argument, + ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``. + (Pull #1016) + +* Add retry counter for ``status_forcelist``. (Issue #1147) + +* Added ``contrib`` module for using SecureTransport on macOS: + ``urllib3.contrib.securetransport``. (Pull #1122) + +* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes: + for schemes it does not recognise, it assumes they are case-sensitive and + leaves them unchanged. + (Issue #1080) + + +1.20 (2017-01-19) +----------------- + +* Added support for waiting for I/O using selectors other than select, + improving urllib3's behaviour with large numbers of concurrent connections. + (Pull #1001) + +* Updated the date for the system clock check. (Issue #1005) + +* ConnectionPools now correctly consider hostnames to be case-insensitive. + (Issue #1032) + +* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Pull #1063) + +* Outdated versions of cryptography now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Issue #1044) + +* Automatically attempt to rewind a file-like body object when a request is + retried or redirected. (Pull #1039) + +* Fix some bugs that occur when modules incautiously patch the queue module. + (Pull #1061) + +* Prevent retries from occuring on read timeouts for which the request method + was not in the method whitelist. (Issue #1059) + +* Changed the PyOpenSSL contrib module to lazily load idna to avoid + unnecessarily bloating the memory of programs that don't need it. (Pull + #1076) + +* Add support for IPv6 literals with zone identifiers. (Pull #1013) + +* Added support for socks5h:// and socks4a:// schemes when working with SOCKS + proxies, and controlled remote DNS appropriately. (Issue #1035) + + +1.19.1 (2016-11-16) +------------------- + +* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025) + + +1.19 (2016-11-03) +----------------- + +* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when + using the default retry logic. (Pull #955) + +* Remove markers from setup.py to assist ancient setuptools versions. (Issue + #986) + +* Disallow superscripts and other integerish things in URL ports. (Issue #989) + +* Allow urllib3's HTTPResponse.stream() method to continue to work with + non-httplib underlying FPs. (Pull #990) + +* Empty filenames in multipart headers are now emitted as such, rather than + being supressed. (Issue #1015) + +* Prefer user-supplied Host headers on chunked uploads. (Issue #1009) + + +1.18.1 (2016-10-27) +------------------- + +* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with + PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This + release fixes a vulnerability whereby urllib3 in the above configuration + would silently fail to validate TLS certificates due to erroneously setting + invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous + flags do not cause a problem in OpenSSL versions before 1.1.0, which + interprets the presence of any flag as requesting certificate validation. + + There is no PR for this patch, as it was prepared for simultaneous disclosure + and release. The master branch received the same fix in PR #1010. + + +1.18 (2016-09-26) +----------------- + +* Fixed incorrect message for IncompleteRead exception. (PR #973) + +* Accept ``iPAddress`` subject alternative name fields in TLS certificates. + (Issue #258) + +* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3. + (Issue #977) + +* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979) + + +1.17 (2016-09-06) +----------------- + +* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835) + +* ConnectionPool debug log now includes scheme, host, and port. (Issue #897) + +* Substantially refactored documentation. (Issue #887) + +* Used URLFetch default timeout on AppEngine, rather than hardcoding our own. + (Issue #858) + +* Normalize the scheme and host in the URL parser (Issue #833) + +* ``HTTPResponse`` contains the last ``Retry`` object, which now also + contains retries history. (Issue #848) + +* Timeout can no longer be set as boolean, and must be greater than zero. + (PR #924) + +* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We + now use cryptography and idna, both of which are already dependencies of + PyOpenSSL. (PR #930) + +* Fixed infinite loop in ``stream`` when amt=None. (Issue #928) + +* Try to use the operating system's certificates when we are using an + ``SSLContext``. (PR #941) + +* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to + ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947) + +* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958) + +* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958) + +* Implemented ``length_remaining`` to determine remaining content + to be read. (PR #949) + +* Implemented ``enforce_content_length`` to enable exceptions when + incomplete data chunks are received. (PR #949) + +* Dropped connection start, dropped connection reset, redirect, forced retry, + and new HTTPS connection log levels to DEBUG, from INFO. (PR #967) + + +1.16 (2016-06-11) +----------------- + +* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840) + +* Provide ``key_fn_by_scheme`` pool keying mechanism that can be + overridden. (Issue #830) + +* Normalize scheme and host to lowercase for pool keys, and include + ``source_address``. (Issue #830) + +* Cleaner exception chain in Python 3 for ``_make_request``. + (Issue #861) + +* Fixed installing ``urllib3[socks]`` extra. (Issue #864) + +* Fixed signature of ``ConnectionPool.close`` so it can actually safely be + called by subclasses. (Issue #873) + +* Retain ``release_conn`` state across retries. (Issues #651, #866) + +* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to + ``HTTPResponse`` but can be replaced with a subclass. (Issue #879) + + +1.15.1 (2016-04-11) +------------------- + +* Fix packaging to include backports module. (Issue #841) + + +1.15 (2016-04-06) +----------------- + +* Added Retry(raise_on_status=False). (Issue #720) + +* Always use setuptools, no more distutils fallback. (Issue #785) + +* Dropped support for Python 3.2. (Issue #786) + +* Chunked transfer encoding when requesting with ``chunked=True``. + (Issue #790) + +* Fixed regression with IPv6 port parsing. (Issue #801) + +* Append SNIMissingWarning messages to allow users to specify it in + the PYTHONWARNINGS environment variable. (Issue #816) + +* Handle unicode headers in Py2. (Issue #818) + +* Log certificate when there is a hostname mismatch. (Issue #820) + +* Preserve order of request/response headers. (Issue #821) + + +1.14 (2015-12-29) +----------------- + +* contrib: SOCKS proxy support! (Issue #762) + +* Fixed AppEngine handling of transfer-encoding header and bug + in Timeout defaults checking. (Issue #763) + + +1.13.1 (2015-12-18) +------------------- + +* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761) + + +1.13 (2015-12-14) +----------------- + +* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706) + +* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717) + +* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696) + +* Close connections more defensively on exception. (Issue #734) + +* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without + repeatedly flushing the decoder, to function better on Jython. (Issue #743) + +* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758) + + +1.12 (2015-09-03) +----------------- + +* Rely on ``six`` for importing ``httplib`` to work around + conflicts with other Python 3 shims. (Issue #688) + +* Add support for directories of certificate authorities, as supported by + OpenSSL. (Issue #701) + +* New exception: ``NewConnectionError``, raised when we fail to establish + a new connection, usually ``ECONNREFUSED`` socket error. + + +1.11 (2015-07-21) +----------------- + +* When ``ca_certs`` is given, ``cert_reqs`` defaults to + ``'CERT_REQUIRED'``. (Issue #650) + +* ``pip install urllib3[secure]`` will install Certifi and + PyOpenSSL as dependencies. (Issue #678) + +* Made ``HTTPHeaderDict`` usable as a ``headers`` input value + (Issues #632, #679) + +* Added `urllib3.contrib.appengine `_ + which has an ``AppEngineManager`` for using ``URLFetch`` in a + Google AppEngine environment. (Issue #664) + +* Dev: Added test suite for AppEngine. (Issue #631) + +* Fix performance regression when using PyOpenSSL. (Issue #626) + +* Passing incorrect scheme (e.g. ``foo://``) will raise + ``ValueError`` instead of ``AssertionError`` (backwards + compatible for now, but please migrate). (Issue #640) + +* Fix pools not getting replenished when an error occurs during a + request using ``release_conn=False``. (Issue #644) + +* Fix pool-default headers not applying for url-encoded requests + like GET. (Issue #657) + +* log.warning in Python 3 when headers are skipped due to parsing + errors. (Issue #642) + +* Close and discard connections if an error occurs during read. + (Issue #660) + +* Fix host parsing for IPv6 proxies. (Issue #668) + +* Separate warning type SubjectAltNameWarning, now issued once + per host. (Issue #671) + +* Fix ``httplib.IncompleteRead`` not getting converted to + ``ProtocolError`` when using ``HTTPResponse.stream()`` + (Issue #674) + +1.10.4 (2015-05-03) +------------------- + +* Migrate tests to Tornado 4. (Issue #594) + +* Append default warning configuration rather than overwrite. + (Issue #603) + +* Fix streaming decoding regression. (Issue #595) + +* Fix chunked requests losing state across keep-alive connections. + (Issue #599) + +* Fix hanging when chunked HEAD response has no body. (Issue #605) + + +1.10.3 (2015-04-21) +------------------- + +* Emit ``InsecurePlatformWarning`` when SSLContext object is missing. + (Issue #558) + +* Fix regression of duplicate header keys being discarded. + (Issue #563) + +* ``Response.stream()`` returns a generator for chunked responses. + (Issue #560) + +* Set upper-bound timeout when waiting for a socket in PyOpenSSL. + (Issue #585) + +* Work on platforms without `ssl` module for plain HTTP requests. + (Issue #587) + +* Stop relying on the stdlib's default cipher list. (Issue #588) + + +1.10.2 (2015-02-25) +------------------- + +* Fix file descriptor leakage on retries. (Issue #548) + +* Removed RC4 from default cipher list. (Issue #551) + +* Header performance improvements. (Issue #544) + +* Fix PoolManager not obeying redirect retry settings. (Issue #553) + + +1.10.1 (2015-02-10) +------------------- + +* Pools can be used as context managers. (Issue #545) + +* Don't re-use connections which experienced an SSLError. (Issue #529) + +* Don't fail when gzip decoding an empty stream. (Issue #535) + +* Add sha256 support for fingerprint verification. (Issue #540) + +* Fixed handling of header values containing commas. (Issue #533) + + +1.10 (2014-12-14) +----------------- + +* Disabled SSLv3. (Issue #473) + +* Add ``Url.url`` property to return the composed url string. (Issue #394) + +* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412) + +* ``MaxRetryError.reason`` will always be an exception, not string. + (Issue #481) + +* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492) + +* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473) + +* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request. + (Issue #496) + +* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``. + (Issue #499) + +* Close and discard sockets which experienced SSL-related errors. + (Issue #501) + +* Handle ``body`` param in ``.request(...)``. (Issue #513) + +* Respect timeout with HTTPS proxy. (Issue #505) + +* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520) + + +1.9.1 (2014-09-13) +------------------ + +* Apply socket arguments before binding. (Issue #427) + +* More careful checks if fp-like object is closed. (Issue #435) + +* Fixed packaging issues of some development-related files not + getting included. (Issue #440) + +* Allow performing *only* fingerprint verification. (Issue #444) + +* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445) + +* Fixed PyOpenSSL compatibility with PyPy. (Issue #450) + +* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3. + (Issue #443) + + + +1.9 (2014-07-04) +---------------- + +* Shuffled around development-related files. If you're maintaining a distro + package of urllib3, you may need to tweak things. (Issue #415) + +* Unverified HTTPS requests will trigger a warning on the first request. See + our new `security documentation + `_ for details. + (Issue #426) + +* New retry logic and ``urllib3.util.retry.Retry`` configuration object. + (Issue #326) + +* All raised exceptions should now wrapped in a + ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326) + +* All errors during a retry-enabled request should be wrapped in + ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions + which were previously exempt. Underlying error is accessible from the + ``.reason`` propery. (Issue #326) + +* ``urllib3.exceptions.ConnectionError`` renamed to + ``urllib3.exceptions.ProtocolError``. (Issue #326) + +* Errors during response read (such as IncompleteRead) are now wrapped in + ``urllib3.exceptions.ProtocolError``. (Issue #418) + +* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``. + (Issue #417) + +* Catch read timeouts over SSL connections as + ``urllib3.exceptions.ReadTimeoutError``. (Issue #419) + +* Apply socket arguments before connecting. (Issue #427) + + +1.8.3 (2014-06-23) +------------------ + +* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385) + +* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393) + +* Wrap ``socket.timeout`` exception with + ``urllib3.exceptions.ReadTimeoutError``. (Issue #399) + +* Fixed proxy-related bug where connections were being reused incorrectly. + (Issues #366, #369) + +* Added ``socket_options`` keyword parameter which allows to define + ``setsockopt`` configuration of new sockets. (Issue #397) + +* Removed ``HTTPConnection.tcp_nodelay`` in favor of + ``HTTPConnection.default_socket_options``. (Issue #397) + +* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411) + + +1.8.2 (2014-04-17) +------------------ + +* Fix ``urllib3.util`` not being included in the package. + + +1.8.1 (2014-04-17) +------------------ + +* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356) + +* Don't install ``dummyserver`` into ``site-packages`` as it's only needed + for the test suite. (Issue #362) + +* Added support for specifying ``source_address``. (Issue #352) + + +1.8 (2014-03-04) +---------------- + +* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in + username, and blank ports like 'hostname:'). + +* New ``urllib3.connection`` module which contains all the HTTPConnection + objects. + +* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor + signature to a more sensible order. [Backwards incompatible] + (Issues #252, #262, #263) + +* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274) + +* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which + returns the number of bytes read so far. (Issue #277) + +* Support for platforms without threading. (Issue #289) + +* Expand default-port comparison in ``HTTPConnectionPool.is_same_host`` + to allow a pool with no specified port to be considered equal to to an + HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305) + +* Improved default SSL/TLS settings to avoid vulnerabilities. + (Issue #309) + +* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors. + (Issue #310) + +* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests + will send the entire HTTP request ~200 milliseconds faster; however, some of + the resulting TCP packets will be smaller. (Issue #254) + +* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl`` + from the default 64 to 1024 in a single certificate. (Issue #318) + +* Headers are now passed and stored as a custom + ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``. + (Issue #329, #333) + +* Headers no longer lose their case on Python 3. (Issue #236) + +* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA + certificates on inject. (Issue #332) + +* Requests with ``retries=False`` will immediately raise any exceptions without + wrapping them in ``MaxRetryError``. (Issue #348) + +* Fixed open socket leak with SSL-related failures. (Issue #344, #348) + + +1.7.1 (2013-09-25) +------------------ + +* Added granular timeout support with new ``urllib3.util.Timeout`` class. + (Issue #231) + +* Fixed Python 3.4 support. (Issue #238) + + +1.7 (2013-08-14) +---------------- + +* More exceptions are now pickle-able, with tests. (Issue #174) + +* Fixed redirecting with relative URLs in Location header. (Issue #178) + +* Support for relative urls in ``Location: ...`` header. (Issue #179) + +* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus + file-like functionality. (Issue #187) + +* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will + skip hostname verification for SSL connections. (Issue #194) + +* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a + generator wrapped around ``.read(...)``. (Issue #198) + +* IPv6 url parsing enforces brackets around the hostname. (Issue #199) + +* Fixed thread race condition in + ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204) + +* ``ProxyManager`` requests now include non-default port in ``Host: ...`` + header. (Issue #217) + +* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139) + +* New ``RequestField`` object can be passed to the ``fields=...`` param which + can specify headers. (Issue #220) + +* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails. + (Issue #221) + +* Use international headers when posting file names. (Issue #119) + +* Improved IPv6 support. (Issue #203) + + +1.6 (2013-04-25) +---------------- + +* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156) + +* ``ProxyManager`` automatically adds ``Host: ...`` header if not given. + +* Improved SSL-related code. ``cert_req`` now optionally takes a string like + "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23" + The string values reflect the suffix of the respective constant variable. + (Issue #130) + +* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly + closed proxy connections and larger read buffers. (Issue #135) + +* Ensure the connection is closed if no data is received, fixes connection leak + on some platforms. (Issue #133) + +* Added SNI support for SSL/TLS connections on Py32+. (Issue #89) + +* Tests fixed to be compatible with Py26 again. (Issue #125) + +* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant + to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109) + +* Allow an explicit content type to be specified when encoding file fields. + (Issue #126) + +* Exceptions are now pickleable, with tests. (Issue #101) + +* Fixed default headers not getting passed in some cases. (Issue #99) + +* Treat "content-encoding" header value as case-insensitive, per RFC 2616 + Section 3.5. (Issue #110) + +* "Connection Refused" SocketErrors will get retried rather than raised. + (Issue #92) + +* Updated vendored ``six``, no longer overrides the global ``six`` module + namespace. (Issue #113) + +* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding + the exception that prompted the final retry. If ``reason is None`` then it + was due to a redirect. (Issue #92, #114) + +* Fixed ``PoolManager.urlopen()`` from not redirecting more than once. + (Issue #149) + +* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters + that are not files. (Issue #111) + +* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122) + +* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or + against an arbitrary hostname (when connecting by IP or for misconfigured + servers). (Issue #140) + +* Streaming decompression support. (Issue #159) + + +1.5 (2012-08-02) +---------------- + +* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug + logging in urllib3. + +* Native full URL parsing (including auth, path, query, fragment) available in + ``urllib3.util.parse_url(url)``. + +* Built-in redirect will switch method to 'GET' if status code is 303. + (Issue #11) + +* ``urllib3.PoolManager`` strips the scheme and host before sending the request + uri. (Issue #8) + +* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding, + based on the Content-Type header, fails. + +* Fixed bug with pool depletion and leaking connections (Issue #76). Added + explicit connection closing on pool eviction. Added + ``urllib3.PoolManager.clear()``. + +* 99% -> 100% unit test coverage. + + +1.4 (2012-06-16) +---------------- + +* Minor AppEngine-related fixes. + +* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``. + +* Improved url parsing. (Issue #73) + +* IPv6 url support. (Issue #72) + + +1.3 (2012-03-25) +---------------- + +* Removed pre-1.0 deprecated API. + +* Refactored helpers into a ``urllib3.util`` submodule. + +* Fixed multipart encoding to support list-of-tuples for keys with multiple + values. (Issue #48) + +* Fixed multiple Set-Cookie headers in response not getting merged properly in + Python 3. (Issue #53) + +* AppEngine support with Py27. (Issue #61) + +* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs + bytes. + + +1.2.2 (2012-02-06) +------------------ + +* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47) + + +1.2.1 (2012-02-05) +------------------ + +* Fixed another bug related to when ``ssl`` module is not available. (Issue #41) + +* Location parsing errors now raise ``urllib3.exceptions.LocationParseError`` + which inherits from ``ValueError``. + + +1.2 (2012-01-29) +---------------- + +* Added Python 3 support (tested on 3.2.2) + +* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2) + +* Use ``select.poll`` instead of ``select.select`` for platforms that support + it. + +* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive + connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``. + +* Fixed ``ImportError`` during install when ``ssl`` module is not available. + (Issue #41) + +* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not + completing properly. (Issue #28, uncovered by Issue #10 in v1.1) + +* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` + + ``eventlet``. Removed extraneous unsupported dummyserver testing backends. + Added socket-level tests. + +* More tests. Achievement Unlocked: 99% Coverage. + + +1.1 (2012-01-07) +---------------- + +* Refactored ``dummyserver`` to its own root namespace module (used for + testing). + +* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in + Py32's ``ssl_match_hostname``. (Issue #25) + +* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10) + +* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue + #27) + +* Fixed timeout-related bugs. (Issues #17, #23) + + +1.0.2 (2011-11-04) +------------------ + +* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if + you're using the object manually. (Thanks pyos) + +* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by + wrapping the access log in a mutex. (Thanks @christer) + +* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and + ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code. + + +1.0.1 (2011-10-10) +------------------ + +* Fixed a bug where the same connection would get returned into the pool twice, + causing extraneous "HttpConnectionPool is full" log warnings. + + +1.0 (2011-10-08) +---------------- + +* Added ``PoolManager`` with LRU expiration of connections (tested and + documented). +* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works + with HTTPS proxies). +* Added optional partial-read support for responses when + ``preload_content=False``. You can now make requests and just read the headers + without loading the content. +* Made response decoding optional (default on, same as before). +* Added optional explicit boundary string for ``encode_multipart_formdata``. +* Convenience request methods are now inherited from ``RequestMethods``. Old + helpers like ``get_url`` and ``post_url`` should be abandoned in favour of + the new ``request(method, url, ...)``. +* Refactored code to be even more decoupled, reusable, and extendable. +* License header added to ``.py`` files. +* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code + and docs in ``docs/`` and on urllib3.readthedocs.org. +* Embettered all the things! +* Started writing this file. + + +0.4.1 (2011-07-17) +------------------ + +* Minor bug fixes, code cleanup. + + +0.4 (2011-03-01) +---------------- + +* Better unicode support. +* Added ``VerifiedHTTPSConnection``. +* Added ``NTLMConnectionPool`` in contrib. +* Minor improvements. + + +0.3.1 (2010-07-13) +------------------ + +* Added ``assert_host_name`` optional parameter. Now compatible with proxies. + + +0.3 (2009-12-10) +---------------- + +* Added HTTPS support. +* Minor bug fixes. +* Refactored, broken backwards compatibility with 0.2. +* API to be treated as stable from this version forward. + + +0.2 (2008-11-17) +---------------- + +* Added unit tests. +* Bug fixes. + + +0.1 (2008-11-16) +---------------- + +* First release. + + diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/RECORD b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/RECORD new file mode 100644 index 0000000..6984ccb --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/RECORD @@ -0,0 +1,79 @@ +urllib3/__init__.py,sha256=EfUPF9RHveaF9g5dcK5kBsGDp5LrIB-396MpK2RQk1I,2853 +urllib3/_collections.py,sha256=b0-x45LBArs96Rum5xGAbPsriwfB3MZVQbsv7lFiUwE,10204 +urllib3/connection.py,sha256=4GKR8uXHz6IpztYhtuhKBqXj84HbbFUF3CvwymGfLD0,13003 +urllib3/connectionpool.py,sha256=5ub8CXnKs1wc2X-MyuVVPo3_9scWLghSgbHOJTpQXuE,35358 +urllib3/exceptions.py,sha256=dz1gBEgtROnLrW8V911KhVZWeAn3H2OhDGztWNXQpr0,6603 +urllib3/fields.py,sha256=YrNRM8RBUmM8guXKUQFa3kwj6XvQZ78Z8inE6l-YK-E,5943 +urllib3/filepost.py,sha256=NF6Rly66bilWU-sdULXjCdQgN1uRxfFRedeifcRLzkU,2321 +urllib3/poolmanager.py,sha256=-51BAPlD0MgECYduHhfbZCEiZoU_NDFOKYlhSjiff2Q,16345 +urllib3/request.py,sha256=wrt2D0SWLLgTRKrRnaZophq2xXpCvNRd7RMT6F5o5hY,5946 +urllib3/response.py,sha256=7mGUH35L2IPuZVOY7QvDQ1GSSKIf6V6geJXThdjmQD4,22903 +urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/appengine.py,sha256=41l3arTy-kBBpOdVpSPYVC64Qo7RLnXnDED6hcIthA0,10865 +urllib3/contrib/ntlmpool.py,sha256=Q9-rO5Rh2-IqyEd4ZicpTDfMnOlf0IPPCkjhChBCjV4,4478 +urllib3/contrib/pyopenssl.py,sha256=BxJ1yMPE62duuHJP6jlZxLz_FNTKbWI0b-nVRKlBDgI,15354 +urllib3/contrib/securetransport.py,sha256=ZRPz6Q1tnsu9H1BOAQVUSHIyowWmfaBb7pGlbG5iOPk,30501 +urllib3/contrib/socks.py,sha256=zPYUKMg_c0n9HFjZPG9nGN2kjpaH7qUCZxrD5B7G0_I,6195 +urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +urllib3/contrib/_securetransport/low_level.py,sha256=UbhUykEH6HUIJud9_rn_6YWjionk5iq_rq6YrhVM6Co,12062 +urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +urllib3/packages/ordered_dict.py,sha256=VQaPONfhVMsb8B63Xg7ZOydJqIE_jzeMhVN3Pec6ogw,8935 +urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/packages/backports/makefile.py,sha256=r1IADol_pBBq2Y1ub4CPyuS2hXuShK47nfFngZRcRhI,1461 +urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +urllib3/packages/ssl_match_hostname/_implementation.py,sha256=lAj7qGCZLOldhn8gZDY6Tqp4mvgkbTfy4k4gDIDRo8g,5702 +urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +urllib3/util/connection.py,sha256=_6_5JZJF3HHRXR7HaxHg3mk7qMKK3N0nl3DL8gFAfo4,4237 +urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +urllib3/util/response.py,sha256=SSNL888W-MQ8t3HAi44kNGgF682p6H__ytEXzBYxV_M,2343 +urllib3/util/retry.py,sha256=p4LHm-OVaNdNyZ-hoAodTIoxNocAuuegT36Hx_Gcwkg,14601 +urllib3/util/selectors.py,sha256=PIINzwjiD5Z6IyTKA1tR5n1kCOXyThpDCE2fCVFzLeM,21147 +urllib3/util/ssl_.py,sha256=YpciM0mN_rd27wchLENSxTNa7PWEgZ2MP9ateFurCeo,12208 +urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +urllib3/util/wait.py,sha256=Q_pd_bD6iaPgRKwEmcjTYDrSPj4Dd4ojykmqA398b8o,1451 +urllib3-1.22.dist-info/DESCRIPTION.rst,sha256=wZ7BLoh9W81dILKGrm81WByzI3Y4WdKwTYm7H5IiDQY,30385 +urllib3-1.22.dist-info/METADATA,sha256=ohOfSQgZEB8bK7bBbLSKlKlcDV7qdMygN2ws-VxLJY4,32027 +urllib3-1.22.dist-info/RECORD,, +urllib3-1.22.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +urllib3-1.22.dist-info/metadata.json,sha256=as-kzDEDsexZtkdBWBNzNjob8NAb9fYj1cP3jO7b7KY,1653 +urllib3-1.22.dist-info/top_level.txt,sha256=EMiXL2sKrTcmrMxIHTqdc3ET54pQI2Y072LexFEemvo,8 +urllib3-1.22.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +urllib3/contrib/__pycache__/securetransport.cpython-34.pyc,, +urllib3/contrib/__pycache__/socks.cpython-34.pyc,, +urllib3/util/__pycache__/connection.cpython-34.pyc,, +urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-34.pyc,, +urllib3/util/__pycache__/wait.cpython-34.pyc,, +urllib3/util/__pycache__/ssl_.cpython-34.pyc,, +urllib3/contrib/_securetransport/__pycache__/bindings.cpython-34.pyc,, +urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-34.pyc,, +urllib3/contrib/__pycache__/appengine.cpython-34.pyc,, +urllib3/util/__pycache__/timeout.cpython-34.pyc,, +urllib3/util/__pycache__/selectors.cpython-34.pyc,, +urllib3/contrib/__pycache__/ntlmpool.cpython-34.pyc,, +urllib3/util/__pycache__/retry.cpython-34.pyc,, +urllib3/util/__pycache__/__init__.cpython-34.pyc,, +urllib3/util/__pycache__/url.cpython-34.pyc,, +urllib3/contrib/_securetransport/__pycache__/__init__.cpython-34.pyc,, +urllib3/__pycache__/filepost.cpython-34.pyc,, +urllib3/__pycache__/exceptions.cpython-34.pyc,, +urllib3/__pycache__/connectionpool.cpython-34.pyc,, +urllib3/packages/backports/__pycache__/__init__.cpython-34.pyc,, +urllib3/__pycache__/fields.cpython-34.pyc,, +urllib3/util/__pycache__/request.cpython-34.pyc,, +urllib3/__pycache__/request.cpython-34.pyc,, +urllib3/contrib/__pycache__/pyopenssl.cpython-34.pyc,, +urllib3/packages/__pycache__/ordered_dict.cpython-34.pyc,, +urllib3/__pycache__/_collections.cpython-34.pyc,, +urllib3/__pycache__/__init__.cpython-34.pyc,, +urllib3/contrib/_securetransport/__pycache__/low_level.cpython-34.pyc,, +urllib3/__pycache__/response.cpython-34.pyc,, +urllib3/contrib/__pycache__/__init__.cpython-34.pyc,, +urllib3/packages/__pycache__/__init__.cpython-34.pyc,, +urllib3/packages/backports/__pycache__/makefile.cpython-34.pyc,, +urllib3/__pycache__/connection.cpython-34.pyc,, +urllib3/packages/__pycache__/six.cpython-34.pyc,, +urllib3/util/__pycache__/response.cpython-34.pyc,, +urllib3/__pycache__/poolmanager.cpython-34.pyc,, diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/WHEEL b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/metadata.json b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/metadata.json new file mode 100644 index 0000000..53cd8ec --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries"], "extensions": {"python.details": {"contacts": [{"email": "andrey.petrov@shazow.net", "name": "Andrey Petrov", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://urllib3.readthedocs.io/"}}}, "extras": ["secure", "socks"], "generator": "bdist_wheel (0.29.0)", "keywords": ["urllib", "httplib", "threadsafe", "filepost", "http", "https", "ssl", "pooling"], "license": "MIT", "metadata_version": "2.0", "name": "urllib3", "run_requires": [{"extra": "socks", "requires": ["PySocks>=1.5.6,<2.0,!=1.5.7"]}, {"extra": "secure", "requires": ["certifi"]}, {"environment": "python_version<=\"2.7\"", "extra": "secure", "requires": ["cryptography>=1.3.4", "idna>=2.0.0", "ipaddress", "pyOpenSSL>=0.14"]}], "summary": "HTTP library with thread-safe connection pooling, file post, and more.", "test_requires": [{"requires": ["mock", "nose", "pytest", "tornado"]}], "version": "1.22"} \ No newline at end of file diff --git a/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/top_level.txt b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/top_level.txt new file mode 100644 index 0000000..a42590b --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3-1.22.dist-info/top_level.txt @@ -0,0 +1 @@ +urllib3 diff --git a/env/lib/python3.4/site-packages/urllib3/__init__.py b/env/lib/python3.4/site-packages/urllib3/__init__.py new file mode 100644 index 0000000..aaa6b1c --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/__init__.py @@ -0,0 +1,97 @@ +""" +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 +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.22' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/env/lib/python3.4/site-packages/urllib3/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b68e0b2b3b12d85e43e6365dc811a77ffcc17176 GIT binary patch literal 2759 zcmZ`)TW{1x6h5~1zMEuoBh3Zs0-@PL78O*ftxyG}6jDJHu|X79mF4WrZXCuJ#x}4P zJO%ZyRQ*TQy!MHg{(wI9obfJMF0tj~IdkT6uHX5$HPiTI@6RWjO@M!3>N$hsoA@Pv z8vqQzL23XqK^PF2;Fw?#Z-KDDv4E9;l|hssD1%dmpaM<>f+{#wT!*p>h#CZSaOwqL z1<`<@2~M-%Yam(>%z!fk!7Mnl5X^xySIFuh+7QfxGhgrx5DO42g0oogO%O{EEQ7OL z@GTH$AXousrQl~kd} zbHLj02CZ)cUxTBwaEu18!;{c}Ul}TO4%h-Xp94dMY+zg9e4!Vf2YvyL4LG_8d>xK~ z#s;0R3G6(ub$DZda|wQ12X4X9m%uInufx$6u#3Pp;n*~cvEY&xbWRg|b(-Mvv;dF3 z0t~M?t1sTB(Dgc<{M$w*h42rq+uQd3q2wOhPP_rP`%xJ3e(Fb|9Y>My!=dek%$9sR zOOWX{-cqu33^nH+B$3Ec?)pI-$#nNECJb~ewQz5LfA99YWA^YAwMcWl4<}FVatAUB zT+|2;Zt$0V9+L(Ma;rS-M~u5cCQ?84Wa<7!T%nax3tja`zA|=aO!!4SDJwMoEg}>b@WFD5GKdAy4H92hH6~h0K*F(PFxQZpC*;!=ub|&jbBnig4=o>WA`uU zn5vX;F;ErB`;laF0i~M!cl~M_#8+cK-ag2D!M0yU(Lp?9-&`HX^WEQd{m@Tcw;PXC zi3fgqj;_&n8+m)mm@Wx-J0(?f-OvlT>#Bz91`*2yja#n!Eb~Mmk%SK?+7zQ@nj_23 zPHt!!n$Ndxg-r61y@x)Gp4(gKJ!HGFW^X2kULL*ZhCJ;k>%q=`Ui!Lw?V2P{$TE>S zkp__#kv5SzBx>Gc%uP~^oODGr#PG`s&9|AKcn7HV3r~iau8FMCo>?L@L=f(vPd=x| z8h_gVE;1>=kpZbmHTxO|$XZmwuT6Mm!cj@jlqs&bfa>}c)_H|w6Q&BUii#&mjc}7r zL(s%Ey^fXt(XjEk$3@JgjhSpe%l!URF|yGhU2AqP#bOM`d1j}PogQ+#u(4}DO86iX zv{9eK_(3)t>ax^4rfMd`L~l7PGS&75DPA=`-cP%FVZOP!I;}RmWnwUj$|a9jj*EGfTA+ zp8kw=?4_ujs-FxSsOZ>sRl`O1NikK{hGM~&wW6w0T&k*LJ*E;;=i)kE`5k@<1s>{i zM$0&3%;4KLRK*i7yitPxIOZYSS5?Lb9->Qsk{0x*)X-_Mgo7e2FzOUrYJf#7Z=4p( zA_;Xkg|H_$J4wkR0;=K>gQ9^yM$(BR{=veXw{$)9B$cN3U6H9dv#)c`YIK{bV)L*taw7;nN3QlJ+hq=rV-+|h0G zj+Bv9)k)4H@OoK#7)i9V>AJ%2bL>_H^BnsWc12{+6`l}iK0&&q0+Z*FsPa#DetdLS zQu@nnnwabHekT2N^tix7wcN`NjfC6`skREl!sHfsoNBlpsL*{8psb+Ny$EvirF?==0>HBRk(rQ_${>z%UHtNJXfk1 a_*&Q!PkAfWsw(=WR|JQCc7-BvdX$Ei&T=0H~9goR3+bcZlm!a>1+ZC zm$z@<$GPX8$9K-ff0ZW2KEC(sFaLF3ssB)YpEIbxi*NYfC_MbPR86V6r8X>O@j0Vv z8CB1!jjXEY)J9HOhi9Z?R@L&VUQinaWj$zIQ#rq=_Q#ZVm1S8UdO79g)l*E6S5GqR z^ku_RUnFA-GUoxsr)JRM5&Ea>O*f_;RPueRenxA!4{rFYl(f?I@WDHt-J}fUY`6O98hH| zo^rRtpw^0fr&@0YIx1)4;$64dtTuMz$-Aw{-LCn`GkWLme;QQwD;(SXWKek*-*5qi z4{9tjY$HSFf}dC%%=GX-Cw1Y}dbyzU=w7i<@Wa3SuHYNyP+*GnvbFXbl9&tq+Kw)u zRf=bCy%N=%uQaR8rR`R=<}I~@V7s~N{pgjJuGOmBZ=`>nN>Ho$m8cpt!sX^+JnA@p zBl5N56uAy5S5{|A_OzV7t8jgO`1d%Xgo<)bbCP((Z&#e?u<6I6tUY#XEmR}zR{U+Z zvfm?Hk4Sec)2>F2Glr)w1(PWS@@lP|k4GG*;nsb}iN_qL9(b)9>m|o|)N*U)jUL4m zdV)pD8&l&-!e6!vJ4;q6D=lE>_)oOwYu{U~R-*5@zj8Jnse�{$Uu8u_n6+2!3q5+X012?zt^b0bgL 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 bRt9czeDG?1;aK+gAF4l8zcBx}aO!^pyZwja literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/__pycache__/exceptions.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/__pycache__/exceptions.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4880814d363ec35c8d3108926a6b12d1f78fe6bc GIT binary patch literal 10866 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 mW25C`Jdgh)0 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/__pycache__/fields.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/__pycache__/fields.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2a8ea89a150b6b2509681f22b878ee1c6afa888 GIT binary patch literal 6115 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/__pycache__/filepost.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/__pycache__/filepost.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de83e05781f42704e0f88d336d9fdc1652fed19c GIT binary patch literal 2790 zcmb_eOK%)S5U!qmcptM~$A%aO0i8nxBfM)+LKJO6gouOWNO1y2M68H*XJ>ltvFDZU z9>=z9E{V9nf8dBXa6;n8%#~9v{D7RO>RInPfk;7O$`Sx5L z;7>U7E1~`wHuVPzAO9GH01<;e14exdLJRtqnJYn9f~XAraxqtiumVvP`c>>#z^_6$ z2T=|BwW2=ftu^xNR$+`Q2j zz{l=_(a(`RKFURSiY6{ncgtCNhPH#l^0qrtNtkId2%?kxO6kLilbUhJ?So3irc@#uKCrPNf-cFJzF&HIT?7Q-? zYYuWONtfrP9dYn0$R_GWJiolAqjW6|(#|LgLcep6B%^fO|70zbVHk`qPydgDP^5{{ z-SjYTzjVhuJ;6c&W!XaM(YxqJcb2hv*wi)(eB&`n22U)I7eQmlN;HBYJ7Eyppv$xF z!DTpRu>SBvII+x5lohk{OE|XR8}{f54eVB__Y)KY4=~@h9P8)@^X?5Tq^ku__J!nQ ziiPSn%*@_mQv4Be}^8~fZ3JgruZN{bY(GFy9Ih~elBzn}Q1 zJ307l$cK|_Hl4Y=5n$|;c4JTEWja(=(G__;K;y7QDld~NYc$#%%On~URyd`+TAZD; zAg>s87CULv`bFA0FjIqMv@6i$H*s81OrX|gic^*fmp`j2_cy3`+Jrpm5 z#v#}u6c9RRW3-NO+VV@28H}45aLR56k2AjMcDXN7DLnML-|O*@yH^W;Z@e-RU+)O+ z`hK8;B&I;TmV0^R?qQhpPN4WWi#^(G3`hvDLW?fnK%WcOU*(w+yhn?A!+$z!xXK^z z1l|rJN@p@wuODGParb{rr~;7FI8Y3zDQXu{pjRI*!*><|0`ndbfZ07Z>5h&EVuwwW z1ehIG_oJNc0H8Q6^`DWJzsTigo)>d>SlMk^nbBQF5_MD zEfOmvrc`6nRbIfcYuF|xIb}(SD%&Io6>5x)LM8G6ML^_$Ol;n4DA3M{6=|R5YhU>pWy^q$#4_$5yAk2a2``1 z{}>Vu&Y(ubRU-1iLui6Jb8u1yU4vtkScj0~egxg1F0R0-7)>c=o3Lw}1-}!8%}z8c zS=^djU+iRsEeJfi=usCQ%#1_6JY!q~uxd^QPRzMj64Aip3Z>ANQ+4m0BK3CcCBERU zp*chk)(S%3a9A+TaEQ3Ul7kQvJjy~Hq^{I!SZkt=?`oId-MD+3N>AkK2?Bb!!i^?0 z+cQ9-BDRiN5}aT{6~ZrGJ2iU37q2X<$nW&F&7*3kb4j%tCZAi4qZ)NP9n}8KY1gL) ze0oVa^O9<#shEbF^U7nY2XYQa^J<~z^HRhUQ$|4>WLNy zdY}(ek=M3`-gm=HI8}qBymtEVygW+$LrEnroD+U8eIL)h+ zejYxEKBtPW6DvrJOY&OkdVB7+Q08TQ`?TA|FD&Dpf*(x5tcFRlm!tPkre_9}9GziWWuTJQQeO3bZf%zW>b3 z4p)*Bw@dEfnKS2p{`39c|DVHuZ_dwt`{tj#|Bqi+>R(jha}x1y;2Zs_rId?bO9e{x zE!DP^#pjX=N~&FwcZio&yPU-a1$dn&+Ad=2X9_+D+A;SM7P#Ur_A@^RBLfMb%$Y?IrWvP{9$^Usmm9^E|79qpE*Q zwU3$SITajN{S&Hv0?$q5&MS98ZK1O#l~++ar<8YEJ;0zor`(rS`;2m5QSB#`S5iBl zSMCMnJ)s_8lus&mMY$K%M@qHND!-(>vf8ngcUE~%GK2di^~!Y8i|Up3Q@eGXj#Iwg`tm1Sq?VN|IvY_K zjAF0j_lKd5*FM2Q@x}35Ue6oE!NI$c=Uxj3vEvUs-6|!^Z{EIr6A1&a7yIGhW*7#^ zQKqdQPDC9Gtg*9k(2086Uf*k#ljXO=p2K3_bApj~UF%RM^Y1wOx4c*%n8)RtI@~{4 zmlE#|b_e0!09DmSI@k$)Mi*{*cSl|nzvIQ*p&KEkF?4j~b&v%QGg4PF$Bw<@44f@b zCrzm{ds-N>h0dl9`z({xcRf7$ftNIT9y(lzYVU58)O${cFQQ~Fih|CEo{lhrWG+qa zxV|=TdYC3}KTc*@p&7HOd^?O{6XT2|b9^8BeJ>oP4;th5y(le-crQ*G%(W4Oz1?J4 zDhx-u=XD&{)m{`OO{VcH-JNG_()-Dyj6m|{qga&M3L}w(;%M?5*@&daeP=)N$DZl_ zw&%E*2-D+^%&6(6iFdO1Y1ezZUfc2=@7hz;ko_3U-a-xU}!08$|eJ?ptNZj-X zSjwUH2XRv4;=bh_^hy+Ce5&});Cl_<=p;n=o~3q_dZ5((lDdbjWvSCU7N5<-75*s| z(@N^f{te|e)axI7UEMFMd-yG>-Kx@GV+4<<-KyGc@Hv(`nY2@8o!I&&%ayxdQ~14u zryXEdjc@K()IG#a**{nD3?EGiWVkX=YX3zQS6Raj3P^3QfAD$f1Cr`&I?XQelUMHk zjk>e{g1V>F4!e6+-AA4HMR#jT|CDX9J2UFa-JdG_-a$?ze5|nXXPy7ToXy(!T+^Nt zd$wZ_F_|`I+J-pV;U-cbG~8i!y8N~adBn;&`e0>N%3kgDLhWKj>^QVZRH{ME0# za^Btu<83?M_G}~kwli>TE~f2h&+a*qcflV--XQX0|3hy@YP!AcX>T*s-gy-CBYSf+ zkhbhWsQXR;d5cW78HhClROPwH}l*wX_}PtOSgXCpu_P_o;lKyD5unAYv4GqMT{ za{8RcPA`BQuSz|fXN=I6B-SvBJbQ238$3J?lw3hxOhL3Ajsn--;M#B-xbbKhn0~Ro zJwKh~Zr4n6w<{Cf?Q*K|fSMxP!KB-Lf8h5=eKXUm@xjou3q72!JRL&1_?>j|Cj+@! zkb?_>zw6oI#tyUqW)iJ2J9LDsNhUY49QiuPjHJDoZbYg!vb72@9O=QTeYMcRv<<8+ zrUjGe+78CZMpHeMOL00_&C#yfc8V0zc2Z42xgvmE%P?wT3bPhEhp=faS>W>oz}giq zbE`bgY8X$|pkD?KwPuq_FB~2uGeNiqCDeez8AJHJIGOQduOB7lEyiValS<%2N3dd~ z55r+n1F(Am^jp-n5Qc z$IA286V_9eMXPBYt(>;bl$Q`YQqpfCM^f32<6$zxFzT^P_91A01K;Sc5O^Rc7U>@e zA?Osi9%z#xfk;7QMty{o8A2SulY|BlFr$XVYs~M?DtAtOgyKjSuEuPjO?b5+;i7Vv z)JLF8$azG$%TjhuUL95LF)53J$bVe9C*%=?@1$~1NlsL9TDhQlXXF)XBcpmkFJc7F zv*i?BuLf9kz!?EaZ}_nWcxF2x0tA3=*hm~izzyM9*qGi>KutTnUEr{YETkLCo@J** z-Bb-&JB&YrQNP0lEa1=DsK4Q90{cT%5DXnKEo>@6Fg9V-b5dMKYT!9hoa2~I38C43 zY~*m$>28|f#hZpA5cd2*FBrLiK4KRTHJ^#|_GkcbjcjNRbTX|&^u-o*#2|0o+aCsg z&j%qr-0JsVcwsUu8G2`TZ_nCdz=5#}h;Rao8r%e_+Rj^BH5lGa z_r}Vk2^sgb9CmJE8oC%>6gvZ~RNA-e`%WK_y}D`;ji~+FYp>bquCiYhR7&aS^ZAm! zda0FnfY~)NW*afx_RpWYasBqW^Y%IJq}7WTx598M@X)>f#dH6k!hOdNK6?cR&UP3+ zs`0=ZJfHPkq;b->OJ+*eKAFXK>0!6Xr-G1B@D{$&O$0H>4Oo>B7nnvC>6lWTl8O-l zM&K9wv&;?oz_R$NBGd|z8L}xurI-$YAn~cJB~6I;FodB%j?tr?!w>)RyN++fPN9&Y zj_WOJjRr+8Kp{k|p&+RVZXjn;zY;k84cB??4_FvqHU0u6B3;^*P6rA&?sQhJfW|vP z^co_jK&!5sQbU#{S)RyPCdQi6lFY~qCMWpEa0@S*5Rhbvx~ND=^p{bpRY@w57i=bt zT)gyUr0ef8phB1oLvzA^58sGgQr42yz|V4}VU3SHYBUc`-8GhFUomx@G^x5}>35Md z)mGBzbO3jr?sWc$r9ei};`sRCcG4U@*2xe5a*d>+1w`^SvLFfTt)pE|zmmUQXY5iwnY zY@Q|^hpw{JZe8gw$_rQ{C31Th10?+L1XRJ?PpJE#>Tn=HrXi-VPax@cFM+T_yl2#I zN$GoP|0xw$Oy*ja8Hz5=+);N>p<(~rBNg>AwNcIaOUze}COOp~czbq+ZPOsO0et-7^|LCh(3e3hVUI|-*v(N zNep_UC=UDnSUe(zw{pJL^ox)ueF;HQ;WFrNAqu*g($}%j*Ri~6&1eFb+1A|n8ZJ1M zG}qVP?!0yV{X5^e_4+!nMs{LetNwr)zsZdC6jdVqIv-2Bd(*q4(SgtiBK;|HM9T=& z>^!*La&_K1R%%-F*2&V;2F^-68YzyT2D4j?NuKWE@n7WgdA&c3X^v_e69ioi?!taT zal@d5yTuqCUSFsLbvO|^)xDfSF{Ac;@QgtSJ7{y01^mH<&A{K<7E>j)8Y0-NSZavG z0k}z;e`6va+Ph$kjZHun_!G4{=|o|%S|xo81Jdsycr@n8tG~r-gLbv?ks{jlz_PTg zaE>kXW|Z+2Y#Ad0Jcy1{Cvw|c>IW84gi{C=Db55!PFW2vP%8oqpcv`lh~B5Gg6JYi zr{R+T2Du1J^oy_#lO3)CG{Ia|#89s|6wnfp=^i%Km%Qy&N|uk1*3NqfiCAV(|sISV+#{~34`4Lk_i6p z9snzn_VbFSL8f{ zTi2NLYYe`^EGH*@F*t{3`ZH05;0LQS6%$F4xxx$zm`o$bvFZ9K5r2=O21Mqn)?#T9 zY@=$OwPvYti?p~vxlLzSIQREa3+LMR3LdC2>Ei<(G(JDGIpE?;eR;BR=!?S(2tD*O zLMB@4K-PcGC;Kx9c&gI4gq)^=WIsyX^#S(u%7{@VWioF`L8PJdL|FWIvix8!BhQxN z;u2yW_*ow1i^>fVI}^Q$)EK2g&~KGxz4dLxlT*`+WLDKXfM$_ZX9+2r9LrwOHDsJ{ zaNipZf=*2>zjjgZU-6A7f2y_wMbRvcpSfA!$J1@6GntzO6wrBm1qcri;p)lC{>Bz; z0`rirW9qckEh6DMfQ|CN1xJixAP!Oh<7sj(loYZ=;soX;xgM0QR92*32*;H>U}4{V zkM*^xW}Jj;jTy zA1Rdx4IG?wc6yMQ%wKpOaqg#X_b{{Tc2hVuuBU0?nE(KVVhv22nh&lkc*hKmICyT= zjNtf)8 zQ1C=_UP1)gQ}(;aiO3Mv6;J>%VMKgQi~t!R8er>I8CIk74@K>_?)Uw`(e!An(uiDr zoX(jRZ1@o}M=|+Hs`+5g6%>$gm0Vt^G2#A&hTzZ;@mz617sv@3F}u(MfyUy(+$*A{ znUXzGZaEpIJ?e{FJ(nJeMyAkzK7YrfG-zJkBWS&-KB`SPgjVde5N>sG8AH_-hUkWH zvV*VXHF3n>kZEDTLW(`e z2k?$iqc<5$B%SXwld_EI(af7zqbamYjy__^XCXTg$()*NT2EQyvo}8l`%w2G^+sD< zgjXYy8KgT{ltfs!&l$;ZfH z0r-TTXUlE(L)YItupd)Q)S)>Mpu?XVf?b#_<5gIrz*XR)IeW;vROqR3JDN_i+uiOO zI2LwBQ9`uWN7(|^Oo`v5o=Ky`zVBjP#Mh!%5liZCdFBK=Rh;d5)|2)UP3uF?M6=hnyYJY}0iGf5m zIWaUCIFn%@A_fByp-oYOo+J_i4=d_Q8iS$0)5VIMGv+Vo(w#STMi;iX%k1q{hAt_Dx@Pn&N#DIkjU__)x8>zIVtyeRaep9F=aiTm0Idz z%HRbu!GqtBmi~ih0QZfJ1m_A|`ExSnhKlFaJ%kG^6`ivX*;!-?)I1sk7rft~Rdj$o z(NH@}++OG_P7zQ)?o(g@4@xEExifeUTj_{wr6G2b#q7&UZ(Bc5VpgGt?++~X9@05G zbFiw+RAK_-qiW|E&muSt7(m%D88~;)S~mRk)}r%4asRF3Adqg6)Fts4pnmvn#tL$V zLvJv#N@Oz_*8^}hjG_yq0)W)iunxj4zbD&Hcn8jFsd*-#dts#g92UqI==Z>;ViqyN z@-tCmihIVa%ic}=@Dom(-a&!8Y1HEZG7m2Ywlf5>%suz7o*O;O==LkCl02x>S`CUk(@=hn2?R212Mgil^ zPUkM%f9acAr{jjbPDk&tcVa2uVeI=190qjb7!E-DMU$37)gmA+%K!?1Egbd+U-0mc z21@if1kKM?OV!fyT(jJqSv=Eh96#BdUp%$A*gVEc@{ceBJViqUpcN0FeFAmy`^!pg z!n_5J%%~sX*b)(>3p%H-fKGLJC4L^jAOP?qoPZ+FTvl9;LVtwB8dKI=3wjC7I(y|* z$$yhKA)vx{Xs62Qezw;N(+zup{xX9J#dADtS{;tI%n2Hi0Efo7Fy@k+?H}NjkG>j# zh-=?jTf2VkcIqh=MrW>TynE~I%xj$9M3Az)qBS|syN#-mF~b|lk#a=C?gS|gm4E15 zvUrcdm{kLIE<1Y^_{scF7%AL?sl%B=0r$n_4e0Y6k^p@i00#%-9p1_fkJU*@!CDVT ztP{p+j(!bU$?K3AxR^~1tDjUS6$uoFIAUC}uVuGGgjSOg%Piz|IV1FB5c>urQreZB zNaneCz-VUgRXbBAH#xxUSTZ|el#?rJh}Fw4Ui!*I$BZxHkW%VdN%87498q5SS!H?3 zx#161LcKNJFpn5byF-xbXmY^#;-Mkx%b(gtgfrAnX+*#DGfT%TVXdNe8^EqK1E{ zVBNzg>A<=Gk3{0ccZ?)F;A&gk6v73U9GuXG?x4*Xo>1}b?|Q4THlBTsOMu`xUvFT{ zMkVvSLw_4VQZ-j|^h7$9Hmw`fH2{{}(+%LlWnYINFqJ z15hs$#XueNi&S}XRR)TU9?vEe+HvbRRNQi@0WavhHIFzBQ3@L{KRiBsHo(zRaR9be z#2Evzgk^=-{Ij@Q{IAfq10rCSjlg5hPXBgbF&C<4`$=3L$fh$UK5de zoCJP2DU4skH=^+P;ts|TUV%ky_7Mab$0g=AroKoi=ET70rSN0+uJf6bCI*tlRQmlY zi5Nd3V)L-SNCK2$e@IhjL&iTg^MpFRa19TVa0IiQsk5Bz>5LcNp&=IL7TI6 z5cWpNP3mdO9sOH)EKr#ne7oF1R}No>`+cs=0$!>a%4ijmT7?9|mvKl|A1XJoLb(ko zv4U&6h;Th}D-@2AOW=2!&0k9z~!9OK@cPW4@p42NwNFz8^}>(qiSfb(;4PiZhPR(o8^ae#qiK zVgO#J^sg`=>KGO){bH4qwa%L4lFL5svNigfnx{crt>Y)o)E5_fNR&?rA-$<@;TsVj zv3}G=SVaq$iZRKhHT^NtQ7>QPKvd+di}<8bEv+3v8gC|~_dZ&+aen!JJh^!3u+m2wGpD&9OPcy;ay8nlpxf4+w+6{EtM0yPv$)Ornz1 zU}J58Ai^>!HFoh*lzh ze}#^$h@y>)oh$Os5yn)6%_ zWh}VYD21Zus5S9ZTCz?6f1bcse#$Tw!6&LSxFGa%|5Rs|%gvX|)=}$3xop*}*~*E3 IJ8|cK0oI7*L;wH) literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/__pycache__/request.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/__pycache__/request.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f74a08c5970e00f5a1ce0256b01bc1dfd7467af7 GIT binary patch literal 5685 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 B1DpT= literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/_collections.py b/env/lib/python3.4/site-packages/urllib3/_collections.py new file mode 100644 index 0000000..5df2372 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/_collections.py @@ -0,0 +1,319 @@ +from __future__ import absolute_import +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 + + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict import OrderedDict +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. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/env/lib/python3.4/site-packages/urllib3/connection.py b/env/lib/python3.4/site-packages/urllib3/connection.py new file mode 100644 index 0000000..c0d8329 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/connection.py @@ -0,0 +1,373 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import sys +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 no +# earlier than 6 months ago. +RECENT_DATE = datetime.date(2016, 1, 1) + + +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. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``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 in case we have an older Python like 2.6. + self.source_address = kw.get('source_address') + + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: 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) + + # Superclass also sets self.source_address in Python 2.7+. + _HTTPConnection.__init__(self, *args, **kw) + + 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.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 + # the _tunnel_host attribute was added in python 2.6.3 (via + # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do + # not have them. + if getattr(self, '_tunnel_host', None): + # 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 + (six.binary_type,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, six.binary_type): + 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, **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 + + # 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, + ) + + +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 getattr(self, '_tunnel_host', None): + # _tunnel_host was added in Python 2.6.3 + # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + + 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 + + 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=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 hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/env/lib/python3.4/site-packages/urllib3/connectionpool.py b/env/lib/python3.4/site-packages/urllib3/connectionpool.py new file mode 100644 index 0000000..ec9600f --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/connectionpool.py @@ -0,0 +1,905 @@ +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 + + +if six.PY2: + # Queue is imported for side effects on MS Windows + import Queue as _unused_module_Queue # noqa: F401 + +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 = queue.LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host).lower() + 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 = set([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", + self.num_connections, self.host) + + 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.6 + 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 2.6 and older, 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. + """ + # 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).lower() + + # 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] + 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. + """ + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self._proxy_host, self.port) + else: + 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", + self.num_connections, self.host) + + 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): + """ + 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('[]') + return host diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/__init__.py b/env/lib/python3.4/site-packages/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f60dd9f60d73152cb559eabf0c165e6d3b1f20f6 GIT binary patch literal 142 zcmaFI!^`Cruso6h2p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CU)K61xdr+KnFYE@ zrI|S?x)u5PNd@UCruwBtIXRh0#&9}0Kd+=HGf6)_J~J<~BtBlRpz;=nO>TZlX-=vg K$k1XSW&i*&=_308 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/appengine.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/appengine.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75109e6d39b8ce9131dd72e562ebde729b3175a6 GIT binary patch literal 9319 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 Bc=G@N literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ece0510619f5678649382bbd37b1e64c5aa764f4 GIT binary patch literal 3480 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 UAPjP<`0}w|&uKH1pFURoe|DQ&0RR91 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d4a695236436687c1f2a2dde4c8298679cb81cf GIT binary patch literal 19492 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 E4VM036aWAK literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/socks.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/contrib/__pycache__/socks.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd7945b0319a3a513db7a6f6920e8c204ba56338 GIT binary patch literal 5082 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 QYk4-iP+h;dSzE{VfBcp32LJ#7 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__init__.py b/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..595ffc489515e6fba771817bb363caef63cb1dfd GIT binary patch literal 159 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 Xn2dOo`|=Y!^2pjH6m@vl?a{cuG?gj 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 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/low_level.py b/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..5e3494b --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,343 @@ +""" +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. + """ + 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.b64encode(random_bytes[:8]).decode('utf-8') + password = base64.b64encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/appengine.py b/env/lib/python3.4/site-packages/urllib3/contrib/appengine.py new file mode 100644 index 0000000..814b022 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/contrib/appengine.py @@ -0,0 +1,296 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from urllib3 import PoolManager + from 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 `_ 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 + `_ 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 +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import logging +import os +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..packages.six import BytesIO +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry + +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 + `_. + + 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) + + return HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **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 + + +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/env/lib/python3.4/site-packages/urllib3/contrib/ntlmpool.py b/env/lib/python3.4/site-packages/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..642e99e --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/contrib/ntlmpool.py @@ -0,0 +1,112 @@ +""" +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 = {} + headers['Connection'] = 'Keep-Alive' + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/pyopenssl.py b/env/lib/python3.4/site-packages/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..f63b840 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/contrib/pyopenssl.py @@ -0,0 +1,455 @@ +""" +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 + +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). + """ + 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. + """ + import idna + + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + + name = idna_encode(name) + if 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, x509.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. + names = [ + ('DNS', _dnsname_to_stdlib(name)) + for name in ext.get_values_for_type(x509.DNSName) + ] + 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: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + 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: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + 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: + wr = util.wait_for_write(self.socket, self.socket.gettimeout()) + if not wr: + 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_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: + rd = util.wait_for_read(sock, sock.gettimeout()) + if not rd: + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/securetransport.py b/env/lib/python3.4/site-packages/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..2cac70f --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/contrib/securetransport.py @@ -0,0 +1,810 @@ +""" +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 + +try: + memoryview(b'') +except NameError: + raise ImportError("SecureTransport only works on Pythons with memoryview") + +__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 becuase 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 + buffer = (ctypes.c_char * requested_length).from_address(data_buffer) + buffer_view = memoryview(buffer) + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + readables = util.wait_for_read([base_socket], timeout) + if not readables: + raise socket.error(errno.EAGAIN, 'timed out') + + # We need to tell ctypes that we have a buffer that can be + # written to. Upsettingly, we do that like this: + chunk_size = base_socket.recv_into( + buffer_view[read_count:requested_length] + ) + 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: + if error == errno.ECONNRESET: + 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: + writables = util.wait_for_write([base_socket], timeout) + if not writables: + 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: + if error == errno.ECONNRESET: + 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 None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/env/lib/python3.4/site-packages/urllib3/contrib/socks.py b/env/lib/python3.4/site-packages/urllib3/contrib/socks.py new file mode 100644 index 0000000..39e92fd --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/contrib/socks.py @@ -0,0 +1,188 @@ +# -*- 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 parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/env/lib/python3.4/site-packages/urllib3/exceptions.py b/env/lib/python3.4/site-packages/urllib3/exceptions.py new file mode 100644 index 0000000..6c4be58 --- /dev/null +++ b/env/lib/python3.4/site-packages/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 + ` and :exc:`ConnectTimeoutErrors `. + """ + 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 perfoming security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/env/lib/python3.4/site-packages/urllib3/fields.py b/env/lib/python3.4/site-packages/urllib3/fields.py new file mode 100644 index 0000000..19b0ae0 --- /dev/null +++ b/env/lib/python3.4/site-packages/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) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/env/lib/python3.4/site-packages/urllib3/filepost.py b/env/lib/python3.4/site-packages/urllib3/filepost.py new file mode 100644 index 0000000..cd11cee --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/filepost.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import +import codecs + +from uuid import uuid4 +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. + """ + return uuid4().hex + + +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:`mimetools.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/env/lib/python3.4/site-packages/urllib3/packages/__init__.py b/env/lib/python3.4/site-packages/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/urllib3/packages/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/packages/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b22474cc655a75428b638f6ce91220eec09339d0 GIT binary patch literal 293 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/packages/__pycache__/six.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/packages/__pycache__/six.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edbf3627b48026bcb76107dd8dfb38f8175a438b GIT binary patch literal 26457 zcmb_^31D2udEUG|aV!85BzQ;^wK^yf5($cjL>(kW5Xk$ys3E&OgUL|NQgMKmYtQ^L{@!(D(G@kG}YYmQug1x<026K8&yb&0(dq zQUyF6r4y>^sD*?oB$Puqsj5j;NJ<*QDOE_>a9S18Hk?s~j16a1A*(cU_9%@!y~@p~ zxjv?D))_Sq-2L5AS&7PZqLAt13FK`%^C&)`+??`$UAcp5#!-bK<*t#yTICK)U>%bR z>ytIb@Edl9W%FV0mip87@wXG`U-mT{Qlvi``A(mG| zEHBmu)C-LGXc%!Zuk?`8YlyXQkJ4+E9+vREsBWFo>!mt0&s4V!u_H=vkXVqsO^CP; zu^W}%B(a+m8+gAYY)8UorEimj+idnx#NMv-7Kzxd@+B`Y9VerS#J_{EX74l|Cc%Alrn}&+?^dGn2pHTYyl>Uft|E$tK+(p%&<3QCvqBiP3Z*%+wiTY7Q{g{pVl0^MQwUL?e6AHv%Qu;3| z{o^**PbmFYl>Vz0{Ib%2P3fN`ID1GH#zdt;7yNbVY43Q(MGU0sr@#=?wla zTtrS(v{M!3$p-uk8UWR_PlY8hp8h6rIVbhsQu=2_RsF10RS%0Q`P)i=MTIQFApARV z@aN*-&&R=Eh=YGO4gzgA=C8)VzZVC;76%V0{iQCdz8(kvejNMXf6?4$a846Pi{} zh#+O8-Yj!bu6p8NZyfCFfU~f+4+xP5x`_nR7?IyFL>^G?6J10i7l`aPMCKel5E41) z=pi9;$P#%_s9NJh(+8A);gHmOsJmX|i`9EPC(Jpd+=E^9A{XjiYw8_#^t!O#^^P8q zdPkg&A^W7&`Us#DCo?FJ4G#6c-stE}EKxYD^kzrjCgCHpa7Yg5+nvHu7`sjZM%Nuq z;TX(Xr*IrbtW!7vqs}RuRJD6y;7PW-CEGoc?Ow^YO|sp`Y)gI0eM%KhDP!V4EhheR z12FOR{f^!))t*u>)*P7lr&Qr7De#OcJQFMMx)d07^aE1hnXmv>IX^j|A9VB%i9Rh> z{25i4fEDcMF^PPZwt8Vw)zHvgot*k1NAH#l$h@bM`J~?K=zUDUGh9GSDpx3S?@=y{ z#)pN2Zd%Pfr`)4r`=3=I2*VWpJ7vLR0-m!VEL5bPx8Ml@pSR#i0WU}&{QRJP#L@eO zz!zY4JNhvRzo_)%j($SIFgg!7`k;g_3X+##f6E%_k_Dd>@Iw|nEMQU9F2Vlp!hf_2 z|9BVvV=M3S=CP!GXGouQ3ZBwaPQh1KKE6hu6YxC2 z+RI8m-$n6-E{e;fm~_u#vEb+zr6mYG zT^dFn_tUEQ8QYdOmG=w7i%?&0Nz>k>NFTd&NWBF9e^wPfM`w=vImXUGyKj-D#?@iO zaQX0{1<|rMmHSzBaPrF4Vf3n7zeD~MaS{= zS&7Lq;bjr_dhmb~&wLW(%3oOs#NvP#d>|ZF{>Zm z)$*#<%Jkmow^1t3mu6jmmtR>NYb*uXVzKJhip4{~;*$pDw0mC|3u7lhXHT(MD=oOi zV$fGCF4T3a%5bh&ywWOFO^P>wavf?+D95;7JPzP1sB;N{-+mGiWvL4R{zh#lo|hf< zvQkAb!2zEV?fem~^SWMcEx5I2saZjPHS76Oex_9`6B?TUKhO+hDHcZ)L5c}M5?~ia zBnB-hY0Z4k05XkDcq0g}-Vsb`f*vIj*@S2(2yC7jb=vz+i8SR6KX&9jx7qS)6wKyj zH;m1fW*}b@Q7!pRw4pgRnj{yED1wVgf5{KB28qvZB|n#wJ!tcre3K-eLZT9Vj&~b= zR~NzUNV$aw>Xe9Miay?{(G18sU1~2KbN#aShv^%ILJm0ZZALYt39lbN5?)R{#HUiL zG>gR-ki$yYx=v*fHIrVpBF?rE-8c(8iwBrKhfYxHm83#97y)5tBxRYmv{5yajGaqK z)`U0}F4Trqs+krO?`Z`SPs}Ex*Wy4C0}joU_hJCO0|* zPTFY?$G9L_Cq~mAb9zI3tl?t|AKUndhPw&L0J|Lt&*Li+kxS%~9%Et>A+o|O2k}@Y z5uZ?Wv18W&8s`m6u+UB-5jUWz5XdN<6){OGI~B!UK$% zGxDDhu7W+NJt4zESj7=x#)6gaq{ljgEQCr#dn+I-wkZ+sY^ckF^wm9P@-ukk5+l73W5&hA zn6kx>zYmXYF%D%|#P|(6!$#^2c(KhT(wh$YWyBfjjrh&khsgQ$*^8?SFM9!Imgtyn z+4Sy55pOpilrbZB*prKCMcdrCJidxtMwLSz+v~fCTPcT@%5j!?01vJo;J$?zh)To& zHf=W2atv0~ev>janx61Tkn~M7*I9&9L`W?TPND3jp%5WN?(+$CC8MUK*U$o^>Vw4C zL*7oJlg30XdZ+I|wcWFRmL|NJc#QcrK^9KN| zE}qn_jrY*4FQ={M)#_zYuUx!b6fK-qS0wV4w5a2>sAGih@2KNWk+-A>lr@-R283WX zQ>z&e`$4H05Hv(YJBrkxA0k^J$U59Pf)8f+-nt8#MSp0REk~gPWl}K0G2?H(!C0Ph#M%9Rk~kcH=RWgKcMuWgppy$Zie@D zZHD8-K))(rP2B?)t_#)|rz(qQFgHz>nwO0!?RxEB>dWJEB)@=!d;=+YV<^*zu7}|~ z*Dcf%zO3^qO+W9qrVY>iu|C0Y?sCP?i|xijRhJ6~WY13?pWOS~S z;8^}tGw)xnx2ifn?P6)UfXXY=RadZGtAG%@xEy;}%9X0syt@d^MT`F`7LizoU=cbK z=G!X;V-pOO;W#^B10I~OWr+iWgaK%Y(9%g5J7!?MR=-vYXXr=?4x#N~oGi(f%h(p6 z{&Ch}WDMee$7+1;3<46x5A#!poy6CtFfZQ6QGe{xR@xYb+BrKeATb+ZW^6ogC95t7 z-HD078H4RaqzcL5~eCqa5=xS7xRczf2-b3kIBae)Se~vd6eg zG4F6$%q9+9(ZUbf53hCB{y9r^P%oEXqhEzrU zzY##h(fN$>)=>negpsnKA{R%KMoE&OAjP4uf-FjLNY>9FS2+C*IjNiRtgAqbXVFsY zQJ`5G6744>Zl1bOyBljLN7hh#xrTx^ME8@CFfU$rjORO)f%aW8?#z(FVizN{R&VAh z$#y}EX0dfa&ol0ltfYc|Gx*K2>K45KcSDD>UtxQVJ(`3jg_PX2x|DR4iJHvLh?+ca znhc!}89}qyWG)*M(&T$O%SO@v$be?Q0wWxA9-e8=2;OrH&t+tNnvmrSxR+4HtmLtn z4NVHQZH9|i zS{2XL!om*fJa`k$cdn*$=Dixx!$Cz?Y5)R^(oI1KR-ZO(-qC^Oi#%CeaQ5-o8t)h% zC-`9f-WfjVwZc$=y!R20UvGJk=03)D9%9WLMBI9nPW)is+{*puKTqZY|>xKQz z9A$i?57+94@mUT&-3XfbO<9Lh-ddpK-&(vm5JsTt{^`Iw$GBcGbT!cYy1 z=Co;DTN1{?1OOzlT0yxWOMui#>{uAP-d!kFs>Ov0ocjxKUsh1G*CoNbrC5p5wCR?7Yl;^7$77g1&o?*zhOew#klmA>AVfuo;8P76D8Qz0bWwt2>4d2DRa z7v_ZZxB+peA+csv5F%~E`oAW^ukFI3IthJ>vvS|f1{hu9!Zj0!e4$|l5@zcS{I7=r6akcK1FW2kns{s5RCp>Q8w#^01UAb&5$}TL_ zYat(`EaByxh~|salkXZL%-*#0Stz&9+jFzv1zQeGf#Dc{ZE#aVll3jmR zwzYyD&?KD^^iN?LY1(LsD_-$~UK^?gy~vAM%PV1OMR2ZOsY!XC1%p0BwQ2^J35W4w z4ip>J7VMr@%@_x{FkqsI*sY1J+9!pef4!xkN5V~1*DIkG$MFE3evw4b^%L|9SaX|j zI)?yAC@uJ)hZzkfQwY`!d_Py+_OR(<)Cx%oM?x&li2fgCpPPa50s34DzMnq-7W(*d zSDzDx)phptaSmYVIkb9D(90Rn#I1)V)dV-s)$3E2agah{mksqXA!HfrR*5tDJ^<_P zyxDN^Ty&z}Y(Mt?2TWM>{jl%bU>6p-(U2i5OshBCT6@sQ%vgvx7?j0(wOV8!Dj`{F{}V#XM4d$_R%qSrUYwEI^`*N zHsOE{)-mBM>;h(tMH(w~(yNy-UjRi8!Nnz;rC$uC5XlgcOkx}STHVuUX1(CfWf2#! z)DCMu>z1ku!KNeAe$y+Jn?O@3A89o&Tg2;GbVcllRK6m5vqf{PLMy);&j|6XjNTxK zR>t=;yQLvVV9G-MoOUhHccPPRXuMRu>~=*Ap09~d)@B|i9$|Nfjs56B90c(yE>0Ct zy_KtOsn%))y%vaeAo%9=Atg)1j51_WGDEva%kFwRu0lpvvET zQ27m*RBrq64>GDu+4nQ7QW#P{(KW0H2U)m!r^TR;hLyn_`(Q`h7`7(dg1r!3vgsXj;<}YwA!b}vBGb< z`O*qoDo?fS!^vk)8oIu_fNddP{Fc_O*vYkQ;uAAxS)7>+V<0de3kJeff{ib=7886;A4=FAwGm4*`i;~a_vW! zZ{q9ooD|({8RN+oZ??zOcCK4+V+^BIcO92JLJ#cbBRG9ns^#IK zTcFFiV{cEu>%J9b#m8s1y>Nh!^(|vt&;yMG=lfOncS$VAf=YP92*(Jb4_FBLFao%f z9MJ?XI_@Mt6>UpgEn(UO$T_gp=6DE*7~@ zunvS^vtthm2I+a8dR*3p@AMv+h4H%B@D8oF4alhW?Ks3!EkPxA9q6(7u)0l_YD+eym&yt`4$GW2lBhKSZ#?8@=BEoV>E3FH%6$PG2Y#1p`++H}2D)5|fh z=XOJwCQ?Bc^QNv^?q@B4<-^~b*OI_yEjW}cSC{iA7%9sv64hijsqW~iXY{76$pWbn zDcK=(yxWl#jJgj$%bJ6C8Yp#l2WyP*NP6gUfb?)rQ+gk3703;=n&3|cX?6)#zc_(` zowRcRygZ6P0@%J)J7`_lKH)LEPAs^sLx;D6tt0pN;cr9?QAWfVX|$9iya(9C2l23V zZ)ZeD*~_#;&Ta41Rc00T!>SJByV}+d6x|JM{Xpc+iTfUG`p6iJh7Ax4v7&cFLcubO zF2g$+X4sWac=sSH#|%fhNbzd(;}&Gv*&(z&U@IJBu~jTK7U*iNv|F0I6A2GmOmNB& zZtp#b{Z5`Qmn{~EalYPaa@Pu5rgh)PiIt^%DCtp_sHtQWHN-PyR;Q_E-}_Bzvq%RH z&{I_fsd;zFhn{e-O*DV4i%8NJ^e_)|9I`}WyzT{&@4r587m5WLIfaS}z1;x4J$%H) z0NdcG(_}l+RqMmwMXhO|T)1VWvNb2Uj&;?!|GTM^Cm!FsPRVt$tIo&Bl85-%$Hybf zNkCT9xdR9ob%Jq^o(+`>d*>GHmEN1|)EDc>_rlFSxD{@uPklh#g@#*ufq2T&=j*DE2`gLq-^bUWP?R+PlLIdt)(*vdPmTlwr$)X1LO1!uTzDOJnW5 zw<=<4SXt=FTNT=ligx6s=qL_TRJ>JcJ^J1VE}F_O-3&)0Az)HRi*}?BhQ@WVH743w zI#p{scVnK;7$+`5&WcIYnZ{+k$U1rwcw=?29?{gCTOi>SY*7-JD-R)Yxx#Q-wJvn@ zakmqPjs|OB-e9|Z9M(efI4?03hE2@bQU&hdv+gYHoWi;=PM|ZTCfq@Ouy#eppua2M zcSEhm=DyycH-;;kOle(XGUf1=Lv5Jiusp#0h9@qSO|%m)z0^*vY^lMbHtX-XN9y#^KO(@|MB7Hy;-cW*m-W+zchmx>da5Ki!_(@E!=;EH~ zrKYb$uj zXDylM0FU+K{5eh@q7AR&zSKxp>IGsmNjR5CRbbDLrP^DLgO9kjX0FR(yRg*pR*jkK zrR}Zcb>1wixuYlxX}`E5k0Ui@zlh`L^pL<^gM}2f)E0Qe$1b*UqL;a_?Dn2RgGW<^ zj6qb$hG-BWXo9qqUCzQZD=&VT4CK)&l_2}fIev3L%fl5~)qV^sblkBNZf|ck!pUt% zzBzr6N8?5x@8h{RNzTWT``VrqWjA3%u)eTeCbb=ThKpv3G=*^*u@lFmbVO{DI=H1k zS6u>2xvs)}?eRZkord7mk;L>Nco6eGbc9$K3KK?Tw6D{G<&5r=x`YMaAh#)wFxg)M zX7~khI;~k|3_p})O6(B6{;whf$C3CVpzgSiOsMZs>XV4UK!bR0V_@nN=8}utZFvI& z64ILvPmi;(aqL2{adZ|^YKG|d%EiqT&(i{_hc|;|S>#F-FDGn$fO7o+f{lhF)r@4K z#eD-I2)9;vxy7LUj-X9jw0OsoK^w&zv;cv&kK=`CzZ0VMl*9P`FrIZKmA}_ne1N*< z*rhwwD;cQ(Peb>BV=9=uGT`9|%e9=v{i=y`#j;vEc4?H??_cR9JugGy{j>v>0bCsaL;yhi z;m(!sb1o1PXSu`98Xau!JBNiNuGsAKn@d$UFCq}F8s(~ebmw88+`=l4AMN$H91i-p z!NjQAEUskZ@b8Bp_1-a#jUF*qkzj869F+0Gmk`jPO6gLw1PNu(okW`@D`R!4?;C*Kj@yPB5`EJ-l8>c|2zTPoReb zArQA}rG`UuvZ>-d&17mD*rB)}r_5RPjN!|#k$I=dyu=7tmP!ogGQvF04`d@5X~T5< zXW&KVvtMrZ4#{?a-0(&I&5}Ckcr;KWMMud^;wwho1q4I~~pnZy38wsY`46(Sp$U7y(ZP@NJKrHB%)wF5Jbk+mQDp#LN-4n_uypL3e)w z*Ax?KM%=>~Th!pV`9r^1mzNnN$jl(aeLDaQXjoXEOmO^t5`#}JaZ|?ul%Zdgr&wD_ zZviEO^fj;4zzM!$k%0zod%`CiI5Th;_rPMV%+_372W&Mkv=|68bw-wr@;0*J8K6|o z?dan620`3$M4OVH5wMi^5%O<|k2W9Zy-@a&U9pl$#_v_6kFW*`iArord5kIJD<86s zTW)mS`VZrA((rIbj5fnSJPl7EM21n6lBAlEi|E%=T(GsbMZ1sGLE)`6nxXlU+=G*A zY-45A5PeuTKmIm6U`<9Z8Cgj}wk3lxx_}!+m8GRX$zOh@m$|iuR)AgT zV#ou!xU=j|dE3cGE=q$w-pweAA{7@N)MHv8?1`b)?hd3E^;)rbKN=F+A??xkBoBLv zQfd`1>PJb0=#hl?D#NeY2%}MYqc(1{Rl=qEF=Pscunfd&Vc>`{FMEI`bq@;@CCq<8 zBq*7CWgX%RHLHfGjy&rSUZ(F%c^C{GsiD!u-s4wRk?1iDZfMSM$O)slIrqpoH(~PH z#q}2M8p(t#E_hy4DBV;}P@8;WefWcj;xs9P^|~yUsMJJMIao19BlR^Srj1;2;v{{X zNl@d+17)_jmEf^U>#Si1tIMo6uAIgz(u@KXyG3K(#kM7@0Sv8TV9F4vfW3kz3>i@w z^jq+48-BIUy*$~B68+$o<~+iL z3o9Qpep;~Okf2n8D9kxgpPDPWphk_MYdTZ5%rH6V)b)7j0bYBsRW@>0j-i;UF_P7# zV8V(-Rt91icCa=PmBetr_i5B0DHw!BOvdr+pTPqf#5+Y%A?vVq%wpe!_7x%;IWUyRPp%6qM!!{_e2F7bL|0Aj_f6zYpi25u$SQ9=LK*8 zIUD2wH1D(I7R{s}g}2r0Glq1|nD9lj1)IdeI~d?`|5?{Fab~NrU&J)b)yq2?62_cL zuV&CcUE%J5iOVjO7X3;ao9t(fyfAgDaNH}A$`mh16?$bRkv-mH!gY9ln;>o>=)+|S zujzB<4Kn8Dq`aRiNaCP%Fz_teGE=QzGorwkVVTz+@clw^4Hf&xa->Rd?`G_NJ`VE1 zKKItJ{S(18u}Gz#vPbstAT zk^y-QbI^pLMdW0Q%^IFa@wO26R^slRfG5s$4Ub94xd7Qnmz{XbZiw5-jD5V#iq!`9 zbl2fG+`E^0xGV^Ux*~-W;P3uli^P98s7JTf(P>g2?k z;}hqmf*~7ue)8CnbH}G-i6IuF*aD&@y$R9=B@^B?=J6)WQn7@-K=ijo@4&!$rxNZn ziC320i_00bOi>)S&1xi%t8Va1ZgD~;GF*hkj?IXE7i*>Gz=DkMLnxyBUxa4NY*+&q zZTQC}c4{5oXto)lUim{z!n}NiOYux%I5CvmkdlL5iM7cb-hGzCJ>Cs#H;il^+OT=U zp%v8GNNxB9QmL&re;uNTztYhoE9-5UiSNeZk@V1zU8rTc=NzICrhsP^L%7R z+#=uwf5UJlnRNPKF4F@k=L6 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79dcf73ca98c11465dead2ea0415902a10bd15ed GIT binary patch literal 1403 zcmZuxPjBNy6o2C+PU5=Vr4@)1OjiOCX*W6St}0e5L<_A{gtpaYmx^$3op{{3acpa5 zLbg@HfpX;=fW!^)0r(``=E|u;;sbDj-`JZ_3C5o1_y5iB&3OLw*S*h>q8 zF16}T!m)^xRCwR~XL#P;(v9nL!H+NXd7kly{Pa}iqp{Gd;L}q+5imwP&Ly8J!Dop+ z=V6A3Bs)WNsJ&U3X~lKUM^c1Z@Q~k&QT!gSlJR_aAx66E-2f#$>oC*mmsJjr43i_* zYBAO^(IEN+Q~kh*G|`;VHM30B7IfpRW;J6*YKJuXQ@1`bqqm^_mQe;*$EwCIEnFK` z@kO8JF8PZl&6}jotpKVW8-uK`16mX{XwkMl@_U-MZTt>oWJQ4dsZ=>jl|~#4ZMt@7 z;aR?Zft_$^#|f}3>{OG+Et0=cOSt4L9&KD zHf(0t@ap{}`#MaMh)?oJ@b@JDAkWfEF7NZ%eLm!2n&vYRbqw9$NYFEB>DBf$8&2a` zND*`S+}G;b``t8Q%|z1jnz#x|?5EyrhDY?JxS#j{?{JM0eRHl}@C zNOgSQ2KOesH}S1QYBRZwES-jF20@gMf 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={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/env/lib/python3.4/site-packages/urllib3/packages/six.py b/env/lib/python3.4/site-packages/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/env/lib/python3.4/site-packages/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 " +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__init__.py b/env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3fa1589176296d83caf9d3dad35ab68c71f9f82 GIT binary patch literal 587 zcmZWlJ#Q2-6ddpF<>PYUh(tp~aV1+^wm?V}5kf+V6bgt$5weZ7cXkqU_IhReBJN7^ zC(@)2bo`!esjlG%q~bY|@@d&)OK;xH`2FjxcR%f49{x#yzqq$H=>36?|3x5ZGiaa$ zX73<@?+juU6Tl526Nn6F3_ls_8*&Fag~?E6FddW~u!H&l88IhaxC=1GW}DZt#9VsJ ze0|G2k4&)yLA2$Ew8NU=+ck(T%9R-KYreLiwD`P82^SrL`ODo(>rpkH41yh;%34?_ z#b9iO%#-%{N9lq(QsXMf9p|iTpP4F*Pxy)Tp{|TvFw$^Ygs7G$j^+dx<@03zq<#LV zJzs58Kl5$xR64J0%~gG5+qFH@SQl;#Q}6YiLHR01ja9!z1^zHi+2_hMS{hl0Dv(~g z%sG9J^WSj27%alomm-*^XjC&CO_dhIAJ&eVWAV0_I<3{{&F$TgS9L6X@zko|lvM@J ix0+eIvTdxGYWY4+!@nTtC287c{bZA^vovBdNdE&>1ehWK literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4aa24b18a03193cce5eebac816f65dcab3935343 GIT binary patch literal 3529 zcmZ`+UvC_@5hr)=pH8PgZ5lapf`D-9)Tc_P*pAaQX^IH4?AmZ8*HSE7jk{g#@}xcO z?XF2)EFB~ijZz@ZM=1JQwEZ0Y5Cw<=dFYd0+V?*7H{3f#cGHu{8;p7c;hlp0n6vDQ7z%O4?&P9y^*H4}G@dv+e9PR*@BU z&}8aojB^elOh3*zdlZAC%5KLM7FXF9P+4WN#!fL?XK{_i=o{<{?9gEG1dE%*vjbw1 z#VtoSSvOOv{zOGF5{{*Zt?= zvgsGgMN%y74w5upI?VIkVlTe2JWy$x>|Q_nF2d*_+>?4)>oj=L_~jt!7pd&S#E?AD zDUOtf9dO4?6Vc*s{G2R`e020_qE*mV(exuM?J;)Zvtws4nFy+fEA!YXXD1bQj7#*{ z{7KbO?nZy-VO(R!Rn~)VaIs*lvt#^w?4ZI_pBZ?o&Wuxw)eC5!bCxk;(!Zz8dKGqx zAs-P3xMJvoGEnMI?AT{L3>&1IXOG=p2%HHT>%Td<@lgF^#BJ)V*C0;tII&CLve0w! zhDbYg2J*x2v*Q}O`Q#0D0$I1~NRQi_^gONdZJI++wkR%plf;OX3y9DQw9+DNCll;= zg7v28a9E^>-Tyg7D+OH`MY)QJGP!tgYgN2=_1cX^p=BAn?{(hoTyHi7KKsTLA1p7M zJWq8ek*3?p)!y>H>8H!88FY7KJL- zBFRMbP4J4F>zjgN^8+!g{_JMcC|M|5P4j0`*;-f>GK+0fn@}13EHV4mQ_|L?j>1CPI+)Wi0ukl?B1xsK^ztOL z%{#Z(Hy*65u57N^stfXV(|U1c8{sD6w^l#~>-JmlQAi zZ5Hz*@e-)F$S(x7tO3`(i|;enQI^i2IoHj>q41b~l^h5JhU-eOJesG->3I%F-8`1y z%>BaQpYz5P0MGi(4*-bBCy6U*Uq-p2`x*s%{`YjP)$$a)XD@*rTHRu6f zeb&VVf~CR^zasp<`Q&rFDF$rgXQ#kZf{=G&-Pra3};6eB8bf9D1-5}XrWY!dXFDQ2b} zkESkJO6K>Xg%^@TAcqR1*881o!cx*hNmA&s?{hMK_TtynxD0mpaJe_Ka;l z4AVjRu2suGDD@6?g!{JjNm)1Cqt{Na7=R-ppk%f_Ld+FIMZo6Z&ibj$+%rMFN(%gb zSg0vb?S`#TD5`m4y+&(|Q6bi-SYc-U19@btpV3(`G1z?>Y^R-z&VC2{8Y=W%bgWV1 zGrsT5^C_>%rz&V(i%)nBl=JWMS9l9mtioqU-{0dkf1bbMxA+WZUk69cyX^W4o?3&p zcFWd-AkL#8P~X8=(c{4R#ZKPo7r8Q}GbV#zTw(*%b?{J;EZsrAbM9~&&l%!=4Y+4W k<0s`$hM&^=LBEEsR&DWC-N#9%_@r0!=PENdTGdwTziqZ max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/env/lib/python3.4/site-packages/urllib3/poolmanager.py b/env/lib/python3.4/site-packages/urllib3/poolmanager.py new file mode 100644 index 0000000..4ae9174 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/poolmanager.py @@ -0,0 +1,440 @@ +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 +) + +#: 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 + + 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) + + 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 contaning headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/env/lib/python3.4/site-packages/urllib3/request.py b/env/lib/python3.4/site-packages/urllib3/request.py new file mode 100644 index 0000000..c0fddff --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/request.py @@ -0,0 +1,148 @@ +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 = set(['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 NotImplemented("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() + + 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 mimick behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/env/lib/python3.4/site-packages/urllib3/response.py b/env/lib/python3.4/site-packages/urllib3/response.py new file mode 100644 index 0000000..d3e5a1e --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/response.py @@ -0,0 +1,626 @@ +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, binary_type, 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 = binary_type() + 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 GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + return self._obj.decompress(data) + + +def _get_decoder(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, attempts to decode specific content-encoding's based on headers + (like 'gzip' and 'deflate') will be skipped and raw data will be used + instead. + + :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, + retries=None, enforce_content_length=False, request_method=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 + + if body and isinstance(body, (basestring, binary_type)): + 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 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 and 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 + + elif length is not 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 and content_encoding in self.CONTENT_DECODERS: + 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 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.") + + # 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 + + with self._error_catcher(): + 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() diff --git a/env/lib/python3.4/site-packages/urllib3/util/__init__.py b/env/lib/python3.4/site-packages/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/urllib3/util/__pycache__/__init__.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..160dac5aab2c64017d233d1eef6a08e14c039eb0 GIT binary patch literal 1317 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/request.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/request.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b0a10a4d780d2927e691406dcaede4076c9ca8c GIT binary patch literal 3348 zcmbtW&2JmW6`$pj6iHDZwG%gO`Z0A{uq;R_L0z{H61TFV6fRWRh@7V3Wj)*-i7V}w zXJ##twb7!^y|)~CE>QHp>3OdKTIA9{AgBJ`EWf0<=phTvaQDrdH*enO??3I0)^8sD z{gcTiW1q8?r-AohVd%eL3h;AS#8~XGp~D>duCS=WVwVkFe7h{DvZ%`98XMMFTxY|2 zNv*MHjl~T%Y~UN@CX+4plCj}B3)a5!Yp|fnJ_TEw1uYh=vroaf!2*14*!NA^a@^hg z0!p#2Q*4QmPNUpNFO0KP8IYQzyLV*br-A&ULQIvy85J90V&th*o|$A)gX{H=5+yIf zBoL!W-cN(cfl{fOwoj*F)(hlGB#b=r>vRmBHH<38K8F4`rjW50b@tq0>O*E2y%>kR ztT6RGmUQNnilzLLOn2rI&r65Ba9C1jrb;iMJg<`>-%TI_nXHmgq*_UG znfe=pAx(`LDBzMz{LZW`@$yaLZIrxKrvACYTYV*Ov*fKY^*Py`wy&3@It<+w>$rD| z<2fF~zJ6{rKS>oom5Efsgvlva@@X!$;bSQRsq~;_*>^LcM9j~n%sdf=&*ZKplcWbH z{K=EYDwj{5^tcED%{zXYB+@rwn(W#weY>SIlX+F7@O_yX&-xhWFXirwgpVW_e3Yh< z6iJUqp*B4Zb+u7o9V}FspU;gFi6&=jZc^S^b$@5ceh4}IB8(#3+wikAOk}`E6Yi&R zES7A?_LPzlisTwxLi0?e&%!_kSFeFpWw?}^-umnZJ05w>Va-ZD^^v`R!Q z;XbV|QWeZhXPw@my{QVPa6Ea+3gm;qptDedI9};B7~yi_eSH5@t!!;~nx+84t9!6wrCG5bzZpuBDAtWc9pq zy+2PY5_}~aO3`0Bz3J99)@f_0&$PAFv}i5UdRo6v(Z{E?+?@1(QEXiC;PmDz+&XQ{ zEk50_hM&8l+bCM04ijxe;>*HCau-!f^`c6tS#0g??;kvR>>V8KKYahe(XW+@imhsx zih3ZaGj!Jqt7lo6&_%A6l)_%9^iR=R#%!^DJ&KEsE8$eE%{=}OrryALU;cc@#Mw?3 zX8lnfMnV5FO-I>j@UxwHk}m#D812j|=^&dF?bY~Mhba9MOzeksr|xVyF2;>Y-Pu?f zuJabY%6X%rz71}l8X!IN-^Q^03vHZQ54zHMld136Ze=OxUrusJo$R^o@8Ece#$NJ` z*<_pOXXt8Zeh&Ni>6lfGOTFx*!p>Vv1cPWhVeIiZeJ1%y7)h$aW-JW&(6Ynqf|NuDmDeByNnbXs4`Ahf6rM|- zj?S>Lj24||1phSGQl4M!vj`(nXDQ*)JOZIHv6JRdncP>ZTU3dBG~L@vxFlG}Q{T@O zROJ_AnLtar^(yqS1}LvpUI(dc)MPOI@S}v9%}S)&AfHEx?W+GnT#yrFflcQon#;UH zr%|BsI0q~N&`3`>;ac3ng4`Znv;i99Ay5kd$dB}(+f?60cqu9+ieN2}DyHw#MCev= zOhxN=BFbeM{8bX!b=42BFl@}v95(G68R%LPppr1=Vd&Q|vGp6yn+W<%=ce;orR{9F zb;ojaw~ChMl?m#3iYil4M~Rhp@7Ov$Y-hqh2iDO89bVe1ZS^f$@{({LN{22r-m+WE xD6s0=nrHLNp0uJL)na8cwefD826-g!IUwm9n6{nm$}Nn#({!88>wE1R{{=atm7o9s literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/response.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/response.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c218a525e9331a8df092eb1da4f2f76a9c19228a GIT binary patch literal 1951 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 XvS`U~p*Fo(TqrJB3&nH)s}BATs8Wt! literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/selectors.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/selectors.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd0dedc0cdda5211b6374daa088319133cd5a095 GIT binary patch literal 17855 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 T$&cZB64!ZL*RZg5apL~~m@+of literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/ssl_.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/ssl_.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9544ee61678c1a6ceba66e6e83c4169db463aeba GIT binary patch literal 9490 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 WWUjAPu2dX#5XBF|eKh literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/timeout.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/timeout.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da7744934e66fda7bd01f5ba6f46f6549c2c0460 GIT binary patch literal 9012 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/url.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/url.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7ce14f4b865cd53513502296e15dfbd021d6b25 GIT binary patch literal 5592 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 GKlvY8qZQ8p literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/__pycache__/wait.cpython-34.pyc b/env/lib/python3.4/site-packages/urllib3/util/__pycache__/wait.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96ebe8415592e695b410bce39c3743c060a871ed GIT binary patch literal 1689 zcmd5+UvCpf5TCs}pBqSNQ7xzvvJg(C!dsMrh$TQMrEx@PBxJ4c*3O2#TW5Ej zkSKX+P|I7@4}lP(Z~Zp++9zK60eI@n9SN?4kop8G&)m%I%S|QrEQCtsIia!P#AY-t>APZn4fGmWK5V8n1B4B9%X$WZqFEFA8a)=BY<9e<{iVz?WkzpyVL9Ux(~Z|*NWD%9EyqdJ*j2ljV+qp$K92+{%ZHma&fA% z*H`babypHo(IpU z2(XP?A-R}{E+y9B2;ld7a2Ue#Z)j`z=><5%{1CQcIEdgSMhC#Q1+4!DFvN39Aby21 zqz(so3WH^o-a3Nv(-Ty^cD(-=Ul+BiOx{1lgOY?Y+qh@CyWc%0p6w=4f?JLu-PU$RalL+mW&^XRoX*Vo=Wzl>r z^h9>8rO8#uhw~y&WD!wlQQs6!cyDb;u?;In_*U8?uApnziW(8(ERAzf_bQWS;)})! zvJq|DS=?>2GRV$RY3ItLwC`3XHel4 zLWb}PAt6U0(!loLPED(oBE?zz^0P{fR5#>5Q;JhV-)D(Pw9k`GSd`FJsswKCgkCCi z86#W?Nn|gg{lDP(a|)hatNd314>jUtPCR`QANuS396qN{@S#fb+bMu9QEH=@Ii5{d rUVw74OV};du2>)}EyYj4PcvK%Z(}ht=|syVy5}xNb+yqt*Q);uWiqbL literal 0 HcmV?d00001 diff --git a/env/lib/python3.4/site-packages/urllib3/util/connection.py b/env/lib/python3.4/site-packages/urllib3/util/connection.py new file mode 100644 index 0000000..bf699cf --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/util/connection.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import +import socket +from .wait import wait_for_read +from .selectors import HAS_SELECT, SelectorError + + +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 + + if not HAS_SELECT: + return False + + try: + return bool(wait_for_read(sock, timeout=0.0)) + except SelectorError: + return True + + +# 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 + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/env/lib/python3.4/site-packages/urllib3/util/request.py b/env/lib/python3.4/site-packages/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/urllib3/util/response.py b/env/lib/python3.4/site-packages/urllib3/util/response.py new file mode 100644 index 0000000..67cf730 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/util/response.py @@ -0,0 +1,81 @@ +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: # Platform-specific: Python 3. + unparsed_data = get_payload() + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/env/lib/python3.4/site-packages/urllib3/util/retry.py b/env/lib/python3.4/site-packages/urllib3/util/retry.py new file mode 100644 index 0000000..c603cb4 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/util/retry.py @@ -0,0 +1,401 @@ +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. + + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: 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): + + 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 + + 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, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/env/lib/python3.4/site-packages/urllib3/util/selectors.py b/env/lib/python3.4/site-packages/urllib3/util/selectors.py new file mode 100644 index 0000000..d75cb26 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/util/selectors.py @@ -0,0 +1,581 @@ +# Backport of selectors.py from Python 3.5+ to support Python < 3.4 +# Also has the behavior specified in PEP 475 which is to retry syscalls +# in the case of an EINTR error. This module is required because selectors34 +# does not follow this behavior and instead returns that no dile descriptor +# events have occurred rather than retry the syscall. The decision to drop +# support for select.devpoll is made to maintain 100% test coverage. + +import errno +import math +import select +import socket +import sys +import time +from collections import namedtuple, Mapping + +try: + monotonic = time.monotonic +except (AttributeError, ImportError): # Python 3.3< + monotonic = time.time + +EVENT_READ = (1 << 0) +EVENT_WRITE = (1 << 1) + +HAS_SELECT = True # Variable that shows whether the platform has a selector. +_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. +_DEFAULT_SELECTOR = None + + +class SelectorError(Exception): + def __init__(self, errcode): + super(SelectorError, self).__init__() + self.errno = errcode + + def __repr__(self): + return "".format(self.errno) + + def __str__(self): + return self.__repr__() + + +def _fileobj_to_fd(fileobj): + """ Return a file descriptor from a file object. If + given an integer will simply return that integer back. """ + if isinstance(fileobj, int): + fd = fileobj + else: + try: + fd = int(fileobj.fileno()) + except (AttributeError, TypeError, ValueError): + raise ValueError("Invalid file object: {0!r}".format(fileobj)) + if fd < 0: + raise ValueError("Invalid file descriptor: {0}".format(fd)) + return fd + + +# Determine which function to use to wrap system calls because Python 3.5+ +# already handles the case when system calls are interrupted. +if sys.version_info >= (3, 5): + def _syscall_wrapper(func, _, *args, **kwargs): + """ This is the short-circuit version of the below logic + because in Python 3.5+ all system calls automatically restart + and recalculate their timeouts. """ + try: + return func(*args, **kwargs) + except (OSError, IOError, select.error) as e: + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + raise SelectorError(errcode) +else: + def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): + """ Wrapper function for syscalls that could fail due to EINTR. + All functions should be retried if there is time left in the timeout + in accordance with PEP 475. """ + timeout = kwargs.get("timeout", None) + if timeout is None: + expires = None + recalc_timeout = False + else: + timeout = float(timeout) + if timeout < 0.0: # Timeout less than 0 treated as no timeout. + expires = None + else: + expires = monotonic() + timeout + + args = list(args) + if recalc_timeout and "timeout" not in kwargs: + raise ValueError( + "Timeout must be in args or kwargs to be recalculated") + + result = _SYSCALL_SENTINEL + while result is _SYSCALL_SENTINEL: + try: + result = func(*args, **kwargs) + # OSError is thrown by select.select + # IOError is thrown by select.epoll.poll + # select.error is thrown by select.poll.poll + # Aren't we thankful for Python 3.x rework for exceptions? + except (OSError, IOError, select.error) as e: + # select.error wasn't a subclass of OSError in the past. + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + elif hasattr(e, "args"): + errcode = e.args[0] + + # Also test for the Windows equivalent of EINTR. + is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and + errcode == errno.WSAEINTR)) + + if is_interrupt: + if expires is not None: + current_time = monotonic() + if current_time > expires: + raise OSError(errno=errno.ETIMEDOUT) + if recalc_timeout: + if "timeout" in kwargs: + kwargs["timeout"] = expires - current_time + continue + if errcode: + raise SelectorError(errcode) + else: + raise + return result + + +SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) + + +class _SelectorMapping(Mapping): + """ Mapping of file objects to selector keys """ + + def __init__(self, selector): + self._selector = selector + + def __len__(self): + return len(self._selector._fd_to_key) + + def __getitem__(self, fileobj): + try: + fd = self._selector._fileobj_lookup(fileobj) + return self._selector._fd_to_key[fd] + except KeyError: + raise KeyError("{0!r} is not registered.".format(fileobj)) + + def __iter__(self): + return iter(self._selector._fd_to_key) + + +class BaseSelector(object): + """ Abstract Selector class + + A selector supports registering file objects to be monitored + for specific I/O events. + + A file object is a file descriptor or any object with a + `fileno()` method. An arbitrary object can be attached to the + file object which can be used for example to store context info, + a callback, etc. + + A selector can use various implementations (select(), poll(), epoll(), + and kqueue()) depending on the platform. The 'DefaultSelector' class uses + the most efficient implementation for the current platform. + """ + def __init__(self): + # Maps file descriptors to keys. + self._fd_to_key = {} + + # Read-only mapping returned by get_map() + self._map = _SelectorMapping(self) + + def _fileobj_lookup(self, fileobj): + """ Return a file descriptor from a file object. + This wraps _fileobj_to_fd() to do an exhaustive + search in case the object is invalid but we still + have it in our map. Used by unregister() so we can + unregister an object that was previously registered + even if it is closed. It is also used by _SelectorMapping + """ + try: + return _fileobj_to_fd(fileobj) + except ValueError: + + # Search through all our mapped keys. + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + return key.fd + + # Raise ValueError after all. + raise + + def register(self, fileobj, events, data=None): + """ Register a file object for a set of events to monitor. """ + if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): + raise ValueError("Invalid events: {0!r}".format(events)) + + key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) + + if key.fd in self._fd_to_key: + raise KeyError("{0!r} (FD {1}) is already registered" + .format(fileobj, key.fd)) + + self._fd_to_key[key.fd] = key + return key + + def unregister(self, fileobj): + """ Unregister a file object from being monitored. """ + try: + key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + # Getting the fileno of a closed socket on Windows errors with EBADF. + except socket.error as e: # Platform-specific: Windows. + if e.errno != errno.EBADF: + raise + else: + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + self._fd_to_key.pop(key.fd) + break + else: + raise KeyError("{0!r} is not registered".format(fileobj)) + return key + + def modify(self, fileobj, events, data=None): + """ Change a registered file object monitored events and data. """ + # NOTE: Some subclasses optimize this operation even further. + try: + key = self._fd_to_key[self._fileobj_lookup(fileobj)] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + if events != key.events: + self.unregister(fileobj) + key = self.register(fileobj, events, data) + + elif data != key.data: + # Use a shortcut to update the data. + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + + return key + + def select(self, timeout=None): + """ Perform the actual selection until some monitored file objects + are ready or the timeout expires. """ + raise NotImplementedError() + + def close(self): + """ Close the selector. This must be called to ensure that all + underlying resources are freed. """ + self._fd_to_key.clear() + self._map = None + + def get_key(self, fileobj): + """ Return the key associated with a registered file object. """ + mapping = self.get_map() + if mapping is None: + raise RuntimeError("Selector is closed") + try: + return mapping[fileobj] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + def get_map(self): + """ Return a mapping of file objects to selector keys """ + return self._map + + def _key_from_fd(self, fd): + """ Return the key associated to a given file descriptor + Return None if it is not found. """ + try: + return self._fd_to_key[fd] + except KeyError: + return None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +# Almost all platforms have select.select() +if hasattr(select, "select"): + class SelectSelector(BaseSelector): + """ Select-based selector. """ + def __init__(self): + super(SelectSelector, self).__init__() + self._readers = set() + self._writers = set() + + def register(self, fileobj, events, data=None): + key = super(SelectSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + self._readers.add(key.fd) + if events & EVENT_WRITE: + self._writers.add(key.fd) + return key + + def unregister(self, fileobj): + key = super(SelectSelector, self).unregister(fileobj) + self._readers.discard(key.fd) + self._writers.discard(key.fd) + return key + + def _select(self, r, w, timeout=None): + """ Wrapper for select.select because timeout is a positional arg """ + return select.select(r, w, [], timeout) + + def select(self, timeout=None): + # Selecting on empty lists on Windows errors out. + if not len(self._readers) and not len(self._writers): + return [] + + timeout = None if timeout is None else max(timeout, 0.0) + ready = [] + r, w, _ = _syscall_wrapper(self._select, True, self._readers, + self._writers, timeout) + r = set(r) + w = set(w) + for fd in r | w: + events = 0 + if fd in r: + events |= EVENT_READ + if fd in w: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + +if hasattr(select, "poll"): + class PollSelector(BaseSelector): + """ Poll-based selector """ + def __init__(self): + super(PollSelector, self).__init__() + self._poll = select.poll() + + def register(self, fileobj, events, data=None): + key = super(PollSelector, self).register(fileobj, events, data) + event_mask = 0 + if events & EVENT_READ: + event_mask |= select.POLLIN + if events & EVENT_WRITE: + event_mask |= select.POLLOUT + self._poll.register(key.fd, event_mask) + return key + + def unregister(self, fileobj): + key = super(PollSelector, self).unregister(fileobj) + self._poll.unregister(key.fd) + return key + + def _wrap_poll(self, timeout=None): + """ Wrapper function for select.poll.poll() so that + _syscall_wrapper can work with only seconds. """ + if timeout is not None: + if timeout <= 0: + timeout = 0 + else: + # select.poll.poll() has a resolution of 1 millisecond, + # round away from zero to wait *at least* timeout seconds. + timeout = math.ceil(timeout * 1e3) + + result = self._poll.poll(timeout) + return result + + def select(self, timeout=None): + ready = [] + fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.POLLIN: + events |= EVENT_WRITE + if event_mask & ~select.POLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + + return ready + + +if hasattr(select, "epoll"): + class EpollSelector(BaseSelector): + """ Epoll-based selector """ + def __init__(self): + super(EpollSelector, self).__init__() + self._epoll = select.epoll() + + def fileno(self): + return self._epoll.fileno() + + def register(self, fileobj, events, data=None): + key = super(EpollSelector, self).register(fileobj, events, data) + events_mask = 0 + if events & EVENT_READ: + events_mask |= select.EPOLLIN + if events & EVENT_WRITE: + events_mask |= select.EPOLLOUT + _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) + return key + + def unregister(self, fileobj): + key = super(EpollSelector, self).unregister(fileobj) + try: + _syscall_wrapper(self._epoll.unregister, False, key.fd) + except SelectorError: + # This can occur when the fd was closed since registry. + pass + return key + + def select(self, timeout=None): + if timeout is not None: + if timeout <= 0: + timeout = 0.0 + else: + # select.epoll.poll() has a resolution of 1 millisecond + # but luckily takes seconds so we don't need a wrapper + # like PollSelector. Just for better rounding. + timeout = math.ceil(timeout * 1e3) * 1e-3 + timeout = float(timeout) + else: + timeout = -1.0 # epoll.poll() must have a float. + + # We always want at least 1 to ensure that select can be called + # with no file descriptors registered. Otherwise will fail. + max_events = max(len(self._fd_to_key), 1) + + ready = [] + fd_events = _syscall_wrapper(self._epoll.poll, True, + timeout=timeout, + maxevents=max_events) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.EPOLLIN: + events |= EVENT_WRITE + if event_mask & ~select.EPOLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._epoll.close() + super(EpollSelector, self).close() + + +if hasattr(select, "kqueue"): + class KqueueSelector(BaseSelector): + """ Kqueue / Kevent-based selector """ + def __init__(self): + super(KqueueSelector, self).__init__() + self._kqueue = select.kqueue() + + def fileno(self): + return self._kqueue.fileno() + + def register(self, fileobj, events, data=None): + key = super(KqueueSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + if events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + return key + + def unregister(self, fileobj): + key = super(KqueueSelector, self).unregister(fileobj) + if key.events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + if key.events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + + return key + + def select(self, timeout=None): + if timeout is not None: + timeout = max(timeout, 0) + + max_events = len(self._fd_to_key) * 2 + ready_fds = {} + + kevent_list = _syscall_wrapper(self._kqueue.control, True, + None, max_events, timeout) + + for kevent in kevent_list: + fd = kevent.ident + event_mask = kevent.filter + events = 0 + if event_mask == select.KQ_FILTER_READ: + events |= EVENT_READ + if event_mask == select.KQ_FILTER_WRITE: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + if key.fd not in ready_fds: + ready_fds[key.fd] = (key, events & key.events) + else: + old_events = ready_fds[key.fd][1] + ready_fds[key.fd] = (key, (events | old_events) & key.events) + + return list(ready_fds.values()) + + def close(self): + self._kqueue.close() + super(KqueueSelector, self).close() + + +if not hasattr(select, 'select'): # Platform-specific: AppEngine + HAS_SELECT = False + + +def _can_allocate(struct): + """ Checks that select structs can be allocated by the underlying + operating system, not just advertised by the select module. We don't + check select() because we'll be hopeful that most platforms that + don't have it available will not advertise it. (ie: GAE) """ + try: + # select.poll() objects won't fail until used. + if struct == 'poll': + p = select.poll() + p.poll(0) + + # All others will fail on allocation. + else: + getattr(select, struct)().close() + return True + except (OSError, AttributeError) as e: + return False + + +# Choose the best implementation, roughly: +# kqueue == epoll > poll > select. Devpoll not supported. (See above) +# select() also can't accept a FD > FD_SETSIZE (usually around 1024) +def DefaultSelector(): + """ This function serves as a first call for DefaultSelector to + detect if the select module is being monkey-patched incorrectly + by eventlet, greenlet, and preserve proper behavior. """ + global _DEFAULT_SELECTOR + if _DEFAULT_SELECTOR is None: + if _can_allocate('kqueue'): + _DEFAULT_SELECTOR = KqueueSelector + elif _can_allocate('epoll'): + _DEFAULT_SELECTOR = EpollSelector + elif _can_allocate('poll'): + _DEFAULT_SELECTOR = PollSelector + elif hasattr(select, 'select'): + _DEFAULT_SELECTOR = SelectSelector + else: # Platform-specific: AppEngine + raise ValueError('Platform does not have a selector') + return _DEFAULT_SELECTOR() diff --git a/env/lib/python3.4/site-packages/urllib3/util/ssl_.py b/env/lib/python3.4/site-packages/urllib3/util/ssl_.py new file mode 100644 index 0000000..32fd9ed --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/util/ssl_.py @@ -0,0 +1,341 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning + + +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 + +# 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 & 3.1 + supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or + (3, 2) <= sys.version_info) + + 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): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + 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, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **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 abbrevation. + (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 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) + + # 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 + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + 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. This is not + supported on Python 2.6 as the ssl module does not support it. + :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.6, 2.7, 3.2 + 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 HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Subject 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) diff --git a/env/lib/python3.4/site-packages/urllib3/util/timeout.py b/env/lib/python3.4/site-packages/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/env/lib/python3.4/site-packages/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 + `_. + 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 + `_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/env/lib/python3.4/site-packages/urllib3/util/url.py b/env/lib/python3.4/site-packages/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/env/lib/python3.4/site-packages/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/env/lib/python3.4/site-packages/urllib3/util/wait.py b/env/lib/python3.4/site-packages/urllib3/util/wait.py new file mode 100644 index 0000000..cb396e5 --- /dev/null +++ b/env/lib/python3.4/site-packages/urllib3/util/wait.py @@ -0,0 +1,40 @@ +from .selectors import ( + HAS_SELECT, + DefaultSelector, + EVENT_READ, + EVENT_WRITE +) + + +def _wait_for_io_events(socks, events, timeout=None): + """ Waits for IO events to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be interacted with immediately. """ + if not HAS_SELECT: + raise ValueError('Platform does not have a selector') + if not isinstance(socks, list): + # Probably just a single socket. + if hasattr(socks, "fileno"): + socks = [socks] + # Otherwise it might be a non-list iterable. + else: + socks = list(socks) + with DefaultSelector() as selector: + for sock in socks: + selector.register(sock, events) + return [key[0].fileobj for key in + selector.select(timeout) if key[1] & events] + + +def wait_for_read(socks, timeout=None): + """ Waits for reading to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be read from immediately. """ + return _wait_for_io_events(socks, EVENT_READ, timeout) + + +def wait_for_write(socks, timeout=None): + """ Waits for writing to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be written to immediately. """ + return _wait_for_io_events(socks, EVENT_WRITE, timeout)