[
  {
    "path": ".editorconfig",
    "content": "# EditorConfig: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with a newline ending every file\n[*]\nend_of_line = lf\ninsert_final_newline = true\nindent_style = tab\nindent_size = tab\n\n# Set default charset\n[*.py]\ncharset = utf-8\ntab_width = 4\n\n[*.json]\ntab_width = 4\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [houtianze]\nbuy_me_a_coffee: ibic\n"
  },
  {
    "path": ".gitignore",
    "content": "#backup file\n*.*~\n\n*.py[cod]\n\n# C extensions\n*.so\n\n# Packages\n*.egg\n*.egg-info\ndist\nbuild\neggs\nparts\nbin\nvar\nsdist\ndevelop-eggs\n.installed.cfg\nlib\nlib64\n__pycache__\n\n# Installer logs\npip-log.txt\n\n# Unit test / coverage reports\n.coverage\n.tox\nnosetests.xml\n\n# Translations\n*.mo\n\n# Mr Developer\n.mr.developer.cfg\n.project\n.pydevproject\n\n### personal\n# setuptools cache\n.eggs\n*.swp\n## PyCharm\n#.idea/\n#.idea/workspace.xml\n#*.rst\n#\n\n.metals/\n.idea/\n\n**/.DS_Store\nbypy/test/**/*.bin\nbypy/test/downdir/\nbypy/test/sharedir/\nbypy/test/configdir/bypy.setting.json\nbypy/test/configdir/bypy.hashcache.json\n.vscode/tags\n.venv\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: python\n#sudo: false\nsudo: false\npython:\n  - \"2.7\"\n  - \"3.3\"\n#  - \"3.5\"\n# command to install dependencies,\n# e.g. pip install -r requirements.txt --use-mirrors\naddons:\n  apt:\n    packages:\n    - aria2\ninstall:\n - pip install -r requirements.txt\n - pip install pyflakes\n - pip install coverage\n - pip install coveralls\n# command to run tests, e.g. python setup.py test\nscript:\n - pyflakes bypy\n - python -m coverage run --include \"bypy*\" -m bypy.test\n# - python -m coverage run -m bypy\nnotifications:\n  email:\n    on_success: change # default: change\n    on_failure: always # default: always\nafter_success:\n - coveralls\n"
  },
  {
    "path": ".vscode/.ropeproject/config.py",
    "content": "# The default ``config.py``\n# flake8: noqa\n\n\ndef set_prefs(prefs):\n    \"\"\"This function is called before opening the project\"\"\"\n\n    # Specify which files and folders to ignore in the project.\n    # Changes to ignored resources are not added to the history and\n    # VCSs.  Also they are not returned in `Project.get_files()`.\n    # Note that ``?`` and ``*`` match all characters but slashes.\n    # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'\n    # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'\n    # '.svn': matches 'pkg/.svn' and all of its children\n    # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'\n    # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'\n    prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject',\n                                  '.hg', '.svn', '_svn', '.git', '.tox']\n\n    # Specifies which files should be considered python files.  It is\n    # useful when you have scripts inside your project.  Only files\n    # ending with ``.py`` are considered to be python files by\n    # default.\n    #prefs['python_files'] = ['*.py']\n\n    # Custom source folders:  By default rope searches the project\n    # for finding source folders (folders that should be searched\n    # for finding modules).  You can add paths to that list.  Note\n    # that rope guesses project source folders correctly most of the\n    # time; use this if you have any problems.\n    # The folders should be relative to project root and use '/' for\n    # separating folders regardless of the platform rope is running on.\n    # 'src/my_source_folder' for instance.\n    #prefs.add('source_folders', 'src')\n\n    # You can extend python path for looking up modules\n    #prefs.add('python_path', '~/python/')\n\n    # Should rope save object information or not.\n    prefs['save_objectdb'] = True\n    prefs['compress_objectdb'] = False\n\n    # If `True`, rope analyzes each module when it is being saved.\n    prefs['automatic_soa'] = True\n    # The depth of calls to follow in static object analysis\n    prefs['soa_followed_calls'] = 0\n\n    # If `False` when running modules or unit tests \"dynamic object\n    # analysis\" is turned off.  This makes them much faster.\n    prefs['perform_doa'] = True\n\n    # Rope can check the validity of its object DB when running.\n    prefs['validate_objectdb'] = True\n\n    # How many undos to hold?\n    prefs['max_history_items'] = 32\n\n    # Shows whether to save history across sessions.\n    prefs['save_history'] = True\n    prefs['compress_history'] = False\n\n    # Set the number spaces used for indenting.  According to\n    # :PEP:`8`, it is best to use 4 spaces.  Since most of rope's\n    # unit-tests use 4 spaces it is more reliable, too.\n    prefs['indent_size'] = 4\n\n    # Builtin and c-extension modules that are allowed to be imported\n    # and inspected by rope.\n    prefs['extension_modules'] = []\n\n    # Add all standard c-extensions to extension_modules list.\n    prefs['import_dynload_stdmods'] = True\n\n    # If `True` modules with syntax errors are considered to be empty.\n    # The default value is `False`; When `False` syntax errors raise\n    # `rope.base.exceptions.ModuleSyntaxError` exception.\n    prefs['ignore_syntax_errors'] = False\n\n    # If `True`, rope ignores unresolvable imports.  Otherwise, they\n    # appear in the importing namespace.\n    prefs['ignore_bad_imports'] = False\n\n    # If `True`, rope will insert new module imports as\n    # `from <package> import <module>` by default.\n    prefs['prefer_module_from_imports'] = False\n\n    # If `True`, rope will transform a comma list of imports into\n    # multiple separate import statements when organizing\n    # imports.\n    prefs['split_imports'] = False\n\n    # If `True`, rope will sort imports alphabetically by module name\n    # instead of alphabetically by import statement, with from imports\n    # after normal imports.\n    prefs['sort_imports_alphabetically'] = False\n\n\ndef project_opened(project):\n    \"\"\"This function is called after opening the project\"\"\"\n    # Do whatever you like here!\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"files.exclude\": {\n        \"**/.classpath\": true,\n        \"**/.project\": true,\n        \"**/.settings\": true,\n        \"**/.factorypath\": true\n    },\n    \"java.completion.enabled\": false,\n\n   \"files.watcherExclude\": {\n        \"**/target\": true\n    }\n}\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\n.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing Guideline\n\nFirst of all, thank you very much for submitting codes / pull requests to this little project. :smile:\n\nI want the whole project to be licensed under the permissive **MIT license**, so that anybody can use it pretty much anyway they want. So by submitting codes / changes to this project, you agree to license all of them under the **MIT license** to this project.\n\n--------\n\n首先，非常感谢你对这个小工具提交的代码/改动。 :smile:\n\n我希望整个项目都是使用**MIT授权协议**的，好让每个人使用的时候几乎不受任何限制。所以通过向这个项目提交代码/改动，你同意将它们全部用**MIT协议**授权给这个项目。\n\n"
  },
  {
    "path": "HISTORY.md",
    "content": "### Version History:\n\n- 1.8.9: Store list/meta command output in self.file_list (Hacky)\n- 1.8.8: Respect the `verify` flag in `syncup`\n- 1.8.7: Loosen system encoding check on Windows\n- 1.8.6: Fix progress file path for concurrent runs by @Bluetea577\n- 1.8.5: Workaround Baidu returning 200 for invalid/expired `access_token` so that `refresh_token()` continues to work\n- 1.8.4: Fix packing error (missing 'auth.json')\n- 1.8.3: Fix upload getting 31023 - 'Param Error'\n- 1.8.2: Remove invalid GPL text\n- 1.8.1: Fix multiprocess (by changing all `__foo()` to `_foo()`)\n- 1.8: No longer server auth\n- 1.7.14: Fix issue #612: Can't download file when a directory has more than 1000 items\n- 1.7.13: Correct the Aliyun auth server address\n- 1.7.12: Fix deps in setup.py\n- 1.7.11: Fix jsonload() bug introduced in the previous commit\n- 1.7.10: Make sure progress json loading error handling works in both Json 2 and 3\n- 1.7.9: Fix multiprocess file writing\n- 1.7.8: Fix package reading\n- 1.7.7: Enable local auth using env vars\n- 1.7.6: Fix `refresh_token`\n- 1.7.5: Restore recursive directory walk\n- 1.7.4: Screwed up `refresh_token`\n- 1.7.3: Make `list` able to handle more than 1000 items\n- 1.7.2: Fix release.sh\n- 1.7.1: Fix upgrading in Python2 (unicode file name support seems to be broken)\n- 1.7.0: Follow Baidu's encrypted MD5 algorithm\n- 1.6.11: Revert the previous change - Baidu PCS's behavior is wrong and makes no sense\n- 1.6.10: Fix MD5 comparison (thanks to @shenchucheng)\n- 1.6.9: Make auth server list dynamic\n- 1.6.8: Fix 1000 items limit for downloading\n- 1.6.7: Handle update check network exceptions\n- 1.6.6: Let it cry when dies, so we can have some trace\n- 1.6.5: Fix `KeyError: u'md5'` in remote directory walking\n- 1.6.4: Fix `--move` argument causing exception\n- 1.6.3: Change default timeout to 5 minutes\n- 1.6.2: Properly handle (treat it as no error) error\\_code 31061 (file already exists) from PCS\n- 1.6.1: Ensure cache loading/saving failures won't affect normal operations; Fix the bug that clean up code not called on exit\n- 1.6.0: Fix 1000 items limit for remote directory listing\n- 1.5.13: Fix multiprocess upload/syncup missing some files\n- 1.5.12: Add one more heroku server; Workaround \"ValueError: unknown locale: UTF-8\" on macOS (by xslidian)\n- 1.5.11: Fix typo near version string\n- 1.5.10: Print the error code if the action failed\n- 1.5.9: Migrate the OpenShift auth server\n- 1.5.8: Add `--move` flag to delete source files/directories on successfull transfers\n- 1.5.7: Reduce multiprocess timeout to 49 days, to accommodate Python 3 on Windows\n- 1.5.6: Downloading using downloader also retries\n- 1.5.5: Minor: Improve 'multiprocess' installation prompts\n- 1.5.4: Print instructions on how to fix 'multiprocess' errors\n- 1.5.3: Change to streaming upload\n- 1.5.2: Defuse the circular import bomb brought in the previous version...\n- 1.5.1: Improve multiprocess (and fix filter() for Python3)\n- 1.5.0: Multi-Process for directory download / upload / sync up/down\n\n- 1.4.4: Aria2 download works even file names contain single quote (')\n- 1.4.3: Fix __server_auth()\n- 1.4.2: Add bypy version in getting and refresshing token requests for finer control\n- 1.4.1: Fix a severe bug in token refreshing\n- 1.4.0: Correct Refresh server list; Add in update check\n\n- 1.3.9: Add in queue for capturing JSONs returned from PCS\n- 1.3.8: Don't output Auth Server failures if no `-d` specified\n- 1.3.7: Allow passing leading dash arguments to downloader\n- 1.3.6: Fix downdir downloads to a wrong directory structure\n- 1.3.5: Fix aria2 unable to resume download\n- 1.3.4: Add --select-fastest-mirror, --config-dir command line arguments; Switch to wheel dist format\n- 1.3.3: Fix the upload failure when slices expired\n- 1.3.2: Enable SSL check by default now\n- 1.3.1: Fix setup.py failures\n- 1.3.0: Major change: Make bypy a real Python package\n\n- 1.2.22: Fix \"TypeError: b'xxxxxx' is not JSON serializable\" for cache\n- 1.2.21: Support aria2 downloading resuming (disable preallocation)\n- 1.2.20: Fix an error in upload resuming; Add in retries for aria2\n- 1.2.19: Add in aria2 download support\n- 1.2.18: Add in upload resuming using slices; Fix Unicode issues with `py2_jsondump()`; Fix the pypi setup package\n- 1.2.17: Fix UnicodeEncodeError on redirect; Add in retry on urllib3 TimeOutError\n- 1.2.16: Add in proxy prompts\n- 1.2.15: Fix a severe bug (accidental directory deletion) in `download` command intoduced in 1.2.14\n- 1.2.14: Add in `download` command\n- 1.2.13: Remove argcomplete; Improve encoding handling prompting\n- 1.2.12: Add in (optional) argcomplete\n- 1.2.11: Fix Exception in error dump introduced in 1.2.10\n- 1.2.10: Handle (32, 'EPIPE'); Warn LOUDLY on encoding failures; Remove `is_revision`\n- 1.2.9: Fix formatex() Syntax Error; Handle (110, 'ETIMEDOUT')\n- 1.2.8: Fix a Syntax Error; Handle `{'error_code': 0, 'error_msg': 'no error'`}\n- 1.2.7: Fix Hash Cache JSON saving (need to use string for Hashes)\n- 1.2.6: Fix Hash Cache JSON dumping (`Unicode` again)\n- 1.2.5: Add in offline (cloud) download; Fix stack printing\n- 1.2.4: Fix command line parsing for Python 3 (`Unicode` by default)\n- 1.2.3: Fix GUI for Python 3\n- 1.2.2: Fix division for Python 3\n- 1.2.1: Make it `universal` (Python 2 & 3 compatible)\n- 1.0.20: Initial release\n\n"
  },
  {
    "path": "HISTORY.rst",
    "content": "Version History:\n~~~~~~~~~~~~~~~~\n\n-  1.8.9: Store list/meta command output in self.file_list (Hacky)\n\n-  1.8.8: Respect the ``verify`` flag in ``syncup``\n\n-  1.8.7: Loosen system encoding check on Windows\n\n-  1.8.6: Fix progress file path for concurrent runs by @Bluetea577\n\n-  1.8.5: Workaround Baidu returning 200 for invalid/expired\n   ``access_token`` so that ``refresh_token()`` continues to work\n\n-  1.8.4: Fix packing error (missing ‘auth.json’)\n\n-  1.8.3: Fix upload getting 31023 - ‘Param Error’\n\n-  1.8.2: Remove invalid GPL text\n\n-  1.8.1: Fix multiprocess (by changing all ``__foo()`` to ``_foo()``)\n\n-  1.8: No longer server auth\n\n-  1.7.14: Fix issue #612: Can’t download file when a directory has more\n   than 1000 items\n\n-  1.7.13: Correct the Aliyun auth server address\n\n-  1.7.12: Fix deps in setup.py\n\n-  1.7.11: Fix jsonload() bug introduced in the previous commit\n\n-  1.7.10: Make sure progress json loading error handling works in both\n   Json 2 and 3\n\n-  1.7.9: Fix multiprocess file writing\n\n-  1.7.8: Fix package reading\n\n-  1.7.7: Enable local auth using env vars\n\n-  1.7.6: Fix ``refresh_token``\n\n-  1.7.5: Restore recursive directory walk\n\n-  1.7.4: Screwed up ``refresh_token``\n\n-  1.7.3: Make ``list`` able to handle more than 1000 items\n\n-  1.7.2: Fix release.sh\n\n-  1.7.1: Fix upgrading in Python2 (unicode file name support seems to\n   be broken)\n\n-  1.7.0: Follow Baidu’s encrypted MD5 algorithm\n\n-  1.6.11: Revert the previous change - Baidu PCS’s behavior is wrong\n   and makes no sense\n\n-  1.6.10: Fix MD5 comparison (thanks to @shenchucheng)\n\n-  1.6.9: Make auth server list dynamic\n\n-  1.6.8: Fix 1000 items limit for downloading\n\n-  1.6.7: Handle update check network exceptions\n\n-  1.6.6: Let it cry when dies, so we can have some trace\n\n-  1.6.5: Fix ``KeyError: u'md5'`` in remote directory walking\n\n-  1.6.4: Fix ``--move`` argument causing exception\n\n-  1.6.3: Change default timeout to 5 minutes\n\n-  1.6.2: Properly handle (treat it as no error) error_code 31061 (file\n   already exists) from PCS\n\n-  1.6.1: Ensure cache loading/saving failures won’t affect normal\n   operations; Fix the bug that clean up code not called on exit\n\n-  1.6.0: Fix 1000 items limit for remote directory listing\n\n-  1.5.13: Fix multiprocess upload/syncup missing some files\n\n-  1.5.12: Add one more heroku server; Workaround “ValueError: unknown\n   locale: UTF-8” on macOS (by xslidian)\n\n-  1.5.11: Fix typo near version string\n\n-  1.5.10: Print the error code if the action failed\n\n-  1.5.9: Migrate the OpenShift auth server\n\n-  1.5.8: Add ``--move`` flag to delete source files/directories on\n   successfull transfers\n\n-  1.5.7: Reduce multiprocess timeout to 49 days, to accommodate Python\n   3 on Windows\n\n-  1.5.6: Downloading using downloader also retries\n\n-  1.5.5: Minor: Improve ‘multiprocess’ installation prompts\n\n-  1.5.4: Print instructions on how to fix ‘multiprocess’ errors\n\n-  1.5.3: Change to streaming upload\n\n-  1.5.2: Defuse the circular import bomb brought in the previous\n   version…\n\n-  1.5.1: Improve multiprocess (and fix filter() for Python3)\n\n-  1.5.0: Multi-Process for directory download / upload / sync up/down\n\n-  1.4.4: Aria2 download works even file names contain single quote (’)\n\n-  1.4.3: Fix \\__server_auth()\n\n-  1.4.2: Add bypy version in getting and refresshing token requests for\n   finer control\n\n-  1.4.1: Fix a severe bug in token refreshing\n\n-  1.4.0: Correct Refresh server list; Add in update check\n\n-  1.3.9: Add in queue for capturing JSONs returned from PCS\n\n-  1.3.8: Don’t output Auth Server failures if no ``-d`` specified\n\n-  1.3.7: Allow passing leading dash arguments to downloader\n\n-  1.3.6: Fix downdir downloads to a wrong directory structure\n\n-  1.3.5: Fix aria2 unable to resume download\n\n-  1.3.4: Add –select-fastest-mirror, –config-dir command line\n   arguments; Switch to wheel dist format\n\n-  1.3.3: Fix the upload failure when slices expired\n\n-  1.3.2: Enable SSL check by default now\n\n-  1.3.1: Fix setup.py failures\n\n-  1.3.0: Major change: Make bypy a real Python package\n\n-  1.2.22: Fix “TypeError: b’xxxxxx’ is not JSON serializable” for cache\n\n-  1.2.21: Support aria2 downloading resuming (disable preallocation)\n\n-  1.2.20: Fix an error in upload resuming; Add in retries for aria2\n\n-  1.2.19: Add in aria2 download support\n\n-  1.2.18: Add in upload resuming using slices; Fix Unicode issues with\n   ``py2_jsondump()``; Fix the pypi setup package\n\n-  1.2.17: Fix UnicodeEncodeError on redirect; Add in retry on urllib3\n   TimeOutError\n\n-  1.2.16: Add in proxy prompts\n\n-  1.2.15: Fix a severe bug (accidental directory deletion) in\n   ``download`` command intoduced in 1.2.14\n\n-  1.2.14: Add in ``download`` command\n\n-  1.2.13: Remove argcomplete; Improve encoding handling prompting\n\n-  1.2.12: Add in (optional) argcomplete\n\n-  1.2.11: Fix Exception in error dump introduced in 1.2.10\n\n-  1.2.10: Handle (32, ‘EPIPE’); Warn LOUDLY on encoding failures;\n   Remove ``is_revision``\n\n-  1.2.9: Fix formatex() Syntax Error; Handle (110, ‘ETIMEDOUT’)\n\n-  1.2.8: Fix a Syntax Error; Handle\n   ``{'error_code': 0, 'error_msg': 'no error'``}\n\n-  1.2.7: Fix Hash Cache JSON saving (need to use string for Hashes)\n\n-  1.2.6: Fix Hash Cache JSON dumping (``Unicode`` again)\n\n-  1.2.5: Add in offline (cloud) download; Fix stack printing\n\n-  1.2.4: Fix command line parsing for Python 3 (``Unicode`` by default)\n\n-  1.2.3: Fix GUI for Python 3\n\n-  1.2.2: Fix division for Python 3\n\n-  1.2.1: Make it ``universal`` (Python 2 & 3 compatible)\n\n-  1.0.20: Initial release\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Hou Tianze ( https://github.com/houtianze )\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include bypy/*.pem\ninclude LICENSE\ninclude README.md\ninclude HISTORY.md\ninclude HISTORY.rst\ninclude CONTRIBUTING.md\n"
  },
  {
    "path": "README.md",
    "content": "bypy - Python client for Baidu Yun (Personal Cloud Storage) 百度云/百度网盘Python客户端\n====================================================================================\n\n[![alt text](https://img.shields.io/pypi/v/bypy.svg \"PyPi Version\")](https://pypi.python.org/pypi/bypy)\n[![alt text](https://img.shields.io/pypi/dm/bypy.svg \"PyPi Downloads\")](https://pypi.python.org/pypi/bypy)\n[![alt text](https://travis-ci.org/houtianze/bypy.svg \"Build status\")](https://travis-ci.org/houtianze/bypy)\n[![Coverage Status](https://coveralls.io/repos/houtianze/bypy/badge.svg?branch=master&service=github)](https://coveralls.io/github/houtianze/bypy?branch=master)\n[![Code Climate](https://codeclimate.com/github/houtianze/bypy/badges/gpa.svg)](https://codeclimate.com/github/houtianze/bypy)\n[![Join the chat at https://gitter.im/houtianze/bypy](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/houtianze/bypy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua)\n\n极简说明\n-------\n\n- 安装: `pip install bypy`\n- 运行: `bypy`\n\nTL;DR\n-----\n\n- To install: `pip install bypy`\n- To use: `bypy`\n\n**此项目已经进入维护状态：不会再有新的功能加入，只有在发现重大bug情况下才会有 _可能_ 更新。**\n\n**This is project is now in \"maintenance\" mode: NO new features will be added, and _may_ be updated only if critical bugs are found.**\n\n---\n\n**如果有人想帮助搭国内建授权服务器的话，请按以下步骤进行:**\n\n1. Clone <https://github.com/houtianze/bypyoauth> 并用任意值配置好环境变量后成功运行服务\n2. Fork 此repo，并把你的新服务器地址加到这里 <https://github.com/houtianze/bypy/blob/master/bypy/res/auth.json>\n3. 创建拉取请求，然后通过 [![Join the chat at https://gitter.im/houtianze/bypy](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/houtianze/bypy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 或者在拉取请求里留下你的联系方式\n4. 我测试新服务器可以使用后，通过Gitter/邮件把Secret Key发给你，你用正确的配置启动授权服务器\n5. 新的授权服务器配置好后我合并拉取请求\n6. 谢谢。\n\n---\n\n中文说明 (English readme is at the bottom)\n-----------------------------------------\n\n- 最新: 目录上传/下载/同步加入了多进程支持（`--processes`）\n\n---\n这是一个百度云/百度网盘的Python客户端。主要的目的就是在Linux环境下（Windows下应该也可用，但没有仔细测试过）通过命令行来使用百度云盘的2TB的巨大空间。比如，你可以用在Raspberry Pi树莓派上。它提供文件列表、下载、上传、比较、向上同步、向下同步，等操作。\n\n**由于百度PCS API权限限制，程序只能存取百度云端`/apps/bypy`目录下面的文件和目录。**\n\n**（已解决）~~据说百度PCS API最多返回目录下1000个文件（ #285 )，如果属实，百度云盘上若有超过1000个文件的目录，将有一部分文件无法被看到 / 下载~~**\n\n**特征: 支持Unicode/中文；失败重试；递归上传/下载；目录比较; 哈希缓存。**\n\n界面是英文的，主要是因为这个是为了Raspberry Pi树莓派开发的。\n\n程序依赖\n------\n\n**重要：需要把系统的区域编码设置为UTF-8。（参见：<http://perlgeek.de/en/article/set-up-a-clean-utf8-environment>)**\n\n安装\n---\n\n- 通过`pip`来安装：`pip install bypy` （支持Python 2.7+, 3.3+)\n\n运行\n---\n\n- 作为独立程序: 运行 `bypy` (或者`python -m bypy`，或者`python3 -m bypy`）\n\n  可以看到命令行支持的全部命令和参数。\n- 作为一个包，在代码中使用: `import bypy`\n\n简单的图形界面：\n运行 `bypygui`\n\n基本操作\n------\n\n显示使用帮助和所有命令（英文）:\n\n```bash\nbypy\n```\n\n第一次运行时需要授权，只需跑任何一个命令（比如 `bypy info`）然后跟着说明（登陆等）来授权即可。授权只需一次，一旦成功，以后不会再出现授权提示.\n\n更详细的了解某一个命令：\n\n```bash\nbypy help <command>\n```\n\n显示在云盘（程序的）根目录下文件列表：\n\n```bash\nbypy list\n```\n\n把当前目录同步到云盘：\n\n```bash\nbypy syncup\n```\n\nor\n\n```bash\nbypy upload\n```\n\n把云盘内容同步到本地来：\n\n```bash\nbypy syncdown\n```\n\nor\n\n```bash\nbypy downdir /\n```\n\n**比较本地当前目录和云盘（程序的）根目录（个人认为非常有用）：**\n\n```bash\nbypy compare\n```\n\n更多命令和详细解释请见运行`bypy`的输出。\n\n调试\n---\n\n- 运行时添加`-v`参数，会显示进度详情。\n- 运行时添加`-d`，会显示一些调试信息。\n- 运行时添加`-ddd`，还会会显示HTTP通讯信息（**警告：非常多**）\n\n整合测试（15 - 30分钟）\n-------------------\n\n- 在主目录下跑：`python -m bypy.test`\n\n直接在Python程序中调用\n-------------------\n\n```python\nfrom bypy import ByPy\nbp=ByPy()\nbp.list() # or whatever instance methods of ByPy class\n```\n\n经验分享\n-------\n\n请移步至[wiki](../../wiki)，方便分享/交流。\n\n授权许可\n-------\n\n请阅: [LICENSE](LICENSE)\n\n---\n\nPCS API文档（已失效）: <http://developer.baidu.com/wiki/index.php?title=docs/pcs/rest/file_data_apis_list> (以前保存的离线版： [baidudoc](baidudoc) directory)\n\n---\n\nIntroduction\n------------\n\n- Latest feature: Multiprocessing added to directory upload / download / sync（`--processes`）\n\n---\nThis is a Python client for Baidu Yun (a.k.a PCS - Personal Cloud Storage), an online storage website offering 2 TB (fast) free personal storage. This main purpose is to be able to utilize this storage service under Linux environment (console), e.g. Raspberry Pi.\n\n**Due to Baidu PC permission restrictions, this program can only access your `/apps/bypy` directory at Baidu PCS**\n\n**(Fixed) ~~It's said the Baidu PCS API won't return more than 1000 items inside a directory ( #285 )，if this is true，you won't be able to see / download some files if you have a directory with more than 1000 files on Baidu Cloud~~**\n\n**Features: Unicode / Chinese support; Retry on failures; Recursive down/up-load; Directory comparison; Hash caching.**\n\nPrerequisite\n------------\n\n**Important: You need to set you system locale encoding to UTF-8 for this to work (You can refer here: <http://perlgeek.de/en/article/set-up-a-clean-utf8-environment>)**\n\nInstallation\n------------\n\n- `pip install bypy` (Supports Python 2.7+, 3.3+)\n\nUsage\n-----\n\n- Standalone program\n  - Simply run `bypy`  (or `python -m bypy`, or `python3 -m bypy`）\n  You will see all the commands and parameters it supports\n\n- As a package in your code\n  - `import bypy`\n\nSimple GUI:\nRun `bypygui`\n\nGetting started\n---------------\n\nTo get help and a list of available commands:\n\n```bash\nbypy\n```\n\nTo authorize for first time use, run any commands e.g. `bypy info` and follow the instructions (login etc). This is a one-time requirement only.\n\nTo get more details about certain command:\n\n```bash\nbypy help <command>\n```\n\nList files at (App's) root directory at Baidu PCS:\n\n```bash\nbypy list\n```\n\nTo sync up to the cloud (from the current directory):\n\n```bash\nbypy syncup\n```\n\nor\n\n```bash\nbypy upload\n```\n\nTo sync down from the cloud (to the current directory):\n\n```bash\nbypy syncdown\n```\n\nor\n\n```bash\nbypy downdir /\n```\n\n**To compare the current directory to (App's) root directory at Baidu PCS (which I think is very useful):**\n\n```bash\nbypy compare\n```\n\nTo get more information about the commands, check the output of `bypy`.\n\nDebug\n-----\n\n- Add in `-v` parameter, it will print more details about the progress.\n- Add in `-d` parameter, it will print some debug messages.\n- Add in `-ddd`, it will display HTTP messages as well (**Warning: A lot**）\n\nIntegration Test (15-30min)\n--------------------------\n\n- (In the project root directory) run: `python -m bypy.test`\n\nTo call from Python code\n------------------------\n\n```python\nfrom bypy import ByPy\nbp=ByPy()\nbp.list() # or whatever instance methods of ByPy class\n```\n\nTips / Sharing\n--------------\n\nPlease go to [wiki](../../wiki)\n\nLicense\n---\n\nPlease refer to [LICENSE](LICENSE)\n\n---\n\nPCS API Document (link dead 404): <http://developer.baidu.com/wiki/index.php?title=docs/pcs/rest/file_data_apis_list> (Offline pdf retrieved before: [baidudoc](baidudoc) directory)\n"
  },
  {
    "path": "baidudoc/url.txt",
    "content": "PCS API:\nhttp://developer.baidu.com/wiki/index.php?title=docs/pcs/rest/file_data_apis_list\n\nOAuth:\nhttp://developer.baidu.com/wiki/index.php?title=docs/oauth\nhttp://developer.baidu.com/wiki/index.php?title=docs/oauth/overview\n\n"
  },
  {
    "path": "bypy/__init__.py",
    "content": "#!/usr/bin/env python\n# coding=utf-8\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nfrom . import const\n\n# expose package names\nfrom .bypy import ByPy\nByPy\n\n__title__ =  const.__title__\n__version__ = const.__version__\n__author__ = const.__author__\n__license__ = const.__license__\n\n"
  },
  {
    "path": "bypy/__main__.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nfrom .bypy import main\n\nif __name__ == \"__main__\":\n\tmain()\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/bypy.cacerts.pem",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.\n# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.\n# Label: \"GTE CyberTrust Global Root\"\n# Serial: 421\n# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db\n# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74\n# 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\n-----BEGIN CERTIFICATE-----\nMIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\nVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\nbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\nb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\nUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\ncnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\nb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\niM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\nr41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\n04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\nGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\n3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\nlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\n-----END CERTIFICATE-----\n\n# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division\n# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division\n# Label: \"Thawte Server CA\"\n# Serial: 1\n# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d\n# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx\nFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\nVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm\nMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx\nMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3\ndGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl\ncyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3\nDQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD\ngY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91\nyekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX\nL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj\nEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG\n7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e\nQNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ\nqdq5snUb9kLy78fyGPmJvKP/iiMucEc=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division\n# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division\n# Label: \"Thawte Premium Server CA\"\n# Serial: 1\n# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a\n# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx\nFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\nVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy\ndmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t\nMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB\nMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG\nA1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp\nb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl\ncnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv\nbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE\nVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ\nug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR\nuHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG\n9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI\nhfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM\npAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==\n-----END CERTIFICATE-----\n\n# Issuer: O=Equifax OU=Equifax Secure Certificate Authority\n# Subject: O=Equifax OU=Equifax Secure Certificate Authority\n# Label: \"Equifax Secure CA\"\n# Serial: 903804111\n# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4\n# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\nUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\ndGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\nMVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\ndWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\nAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\nBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\ncJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\nAwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\nMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\naWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\nODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\nIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\nMAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\nA4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\n7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\n1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\n-----END CERTIFICATE-----\n\n# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority\n# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority\n# Label: \"Verisign Class 3 Public Primary Certification Authority\"\n# Serial: 149843929435818692848040365716851702463\n# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67\n# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2\n# 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\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG\nA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz\ncyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2\nMDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV\nBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt\nYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN\nADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE\nBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is\nI19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G\nCSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do\nlbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc\nAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k\n-----END CERTIFICATE-----\n\n# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network\n# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network\n# Label: \"Verisign Class 3 Public Primary Certification Authority - G2\"\n# Serial: 167285380242319648451154478808036881606\n# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9\n# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ\nBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh\nc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy\nMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp\nemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X\nDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw\nFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg\nUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo\nYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5\nMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB\nAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4\npO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0\n13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID\nAQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk\nU01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i\nF6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY\noJ2daZH9\n-----END CERTIFICATE-----\n\n# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA\n# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA\n# Label: \"GlobalSign Root CA\"\n# Serial: 4835703278459707669005204\n# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a\n# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\nA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\nb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\nMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\nYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\naWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\njc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\nxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\nsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\nU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\nAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\nyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\n38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\nAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\nDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\nHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n\n# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2\n# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2\n# Label: \"GlobalSign Root CA - R2\"\n# Serial: 4835703278459682885658125\n# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30\n# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1\nMDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL\nv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8\neoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq\ntTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\nC9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa\nzq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB\nmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH\nV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n\nbG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG\n3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs\nJ0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO\n291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS\not+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\nAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\nTBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n-----END CERTIFICATE-----\n\n# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority\n# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority\n# Label: \"ValiCert Class 1 VA\"\n# Serial: 1\n# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb\n# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e\n# 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\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\nIFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\nBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\naXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy\nNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\nazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\nOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\ncnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y\nLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+\nTunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y\nTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0\nLBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW\nI8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw\nnXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI\n-----END CERTIFICATE-----\n\n# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority\n# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority\n# Label: \"ValiCert Class 2 VA\"\n# Serial: 1\n# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87\n# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6\n# 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\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\nIFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\nBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\naXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\nNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\nazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\nOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\ncnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\ndA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\nWlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\nv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\nUJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\nIYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\nW/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\n-----END CERTIFICATE-----\n\n# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority\n# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority\n# Label: \"RSA Root Certificate 1\"\n# Serial: 1\n# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72\n# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb\n# 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\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\nIFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\nBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\naXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy\nNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\nazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\nOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\ncnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD\ncnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs\n2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY\nJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE\nZwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ\nn0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A\nPhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu\n-----END CERTIFICATE-----\n\n# 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\n# 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\n# Label: \"Verisign Class 3 Public Primary Certification Authority - G3\"\n# Serial: 206684696279472310254277870180966723415\n# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09\n# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\ncmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\nLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\naWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\nVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\naWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\nbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\nIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\nLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b\nN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t\nKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu\nkxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm\nCC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ\nXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu\nimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te\n2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe\nDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\n/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p\nF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt\nTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only\n# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only\n# Label: \"Verisign Class 4 Public Primary Certification Authority - G3\"\n# Serial: 314531972711909413743075096039378935511\n# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df\n# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d\n# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\ncmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\nLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\naWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\nVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\naWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\nbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\nIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\nLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1\nGQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ\n+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd\nU6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm\nNxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY\nufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/\nky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1\nCtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq\ng6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\nfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c\n2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/\nbLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\n-----END CERTIFICATE-----\n\n# 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\n# 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\n# Label: \"Entrust.net Secure Server CA\"\n# Serial: 927650371\n# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee\n# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39\n# 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\n-----BEGIN CERTIFICATE-----\nMIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\nVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\nZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\nKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\nZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\nMjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\nChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\nb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\nbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\nU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\nA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\nI0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\nwkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\nAdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\noIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\nBgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\ndHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\nMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\nb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\ndHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\nMFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\nE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\nMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\nhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\n95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\n2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n-----END CERTIFICATE-----\n\n# 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\n# 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\n# Label: \"Entrust.net Premium 2048 Secure Server CA\"\n# Serial: 946069240\n# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90\n# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML\nRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp\nbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5\nIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3\nMjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3\nLmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp\nYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG\nA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq\nK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe\nsYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX\nMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT\nXTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/\nHoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH\n4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV\nHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub\nj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo\nU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\nzX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b\nu/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+\nbYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er\nfF6adulZkMV8gzURZVE=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust\n# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust\n# Label: \"Baltimore CyberTrust Root\"\n# Serial: 33554617\n# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4\n# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\nRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\nVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\nDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\nZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\nVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\nmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\nIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\nmpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\nXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\ndc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\njl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\nBE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\nDQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\njkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\nEpn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\nksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\nR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n\n# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.\n# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.\n# Label: \"Equifax Secure Global eBusiness CA\"\n# Serial: 1\n# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc\n# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45\n# 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\n-----BEGIN CERTIFICATE-----\nMIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc\nMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT\nZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw\nMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj\ndXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l\nc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC\nUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc\n58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/\no5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH\nMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr\naGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA\nA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA\nZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv\n8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\n-----END CERTIFICATE-----\n\n# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.\n# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.\n# Label: \"Equifax Secure eBusiness CA 1\"\n# Serial: 4\n# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d\n# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41\n# 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\n-----BEGIN CERTIFICATE-----\nMIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc\nMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT\nZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw\nMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j\nLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ\nKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo\nRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu\nWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw\nEnv+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD\nAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK\neDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM\nzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+\nWB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN\n/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network\n# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network\n# Label: \"AddTrust Low-Value Services Root\"\n# Serial: 1\n# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc\n# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d\n# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7\n-----BEGIN CERTIFICATE-----\nMIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU\nMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3\nb3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw\nMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD\nVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA\nA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul\nCDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n\ntGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl\ndI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch\nPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC\n+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O\nBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E\nBTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl\nMQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk\nZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB\nIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X\n7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz\n43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\neDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl\npz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA\nWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\n-----END CERTIFICATE-----\n\n# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network\n# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network\n# Label: \"AddTrust External Root\"\n# Serial: 1\n# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f\n# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68\n# 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\n-----BEGIN CERTIFICATE-----\nMIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\nMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs\nIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290\nMB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux\nFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h\nbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v\ndDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt\nH7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9\nuMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX\nmk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX\na0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN\nE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0\nWicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD\nVR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0\nJvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU\ncnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx\nIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN\nAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH\nYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC\nNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX\nc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a\nmnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n-----END CERTIFICATE-----\n\n# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network\n# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network\n# Label: \"AddTrust Public Services Root\"\n# Serial: 1\n# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f\n# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5\n# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU\nMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3\nb3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx\nMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB\nZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV\nBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV\n6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX\nGCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP\ndzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH\n1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF\n62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW\nBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw\nAwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL\nMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU\ncnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv\nb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6\nIBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/\niHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\nGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh\n4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm\nXiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\n-----END CERTIFICATE-----\n\n# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network\n# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network\n# Label: \"AddTrust Qualified Certificates Root\"\n# Serial: 1\n# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb\n# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf\n# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16\n-----BEGIN CERTIFICATE-----\nMIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU\nMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3\nb3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1\nMzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK\nEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh\nBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq\nxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G\n87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i\n2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U\nWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1\n0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G\nA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T\nAQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr\npGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL\nExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm\naWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv\nhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm\nhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\ndgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3\nP6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y\niQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no\nxqE=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.\n# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.\n# Label: \"Entrust Root Certification Authority\"\n# Serial: 1164660820\n# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4\n# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0\nLm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW\nKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw\nNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw\nNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy\nZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV\nBAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo\nNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4\n4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9\nKlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI\nrb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi\n94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB\nsDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi\ngA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo\nkORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE\nvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t\nO1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua\nAGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP\n9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/\neu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m\n0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n\n# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3\n# Subject: O=RSA Security Inc OU=RSA Security 2048 V3\n# Label: \"RSA Security 2048 v3\"\n# Serial: 13297492616345471454730593562152402946\n# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e\n# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42\n# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c\n-----BEGIN CERTIFICATE-----\nMIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6\nMRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp\ndHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX\nBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy\nMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp\neafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg\n/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl\nwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh\nAMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2\nPcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu\nAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\nBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR\nMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc\nHnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/\nZb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+\nf00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO\nrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch\n6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3\n7CAFYd4=\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.\n# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.\n# Label: \"GeoTrust Global CA\"\n# Serial: 144470\n# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5\n# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\nMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\nYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\nR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\n9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\nfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\niS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\n1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\nbw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\nMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\nephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\nuMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\nZ57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\ntQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\nPseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\nhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\n5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.\n# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.\n# Label: \"GeoTrust Global CA 2\"\n# Serial: 1\n# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9\n# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d\n# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85\n-----BEGIN CERTIFICATE-----\nMIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW\nMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs\nIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg\nR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A\nPRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8\nY2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL\nTytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL\n5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7\nS4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe\n2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap\nEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td\nEPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv\n/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN\nA0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0\nabby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF\nI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz\n4iIprn2DQKi6bA==\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.\n# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.\n# Label: \"GeoTrust Universal CA\"\n# Serial: 1\n# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48\n# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW\nMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy\nc2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE\nBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0\nIFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV\nVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8\ncQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT\nQjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh\nF7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v\nc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w\nmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd\nVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX\nteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ\nf9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe\nBi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+\nnhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB\n/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY\nMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG\n9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\naanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX\nIwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn\nANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z\nuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN\nPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja\nQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW\nkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9\nER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt\nDF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm\nbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.\n# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.\n# Label: \"GeoTrust Universal CA 2\"\n# Serial: 1\n# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7\n# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW\nMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy\nc2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD\nVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1\nc3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\nAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81\nWzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG\nFF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq\nXbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL\nse4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb\nKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd\nIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73\ny/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt\nhAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc\nQIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4\nLt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV\nHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ\nKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ndXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ\nL1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr\nFg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo\nag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY\nT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz\nGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m\n1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV\nOCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH\n6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX\nQMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\n-----END CERTIFICATE-----\n\n# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.\n# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.\n# Label: \"America Online Root Certification Authority 1\"\n# Serial: 1\n# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e\n# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a\n# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3\n-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc\nMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP\nbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2\nMDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft\nZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk\nhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym\n1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW\nOqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb\n2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko\nO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU\nAK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nBQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF\nZu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb\nLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir\noQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C\nMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds\nsPmuujz9dLQR6FgNgLzTqIA6me11zEZ7\n-----END CERTIFICATE-----\n\n# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.\n# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.\n# Label: \"America Online Root Certification Authority 2\"\n# Serial: 1\n# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf\n# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84\n# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd\n-----BEGIN CERTIFICATE-----\nMIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc\nMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP\nbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2\nMDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft\nZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC\n206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci\nKtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2\nJxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9\nBoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e\nXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B\nPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67\nXnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq\nZ8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ\no2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3\n+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj\nYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj\nFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn\nxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2\nLHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc\nobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8\nCNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe\nIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA\nDjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F\nAjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX\nOm/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb\nAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl\nZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw\nRY8mkaKO/qk=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association\n# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association\n# Label: \"Visa eCommerce Root\"\n# Serial: 25952180776285836048024890241505565794\n# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02\n# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr\nMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl\ncm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\nbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw\nCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h\ndGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l\ncmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h\n2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E\nlpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV\nZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq\n299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t\nvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL\ndXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD\nAgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF\nAAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR\nzCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3\nLBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd\n7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw\n++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\n398znM/jra6O1I7mT1GvFpLgXPYHDw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Certum CA O=Unizeto Sp. z o.o.\n# Subject: CN=Certum CA O=Unizeto Sp. z o.o.\n# Label: \"Certum Root CA\"\n# Serial: 65568\n# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9\n# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM\nMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD\nQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM\nMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD\nQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E\njG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo\nePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI\nULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu\nOb7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg\nAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7\nHVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA\nuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa\nTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg\nxSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q\nCjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x\nO/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs\n6GAqm4VKQPNriiTsBhYscw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=AAA Certificate Services O=Comodo CA Limited\n# Subject: CN=AAA Certificate Services O=Comodo CA Limited\n# Label: \"Comodo AAA Services root\"\n# Serial: 1\n# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0\n# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb\nMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\nGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj\nYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL\nMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\nBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM\nGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua\nBtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe\n3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4\nYgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR\nrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm\nez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU\noBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v\nQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t\nb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF\nAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q\nGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2\nG9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi\nl2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3\nsmPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Secure Certificate Services O=Comodo CA Limited\n# Subject: CN=Secure Certificate Services O=Comodo CA Limited\n# Label: \"Comodo Secure Services root\"\n# Serial: 1\n# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd\n# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1\n# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8\n-----BEGIN CERTIFICATE-----\nMIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb\nMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\nGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp\nZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow\nfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\nA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV\nBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM\ncm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S\nHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996\nCF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk\n3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz\n6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV\nHQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud\nEwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv\nY2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw\nOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww\nDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0\n5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\nZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI\ngKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ\naD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl\nizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited\n# Subject: CN=Trusted Certificate Services O=Comodo CA Limited\n# Label: \"Comodo Trusted Services root\"\n# Serial: 1\n# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27\n# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd\n# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb\nMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\nGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0\naWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla\nMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\nBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD\nVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW\nfnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt\nTGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL\nfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW\n1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7\nkUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G\nA1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD\nVR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v\nZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo\ndHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu\nY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/\nHrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\npSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS\njBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+\nxqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn\ndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi\n-----END CERTIFICATE-----\n\n# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority\n# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority\n# Label: \"QuoVadis Root CA\"\n# Serial: 985026699\n# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24\n# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9\n# 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\n-----BEGIN CERTIFICATE-----\nMIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC\nTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0\naWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0\naWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz\nMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw\nIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR\ndW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp\nli4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D\nrOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ\nWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug\nF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU\nxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC\nAk4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv\ndmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw\nggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl\nIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh\nc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy\nZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\nY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI\nKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T\nKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq\ny+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p\ndGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD\nVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL\nMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk\nfnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8\n7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R\ncHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y\nmQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW\nxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK\nSnQ2+Q==\n-----END CERTIFICATE-----\n\n# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited\n# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited\n# Label: \"QuoVadis Root CA 2\"\n# Serial: 1289\n# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b\n# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x\nGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv\nb3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV\nBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W\nYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa\nGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg\nFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J\nWpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB\nrrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp\n+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1\nksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i\nUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz\nPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og\n/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH\noycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI\nyV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud\nEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2\nA8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL\nMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\nElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f\nBluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn\ng/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl\nfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K\nWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha\nB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc\nhLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR\nTUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD\nmbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z\nohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y\n4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza\n8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n-----END CERTIFICATE-----\n\n# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited\n# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited\n# Label: \"QuoVadis Root CA 3\"\n# Serial: 1478\n# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf\n# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85\n# 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\n-----BEGIN CERTIFICATE-----\nMIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x\nGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv\nb3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV\nBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W\nYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM\nV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB\n4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr\nH556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd\n8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv\nvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT\nmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe\nbtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc\nT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt\nWAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ\nc6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A\n4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD\nVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG\nCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0\naXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\naWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu\ndC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw\nczALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G\nA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC\nTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg\nUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0\n7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem\nd1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd\n+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B\n4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN\nt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x\nDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57\nk8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s\nzHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j\nWy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT\nmJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK\n4SVhM7JZG+Ju1zdXtg2pEto=\n-----END CERTIFICATE-----\n\n# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1\n# Subject: O=SECOM Trust.net OU=Security Communication RootCA1\n# Label: \"Security Communication Root CA\"\n# Serial: 0\n# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a\n# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY\nMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t\ndW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5\nWjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD\nVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8\n9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ\nDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9\nMs+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N\nQV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ\nxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G\nA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T\nAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG\nkl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr\nUj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5\nBw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU\nJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot\nRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Sonera Class2 CA O=Sonera\n# Subject: CN=Sonera Class2 CA O=Sonera\n# Label: \"Sonera Class 2 Root CA\"\n# Serial: 29\n# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb\n# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP\nMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx\nMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV\nBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o\nZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt\n5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s\n3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej\nvOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu\n8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw\nDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG\nMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil\nzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/\n3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD\nFNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6\nTk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2\nZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M\n-----END CERTIFICATE-----\n\n# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden\n# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden\n# Label: \"Staat der Nederlanden Root CA\"\n# Serial: 10000010\n# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0\n# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04\n# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO\nTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh\ndCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy\nMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk\nZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn\nExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71\n9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO\nhXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U\ntFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o\nBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh\nSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww\nOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv\ncm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA\n7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k\n/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm\neafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6\nu3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy\n7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR\niJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==\n-----END CERTIFICATE-----\n\n# Issuer: O=TDC Internet OU=TDC Internet Root CA\n# Subject: O=TDC Internet OU=TDC Internet Root CA\n# Label: \"TDC Internet Root CA\"\n# Serial: 986490188\n# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e\n# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a\n# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7\n-----BEGIN CERTIFICATE-----\nMIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE\nSzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg\nUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV\nBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl\ncm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA\nvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu\nZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a\n0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1\n4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN\neGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD\nR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG\nA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu\ndGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME\nQ1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3\nWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw\nHQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ\nKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO\nQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX\nwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+\n2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89\n9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0\njUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38\naQNiuJkFBT1reBK9sG9l\n-----END CERTIFICATE-----\n\n# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com\n# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com\n# Label: \"UTN DATACorp SGC Root CA\"\n# Serial: 91374294542884689855167577680241077609\n# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06\n# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4\n# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48\n-----BEGIN CERTIFICATE-----\nMIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB\nkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\nQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\ndHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw\nIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG\nEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD\nVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu\ndXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6\nE5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ\nD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK\n4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq\nlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW\nbfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB\no4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT\nMtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js\nLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr\nBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB\nAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft\nGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj\nj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH\nKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv\n2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3\nmfnGV/TJVTl4uix5yaaIK/QI\n-----END CERTIFICATE-----\n\n# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com\n# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com\n# Label: \"UTN USERFirst Hardware Root CA\"\n# Serial: 91374294542884704022267039221184531197\n# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39\n# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7\n# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37\n-----BEGIN CERTIFICATE-----\nMIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB\nlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\nQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\ndHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt\nSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe\nMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v\nd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh\ncmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn\n0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ\nM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a\nMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd\noI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI\nDsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy\noUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0\ndHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy\nbDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF\nBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\n//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli\nCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE\nCJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t\n3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS\nKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org\n# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org\n# Label: \"Camerfirma Chambers of Commerce Root\"\n# Serial: 0\n# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84\n# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn\nMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL\nExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg\nb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa\nMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB\nODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw\nIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B\nAQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb\nunXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d\nBmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq\n7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3\n0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX\nroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG\nA1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j\naGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p\n26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA\nBzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud\nEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN\nBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\naWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB\nAAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd\np0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi\n1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc\nXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0\neDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu\ntGWaIZDgqtCYvDi1czyL+Nw=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org\n# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org\n# Label: \"Camerfirma Global Chambersign Root\"\n# Serial: 0\n# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19\n# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9\n# 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\n-----BEGIN CERTIFICATE-----\nMIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn\nMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL\nExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo\nYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9\nMQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy\nNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G\nA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA\nA4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0\nMi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s\nQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV\neAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795\nB9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh\nz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T\nAQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i\nZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w\nTcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH\nMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD\nVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE\nVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\nbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B\nAQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM\nbKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi\nryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG\nVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c\necQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/\nAYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\n-----END CERTIFICATE-----\n\n# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok\n# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok\n# Label: \"NetLock Notary (Class A) Root\"\n# Serial: 259\n# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7\n# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6\n# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67\n-----BEGIN CERTIFICATE-----\nMIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV\nMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe\nTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0\ndmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB\nKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0\nN1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC\ndWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu\nMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL\nb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD\nzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi\n3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8\nWgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY\nOph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi\nNCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC\nApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4\nQgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0\nYW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz\naSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu\nIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm\nZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg\nZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs\namFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv\nIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3\nLm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6\nZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1\nYW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg\ndG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs\nb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G\nCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO\nxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP\n0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ\nQeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk\nf1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK\n8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI\n-----END CERTIFICATE-----\n\n# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok\n# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok\n# Label: \"NetLock Business (Class B) Root\"\n# Serial: 105\n# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6\n# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx\nETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0\nb25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD\nEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05\nOTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G\nA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh\nZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l\ndExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG\nSIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK\ngZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX\niK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc\nQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E\nBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G\nSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu\nb3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh\nbGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv\nY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln\naXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0\nIGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh\nc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph\nbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo\nZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP\nUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj\nYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo\ndHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA\nbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06\nsPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa\nn3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS\nNitjrFgBazMpUIaD8QFI\n-----END CERTIFICATE-----\n\n# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok\n# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok\n# Label: \"NetLock Express (Class C) Root\"\n# Serial: 104\n# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4\n# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx\nETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0\nb25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD\nEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X\nDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw\nDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u\nc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr\nTmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN\nBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA\nOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC\n2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW\nRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P\nAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW\nggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0\nYWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz\nb2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO\nZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB\nIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs\nb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs\nZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s\nYXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg\na2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g\nSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0\naWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg\nYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg\nY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY\nta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g\npO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4\nFp1hBWeAyNDYpQcCNJgEjTME1A==\n-----END CERTIFICATE-----\n\n# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com\n# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com\n# Label: \"XRamp Global CA Root\"\n# Serial: 107108908803651509692980124233745014957\n# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1\n# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB\ngjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk\nMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY\nUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx\nNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3\ndy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy\ndmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6\n38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP\nKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q\nDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4\nqEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa\nJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi\nPvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P\nBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs\njVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0\neS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD\nggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR\nvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa\nIR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy\ni6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ\nO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n\n# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority\n# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority\n# Label: \"Go Daddy Class 2 CA\"\n# Serial: 0\n# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67\n# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh\nMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE\nYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3\nMDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo\nZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg\nMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA\nPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w\nwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi\nEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY\navx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+\nYihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE\nsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h\n/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5\nIEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\nggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy\nOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P\nTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER\ndEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf\nReYNnyicsbkqWletNw+vHX/bvZ8=\n-----END CERTIFICATE-----\n\n# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority\n# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority\n# Label: \"Starfield Class 2 CA\"\n# Serial: 0\n# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24\n# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\nMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\nU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\nNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\nZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\nDQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\n8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\n+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\nX9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\nK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\n1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\nA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\nzt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\nYXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\nbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\nL7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\neruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\nVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\nWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n\n# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing\n# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing\n# Label: \"StartCom Certification Authority\"\n# Serial: 1\n# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16\n# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f\n# 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\n-----BEGIN CERTIFICATE-----\nMIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW\nMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg\nQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9\nMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi\nU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh\ncnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk\npMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf\nOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C\nJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT\nKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi\nHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM\nAv+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w\n+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+\nGkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3\nZzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B\n26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID\nAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\nFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j\nZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js\nLnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM\nBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0\nY29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy\ndGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh\ncnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh\nYmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg\ndGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp\nbGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ\nYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT\nTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ\n9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8\njhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW\nFjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz\newT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1\nny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L\nEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu\nL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\nyvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC\nO3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V\num0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh\nNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=\n-----END CERTIFICATE-----\n\n# Issuer: O=Government Root Certification Authority\n# Subject: O=Government Root Certification Authority\n# Label: \"Taiwan GRCA\"\n# Serial: 42023070807708724159991140556527066870\n# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e\n# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/\nMQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow\nPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB\nAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR\nIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q\ngQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy\nyhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts\nF/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2\njWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx\nls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC\nVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK\nYS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH\nEgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN\nXo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud\nDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE\nMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK\nUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\nTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf\nqzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK\nZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE\nJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7\nhUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1\nEqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm\nnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX\nudpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz\nssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe\nLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl\npYYsfPQS\n-----END CERTIFICATE-----\n\n# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068\n# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068\n# Label: \"Firmaprofesional Root CA\"\n# Serial: 1\n# MD5 Fingerprint: 11:92:79:40:3c:b1:83:40:e5:ab:66:4a:67:92:80:df\n# SHA1 Fingerprint: a9:62:8f:4b:98:a9:1b:48:35:ba:d2:c1:46:32:86:bb:66:64:6a:8c\n# SHA256 Fingerprint: c1:cf:0b:52:09:64:35:e3:f1:b7:1d:aa:ec:45:5a:23:11:c8:40:4f:55:83:a9:e2:13:c6:9d:85:7d:94:33:05\n-----BEGIN CERTIFICATE-----\nMIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx\nIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1\ndG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w\nHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx\nIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1\ndG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u\nCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY\nrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z\nhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay\nBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL\niam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb\nAgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv\nbmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0\nMjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E\nFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n\nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq\nu00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m\nhoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl\nZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp\nQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5\nquGnM/b9Sh/22WA=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services\n# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services\n# Label: \"Swisscom Root CA 1\"\n# Serial: 122348795730808398873664200247279986742\n# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9\n# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51\n# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk\nMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0\nYWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg\nQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT\nAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp\nY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN\nBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9\nm2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih\nFvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/\nTilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F\nEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco\nkdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu\nHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF\nvJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo\n19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC\nL3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW\nbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX\nJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw\nFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\nBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc\nK6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf\nky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik\nVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB\nsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e\n3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR\nls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip\nmXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH\nb6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf\nrK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms\nhFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y\nzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6\nMBr1mmz0DlP5OlvRHA==\n-----END CERTIFICATE-----\n\n# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com\n# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com\n# Label: \"DigiCert Assured ID Root CA\"\n# Serial: 17154717934120587862167794914071425081\n# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72\n# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv\nb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl\ncnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c\nJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP\nmDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+\nwRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4\nVYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/\nAUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB\nAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun\npyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC\ndWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf\nfwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm\nNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx\nH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n\n# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com\n# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com\n# Label: \"DigiCert Global Root CA\"\n# Serial: 10944719598952040374951832963794454346\n# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e\n# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\n# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com\n# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com\n# Label: \"DigiCert High Assurance EV Root CA\"\n# Serial: 3553400076410547919724730734378100087\n# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a\n# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\nZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\nMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\nLmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\nRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\nPNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\nxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\nIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\nhzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\nEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\nFLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\nnzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\neM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\nhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\nYzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n+OkuE6N36B9K\n-----END CERTIFICATE-----\n\n# Issuer: CN=Class 2 Primary CA O=Certplus\n# Subject: CN=Class 2 Primary CA O=Certplus\n# Label: \"Certplus Class 2 Primary CA\"\n# Serial: 177770208045934040241468760488327595043\n# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b\n# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw\nPTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz\ncyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9\nMQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz\nIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ\nltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR\nVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL\nkcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd\nEgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas\nH7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0\nHGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud\nDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4\nQgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu\nY29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/\nAN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8\nyfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR\nFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA\nybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB\nkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\nl7+ijrRU\n-----END CERTIFICATE-----\n\n# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.\n# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.\n# Label: \"DST Root CA X3\"\n# Serial: 91299735575339953335919266965803778155\n# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5\n# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/\nMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\nDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow\nPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD\nEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O\nrz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq\nOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b\nxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\n7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD\naeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG\nSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69\nikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr\nAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz\nR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5\nJDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo\nOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n-----END CERTIFICATE-----\n\n# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES\n# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES\n# Label: \"DST ACES CA X6\"\n# Serial: 17771143917277623872238992636097467865\n# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8\n# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d\n# 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\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb\nMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx\nETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w\nMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD\nVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx\nFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu\nktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7\ngLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH\nfAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a\nahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT\najV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF\nMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk\nc3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto\ndHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt\naW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI\nhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk\nQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/\nh40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq\nnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR\nrscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2\n9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=\n-----END CERTIFICATE-----\n\n# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.\n# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.\n# Label: \"TURKTRUST Certificate Services Provider Root 1\"\n# Serial: 1\n# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5\n# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9\n# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0\n-----BEGIN CERTIFICATE-----\nMIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc\nUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx\nc8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg\nMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8\ndmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz\nMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy\ndGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD\nVQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg\nxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu\nxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7\nXfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k\nheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J\nYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C\nurKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1\nJuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51\nb0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV\n9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7\nkjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh\nfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy\nB0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA\naLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS\nRGQDJereW26fyfJOrN3H\n-----END CERTIFICATE-----\n\n# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005\n# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005\n# Label: \"TURKTRUST Certificate Services Provider Root 2\"\n# Serial: 1\n# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00\n# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7\n# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6\n-----BEGIN CERTIFICATE-----\nMIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc\nUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx\nc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS\nS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg\nSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3\nWhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv\nbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU\nUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw\nbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe\nLiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef\nJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh\nR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ\nQv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX\nJHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p\nzpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S\nFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ\nKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq\nECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4\nJl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz\ngw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH\nuFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS\ny3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=\n-----END CERTIFICATE-----\n\n# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG\n# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG\n# Label: \"SwissSign Gold CA - G2\"\n# Serial: 13492815561806991280\n# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93\n# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\nBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln\nbiBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF\nMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT\nd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\nCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8\n76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+\nbbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c\n6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE\nemA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd\nMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt\nMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y\nMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y\nFGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi\naG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM\ngI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB\nqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7\nlqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn\n8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\nL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6\n45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO\nUYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5\nO1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC\nbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv\nGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a\n77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC\nhdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3\n92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp\nLd6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w\nZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt\nQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\n-----END CERTIFICATE-----\n\n# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG\n# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG\n# Label: \"SwissSign Silver CA - G2\"\n# Serial: 5700383053117599563\n# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13\n# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE\nBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu\nIFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow\nRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY\nU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv\nFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br\nYT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF\nnbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH\n6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt\neJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/\nc8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ\nMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH\nHTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf\njNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6\n5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB\nrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\nF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c\nwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ncDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB\nAHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp\nWJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9\nxCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ\n2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ\nIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8\naRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X\nem1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR\ndAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/\nOMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+\nhAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy\ntGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.\n# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.\n# Label: \"GeoTrust Primary Certification Authority\"\n# Serial: 32798226551256963324313806436981982369\n# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf\n# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY\nMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo\nR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx\nMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\nEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9\nAWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA\nZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0\n7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W\nkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI\nmO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\nA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ\nKoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1\n6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl\n4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K\noKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj\nUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU\nAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\n-----END CERTIFICATE-----\n\n# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only\n# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only\n# Label: \"thawte Primary Root CA\"\n# Serial: 69529181992039203566298953787712940909\n# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12\n# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB\nqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf\nQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw\nMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV\nBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw\nNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j\nLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG\nA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs\nW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta\n3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk\n6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6\nSk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J\nNqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP\nr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU\nDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz\nYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\nxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2\n/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/\nLHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7\njVaMaA==\n-----END CERTIFICATE-----\n\n# 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\n# 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\n# Label: \"VeriSign Class 3 Public Primary Certification Authority - G5\"\n# Serial: 33037644167568058970164719475676101450\n# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c\n# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5\n# 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\n-----BEGIN CERTIFICATE-----\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\nZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\nZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\nU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\naXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\nnmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\nt0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\nSdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\nBO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\nrCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\nNIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\nBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\nBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\naXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\nMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\np6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\n5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\nWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\n4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\nhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n-----END CERTIFICATE-----\n\n# Issuer: CN=SecureTrust CA O=SecureTrust Corporation\n# Subject: CN=SecureTrust CA O=SecureTrust Corporation\n# Label: \"SecureTrust CA\"\n# Serial: 17199774589125277788362757014266862032\n# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1\n# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI\nMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x\nFzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz\nMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv\ncnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz\nZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO\n0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao\nwW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj\n7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS\n8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT\nBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg\nJYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC\nNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3\n6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/\n3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm\nD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS\nCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Secure Global CA O=SecureTrust Corporation\n# Subject: CN=Secure Global CA O=SecureTrust Corporation\n# Label: \"Secure Global CA\"\n# Serial: 9751836167731051554232119481456978597\n# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de\n# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK\nMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x\nGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx\nMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg\nQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ\niQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa\n/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ\njnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI\nHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7\nsFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w\ngZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw\nKaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG\nAQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L\nURYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO\nH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm\nI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY\niNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n\n# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited\n# Subject: CN=COMODO Certification Authority O=COMODO CA Limited\n# Label: \"COMODO Certification Authority\"\n# Serial: 104350513648249232941998508985834464573\n# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75\n# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB\ngTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\nA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV\nBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw\nMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl\nYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P\nRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3\nUcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI\n2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8\nQ5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp\n+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+\nDT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O\nnKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW\n/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g\nPKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u\nQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY\nSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv\nIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4\nzJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd\nBA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB\nZQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.\n# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.\n# Label: \"Network Solutions Certificate Authority\"\n# Serial: 116697915152937497490437556386812487904\n# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e\n# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce\n# 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\n-----BEGIN CERTIFICATE-----\nMIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi\nMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\nMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp\ndHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV\nUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO\nZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz\nc7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP\nOCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl\nmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF\nBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4\nqY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw\ngZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB\nBjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu\nbmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp\ndHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8\n6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/\nh1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH\n/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\nwKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN\npGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\n-----END CERTIFICATE-----\n\n# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA\n# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA\n# Label: \"WellsSecure Public Root Certificate Authority\"\n# Serial: 1\n# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36\n# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee\n# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx\nIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs\ncyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v\ndCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0\nMDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl\nbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD\nDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r\nWxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU\nDk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs\nHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj\nz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf\nSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl\nAgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG\nKGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P\nAQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j\nBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC\nVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX\nZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB\nALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd\n/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB\nA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn\nk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9\niW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv\n2G0xffX8oRAHh84vWdw+WNs=\n-----END CERTIFICATE-----\n\n# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited\n# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited\n# Label: \"COMODO ECC Certification Authority\"\n# Serial: 41578283867086692638256921589707938090\n# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23\n# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11\n# 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\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL\nMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\nBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT\nIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw\nMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy\nZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N\nT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR\nFtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J\ncfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW\nBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm\nfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv\nGDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n\n# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI\n# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI\n# Label: \"IGC/A\"\n# Serial: 245102874772\n# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37\n# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c\n# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32\n-----BEGIN CERTIFICATE-----\nMIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT\nAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ\nTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG\n9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw\nMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM\nBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO\nMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2\nLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI\ns9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2\nxtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4\nu0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b\nF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx\nVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd\nPDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV\nHSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx\nNjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF\nAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ\nL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY\nYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg\nCrpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a\nNjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R\n0982gaEbeC9xs/FZTEYYKKuF0mBWWg==\n-----END CERTIFICATE-----\n\n# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1\n# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1\n# Label: \"Security Communication EV RootCA1\"\n# Serial: 0\n# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3\n# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl\nMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh\nU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz\nMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N\nIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11\nbmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE\nRMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO\nzXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5\nbmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF\nMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1\nVkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC\nOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G\nCSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW\ntWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ\nq51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb\nEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+\nQi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O\nVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490\n-----END CERTIFICATE-----\n\n# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed\n# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed\n# Label: \"OISTE WISeKey Global Root GA CA\"\n# Serial: 86718877871133159090080555911823548314\n# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93\n# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9\n# 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\n-----BEGIN CERTIFICATE-----\nMIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB\nijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly\naWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl\nZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w\nNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G\nA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD\nVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX\nSVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR\nVVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2\nw93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF\nmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg\n4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9\n4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw\nDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw\nEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx\nSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2\nftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8\nvPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\nhNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi\nFj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ\n/L7fCg0=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA\n# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA\n# Label: \"Microsec e-Szigno Root CA\"\n# Serial: 272122594155480254301341951808045322001\n# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5\n# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d\n# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0\n-----BEGIN CERTIFICATE-----\nMIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw\ncjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy\nb3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z\nZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4\nNDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN\nTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p\nY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u\nuO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+\nLMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA\nvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770\nYjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx\n62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB\nAQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw\nLQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP\nBgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB\nAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov\nMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5\nACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn\nAGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT\nAHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh\nACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo\nAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa\nAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln\nbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p\nY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP\nPU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv\nY2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB\nEGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu\nw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj\ncm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV\nHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI\nVTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS\nBgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS\nb290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS\n8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds\nZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl\n7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a\n86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR\nhUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/\nMPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Certigna O=Dhimyotis\n# Subject: CN=Certigna O=Dhimyotis\n# Label: \"Certigna\"\n# Serial: 18364802974209362175\n# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff\n# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV\nBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X\nDTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ\nBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4\nQCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny\ngQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw\nzBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q\n130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2\nJsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw\nDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw\nZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT\nAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj\nAQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG\n9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h\nbV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc\nfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu\nHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w\nt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n\n# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A.\n# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A.\n# Label: \"AC Ra\\xC3\\xADz Certic\\xC3\\xA1mara S.A.\"\n# Serial: 38908203973182606954752843738508300\n# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6\n# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36\n# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c\n-----BEGIN CERTIFICATE-----\nMIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx\nCzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp\nZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa\nQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw\nNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft\nZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu\nQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq\nhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG\nqentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL\nfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ\nY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4\nNy+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ\n54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b\nMMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j\nilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej\nYfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt\nA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF\nrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ\npxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\nAwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB\nlTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy\nYS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50\n7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs\nYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6\nxbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc\nunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/\nJre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp\nezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42\ngzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0\njJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+\nXCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD\nW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/\nRL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r\nMDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk\nBYn8eNZcLCZDqQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA\n# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA\n# Label: \"TC TrustCenter Class 2 CA II\"\n# Serial: 941389028203453866782103406992443\n# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23\n# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e\n# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL\nMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV\nBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0\nQ2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1\nOTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i\nSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc\nVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf\ntMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg\nuNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J\nXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK\n8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99\n5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3\nkUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy\ndXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6\nLy93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz\nJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290\nY2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS\nGNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt\nZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8\nau0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV\nhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI\ndUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA\n# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA\n# Label: \"TC TrustCenter Class 3 CA II\"\n# Serial: 1506523511417715638772220530020799\n# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e\n# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5\n# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL\nMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV\nBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0\nQ2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1\nOTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i\nSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc\nVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW\nHt4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q\nVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2\n1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq\nukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1\nRb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX\nXAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy\ndXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6\nLy93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz\nJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290\nY2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN\nirTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8\nTtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6\ng0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB\n95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj\nS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==\n-----END CERTIFICATE-----\n\n# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA\n# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA\n# Label: \"TC TrustCenter Universal CA I\"\n# Serial: 601024842042189035295619584734726\n# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c\n# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3\n# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL\nMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV\nBAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1\nc3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx\nMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg\nR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD\nVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR\nJJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T\nfCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu\njRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z\nwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ\nfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD\nVR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO\nBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G\nCSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1\n7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn\n8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs\nydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT\nujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/\n2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY\n-----END CERTIFICATE-----\n\n# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center\n# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center\n# Label: \"Deutsche Telekom Root CA 2\"\n# Serial: 38\n# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08\n# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\nMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\nIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\nIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\nRTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\nU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\nIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\nha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\nQN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\nrFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\nNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\nQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\ntxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\nBgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\nAQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\ntJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\nIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\nxbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\nCm26OWMohpLzGITY+9HPBVZkVw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=ComSign Secured CA O=ComSign\n# Subject: CN=ComSign Secured CA O=ComSign\n# Label: \"ComSign Secured CA\"\n# Serial: 264725503855295744117309814499492384489\n# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5\n# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a\n# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2\n-----BEGIN CERTIFICATE-----\nMIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw\nPDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu\nMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx\nGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL\nMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf\nHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh\ngHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW\nv+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue\nMv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr\n9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt\n6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7\nMDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl\nY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58\nADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq\nhkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p\niL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC\ndsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL\nkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL\nhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz\nOjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc\n# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc\n# Label: \"Cybertrust Global Root\"\n# Serial: 4835703278459682877484360\n# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1\n# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG\nA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh\nbCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE\nChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS\nb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5\n7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS\nJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y\nHLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP\nt3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz\nFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY\nXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/\nMB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw\nhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js\nMB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA\nA4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj\nWqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx\nXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o\nomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc\nA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\nWL1WMRJOEcgh4LMRkWXbtKaIOM5V\n-----END CERTIFICATE-----\n\n# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority\n# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority\n# Label: \"ePKI Root Certification Authority\"\n# Serial: 28956088682735189655030529057352760477\n# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3\n# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe\nMQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0\nZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe\nFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw\nIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL\nSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH\nSyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh\nijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X\nDZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1\nTBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ\nfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA\nsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU\nWH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS\nnT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH\ndmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip\nNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC\nAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF\nMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB\nuvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl\nPwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP\nJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/\ngpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2\nj6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6\n5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB\no2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS\n/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z\nGp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE\nW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D\nhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n\n# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi\n# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi\n# 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\"\n# Serial: 17\n# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26\n# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS\nMRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp\nbGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw\nVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy\nYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy\ndGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2\nayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe\nFw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx\nGDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls\naW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU\nQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh\nxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0\naWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr\nIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h\ngb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK\nO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO\nfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw\nlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL\nhmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID\nAQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP\nNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t\nwyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM\n7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh\ngLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n\noN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs\nyZyQ2uypQjyttgI=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327\n# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327\n# Label: \"Buypass Class 2 CA 1\"\n# Serial: 1\n# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23\n# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc\n# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd\nMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg\nQ2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL\nMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD\nVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0\nojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX\nl18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB\nHfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B\n5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3\nWNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD\nAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP\ngcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+\nDKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu\nBctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs\nh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk\nLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho\n-----END CERTIFICATE-----\n\n# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327\n# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327\n# Label: \"Buypass Class 3 CA 1\"\n# Serial: 2\n# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b\n# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71\n# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd\nMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg\nQ2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL\nMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD\nVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg\nisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z\nNIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI\n+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R\nhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+\nmbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD\nAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP\nBdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s\nEzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2\nmSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC\ne/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow\ndXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915\n-----END CERTIFICATE-----\n\n# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.\n# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.\n# Label: \"EBG Elektronik Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1\"\n# Serial: 5525761995591021570\n# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37\n# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58\n# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2\n-----BEGIN CERTIFICATE-----\nMIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV\nBAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx\nc8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt\nZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4\nMTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg\nSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl\na25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h\n4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk\ntiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s\ntPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL\ndlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4\nc0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um\nTDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z\n+kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O\nLna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW\nOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW\nfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2\nl9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw\nFoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+\n8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI\n6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO\nTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME\nwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY\nIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn\nxk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q\nDgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q\nKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t\nhie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4\n7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7\nQPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT\n-----END CERTIFICATE-----\n\n# Issuer: O=certSIGN OU=certSIGN ROOT CA\n# Subject: O=certSIGN OU=certSIGN ROOT CA\n# Label: \"certSIGN ROOT CA\"\n# Serial: 35210227249154\n# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17\n# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT\nAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD\nQTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP\nMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do\n0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ\nUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d\nRdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ\nOA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv\nJoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C\nAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O\nBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ\nLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY\nMnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ\n44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I\nJd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw\ni/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN\n9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n\n# Issuer: CN=CNNIC ROOT O=CNNIC\n# Subject: CN=CNNIC ROOT O=CNNIC\n# Label: \"CNNIC ROOT\"\n# Serial: 1228079105\n# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19\n# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f\n# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7\n-----BEGIN CERTIFICATE-----\nMIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD\nTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2\nMDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF\nQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh\nIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6\ndLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO\nV/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC\nGHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN\nv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB\nAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB\nAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO\n76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK\nOOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH\nugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi\nyJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL\nbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj\n2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=\n-----END CERTIFICATE-----\n\n# Issuer: O=Japanese Government OU=ApplicationCA\n# Subject: O=Japanese Government OU=ApplicationCA\n# Label: \"ApplicationCA - Japanese Government\"\n# Serial: 49\n# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6\n# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74\n# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19\n-----BEGIN CERTIFICATE-----\nMIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc\nMBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp\nb25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT\nAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs\naWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H\nj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K\nf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55\nIrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw\nFO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht\nQWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm\n/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ\nk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ\nMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC\nseODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\nggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ\nhyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+\neKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U\nDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj\nB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL\nrosot4LKGAfmt1t06SAZf7IbiVQ=\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only\n# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only\n# Label: \"GeoTrust Primary Certification Authority - G3\"\n# Serial: 28809105769928564313984085209975885599\n# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05\n# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd\n# 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\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB\nmDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT\nMChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s\neTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ\nBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\nMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0\nBgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\nLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz\n+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm\nhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn\n5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W\nJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL\nDmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC\nhuOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\nHQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB\nAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB\nzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN\nkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\nAWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH\nSJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G\nspki4cErx5z481+oghLrGREt\n-----END CERTIFICATE-----\n\n# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only\n# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only\n# Label: \"thawte Primary Root CA - G2\"\n# Serial: 71758320672825410020661621085256472406\n# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f\n# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12\n# 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\n-----BEGIN CERTIFICATE-----\nMIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL\nMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp\nIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi\nBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw\nMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\nd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig\nYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v\ndCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/\nBebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6\npapu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K\nDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3\nKMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox\nXZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\n-----END CERTIFICATE-----\n\n# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only\n# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only\n# Label: \"thawte Primary Root CA - G3\"\n# Serial: 127614157056681299805556476275995414779\n# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31\n# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB\nrjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf\nQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw\nMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV\nBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa\nFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl\nLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u\nMTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl\nZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm\ngcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8\nYZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf\nb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9\n9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S\nzhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk\nOQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\nHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA\n2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW\noCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\nt8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c\nKUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM\nm7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu\nMdRAGmI0Nj81Aa6sY6A=\n-----END CERTIFICATE-----\n\n# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only\n# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only\n# Label: \"GeoTrust Primary Certification Authority - G2\"\n# Serial: 80682863203381065782177908751794619243\n# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a\n# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0\n# 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\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL\nMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj\nKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2\nMDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV\nBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw\nNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV\nBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH\nMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL\nSo17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal\ntJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO\nBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG\nCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT\nqQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz\nrD6ogRLQy7rQkgu2npaqBA+K\n-----END CERTIFICATE-----\n\n# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only\n# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only\n# Label: \"VeriSign Universal Root Certification Authority\"\n# Serial: 85209574734084581917763752644031726877\n# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19\n# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB\nvTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W\nZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe\nFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX\nMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0\nIE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y\nIGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh\nbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF\n9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH\nH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H\nLL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN\n/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT\nrJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw\nWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs\nexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\nDgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4\nsAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+\nseQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz\n4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+\nBxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR\nlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3\n7M2CYfE45k+XmCpajQ==\n-----END CERTIFICATE-----\n\n# 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\n# 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\n# Label: \"VeriSign Class 3 Public Primary Certification Authority - G4\"\n# Serial: 63143484348153506665311985501458640051\n# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41\n# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\nZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\nU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\naXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG\nA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp\nU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg\nSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln\nbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nIC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm\nGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve\nfLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ\naW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj\naHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW\nkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC\n4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga\nFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\n-----END CERTIFICATE-----\n\n# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)\n# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)\n# Label: \"NetLock Arany (Class Gold) Főtanúsítvány\"\n# Serial: 80544274841616\n# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88\n# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG\nEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3\nMDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl\ncnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR\ndGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB\npzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM\nb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm\naWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz\nIEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT\nlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz\nAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5\nVA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG\nILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2\nBJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG\nAQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M\nU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh\nbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C\n+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F\nuLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2\nXjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden\n# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden\n# Label: \"Staat der Nederlanden Root CA - G2\"\n# Serial: 10000012\n# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a\n# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO\nTDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh\ndCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX\nDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl\nciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv\nb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291\nqj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp\nuOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU\nZ5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE\npMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp\n5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M\nUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN\nGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy\n5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv\n6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK\neN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6\nB6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/\nBAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov\nL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG\nSIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS\nCZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen\n5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897\nIZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK\ngnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL\n+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL\nvJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm\nbEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk\nN1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC\nY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z\nywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=CA Disig O=Disig a.s.\n# Subject: CN=CA Disig O=Disig a.s.\n# Label: \"CA Disig\"\n# Serial: 1\n# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6\n# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41\n# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET\nMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE\nAxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw\nCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg\nYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE\nNx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX\nmjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD\nXcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW\nS8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp\nFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD\nAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu\nZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z\nay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv\nY2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw\nDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6\nyKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq\nEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/\nCBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB\nEicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN\nPGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus\n# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus\n# Label: \"Juur-SK\"\n# Serial: 999181308\n# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55\n# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89\n# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39\n-----BEGIN CERTIFICATE-----\nMIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN\nAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp\ndHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw\nMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw\nCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ\nMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB\nSvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz\nABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH\nLCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP\nPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL\n2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w\nggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC\nMIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk\nAGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0\nAHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz\nAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz\nAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f\nBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE\nFASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY\nP2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi\nCfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g\nkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95\nHvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS\nna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q\nqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z\nTbvGRNs2yyqcjg==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post\n# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post\n# Label: \"Hongkong Post Root CA 1\"\n# Serial: 1000\n# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca\n# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx\nFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg\nUm9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG\nA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr\nb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ\njVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn\nPzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh\nZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9\nnnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h\nq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED\nMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC\nmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3\n7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB\noiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs\nEhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO\nfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi\nAmvZWg==\n-----END CERTIFICATE-----\n\n# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.\n# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.\n# Label: \"SecureSign RootCA11\"\n# Serial: 1\n# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26\n# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr\nMCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG\nA1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0\nMDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp\nY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD\nQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz\ni1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8\nh9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV\nMdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9\nUK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni\n8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC\nh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD\nVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB\nAKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm\nKbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ\nX5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr\nQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5\npPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN\nQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n\n# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI\n# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI\n# Label: \"ACEDICOM Root\"\n# Serial: 7029493972724711941\n# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6\n# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE\nAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x\nCzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW\nMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF\nRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC\nAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7\n09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7\nXBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P\nGrjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK\nt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb\nX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28\nMHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU\nfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI\n2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH\nK9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae\nZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP\nBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ\nMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw\nRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv\nbS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm\nfQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3\ngvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe\nI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i\n5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi\nipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn\nMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ\no5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6\nzqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN\nGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt\nr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK\nZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n-----END CERTIFICATE-----\n\n# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority\n# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority\n# Label: \"Verisign Class 3 Public Primary Certification Authority\"\n# Serial: 80507572722862485515306429940691309246\n# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4\n# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b\n# 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\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG\nA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz\ncyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2\nMDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV\nBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt\nYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN\nADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE\nBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is\nI19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G\nCSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i\n2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ\n2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ\n-----END CERTIFICATE-----\n\n# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.\n# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.\n# Label: \"Microsec e-Szigno Root CA 2009\"\n# Serial: 14014712776195784473\n# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1\n# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e\n# 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\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD\nVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0\nZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G\nCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y\nOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx\nFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp\nZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP\nkd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc\ncbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U\nfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7\nN4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC\nxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1\n+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM\nPcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG\nSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h\nmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk\nddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c\n2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t\nHMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n\n# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S.\n# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S.\n# Label: \"E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi\"\n# Serial: 91184789765598910059173000485363494069\n# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b\n# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34\n# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98\n-----BEGIN CERTIFICATE-----\nMIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1\nMQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp\nZ2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp\na2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx\nMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg\nR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg\nU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU\nMZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT\nL/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H\n5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC\n90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1\nc+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE\nVtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP\nqk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S\n/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj\n/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X\nKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq\nfJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX\n-----END CERTIFICATE-----\n\n# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3\n# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3\n# Label: \"GlobalSign Root CA - R3\"\n# Serial: 4835703278459759426209954\n# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28\n# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\nMTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\nRgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\ngHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\nKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\nQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\nXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\nLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\nRUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\njjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\n6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\nmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\nMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\nWD9f\n-----END CERTIFICATE-----\n\n# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068\n# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068\n# Label: \"Autoridad de Certificacion Firmaprofesional CIF A62634068\"\n# Serial: 6047274297262753887\n# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3\n# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa\n# 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\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE\nBhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h\ncHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy\nMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg\nQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9\nthDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM\ncas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG\nL9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i\nNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h\nX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b\nm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy\nZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja\nEbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T\nKI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF\n6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh\nOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD\nVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ncm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv\nACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl\nAGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF\n661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9\nam58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1\nILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481\nPyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS\n3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k\nSeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF\n3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM\nZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g\nStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz\nQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB\njLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n-----END CERTIFICATE-----\n\n# Issuer: CN=Izenpe.com O=IZENPE S.A.\n# Subject: CN=Izenpe.com O=IZENPE S.A.\n# Label: \"Izenpe.com\"\n# Serial: 917563065490389241595536686991402621\n# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73\n# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19\n# 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\n-----BEGIN CERTIFICATE-----\nMIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4\nMQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6\nZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD\nVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j\nb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq\nscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO\nxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H\nLmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX\nuaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD\nyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+\nJrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q\nrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN\nBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L\nhij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB\nQFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+\nHMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu\nZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg\nQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB\nBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\nMCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA\nA4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb\nlaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56\nawmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo\nJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw\nLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT\nVyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk\nLhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb\nUjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/\nQnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+\nnaM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls\nQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.\n# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.\n# Label: \"Chambers of Commerce Root - 2008\"\n# Serial: 11806822484801597146\n# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7\n# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c\n# 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\n-----BEGIN CERTIFICATE-----\nMIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD\nVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0\nIHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3\nMRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz\nIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz\nMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj\ndXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw\nEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp\nMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9\n28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq\nVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q\nDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR\n5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL\nZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a\nSd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl\nUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s\n+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5\nWk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\nya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx\nhduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV\nHQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1\n+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN\nYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t\nL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy\nZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt\nIDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV\nHSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w\nDQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW\nPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF\n5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1\nglanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH\nFoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2\npSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD\nxvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG\ntjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq\njktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De\nfhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\nOGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ\nd0jQ\n-----END CERTIFICATE-----\n\n# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.\n# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.\n# Label: \"Global Chambersign Root - 2008\"\n# Serial: 14541511773111788494\n# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3\n# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c\n# 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\n-----BEGIN CERTIFICATE-----\nMIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD\nVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0\nIHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3\nMRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\naGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx\nMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy\ncmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG\nA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl\nBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI\nhvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed\nKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7\nG706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2\nzxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4\nddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG\nHoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2\nId3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V\nyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e\nbeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r\n6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\nwZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog\nzCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW\nBBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr\nru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp\nZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk\ncmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt\nYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC\nCQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow\nKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI\nhvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ\nUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz\nX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x\nfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz\na2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd\nYhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd\nSqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O\nAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso\nM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge\nv8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\n09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\n-----END CERTIFICATE-----\n\n# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.\n# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.\n# Label: \"Go Daddy Root Certificate Authority - G2\"\n# Serial: 0\n# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01\n# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\nEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\nZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz\nNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\nEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE\nAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD\nE6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH\n/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy\nDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh\nGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR\ntDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA\nAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\nFDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX\nWWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu\n9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr\ngIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo\n2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI\n4uJEvlz36hz1\n-----END CERTIFICATE-----\n\n# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.\n# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.\n# Label: \"Starfield Root Certificate Authority - G2\"\n# Serial: 0\n# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96\n# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e\n# 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\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs\nZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw\nMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj\naG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp\nY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg\nnLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1\nHOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N\nHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN\ndloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0\nHZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO\nBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G\nCSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU\nsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3\n4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg\n8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1\nmMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n\n# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.\n# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.\n# Label: \"Starfield Services Root Certificate Authority - G2\"\n# Serial: 0\n# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2\n# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f\n# 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\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\nZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\nVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\nZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\ndmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\nOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\n8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\nTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\nhRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\n6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\nDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\nAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\nbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\nve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\nqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\n0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\nsSi6\n-----END CERTIFICATE-----\n\n# Issuer: CN=AffirmTrust Commercial O=AffirmTrust\n# Subject: CN=AffirmTrust Commercial O=AffirmTrust\n# Label: \"AffirmTrust Commercial\"\n# Serial: 8608355977964138876\n# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7\n# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE\nBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz\ndCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL\nMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp\ncm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP\nHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr\nba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL\nMeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1\nyHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr\nVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/\nnx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ\nKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG\nXUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj\nvbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt\nZ8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g\nN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC\nnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n\n# Issuer: CN=AffirmTrust Networking O=AffirmTrust\n# Subject: CN=AffirmTrust Networking O=AffirmTrust\n# Label: \"AffirmTrust Networking\"\n# Serial: 8957382827206547757\n# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f\n# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE\nBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz\ndCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL\nMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp\ncm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y\nYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua\nkCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL\nQESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp\n6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG\nyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i\nQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ\nKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO\ntDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu\nQY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ\nLgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u\nolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48\nx3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n\n# Issuer: CN=AffirmTrust Premium O=AffirmTrust\n# Subject: CN=AffirmTrust Premium O=AffirmTrust\n# Label: \"AffirmTrust Premium\"\n# Serial: 7893706540734352110\n# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57\n# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE\nBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz\ndCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG\nA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U\ncnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf\nqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ\nJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ\n+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS\ns8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5\nHMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7\n70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG\nV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S\nqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S\n5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia\nC1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX\nOwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE\nFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\nBAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2\nKI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B\n8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ\nMKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc\n0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ\nu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF\nu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH\nYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8\nGKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO\nRtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e\nKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust\n# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust\n# Label: \"AffirmTrust Premium ECC\"\n# Serial: 8401224907861490260\n# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d\n# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb\n# 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\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC\nVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ\ncmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ\nBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt\nVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D\n0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9\nss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G\nA1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G\nA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs\naobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I\nflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority\n# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority\n# Label: \"Certum Trusted Network CA\"\n# Serial: 279744\n# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78\n# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM\nMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D\nZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU\ncnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3\nWjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg\nUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw\nIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH\nUV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM\nTXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU\nBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM\nkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x\nAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV\nHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y\nsHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL\nI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8\nJ9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY\nVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903\n# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903\n# Label: \"Certinomis - Autorité Racine\"\n# Serial: 1\n# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a\n# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET\nMBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk\nBgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4\nMjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl\ncnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0\naW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY\nF1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N\n8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe\nrP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K\n/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu\n7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC\n28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6\nlSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E\nnn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB\n0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09\n5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj\nWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN\njLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ\nKoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s\nov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM\nOH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q\n619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn\n2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj\no3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v\nnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG\n5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq\npdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb\ndsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0\nBLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5\n-----END CERTIFICATE-----\n\n# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA\n# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA\n# Label: \"Root CA Generalitat Valenciana\"\n# Serial: 994436456\n# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2\n# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46\n# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e\n-----BEGIN CERTIFICATE-----\nMIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF\nUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ\nR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN\nMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G\nA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw\nJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+\nWmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj\nSgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl\nu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy\nA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk\nHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7\nMIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr\naS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC\nIwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A\ncgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA\nYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA\nbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA\nbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA\naQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA\naQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA\nZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA\nYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA\nZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA\nLgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6\nLy93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y\neAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw\nCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G\nA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu\nY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn\nlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt\nb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg\n9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF\nducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC\nIoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=\n-----END CERTIFICATE-----\n\n# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03\n# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03\n# Label: \"A-Trust-nQual-03\"\n# Serial: 93214\n# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53\n# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2\n# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb\n-----BEGIN CERTIFICATE-----\nMIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB\nVDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp\nbSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R\ndWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw\nMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy\ndXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52\nZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM\nEEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj\nlUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ\nznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH\n2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1\nk3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs\n2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD\nVR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\nAQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG\nKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+\n8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R\nFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS\nmYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE\nDNuxUCAKGkq6ahq97BvIxYSazQ==\n-----END CERTIFICATE-----\n\n# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA\n# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA\n# Label: \"TWCA Root Certification Authority\"\n# Serial: 1\n# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79\n# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES\nMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU\nV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz\nWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO\nLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm\naWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE\nAcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH\nK3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX\nRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z\nrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx\n3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq\nhkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC\nMErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls\nXebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D\nlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn\naspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ\nYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n\n# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2\n# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2\n# Label: \"Security Communication RootCA2\"\n# Serial: 0\n# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43\n# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl\nMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe\nU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX\nDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy\ndXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj\nYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV\nOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr\nzbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM\nVAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ\nhNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO\nojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw\nawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs\nOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3\nDQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF\ncoJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc\nokgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8\nt/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy\n1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/\nSjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\n-----END CERTIFICATE-----\n\n# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority\n# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority\n# Label: \"Hellenic Academic and Research Institutions RootCA 2011\"\n# Serial: 0\n# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9\n# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix\nRDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1\ndGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p\nYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw\nNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK\nEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl\ncnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl\nc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz\ndYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ\nfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns\nbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD\n75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP\nFEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV\nHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp\n5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu\nb3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA\nA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p\n6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\nTqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7\ndIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys\nNnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI\nl7WdmplNsDz4SgCbZN2fOUvRJ9e4\n-----END CERTIFICATE-----\n\n# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967\n# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967\n# Label: \"Actalis Authentication Root CA\"\n# Serial: 6271844772424770508\n# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6\n# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE\nBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w\nMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\nIENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC\nSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1\nODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv\nUTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX\n4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9\nKK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/\ngCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb\nrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ\n51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F\nbe8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe\nKF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F\nv6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn\nfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7\njPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz\nezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\nifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL\ne3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70\njsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz\nWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V\nSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j\npwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX\nX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok\nfcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R\nK4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU\nZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU\nLysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT\nLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\n-----END CERTIFICATE-----\n\n# Issuer: O=Trustis Limited OU=Trustis FPS Root CA\n# Subject: O=Trustis Limited OU=Trustis FPS Root CA\n# Label: \"Trustis FPS Root CA\"\n# Serial: 36053640375399034304724988975563710553\n# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d\n# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF\nMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL\nExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx\nMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc\nMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+\nAOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH\niTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj\nvSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA\n0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB\nOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/\nBAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E\nFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01\nGX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW\nzaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4\n1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE\nf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F\njZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN\nZetX2fNXlrtIzYE=\n-----END CERTIFICATE-----\n\n# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing\n# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing\n# Label: \"StartCom Certification Authority\"\n# Serial: 45\n# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16\n# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0\n# 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\n-----BEGIN CERTIFICATE-----\nMIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW\nMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg\nQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9\nMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi\nU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh\ncnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk\npMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf\nOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C\nJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT\nKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi\nHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM\nAv+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w\n+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+\nGkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3\nZzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B\n26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID\nAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD\nVR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul\nF2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC\nATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w\nZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk\naWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0\nYXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg\nc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0\naWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93\nd3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG\nCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF\nwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS\nTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst\n0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc\npRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl\nCcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF\nP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK\n1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm\nKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE\nJnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ\n8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm\nfyWl8kgAwKQB2j8=\n-----END CERTIFICATE-----\n\n# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.\n# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.\n# Label: \"StartCom Certification Authority G2\"\n# Serial: 59\n# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64\n# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW\nMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm\naWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1\nOTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG\nA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ\nJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD\nvfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo\nD/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/\nQ0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW\nRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK\nHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN\nnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM\n0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i\nUUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9\nHa90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg\nTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\nAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL\nBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K\n2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX\nUfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl\n6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK\n9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ\nHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI\nwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY\nXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l\nIxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo\nhdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr\nso8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI\n-----END CERTIFICATE-----\n\n# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327\n# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327\n# Label: \"Buypass Class 2 Root CA\"\n# Serial: 2\n# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29\n# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd\nMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg\nQ2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow\nTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw\nHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB\nBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr\n6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV\nL4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91\n1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx\nMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ\nQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB\narcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr\nUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi\nFRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS\nP/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN\n9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP\nAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz\nuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h\n9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\nA20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t\nOluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo\n+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7\nKcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2\nDISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us\nH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ\nI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7\n5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h\n3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz\nY11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327\n# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327\n# Label: \"Buypass Class 3 Root CA\"\n# Serial: 2\n# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec\n# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd\nMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg\nQ2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow\nTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw\nHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB\nBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y\nZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E\nN3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9\ntznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX\n0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c\n/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X\nKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY\nzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS\nO1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D\n34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP\nK9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3\nAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv\nTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj\nQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ncSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS\nIGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2\nHJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa\nO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv\n033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u\ndmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE\nkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41\n3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD\nu79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq\n4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=\n-----END CERTIFICATE-----\n\n# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center\n# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center\n# Label: \"T-TeleSec GlobalRoot Class 3\"\n# Serial: 1\n# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef\n# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1\n# 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\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\nKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\nBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\nYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1\nOTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\naXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\nZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN\n8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/\nRLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4\nhqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5\nZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM\nEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1\nA/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy\nWL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ\n1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30\n6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT\n91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ne9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p\nTpPDpFQUWw==\n-----END CERTIFICATE-----\n\n# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus\n# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus\n# Label: \"EE Certification Centre Root CA\"\n# Serial: 112324828676200291871926431888494945866\n# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f\n# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1\nMQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1\nczEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG\nCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy\nMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl\nZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS\nb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy\neuuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO\nbntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw\nWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d\nMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE\n1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD\nVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/\nzQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB\nBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF\nBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV\nv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG\nE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u\nuSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW\niAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v\nGVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=\n-----END CERTIFICATE-----\n\n# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007\n# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007\n# Label: \"TURKTRUST Certificate Services Provider Root 2007\"\n# Serial: 1\n# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72\n# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc\nUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx\nc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS\nS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg\nSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx\nOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry\nb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC\nVFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE\nsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F\nni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY\nKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG\n+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG\nHtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P\nIzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M\n733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk\nYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G\nCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW\nAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I\naE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5\nmxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa\nXRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ\nqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9\n-----END CERTIFICATE-----\n\n# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH\n# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH\n# Label: \"D-TRUST Root Class 3 CA 2 2009\"\n# Serial: 623603\n# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f\n# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF\nMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD\nbGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha\nME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM\nHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03\nUAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42\ntSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R\nySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM\nlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp\n/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G\nA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G\nA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj\ndG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy\nMENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl\ncmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js\nL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL\nBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni\nacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\no3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K\nzCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8\nPIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y\nJohw1+qRzT65ysCQblrGXnRl11z+o+I=\n-----END CERTIFICATE-----\n\n# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH\n# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH\n# Label: \"D-TRUST Root Class 3 CA 2 EV 2009\"\n# Serial: 623604\n# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6\n# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83\n# 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\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF\nMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD\nbGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw\nNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV\nBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn\nljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0\n3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z\nqQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR\np75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8\nHgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw\nggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea\nHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw\nOi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh\nc3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E\nRT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt\ndHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku\nY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp\n3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\nnsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF\nCSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na\nxpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX\nKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1\n-----END CERTIFICATE-----\n\n# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica\n# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT\n# Label: \"PSCProcert\"\n# Serial: 11\n# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec\n# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74\n# 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\n-----BEGIN CERTIFICATE-----\nMIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1\ndG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s\nYW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz\ndHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0\naWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh\nIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ\nKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw\nMFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy\nb2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx\nKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG\nA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u\naWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI\nhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9\n7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74\nBCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G\nieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9\nJcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0\nPghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2\n0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH\n0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/\n6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m\nv6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7\nK2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev\nbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw\nMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w\nMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD\ngBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0\nb3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh\nbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0\ncml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp\nZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg\nZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq\nhkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD\nAgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w\nMDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag\nRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t\nUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl\ncnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v\nY3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG\nAQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN\nAQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS\n1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB\n3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv\nWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh\nHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm\npHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz\nsOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE\nqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb\nmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9\nopLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H\nYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km\n-----END CERTIFICATE-----\n\n# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center\n# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center\n# Label: \"China Internet Network Information Center EV Certificates Root\"\n# Serial: 1218379777\n# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15\n# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e\n# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7\n-----BEGIN CERTIFICATE-----\nMIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC\nQ04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g\nQ2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0\naW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa\nFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg\nSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo\naW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp\nZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z\n7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//\nDdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx\nzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8\nhBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs\n4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u\ngQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY\nNJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E\nFgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3\nj92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG\n52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB\nechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws\nZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI\nzo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy\nwy39FCqQmbkHzJ8=\n-----END CERTIFICATE-----\n\n# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services\n# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services\n# Label: \"Swisscom Root CA 2\"\n# Serial: 40698052477090394928831521023204026294\n# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19\n# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec\n# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk\nMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0\nYWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg\nQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT\nAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp\nY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN\nBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr\njw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r\n0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f\n2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP\nACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF\ny6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA\ntukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL\n6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0\nuPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL\nacywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh\nk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q\nVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw\nFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O\nBBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh\nb97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R\nfbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv\n/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI\nREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx\nsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv\naGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT\nwoCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n\nBjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W\nt6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N\n8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2\n9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5\nwSsSnqaeG8XmDtkx2Q==\n-----END CERTIFICATE-----\n\n# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services\n# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services\n# Label: \"Swisscom Root EV CA 2\"\n# Serial: 322973295377129385374608406479535262296\n# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec\n# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b\n# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d\n-----BEGIN CERTIFICATE-----\nMIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw\nZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp\ndGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290\nIEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD\nVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy\ndGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg\nMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx\nUglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD\n1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH\noCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR\nHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/\n5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv\nidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL\nOdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC\nNYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f\n46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB\nUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth\n7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G\nA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED\nMB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB\nbj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x\nXCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T\nPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0\nWqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70\nWBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL\nGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm\n7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S\nnr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN\nvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB\nWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI\nfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb\nI+2ksx0WckNLIOFZfsLorSa/ovc=\n-----END CERTIFICATE-----\n\n# Issuer: CN=CA Disig Root R1 O=Disig a.s.\n# Subject: CN=CA Disig Root R1 O=Disig a.s.\n# Label: \"CA Disig Root R1\"\n# Serial: 14052245610670616104\n# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a\n# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV\nBAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu\nMRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy\nMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx\nEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw\nggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk\nD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o\nOI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A\nfQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe\nIgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n\noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK\n/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj\nrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD\n3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE\n7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC\nyC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd\nqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\nDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI\nhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR\nxVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA\nSfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo\nHqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB\nemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC\nAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb\n7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x\nDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk\nF7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF\na3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT\nQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL\n-----END CERTIFICATE-----\n\n# Issuer: CN=CA Disig Root R2 O=Disig a.s.\n# Subject: CN=CA Disig Root R2 O=Disig a.s.\n# Label: \"CA Disig Root R2\"\n# Serial: 10572350602393338211\n# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03\n# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV\nBAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu\nMRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy\nMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx\nEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw\nggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe\nNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH\nPWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I\nx2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe\nQTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR\nyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO\nQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912\nH9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ\nQfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD\ni/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs\nnLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1\nrqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\nDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI\nhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ntCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf\nGopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb\nlvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka\n+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal\nTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i\nnSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3\ngzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr\nG5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os\nzMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x\nL4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL\n-----END CERTIFICATE-----\n\n# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV\n# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV\n# Label: \"ACCVRAIZ1\"\n# Serial: 6828503384748696800\n# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02\n# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17\n# 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\n-----BEGIN CERTIFICATE-----\nMIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE\nAwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw\nCQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ\nBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND\nVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb\nqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY\nHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo\nG2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA\nlHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr\nIA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/\n0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH\nk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47\n4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO\nm3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa\ncXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl\nuUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI\nKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls\nZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG\nAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\nVuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT\nVfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG\nCCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA\ncgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA\nQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA\n7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA\ncgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA\nQwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA\nczAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu\naHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt\naW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud\nDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF\nBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp\nD70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU\nJyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m\nAM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD\nvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms\ntn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH\n7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\nI6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA\nh1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF\nd3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H\npPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7\n-----END CERTIFICATE-----\n\n# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA\n# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA\n# Label: \"TWCA Global Root CA\"\n# Serial: 3262\n# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96\n# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65\n# 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\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx\nEjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT\nVFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5\nNTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT\nB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF\n10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz\n0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh\nMBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH\nzIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc\n46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2\nyKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi\nlaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP\noA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA\nBDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE\nqYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm\n4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL\n1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\nLhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF\nH6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo\nRI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+\nnile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh\n15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW\n6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW\nnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j\nwa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz\naGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy\nKwbQBM0=\n-----END CERTIFICATE-----\n\n# Certificate for https://pcs.baidu.com\n# VeriSign Class 3 International Server CA - G3\n# http://se.symcb.com/se.crt\n-----BEGIN CERTIFICATE-----\nMIIGKTCCBRGgAwIBAgIQZBvoIM4CCBPzLU0tldZ+ZzANBgkqhkiG9w0BAQUFADCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\nZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5IC0gRzUwHhcNMTAwMjA4MDAwMDAwWhcNMjAwMjA3MjM1OTU5WjCBvDEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\nZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQg\naHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMtVmVy\naVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmdacYvAV9IGaQQhZjxOdF8mfUdza\nsVLv/+NB3eDfxCjG4615HycQmLi7IJfBKERBD+qpqFLPTU4bi7u1xHbZzFYG7rNV\nICreFY1xy1TIbxfNiQDk3P/hwB9ocenHKS5+vDv85burJlSLZpDN9pK5MSSAvJ5s\n1fx+0uFLjNxC+kRLX/gYtS4w9D0SmNNiBXNUppyiHb5SgzoHRsQ7AlYhv/JRT9Cm\nmTnprqU/iZucff5NYAclIPe712mDK4KTQzfZg0EbawurSmaET0qO3n40mY5o1so5\nBptMs5pITRNGtFghBMT7oE2sLktiEuP7TfbJUQABH/weaoEqOOC5T9YtRQIDAQAB\no4ICFTCCAhEwEgYDVR0TAQH/BAgwBgEB/wIBADBwBgNVHSAEaTBnMGUGC2CGSAGG\n+EUBBxcDMFYwKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9j\ncHMwKgYIKwYBBQUHAgIwHhocaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYTAO\nBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\nZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDov\nL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwNAYDVR0lBC0wKwYIKwYBBQUH\nAwEGCCsGAQUFBwMCBglghkgBhvhCBAEGCmCGSAGG+EUBCAEwNAYIKwYBBQUHAQEE\nKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJpc2lnbi5jb20wNAYDVR0f\nBC0wKzApoCegJYYjaHR0cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy1nNS5jcmww\nKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFZlcmlTaWduTVBLSS0yLTcwHQYDVR0O\nBBYEFNebfNgioBX33a1fzimbWMO8RgC1MB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ\n80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQBxtX1zUkrd1000Ky6vlEalSVAC\nT/gvF3DyE9wfIYaqwk98NzzURniuXXhv0bpavBCrWDbFjGIVRWAXIeLVQqh3oVXY\nQwRR9m66SOZdTLdE0z6k1dYzmp8N5tdOlkSVWmzWoxZTDphDzqS4w2Z6BVxiEOgb\nEtt9LnZQ/9/XaxvMisxx+rNAVnwzeneUW/ULU/sOX7xo+68q7jA3eRaTJX9NEP9X\n+79uOzMh3nnchhdZLUNkt6Zmh+q8lkYZGoaLb9e3SQBb26O/KZru99MzrqP0nkzK\nXmnUG623kHdq2FlveasB+lXwiiFm5WVu/XzT3x7rfj8GkPsZC9MGAht4Q5mo\n-----END CERTIFICATE-----\n\n# Certificate for https://*.baidu.com\n# VeriSign Class 3 Secure Server CA - G3\n# http://sd.symcb.com/sd.crt\n-----BEGIN CERTIFICATE-----\nMIIF7DCCBNSgAwIBAgIQbsx6pacDIAm4zrz06VLUkTANBgkqhkiG9w0BAQUFADCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\nZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5IC0gRzUwHhcNMTAwMjA4MDAwMDAwWhcNMjAwMjA3MjM1OTU5WjCBtTEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\nZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQg\naHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDEvMC0GA1UEAxMmVmVy\naVNpZ24gQ2xhc3MgMyBTZWN1cmUgU2VydmVyIENBIC0gRzMwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCxh4QfwgxF9byrJZenraI+nLr2wTm4i8rCrFbG\n5btljkRPTc5v7QlK1K9OEJxoiy6Ve4mbE8riNDTB81vzSXtig0iBdNGIeGwCU/m8\nf0MmV1gzgzszChew0E6RJK2GfWQS3HRKNKEdCuqWHQsV/KNLO85jiND4LQyUhhDK\ntpo9yus3nABINYYpUHjoRWPNGUFP9ZXse5jUxHGzUL4os4+guVOc9cosI6n9FAbo\nGLSa6Dxugf3kzTU2s1HTaewSulZub5tXxYsU5w7HnO1KVGrJTcW/EbGuHGeBy0RV\nM5l/JJs/U0V/hhrzPPptf4H1uErT9YU3HLWm0AnkGHs4TvoPAgMBAAGjggHfMIIB\n2zA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlz\naWduLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMHAGA1UdIARpMGcwZQYLYIZIAYb4\nRQEHFwMwVjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2Nw\nczAqBggrBgEFBQcCAjAeGhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMDQG\nA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwudmVyaXNpZ24uY29tL3BjYTMtZzUu\nY3JsMA4GA1UdDwEB/wQEAwIBBjBtBggrBgEFBQcBDARhMF+hXaBbMFkwVzBVFglp\nbWFnZS9naWYwITAfMAcGBSsOAwIaBBSP5dMahqyNjmvDz4Bq1EgYLHsZLjAlFiNo\ndHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvLmdpZjAoBgNVHREEITAfpB0w\nGzEZMBcGA1UEAxMQVmVyaVNpZ25NUEtJLTItNjAdBgNVHQ4EFgQUDURcFlNEwYJ+\nHSCrJfQBY9i+eaUwHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6Aq8zMTMwDQYJ\nKoZIhvcNAQEFBQADggEBAAyDJO/dwwzZWJz+NrbrioBL0aP3nfPMU++CnqOh5pfB\nWJ11bOAdG0z60cEtBcDqbrIicFXZIDNAMwfCZYP6j0M3m+oOmmxw7vacgDvZN/R6\nbezQGH1JSsqZxxkoor7YdyT3hSaGbYcFQEFn0Sc67dxIHSLNCwuLvPSxe/20majp\ndirhGi2HbnTTiN0eIsbfFrYrghQKlFzyUOyvzv9iNw2tZdMGQVPtAhTItVgooazg\nW+yzf5VK+wPIrSbb5mZ4EkrZn0L74ZjmQoObj49nJOhhGbXdzbULJgWOw27EyHW4\nRs/iGAZeqa6ogZpHFt4MKGwlJ7net4RYxh84HqTEy2Y=\n-----END CERTIFICATE-----\n\n"
  },
  {
    "path": "bypy/bypy.py",
    "content": "#!/usr/bin/env python -tt\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n# ===  IMPORTANT  ====\n# NOTE: In order to support non-ASCII file names,\n#       your system's locale MUST be set to 'utf-8'\n# CAVEAT: DOESN'T seem to work with proxy, the underlying reason being\n#         the 'requests' package used for http communication doesn't seem\n#         to work properly with proxies, reason unclear.\n# NOTE: It seems Baidu doesn't handle MD5 quite right after combining files,\n#       so it may return erroneous MD5s. Perform a rapidupload again may fix the problem.\n#        That's why I changed default behavior to no-verification.\n# NOTE: syncup / upload, syncdown / downdir are partially duplicates\n#       the difference: syncup/down compare and perform actions\n#       while down/up just proceed to download / upload (but still compare during actions)\n#       so roughly the same, except that sync can delete extra files\n#\n# TODO: Dry run?\n# TODO: Use batch functions for better performance\n# == NOTE ==\n# Proxy is supported by the underlying Requests library,\n# you can activate HTTP proxies by setting the HTTP_PROXY and / or\n# HTTPS_PROXY environment variables respectively as follows:\n#   HTTP_PROXY=http://user:password@domain\n#   HTTPS_PROXY=http://user:password@domain\n# (More information: http://docs.python-requests.org/en/master/user/advanced/#proxies)\n# Though from my experience, it seems that some proxy servers may not be supported properly.\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport os\nimport sys\nimport io\nimport signal\nimport time\nimport shutil\nimport tempfile\nimport posixpath\nimport json\nimport hashlib\n#import base64\nimport re\nimport pprint\nimport socket\nimport subprocess\nimport shlex\nimport atexit\nfrom collections import deque\n#from collections import OrderedDict\nfrom functools import partial\nfrom argparse import ArgumentParser\nfrom argparse import RawDescriptionHelpFormatter\nfrom copy import deepcopy\n\n# unify Python 2 and 3\nif sys.version_info[0] == 2:\n\timport urllib as ulp\n\timport cPickle as pickle\n\tpickleload = pickle.load\nelif sys.version_info[0] == 3:\n\timport urllib.parse as ulp\n\timport pickle\n\tunicode = str\n\tbasestring = str\n\tlong = int\n\traw_input = input\n\tpickleload = partial(pickle.load, encoding=\"bytes\")\n\nfrom . import const\nfrom . import gvar\nfrom . import printer_console\nfrom . import cached as cachedm\nfrom . import util\nfrom . import printer\nfrom .cached import (cached, stringifypickle, md5, crc32, slice_md5)\nfrom .struct import PathDictTree\nfrom .util import (\n\tiswindows,\n\tnop,\n\tperr, pwarn, pinfo, pdbg,\n\tjsondump, jsonload, formatex, rb,\n\tjoinpath, get_pcs_path, print_pcs_list, str2bool, str2int,\n\thuman_size, interpret_size, ls_time, ls_type,\n\tmakedir, removedir, movefile, removefile, getfilesize,\n\tcomp_semver,\n\tMyPrettyPrinter)\nfrom .chkreq import (check_requirements, CheckResult)\nfrom .requester import RequestsRequester\n\npr = printer_console.pr\nprcolor = printer_console.prcolor\nask = printer_console.ask\npprgr = printer_console.pprgr\n\n# there was a WantWriteError uncaught exception for Urllib3:\n# https://github.com/shazow/urllib3/pull/412\n# it was fixed here:\n# https://github.com/shazow/urllib3/pull/413\n# commit:\n# https://github.com/shazow/urllib3/commit/a89dda000ed144efeb6be4e0b417c0465622fe3f\n# and this was included in this commit in the Requests library\n# https://github.com/kennethreitz/requests/commit/7aa6c62d6d917e11f81b166d1d6c9e60340783ac\n# which was included in version 2.5.0 or above\n# so minimum 2.5.0 is required\nimport requests\ntry:\n\tfrom requests.packages.urllib3.exceptions import ReadTimeoutError\nexcept:\n\ttry:\n\t\tfrom urllib3.exceptions import ReadTimeoutError\n\t\tReadTimeoutError\n\texcept:\n\t\tperr(\"Something seems wrong with the urllib3 installation.\\nQuitting\")\n\t\tsys.exit(const.EFatal)\n\nfrom requests_toolbelt import multipart\n\n# http://stackoverflow.com/a/27320254/404271\ntry:\n\timport multiprocess as mp\n\tfrom multiprocess import Pool\nexcept ImportError:\n\tmp = None\n\tPool = None\n\tperr(\"'multiprocess' library is not available, no parallel dl/ul.\")\n\nmpsemaphore = mp.Semaphore(1) if mp else None\ncached.semaphore = mpsemaphore\n\nif Pool != None:\n\tif sys.version_info[0] == 2:\n\t\t# enable with statement\n\t\tfrom contextlib import contextmanager\n\t\t@contextmanager\n\t\tdef UPool(*args, **kwargs):\n\t\t\tyield Pool(*args, **kwargs)\n\telif sys.version_info[0] == 3:\n\t\tUPool = Pool\n\npcsurl = const.PcsUrl\ncpcsurl = const.CPcsUrl\ndpcsurl = const.DPcsUrl\n\n# This crap is here to avoid circular imports\n# What a fantastic packing architecture Python has!\ndef makemppr(pr):\n\tdef mppr(msg, *args, **kwargs):\n\t\treturn pr(mp.current_process().name + ': ' + msg, *args, **kwargs)\n\treturn mppr\n\ndef makemppprgr(pprgr):\n\tdef mppprgr(finish, total, start_time = None, existing = 0,\n\t\tprefix = '', suffix = '', seg = 20):\n\t\tprefix = mp.current_process().name + ': ' + str(prefix)\n\t\tpprgr(finish, total, start_time, existing, prefix, suffix, seg)\n\treturn mppprgr\n\ndef set_mp_print():\n\tglobal pr\n\tglobal prcolor\n\tglobal ask\n\tglobal pprgr\n\topr = pr\n\toprcolor = prcolor\n\toask = ask\n\topprgr = pprgr\n\tdef restoremp():\n\t\tglobal pr\n\t\tglobal prcolor\n\t\tglobal ask\n\t\tglobal pprgr\n\t\tpr = cachedm.pr = util.pr = opr\n\t\tprcolor = util.prcolor = printer.prcolor = oprcolor\n\t\task = util.ask = oask\n\t\tpprgr = util.pprgr = opprgr\n\n\tpr = cachedm.pr = util.pr = makemppr(opr)\n\tprcolor = util.prcolor = printer.prcolor = makemppr(oprcolor)\n\task = util.ask = makemppr(oask)\n\tpprgr = util.pprgr = makemppprgr(opprgr)\n\n\treturn restoremp\n\nclass ByPy(object):\n\t'''The main class of the bypy program'''\n\t# TODO: Apply to configdir instead of ~/.bypy\n\t@staticmethod\n\tdef migratesettings():\n\t\tresult = const.ENoError\n\n\t\tif os.path.exists(const.OldByPyCertsPath):\n\t\t\tremovefile(const.OldByPyCertsPath)\n\n\t\tfilesToMove = [\n\t\t\t[const.OldTokenFilePath, const.TokenFilePath],\n\t\t\t[const.OldPicklePath, const.PicklePath]\n\t\t]\n\n\t\tresult = makedir(const.ConfigDir, 0o700) and result # make it secretive\n\t\t# this directory must exist\n\t\tif result != const.ENoError:\n\t\t\tperr(\"Fail to create config directory '{}'\".format(const.ConfigDir))\n\t\t\treturn result\n\n\t\tfor tomove in filesToMove:\n\t\t\toldfile = tomove[0]\n\t\t\tnewfile = tomove[1]\n\t\t\tif os.path.exists(oldfile):\n\t\t\t\tdst = newfile\n\t\t\t\tif os.path.exists(newfile):\n\t\t\t\t\tdst = dst + '.old'\n\t\t\t\tresult = movefile(oldfile, dst) and result\n\n\t\t# we move to JSON for hash caching for better portability\n\t\t# http://www.benfrederickson.com/dont-pickle-your-data/\n\t\t# https://kovshenin.com/2010/pickle-vs-json-which-is-faster/\n\t\t# JSON even outpeforms Pickle and definitely much more portable\n\t\t# DON'T bother with pickle.\n\t\tif os.path.exists(const.PicklePath):\n\t\t\toldcache = {}\n\t\t\ttry:\n\t\t\t\twith io.open(const.PicklePath, 'rb') as f:\n\t\t\t\t\toldcache = pickleload(f)\n\t\t\t\tstringifypickle(oldcache)\n\t\t\t\tcached.loadcache(oldcache)\n\t\t\t\tcached.savecache(force_saving=True)\n\t\t\t\tpinfo(\"Contents of Pickle (old format hash cache) '{}' \"\n\t\t\t\t\"has been merged to '{}'\".format(const.PicklePath, const.HashCachePath))\n\t\t\t\tmergedfile = const.PicklePath + '.merged'\n\t\t\t\tok = movefile(const.PicklePath, mergedfile)\n\t\t\t\tif ok == const.ENoError:\n\t\t\t\t\tpinfo(\"Pickle (old format hash cache) '{}' \"\n\t\t\t\t\t\"has been renamed to '{}\".format(const.PicklePath, mergedfile))\n\t\t\t\telse:\n\t\t\t\t\tperr(\"Failed to move Pickle (old format hash cache) '{}' to '{}'\".format(const.PicklePath, mergedfile))\n\t\t\texcept (\n\t\t\t\tpickle.PickleError,\n\t\t\t\t# the following is for dealing with corrupted cache file\n\t\t\t\tEOFError, TypeError, ValueError):\n\t\t\t\tinvalidfile = const.PicklePath + '.invalid'\n\t\t\t\tok = movefile(const.PicklePath, invalidfile)\n\t\t\t\tperr(\"{} invalid Pickle (old format hash cache) file '{}' to '{}'\".format(\n\t\t\t\t\t\"Moved\" if ok == const.ENoError else \"Failed to move\",\n\t\t\t\t\tconst.PicklePath, invalidfile))\n\n\t\treturn result\n\n\tdef setpcsurl(self, mirror):\n\t\tglobal pcsurl\n\t\tglobal cpcsurl\n\t\tglobal dpcsurl\n\t\tmirror = 'https://' + mirror + const.RestApiPath\n\t\tpcsurl = mirror\n\t\tcpcsurl = mirror\n\t\tdpcsurl = mirror\n\t\t# TODO: the SSL error may have gone, and the following is not needed\n#\t\tif mirror != const.PcsDomain:\n#\t\t\t# using a mirror, which has name mismatch SSL error, so need to disable SSL check\n#\t\t\tpwarn(\"Mirror '{}' used instead of the default PCS server url '{}', \".format(pcsurl, const.PcsUrl) +  \\\n#\t\t\t\t  \"we have to disable the SSL cert check in this case.\")\n#\t\t\tself._checkssl = False\n\n\tdef savesetting(self):\n\t\ttry:\n\t\t\tjsondump(self._setting, self._settingpath, mpsemaphore)\n\t\texcept Exception as ex:\n\t\t\tperr(\"Failed to save settings.\\n{}\".format(formatex(ex)))\n\t\t\t# complaining is enough, no need more actions as this is non-critical\n\n\t# def quit(self, retcode = const.ENoError):\n\tdef cleanup(self):\n\t\t# saving is the most important\n\t\t# we save, but don't clean, why?\n\t\t# think about unmount path, moved files,\n\t\t# once we discard the information, they are gone.\n\t\t# so unless the user specifically request a clean,\n\t\t# we don't act too smart.\n\t\t#cached.cleancache()\n\t\tcached.savecache()\n\t\tself.savesetting()\n\t\t# if we flush() on Ctrl-C, we get\n\t\t# IOError: [Errno 32] Broken pipe\n\t\tsys.stdout.flush()\n\t\t# sys.exit(retcode)\n\n\t# TODO: this constructor is getting fat ...\n\tdef __init__(self,\n\t\tslice_size = const.DefaultSliceSize,\n\t\tdl_chunk_size = const.DefaultDlChunkSize,\n\t\tverify = True,\n\t\tretry = 5, timeout = const.DefaultTimeOutInSeconds,\n\t\tquit_when_fail = False,\n\t\tresumedownload = True,\n\t\textraupdate = lambda: (),\n\t\tincregex = '',\n\t\tondup = '',\n\t\tfollowlink = True,\n\t\tcheckssl = True,\n\t\tcacerts = None,\n\t\trapiduploadonly = False,\n\t\tmirror = '',\n\t\tselectmirror = False,\n\t\tresumedl_revertcount = const.DefaultResumeDlRevertCount,\n\t\tdeletesource = False,\n\t\tverbose = 0, debug = False,\n\t\tconfigdir = const.ConfigDir,\n\t\trequester = RequestsRequester,\n\t\tapikey = const.ApiKey,\n\t\tdownloader = \"\",\n\t\tdownloader_args = \"\",\n\t\tprocesses = const.DefaultProcessCount,\n\t\tsecretkey = const.SecretKey):\n\t\tsuper(ByPy, self).__init__()\n\t\tself.jsonq = deque(maxlen = 64)\n\n\t\t# these two variables are without leading double underscore \"__\" as to export the as public,\n\t\t# so if any code using this class can check the current verbose / debug level\n\t\tcached.verbose = self.verbose = verbose\n\t\tcached.debug = self.debug = debug\n\n\t\tself._load_auth_server_list()\n\n\t\tif not cached.usecache:\n\t\t\tpinfo(\"Forced hash recalculation, hash cache won't be used\")\n\n\t\t# handle backward compatibility, a.k.a. history debt\n\t\tsr = ByPy.migratesettings()\n\t\tif sr != const.ENoError:\n\t\t\t# bail out\n\t\t\tperr(\"Failed to migrate old settings.\")\n\t\t\tsys.exit(const.EMigrationFailed)\n\n\t\tself._configdir = configdir.rstrip(\"/\\\\ \")\n\t\tmakedir(self._configdir)\n\t\t# os.path.join() may not handle unicode well on Python 2.7\n\t\tself._progresspath = configdir + os.sep + const.ProgressFileName\n\t\tself._tokenpath = configdir + os.sep + const.TokenFileName\n\t\tself._settingpath = configdir + os.sep + const.SettingFileName\n\t\tself._setting = {}\n\n\t\tself._downloader = downloader.lower().strip()\n\t\tif downloader_args:\n\t\t\tself._downloader_args = downloader_args\n\t\telse:\n\t\t\tif downloader in const.DownloaderDefaultArgs:\n\t\t\t\tself._downloader_args = const.DownloaderDefaultArgs[downloader]\n\t\t\telse:\n\t\t\t\tself._downloader_args = ''\n\n\t\tif os.path.exists(self._settingpath):\n\t\t\ttry:\n\t\t\t\tself._setting = jsonload(self._settingpath)\n\t\t\texcept Exception as ex:\n\t\t\t\tperr(\"Error loading settings, using default settings.{}\".format(formatex(ex)))\n\t\tself._hashcachepath = configdir + os.sep + const.HashCacheFileName\n\t\tcached.hashcachepath = self._hashcachepath\n\t\tself._certspath = os.path.join(os.path.dirname(__file__), const.ByPyCertsFileName)\n\n\t\tself._requester = requester\n\t\tself._apikey = apikey\n\t\tself._secretkey = secretkey\n\t\tself._use_server_auth = not secretkey\n\n\t\tself._slice_size = slice_size\n\t\tself._dl_chunk_size = dl_chunk_size\n\t\tself._verify = verify\n\t\tself._retry = retry\n\t\tself._quit_when_fail = quit_when_fail\n\t\tself._timeout = timeout\n\t\tself._resumedownload = resumedownload\n\t\tself._extraupdate = extraupdate\n\t\tself._incregex = incregex\n\t\tself._incregmo = re.compile(incregex)\n\t\tif ondup and len(ondup) > 0:\n\t\t\tself._ondup = ondup[0].upper()\n\t\telse:\n\t\t\tself._ondup = 'O' # O - Overwrite* S - Skip P - Prompt\n\t\tself._followlink = followlink\n\t\tself._rapiduploadonly = rapiduploadonly\n\t\tself._resumedl_revertcount = resumedl_revertcount\n\t\tself._deletesource = deletesource\n\t\tif deletesource:\n\t\t\tself.pd(\"Forcing verification since we will delete source for successful transfers.\")\n\t\t\tself._verify = True\n\t\tself.processes = processes\n\n\t\t# in case of abortions, exceptions, etc\n\t\tatexit.register(self.cleanup)\n\n\t\t#TODO: SSL verification causes some much trouble for different Python version\n\t\t# I give up and disable it for good, or for bad\n\t\tcheckssl = False\n\t\t# set SSL Check flag before mirror configuration, which may change it\n\t\tself._checkssl = checkssl\n\t\t# --mirror takes precedence over --select-fastest-mirror\n\t\tmirror = mirror.lower()\n\t\tif len(mirror) > 0 and mirror != const.PcsDomain:\n\t\t\tself.setpcsurl(mirror)\n\t\telif selectmirror:\n\t\t\tself._select_fastest_mirror()\n\t\t# else: already set in global\n\n\t\tif self._checkssl:\n\t\t\t# sort of undocumented by requests\n\t\t\t# http://stackoverflow.com/questions/10667960/python-requests-throwing-up-sslerror\n\t\t\tif cacerts is not None:\n\t\t\t\tif os.path.isfile(cacerts):\n\t\t\t\t\tself._certspath = cacerts\n\t\t\t\telse:\n\t\t\t\t\tperr(\"Invalid CA Bundle '{}' specified\")\n\n\t\t\t# falling through here means no customized CA Certs specified\n\t\t\tif self._checkssl is True:\n\t\t\t\t# use our own CA Bundle if possible\n\t\t\t\tif os.path.isfile(self._certspath):\n\t\t\t\t\tself._checkssl = self._certspath\n\t\t\t\telse:\n\t\t\t\t\t# Well, disable cert verification\n\t\t\t\t\tpwarn(\n\"** SSL Certificate Verification has been disabled **\\n\\n\"\n\"If you are confident that your CA Bundle can verify \"\n\"Baidu PCS's certs, you can run the prog with the '\" + const.CaCertsOption + \\\n\" <your ca cert path>' argument to enable SSL cert verification.\\n\\n\"\n\"However, most of the time, you can ignore this warning, \"\n\"you are not going to send sensitive data to the cloud plainly right?\")\n\t\t\t\t\tself._checkssl = False\n\t\tif not checkssl:\n\t\t\trequester.disable_warnings(self.debug)\n\n\t\tcached.loadcache()\n\t\trequester.set_logging_level(debug)\n\t\t# useful info for debugging\n\t\tif debug > 0:\n\t\t\tpr(\"----\")\n\t\t\tpr(\"Verbose level = {}\".format(verbose))\n\t\t\tpr(\"Debug level = {}\".format(debug))\n\t\t\t# these informations are useful for debugging\n\t\t\tpr(\"Config directory: '{}'\".format(self._configdir))\n\t\t\tpr(\"Token file: '{}'\".format(self._tokenpath))\n\t\t\tpr(\"Hash Cache file: '{}'\".format(self._hashcachepath))\n\t\t\tpr(\"App root path at Baidu Yun '{}'\".format(const.AppPcsPath))\n\t\t\tpr(\"sys.stdin.encoding = {}\".format(sys.stdin.encoding))\n\t\t\tpr(\"sys.stdout.encoding = {}\".format(sys.stdout.encoding))\n\t\t\tpr(\"sys.stderr.encoding = {}\".format(sys.stderr.encoding))\n\t\t\tpr(\"----\\n\")\n\n\t\t# the prophet said: thou shalt initialize\n\t\tself._existing_size = 0\n\t\tself._json = {}\n\t\tself._access_token = ''\n\t\tself._remote_json = {}\n\t\tself._slice_md5s = []\n\t\tself._cookies = {}\n\t\t# TODO: whether this works is still to be tried out\n\t\tself._isrev = False\n\t\tself._rapiduploaded = False\n\n\t\t# store the response object, mainly for testing.\n\t\tself.response = object()\n\t\t# store function-specific result data\n\t\tself.result = {}\n\n\t\tif not self._load_local_json():\n\t\t\t# no need to call _load_local_json() again as _auth() will load the json & acess token.\n\t\t\tresult = self._auth()\n\t\t\tif result != const.ENoError:\n\t\t\t\tperr(\"Program authorization FAILED.\\n\"\n\t\t\t\t\t\"You need to authorize this program before using any PCS functions.\\n\"\n\t\t\t\t\t\"Quitting...\\n\")\n\t\t\t\tsys.exit(result)\n\n\t\tfor proxy in ['HTTP_PROXY', 'HTTPS_PROXY']:\n\t\t\tif proxy in os.environ:\n\t\t\t\tpr(\"{} used: {}\".format(proxy, os.environ[proxy]))\n\n\t\t# update check\n\t\tcheck_update = False\n\t\tnowsec = int(time.time())\n\t\tif const.SettingKey_LastUpdateCheckTime not in self._setting:\n\t\t\tcheck_update = True\n\t\telse:\n\t\t\tlastcheck = self._setting[const.SettingKey_LastUpdateCheckTime]\n\t\t\tif nowsec - lastcheck > 7 * 24 * 60 * 60: # check every 7 days\n\t\t\t\tcheck_update = True\n\n\t\tif check_update:\n\t\t\ttry:\n\t\t\t\tr = requests.get('https://raw.githubusercontent.com/houtianze/bypy/master/update/update.json')\n\t\t\t\tif r.status_code == 200:\n\t\t\t\t\ttry:\n\t\t\t\t\t\tj = r.json()\n\t\t\t\t\t\tmin_ver_key = 'minimumRequiredVersion'\n\t\t\t\t\t\tif min_ver_key in j:\n\t\t\t\t\t\t\tminver = j[min_ver_key]\n\t\t\t\t\t\t\tif comp_semver(const.__version__, minver) < 0:\n\t\t\t\t\t\t\t\tperr(\"Your current version ({}) is too low, \"\n\t\t\t\t\t\t\t\t\t\"minimum required version is {}.\\n\"\n\t\t\t\t\t\t\t\t\t\"Please run 'pip install -U bypy' to update and try again.\".format(\n\t\t\t\t\t\t\t\t\t\tconst.__version__, minver))\n\t\t\t\t\t\t\t\tsys.exit(const.EUpdateNeeded)\n\t\t\t\t\t\t\telse:\n\t\t\t\t\t\t\t\tself._setting[const.SettingKey_LastUpdateCheckTime] = nowsec\n\t\t\t\t\t\t\t\tself.savesetting()\n\n\t\t\t\t\t\trecommended_ver_key = 'recommendedVersion'\n\t\t\t\t\t\tif recommended_ver_key in j:\n\t\t\t\t\t\t\trecver = j[recommended_ver_key]\n\t\t\t\t\t\t\tif comp_semver(const.__version__, recver) < 0:\n\t\t\t\t\t\t\t\tpr(\"Your current version ({}) is low, \"\n\t\t\t\t\t\t\t\t\t\"It's recommended to update to version {}.\\n\"\n\t\t\t\t\t\t\t\t\t\"Please run 'pip install -U bypy' to update.\".format(\n\t\t\t\t\t\t\t\t\t\tconst.__version__, recver))\n\t\t\t\t\texcept ValueError:\n\t\t\t\t\t\tself.pd(\"Invalid response for update check, skipping.\")\n\t\t\t\telse:\n\t\t\t\t\tself.pd(\"HTTP Status {} while checking update, skipping.\".format(r.status_code))\n\t\t\texcept:\n\t\t\t\tself.pd(\"Error occurred while checking update, skipping.\")\n\n\tdef pv(self, msg, **kwargs):\n\t\tif self.verbose:\n\t\t\tpr(msg)\n\n\tdef pd(self, msg, level = 1, **kwargs):\n\t\tif self.debug and self.debug >= level:\n\t\t\tpdbg(msg, kwargs)\n\n\tdef shalloverwrite(self, prompt):\n\t\tif self._ondup == 'S':\n\t\t\treturn False\n\t\telif self._ondup == 'P':\n\t\t\tans = ask(prompt, False).upper()\n\t\t\tif not ans.startswith('Y'):\n\t\t\t\treturn False\n\n\t\treturn True\n\n\tdef _warn_multi_processes(self, process = \"dl / ul\"):\n\t\tif process:\n\t\t\tpwarn(\"Running multiple ({}) processes for {}, I don't know if things will go awry...\".format(\n\t\t\t\tself.processes, process))\n\n\tdef _check_prompt_multiprocess(self):\n\t\tif self._ondup == 'P' and Pool and self.processes != 1:\n\t\t\terrmsg = \"Can't do parallel processing if you want to prompt the user for overwrite confirmation\"\n\t\t\tperr(errmsg)\n\t\t\treturn False\n\t\treturn True\n\n\tdef _filter_multi_results(self, results):\n\t\t# http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html#filter\n\t\terrors = list(filter(lambda x: x != const.ENoError, results))\n\t\treturn const.ENoError if len(errors) == 0 else errors[-1]\n\n\tdef _multi_process(self, worker, iterator, process = \"dl / ul\"):\n\t\tif not self._check_prompt_multiprocess():\n\t\t\treturn const.EArgument\n\t\tself._warn_multi_processes(process)\n\t\t# patch the printer\n\t\trestoremp = set_mp_print()\n\t\twith UPool(self.processes) as pool:\n\t\t\ttry:\n\t\t\t\t# http://stackoverflow.com/a/35134329/404271\n\t\t\t\t# On Python 2.x, Ctrl-C won't work if we use pool.map(), wait() or get()\n\t\t\t\tar = pool.map_async(worker, iterator)\n\t\t\t\t#results = ar.get(const.TenYearInSeconds)\n\t\t\t\tresults = ar.get(const.FortyNineDaysInSeconds)\n\t\t\t\trestoremp()\n\t\t\t\treturn self._filter_multi_results(results)\n\t\t\texcept pickle.PicklingError as pe:\n\t\t\t\terrmsg = (\"Exception:\\n{}\\n\"\n\t\t\t\t\t\t\"--------------------------------\\n\"\n\t\t\t\t\t\t\"Error: Your Python 'multiprocess' library is probably \"\n\t\t\t\t\t\t\"not properly installed (missing C extensions). \"\n\t\t\t\t\t\t\"You need to install a C compiler and Python headers before \"\n\t\t\t\t\t\t\"installing the Python 'multiprocess' library. \"\n\t\t\t\t\t\t\"(All these hassles could have been saved if Python's builtin \"\n\t\t\t\t\t\t\"'multiprocessing' works properly, sigh.)\\n\"\n\t\t\t\t\t\t\"Fix for debian derivatives:\\n\"\n\t\t\t\t\t\t\"- Install gcc: # apt-get install gcc\\n\"\n\t\t\t\t\t\t\"- Install python-dev: # apt-get install python-dev\\n\"\n\t\t\t\t\t\t\"- Reinstall Python 'multiprocess' library:\\n\"\n\t\t\t\t\t\t\"  # pip uninstall -y multiprocess\\n\"\n\t\t\t\t\t\t\"  # pip install -v multiprocess\\n\"\n\t\t\t\t\t\t\"- If there's no errors/warnings in the above actions, \"\n\t\t\t\t\t\t\"then this error should be gone when you run 'bypy' with '{}' again.\\n\"\n\t\t\t\t\t\t).format(formatex(pe), const.MultiprocessOption)\n\t\t\t\tperr(errmsg)\n\t\t\t\tsys.exit(const.EFatal)\n\n\tdef _print_error_json(self, r):\n\t\ttry:\n\t\t\tdj = r.json()\n\t\t\tif 'error_code' in dj and 'error_msg' in dj:\n\t\t\t\tec = dj['error_code']\n\t\t\t\tet = dj['error_msg']\n\t\t\t\tmsg = ''\n\t\t\t\tif ec == const.IEMD5NotFound:\n\t\t\t\t\tpf = pinfo\n\t\t\t\t\tmsg = et\n\t\t\t\telse:\n\t\t\t\t\tpf = perr\n\t\t\t\t\tmsg = \"Error JSON returned:{}\\nError code: {}\\nError Description: {}\".format(dj, ec, et)\n\t\t\t\tpf(msg)\n\t\texcept Exception as ex:\n\t\t\tperr('Error parsing JSON Error Code from:\\n{}\\n{}'.format(rb(r.text), formatex(ex)))\n\n\tdef _dump_exception(self, ex, url, pars, r, act):\n\t\tif self.debug or self.verbose:\n\t\t\tperr(\"Error accessing '{}'\".format(url))\n\t\t\tif self.debug:\n\t\t\t\tperr(formatex(ex))\n\t\t\tperr(\"Function: {}\".format(act.__name__))\n\t\t\tperr(\"Website parameters: {}\".format(pars))\n\t\t\tif r != None:\n\t\t\t\t# just playing it safe\n\t\t\t\tif hasattr(r, 'url'):\n\t\t\t\t\tperr(\"Full URL: {}\".format(r.url))\n\t\t\t\tif hasattr(r, 'status_code') and hasattr(r, 'text'):\n\t\t\t\t\tperr(\"HTTP Response Status Code: {}\".format(r.status_code))\n\t\t\t\t\tif (r.status_code != 200 and r.status_code != 206) \\\n\t\t\t\t\t\tor (not ('method' in pars and pars['method'] == 'download') \\\n\t\t\t\t\t\t\tand url.find('method=download') == -1 \\\n\t\t\t\t\t\t\tand url.find('baidupcs.com/file/') == -1):\n\t\t\t\t\t\tself._print_error_json(r)\n\t\t\t\t\t\tperr(\"Website returned: {}\".format(rb(r.text)))\n\n\t# child class override this to to customize error handling\n\tdef _handle_more_response_error(self, r, sc, ec, act, actargs):\n\t\treturn const.ERequestFailed\n\n\t# Workaround for Baidu returning wrong HTTP status code\n\t# Who in one's right mind would send error with an HTTP 200 status?\n\t# <D> HTTP Status Code: 200\n\t# <D> 200 OK, processing action\n\t# <D> Response: {'error_code': 111, 'error_msg': 'Access token expired'}\n\tdef _is_error_response(self, r):\n\t\t# don't attempt on large contents\n\t\tisJson = False\n\t\tContentTypeKey = 'Content-Type'\n\t\tcontentType = r.headers.get(ContentTypeKey)\n\t\tif (contentType and 'json' in contentType):\n\t\t\tisJson = True\n\n\t\tif len(r.content) > 10 * 1024 or not isJson:\n\t\t\treturn False\n\t\ttry:\n\t\t\tj = r.json()\n\t\t\tif 'error_code' in j and j['error_code'] != 0:\n\t\t\t\treturn True\n\t\texcept ValueError:\n\t\t\treturn False\n\t\treturn False\n\n\tdef _get_json_errorcode(self, r, act, defaultec = const.ERequestFailed):\n\t\ttry:\n\t\t\tj = r.json()\n\t\t\tself.pd(\"Website returned JSON: {}\".format(j))\n\t\t\tif 'error_code' in j:\n\t\t\t\treturn j['error_code']\n\t\t\telse:\n\t\t\t\treturn defaultec\n\t\texcept ValueError:\n\t\t\tif hasattr(r, 'text'):\n\t\t\t\tself.pd(\"Website Response: {}\".format(rb(r.text)))\n\t\t\tif act == self._cdl_act:\n\t\t\t\treturn const.IETaskNotFound\n\t\t\treturn defaultec\n\n\tdef _request_work_die(self, ex, url, pars, r, act):\n\t\tresult = const.EFatal\n\t\tself._dump_exception(ex, url, pars, r, act)\n\t\tperr(\"Fatal Exception, no way to continue.\\nQuitting...\\n\")\n\t\tperr(\"If the error is reproducible, run the program with `-dv` arguments again to get more info.\\n\")\n\t\tsys.exit(result)\n\t\t# we eat the exception, and use return code as the only\n\t\t# error notification method, we don't want to mix them two\n\t\t#raise # must notify the caller about the failure\n\n\tdef _request_work(self, url, pars, act, method, actargs = None, addtoken = True, dumpex = True, **kwargs):\n\t\tresult = const.ENoError\n\t\tr = None\n\n\t\tself._extraupdate()\n\t\tparsnew = pars.copy()\n\t\tif addtoken:\n\t\t\tparsnew['access_token'] = self._access_token\n\n\t\ttry:\n\t\t\tself.pd(method + ' ' + url)\n\t\t\tself.pd(\"actargs: {}\".format(actargs))\n\t\t\tself.pd(\"Params: {}\".format(pars))\n\n\t\t\tr = self._requester.request(method, url, params = parsnew, timeout = self._timeout, verify = self._checkssl, **kwargs)\n\t\t\tself.response = r\n\t\t\tsc = r.status_code\n\t\t\tself.pd(\"Full URL: {}\".format(r.url))\n\t\t\tself.pd(\"HTTP Status Code: {}\".format(sc))\n\t\t\t# BUGFIX: DON'T do this, if we are downloading a big file,\n\t\t\t# the program will eat A LOT of memeory and potentially hang / get killed\n\t\t\t#self.pd(\"Request Headers: {}\".format(pprint.pformat(r.request.headers)), 2)\n\t\t\t#self.pd(\"Response Header: {}\".format(pprint.pformat(r.headers)), 2)\n\t\t\t#self.pd(\"Response: {}\".format(rb(r.text)), 3)\n\t\t\t# 206 Partial Content\n\t\t\tif (sc == requests.codes.ok or sc == 206) and not self._is_error_response(r):\n\t\t\t\tif sc == requests.codes.ok:\n\t\t\t\t\t# #162 https://github.com/houtianze/bypy/pull/162\n\t\t\t\t\t# handle response like this:  {\"error_code\":0,\"error_msg\":\"no error\",\"request_id\":70768340515255385}\n\t\t\t\t\tif not ('method' in pars and pars['method'] == 'download'):\n\t\t\t\t\t\ttry:\n\t\t\t\t\t\t\tj = r.json()\n\t\t\t\t\t\t\tif 'error_code' in j and j['error_code'] == 0 and 'error_msg' in j and j['error_msg'] == 'no error':\n\t\t\t\t\t\t\t\tself.pd(\"Unexpected response: {}\".format(j))\n\t\t\t\t\t\t\t\treturn const.ERequestFailed\n\t\t\t\t\t\texcept Exception as ex:\n\t\t\t\t\t\t\tperr(formatex(ex))\n\t\t\t\t\t\t\t# TODO: Shall i return this?\n\t\t\t\t\t\t\treturn const.ERequestFailed\n\n\t\t\t\t\tself.pd(\"200 OK, processing action\")\n\t\t\t\telse:\n\t\t\t\t\tself.pd(\"206 Partial Content (this is OK), processing action\")\n\t\t\t\tresult = act(r, actargs)\n\t\t\t\tif result == const.ENoError:\n\t\t\t\t\tself.pd(\"Request OK\")\n\t\t\telse:\n\t\t\t\tec = self._get_json_errorcode(r, act)\n\t\t\t\t#   6 (sc: 403): No permission to access user data\n\t\t\t\t# 110 (sc: 401): Access token invalid or no longer valid\n\t\t\t\t# 111 (sc: 401): Access token expired\n\t\t\t\tif ec == 111 or ec == 110 or ec == 6 or ec == const.IEAppIDIsEmpty: # and sc == 401:\n\t\t\t\t\tself.pd(\"ec = {}\".format(ec))\n\t\t\t\t\tself.pd(\"Need to refresh token, refreshing\")\n\t\t\t\t\tif const.ENoError == self._refresh_token(): # refresh the token and re-request\n\t\t\t\t\t\t# TODO: avoid infinite recursive loops\n\t\t\t\t\t\t# TODO: properly pass retry\n\t\t\t\t\t\tresult = self._request(url, pars, act, method, actargs, True, addtoken, dumpex, **kwargs)\n\t\t\t\t\telse:\n\t\t\t\t\t\tresult = const.EFatal\n\t\t\t\t\t\tperr(\"FATAL: Token refreshing failed, can't continue.\\nQuitting...\\n\")\n\t\t\t\t\t\tsys.exit(result)\n\t\t\t\t# File md5 not found, you should use upload API to upload the whole file.\n\t\t\t\telif ec == const.IEMD5NotFound: # and sc == 404:\n\t\t\t\t\tself.pd(\"MD5 not found, rapidupload failed\")\n\t\t\t\t\tresult = ec\n\t\t\t\t# superfile create failed\n\t\t\t\telif ec == const.IESuperfileCreationFailed \\\n\t\t\t\t\tor ec == const.IEBlockMissInSuperFile2:\n\t\t\t\t\tself.pd(\"Failed to combine files from MD5 slices\")\n\t\t\t\t\tresult = ec\n\t\t\t\telif ec == const.IEFileAlreadyExists: # ec == 31061, sc == 400, file already exists\n\t\t\t\t\t# explanations:\n\t\t\t\t\t# this error occurs when we try to create a directory at Baidu PCS when it already exists,\n\t\t\t\t\t# this almost only happens when we upload using multi-process (double/multiple-directory creation).\n\t\t\t\t\t# this error is innocuous, we can safely ignore it\n\t\t\t\t\t# (actually, we don't need to do anything further and should just continue as usual).\n\t\t\t\t\t# so to avoid confusions to the user and potential logic errors (more importantly) in the future,\n\t\t\t\t\t# we just \"lie\" and force it to \"no error\".\n\t\t\t\t\t# though this is not 100% accurate technically, i feel it's accurate enough for the users\n\t\t\t\t\tself.pd(\"Faking error_code {} to {}, this is safe to ignore.\".format(\n\t\t\t\t\t\tconst.IEFileAlreadyExists, const.ENoError))\n\t\t\t\t\tresult = const.ENoError\n\t\t\t\t# errors that make retrying meaningless\n\t\t\t\telif (\n\t\t\t\t\tec == 31062 or # sc == 400 file name is invalid\n\t\t\t\t\tec == 31063 or # sc == 400 file parent path does not exist\n\t\t\t\t\tec == 31064 or # sc == 403 file is not authorized\n\t\t\t\t\tec == 31065 or # sc == 400 directory is full\n\t\t\t\t\tec == 31066 or # sc == 403 (indeed 404) file does not exist\n\t\t\t\t\tec == const.IETaskNotFound or # 36016 or # sc == 404 Task was not found\n\t\t\t\t\tec == const.IEParameterError or # sc == 400 param error\n\t\t\t\t\t# the following was found by xslidian, but i have never ecountered before\n\t\t\t\t\tec == 31390):  # sc == 404 # {\"error_code\":31390,\"error_msg\":\"Illegal File\"} # r.url.find('http://bcscdn.baidu.com/bcs-cdn/wenxintishi') == 0\n\t\t\t\t\tresult = ec\n\t\t\t\t\t# TODO: Move this out to cdl_cancel() ?\n\t\t\t\t\t#if ec == const.IETaskNotFound:\n\t\t\t\t\t#\tpr(r.json())\n\t\t\t\t\tif dumpex:\n\t\t\t\t\t\tself._dump_exception(None, url, pars, r, act)\n\t\t\t\telse:\n\t\t\t\t\t# gate for child classes to customize behaviors\n\t\t\t\t\t# the function should return ERequestFailed if it doesn't handle the case\n\t\t\t\t\tresult = self._handle_more_response_error(r, sc, ec, act, actargs)\n\t\t\t\t\tif result == const.ERequestFailed and dumpex:\n\t\t\t\t\t\tself._dump_exception(None, url, pars, r, act)\n\t\texcept (requests.exceptions.RequestException,\n\t\t\t\tsocket.error,\n\t\t\t\tReadTimeoutError) as ex:\n\t\t\t# If certificate check failed, no need to continue\n\t\t\t# but prompt the user for work-around and quit\n\t\t\t# why so kludge? because requests' SSLError doesn't set\n\t\t\t# the errno and strerror due to using **kwargs,\n\t\t\t# so we are forced to use string matching\n\t\t\tif isinstance(ex, requests.exceptions.SSLError) \\\n\t\t\t\tand re.match(r'^\\[Errno 1\\].*error:14090086.*:certificate verify failed$', str(ex), re.I):\n\t\t\t\t# [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed\n\t\t\t\tresult = const.EFatal\n\t\t\t\tself._dump_exception(ex, url, pars, r, act)\n\t\t\t\tperr(\"\\n\\n== Baidu's Certificate Verification Failure ==\\n\"\n\t\t\t\t\"We couldn't verify Baidu's SSL Certificate.\\n\"\n\t\t\t\t\"It's most likely that the system doesn't have \"\n\t\t\t\t\"the corresponding CA certificate installed.\\n\"\n\t\t\t\t\"There are two ways of solving this:\\n\"\n\t\t\t\t\"Either) Run this prog with the '\" + const.CaCertsOption + \\\n\t\t\t\t\" <path to \" + const.ByPyCertsFileName + \"> argument \"\n\t\t\t\t\"(\" + const.ByPyCertsFileName + \" comes along with this prog). \"\n\t\t\t\t\"This is the secure way. \"\n\t\t\t\t\"However, it won't work after 2020-02-08 when \"\n\t\t\t\t\"the certificat expires.\\n\"\n\t\t\t\t\"Or) Run this prog with the '\" + const.DisableSslCheckOption + \\\n\t\t\t\t\"' argument. This supresses the CA cert check \"\n\t\t\t\t\"and always works.\\n\")\n\t\t\t\t# sys.exit(result)\n\t\t\t\traise\n\n\t\t\t# why so kludge? because requests' SSLError doesn't set\n\t\t\t# the errno and strerror due to using **kwargs,\n\t\t\t# so we are forced to use string matching\n\t\t\tif isinstance(ex, requests.exceptions.SSLError) \\\n\t\t\t\tand re.match(r'^\\[Errno 1\\].*error:14090086.*:certificate verify failed$', str(ex), re.I):\n\t\t\t\t# [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed\n\t\t\t\tperr(\"\\n*** We probably don't have Baidu's CA Certificate ***\\n\" \\\n\t\t\t\t\"This in fact doesn't matter most of the time.\\n\\n\" \\\n\t\t\t\t\"However, if you are _really_ concern about it, you can:\\n\" \\\n\t\t\t\t\"Either) Run this prog with the '\" + const.CaCertsOption + \\\n\t\t\t\t\" <path to bypy.cacerts.pem>' \" \\\n\t\t\t\t\"argument. This is the secure way.\\n\" \\\n\t\t\t\t\"Or) Run this prog with the '\" + const.DisableSslCheckOption + \\\n\t\t\t\t\"' argument. This suppresses the CA cert check.\\n\")\n\n\t\t\tresult = const.ERequestFailed\n\t\t\tif dumpex:\n\t\t\t\tself._dump_exception(ex, url, pars, r, act)\n\n\t\t# TODO: put this check into the specific funcitons?\n\t\texcept ValueError as ex:\n\t\t\tif ex.message == 'No JSON object could be decoded':\n\t\t\t\tresult = const.ERequestFailed\n\t\t\t\tif dumpex:\n\t\t\t\t\tself._dump_exception(ex, url, pars, r, act)\n\t\t\telse:\n\t\t\t\tresult = const.EFatal\n\t\t\t\t# self._request_work_die(ex, url, pars, r, act)\n\t\t\t\traise\n\n\t\texcept Exception as ex:\n\t\t\t# OpenSSL SysCallError\n\t\t\tif ex.args == (10054, 'WSAECONNRESET') \\\n\t\t\tor ex.args == (10053, 'WSAECONNABORTED') \\\n\t\t\tor ex.args == (104, 'ECONNRESET') \\\n\t\t\tor ex.args == (110, 'ETIMEDOUT') \\\n\t\t\tor ex.args == (32, 'EPIPE'):\n\t\t\t\tresult = const.ERequestFailed\n\t\t\t\tif dumpex:\n\t\t\t\t\tself._dump_exception(ex, url, pars, r, act)\n\t\t\telse:\n\t\t\t\tresult = const.EFatal\n\t\t\t\t# self._request_work_die(ex, url, pars, r, act)\n\t\t\t\traise\n\n\t\treturn result\n\n\tdef _request(self, url, pars, act, method, actargs = None, retry = True, addtoken = True, dumpex = True, **kwargs):\n\t\ttries = 1\n\t\tif retry:\n\t\t\ttries = self._retry\n\n\t\tresult = const.ERequestFailed\n\n\t\t# Change the User-Agent to avoid server fuss\n\t\tkwnew = kwargs.copy()\n\t\tif 'headers' not in kwnew:\n\t\t\tkwnew['headers'] = { 'User-Agent': const.UserAgent }\n\n\t\t# Now, allow User-Agent to be set in the caller, instead of always using the default UserAgent value.\n\t\tif 'User-Agent' not in kwnew['headers']:\n\t\t\tkwnew['headers']['User-Agent'] = const.UserAgent\n\n\t\ti = 0\n\t\twhile True:\n\t\t\tresult = self._request_work(url, pars, act, method, actargs, addtoken, dumpex, **kwnew)\n\t\t\ti += 1\n\t\t\t# only ERequestFailed needs retry, other error still directly return\n\t\t\tif result == const.ERequestFailed:\n\t\t\t\tif i < tries:\n\t\t\t\t\t# algo changed: delay more after each failure\n\t\t\t\t\tdelay = const.RetryDelayInSec * i\n\t\t\t\t\tperr(\"Waiting {} seconds before retrying...\".format(delay))\n\t\t\t\t\ttime.sleep(delay)\n\t\t\t\t\tperr(\"Request Try #{} / {}\".format(i + 1, tries))\n\t\t\t\telse:\n\t\t\t\t\tresult = const.EMaxRetry\n\t\t\t\t\tperr(\"Maximum number ({}) of tries failed.\".format(tries))\n\t\t\t\t\tif self._quit_when_fail:\n\t\t\t\t\t\tsys.exit(const.EMaxRetry)\n\t\t\t\t\tbreak\n\t\t\telse:\n\t\t\t\tbreak\n\n\t\treturn result\n\n\tdef _get(self, url, pars, act, actargs = None, retry = True, addtoken = True, dumpex = True, **kwargs):\n\t\treturn self._request(url, pars, act, 'GET', actargs, retry, addtoken, dumpex, **kwargs)\n\n\tdef _post(self, url, pars, act, actargs = None, retry = True, addtoken = True, dumpex = True, **kwargs):\n\t\treturn self._request(url, pars, act, 'POST', actargs, retry, addtoken, dumpex, **kwargs)\n\n\t# direction: True - upload, False - download\n\tdef _shallinclude(self, lpath, rpath, direction):\n\t\tarrow = '==>' if direction else '<=='\n\t\tcheckpath = lpath if direction else rpath\n\t\t# TODO: bad practice, see os.access() document for more info\n\t\tif direction: # upload\n\t\t\tif not os.path.exists(lpath):\n\t\t\t\tperr(\"'{}' {} '{}' skipped since local path no longer exists\".format(\n\t\t\t\t\tlpath, arrow, rpath))\n\t\t\t\treturn False\n\t\telse: # download\n\t\t\tif os.path.exists(lpath) and (not os.access(lpath, os.R_OK)):\n\t\t\t\tperr(\"'{}' {} '{}' skipped due to permission\".format(\n\t\t\t\t\tlpath, arrow, rpath))\n\t\t\t\treturn False\n\n\t\tif '\\\\' in os.path.basename(checkpath):\n\t\t\tperr(\"'{}' {} '{}' skipped due to problemic '\\\\' in the path\".format(\n\t\t\t\tlpath, arrow, rpath))\n\t\t\treturn False\n\n\t\tinclude = (not self._incregex) or self._incregmo.match(checkpath)\n\t\tif not include:\n\t\t\tself.pv(\"'{}' {} '{}' skipped as it's not included in the regex pattern\".format(\n\t\t\t\tlpath, arrow, rpath))\n\n\t\treturn include\n\n\tListFormatDict = {\n\t\t'$t' : (lambda json: ls_type(json['isdir'])),\n\t\t'$f' : (lambda json: json['path'].split('/')[-1]),\n\t\t'$c' : (lambda json: ls_time(json['ctime'])),\n\t\t'$m' : (lambda json: ls_time(json['mtime'])),\n\t\t'$d' : (lambda json: str(json['md5'] if 'md5' in json else '')),\n\t\t'$s' : (lambda json: str(json['size'])),\n\t\t'$i' : (lambda json: str(json['fs_id'])),\n\t\t'$b' : (lambda json: str(json['block_list'] if 'block_list' in json else '')),\n\t\t'$u' : (lambda json: 'HasSubDir' if 'ifhassubdir' in json and json['ifhassubdir'] else 'NoSubDir'),\n\t}\n\n\tdef _replace_list_format(self, fmt, j):\n\t\toutput = fmt\n\t\tfor k, v in ByPy.ListFormatDict.items():\n\t\t\toutput = output.replace(k, v(j))\n\t\tself.file_list.append(output)\n\t\treturn output\n\n\tdef _load_local_json(self):\n\t\ttry:\n\t\t\tself._json = jsonload(self._tokenpath)\n\t\t\tself._access_token = self._json['access_token']\n\t\t\tself.pd(\"Token loaded:\")\n\t\t\tself.pd(self._json)\n\t\t\treturn True\n\t\texcept Exception as ex:\n\t\t\tself.pd(\"Error while loading baidu pcs token.\\n{}\".format(formatex(ex)))\n\t\t\treturn False\n\n\tdef _store_json_only(self, j):\n\t\tself._json = j\n\t\tself._access_token = self._json['access_token']\n\t\tself.pd(\"access token: \" + self._access_token)\n\t\tself.pd(\"Authorize JSON:\")\n\t\tself.pd(self._json)\n\t\ttokenmode = 0o600\n\t\ttry:\n\t\t\tjsondump(self._json, self._tokenpath, mpsemaphore)\n\t\t\tos.chmod(self._tokenpath, tokenmode)\n\t\t\treturn const.ENoError\n\t\texcept Exception as ex:\n\t\t\tperr(\"Exception occured while trying to store access token:\\n{}\".format(\n\t\t\t\tformatex(ex)))\n\t\t\treturn const.EFileWrite\n\n\tdef _prompt_clean(self):\n\t\tpinfo('-' * 64)\n\t\tpinfo(\"\"\"This is most likely caused by authorization errors.\nPossible causes:\n - You didn't run this program for a long time (more than a month).\n - You changed your Baidu password after authorizing this program.\n - You didn't give this program the 'netdisk' access while authorizing.\n - ...\nPossible fixes:\n 1. Remove the authorization token by running with the parameter '{}', and then re-run this program.\n 2. If (1) still doesn't solve the problem, you may have to go to:\n    https://passport.baidu.com/accountbind\n    and remove the authorization of this program, and then re-run this program.\"\"\".format(const.CleanOptionShort))\n\t\treturn const.EInvalidJson\n\n\tdef _store_json(self, r):\n\t\tj = {}\n\t\ttry:\n\t\t\tj = r.json()\n\t\texcept Exception as ex:\n\t\t\tperr(\"Failed to decode JSON:\\n{}\".format(formatex(ex)))\n\t\t\tperr(\"Error response:\\n{}\".format(r.text))\n\t\t\treturn self._prompt_clean()\n\n\t\tif 'access_token' not in j:\n\t\t\tperr(\"Invalid token JSON:\\n{}\".format(j))\n\t\t\treturn const.EInvalidJson\n\t\treturn self._store_json_only(j)\n\n\tdef _server_auth_act(self, r, args):\n\t\treturn self._store_json(r)\n\n\tdef _local_auth_act(self, r, args):\n\t\treturn self._store_json(r)\n\n\tdef _repr_timeout(self):\n\t\treturn self._timeout if self._timeout else 'infinite'\n\n\tdef _load_auth_server_list(self):\n\t\t# https://stackoverflow.com/a/58941536/404271\n\t\timport pkgutil\n\t\tj = json.loads(pkgutil.get_data(__name__, 'res/auth.json'))\n\t\tself.pd('Auth servers loaded: {}'.format(j))\n\t\tself.AuthServerList = j['AuthServerList']\n\t\tself.RefreshServerList = j['RefreshServerList']\n\n\tdef _update_auth_server_list(self):\n\t\ttry:\n\t\t\tr = requests.get('https://raw.githubusercontent.com/houtianze/bypy/master/bypy/res/auth.json')\n\t\t\tif r.status_code == 200:\n\t\t\t\ttry:\n\t\t\t\t\tj = r.json()\n\t\t\t\t\tself.pd('Auth servers updated: {}'.format(j))\n\t\t\t\t\tself.AuthServerList = j['AuthServerList']\n\t\t\t\t\tself.RefreshServerList = j['RefreshServerList']\n\t\t\t\texcept ValueError:\n\t\t\t\t\tself.pd(\"Invalid response for auth servers update, skipping.\")\n\t\t\telse:\n\t\t\t\tself.pd(\"HTTP Status {} while updating auth servers, skipping.\".format(r.status_code))\n\t\texcept:\n\t\t\tself.pd(\"Error occurred while updating auth servers, skipping.\")\n\n\tdef _auth(self):\n\t\tparams = {\n\t\t\t'client_id' : self._apikey,\n\t\t\t'response_type' : 'code',\n\t\t\t'redirect_uri' : 'oob',\n\t\t\t'scope' : 'basic netdisk' }\n\t\tpars = ulp.urlencode(params)\n\t\tmsg = 'Please visit:\\n{}\\nAnd authorize this app'.format(const.ServerAuthUrl + '?' + pars) + \\\n\t\t\t'\\nPaste the Authorization Code here within 10 minutes.'\n\t\tauth_code = ''\n\t\twhile True:\n\t\t\tauth_code = ask(msg).strip()\n\t\t\tif auth_code and len(auth_code) >= 16: # 16 is just random lower bound\n\t\t\t\tbreak\n\t\tself.pd(\"auth_code: {}\".format(auth_code))\n\t\tpr('Authorizing, please be patient, it may take upto {} seconds...'.format(self._repr_timeout()))\n\n\t\tif self._use_server_auth:\n\t\t\tpars = {\n\t\t\t\t'code' : auth_code,\n\t\t\t\t'bypy_version' : const.__version__,\n\t\t\t\t'redirect_uri' : 'oob' }\n\n\t\t\tresult = None\n\t\t\t# TODO: hacky\n\t\t\tglobal perr\n\t\t\tsavedperr = perr\n\t\t\tif not self.debug:\n\t\t\t\tperr = nop\n\n\t\t\tself._update_auth_server_list()\n\t\t\tfor auth in self.AuthServerList:\n\t\t\t\t(url, retry, msg) = auth\n\t\t\t\tpr(msg)\n\t\t\t\tresult = self._get(url, pars, self._server_auth_act, retry = retry, addtoken = False)\n\t\t\t\tif result == const.ENoError:\n\t\t\t\t\tbreak\n\t\t\tif not self.debug:\n\t\t\t\tperr = savedperr\n\n\t\t\tif result == const.ENoError:\n\t\t\t\tpr(\"Successfully authorized\")\n\t\t\telse:\n\t\t\t\tperr(\"Fatal: All server authorizations failed.\")\n\t\t\t\tself._prompt_clean()\n\t\t\t\tsys.exit(result)\n\t\telse:\n\t\t\tpars = {\n\t\t\t\t'grant_type' : 'authorization_code',\n\t\t\t\t'code' : auth_code,\n\t\t\t\t'client_id' : self._apikey,\n\t\t\t\t'client_secret' : self._secretkey,\n\t\t\t\t'redirect_uri' : 'oob'\n\t\t\t}\n\t\t\tresult = self._post(const.TokenUrl, pars, self._local_auth_act, addtoken = False)\n\n\t\treturn result\n\n\tdef _device_auth_act(self, r, args):\n\t\tdj = r.json()\n\t\tself.pd('device response: {}'.format(dj))\n\t\treturn self._get_token(dj)\n\n\tdef _device_auth(self):\n\t\tpars = {\n\t\t\t'client_id' : self._apikey,\n\t\t\t'response_type' : 'device_code',\n\t\t\t'scope' : 'basic netdisk'}\n\t\treturn self._get(const.DeviceAuthUrl, pars, self._device_auth_act, addtoken = False)\n\n\tdef _get_token_act(self, r, args):\n\t\treturn self._store_json(r)\n\n\tdef _get_token(self, deviceJson):\n\t\t# msg = \"Please visit:{}\\n\" + deviceJson['verification_url'] + \\\n\t\t# \t  \"\\nwithin \" + str(deviceJson['expires_in']) + \" seconds\\n\"\n\t\t# \"Input the CODE: {}\\n\".format(deviceJson['user_code'])\" + \\\n\t\t# \t\"and Authorize this little app.\\n\"\n\t\tmsg = \"Please visit:\\n{}\\nwithin {} seconds\\n\" \\\n\t\t\t\"Input the CODE: {}\\n\" \\\n\t\t\t\"and Authorize this little app.\\n\".format(\n\t\t\t\tdeviceJson['verification_url'],\n\t\t\t\tstr(deviceJson['expires_in']),\n\t\t\t\tdeviceJson['user_code'])\n\t\task(msg)\n\n\t\tpars = {\n\t\t\t'grant_type' : 'device_token',\n\t\t\t'code' :  deviceJson['device_code'],\n\t\t\t'client_id' : self._apikey,\n\t\t\t'client_secret' : self._secretkey}\n\n\t\treturn self._get(const.TokenUrl, pars, self._get_token_act, addtoken = False)\n\n\tdef _refresh_token_act(self, r, args):\n\t\treturn self._store_json(r)\n\n\tdef _refresh_token(self):\n\t\tif self._use_server_auth:\n\t\t\tpr('Refreshing, please be patient, it may take upto {} seconds...'.format(self._repr_timeout()))\n\n\t\t\tpars = {\n\t\t\t\t'bypy_version' : const.__version__,\n\t\t\t\t'refresh_token' : self._json['refresh_token'] }\n\n\t\t\tresult = None\n\t\t\t# TODO: hacky\n\t\t\tglobal perr\n\t\t\tsavedperr = perr\n\t\t\tif not self.debug:\n\t\t\t\tperr = nop\n\t\t\tself._update_auth_server_list()\n\t\t\tfor refresh in self.RefreshServerList:\n\t\t\t\t(url, retry, msg) = refresh\n\t\t\t\tpr(msg)\n\t\t\t\tresult = self._get(url, pars, self._refresh_token_act, retry = retry, addtoken = False)\n\t\t\t\tif result == const.ENoError:\n\t\t\t\t\tbreak\n\t\t\tif not self.debug:\n\t\t\t\tperr = savedperr\n\n\t\t\tif result == const.ENoError:\n\t\t\t\tpr(\"Token successfully refreshed\")\n\t\t\telse:\n\t\t\t\tperr(\"Token-refreshing on all the servers failed\")\n\t\t\t\tself._prompt_clean()\n\t\t\t\tsys.exit(result)\n\n\t\t\treturn result\n\t\telse:\n\t\t\tpars = {\n\t\t\t\t'grant_type' : 'refresh_token',\n\t\t\t\t'refresh_token' : self._json['refresh_token'],\n\t\t\t\t'client_secret' : self._secretkey,\n\t\t\t\t'client_id' : self._apikey}\n\t\t\treturn self._post(const.TokenUrl, pars, self._refresh_token_act)\n\n\tdef _walk_normal_file(self, dir):\n\t\t#dirb = dir.encode(FileSystemEncoding)\n\t\tfor walk in os.walk(dir, followlinks=self._followlink):\n\t\t\tnormalfiles = [t for t in walk[-1]\n\t\t\t\t\t\t\t\tif os.path.isfile(os.path.join(walk[0], t))]\n\t\t\tnormalfiles.sort()\n\t\t\tnormalwalk = walk[:-1] + (normalfiles,)\n\t\t\tyield normalwalk\n\n\tdef _quota_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tpr('Quota: ' + human_size(j['quota']))\n\t\tpr('Used: ' + human_size(j['used']))\n\t\treturn const.ENoError\n\n\t@staticmethod\n\tdef help(command): # this comes first to make it easy to spot\n\t\t''' Usage: help <command> - provide some information for the command '''\n\t\tfor i, v in ByPy.__dict__.items():\n\t\t\tif callable(v) and v.__doc__ and v.__name__ == command :\n\t\t\t\thelp = v.__doc__.strip()\n\t\t\t\tpos = help.find(const.HelpMarker)\n\t\t\t\tif pos != -1:\n\t\t\t\t\tpr(\"Usage: \" + help[pos + len(const.HelpMarker):].strip())\n\n\tdef refreshtoken(self):\n\t\t''' Usage: refreshtoken - refresh the access token '''\n\t\treturn self._refresh_token()\n\n\tdef _remove_remote_on_success(self, remotepath):\n\t\tif self._deletesource:\n\t\t\tself.pd(\"Removing remote path '{}' after successful download.\".format(remotepath))\n\t\t\tresult = self._delete(remotepath)\n\t\t\tif result == const.ENoError:\n\t\t\t\tself.pd(\"Remote path '{}' removed.\".format(remotepath))\n\t\t\telse:\n\t\t\t\tperr(\"Failed to remove remote path '{}'.\".format(remotepath))\n\t\t\treturn result\n\n\tdef _remove_local_on_success(self, localpath):\n\t\tif self._deletesource:\n\t\t\tself.pd(\"Removing local path '{}' after successful upload.\".format(localpath))\n\t\t\tresult = cached.remove_path_and_cache(localpath)\n\t\t\tif result == const.ENoError:\n\t\t\t\tself.pd(\"Local path '{}' removed.\".format(localpath))\n\t\t\telse:\n\t\t\t\tperr(\"Failed to remove local path '{}'.\".format(localpath))\n\t\t\treturn result\n\n\tdef info(self):\n\t\treturn self.quota()\n\n\tdef quota(self):\n\t\t''' Usage: quota/info - display the quota information '''\n\t\tpars = {\n\t\t\t'method' : 'info' }\n\t\treturn self._get(pcsurl + 'quota', pars, self._quota_act)\n\n\tdef _whoami_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tself.pd(\"Response: {}\".format(j))\n\t\tpr('User id: ' + j['userid'])\n\t\tpr('Username: ' + j['username'])\n\t\treturn const.ENoError\n\n\tdef whoami(self):\n\t\t''' Usage: whoami - display the user information '''\n\t\tpars = {}\n\t\treturn self._get(const.OpenApiUrl + '/rest/2.0/passport/users/getInfo', pars, self._whoami_act)\n\n\t# return:\n\t#   0: local and remote files are of same size\n\t#   1: local file is larger\n\t#   2: remote file is larger\n\t#  -1: inconclusive (probably invalid remote json)\n\tdef _compare_size(self, lsize, rjson):\n\t\tif 'size' in rjson:\n\t\t\trsize = rjson['size']\n\t\t\tif lsize == rsize:\n\t\t\t\treturn 0\n\t\t\telif lsize > rsize:\n\t\t\t\treturn 1\n\t\t\telse:\n\t\t\t\treturn 2\n\t\telse:\n\t\t\treturn -1\n\n\tdef _verify_current_file(self, j, gotlmd5):\n\t\t# if we really don't want to verify\n\t\tif self._current_file == '/dev/null' and not self._verify:\n\t\t\treturn const.ENoError\n\n\t\trsize = 0\n\t\trmd5 = 0\n\n\t\t# always perform size check even _verify is False\n\t\tif 'size' in j:\n\t\t\trsize = j['size']\n\t\telse:\n\t\t\tperr(\"Unable to verify JSON: '{}', as no 'size' entry found\".format(j))\n\t\t\treturn const.EHashMismatch\n\n\t\tif 'md5' in j:\n\t\t\trmd5 = j['md5']\n\t\t#elif 'block_list' in j and len(j['block_list']) > 0:\n\t\t#\trmd5 = j['block_list'][0]\n\t\t#else:\n\t\t#\t# quick hack for meta's 'block_list' field\n\t\t#\tpwarn(\"No 'md5' nor 'block_list' found in json:\\n{}\".format(j))\n\t\t#\tpwarn(\"Assuming MD5s match, checking size ONLY.\")\n\t\t#\trmd5 = self._current_file_md5\n\t\telse:\n\t\t\tperr(\"Unable to verify JSON: '{}', as no 'md5' entry found\".format(j))\n\t\t\treturn const.EHashMismatch\n\n\t\tself.pd(\"Comparing local file '{}' and remote file '{}'\".format(\n\t\t\tself._current_file, j['path']))\n\t\tself.pd(\"Local file size : {}\".format(self._current_file_size))\n\t\tself.pd(\"Remote file size: {}\".format(rsize))\n\n\t\tif self._current_file_size == rsize:\n\t\t\tself.pd(\"Local and remote file size matches\")\n\t\t\tif self._verify:\n\t\t\t\tif not gotlmd5:\n\t\t\t\t\tself._current_file_md5 = md5(self._current_file)\n\t\t\t\tself.pd(\"Local file MD5 : {}\".format(self._current_file_md5))\n\t\t\t\tself.pd(\"Remote file MD5: {}\".format(rmd5))\n\n\t\t\t\tif self._current_file_md5 == rmd5:\n\t\t\t\t\tself.pd(\"Local and remote file hash matches\")\n\t\t\t\t\treturn const.ENoError\n\t\t\t\telse:\n\t\t\t\t\tpinfo(\"Local and remote file hash DOESN'T match\")\n\t\t\t\t\treturn const.EHashMismatch\n\t\t\telse:\n\t\t\t\treturn const.ENoError\n\t\telse:\n\t\t\tpinfo(\"Local and remote file size DOESN'T match\")\n\t\t\treturn const.EHashMismatch\n\n\tdef _get_file_info_act(self, r, args):\n\t\ttry:\n\t\t\tremotefile = args[0]\n\t\t\tj = r.json()\n\t\t\tself.jsonq.append(j)\n\t\t\tself.pd(\"List json: {}\".format(j))\n\t\t\tif not 'list' in j:\n\t\t\t\treturn const.EFileNotFound\n\t\t\targs[1] = len(j['list'])\n\t\t\tfor f in j['list']:\n\t\t\t\tif f['path'] == remotefile: # case-sensitive\n\t\t\t\t\tself._remote_json = f\n\t\t\t\t\tself.pd(\"File info json: {}\".format(self._remote_json))\n\t\t\t\t\treturn const.ENoError\n\n\t\t\treturn const.EFileNotFound\n\t\texcept KeyError as ex:\n\t\t\tperr(formatex(ex))\n\t\t\treturn const.ERequestFailed\n\n\t# the 'meta' command sucks, since it doesn't supply MD5 ...\n\t# now the JSON is written to self._remote_json, due to Python call-by-reference chaos\n\t# https://stackoverflow.com/questions/986006/python-how-do-i-pass-a-variable-by-reference\n\t# as if not enough confusion in Python call-by-reference\n\tdef _get_file_info(self, remotefile, **kwargs):\n\t\tif remotefile == const.AppPcsPath: # root path\n\t\t\t# fake it\n\t\t\trj = {}\n\t\t\trj['isdir'] = 1\n\t\t\trj['ctime'] = 0\n\t\t\trj['fs_id'] = 0\n\t\t\trj['mtime'] = 0\n\t\t\trj['path'] = const.AppPcsPath\n\t\t\trj['md5'] = ''\n\t\t\trj['size'] = 0\n\t\t\tself._remote_json = rj\n\t\t\tself.pd(\"File info json: {}\".format(self._remote_json))\n\t\t\treturn const.ENoError\n\n\t\trdir, rfile = posixpath.split(remotefile)\n\t\tself.pd(\"__get_file_info(): rdir : {} | rfile: {}\".format(rdir, rfile))\n        # while refactoring to use _walk_proceed_remote_dir is more dry, it might be less performant -\n\t\t# we want to stop once we found the file we need\n\t\tif rdir and rfile:\n\t\t\tlistStart = 0\n\t\t\twhile True:\n\t\t\t\tpars = {\n\t\t\t\t\t'method' : 'list',\n\t\t\t\t\t'path' : rdir,\n\t\t\t\t\t'by' : 'name', # sort in case we can use binary-search, etc in the futrue.\n\t\t\t\t\t'order' : 'asc',\n\t\t\t\t\t'limit': '{}-{}'.format(listStart, listStart + const.MaxListEntries)}\n\t\t\t\treqargs = [remotefile, 0]\n\t\t\t\tresult = self._get(pcsurl + 'file', pars, self._get_file_info_act, reqargs, **kwargs)\n\t\t\t\tif result == const.ENoError or reqargs[1] < const.MaxListEntries:\n\t\t\t\t\tbreak\n\t\t\t\tlistStart += const.MaxListEntries\n\t\t\treturn result\n\t\telse:\n\t\t\tperr(\"Invalid remotefile '{}' specified.\".format(remotefile))\n\t\t\treturn const.EArgument\n\n\tdef get_file_info(self, remotefile = '/'):\n\t\trpath = get_pcs_path(remotefile)\n\t\treturn self._get_file_info(rpath)\n\n\tdef _list_act(self, r, args):\n\t\t(remotedir, fmt) = args\n\t\tj = r.json()\n\t\tself.pd(\"Response: {}\".format(j))\n\t\tself.jsonq.append(j)\n\t\tpr(\"{} ({}):\".format(remotedir, fmt))\n\t\tfor f in j['list']:\n\t\t\tpr(self._replace_list_format(fmt, f))\n\n\t\treturn const.ENoError\n\n\tdef _proceed_list(self, walkresult, remotepath, dirjs, filejs, args):\n\t\tresult = walkresult\n\t\tfmt = args\n\t\t# cutfront = const.AppPcsPathLen\n\t\tcutfront = len(remotepath) + 1\n\t\tpathlol = [deepcopy(dirjs), deepcopy(filejs)]\n\t\tself.pd(\"Files listl: {}\".format(pathlol))\n\t\tfor path in pathlol:\n\t\t\tfor p in path:\n\t\t\t\tif 'path' in p:\n\t\t\t\t\tp['path'] = p['path'][cutfront:]\n\t\t\t\t\tpr(self._replace_list_format(fmt, p))\n\t\treturn result\n\n\tdef ls(self, remotepath = '',\n\t\tfmt = '$t $f $s $m $d',\n\t\tsort = 'name', order = 'asc'):\n\t\treturn self.list(remotepath, fmt, sort, order)\n\n\tdef list(self, remotepath = '',\n\t\tfmt = '$t $f $s $m $d',\n\t\tsort = 'name', order = 'asc'):\n\t\t''' Usage: list/ls [remotepath] [format] [sort] [order] - list the 'remotepath' directory at Baidu PCS\n\tremotepath - the remote path at Baidu PCS. default: root directory '/'\n\tformat - specifies how the list are displayed\n\t  $t - Type: Directory ('D') or File ('F')\n\t  $f - File name\n\t  $c - Creation time\n\t  $m - Modification time\n\t  $d - MD5 hash\n\t  $s - Size\n\t  Because of the interpolation, you need to escape the $ sign,\n\t  so '\\$t - \\$f - \\$s - \\$' will display \"Type - File - Size - $'\n\t  Default format: '$t $f $s $m $d'\n\t\t'''\n    # sort - sorting by [name, time, size]. default: 'name'\n    # order - sorting order [asc, desc]. default: 'asc'\n\t\trpath = get_pcs_path(remotepath)\n\t\tpr(\"{} ({}):\".format(rpath, fmt))\n\t\tself.file_list = [] # Hacky, but too lazy to make it proper\n\t\treturn self._walk_proceed_remote_dir(rpath, self._proceed_list, args = fmt, recursive = False)\n\n\t\t# pars = {\n\t\t# \t'method' : 'list',\n\t\t# \t'path' : rpath,\n\t\t# \t'by' : sort,\n\t\t# \t'order' : order }\n\n\t\t# return self._get(pcsurl + 'file', pars, self._list_act, (rpath, fmt))\n\n\tdef _meta_act(self, r, args):\n\t\treturn self._list_act(r, args)\n\n\tdef _meta(self, rpath, fmt):\n\t\tpars = {\n\t\t\t'method' : 'meta',\n\t\t\t'path' : rpath }\n\t\treturn self._get(pcsurl + 'file', pars,\n\t\t\tself._meta_act, (rpath, fmt))\n\n\t# multi-file meta is not implemented for its low usage\n\tdef meta(self, remotepath = '/', fmt = '$t $u $f $s $c $m $i $b'):\n\t\t''' Usage: meta <remotepath> [format] - \\\nget information of the given path (dir / file) at Baidu Yun.\n  remotepath - the remote path\n  format - specifies how the list are displayed\n    it supports all the format variables in the 'list' command, and additionally the followings:\n\t$i - fs_id\n\t$b - MD5 block_list\n\t$u - Has sub directory or not\n'''\n\t\trpath = get_pcs_path(remotepath)\n\t\tself.file_list = [] # Hacky, but too lazy to make it proper\n\t\treturn self._meta(rpath, fmt)\n\n\t# this 'is_revision' parameter sometimes gives the following error (e.g. for rapidupload):\n\t# {u'error_code': 31066, u'error_msg': u'file does not exist'}\n\t# and maintain it is also an extra burden, so it's disabled for now\n\tdef _add_isrev_param(self, ondup, pars):\n\t\tpass\n\t\t#if self._isrev and ondup != 'newcopy':\n\t\t#\tpars['is_revision'] = 1\n\n\tdef _combine_file_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tresult = self._verify_current_file(j, False)\n\t\tif result == const.ENoError:\n\t\t\tself.pv(\"'{}' =C=> '{}' OK.\".format(self._current_file, args))\n\t\telse:\n\t\t\tperr(\"'{}' =C=> '{}' FAILED.\".format(self._current_file, args))\n\t\t# save the md5 list, in case we add in resume function later to this program\n\t\tself._last_slice_md5s = self._slice_md5s\n\t\tself._slice_md5s = []\n\n\t\treturn result\n\n\tdef _combine_file(self, remotepath, ondup = 'overwrite'):\n\t\tpars = {\n\t\t\t'method' : 'createsuperfile',\n\t\t\t'path' : remotepath,\n\t\t\t'ondup' : ondup }\n\t\tself._add_isrev_param(ondup, pars)\n\n\t\t# always print this, so that we can use these data to combine file later\n\t\tpr(\"Combining the following MD5 slices:\")\n\t\tfor m in self._slice_md5s:\n\t\t\tpr(m)\n\n\t\tparam = { 'block_list' : self._slice_md5s }\n\t\treturn self._post(pcsurl + 'file',\n\t\t\t\tpars, self._combine_file_act,\n\t\t\t\tremotepath,\n\t\t\t\tdata = { 'param' : json.dumps(param) } )\n\n\tdef _upload_slice_act(self, r, args):\n\t\tj = r.json()\n\t\t# slices must be verified and re-upload if MD5s don't match,\n\t\t# otherwise, it makes the uploading slower at the end\n\t\trsmd5 = j['md5']\n\t\tself.pd(\"Uploaded MD5 slice: \" + rsmd5)\n\t\tif self._current_slice_md5 == rsmd5:\n\t\t\tself._slice_md5s.append(rsmd5)\n\t\t\tself.pv(\"'{}' >>==> '{}' OK.\".format(self._current_file, args))\n\t\t\treturn const.ENoError\n\t\telse:\n\t\t\tperr(\"'{}' >>==> '{}' FAILED.\".format(self._current_file, args))\n\t\t\treturn const.EHashMismatch\n\n\t# want to be proper? properness doesn't work\n\t# there seems to be a bug at Baidu's handling of http text:\n\t# Content-Disposition: ...  filename=utf-8''yourfile.ext\n\t# (pass '-ddd' to this program to verify this)\n\t# when you specify a unicode file name, which will be encoded\n\t# using the utf-8'' syntax\n\t# so, we put a work-around here: we always call our file 'file'\n\t# NOTE: an empty file name '' doesn't seem to work, so we\n\t# need to give it a name at will, but empty one.\n\t# apperantly, Baidu PCS doesn't use this file name for\n\t# checking / verification, so we are probably safe here.\n\t#files = { 'file' : (os.path.basename(self._current_file), self._current_slice) } )\n\t#files = { 'file' : (os.path.basename(localpath), f) })\n\t#files = { 'file' : ('file', f) })\n\tdef _stream_upload(self, fo, pars, act, remotepath,\n\t\t\turl = cpcsurl + 'file',\n\t\t\tuploadfilename = 'file'):\n\t\t# https://stackoverflow.com/a/35784072/404271\n\t\tform = multipart.encoder.MultipartEncoder({\n\t\t\t'file': (uploadfilename, fo, 'application/octet-stream')})\n\t\theaders = {\"Content-Type\": form.content_type}\n\t\treturn self._post(url,\n\t\t\tpars, act, remotepath,\n\t\t\theaders=headers, data=form)\n\n\tdef _upload_slice(self, remotepath):\n\t\tpars = {\n\t\t\t'method' : 'upload',\n\t\t\t'type' : 'tmpfile'}\n\n\t\treturn self._stream_upload(self._current_slice,\n\t\t\t\tpars, self._upload_slice_act, remotepath)\n\n\tdef _update_progress_entry(self, fullpath):\n\t\tprogress = {}\n\n\t\ttry:\n\t\t\tprogress = jsonload(self._progresspath)\n\t\texcept Exception as ex:\n\t\t\tperr(\"Error loading the progress for: '{}'.\\n{}.\".format(fullpath, formatex(ex)))\n\n\t\tself.pd(\"Updating slice upload progress for {}\".format(fullpath))\n\t\tprogress[fullpath] = (self._slice_size, self._slice_md5s)\n\n\t\ttry:\n\t\t\tjsondump(progress, self._progresspath, mpsemaphore)\n\t\texcept Exception as ex:\n\t\t\tperr(\"Error updating the progress for: '{}'.\\n{}.\".format(fullpath, formatex(ex)))\n\n\tdef _delete_progress_entry(self, fullpath):\n\t\ttry:\n\t\t\tprogress = jsonload(self._progresspath)\n\t\t\t# http://stackoverflow.com/questions/11277432/how-to-remove-a-key-from-a-python-dictionary\n\t\t\t#del progress[fullpath]\n\t\t\tself.pd(\"Removing slice upload progress for {}\".format(fullpath))\n\t\t\tprogress.pop(fullpath, None)\n\t\t\tjsondump(progress, self._progresspath, mpsemaphore)\n\t\texcept Exception as ex:\n\t\t\tperr(\"Error deleting the progress for: '{}'.\\n{}.\".format(fullpath, formatex(ex)))\n\n\tdef _upload_file_slices(self, localpath, remotepath, ondup = 'overwrite'):\n\t\tpieces = const.MaxSlicePieces\n\t\tslice = self._slice_size\n\t\tif self._current_file_size <= self._slice_size * const.MaxSlicePieces:\n\t\t\t# slice them using slice size\n\t\t\tpieces = (self._current_file_size + self._slice_size - 1 ) // self._slice_size\n\t\telse:\n\t\t\t# the following comparision is done in the caller:\n\t\t\t# elif self._current_file_size <= MaxSliceSize * MaxSlicePieces:\n\n\t\t\t# no choice, but need to slice them to 'MaxSlicePieces' pieces\n\t\t\tslice = (self._current_file_size + const.MaxSlicePieces - 1) // const.MaxSlicePieces\n\n\t\tself.pd(\"Slice size: {}, Pieces: {}\".format(slice, pieces))\n\n\t\ti = 0\n\t\tec = const.ENoError\n\n\t\tfullpath = os.path.abspath(self._current_file)\n\t\tprogress = {}\n\t\tinitial_offset = 0\n\t\t# create an empty progress file first\n\t\tif not os.path.exists(self._progresspath):\n\t\t\ttry:\n\t\t\t\tjsondump(progress, self._progresspath, mpsemaphore)\n\t\t\texcept Exception as ex:\n\t\t\t\tperr(\"Error savingprogress, no resumption.\\n{}\".format(formatex(ex)))\n\n\t\ttry:\n\t\t\tprogress = jsonload(self._progresspath)\n\t\texcept Exception as ex:\n\t\t\tperr(\"Error loading progress, no resumption.\\n{}\".format(formatex(ex)))\n\n\t\tif fullpath in progress:\n\t\t\tself.pd(\"Find the progress entry resume uploading\")\n\t\t\t(slice, md5s) = progress[fullpath]\n\t\t\tself._slice_md5s = []\n\t\t\twith io.open(self._current_file, 'rb') as f:\n\t\t\t\tself.pd(\"Verifying the md5s. Total count = {}\".format(len(md5s)))\n\t\t\t\tfor md in md5s:\n\t\t\t\t\tcslice = f.read(slice)\n\t\t\t\t\tcm = hashlib.md5(cslice)\n\t\t\t\t\tif (cm.hexdigest() == md):\n\t\t\t\t\t\tself.pd(\"{} verified\".format(md))\n\t\t\t\t\t\t# TODO: a more rigorous check would be also verifying\n\t\t\t\t\t\t# slices exist at Baidu Yun as well (rapidupload test?)\n\t\t\t\t\t\t# but that's a bit complex. for now, we don't check\n\t\t\t\t\t\t# this but simply delete the progress entry if later\n\t\t\t\t\t\t# we got error combining the slices.\n\t\t\t\t\t\tself._slice_md5s.append(md)\n\t\t\t\t\telse:\n\t\t\t\t\t\tbreak\n\t\t\t\tself.pd(\"verified md5 count = {}\".format(len(self._slice_md5s)))\n\t\t\ti = len(self._slice_md5s)\n\t\t\tinitial_offset = i * slice\n\t\t\tself.pd(\"Start from offset {}\".format(initial_offset))\n\n\t\twith io.open(self._current_file, 'rb') as f:\n\t\t\tstart_time = time.time()\n\t\t\tf.seek(initial_offset, os.SEEK_SET)\n\t\t\twhile i < pieces:\n\t\t\t\tself._current_slice = f.read(slice)\n\t\t\t\tm = hashlib.md5()\n\t\t\t\tm.update(self._current_slice)\n\t\t\t\tself._current_slice_md5 = m.hexdigest()\n\t\t\t\tself.pd(\"Uploading MD5 slice: {}, #{} / {}\".format(\n\t\t\t\t\tself._current_slice_md5,\n\t\t\t\t\ti + 1, pieces))\n\t\t\t\tj = 0\n\t\t\t\twhile True:\n\t\t\t\t\tec = self._upload_slice(remotepath)\n\t\t\t\t\tif ec == const.ENoError:\n\t\t\t\t\t\tself.pd(\"Slice MD5 match, continuing next slice\")\n\t\t\t\t\t\tpprgr(f.tell(), self._current_file_size, start_time, initial_offset)\n\t\t\t\t\t\tself._update_progress_entry(fullpath)\n\t\t\t\t\t\tbreak\n\t\t\t\t\telif j < self._retry:\n\t\t\t\t\t\tj += 1\n\t\t\t\t\t\t# TODO: Improve or make it DRY with the _request retry logic\n\t\t\t\t\t\tperr(\"Slice MD5 mismatch, waiting {} seconds before retrying...\".format(const.RetryDelayInSec))\n\t\t\t\t\t\ttime.sleep(const.RetryDelayInSec)\n\t\t\t\t\t\tperr(\"Retrying #{} / {}\".format(j + 1, self._retry))\n\t\t\t\t\telse:\n\t\t\t\t\t\tself._slice_md5s = []\n\t\t\t\t\t\tbreak\n\t\t\t\tif ec != const.ENoError:\n\t\t\t\t\tbreak\n\t\t\t\ti += 1\n\n\t\tif ec != const.ENoError:\n\t\t\treturn ec\n\t\telse:\n\t\t\t#self.pd(\"Sleep 2 seconds before combining, just to be safer.\")\n\t\t\t#time.sleep(2)\n\t\t\tec = self._combine_file(remotepath, ondup = 'overwrite')\n\t\t\tif ec == const.ENoError \\\n\t\t\t\tor ec == const.IESuperfileCreationFailed \\\n\t\t\t\tor ec == const.IEBlockMissInSuperFile2 \\\n\t\t\t\tor ec == const.EMaxRetry: # to handle undocumented error codes if any\n\t\t\t\t# we delete on success or failure caused by\n\t\t\t\t# the slices uploaded expired / became invalid\n\t\t\t\t# (needed for a fresh re-upload later)\n\t\t\t\tself._delete_progress_entry(fullpath)\n\t\t\treturn ec\n\n\tdef _rapidupload_file_act(self, r, args):\n\t\tif self._verify:\n\t\t\tself.pd(\"Not strong-consistent, sleep 1 second before verification\")\n\t\t\ttime.sleep(1)\n\t\t\treturn self._verify_current_file(r.json(), True)\n\t\telse:\n\t\t\treturn const.ENoError\n\n\tdef _rapidupload_file_post(self, rpath, size, md5str, slicemd5str, crcstr, ondup = 'overwrite'):\n\t\tpars = {\n\t\t\t'method' : 'rapidupload',\n\t\t\t'path' : rpath,\n\t\t\t'content-length' : size,\n\t\t\t'content-md5' : md5str,\n\t\t\t'slice-md5' : slicemd5str,\n\t\t\t'content-crc32' : crcstr,\n\t\t\t'ondup' : ondup }\n\t\tself._add_isrev_param(ondup, pars)\n\n\t\tself.pd(\"RapidUploading Length: {} MD5: {}, Slice-MD5: {}, CRC: {}\".format(\n\t\t\tsize, md5str, slicemd5str, crcstr))\n\t\treturn self._post(pcsurl + 'file', pars, self._rapidupload_file_act)\n\n\tdef _get_hashes_for_rapidupload(self, lpath, setlocalfile = False):\n\t\tif setlocalfile:\n\t\t\tself._current_file = lpath\n\t\t\tself._current_file_size = getfilesize(lpath)\n\n\t\tself._current_file_md5 = md5(self._current_file)\n\t\tself._current_file_slice_md5 = slice_md5(self._current_file)\n\t\tself._current_file_crc32 = crc32(self._current_file)\n\n\tdef _rapidupload_file(self, lpath, rpath, ondup = 'overwrite', setlocalfile = False):\n\t\tself._get_hashes_for_rapidupload(lpath, setlocalfile)\n\n\t\tmd5str = self._current_file_md5\n\t\tslicemd5str =  self._current_file_slice_md5\n\t\tcrcstr = hex(self._current_file_crc32)\n\t\treturn self._rapidupload_file_post(rpath, self._current_file_size, md5str, slicemd5str, crcstr, ondup)\n\n\tdef _upload_one_file_act(self, r, args):\n\t\tresult = self._verify_current_file(r.json(), False)\n\t\tif result == const.ENoError:\n\t\t\tself.pv(\"'{}' ==> '{}' OK.\".format(self._current_file, args))\n\t\telse:\n\t\t\tperr(\"'{}' ==> '{}' FAILED.\".format(self._current_file, args))\n\n\t\treturn result\n\n\tdef _upload_one_file(self, localpath, remotepath, ondup = 'overwrite'):\n\t\tpars = {\n\t\t\t'method' : 'upload',\n\t\t\t'path' : remotepath,\n\t\t\t'ondup' : ondup }\n\t\tself._add_isrev_param(ondup, pars)\n\n\t\twith io.open(localpath, 'rb') as f:\n\t\t\treturn self._stream_upload(f, pars,\n\t\t\t\t\tself._upload_one_file_act, remotepath)\n\n\t#TODO: upload empty directories as well?\n\tdef _walk_upload(self, localpath, remotepath, ondup, walk):\n\t\t(dirpath, dirnames, filenames) = walk\n\n\t\trdir = os.path.relpath(dirpath, localpath)\n\t\tif rdir == '.':\n\t\t\trdir = ''\n\t\telse:\n\t\t\trdir = rdir.replace('\\\\', '/')\n\n\t\trdir = (remotepath + '/' + rdir).rstrip('/') # '/' bites\n\n\t\tresult = const.ENoError\n\t\tfor name in filenames:\n\t\t\t#lfile = os.path.join(dirpath, name)\n\t\t\tlfile = joinpath(dirpath, name)\n\t\t\tself._current_file = lfile\n\t\t\tself._current_file_size = getfilesize(lfile)\n\t\t\trfile = rdir + '/' + name.replace('\\\\', '/')\n\t\t\t# if the corresponding file matches at Baidu Yun, then don't upload\n\t\t\tupload = True\n\t\t\tself._isrev = False\n\t\t\tself._remote_json = {}\n\t\t\tsubresult = self._get_file_info(rfile, dumpex = False)\n\t\t\tif subresult == const.ENoError: # same-name remote file exists\n\t\t\t\tself._isrev = True\n\t\t\t\tif const.ENoError == self._verify_current_file(self._remote_json, False):\n\t\t\t\t\t# the two files are the same\n\t\t\t\t\tupload = False\n\t\t\t\t\tself.pv(\"Remote file '{}' already exists, skip uploading\".format(rfile))\n\t\t\t\telse: # the two files are different\n\t\t\t\t\tif not self.shalloverwrite(\"Remote file '{}' exists but is different, \"\n\t\t\t\t\t\t\t\"do you want to overwrite it? [y/N]\".format(rfile)):\n\t\t\t\t\t\tupload = False\n\t\t\t\tself._isrev = False\n\n\t\t\tif upload:\n\t\t\t\tfileresult = self._upload_file(lfile, rfile, ondup)\n\t\t\t\tif fileresult != const.ENoError:\n\t\t\t\t\tresult = fileresult # we still continue\n\t\t\telse:\n\t\t\t\tpinfo(\"Remote file '{}' exists and is the same, skip uploading\".format(rfile))\n\t\t\t\t# next / continue\n\n\t\treturn result\n\n\tdef _upload_dir_single(self, localpath, remotepath, ondup = 'overwrite'):\n\t\tresult = const.ENoError\n\t\t# it's so minor that we don't care about the return value\n\t\t#self._mkdir(remotepath, retry = False, dumpex = False)\n\t\t#for walk in os.walk(localpath, followlinks=self._followlink):\n\t\tfor walk in self._walk_normal_file(localpath):\n\t\t\tthisresult = self._walk_upload(localpath, remotepath, ondup, walk)\n\t\t\t# we continue even if some upload failed, but keep the last error code\n\t\t\tif thisresult != const.ENoError:\n\t\t\t\tresult = thisresult\n\n\t\treturn result\n\n\tdef _upload_dir_multi(self, localpath, remotepath, ondup = 'overwrite'):\n\t\tworker = partial(self._walk_upload, localpath, remotepath, ondup)\n\t\treturn self._multi_process(worker, self._walk_normal_file(localpath),\n\t\t\t\"Direcory Upload\")\n\n\tdef _upload_dir(self, localpath, remotepath, ondup = 'overwrite'):\n\t\tself.pd(\"Uploading directory '{}' to '{}'\".format(localpath, remotepath))\n\t\tresult = const.ENoError\n\t\tif Pool and self.processes > 1:\n\t\t\tresult = self._upload_dir_multi(localpath, remotepath, ondup)\n\t\telse:\n\t\t\tresult =  self._upload_dir_single(localpath, remotepath, ondup)\n\t\tif result == const.ENoError:\n\t\t\tself._remove_local_on_success(localpath)\n\t\treturn result\n\n\tdef _upload_file(self, localpath, remotepath, ondup = 'overwrite'):\n\t\t# TODO: this is a quick patch\n\t\tif not self._shallinclude(localpath, remotepath, True):\n\t\t\t# since we are not going to upload it, there is no error\n\t\t\t#return const.ENoError\n\t\t\treturn const.ESkipped\n\n\t\tself._current_file = localpath\n\t\tself._current_file_size = getfilesize(localpath)\n\n\t\tresult = const.ENoError\n\t\tif self._current_file_size > const.MinRapidUploadFileSize:\n\t\t\tself.pd(\"'{}' is being RapidUploaded.\".format(self._current_file))\n\t\t\tresult = self._rapidupload_file(localpath, remotepath, ondup)\n\t\t\tif result == const.ENoError:\n\t\t\t\tself.pv(\"RapidUpload: '{}' =R=> '{}' OK.\".format(localpath, remotepath))\n\t\t\t\tself._rapiduploaded = True\n\t\t\telse:\n\t\t\t\tself._rapiduploaded = False\n\t\t\t\tif not self._rapiduploadonly:\n\t\t\t\t\tself.pd(\"'{}' can't be RapidUploaded, now trying normal uploading.\".format(\n\t\t\t\t\t\tself._current_file))\n\t\t\t\t\t# rapid upload failed, we have to upload manually\n\t\t\t\t\tif self._current_file_size <= self._slice_size:\n\t\t\t\t\t\tself.pd(\"'{}' is being non-slicing uploaded.\".format(self._current_file))\n\t\t\t\t\t\t# no-slicing upload\n\t\t\t\t\t\tresult = self._upload_one_file(localpath, remotepath, ondup)\n\t\t\t\t\telif self._current_file_size <= const.MaxSliceSize * const.MaxSlicePieces:\n\t\t\t\t\t\t# slice them using slice size\n\t\t\t\t\t\tself.pd(\"'{}' is being slicing uploaded.\".format(self._current_file))\n\t\t\t\t\t\tresult = self._upload_file_slices(localpath, remotepath, ondup)\n\t\t\t\t\telse:\n\t\t\t\t\t\tresult = const.EFileTooBig\n\t\t\t\t\t\tperr(\"Error: size of file '{}' - {} is too big\".format(\n\t\t\t\t\t\t\tself._current_file,\n\t\t\t\t\t\t\tself._current_file_size))\n\t\t\t\telse:\n\t\t\t\t\tself.pv(\"'{}' can't be rapidly uploaded, so it's skipped since we are in the rapid-upload-only mode.\".format(localpath))\n\t\t\t\t\tresult = const.ESkipped\n\t\telif self._rapiduploadonly:\n\t\t\tself.pv(\"'{}' is too small to be rapidly uploaded, so it's skipped since we are in the rapid-upload-only mode.\".format(localpath))\n\t\t\tresult = const.ESkipped\n\t\telse:\n\t\t\t# very small file, must be uploaded manually and no slicing is needed\n\t\t\tself.pd(\"'{}' is small and being non-slicing uploaded.\".format(self._current_file))\n\t\t\tresult = self._upload_one_file(localpath, remotepath, ondup)\n\n\t\tif result == const.ENoError:\n\t\t\tself._remove_local_on_success(localpath)\n\t\treturn result\n\n\tdef upload(self, localpath = '', remotepath = '', ondup = \"overwrite\"):\n\t\t''' Usage: upload [localpath] [remotepath] [ondup] - \\\nupload a file or directory (recursively)\n    localpath - local path, is the current directory '.' if not specified\n    remotepath - remote path at Baidu Yun (after app root directory at Baidu Yun)\n    ondup - what to do upon duplication ('overwrite' or 'newcopy'), default: 'overwrite'\n\t\t'''\n\t\t# copying since Python is call-by-reference by default,\n\t\t# so we shall not modify the passed-in parameters\n\t\tlpath = localpath.rstrip('\\\\/ ') # no trailing slashes\n\t\tlpathbase = os.path.basename(lpath)\n\t\trpath = remotepath\n\t\tif not lpath:\n\t\t\t# so, if you don't specify the local path, it will always be the current directory\n\t\t\t# and thus isdir(localpath) is always true\n\t\t\tlpath = os.path.abspath(\".\")\n\t\t\tself.pd(\"localpath not set, set it to current directory '{}'\".format(localpath))\n\n\t\tif os.path.isfile(lpath):\n\t\t\tself.pd(\"Uploading file '{}'\".format(lpath))\n\t\t\tif not rpath or rpath == '/': # to root we go\n\t\t\t\trpath = lpathbase\n\t\t\tif rpath[-1] == '/': # user intends to upload to this DIR\n\t\t\t\trpath = get_pcs_path(rpath + lpathbase)\n\t\t\telse:\n\t\t\t\trpath = get_pcs_path(rpath)\n\t\t\t\t# avoid uploading a file and destroy a directory by accident\n\t\t\t\tsubresult = self._get_file_info(rpath)\n\t\t\t\tif subresult == const.ENoError: # remote path exists, check is dir or file\n\t\t\t\t\tif self._remote_json['isdir']: # do this only for dir\n\t\t\t\t\t\trpath += '/' + lpathbase # rpath is guaranteed no '/' ended\n\t\t\tself.pd(\"remote path is '{}'\".format(rpath))\n\t\t\treturn self._upload_file(lpath, rpath, ondup)\n\t\telif os.path.isdir(lpath):\n\t\t\tself.pd(\"Uploading directory '{}' recursively\".format(lpath))\n\t\t\trpath = get_pcs_path(rpath)\n\t\t\treturn self._upload_dir(lpath, rpath, ondup)\n\t\telse:\n\t\t\tperr(\"Error: invalid local path '{}' for uploading specified.\".format(localpath))\n\t\t\treturn const.EParameter\n\n\t# The parameter 'localfile' is a bit kluge as it carries double meanings,\n\t# but this is to be command line friendly (one can not input an empty string '' from the command line),\n\t# so let's just leave it like this unless we can devise a cleverer / clearer weay\n\tdef combine(self, remotefile, localfile = '*', *args):\n\t\t''' Usage: combine <remotefile> [localfile] [md5s] - \\\ntry to create a file at PCS by combining slices, having MD5s specified\n  remotefile - remote file at Baidu Yun (after app root directory at Baidu Yun)\n  localfile - local file to verify against, passing in a star '*' or '/dev/null' means no verification\n  md5s - MD5 digests of the slices, can be:\n    - list of MD5 hex strings separated by spaces\n    - a string in the form of 'l<path>' where <path> points to a text file containing MD5 hex strings separated by spaces or line-by-line\n\t\t'''\n\t\tself._slice_md5s = []\n\t\tif args:\n\t\t\tif args[0].upper() == 'L':\n\t\t\t\ttry:\n\t\t\t\t\twith io.open(args[1:], 'r', encoding = 'utf-8') as f:\n\t\t\t\t\t\tcontents = f.read()\n\t\t\t\t\t\tdigests = filter(None, contents.split())\n\t\t\t\t\t\tfor d in digests:\n\t\t\t\t\t\t\tself._slice_md5s.append(d)\n\t\t\t\texcept IOError as ex:\n\t\t\t\t\tperr(\"Exception occured while reading file '{}'.\\n{}\".format(\n\t\t\t\t\t\tlocalfile, formatex(ex)))\n\t\t\telse:\n\t\t\t\tfor arg in args:\n\t\t\t\t\tself._slice_md5s.append(arg)\n\t\telse:\n\t\t\tperr(\"You MUST provide the MD5s hex strings through arguments or a file.\")\n\t\t\treturn const.EArgument\n\n\t\toriginal_verify = self._verify\n\t\tif not localfile or localfile == '*' or localfile == '/dev/null':\n\t\t\tself._current_file = '/dev/null' # Force no verify\n\t\t\tself._verify = False\n\t\telse:\n\t\t\tself._current_file = localfile\n\t\t\tself._current_file_size = getfilesize(localfile)\n\n\t\tresult = self._combine_file(get_pcs_path(remotefile))\n\t\tself._verify = original_verify\n\t\treturn result\n\n\t# no longer used\n\tdef _get_meta_act(self, r, args):\n\t\tparse_ok = False\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tif 'list' in j:\n\t\t\tlj = j['list']\n\t\t\tif len(lj) > 0:\n\t\t\t\tself._remote_json = lj[0] # TODO: ugly patch\n\t\t\t\t# patch for inconsistency between 'list' and 'meta' json\n\t\t\t\t#self._remote_json['md5'] = self._remote_json['block_list'].strip('[]\"')\n\t\t\t\tself.pd(\"self._remote_json: {}\".format(self._remote_json))\n\t\t\t\tparse_ok = True\n\t\t\t\treturn const.ENoError\n\n\t\tif not parse_ok:\n\t\t\tself._remote_json = {}\n\t\t\tperr(\"Invalid JSON:\\n{}\".format(j))\n\t\t\treturn const.EInvalidJson\n\n\t# no longer used\n\tdef _get_meta(self, remotefile):\n\t\tpars = {\n\t\t\t'method' : 'meta',\n\t\t\t'path' : remotefile }\n\t\treturn self._get(\n\t\t\tpcsurl + 'file', pars,\n\t\t\tself._get_meta_act)\n\n\t# NO LONGER IN USE\n\tdef _downfile_act(self, r, args):\n\t\trfile, offset = args\n\t\twith io.open(self._current_file, 'r+b' if offset > 0 else 'wb') as f:\n\t\t\tif offset > 0:\n\t\t\t\tf.seek(offset)\n\n\t\t\trsize = self._remote_json['size']\n\t\t\tstart_time = time.time()\n\t\t\tfor chunk in r.iter_content(chunk_size = self._dl_chunk_size):\n\t\t\t\tif chunk: # filter out keep-alive new chunks\n\t\t\t\t\tf.write(chunk)\n\t\t\t\t\tf.flush()\n\t\t\t\t\tpprgr(f.tell(), rsize, start_time)\n\t\t\t\t\t# https://stackoverflow.com/questions/7127075/what-exactly-the-pythons-file-flush-is-doing\n\t\t\t\t\t#os.fsync(f.fileno())\n\n\t\t# No exception above, then everything goes fine\n\t\tresult = const.ENoError\n\t\tif self._verify:\n\t\t\tself._current_file_size = getfilesize(self._current_file)\n\t\t\tresult = self._verify_current_file(self._remote_json, False)\n\n\t\tif result == const.ENoError:\n\t\t\tself.pv(\"'{}' <== '{}' OK\".format(self._current_file, rfile))\n\t\telse:\n\t\t\tperr(\"'{}' <== '{}' FAILED\".format(self._current_file, rfile))\n\n\t\treturn result\n\n\tdef _downchunks_act(self, r, args):\n\t\trfile, offset, rsize, start_time = args\n\n\t\texpectedBytes = self._dl_chunk_size\n\t\tif rsize - offset < self._dl_chunk_size:\n\t\t\texpectedBytes = rsize - offset\n\n\t\tif len(r.content) != expectedBytes:\n\t\t\treturn const.ERequestFailed\n\t\telse:\n\t\t\twith io.open(self._current_file, 'r+b' if offset > 0 else 'wb') as f:\n\t\t\t\tif offset > 0:\n\t\t\t\t\tf.seek(offset)\n\n\t\t\t\tf.write(r.content)\n\t\t\t\tpos = f.tell()\n\t\t\t\tpprgr(pos, rsize, start_time, existing = self._existing_size)\n\t\t\t\tif pos - offset == expectedBytes:\n\t\t\t\t\treturn const.ENoError\n\t\t\t\telse:\n\t\t\t\t\treturn const.EFileWrite\n\n\tdef _down_aria2c(self, remotefile, localfile):\n\t\turl = \"{}{}\".format(dpcsurl, \"file\")\n\t\t# i think encoding in UTF-8 before escaping is presumably the best practice\n\t\t# http://stackoverflow.com/a/913653/404271\n\t\tpars = {\n\t\t\t\"method\": \"download\",\n\t\t\t\"path\": remotefile.encode('utf-8'),\n\t\t\t\"access_token\": self._access_token,\n\t\t\t}\n\t\tfull_url = \"{}?{}\".format(url, ulp.urlencode(pars))\n\t\tcmd = ['aria2c', '--user-agent=\"{}\"'.format(const.UserAgent)] \\\n\t\t\t+ shlex.split(self._downloader_args) \\\n\t\t\t+ ['-o', localfile, full_url]\n\n\t\ttries = self._retry\n\t\tsubret = 0\n\t\ti = 0\n\t\twhile True:\n\t\t\tself.pd(\"call: {}\".format(cmd))\n\t\t\tsubret = subprocess.call(cmd)\n\t\t\tself.pd(\"aria2c exited with status: {}\".format(subret))\n\t\t\tif subret == 0:\n\t\t\t\treturn const.ENoError\n\t\t\ti += 1\n\t\t\tif i < tries:\n\t\t\t\t# algo changed: delay more after each failure\n\t\t\t\tdelay = const.RetryDelayInSec * i\n\t\t\t\tperr(\"Waiting {} seconds before retrying...\".format(delay))\n\t\t\t\ttime.sleep(delay)\n\t\t\t\tperr(\"Request Try #{} / {}\".format(i + 1, tries))\n\t\t\telse:\n\t\t\t\tperr(\"Maximum number ({}) of tries failed.\".format(tries))\n\t\t\t\tif self._quit_when_fail:\n\t\t\t\t\tsys.exit(const.EMaxRetry)\n\t\t\t\treturn const.EMaxRetry\n\n\t# requirement: self._remote_json is already gotten\n\tdef _downchunks(self, rfile, start):\n\t\trsize = self._remote_json['size']\n\n\t\tpars = {\n\t\t\t'method' : 'download',\n\t\t\t# Do they cause some side effects?\n\t\t\t#'app_id': 250528,\n\t\t\t#'check_blue' : '1',\n\t\t\t#'ec' : '1',\n\t\t\t'path' : rfile }\n\n\t\toffset = start\n\t\tself._existing_size = offset\n\t\tstart_time = time.time()\n\t\twhile True:\n\t\t\tnextoffset = offset + self._dl_chunk_size\n\t\t\tif nextoffset < rsize:\n\t\t\t\theaders = { \"Range\" : \"bytes={}-{}\".format(\n\t\t\t\t\toffset, nextoffset - 1) }\n\t\t\telif offset > 0:\n\t\t\t\theaders = { \"Range\" : \"bytes={}-\".format(offset) }\n\t\t\telif rsize >= 1: # offset == 0\n\t\t\t\t# Fix chunked + gzip response,\n\t\t\t\t# seems we need to specify the Range for the first chunk as well:\n\t\t\t\t# https://github.com/houtianze/bypy/pull/161\n\t\t\t\t#headers = { \"Range\" : \"bytes=0-\".format(rsize - 1) }\n\t\t\t\theaders = { \"Range\" : \"bytes=0-{}\".format(rsize - 1) }\n\t\t\telse:\n\t\t\t\theaders = {}\n\n\t\t\t# this _may_ solve #163: { \"error_code\":31326, \"error_msg\":\"anti hotlinking\"}\n#\t\t\tif 'Range' in headers:\n#\t\t\t\trangemagic = base64.standard_b64encode(headers['Range'][6:].encode('utf-8'))\n#\t\t\t\tself.pd(\"headers['Range'][6:]: {} {}\".format(headers['Range'][6:], rangemagic))\n#\t\t\t\t#pars['ru'] = rangemagic\n\n\t\t\tsubresult = self._get(dpcsurl + 'file', pars,\n\t\t\t\tself._downchunks_act, (rfile, offset, rsize, start_time), headers = headers, cookies = self._cookies)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\treturn subresult\n\n\t\t\tif nextoffset < rsize:\n\t\t\t\toffset += self._dl_chunk_size\n\t\t\telse:\n\t\t\t\tbreak\n\n\t\t# No exception above, then everything goes fine\n\t\tresult = const.ENoError\n\t\tif self._verify:\n\t\t\tself._current_file_size = getfilesize(self._current_file)\n\t\t\tresult = self._verify_current_file(self._remote_json, False)\n\n\t\tif result == const.ENoError:\n\t\t\tself.pv(\"'{}' <== '{}' OK\".format(self._current_file, rfile))\n\t\telse:\n\t\t\tperr(\"'{}' <== '{}' FAILED\".format(self._current_file, rfile))\n\n\t\treturn result\n\n\tdef _downfile(self, remotefile, localfile):\n\t\tpinfo('{} <- {}'.format(localfile, remotefile))\n\t\t# TODO: this is a quick patch\n\t\tif not self._shallinclude(localfile, remotefile, False):\n\t\t\t# since we are not going to download it, there is no error\n\t\t\t#return const.ENoError\n\t\t\treturn const.ESkipped\n\n\t\tresult = const.ENoError\n\t\trfile = remotefile\n\n\t\tself._remote_json = {}\n\t\tself.pd(\"Downloading '{}' as '{}'\".format(rfile, localfile))\n\t\tself._current_file = localfile\n\t\t#if self._verify or self._resumedownload:\n\t\tself.pd(\"Getting info of remote file '{}' for later verification\".format(rfile))\n\t\tresult = self._get_file_info(rfile)\n\t\tif result != const.ENoError:\n\t\t\treturn result\n\n\t\toffset = 0\n\t\tself.pd(\"Checking if we already have the copy locally\")\n\t\tif os.path.isfile(localfile):\n\t\t\tself.pd(\"Same-name local file '{}' exists, checking if contents match\".format(localfile))\n\t\t\tself._current_file_size = getfilesize(self._current_file)\n\t\t\tif const.ENoError == self._verify_current_file(self._remote_json, False) \\\n\t\t\t\tand not (self._downloader[:5] == const.DownloaderAria2 and os.path.exists(localfile + '.aria2')):\n\t\t\t\tself.pd(\"Same local file '{}' already exists, skip downloading\".format(localfile))\n\t\t\t\tself._remove_remote_on_success(remotefile)\n\t\t\t\treturn const.ENoError\n\t\t\telse:\n\t\t\t\tif not self.shalloverwrite(\"Same-name locale file '{}' exists but is different, \"\n\t\t\t\t\t\t\"do you want to overwrite it? [y/N]\".format(localfile)):\n\t\t\t\t\tpinfo(\"Same-name local file '{}' exists but is different, skip downloading\".format(localfile))\n\t\t\t\t\t#return const.ENoError\n\t\t\t\t\treturn const.ESkipped\n\n\t\t\tif self._resumedownload and \\\n\t\t\t\tself._compare_size(self._current_file_size, self._remote_json) == 2:\n\t\t\t\tif self._resumedl_revertcount < 0:\n\t\t\t\t\tif self._current_file_size:\n\t\t\t\t\t\toffset = self._current_file_size\n\t\t\t\telse:\n\t\t\t\t\t# revert back at least self._resumedl_revertcount download chunk(s), default: one\n\t\t\t\t\tpieces = self._current_file_size // self._dl_chunk_size\n\t\t\t\t\tif pieces > self._resumedl_revertcount:\n\t\t\t\t\t\toffset = (pieces - self._resumedl_revertcount) * self._dl_chunk_size\n\t\telif os.path.isdir(localfile):\n\t\t\tif not self.shalloverwrite(\"Same-name directory '{}' exists, \"\n\t\t\t\t\"do you want to remove it? [y/N]\".format(localfile)):\n\t\t\t\tpinfo(\"Same-name directory '{}' exists, skip downloading\".format(localfile))\n\t\t\t\t#return const.ENoError\n\t\t\t\treturn const.ESkipped\n\n\t\t\tself.pv(\"Directory with the same name '{}' exists, removing ...\".format(localfile))\n\t\t\tresult = removedir(localfile, self.verbose)\n\t\t\tif result == const.ENoError:\n\t\t\t\tself.pv(\"Removed\")\n\t\t\telse:\n\t\t\t\tperr(\"Error removing the directory '{}'\".format(localfile))\n\t\t\t\treturn result\n\n\t\tldir, file = os.path.split(localfile)\n\t\tif ldir and not os.path.exists(ldir):\n\t\t\tresult = makedir(ldir, verbose = self.verbose)\n\t\t\tif result != const.ENoError:\n\t\t\t\tperr(\"Fail to make directory '{}'\".format(ldir))\n\t\t\t\treturn result\n\n\t\tif self._downloader[:5] == const.DownloaderAria2:\n\t\t\tresult = self._down_aria2c(rfile, localfile)\n\t\telse:\n\t\t\tresult = self._downchunks(rfile, offset)\n\n\t\tif result == const.ENoError:\n\t\t\tself._remove_remote_on_success(remotefile)\n\n\t\treturn result\n\n\tdef downfile(self, remotefile, localpath = ''):\n\t\t''' Usage: downfile <remotefile> [localpath] - \\\ndownload a remote file.\n  remotefile - remote file at Baidu Yun (after app root directory at Baidu Yun)\n  localpath - local path.\n    if it ends with '/' or '\\\\', it specifies the local directory\n    if it specifies an existing directory, it is the local directory\n    if not specified, the local directory is the current directory '.'\n    otherwise, it specifies the local file name\nTo stream a file using downfile, you can use the 'mkfifo' trick with omxplayer etc.:\n  mkfifo /tmp/omx\n  bypy.py downfile <remotepath> /tmp/omx &\n  omxplayer /tmp/omx\n\t\t'''\n\t\tlocalfile = localpath\n\t\tif not localpath:\n\t\t\tlocalfile = os.path.basename(remotefile)\n\t\telif localpath[-1] == '\\\\' or \\\n\t\t\tlocalpath[-1] == '/' or \\\n\t\t\tos.path.isdir(localpath):\n\t\t\t#localfile = os.path.join(localpath, os.path.basename(remotefile))\n\t\t\tlocalfile = joinpath(localpath, os.path.basename(remotefile))\n\t\telse:\n\t\t\tlocalfile = localpath\n\n\t\tpcsrpath = get_pcs_path(remotefile)\n\t\treturn self._downfile(pcsrpath, localfile)\n\n\tdef _stream_act_actual(self, r, args):\n\t\tpipe, csize = args\n\t\twith io.open(pipe, 'wb') as f:\n\t\t\tfor chunk in r.iter_content(chunk_size = csize):\n\t\t\t\tif chunk: # filter out keep-alive new chunks\n\t\t\t\t\tf.write(chunk)\n\t\t\t\t\tf.flush()\n\t\t\t\t\t# https://stackoverflow.com/questions/7127075/what-exactly-the-pythons-file-flush-is-doing\n\t\t\t\t\t#os.fsync(f.fileno())\n\n\tdef _streaming_act(self, r, args):\n\t\treturn self._stream_act_actual(r, args)\n\n\t# NOT WORKING YET\n\tdef streaming(self, remotefile, localpipe, fmt = 'M3U8_480_360', chunk = 4 * const.OneM):\n\t\t''' Usage: stream <remotefile> <localpipe> [format] [chunk] - \\\nstream a video / audio file converted to M3U format at cloud side, to a pipe.\n  remotefile - remote file at Baidu Yun (after app root directory at Baidu Yun)\n  localpipe - the local pipe file to write to\n  format - output video format (M3U8_320_240 | M3U8_480_224 | \\\nM3U8_480_360 | M3U8_640_480 | M3U8_854_480). Default: M3U8_480_360\n  chunk - chunk (initial buffering) size for streaming (default: 4M)\nTo stream a file, you can use the 'mkfifo' trick with omxplayer etc.:\n  mkfifo /tmp/omx\n  bypy.py downfile <remotepath> /tmp/omx &\n  omxplayer /tmp/omx\n  *** NOT WORKING YET ****\n\t\t'''\n\t\tpars = {\n\t\t\t'method' : 'streaming',\n\t\t\t'path' : get_pcs_path(remotefile),\n\t\t\t'type' : fmt }\n\n\t\treturn self._get(pcsurl + 'file', pars,\n\t\t\tself._streaming_act, (localpipe, chunk), stream = True)\n\n\tdef _walk_proceed_remote_dir_act(self, r, args):\n\t\tdirjs, filejs = args\n\t\tj = r.json()\n\t\tif 'list' not in j:\n\t\t\tself.pd(\"Key 'list' not found in the response of directory listing request:\\n{}\".format(j))\n\t\t\treturn const.ERequestFailed\n\n\t\tpaths = j['list']\n\t\tfor path in paths:\n\t\t\tif path['isdir']:\n\t\t\t\tdirjs.append(path)\n\t\t\telse:\n\t\t\t\tfilejs.append(path)\n\n\t\treturn const.ENoError\n\n\tdef _walk_remote_dir(self, remotepath, remoterootpath, args = None, skip_remote_only_dirs = False, recursive = True):\n\t\tdirjs = []\n\t\tfilejs = []\n\t\tlistStart = 0\n\t\t# https://github.com/houtianze/bypy/issues/285\n\t\twhile True:\n\t\t\tpars = {\n\t\t\t\t'method' : 'list',\n\t\t\t\t'path' : remotepath,\n\t\t\t\t'by' : 'name',\n\t\t\t\t'order' : 'asc',\n\t\t\t\t'limit' : '{}-{}'.format(listStart, listStart + const.MaxListEntries)}\n\t\t\t# Python parameters are by-reference and mutable, so they are 'out' by default\n\t\t\tresult = self._get(pcsurl + 'file', pars, self._walk_proceed_remote_dir_act, (dirjs, filejs))\n\t\t\tif len(dirjs) + len(filejs) - listStart < const.MaxListEntries:\n\t\t\t\tbreak\n\t\t\tlistStart += const.MaxListEntries\n\t\tyield [result, remotepath, dirjs, filejs, args]\n\t\tif result == const.ENoError:\n\t\t\tself.pd(\"Remote dirs: {}\".format(dirjs))\n\t\t\tself.pd(\"Remote files: {}\".format(filejs))\n\t\t\tif recursive:\n\t\t\t\tfor dirj in dirjs:\n\t\t\t\t\tcrpath = dirj['path'] # crpath - current remote path\n\t\t\t\t\tif skip_remote_only_dirs and remoterootpath != None and \\\n\t\t\t\t\t\tself._local_dir_contents.get(posixpath.relpath(crpath, remoterootpath)) == None:\n\t\t\t\t\t\tself.pd(\"Skipping remote-only sub-directory '{}'.\".format(crpath))\n\t\t\t\t\t\tcontinue\n\n\t\t\t\t\t# http://stackoverflow.com/a/8991864/404271\n\t\t\t\t\t# for Python 3.3+, \"yield from\" reads better\n\t\t\t\t\tfor y in self._walk_remote_dir(crpath, remoterootpath, args, skip_remote_only_dirs):\n\t\t\t\t\t\tyield y\n\n\tdef _walk_proceed_remote_dir(self, remotepath, proceed, args = None, skip_remote_only_dirs = False, recursive = True):\n\t\tresult = const.ENoError\n\t\tfor walk in self._walk_remote_dir(remotepath, remotepath, args, skip_remote_only_dirs, recursive):\n\t\t\tsubresult = proceed(*walk)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\treturn result\n\n\tdef _prepare_local_dir(self, localdir):\n\t\tresult = const.ENoError\n\t\tif os.path.isfile(localdir):\n\t\t\tresult = removefile(localdir, self.verbose)\n\n\t\tif result == const.ENoError:\n\t\t\tif localdir and not os.path.exists(localdir):\n\t\t\t\tresult = makedir(localdir, verbose = self.verbose)\n\n\t\treturn result\n\n\tdef _proceed_downdir(self, walkresult, remotepath, dirjs, filejs, args):\n\t\tresult = walkresult\n\t\trootrpath, localpath = args\n\t\t#rlen = len(remotepath) + 1\n\t\trootlen = len(rootrpath) + 1 # '+ 1' for the trailing '/', it bites.\n\n\t\tsubresult = self._prepare_local_dir(localpath)\n\t\tif subresult != const.ENoError:\n\t\t\tperr(\"Fail to prepare local directory '{}' for downloading, ABORT!\".format(localpath))\n\t\t\treturn subresult\n\n\t\tfor dirj in dirjs:\n\t\t\trdir = dirj['path']\n\t\t\treldir = rdir[rootlen:]\n\t\t\t#ldir = os.path.join(localpath, reldir)\n\t\t\tldir = joinpath(localpath, reldir)\n\t\t\tsubresult = self._prepare_local_dir(ldir)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tperr(\"Fail to prepare local directory '{}' for downloading, ABORT!\".format(ldir))\n\t\t\t\treturn subresult\n\n\t\tfor filej in filejs:\n\t\t\trfile = filej['path']\n\t\t\trelfile = rfile[rootlen:]\n\t\t\t#lfile = os.path.join(localpath, relfile)\n\t\t\tlfile = joinpath(localpath, relfile)\n\t\t\tsubresult = self._downfile(rfile, lfile)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\n\t\treturn result\n\n\tdef _downdir_single(self, rpath, lpath):\n\t\treturn self._walk_proceed_remote_dir(rpath, self._proceed_downdir, (rpath, lpath))\n\n\tdef _proceed_downdir_worker(self, arglist):\n\t\treturn self._proceed_downdir(*arglist)\n\n\tdef _downdir_multi(self, rpath, lpath):\n\t\treturn self._multi_process(self._proceed_downdir_worker,\n\t\t\tself._walk_remote_dir(rpath, rpath, (rpath, lpath)),\n\t\t\t\"Directory Download\")\n\n\tdef _downdir(self, rpath, lpath):\n\t\tresult = const.ENoError\n\t\tif Pool and self.processes > 1:\n\t\t\tresult = self._downdir_multi(rpath, lpath)\n\t\telse:\n\t\t\tresult = self._downdir_single(rpath, lpath)\n\t\tif result == const.ENoError:\n\t\t\tself._remove_remote_on_success(rpath)\n\t\treturn result\n\n\tdef downdir(self, remotepath = None, localpath = None):\n\t\t''' Usage: downdir [remotedir] [localdir] - \\\ndownload a remote directory (recursively)\n  remotedir - remote directory at Baidu Yun (after app root directory), if not specified, it is set to the root directory at Baidu Yun\n  localdir - local directory. if not specified, it is set to the current directory\n\t\t'''\n\t\trpath = get_pcs_path(remotepath)\n\t\tlpath = localpath\n\t\tif not lpath:\n\t\t\tlpath = '' # empty string does it, no need '.'\n\t\tlpath = lpath.rstrip('/\\\\ ')\n\t\treturn self._downdir(rpath, lpath)\n\n\tdef download(self, remotepath = '/', localpath = ''):\n\t\t''' Usage: download [remotepath] [localpath] - \\\ndownload a remote directory (recursively) / file\n  remotepath - remote path at Baidu Yun (after app root directory), if not specified, it is set to the root directory at Baidu Yun\n  localpath - local path. if not specified, it is set to the current directory\n\t\t'''\n\t\tsubr = self.get_file_info(remotepath)\n\t\tif const.ENoError == subr:\n\t\t\tif 'isdir' in self._remote_json:\n\t\t\t\tif self._remote_json['isdir']:\n\t\t\t\t\treturn self.downdir(remotepath, localpath)\n\t\t\t\telse:\n\t\t\t\t\treturn self.downfile(remotepath, localpath)\n\t\t\telse:\n\t\t\t\tperr(\"Malformed path info JSON '{}' returned\".format(self._remote_json))\n\t\t\t\treturn const.EFatal\n\t\telif const.EFileNotFound == subr:\n\t\t\tperr(\"Remote path '{}' does not exist\".format(remotepath))\n\t\t\treturn subr\n\t\telse:\n\t\t\tperr(\"Error {} while getting info for remote path '{}'\".format(subr, remotepath))\n\t\t\treturn subr\n\n\tdef _mkdir_act(self, r, args):\n\t\tif self.verbose:\n\t\t\tj = r.json()\n\t\t\tself.jsonq.append(j)\n\t\t\tpr(\"path, ctime, mtime, fs_id\")\n\t\t\tpr(\"{path}, {ctime}, {mtime}, {fs_id}\".format(**j))\n\n\t\treturn const.ENoError\n\n\tdef _mkdir(self, rpath, **kwargs):\n\t\t# TODO: this is a quick patch\n\t\t# the code still works because Baidu Yun doesn't require\n\t\t# parent directory to exist remotely to upload / create a file\n\t\tif not self._shallinclude('.', rpath, True):\n\t\t\t#return const.ENoError\n\t\t\treturn const.ESkipped\n\n\t\tself.pd(\"Making remote directory '{}'\".format(rpath))\n\n\t\tpars = {\n\t\t\t'method' : 'mkdir',\n\t\t\t'path' : rpath }\n\t\treturn self._post(pcsurl + 'file', pars, self._mkdir_act, **kwargs)\n\n\tdef mkdir(self, remotepath):\n\t\t''' Usage: mkdir <remotedir> - \\\ncreate a directory at Baidu Yun\n  remotedir - the remote directory\n'''\n\t\trpath = get_pcs_path(remotepath)\n\t\treturn self._mkdir(rpath)\n\n\tdef _move_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tlist = j['extra']['list']\n\t\tfromp = list[0]['from']\n\t\tto = list[0]['to']\n\t\tself.pd(\"Remote move: '{}' =mm-> '{}' OK\".format(fromp, to))\n\n\t# aliases\n\tdef mv(self, fromp, to):\n\t\treturn self.move(fromp, to)\n\n\tdef rename(self, fromp, to):\n\t\treturn self.move(fromp, to)\n\n\tdef ren(self, fromp, to):\n\t\treturn self.move(fromp, to)\n\n\tdef move(self, fromp, to):\n\t\t''' Usage: move/mv/rename/ren <from> <to> - \\\nmove a file / dir remotely at Baidu Yun\n  from - source path (file / dir)\n  to - destination path (file / dir)\n\t\t'''\n\t\tfrompp = get_pcs_path(fromp)\n\t\ttop = get_pcs_path(to)\n\t\tpars = {\n\t\t\t'method' : 'move',\n\t\t\t'from' : frompp,\n\t\t\t'to' : top }\n\n\t\tself.pd(\"Remote moving: '{}' =mm=> '{}'\".format(fromp, to))\n\t\treturn self._post(pcsurl + 'file', pars, self._move_act)\n\n\tdef _copy_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tfor list in j['extra']['list']:\n\t\t\tfromp = list['from']\n\t\t\tto = list['to']\n\t\t\tself.pd(\"Remote copy: '{}' =cc=> '{}' OK\".format(fromp, to))\n\n\t\treturn const.ENoError\n\n\t# alias\n\tdef cp(self, fromp, to):\n\t\treturn self.copy(fromp, to)\n\n\tdef copy(self, fromp, to):\n\t\t''' Usage: copy/cp <from> <to> - \\\ncopy a file / dir remotely at Baidu Yun\n  from - source path (file / dir)\n  to - destination path (file / dir)\n\t\t'''\n\t\tfrompp = get_pcs_path(fromp)\n\t\ttop = get_pcs_path(to)\n\t\tpars = {\n\t\t\t'method' : 'copy',\n\t\t\t'from' : frompp,\n\t\t\t'to' : top }\n\n\t\tself.pd(\"Remote copying '{}' =cc=> '{}'\".format(frompp, top))\n\t\treturn self._post(pcsurl + 'file', pars, self._copy_act)\n\n\tdef _delete_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\trid = j['request_id']\n\t\tif rid:\n\t\t\tpr(\"Deletion request '{}' OK\".format(rid))\n\t\t\tpr(\"Use 'list' command to confirm\")\n\n\t\t\treturn const.ENoError\n\t\telse:\n\t\t\tperr(\"Deletion failed\")\n\t\t\treturn const.EFailToDeleteFile\n\n\tdef _delete(self, rpath):\n\t\tpars = {\n\t\t\t'method' : 'delete',\n\t\t\t'path' : rpath }\n\n\t\tself.pd(\"Remote deleting: '{}'\".format(rpath))\n\t\treturn self._post(pcsurl + 'file', pars, self._delete_act)\n\n\tdef _delete_children_act(self, r, args):\n\t\tresult = const.ENoError\n\t\tj = r.json()\n\t\tfor f in j['list']:\n\t\t\t# we continue even if some upload failed, but keep the last error code\n\t\t\tthisresult = self._delete(f['path'])\n\t\t\tif thisresult != const.ENoError:\n\t\t\t\tresult = thisresult\n\n\t\treturn result\n\n\tdef _delete_children(self, rpath):\n\t\tpars = {\n\t\t\t'method' : 'list',\n\t\t\t'path' : rpath}\n\n\t\treturn self._get(pcsurl + 'file', pars, self._delete_children_act, None)\n\n\t# aliases\n\tdef remove(self, remotepath):\n\t\treturn self.delete(remotepath)\n\n\tdef rm(self, remotepath):\n\t\treturn self.delete(remotepath)\n\n\tdef delete(self, remotepath):\n\t\t''' Usage: delete/remove/rm <remotepath> - \\\ndelete a file / dir remotely at Baidu Yun\n  remotepath - destination path (file / dir)\n\t\t'''\n\t\trpath = get_pcs_path(remotepath)\n\t\t#if is_pcs_root_path(rpath):\n\t\t#\treturn self._delete_children(rpath)\n\t\t#else:\n\t\treturn self._delete(rpath)\n\n\tdef _search_act(self, r, args):\n\t\tj = r.json()\n\t\tself.jsonq.append(j)\n\t\tprint_pcs_list(j)\n\t\treturn const.ENoError\n\n\tdef search(self, keyword, remotepath = None, recursive = True):\n\t\t''' Usage: search <keyword> [remotepath] [recursive] - \\\nsearch for a file using keyword at Baidu Yun\n  keyword - the keyword to search\n  remotepath - remote path at Baidu Yun, if not specified, it's app's root directory\n  resursive - search recursively or not. default is true\n\t\t'''\n\t\trpath = get_pcs_path(remotepath)\n\n\t\tpars = {\n\t\t\t'method' : 'search',\n\t\t\t'path' : rpath,\n\t\t\t'wd' : keyword,\n\t\t\t're' : '1' if str2bool(recursive) else '0'}\n\n\t\tself.pd(\"Searching: '{}'\".format(rpath))\n\t\treturn self._get(pcsurl + 'file', pars, self._search_act)\n\n\tdef _listrecycle_act(self, r, args):\n\t\tprint_pcs_list(r.json())\n\t\treturn const.ENoError\n\n\tdef listrecycle(self, start = 0, limit = 1000):\n\t\t''' Usage: listrecycle [start] [limit] - \\\nlist the recycle contents\n  start - starting point, default: 0\n  limit - maximum number of items to display. default: 1000\n\t\t'''\n\t\tpars = {\n\t\t\t'method' : 'listrecycle',\n\t\t\t'start' : str2int(start),\n\t\t\t'limit' : str2int(limit) }\n\n\t\tself.pd(\"Listing recycle '{}'\")\n\t\treturn self._get(pcsurl + 'file', pars, self._listrecycle_act)\n\n\tdef _restore_act(self, r, args):\n\t\tpath = args\n\t\tpr(\"'{}' found and restored\".format(path))\n\t\treturn const.ENoError\n\n\tdef _restore_search_act(self, r, args):\n\t\tpath = args\n\t\tflist = r.json()['list']\n\t\tfsid = None\n\t\tfor f in flist:\n\t\t\tif os.path.normpath(f['path'].lower()) == os.path.normpath(path.lower()):\n\t\t\t\tfsid = f['fs_id']\n\t\t\t\tself.pd(\"fs_id for restoring '{}' found\".format(fsid))\n\t\t\t\tbreak\n\t\tif fsid:\n\t\t\tpars = {\n\t\t\t\t'method' : 'restore',\n\t\t\t\t'fs_id' : fsid }\n\t\t\treturn self._post(pcsurl + 'file', pars, self._restore_act, path)\n\t\telse:\n\t\t\tperr(\"'{}' not found in the recycle bin\".format(path))\n\n\tdef restore(self, remotepath):\n\t\t''' Usage: restore <remotepath> - \\\nrestore a file from the recycle bin\n  remotepath - the remote path to restore\n\t\t'''\n\t\trpath = get_pcs_path(remotepath)\n\t\t# by default, only 1000 items, more than that sounds a bit crazy\n\t\tpars = {\n\t\t\t'method' : 'listrecycle' }\n\n\t\tself.pd(\"Searching for fs_id to restore\")\n\t\treturn self._get(pcsurl + 'file', pars, self._restore_search_act, rpath)\n\n\tdef _proceed_local_gather(self, dirlen, walk):\n\t\t#names.sort()\n\t\t(dirpath, dirnames, filenames) = walk\n\n\t\tfiles = []\n\t\tfor name in filenames:\n\t\t\t#fullname = os.path.join(dirpath, name)\n\t\t\tfullname = joinpath(dirpath, name)\n\t\t\t# ignore broken symbolic links\n\t\t\tif not os.path.exists(fullname):\n\t\t\t\tself.pd(\"Local path '{}' does not exist (broken symbolic link?)\".format(fullname))\n\t\t\t\tcontinue\n\t\t\tfiles.append((name, getfilesize(fullname), md5(fullname)))\n\n\t\treldir = dirpath[dirlen:].replace('\\\\', '/')\n\t\tplace = self._local_dir_contents.get(reldir)\n\t\tfor dir in dirnames:\n\t\t\tplace.add(dir, PathDictTree('D'))\n\t\tfor file in files:\n\t\t\tplace.add(file[0], PathDictTree('F', size = file[1], md5 = file[2]))\n\n\t\treturn const.ENoError\n\n\tdef _gather_local_dir(self, dir):\n\t\tself._local_dir_contents = PathDictTree()\n\t\t#for walk in os.walk(dir, followlinks=self._followlink):\n\t\tfor walk in self._walk_normal_file(dir):\n\t\t\tself._proceed_local_gather(len(dir), walk)\n\t\tself.pd(self._local_dir_contents)\n\n\tdef _proceed_remote_gather(self, walkresult, remotepath, dirjs, filejs, args = None):\n\t\t# NOTE: the '+ 1' is due to the trailing slash '/'\n\t\t# be careful about the trailing '/', it bit me once, bitterly\n\t\trootrdir = args\n\t\trootlen = len(rootrdir)\n\t\tdlen = len(remotepath) + 1\n\t\tfor d in dirjs:\n\t\t\tself._remote_dir_contents.get(remotepath[rootlen:]).add(\n\t\t\t\td['path'][dlen:], PathDictTree('D', size = d['size'], md5 = d['md5'] if 'md5' in d else ''))\n\n\t\t# Baidu made another fuck up here:\n\t\t# f['md5'] doesn't have the correct MD5 value, but f['block_list'][0] has\n\t\t# This makes no sense, and I'm not going to change the correct code to adapt its wrong behaviors\n\t\t# --- Code below for reference ---\n\t\t# fmd5 = f['md5']\n\t\t# bl = 'block_list'\n\t\t# if bl in f and f[bl]:\n\t\t# \tfmd5 = f[bl][0]\n\t\t# f['path'][dlen:], PathDictTree('F', size = f['size'], md5 = fmd5))\n\t\tfor f in filejs:\n\t\t\tself._remote_dir_contents.get(remotepath[rootlen:]).add(\n\t\t\t\tf['path'][dlen:], PathDictTree('F', size = f['size'], md5 = f['md5']))\n\n\t\treturn walkresult\n\n\tdef _gather_remote_dir(self, rdir, skip_remote_only_dirs = False):\n\t\tself._remote_dir_contents = PathDictTree()\n\t\tself._walk_proceed_remote_dir(rdir, self._proceed_remote_gather, rdir, skip_remote_only_dirs)\n\t\tself.pd(\"---- Remote Dir Contents ---\")\n\t\tself.pd(self._remote_dir_contents)\n\n\tdef _compare(self, remotedir = None, localdir = None, skip_remote_only_dirs = False):\n\t\tif not localdir:\n\t\t\tlocaldir = '.'\n\n\t\tself.pv(\"Gathering local directory ...\")\n\t\tself._gather_local_dir(localdir)\n\t\tself.pv(\"Done\")\n\t\tself.pv(\"Gathering remote directory ...\")\n\t\tself._gather_remote_dir(remotedir, skip_remote_only_dirs)\n\t\tself.pv(\"Done\")\n\t\tself.pv(\"Comparing ...\")\n\t\t# list merge, where Python shines\n\t\tcommonsame = []\n\t\tcommondiff = []\n\t\tlocalonly = []\n\t\tremoteonly = []\n\t\t# http://stackoverflow.com/questions/1319338/combining-two-lists-and-removing-duplicates-without-removing-duplicates-in-orig\n\t\tlps = self._local_dir_contents.allpath()\n\t\trps = self._remote_dir_contents.allpath()\n\t\tdps = set(rps) - set(lps)\n\t\tallpath = lps + list(dps)\n\t\tfor p in allpath:\n\t\t\tlocal = self._local_dir_contents.get(p)\n\t\t\tremote = self._remote_dir_contents.get(p)\n\t\t\tif local is None: # must be in the remote dir, since p is from allpath\n\t\t\t\tremoteonly.append((remote.type, p))\n\t\t\telif remote is None:\n\t\t\t\tlocalonly.append((local.type, p))\n\t\t\telse: # all here\n\t\t\t\tsame = False\n\t\t\t\tif local.type == 'D' and remote.type == 'D':\n\t\t\t\t\ttype = 'D'\n\t\t\t\t\tsame = True\n\t\t\t\telif local.type == 'F' and remote.type == 'F':\n\t\t\t\t\ttype = 'F'\n\t\t\t\t\tif local.extra['size'] == remote.extra['size'] and \\\n\t\t\t\t\t\t(not self._verify or local.extra['md5'] == remote.extra['md5']):\n\t\t\t\t\t\tsame = True\n\t\t\t\t\telse:\n\t\t\t\t\t\tsame = False\n\t\t\t\telse:\n\t\t\t\t\ttype = local.type + remote.type\n\t\t\t\t\tsame = False\n\n\t\t\t\tif same:\n\t\t\t\t\tcommonsame.append((type, p))\n\t\t\t\telse:\n\t\t\t\t\tcommondiff.append((type, p))\n\n\t\tself.pv(\"Done\")\n\t\treturn commonsame, commondiff, localonly, remoteonly\n\n\tdef compare(self, remotedir = None, localdir = None, skip_remote_only_dirs = False):\n\t\t''' Usage: compare [remotedir] [localdir] - \\\ncompare the remote directory with the local directory\n  remotedir - the remote directory at Baidu Yun (after app's directory). \\\nif not specified, it defaults to the root directory.\n  localdir - the local directory, if not specified, it defaults to the current directory.\n  skip_remote_only_dirs - skip remote-only sub-directories (faster if the remote \\\ndirectory is much larger than the local one). it defaults to False.\n\t\t'''\n\t\tsame, diff, local, remote = self._compare(get_pcs_path(remotedir), localdir, str2bool(skip_remote_only_dirs))\n\n\t\tpr(\"==== Same files ===\")\n\t\tfor c in same:\n\t\t\tpr(\"{} - {}\".format(c[0], c[1]))\n\n\t\tpr(\"==== Different files ===\")\n\t\tfor d in diff:\n\t\t\tpr(\"{} - {}\".format(d[0], d[1]))\n\n\t\tpr(\"==== Local only ====\")\n\t\tfor l in local:\n\t\t\tpr(\"{} - {}\".format(l[0], l[1]))\n\n\t\tpr(\"==== Remote only ====\")\n\t\tfor r in remote:\n\t\t\tpr(\"{} - {}\".format(r[0], r[1]))\n\n\t\tpr(\"\\nStatistics:\")\n\t\tpr(\"--------------------------------\")\n\t\tpr(\"Same: {}\".format(len(same)))\n\t\tpr(\"Different: {}\".format(len(diff)))\n\t\tpr(\"Local only: {}\".format(len(local)))\n\t\tpr(\"Remote only: {}\".format(len(remote)))\n\n\t\tself.result['same'] = same\n\t\tself.result['diff'] = diff\n\t\tself.result['local'] = local\n\t\tself.result['remote'] = remote\n\n\t\treturn const.ENoError\n\n\tdef _syncdown_diff_one(self, rpath, localdir, d):\n\t\tresult = const.ENoError\n\t\tt = d[0]\n\t\tp = d[1]\n\t\t#lcpath = os.path.join(localdir, p) # local complete path\n\t\tlcpath = joinpath(localdir, p) # local complete path\n\t\trcpath = rpath + '/' + p # remote complete path\n\t\tif t == 'DF':\n\t\t\tresult = removedir(lcpath, self.verbose)\n\t\t\tsubresult = self._downfile(rcpath, lcpath)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\telif t == 'FD':\n\t\t\tresult = removefile(lcpath, self.verbose)\n\t\t\tsubresult = makedir(lcpath, verbose = self.verbose)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\telse: # \" t == 'F' \" must be true\n\t\t\tresult = self._downfile(rcpath, lcpath)\n\n\t\treturn result\n\n\tdef _syncdown_remote_one(self, rpath, localdir, r):\n\t\tresult = const.ENoError\n\t\tt = r[0]\n\t\tp = r[1]\n\t\t#lcpath = os.path.join(localdir, p) # local complete path\n\t\tlcpath = joinpath(localdir, p) # local complete path\n\t\trcpath = rpath + '/' + p # remote complete path\n\t\tif t == 'F':\n\t\t\tsubresult = self._downfile(rcpath, lcpath)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\telse: # \" t == 'D' \" must be true\n\t\t\tsubresult = makedir(lcpath, verbose = self.verbose)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\n\t\treturn result\n\n\tdef _syncdown_delete_local(self, localdir, local):\n\t\tresult = const.ENoError\n\t\tfor l in local:\n\t\t\t# use os.path.isfile()/isdir() instead of l[0], because we need to check file/dir existence.\n\t\t\t# as we may have removed the parent dir previously during the iteration\n\t\t\t#p = os.path.join(localdir, l[1])\n\t\t\tp = joinpath(localdir, l[1])\n\t\t\tif os.path.isfile(p):\n\t\t\t\tsubresult = removefile(p, self.verbose)\n\t\t\t\tif subresult != const.ENoError:\n\t\t\t\t\tresult = subresult\n\t\t\telif os.path.isdir(p):\n\t\t\t\tsubresult = removedir(p, self.verbose)\n\t\t\t\tif subresult != const.ENoError:\n\t\t\t\t\tresult = subresult\n\n\t\treturn result\n\n\tdef _syncdown_single(self, rpath, localdir, compare_result):\n\t\tresult = const.ENoError\n\t\tsame, diff, local, remote = compare_result\n\t\t# clear the way\n\t\tfor d in diff:\n\t\t\tsubresult = self._syncdown_diff_one(rpath, localdir, d)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\tfor r in remote:\n\t\t\tsubresult = self._syncdown_remote_one(rpath, localdir, r)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\treturn result\n\n\tdef _syncdown_multi(self, rpath, localdir, compare_result):\n\t\tresult = const.ENoError\n\t\tsame, diff, local, remote = compare_result\n\t\t# clear the way\n\t\tworker = partial(self._syncdown_diff_one, rpath, localdir)\n\t\tsubresult = self._multi_process(worker, diff, \"Sync down\")\n\t\tif subresult != const.ENoError:\n\t\t\tresult = subresult\n\t\tworker = partial(self._syncdown_remote_one, rpath, localdir)\n\t\tsubresult = self._multi_process(worker, remote, \"\")\n\t\tif subresult != const.ENoError:\n\t\t\tresult = subresult\n\t\treturn result\n\n\tdef syncdown(self, remotedir = '', localdir = '', deletelocal = False):\n\t\t''' Usage: syncdown [remotedir] [localdir] [deletelocal] - \\\nsync down from the remote directory to the local directory\n  remotedir - the remote directory at Baidu Yun (after app's directory) to sync from. \\\nif not specified, it defaults to the root directory\n  localdir - the local directory to sync to if not specified, it defaults to the current directory.\n  deletelocal - delete local files that are not inside Baidu Yun directory, default is False\n\t\t'''\n\t\tresult = const.ENoError\n\t\trpath = get_pcs_path(remotedir)\n\t\tcompare_result = self._compare(rpath, localdir, False)\n\t\tsame, diff, local, remote = compare_result\n\t\tif Pool and self.processes > 1:\n\t\t\tsubresult = self._syncdown_multi(rpath, localdir, compare_result)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\telse:\n\t\t\tsubresult = self._syncdown_single(rpath, localdir, compare_result)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\tif str2bool(deletelocal):\n\t\t\tsubresult = self._syncdown_delete_local(localdir, local)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\n\t\tif result == const.ENoError:\n\t\t\tself._remove_remote_on_success(rpath)\n\t\treturn result\n\n\tdef _syncup_diff_one(self, rpath, localdir, d):\n\t\tresult = const.ENoError\n\t\tt = d[0] # type\n\t\tp = d[1] # path\n\t\t#lcpath = os.path.join(localdir, p) # local complete path\n\t\tlcpath = joinpath(localdir, p) # local complete path\n\t\trcpath = rpath + '/' + p # remote complete path\n\t\tif self.shalloverwrite(\"Do you want to overwrite '{}' at Baidu Yun? [y/N]\".format(p)):\n\t\t\t# this path is before get_pcs_path() since delete() expects so.\n\t\t\t#result = self.delete(rpartialdir + '/' + p)\n\t\t\tresult = self._delete(rcpath)\n#\t\t\t\tself.pd(\"diff type: {}\".format(t))\n#\t\t\t\tself._isrev = True\n#\t\t\t\tif t != 'F':\n#\t\t\t\t\tresult = self.move(remotedir + '/' + p, remotedir + '/' + p + '.moved_by_bypy.' + time.strftime(\"%Y%m%d%H%M%S\"))\n#\t\t\t\t\tself._isrev = False\n\t\t\tif t == 'F' or t == 'FD':\n\t\t\t\tsubresult = self._upload_file(lcpath, rcpath)\n\t\t\t\tif subresult != const.ENoError:\n\t\t\t\t\tresult = subresult\n\t\t\telse: # \" t == 'DF' \" must be true\n\t\t\t\tsubresult = self._mkdir(rcpath)\n\t\t\t\tif subresult != const.ENoError and subresult != const.IEFileAlreadyExists:\n\t\t\t\t\tresult = subresult\n\t\telse:\n\t\t\tpinfo(\"Uploading '{}' skipped\".format(lcpath))\n\n\t\treturn result\n\n\tdef _syncup_local_one(self, rpath, localdir, l):\n\t\tresult = const.ENoError\n\t\tt = l[0]\n\t\tp = l[1]\n\t\t#lcpath = os.path.join(localdir, p) # local complete path\n\t\tlcpath = joinpath(localdir, p) # local complete path\n\t\trcpath = rpath + '/' + p # remote complete path\n\t\tself.pd(\"local type: {}\".format(t))\n\t\tself._isrev = False\n\t\tif t == 'F':\n\t\t\tsubresult = self._upload_file(lcpath, rcpath)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\telse: # \" t == 'D' \" must be true\n\t\t\tsubresult = self._mkdir(rcpath)\n\t\t\tif subresult != const.ENoError and subresult != const.IEFileAlreadyExists:\n\t\t\t\tresult = subresult\n\n\t\treturn result\n\n\tdef _syncup_delete_remote(self, rpath, remote):\n\t\tresult = const.ENoError\n\t\t# i think the list is built top-down, so directories appearing later are either\n\t\t# children or another set of directories\n\t\tpp = '\\\\' # previous path, setting to '\\\\' make sure it won't be found in the first step\n\t\tfor r in remote:\n\t\t\t#p = rpartialdir + '/' + r[1]\n\t\t\tp = rpath + '/' + r[1]\n\t\t\tif 0 != p.find(pp): # another path\n\t\t\t\t#subresult = self.delete(p)\n\t\t\t\tsubresult = self._delete(p)\n\t\t\t\tif subresult != const.ENoError:\n\t\t\t\t\tresult = subresult\n\t\t\tpp = p\n\n\t\treturn result\n\n\tdef _syncup_single(self, localdir, rpath, compare_result):\n\t\tresult = const.ENoError\n\t\tsame, diff, local, remote = compare_result\n\t\t# clear the way\n\t\tfor d in diff:\n\t\t\tsubresult = self._syncup_diff_one(rpath, localdir, d)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\tfor l in local:\n\t\t\tsubresult = self._syncup_local_one(rpath, localdir, l)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\treturn result\n\n\tdef _syncup_multi(self, localdir, rpath, compare_result):\n\t\tresult = const.ENoError\n\t\tsame, diff, local, remote = compare_result\n\t\t# clear the way\n\t\tworker = partial(self._syncup_diff_one, rpath, localdir)\n\t\tsubresult = self._multi_process(worker, diff, \"Sync up\")\n\t\tif subresult != const.ENoError:\n\t\t\tresult = subresult\n\t\tworker = partial(self._syncup_local_one, rpath, localdir)\n\t\tsubresult = self._multi_process(worker, local, \"\")\n\t\tif subresult != const.ENoError:\n\t\t\tresult = subresult\n\t\treturn result\n\n\tdef syncup(self, localdir = '', remotedir = '', deleteremote = False):\n\t\t''' Usage: syncup [localdir] [remotedir] [deleteremote] - \\\nsync up from the local directory to the remote directory\n  localdir - the local directory to sync from if not specified, it defaults to the current directory.\n  remotedir - the remote directory at Baidu Yun (after app's directory) to sync to. \\\nif not specified, it defaults to the root directory\n  deleteremote - delete remote files that are not inside the local directory, default is False\n\t\t'''\n\t\tresult = const.ENoError\n\t\trpath = get_pcs_path(remotedir)\n\t\t#rpartialdir = remotedir.rstrip('/ ')\n\t\tcompare_result = self._compare(rpath, localdir, True)\n\t\tsame, diff, local, remote = compare_result\n\t\tif Pool and self.processes > 1:\n\t\t\tsubresult = self._syncup_multi(localdir, rpath, compare_result)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\telse:\n\t\t\tsubresult = self._syncup_single(localdir, rpath, compare_result)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\tif str2bool(deleteremote):\n\t\t\tsubresult = self._syncup_delete_remote(rpath, remote)\n\t\t\tif subresult != const.ENoError:\n\t\t\t\tresult = subresult\n\t\tif result == const.ENoError:\n\t\t\tself._remove_local_on_success(localdir)\n\t\treturn result\n\n\tdef dumpcache(self):\n\t\t''' Usage: dumpcache - display file hash cache'''\n\t\tif cached.cacheloaded:\n\t\t\t#pprint.pprint(cached.cache)\n\t\t\tMyPrettyPrinter().pprint(cached.cache)\n\t\t\treturn const.ENoError\n\t\telse:\n\t\t\tperr(\"Cache not loaded.\")\n\t\t\treturn const.ECacheNotLoaded\n\n\tdef cleancache(self):\n\t\t''' Usage: cleancache - remove invalid entries from hash cache file'''\n\t\tif os.path.exists(self._hashcachepath):\n\t\t\ttry:\n\t\t\t\t# backup first\n\t\t\t\tbackup = self._hashcachepath + '.lastclean'\n\t\t\t\tshutil.copy(self._hashcachepath, backup)\n\t\t\t\tself.pd(\"Hash Cache file '{}' backed up as '{}\".format(\n\t\t\t\t\tself._hashcachepath, backup))\n\t\t\t\tcached.cleancache()\n\t\t\t\treturn const.ENoError\n\t\t\texcept Exception as ex:\n\t\t\t\tperr(formatex(ex))\n\t\t\t\treturn const.EException\n\t\telse:\n\t\t\treturn const.EFileNotFound\n\n\tdef _cdl_act(self, r, args):\n\t\ttry:\n\t\t\tpr(pprint.pformat(r.json()))\n\t\t\treturn const.ENoError\n\t\texcept:\n\t\t\tpr(pprint.pformat({ 'text': rb(r.text) }))\n\t\t\treturn const.IETaskNotFound\n\n\tdef _prepare_cdl_add(self, source_url, rpath, timeout):\n\t\tpr(\"Adding cloud download task:\")\n\t\tpr(\"{} =cdl=> {}\".format(source_url, rpath))\n\t\tpars = {\n\t\t\t'method': 'add_task',\n\t\t\t'source_url': source_url,\n\t\t\t'save_path': rpath,\n\t\t\t'timeout': 3600 }\n\t\treturn pars\n\n\tdef _cdl_add(self, source_url, rpath, timeout):\n\t\tpars = self._prepare_cdl_add(source_url, rpath, timeout)\n\t\treturn self._post(pcsurl + 'services/cloud_dl', pars, self._cdl_act)\n\n\tdef _get_cdl_dest(self, source_url, save_path):\n\t\trpath = get_pcs_path(save_path)\n\t\t# download to /apps/bypy root\n\t\tif rpath == const.AppPcsPath \\\n\t\t\tor (const.ENoError == self._get_file_info(rpath) \\\n\t\t\t\tand self._remote_json['isdir']):\n\t\t\tfilename = source_url.split('/')[-1]\n\t\t\trpath += '/' + filename\n\t\treturn rpath\n\n\tdef cdl_add(self, source_url, save_path = '/', timeout = 3600):\n\t\t''' Usage: cdl_add <source_url> [save_path] [timeout] - add an offline (cloud) download task\n  source_url - the URL to download file from.\n  save_path - path on PCS to save file to. default is to save to root directory '/'.\n  timeout - timeout in seconds. default is 3600 seconds.\n\t\t'''\n\t\trpath = self._get_cdl_dest(source_url, save_path)\n\t\treturn self._cdl_add(source_url, rpath, timeout)\n\n\tdef _get_cdl_query_pars(self, task_ids, op_type):\n\t\tpars = {\n\t\t\t'method': 'query_task',\n\t\t\t'task_ids': task_ids,\n\t\t\t'op_type': op_type}\n\t\treturn pars\n\n\tdef _cdl_query(self, task_ids, op_type):\n\t\tpars =  self._get_cdl_query_pars(task_ids, op_type)\n\t\treturn self._post(pcsurl + 'services/cloud_dl', pars, self._cdl_act)\n\n\tdef cdl_query(self, task_ids, op_type = 1):\n\t\t''' Usage: cdl_query <task_ids>  - query existing offline (cloud) download tasks\n  task_ids - task ids seperated by comma (,).\n  op_type - 0 for task info; 1 for progress info. default is 1\n\t\t'''\n\t\treturn self._cdl_query(task_ids, op_type)\n\n\tdef _cdl_mon_act(self, r, args):\n\t\ttry:\n\t\t\ttask_id, start_time, done = args\n\t\t\tj = r.json()\n\t\t\tti = j['task_info'][str(task_id)]\n\t\t\tif ('file_size' not in ti) or ('finished_size' not in ti):\n\t\t\t\tdone[0] = True\n\t\t\t\tpr(j)\n\t\t\telse:\n\t\t\t\ttotal = int(ti['file_size'])\n\t\t\t\tfinish = int(ti['finished_size'])\n\t\t\t\tdone[0] = (total != 0 and (total == finish))\n\t\t\t\tpprgr(finish, total, start_time)\n\t\t\t\tif done[0]:\n\t\t\t\t\tpr(pprint.pformat(j))\n\t\t\treturn const.ENoError\n\t\texcept Exception as ex:\n\t\t\tperr(\"Exception while monitoring offline (cloud) download task:\\n{}\".format(formatex(ex)))\n\t\t\tperr(\"Baidu returned:\\n{}\".format(rb(r.text)))\n\t\t\treturn const.EInvalidJson\n\n\tdef _cdl_addmon_act(self, r, args):\n\t\ttry:\n\t\t\targs[0] = r.json()\n\t\t\tpr(pprint.pformat(args[0]))\n\t\t\treturn const.ENoError\n\t\texcept Exception as ex:\n\t\t\tperr(\"Exception while adding offline (cloud) download task:\\n{}\".format(formatex(ex)))\n\t\t\tperr(\"Baidu returned:\\n{}\".format(rb(r.text)))\n\t\t\treturn const.EInvalidJson\n\n\tdef _cdl_sighandler(self, signum, frame):\n\t\tpr(\"Cancelling offline (cloud) download task: {}\".format(self._cdl_task_id))\n\t\tresult = self._cdl_cancel(self._cdl_task_id)\n\t\tpr(\"Result: {}\".format(result))\n\t\tsys.exit(const.EAbort)\n\n\tdef _cdl_addmon(self, source_url, rpath, timeout = 3600):\n\t\tpars = self._prepare_cdl_add(source_url, rpath, timeout)\n\t\tjc = [{}] # out param\n\t\tresult = self._post(pcsurl + 'services/cloud_dl',\n\t\t\tpars, self._cdl_addmon_act, jc)\n\t\tif result == const.ENoError:\n\t\t\tif not 'task_id' in jc[0]:\n\t\t\t\treturn const.EInvalidJson\n\t\t\ttask_id = jc[0]['task_id']\n\t\t\tpars = self._get_cdl_query_pars(task_id, 1)\n\t\t\tstart_time = time.time()\n\t\t\tdone = [ False ] # out param\n\t\t\t# cancel task on Ctrl-C\n\t\t\tpr(\"Press Ctrl-C to cancel the download task\")\n\t\t\tself._cdl_task_id = task_id\n\t\t\tsetsighandler(signal.SIGINT, self._cdl_sighandler)\n\t\t\tsetsighandler(signal.SIGHUP, self._cdl_sighandler)\n\t\t\ttry:\n\t\t\t\twhile True:\n\t\t\t\t\tresult = self._post(\n\t\t\t\t\t\tpcsurl + 'services/cloud_dl', pars, self._cdl_mon_act,\n\t\t\t\t\t\t(task_id, start_time, done))\n\t\t\t\t\tif result == const.ENoError:\n\t\t\t\t\t\tif done[0] == True:\n\t\t\t\t\t\t\treturn const.ENoError\n\t\t\t\t\telse:\n\t\t\t\t\t\treturn result\n\t\t\t\t\ttime.sleep(5)\n\t\t\texcept KeyboardInterrupt:\n\t\t\t\tpr(\"Canceling offline (cloud) downloa task: {}\".format(task_id))\n\t\t\t\tself._cdl_cancel(task_id)\n\t\t\t\treturn const.EAbort\n\t\telse:\n\t\t\treturn result\n\n\tdef cdl_addmon(self, source_url, save_path = '/', timeout = 3600):\n\t\t''' Usage: cdl_addmon <source_url> [save_path] [timeout] - add an offline (cloud) download task and monitor the download progress\n  source_url - the URL to download file from.\n  save_path - path on PCS to save file to. default is to save to root directory '/'.\n  timeout - timeout in seconds. default is 3600 seconds.\n\t\t'''\n\t\trpath = self._get_cdl_dest(source_url, save_path)\n\t\treturn self._cdl_addmon(source_url, rpath, timeout)\n\n\tdef _cdl_list(self):\n\t\tpars = {\n\t\t\t'method': 'list_task' }\n\t\treturn self._post(pcsurl + 'services/cloud_dl', pars, self._cdl_act)\n\n\tdef cdl_list(self):\n\t\t''' Usage: cdl_list - list offline (cloud) download tasks\n\t\t'''\n\t\treturn self._cdl_list()\n\n\tdef _cdl_cancel(self, task_id):\n\t\tpars = {\n\t\t\t'method': 'cancel_task',\n\t\t\t'task_id': task_id }\n\t\treturn self._post(pcsurl + 'services/cloud_dl', pars, self._cdl_act)\n\n\tdef cdl_cancel(self, task_id):\n\t\t''' Usage: cdl_cancel <task_id>  - cancel an offline (cloud) download task\n  task_id - id of the task to be canceled.\n\t\t'''\n\t\treturn self._cdl_cancel(task_id)\n\n\tdef _get_accept_cmd(self, rpath):\n\t\tmd5str = self._current_file_md5\n\t\tslicemd5str =  self._current_file_slice_md5\n\t\tcrcstr = hex(self._current_file_crc32)\n\t\tremotepath = rpath[const.AppPcsPathLen:]\n\t\tif len(remotepath) == 0:\n\t\t\tremotepath = 'PATH_NAME_MISSING'\n\t\tcmd = \"bypy accept {} {} {} {} {}\".format(\n\t\t\tremotepath, self._current_file_size, md5str, slicemd5str, crcstr)\n\t\treturn cmd\n\n\tdef _share_local_file(self, lpath, rpath, fast):\n\t\tfilesize = getfilesize(lpath)\n\t\tif filesize < const.MinRapidUploadFileSize:\n\t\t\tperr(\"File size ({}) of '{}' is too small (must be greater or equal than {}) to be shared\".format(\n\t\t\t\thuman_size(filesize), lpath, human_size(const.MinRapidUploadFileSize)))\n\t\t\treturn const.EParameter\n\n\t\tif fast:\n\t\t\tself._get_hashes_for_rapidupload(lpath, setlocalfile = True)\n\t\t\tpr(self._get_accept_cmd(rpath))\n\t\t\treturn const.ENoError\n\n\t\tulrpath = const.RemoteTempDir + '/' + posixpath.basename(lpath)\n\t\tresult = self._upload_file(lpath, ulrpath)\n\t\tif result != const.ENoError:\n\t\t\tperr(\"Unable to share as uploading failed\")\n\t\t\treturn result\n\n\t\tif not self._rapiduploaded:\n\t\t\ti = 0\n\t\t\twhile i < const.ShareRapidUploadRetries:\n\t\t\t\ti += 1\n\t\t\t\tresult = self._rapidupload_file(lpath, ulrpath, setlocalfile = True)\n\t\t\t\tif result == const.ENoError: # or result == IEMD5NotFound: # retrying if MD5 not found _may_ make the file available?\n\t\t\t\t\tbreak\n\t\t\t\telse:\n\t\t\t\t\tself.pd(\"Retrying #{} for sharing '{}'\".format(i, lpath))\n\t\t\t\t\ttime.sleep(1)\n\n\t\tif result == const.ENoError:\n\t\t\tpr(self._get_accept_cmd(rpath))\n\t\t\treturn const.ENoError\n\t\telif result == const.IEMD5NotFound:\n\t\t\tpr(\"# Sharing (RapidUpload) not possible for '{}', error: {}\".format(lpath, result))\n\t\t\treturn result\n\t\telse:\n\t\t\tpr(\"# Error sharing '{}', error: {}\".format(lpath, result))\n\t\t\treturn result\n\n\tdef _share_local_dir(self, lpath, rpath, fast):\n\t\tresult = const.ENoError\n\t\tfor walk in self._walk_normal_file(lpath):\n\t\t\t(dirpath, dirnames, filenames) = walk\n\t\t\tfor filename in filenames:\n\t\t\t\trpart = os.path.relpath(dirpath, lpath)\n\t\t\t\tif rpart == '.':\n\t\t\t\t\trpart = ''\n\t\t\t\tsubr = self._share_local_file(\n\t\t\t\t\tjoinpath(dirpath, filename),\n\t\t\t\t\tposixpath.join(rpath, rpart, filename),\n\t\t\t\t\tfast)\n\t\t\t\tif subr != const.ENoError:\n\t\t\t\t\tresult = subr\n\t\treturn result\n\n\t# assuming the caller asks once only\n\tdef _ok_to_use_remote_temp_dir(self):\n\t\tif const.SettingKey_OverwriteRemoteTempDir in self._setting and \\\n\t\tself._setting[const.SettingKey_OverwriteRemoteTempDir]:\n\t\t\treturn True\n\n\t\t# need to check existence of the remote temp dir\n\t\tfir = self._get_file_info(const.RemoteTempDir)\n\t\tif fir == const.ENoError: # path exists\n\t\t\tmsg = '''\nIn order to use this functionality, we need to use a temporary directory '{}' \\\nat Baidu Cloud Storage. However, this remote path exists already.\nIs it OK to empty this directory? (Unless coincidentally you uploaded files there, \\\nit's probably safe to allow this)\ny/N/a (yes/NO/always)?\n'''.format(const.RemoteTempDir).strip()\n\t\t\tans = ask(msg).lower()\n\t\t\tif len(ans) >= 0:\n\t\t\t\ta = ans[0]\n\t\t\t\tif a == 'y':\n\t\t\t\t\treturn True\n\t\t\t\telif a == 'a':\n\t\t\t\t\t# persist\n\t\t\t\t\tself._setting[const.SettingKey_OverwriteRemoteTempDir] = True\n\t\t\t\t\tself.savesetting()\n\t\t\t\t\treturn True\n\t\t\t\telse:\n\t\t\t\t\treturn False\n\t\t\telse:\n\t\t\t\treturn False\n\t\telif fir == const.EFileNotFound:\n\t\t\treturn True\n\t\telif fir == const.ERequestFailed:\n\t\t\tperr(\"Request to get info of the remote temp dir '{}' failed, can't continue.\".format(const.RemoteTempDir))\n\t\t\treturn False\n\t\telse:\n\t\t\tassert 0 == \"Future work handling (more return code) needed\"\n\t\t\treturn False\n\n\tdef _share_local(self, lpath, rpath, fast):\n\t\tif not os.path.exists(lpath):\n\t\t\tperr(\"Local path '{}' does not exist.\".format(lpath))\n\t\t\treturn const.EParameter\n\n\t\tif not self._ok_to_use_remote_temp_dir():\n\t\t\tperr(\"Can't continue unless you allow the program to use the remote temporary directory '{}'\".format(const.RemoteTempDir))\n\t\t\treturn const.EUserRejected\n\n\t\tif fast:\n\t\t\tpr(\"# fast (unverified) sharing, no network I/O needed (for local sharing), but the other person may not be able to accept some of your files\")\n\t\tif os.path.isfile(lpath):\n\t\t\t# keep the same file name\n\t\t\tlname = os.path.basename(lpath)\n\t\t\trfile = joinpath(rpath, lname, '/')\n\t\t\treturn self._share_local_file(lpath, rfile, fast)\n\t\telif os.path.isdir(lpath):\n\t\t\treturn self._share_local_dir(lpath, rpath, fast)\n\t\telse:\n\t\t\tperr(\"Local path '{}' is not a file or directory.\".format(lpath))\n\t\t\treturn const.EParameter\n\n\tdef _share_remote_file(self, tmpdir, rpath, srpath, fast):\n\t\trdir, rfile = posixpath.split(rpath)\n\t\tlpath = joinpath(tmpdir, rfile)\n\t\tsubr = self._downfile(rpath, lpath)\n\t\tif subr != const.ENoError:\n\t\t\tperr(\"Fatal: Error {} while downloading remote file '{}'\".format(subr, rpath))\n\t\t\treturn subr\n\n\t\treturn self._share_local_file(lpath, srpath, fast)\n\n\tdef _proceed_share_remote(self, walkresult, rpath, dirjs, filejs, args):\n\t\tremoterootlen, tmpdir, srpath, fast = args\n\t\tresult = walkresult\n\t\tfor filej in filejs:\n\t\t\trfile = filej['path']\n\t\t\tsubr = self._share_remote_file(tmpdir, rfile, joinpath(srpath, rfile[remoterootlen:], sep = '/'), fast)\n\t\t\tif subr != const.ENoError:\n\t\t\t\tresult = subr\n\t\treturn result\n\n\tdef _share_remote_dir(self, tmpdir, rpath, srpath, fast):\n\t\treturn self._walk_proceed_remote_dir(rpath, self._proceed_share_remote, (len(rpath), tmpdir, srpath, fast))\n\n\tdef _share_remote(self, tmpdir, rpath, srpath, fast): # srpath - share remote path (full path)\n\t\tsubr = self._get_file_info(rpath)\n\t\tif const.ENoError == subr:\n\t\t\tif 'isdir' in self._remote_json:\n\t\t\t\tif self._remote_json['isdir']:\n\t\t\t\t\treturn self._share_remote_dir(tmpdir, rpath, srpath, fast)\n\t\t\t\telse:\n\t\t\t\t\treturn self._share_remote_file(tmpdir, rpath, srpath, fast)\n\t\t\telse:\n\t\t\t\tperr(\"Malformed path info JSON '{}' returned\".format(self._remote_json))\n\t\t\t\treturn const.EFatal\n\t\telif const.EFileNotFound == subr:\n\t\t\tperr(\"Remote path '{}' does not exist\".format(rpath))\n\t\t\treturn subr\n\t\telse:\n\t\t\tperr(\"Error {} while getting info for remote path '{}'\".format(subr, rpath))\n\t\t\treturn subr\n\n\tdef share(self, path = '.', sharepath = '/', islocal = True, fast = False):\n\t\tislocal = str2bool(islocal)\n\t\tfast = str2bool(fast)\n\t\tif islocal:\n\t\t\tlpath = path\n\t\t\trpath = get_pcs_path(sharepath)\n\t\t\tresult = self._share_local(lpath, rpath, fast)\n\t\t\tif not fast:\n\t\t\t\t# not critical\n\t\t\t\tself._delete(const.RemoteTempDir)\n\t\t\treturn result\n\t\telse:\n\t\t\trpath = get_pcs_path(path)\n\t\t\tsrpath = get_pcs_path(sharepath)\n\t\t\ttmpdir = tempfile.mkdtemp(prefix = 'bypy_')\n\t\t\tself.pd(\"Using local temporary directory '{}' for sharing\".format(tmpdir))\n\t\t\ttry:\n\t\t\t\tresult = self._share_remote(tmpdir, rpath, srpath, fast)\n\t\t\texcept Exception as ex:\n\t\t\t\tresult = const.EFatal\n\t\t\t\tperr(\"Exception while sharing remote path '{}'.\\n{}\".format(\n\t\t\t\t\trpath, formatex(ex)))\n\t\t\tfinally:\n\t\t\t\tremovedir(tmpdir)\n\t\t\treturn result\n\n\tdef _accept(self, rpath, size, md5str, slicemd5str, crcstr):\n\t\t# we have no file to verify against\n\t\tverify = self._verify\n\t\tself._verify = False\n\t\tresult = self._rapidupload_file_post(rpath, size, md5str, slicemd5str, crcstr)\n\t\tself._verify = verify\n\t\tif result == const.ENoError:\n\t\t\tself.pv(\"Accepted: {}\".format(rpath))\n\t\telse:\n\t\t\tperr(\"Unable to accept: {}, Error: {}\".format(rpath, result))\n\t\treturn result\n\n\tdef accept(self, remotepath, size, md5str, slicemd5str, crcstr):\n\t\trpath = get_pcs_path(remotepath)\n\t\treturn self._accept(rpath, size, md5str, slicemd5str, crcstr)\n\n\tdef _locate_fastest_upload_server_act(self, r, args):\n\t\tglobal cpcsurl\n\t\tj = r.json()\n\t\tcpcsurl = j['host']\n\t\treturn const.ENoError\n\n\t# public Baidu API, no token needed, and not much useful. #127\n\tdef _locate_fastest_upload_server(self):\n\t\turl = const.PcsUrl + 'file'\n\t\tpars = { 'method': 'locateupload'}\n\t\treturn self._get(url, pars, self._locate_fastest_upload_server_act, addtoken = False)\n\n\tdef _list_pcs_hosts_act(self, r, args):\n\t\tj = r.json()\n\t\tpr(pprint.pformat(j))\n\t\treturn const.ENoError\n\n\tdef _list_pcs_hosts(self):\n\t\turl = const.PcsUrl + 'manage'\n\t\tpars = { 'method': 'listhost'}\n\t\treturn self._get(url, pars, self._list_pcs_hosts_act, addtoken = False)\n\n\tdef _test_speed(self, url, repeats = 1):\n\t\tself.pd(\"Speed testing (GET) ({}x): {}\".format(repeats, url))\n\t\tstart = time.time()\n\t\tfor i in range(repeats):\n\t\t\trequests.get(url)\n\t\tstop = time.time()\n\t\tduration = stop - start\n\t\tself.pd(\"Time taken: {:.3f}s\".format(duration))\n\t\treturn duration\n\n\tdef _select_fastest_mirror_act(self, r, args):\n\t\tpr(\"Selecting fastest mirror\")\n\t\tj = r.json()\n\t\tself.pv(\"List of PCS mirrors:\\n\" + pprint.pformat(j))\n\t\tif 'path' not in j:\n\t\t\treturn const.EInvalidJson\n\t\tpcspath = j['path']\n\t\tif 'list' not in j:\n\t\t\treturn const.EInvalidJson\n\t\thosts = j['list']\n\t\tif len(hosts) < 1:\n\t\t\treturn const.EInvalidJson\n\t\tselected_host = hosts[0]['host']\n\t\tshortest_time = float('inf')\n\t\tfor h in hosts:\n\t\t\thost = h['host']\n\t\t\ttry:\n\t\t\t\ttime_taken = self._test_speed('https://' + host + pcspath, 3)\n\t\t\t\tif time_taken < shortest_time:\n\t\t\t\t\tselected_host = host\n\t\t\t\t\tshortest_time = time_taken\n\t\t\texcept Exception as ex:\n\t\t\t\tperr(\"Error while testing speed of {}: {}, skipping.\".format(host, formatex(ex)))\n\t\t\t\tcontinue\n\t\tpr(\"Selected mirror: \" + selected_host)\n\t\tself.setpcsurl(selected_host)\n\t\treturn const.ENoError\n\n\tdef _select_fastest_mirror(self):\n\t\turl = const.PcsUrl + 'manage'\n\t\tpars = { 'method': 'listhost'}\n\t\treturn self._get(url, pars, self._select_fastest_mirror_act, addtoken = False)\n\ndef sighandler(signum, frame):\n\tpr(\"Signal {} received, Abort\".format(signum))\n\tsys.exit(const.EAbort)\n\n# http://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html\ndef setsighandler(signum, handler):\n\toldhandler = signal.signal(signum, handler)\n\tif oldhandler == signal.SIG_IGN:\n\t\tsignal.signal(signum, signal.SIG_IGN)\n\treturn oldhandler\n\ndef setuphandlers():\n\tif iswindows():\n\t\t# setsighandler(signal.CTRL_C_EVENT, sighandler)\n\t\t# setsighandler(signal.CTRL_BREAK_EVENT, sighandler)\n\t\t# bug, see: http://bugs.python.org/issue9524\n\t\tpass\n\telse:\n\t\tsetsighandler(signal.SIGBUS, sighandler)\n\t\tsetsighandler(signal.SIGHUP, sighandler)\n\t\t# https://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-properly\n\t\tsetsighandler(signal.SIGPIPE, signal.SIG_IGN)\n\t\tsetsighandler(signal.SIGQUIT, sighandler)\n\t\tsetsighandler(signal.SIGSYS, sighandler)\n\tsetsighandler(signal.SIGABRT, sighandler)\n\tsetsighandler(signal.SIGFPE, sighandler)\n\tsetsighandler(signal.SIGILL, sighandler)\n\tsetsighandler(signal.SIGINT, sighandler)\n\tsetsighandler(signal.SIGSEGV, sighandler)\n\tsetsighandler(signal.SIGTERM, sighandler)\n\ndef getparser():\n\t#name = os.path.basename(sys.argv[0])\n\tversion = \"v%s\" % const.__version__\n\tversion_message = '%%(prog)s %s' % (version)\n\tdesc = \"{} - {}\".format(version_message, const.__desc__)\n\n\t# setup argument parser\n\tepilog = \"Commands:\\n\"\n\tsummary = []\n\tfor k, v in ByPy.__dict__.items():\n\t\tif callable(v):\n\t\t\tif v.__doc__:\n\t\t\t\thelp = v.__doc__.strip()\n\t\t\t\tpos = help.find(const.HelpMarker)\n\t\t\t\tif pos != -1:\n\t\t\t\t\tpos_body = pos + len(const.HelpMarker)\n\t\t\t\t\thelpbody = help[pos_body:]\n\t\t\t\t\thelpline = helpbody.split('\\n')[0].strip() + '\\n'\n\t\t\t\t\tif helpline.find('help') == 0:\n\t\t\t\t\t\tsummary.insert(0, helpline)\n\t\t\t\t\telse:\n\t\t\t\t\t\tsummary.append(helpline)\n\t\t\t\t\t#commands.append(v.__name__) # append command name\n\n\tremaining = summary[1:]\n\tremaining.sort()\n\tsummary = [summary[0]] + remaining\n\tepilog += ''.join(summary)\n\n\tparser = ArgumentParser(\n\t\tprog = const.__title__,\n\t\tdescription=desc,\n\t\tformatter_class=RawDescriptionHelpFormatter, epilog=epilog)\n\n\t# help, version, program information etc\n\tparser.add_argument('-V', '--version', action='version', version=version_message)\n\n\t# debug, logging\n\tparser.add_argument(\"-d\", \"--debug\",\n\t\tdest=\"debug\", action=\"count\", default=0,\n\t\thelp=\"set debugging level (-dd to increase debugging level, -ddd to enable HTPP traffic debugging as well (very talkative)) [default: %(default)s]\")\n\tparser.add_argument(\"-v\", \"--verbose\", dest=\"verbose\", default=0, action=\"count\", help=\"set verbosity level [default: %(default)s]\")\n\n\t# program tunning, configration (those will be passed to class ByPy)\n\tparser.add_argument(\"-r\", \"--retry\",\n\t\tdest=\"retry\", default=5, type=int,\n\t\thelp=\"number of retry attempts on network error [default: %(default)i times]\")\n\tparser.add_argument(\"-q\", \"--quit-when-fail\",\n\t\tdest=\"quit\", action=\"store_true\",\n\t\thelp=\"quit when maximum number of retry failed [default: %(default)s]\")\n\tparser.add_argument(\"-t\", \"--timeout\",\n\t\tdest=\"timeout\", default=const.DefaultTimeOutInSeconds, type=float,\n\t\thelp=\"network timeout in seconds [default: %(default)s]\")\n\tparser.add_argument(\"-s\", \"--slice\",\n\t\tdest=\"slice\", default=const.DefaultSliceSize,\n\t\thelp=\"size of file upload slice (can use '1024', '2k', '3MB', etc) [default: {} MB]\".format(const.DefaultSliceInMB))\n\tparser.add_argument(\"--chunk\",\n\t\tdest=\"chunk\", default=const.DefaultDlChunkSize,\n\t\thelp=\"size of file download chunk (can use '1024', '2k', '3MB', etc) [default: {} MB]\".format(const.DefaultDlChunkSize // const.OneM))\n\tparser.add_argument(\"-e\", \"--verify\",\n\t\tdest=\"verify\", action=\"store_true\",\n\t\thelp=\"verify upload / download [default : %(default)s]\")\n\tparser.add_argument(\"-f\", \"--force-hash\",\n\t\tdest=\"forcehash\", action=\"store_true\",\n\t\thelp=\"force file MD5 / CRC32 calculation instead of using cached value\")\n\tparser.add_argument(\"--no-resume-download\",\n\t\tdest=\"resumedl\", action=\"store_false\",\n\t\thelp=\"resume instead of restarting when downloading if local file already exists [default: %(default)s]\")\n\tparser.add_argument(\"--include-regex\",\n\t\tdest=\"incregex\", default='',\n\t\thelp=\"regular expression of files to include. if not specified (default), everything is included. for download, the regex applies to the remote files; for upload, the regex applies to the local files. to exclude files, think about your regex, some tips here: https://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word [default: %(default)s]\")\n\tparser.add_argument(\"--on-dup\",\n\t\tdest=\"ondup\", default='overwrite',\n\t\thelp=\"what to do when the same file / folder exists in the destination: 'overwrite', 'skip', 'prompt' [default: %(default)s]\")\n\tparser.add_argument(\"--no-symlink\",\n\t\tdest=\"followlink\", action=\"store_false\",\n\t\thelp=\"DON'T follow symbol links when uploading / syncing up\")\n\tparser.add_argument(const.DisableSslCheckOption,\n\t\tdest=\"checkssl\", action=\"store_false\",\n\t\thelp=\"DON'T verify host SSL cerificate\")\n\tparser.add_argument(const.CaCertsOption,\n\t\tdest=\"cacerts\", default=None,\n\t\thelp=\"Specify the path for CA Bundle [default: %(default)s]\")\n\tparser.add_argument(\"--mirror\",\n\t\tdest=\"mirror\", default='',\n\t\thelp=\"Specify the PCS mirror (e.g. bj.baidupcs.com. Open 'https://pcs.baidu.com/rest/2.0/pcs/manage?method=listhost' to get the list) to use. [default: \" + const.PcsDomain + \"]\")\n\tparser.add_argument(\"--select-fastest-mirror\",\n\t\tdest=\"selectmirror\", action=\"store_true\",\n\t\thelp=\"Let the program run some tests and select the fastest PCS mirror it detectes. [default: %(default)s]\")\n\tparser.add_argument(\"--rapid-upload-only\",\n\t\tdest=\"rapiduploadonly\", action=\"store_true\",\n\t\thelp=\"only upload large files that can be rapidly uploaded\")\n\tparser.add_argument(\"--resume-download-revert-back\",\n\t\tdest=\"resumedl_revertcount\", default=const.DefaultResumeDlRevertCount,\n\t\ttype=int, metavar='RCOUNT',\n\t\thelp=\"Revert back at least %(metavar)s download chunk(s) and align to chunk boundary when resuming the download. A negative value means NO reverts. [default: %(default)s]\")\n\tparser.add_argument(\"--move\",\n\t\tdest=\"deletesource\", action=\"store_true\",\n\t\thelp=\"Delete source files/directories after download/upload/syncdown/syncup is successful (This will force verification of the files). [default: %(default)s]\")\n\tif Pool:\n\t\tparser.add_argument(const.MultiprocessOption,\n\t\t\tdest=\"processes\", default=const.DefaultProcessCount, type=int,\n\t\t\thelp=\"Number of parallel processes. (Only applies to dir sync/dl/ul). [default: %(default)s]\")\n\n\t# support aria2c\n\tparser.add_argument(\"--downloader\",\n\t\tdest=\"downloader\", default=\"\",\n\t\thelp=\"downloader to use (use python if not specified). valid values: {} [default: %(default)s]\".format(const.Downloaders))\n\tparser.add_argument(\"--downloader-arguments\",\n\t\tdest=\"downloader_args\", default=\"\",\n\t\thelp=(\"arguments for the downloader:\\n\"\n\t\t\t\"normally, the string is the arguments to be passed to the downloader. \"\n\t\t\t\"however, when it begins with '{0}', it will be treated as the name of file, \"\n\t\t\t\"whose contents will be used as the downloader arguments \"\n\t\t\t\"(example: when specifying '{0}args.txt', file contents of 'args.txt' will be \"\n\t\t\t\"used as the downloader arguments, not the string '@args.txt' itself).\\n\"\n\t\t\t\"you can also use environment variable '{1}' to specify the downloader arguments \"\n\t\t\t\"(the environment variable has lower priority compared to this argument).\\n\"\n\t\t\t\"default values: {2}\"\n\t\t\t).format(\n\t\t\t\tconst.DownloaderArgsIsFilePrefix,\n\t\t\t\tconst.DownloaderArgsEnvKey,\n\t\t\t\tconst.DownloaderDefaultArgs))\n\n\t# expose this to provide a primitive multi-user support\n\tparser.add_argument(\"--config-dir\", dest=\"configdir\", default=const.ConfigDir, help=\"specify the config path [default: %(default)s]\")\n\n\t# action\n\tparser.add_argument(const.CleanOptionShort, const.CleanOptionLong,\n\t\tdest=\"clean\", action=\"count\", default=0,\n\t\thelp=\"remove the token file (need re-auth) and upload progress file, \"\n\t\t\t\"-cc: clean hash cache file as well\")\n\n\t# the MAIN parameter - what command to perform\n\tparser.add_argument(\"command\", nargs='*', help = \"operations (quota, list, etc)\")\n\n\treturn parser\n\ndef clean_prog_files(cleanlevel, verbose, configdir = const.ConfigDir):\n\ttokenpath = os.path.join(configdir, const.TokenFileName)\n\tresult = removefile(tokenpath, verbose)\n\tif result == const.ENoError:\n\t\tpr(\"Token file '{}' removed. You need to re-authorize \"\n\t\t   \"the application upon next run\".format(tokenpath))\n\telse:\n\t\tperr(\"Failed to remove the token file '{}'\".format(tokenpath))\n\t\tperr(\"You need to remove it manually\")\n\n\tprgrpath = os.path.join(configdir, const.ProgressFileName)\n\tsubresult = removefile(prgrpath, verbose)\n\tif result == const.ENoError:\n\t\tpr(\"Progress file '{}' removed, \"\n\t\t\t\"any upload will be started from the beginning.\".format(prgrpath))\n\telse:\n\t\tperr(\"Failed to remove the progress file '{}'\".format(prgrpath))\n\t\tresult = subresult\n\n\tif cleanlevel >= 2:\n\t\tcachepath = os.path.join(configdir, const.HashCacheFileName)\n\t\tsubresult = os.remove(cachepath)\n\t\tif subresult == const.ENoError:\n\t\t\tpr(\"Hash Cache File '{}' removed.\".format(cachepath))\n\t\telse:\n\t\t\tperr(\"Failed to remove the Hash Cache File '{}'\".format(cachepath))\n\t\t\tperr(\"You need to remove it manually\")\n\t\t\tresult = subresult\n\n\treturn result\n\ndef printBaiduBanner():\n\tbanner ='''\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\nBaidu PCS currently gives totally WRONG MD5 hash for remote files, and I AM NOT GOING TO ADAPT TO IT!\nSo if it doesn't work, install version '1.6.10' using the following command:\npip install bypy==1.6.10\nVersion 1.6.10 has a workaround for this.\n### Seeking maintainer for this `bypy` project, if you are interested, please create an issue at github, thanks. ###\n----------------------------------------------------------------\n百度云盘返回的MD5全错了，鬼知道他们什么时候会改回来！现在代码是按照MD5值是正确的前提来写的，不会改。\n所以你发现比较功能等不能正确工作时，请安装 1.6.10 版本：\npip install bypy==1.6.10\n1.6.10版有个临时解决方案。\n### 寻求这个`bypy`项目维护者，有意的话请去github上建issue，谢谢。###\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n'''\n\tprint(banner)\n\ndef main(argv=None): # IGNORE:C0111\n\t''' Main Entry '''\n\t# printBaiduBanner()\n\n\tby = None\n\treqres = check_requirements()\n\tif reqres == CheckResult.Error:\n\t\tperr(\"Requirement checking failed\")\n\t\tsys.exit(const.EFatal)\n\n\tresult = const.ENoError\n\tif argv is None:\n\t\targv = sys.argv\n\telse:\n\t\tsys.argv.extend(argv)\n\n\tsetuphandlers()\n\n\tparser = getparser()\n\targs = parser.parse_args()\n\tdl_args = ''\n\tif not args.downloader_args:\n\t\tif const.DownloaderArgsEnvKey in os.environ:\n\t\t\tdl_args = os.environ[const.DownloaderArgsEnvKey]\n\telse:\n\t\tprefixlen = len(const.DownloaderArgsIsFilePrefix)\n\t\tif args.downloader_args[:prefixlen] == const.DownloaderArgsIsFilePrefix: # file\n\t\t\twith io.open(args.downloader_args[prefixlen:], 'r', encoding = 'utf-8') as f:\n\t\t\t\tdl_args = f.read().strip()\n\t\telse:\n\t\t\tdl_args = args.downloader_args\n\n\t# house-keeping reminder\n\t# TODO: may need to move into ByPy for customized config dir\n\tif os.path.exists(const.HashCachePath):\n\t\tcachesize = getfilesize(const.HashCachePath)\n\t\tif cachesize > 10 * const.OneM or cachesize == -1:\n\t\t\tpwarn((\n\t\t\t\t\"*** WARNING ***\\n\"\n\t\t\t\t\"Hash Cache file '{0}' is very large ({1}).\\n\"\n\t\t\t\t\"This may affect program's performance (high memory consumption).\\n\"\n\t\t\t\t\"You can first try to run 'bypy.py cleancache' to slim the file.\\n\"\n\t\t\t\t\"But if the file size won't reduce (this warning persists),\"\n\t\t\t\t\" you may consider deleting / moving the Hash Cache file '{0}'\\n\"\n\t\t\t\t\"*** WARNING ***\\n\\n\\n\").format(const.HashCachePath, human_size(cachesize)))\n\n\t# check for situations that require no ByPy object creation first\n\tif args.clean >= 1:\n\t\treturn clean_prog_files(args.clean, args.verbose, args.configdir)\n\n\t# some arguments need some processing\n\ttry:\n\t\tslice_size = interpret_size(args.slice)\n\texcept (ValueError, KeyError):\n\t\tperr(\"Error: Invalid slice size specified '{}'\".format(args.slice))\n\t\treturn const.EArgument\n\n\ttry:\n\t\tchunk_size = interpret_size(args.chunk)\n\texcept (ValueError, KeyError):\n\t\tperr(\"Error: Invalid slice size specified '{}'\".format(args.slice))\n\t\treturn const.EArgument\n\n\tif len(args.command) <= 0 or \\\n\t\t(len(args.command) == 1 and args.command[0].lower() == 'help'):\n\t\tparser.print_help()\n\t\treturn const.EArgument\n\telif len(args.command) == 2 and args.command[0].lower() == 'help':\n\t\tByPy.help(args.command[1])\n\t\treturn const.EArgument\n\telif args.command[0] in ByPy.__dict__: # dir(ByPy), dir(by)\n\t\t#timeout = args.timeout or None\n\n\t\tcached.usecache = not args.forcehash\n\t\tbypyopt = {\n\t\t\t'slice_size': slice_size,\n\t\t\t'dl_chunk_size': chunk_size,\n\t\t\t'verify': args.verify,\n\t\t\t'retry': args.retry,\n\t\t\t'timeout': args.timeout,\n\t\t\t'quit_when_fail': args.quit,\n\t\t\t'resumedownload': args.resumedl,\n\t\t\t'incregex': args.incregex,\n\t\t\t'ondup': args.ondup,\n\t\t\t'followlink': args.followlink,\n\t\t\t'checkssl': args.checkssl,\n\t\t\t'cacerts': args.cacerts,\n\t\t\t'rapiduploadonly': args.rapiduploadonly,\n\t\t\t'mirror': args.mirror,\n\t\t\t'selectmirror': args.selectmirror,\n\t\t\t'configdir': args.configdir,\n\t\t\t'resumedl_revertcount': args.resumedl_revertcount,\n\t\t\t'deletesource': args.deletesource,\n\t\t\t'downloader': args.downloader,\n\t\t\t'downloader_args': dl_args,\n\t\t\t'verbose': args.verbose,\n\t\t\t'debug': args.debug}\n\t\tif Pool:\n\t\t\tbypyopt['processes'] = args.processes\n\n\t\t# we construct a ByPy object here.\n\t\t# if you want to try PanAPI, simply replace ByPy with PanAPI, and all the bduss related function _should_ work\n\t\t# I didn't use PanAPI here as I have never tried out those functions inside\n\t\tby = ByPy(**bypyopt)\n\t\tuargs = []\n\t\tfor arg in args.command[1:]:\n\t\t\tif sys.version_info[0] < 3:\n\t\t\t\tuargs.append(unicode(arg, gvar.SystemEncoding))\n\t\t\telse:\n\t\t\t\tuargs.append(arg)\n\t\tresult = getattr(by, args.command[0])(*uargs)\n\t\tif result != const.ENoError:\n\t\t\terrmsg = '-' * 64 + \"\\nError {}{}\".format(result, ': ' + const.ErrorExplanations[result] if result in const.ErrorExplanations else '')\n\t\t\tperr(errmsg)\n\telse:\n\t\tperr(\"Error: Command '{}' not available.\".format(args.command[0]))\n\t\tparser.print_help()\n\t\treturn const.EParameter\n\n\t# just let it spew exceptions so that we have the stack trace on death\n\t# except KeyboardInterrupt:\n\t# \t# handle keyboard interrupt\n\t# \tpr(\"KeyboardInterrupt\")\n\t# \tpr(\"Abort\")\n\t# except Exception as ex:\n\t# \t# NOTE: Capturing the exeption as 'ex' seems to matter, otherwise this:\n\t# \t# except Exception:\n\t# \t# will sometimes give exception ...\n\t# \tperr(\"Exception occurred:\\n{}\".format(formatex(ex)))\n\t# \tpr(\"Abort\")\n\t#\traise\n\nif __name__ == \"__main__\":\n\tmain()\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/cached.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport os\nimport time\nimport io\nimport hashlib\nimport binascii\n\nfrom . import const\nfrom . import gvar\nfrom . import util\nfrom .util import (\n\tpdbg, pinfo, perr,\n\tgetfilesize, getfilemtime_int,\n\tjoinpath, formatex,\n\tjsonload, jsondump,\n\tremovepath)\n\npr = util.pr\n\ndef convertbincache(info, key):\n\tif key in info:\n\t\tbinhash = info[key]\n\t\tstrhash = binascii.hexlify(binhash)\n\t\tinfo[key] = strhash\n\n# in Pickle, i saved the hash (MD5, CRC32) in binary format (bytes)\n# now i need to pay the price to save them using string format ...\n# TODO: Rename\ndef stringifypickle(picklecache):\n\tfor absdir in picklecache:\n\t\tentry = picklecache[absdir]\n\t\tfor file in entry:\n\t\t\tinfo = entry[file]\n\t\t\t# 'crc32' is still stored as int (long),\n\t\t\t# as it's supported by JSON, and can't be hexlified\n\t\t\t#for key in ['md5', 'slice_md5', 'crc32']:\n\t\t\tfor key in ['md5', 'slice_md5']:\n\t\t\t\tconvertbincache(info, key)\n\n# there is room for more space optimization (like using the tree structure),\n# but it's not added at the moment. for now, it's just simple pickle.\n# SQLite might be better for portability\n# NOTE: file names are case-sensitive\nclass cached(object):\n\t''' simple decorator for hash caching (using pickle) '''\n\tusecache = True\n\tverbose = False\n\tdebug = False\n\thashcachepath = const.HashCachePath\n\tcache = {}\n\tcacheloaded = False\n\tdirty = False\n\tsemaphore = None\n\t# we don't do cache loading / unloading here because it's an decorator,\n\t# and probably multiple instances are created for md5, crc32, etc\n\t# it's a bit complex, and i thus don't have the confidence to do it in ctor/dtor\n\tdef __init__(self, f):\n\t\tsuper(cached, self).__init__()\n\t\tself.f = f\n\n\tdef __call__(self, *args):\n\t\tassert len(args) > 0\n\t\tresult = None\n\t\tpath = args[0]\n\t\tdir, file = os.path.split(path) # the 'filename' parameter\n\t\tabsdir = os.path.abspath(dir)\n\t\tif absdir in cached.cache:\n\t\t\tentry = cached.cache[absdir]\n\t\t\tif file in entry:\n\t\t\t\tinfo = entry[file]\n\t\t\t\tif self.f.__name__ in info \\\n\t\t\t\t\tand info['size'] == getfilesize(path) \\\n\t\t\t\t\tand info['mtime'] == getfilemtime_int(path) \\\n\t\t\t\t\tand self.f.__name__ in info \\\n\t\t\t\t\tand cached.usecache:\n\t\t\t\t\tresult = info[self.f.__name__]\n\t\t\t\t\tif cached.debug:\n\t\t\t\t\t\tpdbg(\"Cache hit for file '{}',\\n{}: {}\\nsize: {}\\nmtime: {}\".format(\n\t\t\t\t\t\t\tpath, self.f.__name__,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\tinfo['size'], info['mtime']))\n\t\t\t\telse:\n\t\t\t\t\tresult = self.f(*args)\n\t\t\t\t\tself._store(info, path, result)\n\t\t\telse:\n\t\t\t\tresult = self.f(*args)\n\t\t\t\tentry[file] = {}\n\t\t\t\tinfo = entry[file]\n\t\t\t\tself._store(info, path, result)\n\t\telse:\n\t\t\tresult = self.f(*args)\n\t\t\tcached.cache[absdir] = {}\n\t\t\tentry = cached.cache[absdir]\n\t\t\tentry[file] = {}\n\t\t\tinfo = entry[file]\n\t\t\tself._store(info, path, result)\n\n\t\treturn result\n\n\tdef _store(self, info, path, value):\n\t\tcached.dirty = True\n\t\tinfo['size'] = getfilesize(path)\n\t\tinfo['mtime'] = getfilemtime_int(path)\n\t\tinfo[self.f.__name__] = value\n\t\tif cached.debug:\n\t\t\tsituation = \"Storing cache\"\n\t\t\tif cached.usecache:\n\t\t\t\tsituation = \"Cache miss\"\n\t\t\tpdbg((situation + \" for file '{}',\\n{}: {}\\nsize: {}\\nmtime: {}\").format(\n\t\t\t\tpath, self.f.__name__,\n\t\t\t\tvalue,\n\t\t\t\tinfo['size'], info['mtime']))\n\n\t\t# periodically save to prevent loss in case of system crash\n\t\tnow = time.time()\n\t\tif now - gvar.last_cache_save >= const.CacheSavePeriodInSec:\n\t\t\tif cached.debug:\n\t\t\t\tpdbg(\"Periodically saving Hash Cash\")\n\t\t\tcached.savecache()\n\t\t\tgvar.last_cache_save = now\n\n\t# merge the from 'fromc' cache into the 'to' cache.\n\t# 'keepto':\n\t#  - True to keep the entry in 'to' cache when conflicting\n\t#  - False to keep the entry from 'fromc' cache\n\t# return number of conflict entries found\n\t@staticmethod\n\tdef mergeinto(fromc, to, keepto = True):\n\t\tconflicts = 0\n\t\tfor absdir in fromc:\n\t\t\tentry = fromc[absdir]\n\t\t\tif not absdir in to:\n\t\t\t\tto[absdir] = {}\n\t\t\ttoentry = to[absdir]\n\t\t\tfor file in entry:\n\t\t\t\tif file in toentry:\n\t\t\t\t\tif cached.debug:\n\t\t\t\t\t\tmsg = \"Cache merge conflict for: '{}/{}', {}: {}.\".format(absdir, file,\n\t\t\t\t\t\t\t\"Keeping the destination value\" if keepto else\n\t\t\t\t\t\t\t\"Using the source value\",\n\t\t\t\t\t\t\ttoentry[file] if keepto else entry[file])\n\t\t\t\t\t\tpdbg(msg)\n\t\t\t\t\tif not keepto:\n\t\t\t\t\t\ttoentry[file] = entry[file]\n\t\t\t\t\tconflicts += 1\n\t\t\t\telse:\n\t\t\t\t\ttoentry[file] = entry[file]\n\n\t\treturn conflicts\n\n\t@staticmethod\n\tdef ishexchar(c):\n\t\treturn (c >= '0' and c <= '9') or (c >= 'a' and c <= 'f') or (c >= 'A' and c <= 'F')\n\n\t# pay the history debt ..., hashes were in binary format (bytes) in pickle\n\t@staticmethod\n\tdef isbincache(cache):\n\t\tfor absdir in cache:\n\t\t\tentry = cache[absdir]\n\t\t\tfor file in entry:\n\t\t\t\tinfo = entry[file]\n\t\t\t\tif 'md5' in info:\n\t\t\t\t\tmd5 = info['md5']\n\t\t\t\t\t# due to encrypt_md5()\n\t\t\t\t\t# for c in md5:\n\t\t\t\t\tfor c in md5[:9] + md5[10:]:\n\t\t\t\t\t\tif not cached.ishexchar(c):\n\t\t\t\t\t\t\treturn True\n\t\treturn False\n\n\t@staticmethod\n\tdef loadcache(existingcache = {}):\n\t\t# load cache even we don't use cached hash values,\n\t\t# because we will save (possibly updated) and hash values\n\t\tif not cached.cacheloaded: # no double-loading\n\t\t\tif cached.verbose:\n\t\t\t\tpr(\"Loading Hash Cache File '{}'...\".format(cached.hashcachepath))\n\n\t\t\tif os.path.exists(cached.hashcachepath):\n\t\t\t\ttry:\n\t\t\t\t\tcached.cache = jsonload(cached.hashcachepath)\n\t\t\t\t\t# pay the history debt ...\n\t\t\t\t\t# TODO: Remove some time later when no-body uses the old bin format cache\n\t\t\t\t\tif cached.isbincache(cached.cache):\n\t\t\t\t\t\tpinfo(\"ONE TIME conversion for binary format Hash Cache ...\")\n\t\t\t\t\t\tstringifypickle(cached.cache)\n\t\t\t\t\t\tpinfo(\"ONE TIME conversion finished\")\n\t\t\t\t\tif existingcache: # not empty\n\t\t\t\t\t\tif cached.verbose:\n\t\t\t\t\t\t\tpinfo(\"Merging with existing Hash Cache\")\n\t\t\t\t\t\tcached.mergeinto(existingcache, cached.cache)\n\t\t\t\t\tcached.cacheloaded = True\n\t\t\t\t\tif cached.verbose:\n\t\t\t\t\t\tpr(\"Hash Cache File loaded.\")\n\t\t\t\t#except (EOFError, TypeError, ValueError, UnicodeDecodeError) as ex:\n\t\t\t\texcept Exception as ex:\n\t\t\t\t\tperr(\"Fail to load the Hash Cache, no caching.\\n{}\".format(formatex(ex)))\n\t\t\t\t\tcached.cache = existingcache\n\t\t\telse:\n\t\t\t\tif cached.verbose:\n\t\t\t\t\tpr(\"Hash Cache File '{}' not found, no caching\".format(cached.hashcachepath))\n\t\telse:\n\t\t\tif cached.verbose:\n\t\t\t\tpr(\"Not loading Hash Cache since 'cacheloaded' is '{}'\".format(cached.cacheloaded))\n\n\t\treturn cached.cacheloaded\n\n\t@staticmethod\n\tdef savecache(force_saving = False):\n\t\tsaved = False\n\t\t# even if we were unable to load the cache, we still save it.\n\t\tif cached.dirty or force_saving:\n\t\t\tif cached.verbose:\n\t\t\t\tpr(\"Saving Hash Cache...\")\n\t\t\ttry:\n\t\t\t\tjsondump(cached.cache, cached.hashcachepath, cached.semaphore)\n\t\t\t\tif cached.verbose:\n\t\t\t\t\tpr(\"Hash Cache saved.\")\n\t\t\t\tsaved = True\n\t\t\t\tcached.dirty = False\n\t\t\texcept Exception as ex:\n\t\t\t\tperr(\"Failed to save Hash Cache.\\n{}\".format(formatex(ex)))\n\t\telse:\n\t\t\tif cached.verbose:\n\t\t\t\tpr(\"Skip saving Hash Cache since it has not been updated.\")\n\n\t\treturn saved\n\n\t@staticmethod\n\tdef cleancache():\n\t\tif cached.loadcache():\n\t\t\tfor absdir in cached.cache.keys():\n\t\t\t\tif not os.path.exists(absdir):\n\t\t\t\t\tif cached.verbose:\n\t\t\t\t\t\tpr(\"Directory: '{}' no longer exists, removing the cache entries\".format(absdir))\n\t\t\t\t\tcached.dirty = True\n\t\t\t\t\tdel cached.cache[absdir]\n\t\t\t\telse:\n\t\t\t\t\toldfiles = cached.cache[absdir]\n\t\t\t\t\tfiles = {}\n\t\t\t\t\tneedclean = False\n\t\t\t\t\tfor f in oldfiles.keys():\n\t\t\t\t\t\t#p = os.path.join(absdir, f)\n\t\t\t\t\t\tp = joinpath(absdir, f)\n\t\t\t\t\t\tif os.path.exists(p):\n\t\t\t\t\t\t\tfiles[f] = oldfiles[f]\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tif cached.verbose:\n\t\t\t\t\t\t\t\tneedclean = True\n\t\t\t\t\t\t\t\tpr(\"File '{}' no longer exists, removing the cache entry\".format(p))\n\n\t\t\t\t\tif needclean:\n\t\t\t\t\t\tcached.dirty = True\n\t\t\t\t\t\tcached.cache[absdir] = files\n\t\tcached.savecache()\n\n\t@staticmethod\n\tdef remove(path):\n\t\tdef notfound():\n\t\t\tpdbg(\"Failed to delete cache: Path '{}' not found in cache.\".format(path))\n\n\t\tdir, file = os.path.split(path)\n\t\tabsdir = os.path.abspath(dir)\n\t\tif absdir in cached.cache:\n\t\t\tentry = cached.cache[absdir]\n\t\t\tif file in entry:\n\t\t\t\tdel entry[file]\n\t\t\t\tpdbg(\"Cache for '{}' removed.\".format(path))\n\t\t\t\tif not entry:\n\t\t\t\t\tdel cached.cache[absdir]\n\t\t\t\t\tpdbg(\"Empty directory '{}' in cache also removed.\".format(absdir))\n\t\t\telse:\n\t\t\t\tnotfound()\n\t\telse:\n\t\t\tnotfound()\n\n\t@staticmethod\n\tdef remove_path_and_cache(path):\n\t\tresult = removepath(path)\n\t\tif result == const.ENoError and os.path.isfile(path):\n\t\t\tcached.remove(path)\n\t\treturn result\n\n@cached\ndef md5(filename, slice = const.OneM):\n\tm = hashlib.md5()\n\twith io.open(filename, 'rb') as f:\n\t\twhile True:\n\t\t\tbuf = f.read(slice)\n\t\t\tif buf:\n\t\t\t\tm.update(buf)\n\t\t\telse:\n\t\t\t\tbreak\n\n\treturn encrypt_md5(m.hexdigest())\n\ndef encrypt_md5(md5str):\n\tdef validate_md5():\n\t\tif len(md5str) != 32:\n\t\t\treturn md5str\n\t\tfor i in range(32):\n\t\t\tv = int(md5str[i], 16)\n\t\t\tif v < 0 or v > 16:\n\t\t\t\treturn md5str\n\tmd5str = md5str[8:16] + md5str[0:8] + md5str[24:32] + md5str[16:24]\n\tencryptstr = ''\n\tfor e in range(len(md5str)):\n\t\tencryptstr += hex(int(md5str[e], 16) ^ 15 & e)[2:3]\n\treturn encryptstr[0:9] + chr(ord('g')+int(encryptstr[9], 16)) + encryptstr[10:]\n\n# slice md5 for baidu rapidupload\n@cached\ndef slice_md5(filename):\n\tm = hashlib.md5()\n\twith io.open(filename, 'rb') as f:\n\t\tbuf = f.read(256 * const.OneK)\n\t\tm.update(buf)\n\n\treturn m.hexdigest()\n\n@cached\ndef crc32(filename, slice = const.OneM):\n\twith io.open(filename, 'rb') as f:\n\t\tbuf = f.read(slice)\n\t\tcrc = binascii.crc32(buf)\n\t\twhile True:\n\t\t\tbuf = f.read(slice)\n\t\t\tif buf:\n\t\t\t\tcrc = binascii.crc32(buf, crc)\n\t\t\telse:\n\t\t\t\tbreak\n\n\treturn crc & 0xffffffff\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/chkreq.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\n\nfrom . import gvar\nfrom .util import (iswindows, fixenc, bannerwarn)\n\nclass CheckResult:\n\tNumOfCheckResults= 3\n\tPass, Warning, Error = range(NumOfCheckResults)\n\ndef check_requirements():\n\tresult = CheckResult.Pass\n\tif False and iswindows():\n\t\tbannerwarn(\"You are running Python on Windows, which doesn't support Unicode so well.\\n\"\n\t\t\t\"Files with non-ASCII names may not be handled correctly.\")\n\t\tresult = max(result, CheckResult.Warning)\n\n\tif sys.version_info[0] < 2 \\\n\tor (sys.version_info[0] == 2 and sys.version_info[1] < 7) \\\n\tor (sys.version_info[0] == 3 and sys.version_info[1] < 3):\n\t\tbannerwarn(\"Error: Incorrect Python version. You need 2.7 / 3.3 or above\")\n\t\tresult = max(result, CheckResult.Error)\n\n\t# we have warned Windows users, so the following is for *nix users only\n\tif gvar.SystemEncoding:\n\t\tsysencu = gvar.SystemEncoding.upper()\n\t\tif sysencu != 'UTF-8' and sysencu != 'UTF8' and sysencu != 'UTF_8' \\\n\t\t\tand sysencu != 'CP65001' and sysencu != '65001':\n\t\t\tmsg = \"WARNING: System locale is not 'UTF-8'.\\n\" \\\n\t\t\t\t  \"Files with non-ASCII names may not be handled correctly.\\n\" \\\n\t\t\t\t  \"You should set your System Locale to 'UTF-8'.\\n\" \\\n\t\t\t\t  \"Current locale is '{0}'\".format(gvar.SystemEncoding)\n\t\t\tbannerwarn(msg)\n\t\t\tresult = max(result, CheckResult.Warning)\n\telse:\n\t\t# ASSUME UTF-8 encoding, if for whatever reason,\n\t\t# we can't get the default system encoding\n\t\tgvar.SystemEncoding = 'utf-8'\n\t\tbannerwarn(\"WARNING: Can't detect the system encoding, assume it's 'UTF-8'.\\n\"\n\t\t\t  \"Files with non-ASCII names may not be handled correctly.\" )\n\t\tresult = max(result, CheckResult.Warning)\n\n\tstdenc = sys.stdout.encoding\n\tif stdenc:\n\t\tstdencu = stdenc.upper()\n\t\tif not (stdencu == 'UTF8' or stdencu == 'UTF-8'):\n\t\t\tbannerwarn(\"Encoding for StdOut: {0}\".format(stdenc))\n\t\t\ttry:\n\t\t\t\t'\\u6c49\\u5b57'.encode(stdenc) # '汉字'\n\t\t\texcept: # (LookupError, TypeError, UnicodeEncodeError):\n\t\t\t\tfixenc(stdenc)\n\telse:\n\t\tfixenc(stdenc)\n\n\treturn result\n\nif __name__ == \"__main__\":\n\tcheck_requirements()\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/const.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\nimport os\n\n# https://packaging.python.org/single_source_version/\n__title__ = 'bypy'\n__version__ = '1.8.9'\n__author__ = 'Hou Tianze'\n__license__ = 'MIT'\n__desc__ = 'Python client for Baidu Yun (Personal Cloud Storage) 百度云/百度网盘 Python 客户端'\n__url__ = 'https://github.com/houtianze/bypy'\n\n### return (error) codes\n# they are put at the top because:\n# 1. they have zero dependencies\n# 2. can be referred in any abort later, e.g. return error on import failures\nENoError = 0 # plain old OK, fine, no error.\nEIncorrectPythonVersion = 1\n#EApiNotConfigured = 10 # Deprecated: ApiKey, SecretKey and AppPcsPath not properly configured\nEArgument = 10 # invalid program command argument\nEAbort = 20 # aborted\nEException = 30 # unhandled exception occurred\nEParameter = 40 # invalid parameter passed to ByPy\nEInvalidJson = 50\nEHashMismatch = 60 # MD5 hashes of the local file and remote file don't match each other\nEFileWrite = 70\nEFileTooBig = 80 # file too big to upload\nEFailToCreateLocalDir = 90\nEFailToCreateLocalFile = 100\nEFailToDeleteDir = 110\nEFailToDeleteFile = 120\nEFileNotFound = 130\nEMaxRetry = 140\nERequestFailed = 150 # request failed\nECacheNotLoaded = 160\nEMigrationFailed = 170\nEDownloadCerts = 180\nEUserRejected = 190 # user's decision\nEUpdateNeeded = 200\nESkipped = 210\nEFatal = -1 # No way to continue\n# internal errors\nIEMD5NotFound = 31079 # File md5 not found, you should use upload API to upload the whole file.\nIEParameterError = 31023 # {'error_code': 31023, 'error_msg': 'param error', 'request_id': 174129658197460631}\nIESuperfileCreationFailed = 31081 # superfile create failed (HTTP 404)\n# Undocumented, see #308 , https://paste.ubuntu.com/23672323/\nIEBlockMissInSuperFile2 = 31363 # block miss in superfile2 (HTTP 403)\nIETaskNotFound = 36016 # Task was not found\nIEFileAlreadyExists = 31061 # {\"error_code\":31061,\"error_msg\":\"file already exists\",\"request_id\":2939656146461714799}\nIEAppIDIsEmpty = 31024 # {'error_code': 31024, 'error_msg': 'app id is empty', 'request_id': 5638555241104030586} (HTTP 400)\n\n# TODO: Should have use an enum or some sort of data structure for this,\n# but now changing this is too time consuming and error-prone\nErrorExplanations = {\n\tENoError: \"Everything went fine.\",\n\tEIncorrectPythonVersion: \"Incorrect Python version\",\n\tEArgument: \"Invalid program argument passed in\",\n\tEAbort: \"Abort due to unrecovrable errors\",\n\tEException: \"Unhandled exception occurred\",\n\tEParameter: \"Some or all the parameters passed to the function are invalid\",\n\tEInvalidJson: \"Invalid JSON received\",\n\tEHashMismatch: \"MD5 hashes of the local file and remote file don't match each other\",\n\tEFileWrite: \"Error writing file\",\n\tEFileTooBig: \"File too big to upload\",\n\tEFailToCreateLocalDir: \"Unable to create some directory(ies)\",\n\tEFailToCreateLocalFile: \"Unable to create some local file(s)\",\n\tEFailToDeleteDir:\" Unable to delete some directory(ies)\",\n\tEFailToDeleteFile: \"Unable to delete some file(s)\",\n\tEFileNotFound: \"File not found\",\n\tEMaxRetry: \"Maximum retries reached\",\n\tERequestFailed: \"Request failed\",\n\tECacheNotLoaded: \"Failed to load file caches\",\n\tEMigrationFailed: \"Failed to migrate from the old cache format\",\n\tEDownloadCerts: \"Failed to download certificats\", # no long in use\n\tEUserRejected: \"User chose to not to proceed\",\n\tEUpdateNeeded: \"Need to update bypy\",\n\tESkipped: \"Some files/directores are skipped\",\n\tEFatal: \"Fatal error, unable to continue\",\n\tIEMD5NotFound: \"File md5 not found, you should use upload API to upload the whole file.\",\n\tIESuperfileCreationFailed: \"superfile create failed (HTTP 404)\",\n\t# Undocumented, see #308 , https://paste.ubuntu.com/23672323/\n\tIEBlockMissInSuperFile2: \"Block miss in superfile2 (HTTP 403)\",\n\tIETaskNotFound: \"Task was not found\",\n\tIEFileAlreadyExists: \"File already exists\"\n}\n\nDownloaderAria2 = 'aria2'\nDownloaders = [DownloaderAria2]\nDownloaderDefaultArgs = {\n\tDownloaderAria2 : \"-c -k10M -x4 -s4  --file-allocation=none\"\n}\nDownloaderArgsEnvKey = 'DOWNLOADER_ARGUMENTS'\nDownloaderArgsIsFilePrefix = '@'\n\nPipBinaryName = 'pip' + str(sys.version_info[0])\nPipInstallCommand = PipBinaryName + ' install requests'\nPipUpgradeCommand = PipBinaryName + ' install -U requests'\n\n#### Definitions that are real world constants\nOneK = 1024\nOneM = OneK * OneK\nOneG = OneM * OneK\nOneT = OneG * OneK\nOneP = OneT * OneK\nOneE = OneP * OneK\nOneZ = OneE * OneK\nOneY = OneZ * OneK\nSIPrefixNames = [ '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' ]\n\nSIPrefixTimes = {\n\t'K' : OneK,\n\t'M' : OneM,\n\t'G' : OneG,\n\t'T' : OneT,\n\t'E' : OneE,\n\t'Z' : OneZ,\n\t'Y' : OneY }\n\n# before this, you don't know me, i don't know you - Eason\nTenYearInSeconds = 60 * 60 * 24 * 366 * 10\n# For Python 3 only, threading.TIMEOUT_MAX is 9223372036854.0 on all *nix systems,\n# but it's a little over 49 days for Windows, if we give a value larger than that,\n# Python 3 on Windows will throw towel, so we cringe.\nFortyNineDaysInSeconds = 60 * 60 * 24 * 49\n\n#### Baidu PCS constants\n# ==== NOTE ====\n# I use server auth, because it's the only method I know that can conceal the SecretKey.\n# If you want to perform local authorization using 'Device' method instead, you just need:\n# - Paste your own ApiKey and SecretKey. (A non-empty SecretKey will change auth mode to device)\n# - Change the AppPcsPath to your own App's directory at Baidu PCS\n# Then you are good to go\n# replace with your own API key and secret if you are using your own appid, or set env vars\nApiKey = os.environ['BAIDU_API_KEY'] if 'BAIDU_API_KEY' in os.environ else 'q8WE4EpCsau1oS0MplgMKNBn'\nSecretKey = os.environ['BAIDU_API_SECRET'] if 'BAIDU_API_SECRET' in os.environ else 'PA4MhwB5RE7DacKtoP2i8ikCnNzAqYTD'\n# NOTE: no trailing '/'\nAppPcsPath = '/apps/bypy' # change this to the App's directory you specified when creating the app\nAppPcsPathLen = len(AppPcsPath)\n\n## Baidu PCS URLs etc.\nOpenApiUrl = \"https://openapi.baidu.com\"\nOpenApiVersion = \"2.0\"\nOAuthUrl = OpenApiUrl + \"/oauth/\" + OpenApiVersion\nServerAuthUrl = OAuthUrl + \"/authorize\"\nDeviceAuthUrl = OAuthUrl + \"/device/code\"\nTokenUrl = OAuthUrl + \"/token\"\nPcsDomain = 'pcs.baidu.com'\nRestApiPath = '/rest/2.0/pcs/'\nPcsUrl = 'https://' + PcsDomain + RestApiPath\nCPcsUrl = 'https://c.pcs.baidu.com/rest/2.0/pcs/'\nDPcsUrl = 'https://d.pcs.baidu.com/rest/2.0/pcs/'\n\n## Baidu PCS constants\nMinRapidUploadFileSize = 256 * OneK\nMaxSliceSize = 2 * OneG\nMaxSlicePieces = 1024\nMaxListEntries = 1000 # https://github.com/houtianze/bypy/issues/285\n\n### public static properties\nHelpMarker = \"Usage:\"\n\n### ByPy config constants\n## directories, for setting, cache, etc\nHomeDir = os.path.expanduser('~')\n# os.path.join() may not handle unicode well\nConfigDir = HomeDir + os.sep + '.bypy'\nTokenFileName = 'bypy.json'\nTokenFilePath = ConfigDir + os.sep + TokenFileName\nSettingFileName = 'bypy.setting.json'\nSettingFilePath = ConfigDir + os.sep + SettingFileName\nHashCacheFileName = 'bypy.hashcache.json'\nHashCachePath = ConfigDir + os.sep + HashCacheFileName\nPickleFileName = 'bypy.pickle'\nPicklePath = ConfigDir + os.sep + PickleFileName\n# ProgressPath saves the MD5s of uploaded slices, for upload resuming\n# format:\n# {\n# \tabspath: [slice_size, [slice1md5, slice2md5, ...]],\n# }\n#\nProgressFileName = 'bypy.parts.json'\nProgressPath = ConfigDir + os.sep + ProgressFileName\nByPyCertsFileName = 'bypy.cacerts.pem'\nOldByPyCertsPath = ConfigDir + os.sep + ByPyCertsFileName\n# Old setting locations, should be moved to ~/.bypy to be clean\nOldTokenFilePath = HomeDir + os.sep + '.bypy.json'\nOldPicklePath = HomeDir + os.sep + '.bypy.pickle'\nRemoteTempDir = AppPcsPath + '/.bypytemp'\nSettingKey_OverwriteRemoteTempDir = 'overwriteRemoteTempDir'\nSettingKey_LastUpdateCheckTime = 'lastUpdateCheck'\n\n## default config values\nPrintFlushPeriodInSec = 5.0\n# TODO: Does the following User-Agent emulation help?\nUserAgent = None # According to xslidian, User-Agent affects download.\n#UserAgent = 'Mozilla/5.0'\n#UserAgent = \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\"\n#UserAgent = 'netdisk;5.2.7.2;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia'\nDefaultSliceInMB = 20\nDefaultSliceSize = 20 * OneM\nDefaultDlChunkSize = 20 * OneM\nRetryDelayInSec = 10\nCacheSavePeriodInSec = 10 * 60.0\nDefaultTimeOutInSeconds=300\n# share retries\nShareRapidUploadRetries = 3\nDefaultResumeDlRevertCount = 1\nDefaultProcessCount = 1\n\n## program switches\nCleanOptionShort = '-c'\nCleanOptionLong = '--clean'\nDisableSslCheckOption = '--disable-ssl-check'\nCaCertsOption = '--cacerts'\nMultiprocessOption = '--processes'\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/gui.py",
    "content": "#!/usr/bin/env python\n# coding=utf-8\n\n# A simple GUI for bypy, using Tkinter\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\nimport threading\n\nvi = sys.version_info\nif vi[0] == 2:\n\timport Tkinter as tk\n\timport tkFileDialog\n\timport tkMessageBox\n\timport ttk\nelif vi[0] == 3:\n\timport tkinter as tk\n\tfrom tkinter import filedialog as tkFileDialog, messagebox as tkMessageBox, ttk\n\nfrom . import const\nfrom . import monkey\nfrom .util import (get_pcs_path)\nfrom .tkutil import (\n\tColorMap, fgtag, bgtag,\n\tStretch, GridStyle, MyLogText,\n\tcenterwindow)\nfrom .bypy import ByPy\n\nGuiTitle = \"Bypy GUI\"\n\nclass RemoteListGui(tk.Toplevel):\n\t# remotepath is the partial path,\n\t# NOT including the '/apps/bypy' in front\n\tdef __init__(self, master, byp, remotepath = ''):\n\t\ttk.Toplevel.__init__(self, master)\n\n\t\tself.byp = byp\n\t\tself.rpath = get_pcs_path(remotepath)\n\t\tself.result = ''\n\n\t\tself.transient(master)\n\t\tself.master = master\n\t\ttitle = 'Baidu: ' + self.rpath\n\t\tself.title(title)\n\n\t\tself.CreateWidgets()\n\t\tself.geometry('400x300+0+0')\n\t\tself.GetRemote()\n\n\t\tself.grab_set()\n\n\tdef GetRemoteAct(self, r, args):\n\t\tself.wList.delete(0, tk.END)\n\t\tif self.rpath.strip('/') != const.AppPcsPath.strip('/'):\n\t\t\tself.wList.insert(tk.END, '..')\n\t\ttry:\n\t\t\tj = r.json()\n\t\t\tfor f in j['list']:\n\t\t\t\tfullpath = f['path']\n\t\t\t\trelpath = fullpath.split('/')[-1]\n\t\t\t\tself.wList.insert(tk.END,\n\t\t\t\t\trelpath + '/' if f['isdir'] else relpath)\n\n\t\t\treturn const.ENoError\n\t\texcept:\n\t\t\treturn const.EException\n\n\tdef GetRemote(self):\n\t\tpars = {\n\t\t\t'method' : 'list',\n\t\t\t'path' : self.rpath,\n\t\t\t'by' : 'name',\n\t\t\t'order' : 'asc' }\n\n\t\tresult = self.byp._get(\n\t\t\tconst.PcsUrl + 'file', pars, self.GetRemoteAct)\n\n\t\tif result == const.ENoError:\n\t\t\tself.title(self.rpath)\n\t\telse:\n\t\t\tif self.rpath.strip('/') == const.AppPcsPath.strip('/'):\n\t\t\t\terr = \"Can't retrieve Baidu PCS directories!\\n\" + \\\n\t\t\t\t\t\"Maybe the network is down?\\n\" + \\\n\t\t\t\t\t\"You can still manually input the remote path though\" + \\\n\t\t\t\t\t\"(But, I doubt it will work)\"\n\t\t\t\ttkMessageBox.showerror(GuiTitle, err)\n\t\t\t\tself.Bye()\n\t\t\telse:\n\t\t\t\tself.rpath = const.get_pcs_path('')\n\t\t\t\tself.GetRemote()\n\n\tdef Bye(self, result = ''):\n\t\tself.result = result\n\t\tself.master.focus_set()\n\t\tself.destroy()\n\n\tdef Delete(self, selected):\n\t\tif tkMessageBox.askyesno(\n\t\t\ttitle = GuiTitle,\n\t\t\tmessage = \"Are you sure you want to delete '{}' at Baidu?\".format(selected),\n\t\t\tparent = self):\n\t\t\trpath = '/'.join([self.rpath, selected])\n\t\t\tr = self.byp._delete(rpath)\n\t\t\tif r == const.ENoError:\n\t\t\t\tself.wList.delete(tk.ANCHOR)\n\t\t\telse:\n\t\t\t\ttkMessageBox.showerror(\n\t\t\t\t\ttitle = GuiTitle,\n\t\t\t\t\tmessage = \"Fail to delete '{}' at Baidu\".format(selected),\n\t\t\t\t\tparent = self)\n\n\tdef Select(self, event):\n\t\tif event.widget == self.wOK:\n\t\t\tself.Bye(self.rpath[len(const.AppPcsPath):])\n\t\telif event.widget == self.wList:\n\t\t\tselected = ''\n\t\t\tiet = int(event.type) # i don't know why, but it seems needed\n\t\t\tif iet == 4: # mouse event. mouse is special or not?\n\t\t\t\tselected = self.wList.get(self.wList.nearest(event.y))\n\t\t\telif iet == 2: # KeyPress\n\t\t\t\tselected = self.wList.get(tk.ACTIVE)\n\n\t\t\tif iet == 4 or \\\n\t\t\t\t(iet == 2 and event.keysym == 'Return'):\n\t\t\t\tif selected[-1] == '/':\n\t\t\t\t\tself.rpath = '/'.join([self.rpath, selected[:-1]])\n\t\t\t\t\tself.GetRemote()\n\t\t\t\telif selected == '..':\n\t\t\t\t\tself.rpath = '/'.join(self.rpath.split('/')[:-1])\n\t\t\t\t\tself.GetRemote()\n\t\t\t\telse:\n\t\t\t\t\tself.Bye('/'.join([self.rpath, selected])[len(const.AppPcsPath):])\n\t\t\telif iet == 2 and event.keysym == 'Delete':\n\t\t\t\t# don't handlle this, not so rational usage\n\t\t\t\tif selected != '..':\n\t\t\t\t\tself.Delete(selected)\n\n\tdef CreateWidgets(self):\n\t\tself.grid_columnconfigure(0, weight = 1)\n\t\tself.grid_rowconfigure(0, weight = 1)\n\t\tself.wList = tk.Listbox(self)\n\t\tself.wList.grid(sticky = Stretch, **GridStyle)\n\t\tself.wList.bind('<Double-Button-1>', self.Select)\n\t\tself.wList.bind('<Return>', self.Select)\n\t\tself.wList.bind('<Delete>', self.Select)\n\t\tself.wOK = tk.Button(self, text = 'OK', default = tk.ACTIVE)\n\t\tself.wOK.grid(row = 1, column = 0, sticky = tk.E + tk.W, **GridStyle)\n\t\tself.wOK.bind('<Button-1>', self.Select)\n\t\tself.wOK.bind('<Return>', self.Select)\n\n\t\tself.wList.focus_set()\n\n\t\tself.protocol(\"WM_DELETE_WINDOW\", lambda: ())\n\nclass BypyGui(tk.Frame):\n\t# function remapping / hijacking\n\t# pr and prcolor functions in console and GUI are different:\n\t#   in console: pr is the foundamental function, prcolor calls it\n\t#   in GUI: prcolor is the foundamental fucntion, pr calls it\n\tdef __init__(self, master = None):\n\t\ttk.Frame.__init__(self, master)\n\n\t\tself.master.title(GuiTitle)\n\t\tself.grid(sticky = Stretch)\n\n\t\tself.byp = None\n\n\t\tself.threadrunning = False\n\n\t\tself.localPath = tk.StringVar()\n\t\tself.localPath.set('/tmp')\n\t\tself.remotePath = tk.StringVar()\n\t\tself.bLog = tk.IntVar()\n\t\tself.bLog.set(1)\n\t\tself.bSyncDelete = tk.IntVar()\n\t\tself.bSyncDelete.set(0)\n\t\tself.progress = tk.IntVar()\n\t\tself.progress.set(0)\n\t\tself.maxProgress = 1000\n\n\t\tself.CreateWidgets()\n\n\t\tmonkey.setgui(self)\n\n\t\tself.initbypy()\n\n\tdef CreateWidgets(self):\n\t\tself.master.grid_columnconfigure(0, weight = 1)\n\t\tself.master.grid_rowconfigure(1, weight = 1)\n\t\tself.grid_columnconfigure(1, weight = 1)\n\t\tself.grid_rowconfigure(4, weight = 1)\n\n\t\tz = tk.Label(self, text = 'Baidu: ' + const.AppPcsPath)\n\t\tz.grid(row = 0, column = 0, **GridStyle)\n\t\tself.wRemotePath = tk.Entry(self, textvariable = self.remotePath)\n\t\tself.wRemotePath.grid(row = 0, column = 1, sticky = Stretch, **GridStyle)\n\t\tself.wRemoteSelect = tk.Button(self, text = 'R', underline = 0)\n\t\tself.wRemoteSelect.grid(row = 0, column = 2, **GridStyle)\n\t\tself.wRemoteSelect.bind('<Button-1>', self.selectremotepath)\n\t\tself.bind_all('<Alt-r>', self.selectremotepath)\n\n\t\tz = tk.Label(self, text = 'Local 本地')\n\t\tz.grid(**GridStyle)\n\t\tself.wLocalPath = tk.Entry(self, textvariable = self.localPath)\n\t\tself.wLocalPath.grid(row = 1, column = 1, sticky = Stretch, **GridStyle)\n\t\tself.wLocalSelect = tk.Button(self, text = 'L', underline = 0)\n\t\tself.wLocalSelect.grid(row = 1, column = 2, **GridStyle)\n\t\tself.wLocalSelect.bind('<Button-1>', self.selectlocalpath)\n\t\tself.bind_all('<Alt-l>', self.selectlocalpath)\n\n\t\tself.OpFrame = tk.Frame(self)\n\t\tself.OpFrame.grid(row = 2, columnspan = 3, sticky = Stretch, **GridStyle)\n\t\tself.OpFrame.grid_columnconfigure(0, weight = 1)\n\t\tself.OpFrame.grid_columnconfigure(1, weight = 1)\n\t\tself.OpFrame.grid_columnconfigure(2, weight = 1)\n\t\tself.OpFrame.grid_columnconfigure(3, weight = 1)\n\t\tself.OpFrame.grid_columnconfigure(3, weight = 1)\n\t\tself.OpFrame.grid_columnconfigure(4, weight = 1)\n\n\t\tself.wSyncUp = tk.Button(self.OpFrame, text = 'Sync Up 上传同步', underline = 5)\n\t\tself.wSyncUp.grid(sticky = Stretch, **GridStyle)\n\t\tself.wSyncUp.bind('<Button-1>', self.startsyncup)\n\t\tself.bind_all('<Alt-u>', self.startsyncup)\n\n\t\tself.wUpload = tk.Button(self.OpFrame, text = 'Upload 上传')\n\t\tself.wUpload.grid(row = 0, column = 1, sticky = Stretch, **GridStyle)\n\t\tself.wUpload.bind('<Button-1>', self.startupload)\n\n\t\tself.wSyncDown = tk.Button(self.OpFrame, text = 'Sync Down 下载同步', underline = 5)\n\t\tself.wSyncDown.grid(row = 0, column = 2, sticky = Stretch, **GridStyle)\n\t\tself.wSyncDown.bind('<Button-1>', self.startsyncdown)\n\t\tself.bind_all('<Alt-d>', self.startsyncdown)\n\n\t\tself.wDownload = tk.Button(self.OpFrame, text = 'Download 下载')\n\t\tself.wDownload.grid(row = 0, column = 3, sticky = Stretch, **GridStyle)\n\t\tself.wDownload.bind('<Button-1>', self.startdownload)\n\n\t\tself.wSyncDelete = tk.Checkbutton(self.OpFrame, text = 'Sync Del 同步删除', underline = 7, variable = self.bSyncDelete)\n\t\tself.wSyncDelete.configure(foreground = 'red')\n\t\tself.wSyncDelete.grid(row = 0, column = 4, sticky = Stretch, **GridStyle)\n\t\tself.bind_all('<Alt-l>', lambda e: self.bSyncDelete.set(1 if self.bSyncDelete.get() == 0 else 0))\n\t\tself.wEnableLog = tk.Checkbutton(self.OpFrame, text = 'Log 日志', underline = 2, variable = self.bLog)\n\t\tself.wEnableLog.grid(row = 0, column = 5, sticky = Stretch, **GridStyle)\n\t\tself.bind_all('<Alt-g>', lambda e: self.bLog.set(1 if self.bLog.get() == 0 else 0))\n\n\t\tself.wCompare = tk.Button(self.OpFrame, text = 'Compare Dir 比较目录')\n\t\tself.wCompare.grid(row = 1, column = 0, sticky = Stretch, **GridStyle)\n\t\tself.wCompare.bind('<Button-1>', self.startcompare);\n\n\t\tself.wProgressBar = ttk.Progressbar(\n\t\t\tself, maximum = self.maxProgress, variable = self.progress,\n\t\t\tmode = 'determinate')\n\t\tself.wProgressBar.grid(row = 3, column = 0, columnspan = 3, sticky = Stretch, **GridStyle)\n\t\tself.wLog = MyLogText(self)\n\t\tself.wLog.grid(row = 4, column = 0, columnspan = 3, sticky = Stretch, **GridStyle)\n\n\t\tself.wClearLog = tk.Button(self.OpFrame, text = 'Clear Log 清空日志')\n\t\tself.wClearLog.grid(row = 1, column = 5, sticky = Stretch, **GridStyle)\n\t\tself.wClearLog.bind('<Button-1>',\n\t\t\tlambda e: self.wLog.delete('1.0', tk.END))\n\n\t\t#self.wLog.tag_add(fgtag(''))\n\t\t#self.wLog.tag_add(bgtag(''))\n\t\tfor k, v in ColorMap.items():\n\t\t\tft = fgtag(v)\n\t\t\tbt = bgtag(v)\n\t\t\t#self.wLog.tag_add(ft)\n\t\t\tself.wLog.tag_config(ft, foreground = v)\n\t\t\t#self.wLog.tag_add(bt)\n\t\t\tself.wLog.tag_config(bt, background = v)\n\n\t\tcenterwindow(self.master)\n\n\tdef initbypy(self):\n\t\tself.byp = ByPy(verbose = 1)\n\n\tdef selectlocalpath(self, *args):\n\t\tself.localPath.set(\n\t\t\ttkFileDialog.askopenfilename(\n\t\t\t\ttitle = \"Please select a local file \" + \\\n\t\t\t\t\t\"(remove the file name later if you \" + \\\n\t\t\t\t\t\"want to select a directory)\",\n\t\t\t\tinitialdir = self.wLocalPath,\n\t\t\t\tparent = self))\n\n\tdef selectremotepath(self, *args):\n\t\tremoteList = RemoteListGui(self, self.byp, self.remotePath.get())\n\t\tcenterwindow(remoteList)\n\t\tremoteList.wait_window(remoteList)\n\t\tself.remotePath.set(remoteList.result)\n\n\tdef syncupproc(self, lpath, rpath, delete):\n\t\tself.byp.syncup(lpath, rpath, delete)\n\t\tself.threadrunning = False\n\n\tdef startsyncup(self, *args):\n\t\tif not self.threadrunning:\n\t\t\tself.threadrunning == True\n\t\t\tthreading.Thread(target = self.syncupproc,\n\t\t\t\targs = (\n\t\t\t\t\tself.localPath.get(),\n\t\t\t\t\tself.remotePath.get(),\n\t\t\t\t\tself.bSyncDelete.get())).start()\n\n\tdef uploadproc(self, lpath, rpath):\n\t\tself.byp.upload(lpath, rpath)\n\t\tself.threadrunning = False\n\n\tdef startupload(self, *args):\n\t\tif not self.threadrunning:\n\t\t\tself.threadrunning == True\n\t\t\tthreading.Thread(target = self.uploadproc,\n\t\t\t\targs = (\n\t\t\t\t\tself.localPath.get(),\n\t\t\t\t\tself.remotePath.get())).start()\n\n\tdef syncdownproc(self, rpath, lpath, delete):\n\t\tself.byp.syncdown(rpath, lpath, delete)\n\t\tself.threadrunning = False\n\n\tdef startsyncdown(self, *args):\n\t\tif not self.threadrunning:\n\t\t\tself.threadrunning == True\n\t\t\tthreading.Thread(target = self.syncdownproc,\n\t\t\t\targs = (\n\t\t\t\t\tself.remotePath.get(),\n\t\t\t\t\tself.localPath.get(),\n\t\t\t\t\tself.bSyncDelete.get())).start()\n\n\tdef downloadproc(self, rpath, lpath):\n\t\tif len(rpath) == 0 or rpath[-1] == '/':\n\t\t\tself.byp.downdir(rpath, lpath)\n\t\telse:\n\t\t\tself.byp.downfile(rpath, lpath)\n\t\tself.threadrunning = False\n\n\tdef startdownload(self, *args):\n\t\tif not self.threadrunning:\n\t\t\tself.threadrunning == True\n\t\t\tthreading.Thread(target = self.downloadproc,\n\t\t\t\targs = (\n\t\t\t\t\tself.remotePath.get(),\n\t\t\t\t\tself.localPath.get())).start()\n\n\tdef compareproc(self, rpath, lpath):\n\t\tself.byp.compare(rpath, lpath)\n\t\tself.threadrunning = False\n\n\tdef startcompare(self, *args):\n\t\tif not self.threadrunning:\n\t\t\tself.threadrunning == True\n\t\t\tthreading.Thread(target = self.compareproc,\n\t\t\t\targs = (\n\t\t\t\t\tself.remotePath.get(),\n\t\t\t\t\tself.localPath.get())).start()\n\ndef main():\n\ttkRoot = tk.Tk()\n\tui = BypyGui(tkRoot)\n\tui.mainloop()\n\nif __name__ == '__main__':\n\tmain()\n\ndef unused():\n\t''' just prevent unused warnings '''\n\ttkMessageBox.showinfo('')\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/gvar.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport locale\nimport time\nfrom . import const\n\n## global variables\ntry:\n\tSystemLanguageCode, SystemEncoding = locale.getlocale()\nexcept ValueError as e:\n\t# https://coderwall.com/p/-k_93g/mac-os-x-valueerror-unknown-locale-utf-8-in-python\n\t# Mac OS X: ValueError: unknown locale: UTF-8 in Python\n\t# Proper fix:\n\t# export LC_ALL=en_US.UTF-8\n\t# export LANG=en_US.UTF-8\n\tif e.args and e.args[0] and e.args[0] == \"unknown locale: UTF-8\":\n\t\tSystemLanguageCode, SystemEncoding = '', 'utf-8'\n\telse:\n\t\traise\n# the previous time stdout was flushed, maybe we just flush every time, or maybe this way performs better\n# http://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print\nlast_stdout_flush = time.time()\n#last_stdout_flush = 0\n# save cache if more than 10 minutes passed\nlast_cache_save = time.time()\n\n# mutable, the actual ones used, capital ones are supposed to be immutable\n# this is introduced to support mirrors\npcsurl  = const.PcsUrl\ncpcsurl = const.CPcsUrl\ndpcsurl = const.DPcsUrl\n\n"
  },
  {
    "path": "bypy/monkey.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\nimport sys\nfrom functools import partial\n\nfrom . import printer_console\nfrom . import bypy\nfrom . import printer\nfrom . import cached\nfrom . import util\n\ntry:\n\tvi = sys.version_info\n\tif vi[0] == 2:\n\t\timport Tkinter\n\t\tTkinter\n\telif vi[0] == 3:\n\t\timport tkinter\n\t\ttkinter\nexcept ImportError:\n\tprinter_gui = None\nelse:\n\tfrom . import printer_gui\n\ndef setconsole():\n\tbypy.pr = cached.pr = util.pr = printer_console.pr\n\tbypy.prcolor = util.prcolor = printer.prcolor = printer_console.prcolor\n\tbypy.ask = util.ask = printer_console.ask\n\tbypy.pprgr = util.pprgr = printer_console.pprgr\n\ndef setgui(*arg):\n\tinst = arg[0]\n\tbypy.pr = cached.pr = util.pr = partial(printer_gui.pr, inst)\n\tbypy.prcolor = util.prcolor = printer.prcolor = partial(printer_gui.prcolor, inst)\n\tbypy.ask = util.ask = partial(printer_gui.ask, inst)\n\tbypy.pprgr = util.pprgr = partial(printer_gui.pprgr, inst)\n\ndef patchpr(func):\n\tbypy.pr = cached.pr = util.pr = func\n\ndef patchprcolor(func):\n\tbypy.prcolor = util.prcolor = printer.prcolor = func\n\ndef patchask(func):\n\tbypy.ask = util.ask = func\n\ndef patchpprgr(func):\n\tbypy.pprgr = util.pprgr = func\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/panapi.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\n\nimport os\nimport io\n\nfrom . import const\nfrom . import gvar\nfrom .util import (\n\tpr, perr, formatex,\n\tls_type, ls_time, get_pcs_path)\nfrom .bypy import ByPy\n\n# put all xslidian's bduss extensions here, i never tried out them though\nclass PanAPI(ByPy):\n\tIEBDUSSExpired = -6\n\t# Does https work? if so, we should always use https\n\t#PanAPIUrl = 'http://pan.baidu.com/api/'\n\tPanAPIUrl = 'https://pan.baidu.com/api/'\n\n\tdef __init__(self, **kwargs):\n\t\tsuper(PanAPI, self).__init__(**kwargs)\n\t\tself._bdusspath= self._configdir + os.sep + 'bypy.bduss'\n\t\tself._bduss = ''\n\t\tif not self._load_local_bduss():\n\t\t\tself.pv(\"BDUSS not found at '{}'.\".format(self._bdusspath))\n\n\tdef _load_local_bduss(self):\n\t\ttry:\n\t\t\twith io.open(self._bdusspath, 'rb') as infile:\n\t\t\t\tself._bduss = infile.readline().strip()\n\t\t\t\tself.pd(\"BDUSS loaded: {}\".format(self._bduss))\n\t\t\t\tself._cookies = {'BDUSS': self._bduss}\n\t\t\t\treturn True\n\t\texcept IOError as ex:\n\t\t\tself.pd(\"Error loading BDUSS:\")\n\t\t\tself.pd(formatex(ex))\n\t\t\treturn False\n\n\t# overriding\n\tdef _handle_more_response_error(self, r, sc, ec, act, actargs):\n\t\tresult = const.ERequestFailed\n\n\t\t# user not exists\n\t\tif ec == 31045: # and sc == 403:\n\t\t\tself.pd(\"BDUSS has expired\")\n\t\t\tresult = PanAPI.IEBDUSSExpired\n\t\t# topath already exists\n\t\telif ec == 31196: # and sc == 403:\n\t\t\tself.pd(\"UnzipCopy destination already exists.\")\n\t\t\tresult = act(r, actargs)\n\t\t# file copy failed\n\t\telif ec == 31197: # and sc == 503:\n\t\t\tself.pd(\"File copy failed\")\n\t\t\tresult = act(r, actargs)\n\t\t# file size exceeds limit\n\t\telif ec == 31199: # and sc == 403:\n\t\t\tresult = act(r, actargs)\n\n\t\treturn result\n\n\tdef unzip(self, remotepath, subpath = '/', start = 0, limit = 1000):\n\t\t''' Usage: unzip <remotepath> [<subpath> [<start> [<limit>]]]'''\n\t\trpath = get_pcs_path(remotepath)\n\t\treturn self._panapi_unzip_file(rpath, subpath, start, limit);\n\n\tdef _panapi_unzip_file_act(self, r, args):\n\t\tj = r.json()\n\t\tself.pd(\"Unzip response: {}\".format(j))\n\t\tif j['errno'] == 0:\n\t\t\tif 'time' in j:\n\t\t\t\tperr(\"Extraction not completed yet: '{}'...\".format(args['path']))\n\t\t\t\treturn const.ERequestFailed\n\t\t\telif 'list' in j:\n\t\t\t\tfor e in j['list']:\n\t\t\t\t\tpr(\"{}\\t{}\\t{}\".format(ls_type(e['isdir'] == 1), e['file_name'], e['size']))\n\t\treturn const.ENoError\n\n\tdef _panapi_unzip_file(self, rpath, subpath, start, limit):\n\t\tpars = {\n\t\t\t'path' : rpath,\n\t\t\t'start' : start,\n\t\t\t'limit' : limit,\n\t\t\t'subpath' : '/' + subpath.strip('/') }\n\n\t\tself.pd(\"Unzip request: {}\".format(pars))\n\t\treturn self._get(PanAPI.PanAPIUrl + 'unzip?app_id=250528',\n\t\t\t\t\t\t  pars, self._panapi_unzip_file_act, cookies = self._cookies, actargs = pars )\n\n\tdef extract(self, remotepath, subpath, saveaspath = None):\n\t\t''' Usage: extract <remotepath> <subpath> [<saveaspath>]'''\n\t\trpath = get_pcs_path(remotepath)\n\t\ttopath = get_pcs_path(saveaspath)\n\t\tif not saveaspath:\n\t\t\ttopath = os.path.dirname(rpath) + '/' + subpath\n\t\treturn self._panapi_unzipcopy_file(rpath, subpath, topath)\n\n\tdef _panapi_unzipcopy_file_act(self, r, args):\n\t\tj = r.json()\n\t\tself.pd(\"UnzipCopy response: {}\".format(j))\n\t\tif 'path' in j:\n\t\t\tself.pv(\"Remote extract: '{}#{}' =xx=> '{}' OK.\".format(args['path'], args['subpath'], j['path']))\n\t\t\treturn const.ENoError\n\t\telif 'error_code' in j:\n\t\t\tif j['error_code'] == 31196:\n\t\t\t\tperr(\"Remote extract: '{}#{}' =xx=> '{}' FAILED. File already exists.\".format(args['path'], args['subpath'], args['topath']))\n\t\t\t\tsubresult = self._delete(args['topath'])\n\t\t\t\tif subresult == const.ENoError:\n\t\t\t\t\treturn self._panapi_unzipcopy_file(args['path'], args['subpath'], args['topath'])\n\t\t\t\telse:\n\t\t\t\t\treturn const.ERequestFailed\n\t\t\telif j['error_code'] == 31199:\n\t\t\t\tperr(\"Remote extract: '{}#{}' =xx=> '{}' FAILED. File too large.\".format(args['path'], args['subpath'], args['topath']))\n\t\t\t\treturn const.EMaxRetry\n\t\t\telse:\n\t\t\t\tperr(\"Remote extract: '{}#{}' =xx=> '{}' FAILED. Unknown error {}: {}.\".format(args['path'], args['subpath'], args['topath'], j['error_code'], j['error_msg']))\n\t\treturn const.EMaxRetry\n\n\tdef _panapi_unzipcopy_file(self, rpath, subpath, topath):\n\t\tpars = {\n\t\t\t'app_id' : 250528,\n\t\t\t'method' : 'unzipcopy',\n\t\t\t'path' : rpath,\n\t\t\t'subpath' : '/' + subpath.strip('/'),\n\t\t\t'topath' : topath }\n\n\t\tself.pd(\"UnzipCopy request: {}\".format(pars))\n\t\treturn self._get(gvar.pcsurl + 'file',\n\t\t\t\t\t\t  pars, self._panapi_unzipcopy_file_act, addtoken = False, cookies = self._cookies, actargs = pars )\n\n\tdef revision(self, remotepath):\n\t\t''' Usage: revision <remotepath> '''\n\t\trpath = get_pcs_path(remotepath)\n\t\treturn self._panapi_revision_list(rpath)\n\n\tdef history(self, remotepath):\n\t\t''' Usage: history <remotepath> '''\n\t\treturn self.revision(remotepath)\n\n\tdef _panapi_revision_list_act(self, r, args):\n\t\tj = r.json()\n\t\tself.pd(\"RevisionList response: {}\".format(j))\n\t\tif j['errno'] == 0:\n\t\t\tif 'list' in j:\n\t\t\t\tfor e in j['list']:\n\t\t\t\t\tpr(\"{}\\t{}\\t{}\".format(e['revision'], e['size'], ls_time(e['revision'] // 1e6)))\n\t\t\treturn const.ENoError\n\t\tif j['errno'] == -6: # invalid BDUSS\n\t\t\tpr(\"BDUSS has expired.\")\n\t\t\treturn PanAPI.IEBDUSSExpired\n\t\tif j['errno'] == -9:\n\t\t\tpr(\"File '{}' not exists.\".format(args['path']))\n\t\t\treturn const.EFileNotFound\n\t\treturn const.ENoError\n\n\tdef _panapi_revision_list(self, rpath):\n\t\tpars = {\n\t\t\t'path' : rpath,\n\t\t\t'desc' : 1 }\n\n\t\tself.pd(\"RevisionList request: {}\".format(pars))\n\t\treturn self._post(PanAPI.PanAPIUrl + 'revision/list?app_id=250528',\n\t\t\t\t\t\t   {}, self._panapi_revision_list_act, pars, data = pars, cookies = self._cookies )\n\n\tdef revert(self, remotepath, revision, dir = None):\n\t\t''' Usage: revert <remotepath> revisionid [dir]'''\n\t\trpath = get_pcs_path(remotepath)\n\t\tdir = get_pcs_path(dir)\n\t\tif not dir:\n\t\t\tdir = os.path.dirname(rpath)\n\t\treturn self._panapi_revision_revert(rpath, revision, dir)\n\n\tdef _panapi_revision_revert_act(self, r, args):\n\t\tj = r.json()\n\t\tself.pd(\"RevisionRevert response: {}\".format(j))\n\t\tif j['errno'] == 0:\n\t\t\tself.pv(\"Remote revert: '{}#{}' =rr=> '{}' OK.\".format(args['path'], args['revision'], j['path']))\n\t\t\treturn const.ENoError\n\t\tif j['errno'] == -6: # invalid BDUSS\n\t\t\tpr(\"BDUSS has expired.\")\n\t\t\treturn PanAPI.IEBDUSSExpired\n\t\tif j['errno'] == -9:\n\t\t\tpr(\"File '{}' not exists.\".format(args['path']))\n\t\t\treturn const.EFileNotFound\n\t\tif j['errno'] == 10:\n\t\t\tpr(\"Reverting '{}' in process...\".format(args['path']))\n\t\t\treturn const.ERequestFailed\n\t\treturn const.ENoError\n\n\tdef _panapi_revision_revert(self, rpath, revision, dir = None):\n\t\tif not dir:\n\t\t\tdir = os.path.dirname(rpath)\n\t\tpars = {\n\t\t\t'revision' : revision,\n\t\t\t'path' : rpath,\n\t\t\t'type' : 2,\n\t\t\t'dir' : dir }\n\n\t\tself.pd(\"RevisionRevert request: {}\".format(pars))\n\t\treturn self._post(PanAPI.PanAPIUrl + 'revision/revert?app_id=250528',\n\t\t\t\t\t\t   {}, self._panapi_revision_revert_act, pars, data = pars, cookies = self._cookies )\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/printer.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport time\n\nfrom .termcolor import TermColor\nfrom . import printer_console\n\nprcolor = printer_console.prcolor\n\ndef plog(tag, msg, showtime = True, showdate = False,\n\t\tprefix = '', suffix = '', fg = TermColor.Nil, bg = TermColor.Nil):\n\tif showtime or showdate:\n\t\tnow = time.localtime()\n\t\tif showtime:\n\t\t\ttag += time.strftime(\"[%H:%M:%S] \", now)\n\t\tif showdate:\n\t\t\ttag += time.strftime(\"[%Y-%m-%d] \", now)\n\n\tif prefix:\n\t\tprcolor(\"{0}{1}\".format(tag, prefix), fg, bg)\n\n\tprcolor(\"{0}{1}\".format(tag, msg), fg, bg)\n\n\tif suffix:\n\t\tprcolor(\"{0}{1}\".format(tag, suffix), fg, bg)\n\ndef perr(msg, showtime = True, showdate = False, prefix = '', suffix = ''):\n\treturn plog('<E> ', msg, showtime, showdate, prefix, suffix, TermColor.Red)\n\ndef pwarn(msg, showtime = True, showdate = False, prefix = '', suffix = ''):\n\treturn plog('<W> ', msg, showtime, showdate, prefix, suffix, TermColor.Yellow)\n\ndef bannerwarn(msg):\n\tpwarn('!' * 80, showtime = False)\n\tpwarn(msg, showtime = False)\n\tpwarn('!' * 80, showtime = False)\n\ndef pinfo(msg, showtime = True, showdate = False, prefix = '', suffix = ''):\n\treturn plog('<I> ', msg, showtime, showdate, prefix, suffix, TermColor.Green)\n\ndef pdbg(msg, showtime = True, showdate = False, prefix = '', suffix = ''):\n\treturn plog('<D> ', msg, showtime, showdate, prefix, suffix, TermColor.Cyan)\n\n"
  },
  {
    "path": "bypy/printer_console.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\nimport time\n\n# unify Python 2 and 3\nif sys.version_info[0] == 3:\n\traw_input = input\n\nfrom . import const\nfrom . import gvar\nfrom .printer_util import (\n\tiswindows, human_speed, human_size, human_time_short)\n\ndef colorstr(msg, fg, bg):\n\tCSI = '\\x1b['\n\tfgs = ''\n\tbgs = ''\n\tif fg >=0 and fg <= 7:\n\t\tfgs = str(fg + 30)\n\n\tif bg >= 0 and bg <=7:\n\t\tbgs = str(bg + 40)\n\n\tcs = ';'.join([fgs, bgs]).strip(';')\n\tif cs:\n\t\treturn CSI + cs + 'm' + msg + CSI + '0m'\n\telse:\n\t\treturn msg\n\ndef pr(msg):\n\tprint(msg)\n\t# we need to flush the output periodically to see the latest status\n\tnow = time.time()\n\tif now - gvar.last_stdout_flush >= const.PrintFlushPeriodInSec:\n\t\tsys.stdout.flush()\n\t\tgvar.last_stdout_flush = now\n\ndef prcolor(msg, fg, bg):\n\tif sys.stdout.isatty() and not iswindows():\n\t\tpr(colorstr(msg, fg, bg))\n\telse:\n\t\tpr(msg)\n\ndef ask(msg, enter = True):\n\tpr(msg)\n\tif enter:\n\t\tpr('Press [Enter] when you are done')\n\treturn raw_input()\n\n# print progress\n# https://stackoverflow.com/questions/3173320/text-progress-bar-in-the-console\ndef pprgr(finish, total, start_time = None, existing = 0,\n\t\tprefix = '', suffix = '', seg = 20):\n\t# we don't want this goes to the log, so we use stderr\n\tif total > 0:\n\t\tsegth = seg * finish // total\n\t\tpercent = 100 * finish // total\n\t\tcurrent_batch_percent = 100 * (finish - existing) // total\n\telse:\n\t\tsegth = seg\n\t\tpercent = 100\n\t\tcurrent_batch_percent = 0\n\n\teta = ''\n\tnow = time.time()\n\tif start_time is not None and current_batch_percent > 5 and finish > 0:\n\t\tfinishf = float(finish) - float(existing)\n\t\ttotalf = float(total)\n\t\tremainf = totalf - float(finish)\n\t\telapsed = now - start_time\n\t\tspeed = human_speed(finishf / elapsed)\n\t\teta = 'ETA: ' + human_time_short(elapsed * remainf / finishf) + \\\n\t\t\t\t' (' + speed + ', ' + \\\n\t\t\t\thuman_time_short(elapsed) + ' gone)'\n\tmsg = '\\r' + prefix + '[' + segth * '=' + (seg - segth) * '_' + ']' + \\\n\t\t\" {}% ({}/{})\".format(percent, human_size(finish, 1), human_size(total, 1)) + \\\n\t\t' ' + eta + suffix\n\t#msg = '\\r' + prefix + '[' + segth * '=' + (seg - segth) * '_' + ']' + \\\n\t#\t\" {}% ({}/{})\".format(percent, human_size(finish), human_size(total)) + \\\n\t#\t' ' + eta + suffix\n\tsys.stderr.write(msg + ' ') # space is used as a clearer\n\tsys.stderr.flush()\n\n"
  },
  {
    "path": "bypy/printer_gui.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\n\nfrom .tkutil import (\n\tColorMap, fgtag, bgtag,\n\tStretch, MyReadOnlyText, GridStyle)\n\nvi = sys.version_info\nif vi[0] == 2:\n\timport Tkinter as tk\nelif vi[0] == 3:\n\timport tkinter as tk\n\nfrom .termcolor import TermColor\nfrom .tkutil import centerwindow\n\nclass AskGui(tk.Toplevel):\n\tdef __init__(self, master = None,\n\t\t\tmessage = \"\",\n\t\t\ttitle = \"Question\"):\n\t\ttk.Toplevel.__init__(self, master)\n\n\t\tself.message = message\n\t\tself.input = ''\n\n\t\tself.transient(master)\n\t\tself.master = master\n\t\tif title:\n\t\t\tself.title(title)\n\n\t\tself.CreateWidgets()\n\t\tself.grab_set()\n\n\tdef End(self, event):\n\t\tself.input = self.wInput.get()\n\t\tself.master.focus_set()\n\t\tself.destroy()\n\n\tdef CreateWidgets(self):\n\t\tself.grid_columnconfigure(0, weight = 1)\n\t\tself.grid_rowconfigure(0, weight = 1)\n\t\tself.wMessage = MyReadOnlyText(self, height = 8, bg = 'wheat')\n\t\tself.wMessage.insert(tk.END, self.message + '\\n')\n\t\tself.wMessage.insert(tk.END, 'Press [OK] when you are done\\n')\n\t\tself.wMessage.grid(sticky = Stretch, **GridStyle)\n\t\tself.wInput = tk.Entry(self, width = 100)\n\t\tself.wInput.grid(row = 1, column = 0, sticky = tk.E + tk.W, **GridStyle)\n\t\tself.wInput.bind('<Return>', self.End)\n\t\tself.wOK = tk.Button(self, text = 'OK', default = tk.ACTIVE)\n\t\tself.wOK.grid(row = 2, column = 0, sticky = Stretch, **GridStyle)\n\t\tself.wOK.bind('<Button-1>', self.End)\n\n\t\tself.wInput.focus_set()\n\n\t\tself.protocol(\"WM_DELETE_WINDOW\", lambda: ())\n\ndef prcolor(self, msg, fg, bg):\n\tif self.bLog.get() != 0:\n\t\tself.wLog.insert(tk.END, msg + '\\n',\n\t\t\t(fgtag(ColorMap[fg]) if fg in ColorMap else fgtag(''),\n\t\t\t\tbgtag(ColorMap[bg]) if bg in ColorMap else bgtag('')))\n\ndef pr(self, msg):\n\t#return self.prcolor(msg, TermColor.Nil, TermColor.Nil)\n\treturn prcolor(self, msg, TermColor.Nil, TermColor.Nil)\n\ndef ask(self, message = \"Please input\", enter = True, title = \"Question\"):\n\tasker = AskGui(self, message, title)\n\tcenterwindow(asker)\n\tasker.wait_window(asker)\n\treturn asker.input\n\ndef pprgr(self, finish, total, start_time= None, existing = 0,\n\t\tprefix = '', suffix = '', seg = 1000):\n\tself.progress.set(self.maxProgress * (finish - existing) // total)\n\n"
  },
  {
    "path": "bypy/printer_util.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# this file exists to avoid circular dependencies\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport os\nimport math\nimport re\n\nfrom . import const\n\ndef iswindows():\n\treturn os.name == 'nt'\n\ndef human_time(seconds):\n\t''' DocTests:\n\t>>> human_time(0) == ''\n\tTrue\n\t>>> human_time(122.1) == '2m2s'\n\tTrue\n\t>>> human_time(133) == '2m13s'\n\tTrue\n\t>>> human_time(12345678) == '20W2D21h21m18s'\n\tTrue\n\t'''\n\tisec = int(seconds)\n\ts = isec % 60\n\tm = isec // 60 % 60\n\th = isec // 60 // 60 % 24\n\td = isec // 60 // 60 // 24 % 7\n\tw = isec // 60 // 60 // 24 // 7\n\n\tresult = ''\n\tfor t in [ ('W', w), ('D', d), ('h', h), ('m', m), ('s', s) ]:\n\t\tif t[1]:\n\t\t\tresult += str(t[1]) + t[0]\n\n\treturn result\n\ndef limit_unit(timestr, num = 2):\n\t''' DocTests:\n\t>>> limit_unit('1m2s', 1) == '1m'\n\tTrue\n\t>>> limit_unit('1m2s') == '1m2s'\n\tTrue\n\t>>> limit_unit('1m2s', 4) == '1m2s'\n\tTrue\n\t>>> limit_unit('1d2h3m2s') == '1d2h'\n\tTrue\n\t>>> limit_unit('1d2h3m2s', 1) == '1d'\n\tTrue\n\t'''\n\tl = len(timestr)\n\ti = 0\n\tp = 0\n\twhile i < num and p <= l:\n\t\tat = 0\n\t\twhile p < l:\n\t\t\tc = timestr[p]\n\t\t\tif at == 0:\n\t\t\t\tif c.isdigit():\n\t\t\t\t\tp += 1\n\t\t\t\telse:\n\t\t\t\t\tat += 1\n\t\t\telif at == 1:\n\t\t\t\tif not c.isdigit():\n\t\t\t\t\tp += 1\n\t\t\t\telse:\n\t\t\t\t\tat += 1\n\t\t\telse:\n\t\t\t\tbreak\n\n\t\ti += 1\n\n\treturn timestr[:p]\n\ndef human_time_short(seconds):\n\treturn limit_unit(human_time(seconds))\n\ndef interpret_size(si):\n\t'''\n\t>>> interpret_size(10)\n\t10\n\t>>> interpret_size('10')\n\t10\n\t>>> interpret_size('10b')\n\t10\n\t>>> interpret_size('10k')\n\t10240\n\t>>> interpret_size('10K')\n\t10240\n\t>>> interpret_size('10kb')\n\t10240\n\t>>> interpret_size('10kB')\n\t10240\n\t>>> interpret_size('a10')\n\tTraceback (most recent call last):\n\tValueError\n\t>>> interpret_size('10a')\n\tTraceback (most recent call last):\n\tKeyError: 'A'\n\t'''\n\tm = re.match(r\"\\s*(\\d+)\\s*([ac-z]?)(b?)\\s*$\", str(si), re.I)\n\tif m:\n\t\tif not m.group(2) and m.group(3):\n\t\t\ttimes = 1\n\t\telse:\n\t\t\ttimes = const.SIPrefixTimes[m.group(2).upper()] if m.group(2) else 1\n\t\treturn int(m.group(1)) * times\n\telse:\n\t\traise ValueError\n\ndef human_num(num, precision = 0, filler = ''):\n\t# https://stackoverflow.com/questions/15263597/python-convert-floating-point-number-to-certain-precision-then-copy-to-string/15263885#15263885\n\tnumfmt = '{{:.{}f}}'.format(precision)\n\texp = math.log(num, const.OneK) if num > 0 else 0\n\texpint = int(math.floor(exp))\n\tmaxsize = len(const.SIPrefixNames) - 1\n\tif expint > maxsize:\n\t\tprint(\"Ridiculously large number '{}' passed to 'human_num()'\".format(num))\n\t\texpint = maxsize\n\tunit = const.SIPrefixNames[expint]\n\treturn numfmt.format(num / float(const.OneK ** expint)) + filler + unit\n\ndef human_size(num, precision = 3):\n\t''' DocTests:\n\t>>> human_size(1000, 0) == '1000B'\n\tTrue\n\t>>> human_size(1025) == '1.001kB'\n\tTrue\n\t'''\n\treturn human_num(num, precision) + 'B'\n\ndef human_speed(speed, precision = 0):\n\treturn human_num(speed, precision) + 'B/s'\n\n"
  },
  {
    "path": "bypy/requester.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\nimport logging\nimport json\n\nfrom functools import partial\n\nimport requests\n\n# unify Python 2 and 3\nif sys.version_info[0] == 2:\n\timport urllib2 as ulr\n\timport httplib\n\timport cPickle as pickle\n\tpickleload = pickle.load\nelif sys.version_info[0] == 3:\n\timport urllib.request as ulr\n\timport http.client as httplib\n\timport pickle\n\tunicode = str\n\tbasestring = str\n\tlong = int\n\traw_input = input\n\tpickleload = partial(pickle.load, encoding=\"bytes\")\n\nfrom . import const\nfrom .printer import (pdbg, perr)\nfrom .util import (formatex)\n\n# the object returned from your Requester should have the following members\n# may be used for mocking / testing in the future\nclass RequesterResponse(object):\n\tdef __init__(self, url, text, status_code):\n\t\tsuper(RequesterResponse, self).__init__()\n\t\tself.text = text\n\t\tself.url = url\n\t\tself.status_code = status_code\n\t\tself.headers = {}\n\n\tdef json(self):\n\t\tjson.loads(self.text)\n\n# NOT in use, replacing the requests library is not trivial\nclass UrllibRequester(object):\n\tdef __init__(self):\n\t\tsuper(UrllibRequester, self).__init__()\n\n\t@classmethod\n\tdef setoptions(cls, options):\n\t\tpass\n\n\t@classmethod\n\tdef request(cls, method, url, **kwargs):\n\t\t\"\"\"\n\t\t:type method: str\n\t\t\"\"\"\n\t\tmethodupper = method.upper()\n\t\thasdata = 'data' in kwargs\n\t\tif methodupper == 'GET':\n\t\t\tif hasdata:\n\t\t\t\tprint(\"ERROR: Can't do HTTP GET when the 'data' parameter presents\")\n\t\t\t\tassert False\n\t\t\tresp = ulr.urlopen(url, **kwargs)\n\t\telif methodupper == 'POST':\n\t\t\tif hasdata:\n\t\t\t\tresp = ulr.urlopen(url, **kwargs)\n\t\t\telse:\n\t\t\t\tresp = ulr.urlopen(url, data = '', **kwargs)\n\t\telse:\n\t\t\traise NotImplementedError()\n\n\t\treturn resp\n\n\t@classmethod\n\tdef set_logging_level(cls, level):\n\t\tpass\n\n\t@classmethod\n\tdef disable_warnings(cls, debug):\n\t\tpass\n\n# extracting this class out would make it easier to test / mock\nclass RequestsRequester(object):\n\toptions = {}\n\n\tdef __init__(self):\n\t\tsuper(RequestsRequester, self).__init__()\n\n\t@classmethod\n\tdef setoptions(cls, options):\n\t\tcls.options = options\n\n\t@classmethod\n\tdef request(cls, method, url, **kwargs):\n\t\tfor k,v in cls.options.items():\n\t\t\tkwargs.setdefault(k, v)\n\t\treturn requests.request(method, url, **kwargs)\n\n\t@classmethod\n\tdef disable_warnings(cls, debug):\n\t\tfailures = 0\n\t\texmsg = ''\n\t\ttry:\n\t\t\timport requests.packages.urllib3 as ul3\n\t\t\tif debug:\n\t\t\t\tpdbg(\"Using requests.packages.urllib3 to disable warnings\")\n\t\t\t#ul3.disable_warnings(ul3.exceptions.InsecureRequestWarning)\n\t\t\t#ul3.disable_warnings(ul3.exceptions.InsecurePlatformWarning)\n\t\t\tul3.disable_warnings()\n\t\texcept Exception as ex:\n\t\t\tfailures += 1\n\t\t\texmsg += formatex(ex) + '-' * 64 + '\\n'\n\n\t\t# i don't know why under Ubuntu, 'pip install requests'\n\t\t# doesn't install the requests.packages.* packages\n\t\ttry:\n\t\t\timport urllib3 as ul3\n\t\t\tif debug:\n\t\t\t\tpdbg(\"Using urllib3 to disable warnings\")\n\t\t\tul3.disable_warnings()\n\t\texcept Exception as ex:\n\t\t\tfailures += 1\n\t\t\texmsg += formatex(ex)\n\n\t\tif failures >= 2:\n\t\t\tperr(\"Failed to disable warnings for Urllib3.\\n\"\n\t\t\t\t\"Possibly the requests library is out of date?\\n\"\n\t\t\t\t\"You can upgrade it by running '{}'.\\nExceptions:\\n{}\".format(\n\t\t\t\t\tconst.PipUpgradeCommand, exmsg))\n\n\t# only if user specifies '-ddd' or more 'd's, the following\n\t# debugging information will be shown, as it's very talkative.\n\t# it enables debugging at httplib level (requests->urllib3->httplib)\n\t# you will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.\n\t# the only thing missing will be the response.body which is not logged.\n\t@classmethod\n\tdef set_logging_level(cls, level):\n\t\tif level >= 3:\n\t\t\thttplib.HTTPConnection.debuglevel = 1\n\t\t\tlogging.basicConfig() # you need to initialize logging, otherwise you will not see anything from requests\n\t\t\tlogging.getLogger().setLevel(logging.DEBUG)\n\t\t\trequests_log = logging.getLogger(\"requests.packages.urllib3\")\n\t\t\trequests_log.setLevel(logging.DEBUG)\n\t\t\trequests_log.propagate = True\n\n\n"
  },
  {
    "path": "bypy/res/__init__.py",
    "content": ""
  },
  {
    "path": "bypy/res/auth.json",
    "content": "{\n\t\"AuthServerList\": [\n\t\t[\n\t\t\t\"https://bypyoa.vercel.app/api/auth\",\n\t\t\tfalse,\n\t\t\t\"Authorizing with the Vercel server ...\"\n\t\t],\n\t\t[\n\t\t\t\"https://qcfpba.api.cloudendpoint.cn/auth\",\n\t\t\tfalse,\n\t\t\t\"Vercel server failed, Authorizing with the cloudendpoint server ...\"\n\t\t],\n\t\t[\n\t\t\t\"https://8.142.131.121:8443/auth\",\n\t\t\tfalse,\n\t\t\t\"Vercel server failed. Last resort: authorizing with the Aliyun server ...\"\n\t\t]\n\t],\n\t\"RefreshServerList\": [\n\t\t[\n\t\t\t\"https://bypyoa.vercel.app/api/refresh\",\n\t\t\tfalse,\n\t\t\t\"Refreshing with the Vercel server ...\"\n\t\t],\n\t\t[\n\t\t\t\"https://qcfpba.api.cloudendpoint.cn/refresh\",\n\t\t\tfalse,\n\t\t\t\"Vercel server failed, Refreshing with the cloudendpoint server ...\"\n\t\t],\n\t\t[\n\t\t\t\"https://8.142.131.121:8443/refresh\",\n\t\t\tfalse,\n\t\t\t\"Vercel server failed. Last resort: refreshing with the Aliyun server ...\"\n\t\t]\n\t]\n}\n"
  },
  {
    "path": "bypy/struct.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nfrom .util import iswindows\n\n# tree represented using dictionary, (Obsolete: OrderedDict no longer required)\n# NOTE: No own-name is kept, so the caller needs to keep track of that\n# NOTE: Case-sensitive, as I don't want to waste time wrapping up a case-insensitive one\n# single-linked-list, no backwards traveling capability\nclass PathDictTree(dict):\n\tdef __init__(self, type = 'D', **kwargs):\n\t\tsuper(PathDictTree, self).__init__()\n\t\tself.type = type\n\t\tself.extra = {}\n\t\tfor k, v in kwargs.items():\n\t\t\tself.extra[k] = v\n\n\tdef __str__(self):\n\t\treturn self._str('')\n\n\tdef _str(self, prefix):\n\t\tresult = ''\n\t\tfor k, v in self.items():\n\t\t\tresult += \"{} - {}/{} - size: {} - md5: {}\\n\".format(\n\t\t\t\tv.type, prefix, k,\n\t\t\t\tv.extra['size'] if 'size' in v.extra else '',\n\t\t\t\tv.extra['md5'] if 'md5' in v.extra else '')\n\n\t\tfor k, v in self.items():\n\t\t\tif v.type == 'D':\n\t\t\t\tresult += v._str(prefix + '/' + k)\n\n\t\treturn result\n\n\tdef add(self, name, child):\n\t\tself[name] = child\n\t\treturn child\n\n\t# returns the child tree at the given path\n\t# assume that path is only separated by '/', instead of '\\\\'\n\tdef get(self, path):\n\t\tplace = self\n\t\tif path:\n\t\t\t# Linux can have file / folder names with '\\\\'?\n\t\t\tif iswindows():\n\t\t\t\tassert '\\\\' not in path\n\t\t\troute = filter(None, path.split('/'))\n\t\t\tfor part in route:\n\t\t\t\tif part in place:\n\t\t\t\t\tsub = place[part]\n\t\t\t\t\tassert place.type == 'D' # sanity check\n\t\t\t\t\tplace = sub\n\t\t\t\telse:\n\t\t\t\t\treturn None\n\n\t\treturn place\n\n\t# return a string list of all 'path's in the tree\n\tdef allpath(self):\n\t\tresult = []\n\n\t\tfor k, v in self.items():\n\t\t\tresult.append(k)\n\t\t\tif v.type == 'D':\n\t\t\t\tfor p in self.get(k).allpath():\n\t\t\t\t\tresult.append(k + '/' + p)\n\n\t\treturn result\n\n"
  },
  {
    "path": "bypy/termcolor.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\n# https://stackoverflow.com/questions/287871/print-in-terminal-with-colors-using-python\n# https://en.wikipedia.org/wiki/ANSI_escape_code#Colors\n# 0 - black, 1 - red, 2 - green, 3 - yellow\n# 4 - blue, 5 - magenta, 6 - cyan 7 - white\nclass TermColor:\n\tNumOfColors = 8\n\tBlack, Red, Green, Yellow, Blue, Magenta, Cyan, White = range(NumOfColors)\n\tNil = -1\n"
  },
  {
    "path": "bypy/test/__init__.py",
    "content": ""
  },
  {
    "path": "bypy/test/__main__.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nfrom .test import main\n\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "bypy/test/configdir/bypy.json",
    "content": "{\n  \"access_token\": \"121.12bd5816f7b30cf216dc27559e607e1b.YBwrc_935-SFtSXINYzPTRn1D-MDsw6KHcmj1CD.bm5HWQ\",\n  \"expires_in\": 2592000,\n  \"refresh_token\": \"122.53d1479f89c7a57c64354384a539cdf9.Yn4rYk1T0dICsrdBIYBvh50fQezCSqUvWyTtQJn.gVs2kA\",\n  \"scope\": \"basic netdisk\",\n  \"session_key\": \"\",\n  \"session_secret\": \"\"\n}"
  },
  {
    "path": "bypy/test/test.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# primitive sanity tests\n# TODO: refactor and improve\n# To Add:\n# - Special file names (single quote)\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\nimport os\nimport shutil\nimport tempfile\nimport re\nimport pprint\nimport copy\nimport time\nif sys.version_info[0] == 3:\n\tbasestring = str\n\nfrom .. import bypy\nfrom .. import monkey\nfrom ..cached import cached\nfrom .. import const\n\nTestGarbledPathNames = False\n\nMyDir = os.path.relpath(os.path.dirname(__file__))\nConfigDir = os.path.join(MyDir, 'configdir')\nDownloadDir = os.path.join(MyDir, 'downdir')\nTestDir = os.path.join(MyDir, 'testdir')\nShareDir = os.path.join(MyDir, 'sharedir')\n# monkey patch all the way\n# create some dummy files\nzerofilename = os.path.join(TestDir, 'allzero.1m.bin')\n\n# == Util fuctions ==\n# store the output, for further analysis\nclass StorePrinter(object):\n\tdef __init__(self, opr):\n\t\tself.opr = opr\n\t\tself.q = []\n\n\tdef pr(self, msg):\n\t\tself.q.append(msg)\n\t\tself.opr(msg)\n\n\tdef empty(self):\n\t\tdel self.q[:]\n\n\tdef getq(self):\n\t\treturn self.q\n\ndef assertif(cond, assertion):\n\tif cond:\n\t\tassert assertion\n\ndef assertsingle(by, assertion):\n\tassertif(by.processes == 1, assertion)\n\ndef chkok(by, result):\n\tif by.processes == 1:\n\t\tif result != const.ENoError:\n\t\t\tprint(\"Failed, result: {}\".format(result))\n\t\t\tassert False\n\telse:\n\t\tif result != const.ENoError and result != const.IEFileAlreadyExists:\n\t\t\tprint(\"Failed, result: {}\".format(result))\n\t\t\tassert False\n\ndef makesuredir(dirname):\n\tif not os.path.exists(dirname):\n\t\tos.mkdir(dirname)\n\ndef banner(msg):\n\ttitle = \"{0} {1} {0}\".format('=' * 8, msg)\n\tline = '=' * len(title)\n\tprint(line)\n\tprint(title)\n\tprint(line)\n\ndef ifany(list, require):\n\tfor element in list:\n\t\tif require(element):\n\t\t\treturn True\n\n\treturn False\n\ndef filterregex(list, regex):\n\trec = re.compile(regex)\n\treturn filter(lambda x: rec and isinstance(x, basestring) and rec.search(x), list)\n\ndef createdummyfile(filename, size, value = 0):\n\twith open(filename, 'wb') as f:\n\t\tba = bytearray([value] * size)\n\t\tf.write(ba)\n\nmpr = StorePrinter(bypy.pr)\n#bypy.pr = mpr.pr\nmonkey.patchpr(mpr.pr)\n#shutil.copy('bypy.json', ConfigDir)\n#shutil.copy('bypy.setting.json', ConfigDir)\n\ndef testmergeinto():\n\tfromc = {\n\t\t'a': {\n\t\t\t'a1': 1,\n\t\t\t'a2': 2\n\t\t},\n\t\t'b': {\n\t\t\t'b1': 10,\n\t\t\t'b2': 20\n\t\t}\n\t}\n\n\tto = {\n\t\t'a': {\n\t\t\t'a1': 9,\n\t\t\t'a3': 3\n\t\t},\n\t\t'b': {\n\t\t\t'b2': 90,\n\t\t\t'b3': 30,\n\t\t},\n\t\t'c': {\n\t\t\t'c1': 100\n\t\t}\n\t}\n\ttoorig = copy.deepcopy(to)\n\n\tpprint.pprint(fromc)\n\tpprint.pprint(to)\n\tcached.mergeinto(fromc, to)\n\tpprint.pprint(to)\n\tprint(repr(to))\n\tassert to == {u'a': {u'a1': 9, u'a3': 3, u'a2': 2}, u'c': {u'c1': 100}, u'b': {u'b1': 10, u'b2': 90, u'b3': 30}}\n\n\tto = toorig\n\tpprint.pprint(fromc)\n\tpprint.pprint(to)\n\tcached.mergeinto(fromc, to, False)\n\tpprint.pprint(to)\n\tprint(repr(to))\n\tassert to == {u'a': {u'a1': 1, u'a3': 3, u'a2': 2}, u'c': {u'c1': 100}, u'b': {u'b1': 10, u'b2': 20, u'b3': 30}}\n\ndef prepare(by):\n\t# preparation\n\tmakesuredir(ConfigDir)\n\t# we must upload something first, otherwise, listing / deleting the root directory will fail\n\tbanner(\"Uploading a file\")\n\tchkok(by, by.upload(TestDir + '/a.txt'))\n\tprint(\"Response: {}\".format(by.response.json()))\n\tbanner(\"Listing the root directory\")\n\tassert by.list('/') == const.ENoError\n\tprint(\"Response: {}\".format(by.response.json()))\n\tmpr.empty()\n\tcreatedummyfile(zerofilename, 1024 * 1024)\n\n\tmakesuredir(ShareDir)\n\tsharesubdir = ShareDir + '/subdir'\n\tmakesuredir(sharesubdir)\n\tcreatedummyfile(ShareDir + '/1M0.bin', 1024 * 1024)\n\tcreatedummyfile(ShareDir + '/1M1.bin', 1024 * 1024, 1)\n\tcreatedummyfile(sharesubdir + '/1M2.bin', 1024 * 1024, 2)\n\n\tif TestGarbledPathNames:\n\t\tjd = TestDir.encode() + os.sep.encode() + b'garble\\xec\\xeddir'\n\t\tjf = TestDir.encode() + os.sep.encode() + b'garble\\xea\\xebfile'\n\t\tmakesuredir(jd)\n\t\twith open(jf, 'w') as f:\n\t\t\tf.write(\"garbled\")\n\ndef emptyremote(by):\n\tbanner(\"Deleting all the files at PCS\")\n\tassert by.delete('/') == const.ENoError\n\tassert 'request_id' in by.response.json()\n\tmpr.empty()\n\ndef getquota(by):\n\t# quota\n\tbanner(\"Getting quota\")\n\tassert by.info() == const.ENoError\n\tresp = by.response.json()\n\tprint(\"Response: {}\".format(resp))\n\t#assert resp['used'] == 1048626\n\tassert resp['quota'] >= 2206539448320\n\tmpr.empty()\n\ndef assertsame(by):\n\tbypy.pr(by.result)\n\tassert len(by.result['diff']) == 0\n\tassert len(by.result['local']) == 0\n\tassert len(by.result['remote']) == 0\n\tassert len(by.result['same']) >= 5\n\ndef compare(by, left = TestDir, right = TestDir):\n\t# comparison\n\tbanner(\"Comparing\")\n\tassert by.compare(left, right) == const.ENoError\n\tassertsame(by)\n\tmpr.empty()\n\ndef uploaddir(by):\n\t# upload\n\tbanner(\"Uploading the local directory\")\n\tchkok(by, by.upload(TestDir, TestDir))\n\tassertsingle(by, filterregex(mpr.getq(),\n\t\t\t\t\t   r\"RapidUpload:.*testdir[\\\\/]allzero.1m.bin' =R=\\> '.*/testdir/allzero.1m.bin' OK\"))\n\tassertsingle(by, filterregex(mpr.getq(), r\".*testdir[\\\\/]a.txt' ==> '.*/testdir/a.txt' OK.\"))\n\tassertsingle(by, filterregex(mpr.getq(), r\".*testdir[\\\\/]b.txt' ==> '.*/testdir/b.txt' OK.\"))\n\tprint(\"Response: {}\".format(by.response.json()))\n\tmpr.empty()\n\ndef downdir(by):\n\t# download\n\tbanner(\"Downloading dir\")\n\tshutil.rmtree(DownloadDir, ignore_errors=True)\n\tchkok(by, by.downdir(TestDir, DownloadDir))\n\tchkok(by, by.download(TestDir, DownloadDir))\n\tassert by.compare(TestDir, DownloadDir) == const.ENoError\n\tassertsame(by)\n\tmpr.empty()\n\ndef syncup(by):\n\tbanner(\"Syncing up\")\n\temptyremote(by)\n\tchkok(by, by.syncup(TestDir, TestDir))\n\tassert by.compare(TestDir, TestDir) == const.ENoError\n\tassertsame(by)\n\tmpr.empty()\n\ndef syncdown(by):\n\tbanner(\"Syncing down\")\n\tshutil.rmtree(DownloadDir, ignore_errors=True)\n\tchkok(by, by.syncdown(TestDir, DownloadDir))\n\tchkok(by, by.compare(TestDir, DownloadDir))\n\tshutil.rmtree(DownloadDir, ignore_errors=True)\n\tassertsame(by)\n\tmpr.empty()\n\ndef cdl(by):\n\tbanner(\"Offline (cloud) download\")\n\tresult = by.cdl_cancel(123)\n\tassert int(result) == const.IETaskNotFound\n\tmpr.empty()\n\tassert by.cdl_list() == const.ENoError\n\t# {u'request_id': 353951550, u'task_info': [], u'total': 0}\n\tassertsingle(by, filterregex(mpr.getq(), r\"'total'\\s*:\\s*0\"))\n\tmpr.empty()\n\tassert by.cdl_query(123) == const.ENoError\n\tassertsingle(by, filterregex(mpr.getq(), r\"'result'\\s*:\\s*1\"))\n\tmpr.empty()\n\tassert by.cdl_add(\"http://dl.client.baidu.com/BaiduKuaijie/BaiduKuaijie_Setup.exe\", TestDir) == const.ENoError\n\tassertsingle(by, filterregex(mpr.getq(), r\"'task_id'\\s*:\\s*\\d+\"))\n\tassert by.cdl_addmon(\"http://dl.client.baidu.com/BaiduKuaijie/BaiduKuaijie_Setup.exe\", TestDir) == const.ENoError\n\tmpr.empty()\n\ndef testshare(by):\n\tbanner(\"Share\")\n\t#assert const.ENoError == by.share(ShareDir, '/', True, True)\n\tchkok(by, by.share(ShareDir, ShareDir))\n\tassertsingle(by, filterregex(mpr.getq(), r\"bypy accept /{}/1M0.bin\".format(ShareDir)))\n\tassertsingle(by, filterregex(mpr.getq(), r\"bypy accept /{}/1M1.bin\".format(ShareDir)))\n\tassertsingle(by, filterregex(mpr.getq(), r\"bypy accept /{}/subdir/1M2.bin\".format(ShareDir)))\n\tmpr.empty()\n\tchkok(by, by.upload(ShareDir, ShareDir))\n\tchkok(by, by.share(ShareDir, ShareDir, False))\n\tassertsingle(by, filterregex(mpr.getq(), r\"bypy accept /{}/1M0.bin\".format(ShareDir)))\n\tassertsingle(by, filterregex(mpr.getq(), r\"bypy accept /{}/1M1.bin\".format(ShareDir)))\n\tassertsingle(by, filterregex(mpr.getq(), r\"bypy accept /{}/subdir/1M2.bin\".format(ShareDir)))\n\tmpr.empty()\n\ndef createmanyfiles(dir, numFiles):\n\tshutil.rmtree(dir, ignore_errors=True)\n\tos.makedirs(dir)\n\tfor i in range(0, numFiles):\n\t\tfname = str(i).zfill(4)\n\t\tffname = os.path.join(dir, fname)\n\t\twith open(ffname, 'w') as f:\n\t\t\tf.write(fname)\n\ndef testmanyfiles(by):\n\tif sys.version_info[0] != 3:\n\t\treturn\n\tnumFiles = const.MaxListEntries * 2 + 10\n\tbanner(\"Test uploading of many ({}) files\".format(numFiles))\n\twith tempfile.TemporaryDirectory(prefix = 'bypytest_') as tmpdir:\n\t\tprint(\"Testing temp dir: \", tmpdir)\n\t\tcreatemanyfiles(tmpdir, numFiles)\n\t\tby.upload(tmpdir, tmpdir)\n\t\tcompare(by, tmpdir, tmpdir)\n\tmpr.empty()\n\ndef cleanup():\n\tos.remove(zerofilename)\n\t#shutil.rmtree(ConfigDir, ignore_errors=True)\n\tshutil.rmtree(ShareDir, ignore_errors=True)\n\tshutil.rmtree(DownloadDir, ignore_errors=True)\n\ndef runTests(by):\n\tprepare(by)\n\n\tgetquota(by)\n\t# sleep sometime helps preventing hanging requests <scorn>\n\t#cdl() # seems this is broken\n\ttime.sleep(2)\n\temptyremote(by)\n\ttime.sleep(2)\n\tuploaddir(by)\n\ttime.sleep(2)\n\tcompare(by)\n\ttime.sleep(2)\n\tdowndir(by)\n\ttime.sleep(2)\n\tsyncup(by)\n\ttime.sleep(2)\n\tsyncdown(by)\n\ttime.sleep(2)\n\ttestshare(by)\n\ttime.sleep(2)\n\ndef main():\n\ttestmergeinto()\n\n\ttry:\n\t\tby = bypy.ByPy(configdir=ConfigDir, debug=1, verbose=1)\n\t\tif 'refresh' in sys.argv:\n\t\t\tby.refreshtoken()\n\n\t\tif 'many' in sys.argv:\n\t\t\ttestmanyfiles(by)\n\t\t\treturn\n\n\t\trunTests(by)\n\t\tif '1' in sys.argv:\n\t\t\treturn\n\n\t\ttime.sleep(10)\n\t\tby = bypy.ByPy(configdir=ConfigDir, processes=2, debug=1, verbose=1)\n\t\trunTests(by)\n\t\tif '2' in sys.argv:\n\t\t\treturn\n\n\t\t# test aria2 downloading\n\t\tby = bypy.ByPy(configdir=ConfigDir, downloader='aria2', debug=1, verbose=1)\n\t\tdowndir(by)\n\t\tby = bypy.ByPy(configdir=ConfigDir, downloader='aria2', processes=2, debug=1, verbose=1)\n\t\tdowndir(by)\n\texcept KeyboardInterrupt:\n\t\tprint(\"User cancelled, cleaning up ...\")\n\tfinally:\n\t\tcleanup()\n\t\tprint(\"Clean up done.\")\n\n# this is barely a sanity test, more to be added\nif __name__ == \"__main__\":\n\tmain()\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "bypy/test/testdir/a.txt",
    "content": "First file\n"
  },
  {
    "path": "bypy/test/testdir/b.txt",
    "content": "Second file\n"
  },
  {
    "path": "bypy/test/testdir/hanzi.txt",
    "content": "华夏文化，源远流长。\n"
  },
  {
    "path": "bypy/test/testdir/subdir/aa.txt",
    "content": "First file in subdirectory\n"
  },
  {
    "path": "bypy/test/testdir/subdir/subsubdir/aaa.txt",
    "content": "File in a sub sub directory\n"
  },
  {
    "path": "bypy/tkutil.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\nimport sys\n\nvi = sys.version_info\nif vi[0] == 2:\n\timport ScrolledText as scrt\n\timport Tkinter as tk\nelif vi[0] == 3:\n\tfrom tkinter import scrolledtext as scrt\n\timport tkinter as tk\n\nfrom .termcolor import TermColor\n\nMyReadOnlyText = tk.Text\nMyLogText = scrt.ScrolledText\ntry:\n# https://stackoverflow.com/questions/3842155/is-there-a-way-to-make-the-tkinter-text-widget-read-only\n\tfrom idlelib.WidgetRedirector import WidgetRedirector\n\n\tclass ReadOnlyText(tk.Text):\n\t\tdef __init__(self, *args, **kwargs):\n\t\t\ttk.Text.__init__(self, *args, **kwargs)\n\t\t\tself.redirector = WidgetRedirector(self)\n\t\t\tself.insert = self.redirector.register(\"insert\", lambda *args, **kw: \"break\")\n\t\t\tself.delete = self.redirector.register(\"delete\", lambda *args, **kw: \"break\")\n\n\tclass ReadOnlyScrolledText(scrt.ScrolledText):\n\t\tdef __init__(self, *args, **kwargs):\n\t\t\tscrt.ScrolledText.__init__(self, *args, **kwargs)\n\t\t\tself.redirector = WidgetRedirector(self)\n\t\t\tself.insert = self.redirector.register(\"insert\", lambda *args, **kw: \"break\")\n\t\t\tself.delete = self.redirector.register(\"delete\", lambda *args, **kw: \"break\")\n\n\tMyReadOnlyText = ReadOnlyText\n\tMyLogText = ReadOnlyScrolledText\nexcept:\n\t# it's OK, we just ignore it\n\tpass\n\nStretch = tk.N+tk.E+tk.S+tk.W\nGridStyle = { 'padx' : 0, 'pady' : 0 }\n\nColorMap = {\n\tTermColor.Black: \"black\",\n\tTermColor.Red: \"red\",\n\tTermColor.Green: \"green\",\n\tTermColor.Yellow: \"yellow\",\n\tTermColor.Blue: \"blue\",\n\tTermColor.Magenta: \"magenta\",\n\tTermColor.Cyan: \"cyan\",\n\tTermColor.White: \"white\" }\n\ndef fgtag(text):\n\treturn 'FG' + text\n\ndef bgtag(text):\n\treturn 'BG' + text\n\ndef centerwindow(w):\n\tw.update() # fucking bit me\n\tsw, sh = w.winfo_screenwidth(), w.winfo_screenheight()\n\twidth, height = w.winfo_width(), w.winfo_height()\n\tx = (sw - width) // 2\n\ty = (sh - height) // 2\n\tw.geometry('{}x{}+{}+{}'.format(width, height, x, y))\n\n"
  },
  {
    "path": "bypy/util.py",
    "content": "#!/usr/bin/env python\n# encoding: utf-8\n# PYTHON_ARGCOMPLETE_OK\n\n# from __future__ imports must occur at the beginning of the file\nfrom __future__ import unicode_literals\nfrom __future__ import print_function\nfrom __future__ import division\n\n### imports\nimport os\nimport sys\nimport time\nimport io\nimport json\nimport pprint\nimport codecs\nimport threading\nimport traceback\nimport shutil\n# unify Python 2 and 3\nif sys.version_info[0] == 2:\n\tfrom Queue import Queue\nelif sys.version_info[0] == 3:\n\tunicode = str\n\tbasestring = str\n\tlong = int\n\traw_input = input\n\tfrom queue import Queue\n\nfrom . import const\nfrom . import printer_console\nfrom .printer_util import (iswindows, human_size, interpret_size)\nfrom .printer import (\n\tbannerwarn, plog, pdbg, pinfo, pwarn, perr)\n\npr = printer_console.pr\nprcolor = printer_console.prcolor\nask = printer_console.ask\npprgr = printer_console.pprgr\n\nhuman_size\ninterpret_size\nplog\npdbg\npinfo\npwarn\n\ndef remove_backslash(s):\n\treturn s.replace(r'\\/', r'/')\n\nrb = remove_backslash\n\n# no idea who screws the sys.stdout.encoding\n# the locale is 'UTF-8', sys.stdin.encoding is 'UTF-8',\n# BUT, sys.stdout.encoding is None ...\ndef fixenc(stdenc):\n\tif iswindows():\n\t\tbannerwarn(\"WARNING: StdOut encoding '{}' is unable to encode CJK strings.\\n\" \\\n\t\t\t\"Files with non-ASCII names may not be handled correctly.\".format(stdenc))\n\telse:\n\t\t# fix by @xslidian\n\t\tif not stdenc:\n\t\t\tstdenc = 'utf-8'\n\t\tsys.stdout = codecs.getwriter(stdenc)(sys.stdout)\n\t\tsys.stderr = codecs.getwriter(stdenc)(sys.stderr)\n\n# http://stackoverflow.com/questions/9403986/python-3-traceback-fails-when-no-exception-is-active\ndef formatex(ex):\n\ts = ''\n\tif ex and isinstance(ex, Exception):\n\t\ts = \"Exception:\\n{} - {}\\nStack:\\n{}\".format(\n\t\t\ttype(ex), ex, ''.join(traceback.format_stack()))\n\n\treturn s\n\n# marshaling\ndef str2bool(s):\n\tif isinstance(s, basestring):\n\t\tif s:\n\t\t\tsc = s.lower()[0]\n\t\t\tif sc == 't' or sc == 'y' or (sc >= '1' and sc <= '9'):\n\t\t\t\treturn True\n\t\t\telse:\n\t\t\t\treturn False\n\t\telse:\n\t\t\treturn False\n\telse:\n\t\t# don't change\n\t\treturn s\n\ndef str2int(s):\n\tif isinstance(s, basestring):\n\t\treturn int(s)\n\telse:\n\t\t# don't change\n\t\treturn s\n\ndef str2float(s):\n\tif isinstance(s, basestring):\n\t\treturn float(s)\n\telse:\n\t\t# don't change\n\t\treturn s\n\n# guarantee no-exception\ndef copyfile(src, dst):\n\tresult = const.ENoError\n\ttry:\n\t\tshutil.copyfile(src, dst)\n\texcept (shutil.Error, IOError) as ex:\n\t\tperr(\"Fail to copy '{}' to '{}'.\\n{}\".format(\n\t\t\tsrc, dst, formatex(ex)))\n\t\tresult = const.EFailToCreateLocalFile\n\n\treturn result\n\ndef movefile(src, dst):\n\tresult = const.ENoError\n\ttry:\n\t\tshutil.move(src, dst)\n\texcept (shutil.Error, OSError) as ex:\n\t\tperr(\"Fail to move '{}' to '{}'.\\n{}\".format(\n\t\t\tsrc, dst, formatex(ex)))\n\t\tresult = const.EFailToCreateLocalFile\n\n\treturn result\n\ndef removefile(path, verbose = False):\n\tresult = const.ENoError\n\ttry:\n\t\tif verbose:\n\t\t\tpr(\"Removing local file '{}'\".format(path))\n\t\tif path:\n\t\t\tos.remove(path)\n\texcept Exception as ex:\n\t\tperr(\"Fail to remove local fle '{}'.\\n{}\".format(\n\t\t\tpath, formatex(ex)))\n\t\tresult = const.EFailToDeleteFile\n\n\treturn result\n\ndef removedir(path, verbose = False):\n\tresult = const.ENoError\n\ttry:\n\t\tif verbose:\n\t\t\tpr(\"Removing local directory '{}'\".format(path))\n\t\tif path:\n\t\t\tshutil.rmtree(path)\n\texcept Exception as ex:\n\t\tperr(\"Fail to remove local directory '{}'.\\n{}\".format(\n\t\t\tpath, formatex(ex)))\n\t\tresult = const.EFailToDeleteDir\n\n\treturn result\n\ndef removepath(path):\n\tif os.path.isdir(path):\n\t\treturn removedir(path)\n\telif os.path.isfile(path):\n\t\treturn removefile(path)\n\telse:\n\t\tperr(\"Can't remove '{}', it's non-file and none-dir.\".format(path))\n\t\treturn const.EArgument\n\ndef makedir(path, mode = 0o777, verbose = False):\n\tresult = const.ENoError\n\n\tif verbose:\n\t\tpr(\"Creating local directory '{}'\".format(path))\n\n\tif path and not os.path.exists(path):\n\t\ttry:\n\t\t\tos.makedirs(path, mode)\n\t\texcept os.error as ex:\n\t\t\tperr(\"Failed at creating local dir '{}'.\\n{}\".format(\n\t\t\t\tpath, formatex(ex)))\n\t\t\tresult = const.EFailToCreateLocalDir\n\n\treturn result\n\n# guarantee no-exception\ndef getfilesize(path):\n\tsize = -1\n\ttry:\n\t\tsize = os.path.getsize(path)\n\texcept os.error as ex:\n\t\tperr(\"Exception occured while getting size of '{}'.\\n{}\".format(\n\t\t\tpath, formatex(ex)))\n\n\treturn size\n\n# guarantee no-exception\ndef getfilemtime(path):\n\tmtime = -1\n\ttry:\n\t\tmtime = os.path.getmtime(path)\n\texcept os.error as ex:\n\t\tperr(\"Exception occured while getting modification time of '{}'.\\n{}\".format(\n\t\t\tpath, formatex(ex)))\n\n\treturn mtime\n\ndef getfilemtime_int(path):\n\t# just int it, this is reliable no matter how stat_float_times() is changed\n\treturn int(getfilemtime(path))\n\n\t# mtime = getfilemtime(path)\n\t# if (mtime == -1):\n\t# \treturn mtime\n    #\n\t# if os.stat_float_times():\n\t# \tmtime = int(mtime)\n    #\n\t# return mtime\n\n# seems os.path.join() doesn't handle Unicode well\ndef joinpath(first, second, sep = os.sep):\n\thead = ''\n\tif first:\n\t\thead = first.rstrip(sep) + sep\n\n\ttail = ''\n\tif second:\n\t\ttail = second.lstrip(sep)\n\n\treturn head + tail\n\n# CAN Python make Unicode right?\n# http://houtianze.github.io/python/unicode/json/2016/01/03/another-python-unicode-fisaco-on-json.html\ndef jsondump_actual(data, f):\n\tif sys.version_info[0] == 2:\n\t\tf.write(unicode(json.dumps(data, ensure_ascii = False, sort_keys = True, indent = 2)))\n\telif sys.version_info[0] == 3:\n\t\tjson.dump(data, f, ensure_ascii = False, sort_keys = True, indent = 2)\n\n# no try ... except protection, will throw exceptions\ndef jsondump(data, filename, semaphore):\n\tif semaphore:\n\t\twith semaphore:\n\t\t\twith io.open(filename, 'w', encoding = 'utf-8') as f:\n\t\t\t\tjsondump_actual(data, f)\n\telse:\n\t\twith io.open(filename, 'w', encoding = 'utf-8') as f:\n\t\t\tjsondump_actual(data, f)\n\ndef jsondump_no_exception(data, filename, semaphore):\n\ttry:\n\t\tjsondump(data, filename, semaphore)\n\texcept Exception as ex:\n\t\tperr(\"Fail to dump json '{}' to file '{}'.\\nException:\\n{}\".format(\n\t\t\tdata, filename, formatex(ex)))\n\n# no try ... except protection, will throw exceptions\ndef jsonload(filename):\n\twith io.open(filename, 'r', encoding = 'utf-8') as f:\n\t\treturn json.load(f)\n\ndef jsonload_no_exception(filename):\n\ttry:\n\t\tjsonload(filename)\n\t# In `python 3`, the exception when failing to parse is `json.JSONDecodeError` (subclass of `ValueError`)\n\t# but in `python 2`, it's just `ValueError`\n\texcept Exception as ex:\n\t\tperr(\"Fail to load '{}' as json, exception:\\n{}\".format(filename, formatex(ex)))\n\t\treturn {}\n\ndef ls_type(isdir):\n\treturn 'D' if isdir else 'F'\n\ndef ls_time(itime):\n\treturn time.strftime('%Y-%m-%d, %H:%M:%S', time.localtime(itime))\n\n# no leading, trailing '/'\n# remote path rule:\n#  - all public methods of ByPy shall accept remote path as \"partial path\"\n#    (before calling get_pcs_path())\n#  - all private methods of ByPy shall accept remote path as \"full path\"\n#    (after calling get_pcs_path())\ndef get_pcs_path(path):\n\tif not path or path == '/' or path == '\\\\':\n\t\treturn const.AppPcsPath\n\n\treturn (const.AppPcsPath + '/' + path.strip('/')).rstrip('/')\n\ndef is_pcs_root_path(path):\n\treturn path == const.AppPcsPath or path == const.AppPcsPath + '/'\n\ndef print_pcs_list_bare(list):\n\tif list:\n\t\tfor f in list:\n\t\t\tpr(\"{} {} {} {} {} {}\".format(\n\t\t\t\tls_type(f['isdir']),\n\t\t\t\tf['path'],\n\t\t\t\tf['size'],\n\t\t\t\tls_time(f['ctime']),\n\t\t\t\tls_time(f['mtime']),\n\t\t\t\tf['md5'] if 'md5' in f else ''))\n\ndef print_pcs_list(json, foundmsg = \"Found:\", notfoundmsg = \"Nothing found.\"):\n\tlist = json['list']\n\tif list:\n\t\tpr(foundmsg)\n\t\tprint_pcs_list_bare(list)\n\telse:\n\t\tpr(notfoundmsg)\n\n# https://stackoverflow.com/questions/10883399/unable-to-encode-decode-pprint-output\nclass MyPrettyPrinter(pprint.PrettyPrinter):\n\tdef format(self, obj, context, maxlevels, level):\n\t\tif isinstance(obj, unicode):\n\t\t\t#return (obj.encode('utf8'), True, False)\n\t\t\treturn (obj, True, False)\n\t\tif isinstance(obj, bytes):\n\t\t\tconvert = False\n\t\t\t#for c in obj:\n\t\t\t#\tif ord(c) >= 128:\n\t\t\t#\t\tconvert = True\n\t\t\t#\t\tbreak\n\t\t\ttry:\n\t\t\t\tcodecs.decode(obj)\n\t\t\texcept:\n\t\t\t\tconvert = True\n\t\t\tif convert:\n\t\t\t\treturn (\"0x{}\".format(obj), True, False)\n\t\treturn pprint.PrettyPrinter.format(self, obj, context, maxlevels, level)\n\nclass NewThread(threading.Thread):\n\tdef __init__(self, func):\n\t\tthreading.Thread.__init__(self)\n\t\tself.func = func\n\n\tdef run(self):\n\t\tself.func()\n\ndef startthread(func):\n\tNewThread(func).start()\n\ndef inc_list_size(li, size = 3, filler = 0):\n\ti = len(li)\n\twhile (i < size):\n\t\tli.append(filler)\n\t\ti += 1\n\ndef comp_semver(v1, v2):\n\tv1a = v1.split('.')\n\tv2a = v2.split('.')\n\tv1ia = [int(i) for i in v1a]\n\tv2ia = [int(i) for i in v2a]\n\tinc_list_size(v1ia, 3)\n\tinc_list_size(v2ia, 3)\n\ti = 0\n\twhile (i < 3):\n\t\tif v1ia[i] != v2ia[i]:\n\t\t\treturn v1ia[i] - v2ia[i]\n\t\ti += 1\n\treturn 0\n\n# NOT in use, see deque\nclass FixedSizeQueue(object):\n\tdef __init__(self, size = 1024):\n\t\tself.size = size\n\t\tself.q = Queue()\n\n\tdef put(self, item):\n\t\tif self.q.qsize() >= self.size:\n\t\t\tself.q.get()\n\t\tself.q.put(item)\n\n\tdef get(self):\n\t\treturn self.q.get()\n\ndef nop(*args):\n\tpass\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "genrst.py",
    "content": "#!/usr/bin/env python\n\nimport pypandoc\n\nfor md in ['HISTORY']:\n\tpypandoc.convert_file(md + '.md', 'rst', outputfile=md + '.rst')\n"
  },
  {
    "path": "release.sh",
    "content": "#!/bin/sh\n\necho !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\necho !!! RUN THIS SCRIPT UNDER VIRTUALENV !!!\necho !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n# need to run the following commands before running this release script\n# (This is for macOS, and for python virtualenv is recommended)\n# --------\n# brew install pandoc\n# pip3 install pandoc pypandoc twine pyflakes wheel\n\n### Usage ###\n# - Testing: ./release.sh -buti\n# - Actual: ./release.sh -abigtu\n\n#set -o errexit\n#set -x\n\ntrap \"echo '=== Release script interrupted ==='; exit 255\" INT\n\ncheck() {\n\tcommand -v \"$1\" || { echo \"'$1' doesn't exist, aborting.\"; exit 255; }\n}\n\npycmd=python3\n\ncheck git\ncheck $pycmd\ncheck pandoc\ncheck pyflakes\ncheck twine\ncheck jq\n\nactual=0\nbuild=0\ninstall=0\nupload=0\ntestit=0\ntagit=0\n\nparsearg() {\n\twhile getopts \"abigtu\" opt; do\n\t\tcase \"$opt\" in\n\t\ta)\n\t\t\tactual=1\n\t\t\t;;\n\t\tb)\n\t\t\tbuild=1\n\t\t\t;;\n\t\tu)\n\t\t\tupload=1\n\t\t\t;;\n\t\ti)\n\t\t\tinstall=1\n\t\t\t;;\n\t\tt)\n\t\t\ttestit=1\n\t\t\t;;\n\t\tg)\n\t\t\ttagit=1\n\t\t\t;;\n\t\t*)\n\t\t\techo \"Invalid arguments.\"\n\t\t\texit 255\n\t\t\t;;\n\t\tesac\n\tdone\n}\n\nruntest() {\n\teval $pycmd -m pyflakes bypy\n\teval $pycmd setup.py test\n\t#eval $pycmd -m doctest -v bypy.py\n\teval $pycmd -m bypy -V\n\t# eval $pycmd -m bypy --config-dir bypy/test/configdir quota\n}\n\ninstalltest() {\n\t# due to requests not in testpypi\n\tif [ $actual -eq 0 ]\n\tthen\n\t\tpip install requests\n\telse\n\t\tpip uninstall -y requests\n\tfi\n\n\tpip uninstall -y bypy\n\tif [ -z \"$indexopt\" ]\n\tthen\n\t\tpip install -U bypy\n\telse\n\t\tpip install -U bypy \"$indexopt\"\n\tfi\n\tbypy -V\n\t# bypy --config-dir bypy/test/configdir quota\n}\n\nmain() {\n\t./syncver.sh\n\teval $pycmd genrst.py\n\tparsearg \"$@\"\n\n\tif [ \"$actual\" -eq 0 ]\n\tthen\n\t\trepoopt=\"-r testpypi\"\n\t\tindexopt=\"-ihttps://testpypi.python.org/simple/\"\n\telse\n\t\trepoopt=\"\"\n\t\tindexopt=\"\"\n\tfi\n\n\tif [ \"$tagit\" -eq 1 ]\n\tthen\n\t\t# shellcheck disable=SC2006\n\t\tbypyversion=`grep __version__ bypy/const.py | sed -e \"s/__version__ *= *'//g\" -e \"s/'//g\"`\n\t\tgit --no-pager tag\n\t\tgit tag \"$bypyversion\"\n\t\tgit push\n\t\tgit push --tags\n\t\tgit --no-pager tag\n\tfi\n\n\tif [ \"$testit\" -eq 1 ]\n\tthen\n\t\truntest\n\tfi\n\n\tif [ \"$build\" -eq 1 ]\n\tthen\n\t\trm dist/*\n\t\teval $pycmd setup.py clean --all\n\t\teval $pycmd setup.py bdist_wheel #sdist\n\tfi\n\n\tuploadcmd=\"twine upload dist/* $repoopt\"\n\tif [ \"$upload\" -eq 0 ]\n\tthen\n\t\techo \"$uploadcmd\"\n\telse\n\t\teval \"$uploadcmd\"\n\tfi\n\n\tif [ \"$install\" -eq 1 ]\n\tthen\n\t\tinstalltest\n\tfi\n}\n\nmain \"$@\"\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "requirements.txt",
    "content": "#requests[security]\nrequests\nrequests-toolbelt\nmultiprocess\n"
  },
  {
    "path": "setup.cfg",
    "content": "[metadata]\nlong_description = file: README.rst\n\n[bdist_wheel]\nuniversal = 1\n"
  },
  {
    "path": "setup.py",
    "content": "#!/usr/bin/env python\n# coding=utf-8\n\nimport io\nimport re\n\nfrom setuptools import setup\n\n# https://packaging.python.org/single_source_version/\n# CAN'T believe there is no single *clean* way of retrieving the version.\ndef getmeta(path, encoding = 'utf8'):\n\twith io.open(path, encoding = encoding) as fp:\n\t\tcontent = fp.read()\n\tmetakeys = ['title', 'version', 'desc', 'author', 'license', 'url']\n\tmetatrans = {'title': 'name', 'desc': 'description'}\n\tmeta = {}\n\tfor mk in metakeys:\n\t\tmatch = re.search(\n\t\t\tr\"^__\" + mk + r\"__\\s*=\\s*['\\\"]([^'\\\"]*)['\\\"]\",\n            content, re.M)\n\t\tif match:\n\t\t\tif mk in metatrans:\n\t\t\t\tkey = metatrans[mk]\n\t\t\telse:\n\t\t\t\tkey = mk\n\t\t\tmeta[key] = match.group(1)\n\t\telse:\n\t\t\traise RuntimeError(\"Unable to find meta key: {}\".format(mk))\n\treturn meta\n\nmeta = getmeta('bypy/const.py')\n\nlong_desc = '''\\\nDocuments:\n~~~~~~~~~~\nSee: https://github.com/houtianze/bypy\n\n\n'''\nrequirements = []\n\nwith open('HISTORY.rst') as f:\n\tlong_desc += f.read()\n\nwith open('requirements.txt') as f:\n\trequirements = list(filter(lambda x: x and not x.startswith('#'), map(str.strip, f.read().splitlines())))\n\nsetup(\n\tlong_description=long_desc,\n\tauthor_email = 'houtianze@users.noreply.github.com',\n\tdownload_url = 'https://github.com/houtianze/bypy/tarball/' + meta['version'],\n\t#packages=find_packages(),\n\tpackages = ['bypy', 'bypy.res', 'bypy.test'],\n\tpackage_data = {\n\t\t'bypy': ['../*.rst', '*.pem'],\n\t\t'bypy.res': ['*.json']\n\t},\n\tentry_points = {\n\t\t'console_scripts': [\n\t\t\t'bypy = bypy.bypy:main'\n\t\t],\n\t\t'gui_scripts': [\n\t\t\t'bypygui = bypy.gui:main'\n\t\t]\n\t},\n\ttest_suite = 'bypy.test',\n\tkeywords = ['bypy', 'bypy.py', 'baidu pcs', 'baidu yun', 'baidu pan', 'baidu netdisk',\n\t\t\t\t'baidu cloud storage', 'baidu personal cloud storage',\n\t\t\t\t'百度云', '百度云盘', '百度网盘', '百度个人云存储'],\n\tclassifiers = [\n\t\t'Development Status :: 4 - Beta',\n\t\t'Environment :: Console',\n\t\t'Intended Audience :: End Users/Desktop',\n\t\t'Intended Audience :: Developers',\n\t\t'Intended Audience :: System Administrators',\n\t\t'License :: OSI Approved :: MIT License',\n\t\t'Natural Language :: English',\n\t\t'Operating System :: MacOS :: MacOS X',\n\t\t'Operating System :: Microsoft :: Windows',\n\t\t'Operating System :: POSIX',\n\t\t'Operating System :: Unix',\n\t\t'Programming Language :: Python',\n\t\t'Topic :: Utilities',\n\t\t'Topic :: Internet :: WWW/HTTP'],\n\tinstall_requires = requirements,\n\tinclude_package_data = True,\n\t**meta\n)\n\n# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4 ff=unix fileencoding=utf-8\n"
  },
  {
    "path": "syncver.sh",
    "content": "#!/usr/bin/env bash\n\nver=$(grep __version__ bypy/const.py | sed -e \"s/__version__ *= *'//g\" -e \"s/'//g\")\nsed -i -e \"s/\\(^.*\\)\\\"recommendedVersion\\\".*$/\\1\\\"recommendedVersion\\\": \\\"$ver\\\",/g\" update/update.json\n# mac sed fix\nsedresidue='update/update.json-e'\nif [ -f $sedresidue ]; then\n\trm -f $sedresidue\nfi\n"
  },
  {
    "path": "update/update.json",
    "content": "{\n\t\"comment\": \"Update info\",\n\t\"recommendedVersion\": \"1.8.9\",\n\t\"minimumRequiredVersion\": \"1.8.4\"\n}\n"
  }
]